/* Silently create the mcd namespace if it does not exist */
if (typeof mcd === 'undefined') {
	var mcd = [];
}

/**
 * offerHandler.js
 * 
 * provides offer handling via methods to filter, sort, display (pre-formated)
 * 
 * @author Brendan Barr (bbarr@mcdpartners.com)
 */

mcd.offerHandler = {
	
	filter : {
		
		/**
		* Remove any expired offers
		* 
		* @param {Array} offers
		*/			
		removeStaleOffers : function(offers) {							
			var newOffers = [];					
			for(var i = 0; i < offers.length; i++){					
				if(!offers[i]) continue;
				var exp = offers[i]['expDate'];
				if(exp != ''){
					exp = exp.split(',');
					var year = parseInt(exp[0]);
					var month = parseInt(exp[1]);
					var day = parseInt(exp[2]);
					var expDate = new Date(year, month-1, day);
				}
				
				var today = new Date();
				if(!expDate) {
					var expDate = new Date();
				}
				
				if(mcd.date.isAfterDate(expDate, today) || exp == '') {
					newOffers.push(offers[i]);
				}
			}
			
			return newOffers;
		},	
		
		apply : function() {
			
			var offers = mcd.privileges.generalOfferArray;
			var exists = false;
			var filtered = [];
			
			// test offers and push forward the offers that fit the filter
			for(var offer in offers) {
				if(mcd.offerHandler.filter.test(offers[offer])){
					filtered.push(offers[offer]);
				}
			}
			
			// assign new array to filteredOfferArray
			mcd.privileges.filteredOfferArray = filtered;
		},
		
		/**
		 * Used by apply to test an offer Object using mcd.privileges.filters
		 * 
		 * @param {Object} offer
		 */
		
		test : function(offer, isTop){			
			isTop = isTop || false;
			var filters = mcd.privileges.filters;
			var pass = [];
			
			
			// for each filter set (right now, always 2)
			for (var i = 0; i < filters.length; i++) {
				var good = false;
				
				// get filter parts
				var filter = filters[i];
				var filterKey = filter.split('=')[0];
				var filterValue = filter.split('=')[1];
				//alert(offer.cities);
				// test filter, if it passes, push foward				
				for (var x = 0; x < offer[filterKey].length; x++) {
					if(isTop) {
					// if testing a Top Offer
						
						if(filterKey == 'categories'){
							if(offer[filterKey][x] == filterValue || filterValue == 0){
								good = true;
							}
						}
					}
					else if (offer[filterKey][x] == filterValue || filterValue == 0 || filterValue == mcd.privileges.defaultCity) {
					// else testing a Standard Offer
						good = true;
					}
					// Bellow  code	by vnavark for soting cities having 'All Cities'. - 21-07-2011
					else if(filterKey == 'cities'){
						if(offer.cities =='All Cities' || offer.cities == ''){
							good = true;
						}
					}
				}
				if (good == true) {
					pass.push(true);
				}
			}
			
			// if all filters pass, return true
			if(pass.length == filters.length) {
				return true;
			}
			else if(isTop && pass.length == 1) {
				return true;
			}
			else return false;
		},
		
		/**
		 * Remove filter by string "key"
		 * 
		 * @param {String} filter
		 */
		remove : function(filter){
			
			var filters = mcd.privileges.filters;
			
			// search for filter, remove it when found
			for(var x = 0; x < filters.length; x++){
				if(filters[x].indexOf(filter) != -1) {
					mcd.privileges.filters.splice(x, x+1);
				}
			}
		},
		
		/** 
		 * Return filter value by String "key"
		 * 
		 * @param {String} filterType
		 */
		get : function(filterType) {
			var filters = mcd.privileges.filters;
			
			// find and return filter value, by filterType
			for(var i = 0; i < filters.length; i++) {
				if(filters[i].indexOf(filterType) != -1) {
					return filters[i].split(filterType + '=')[1]
				}
			}
		}
		
	},
	
	sort : {
		
		apply : function(){
			
			var reversed = false;
			var sort = mcd.privileges.sort;
			if(sort.indexOf('-reversed') != -1) {
				reversed = true;
			}
		
			var offerArray = mcd.privileges.filteredOfferArray;
			var sorted = [];
			
			// sort by date
			var compareDates = function(a, b){
				var aExpDate = a['expDate'];
				
				if(aExpDate == '') {
					var aDate = new Date();
				}
				else {
					
					// create date params (int, int, int);
					var aDate = mcd.offerHandler.getDate(aExpDate);	
					
				}
				
				var bExpDate = b['expDate'];
				
				if(bExpDate == '') {
					var bDate = new Date();
				}
				else {
					
					// create date params (int, int, int);
					var bDate = mcd.offerHandler.getDate(bExpDate);
					
				}
		
				return (reversed) ? bDate - aDate : aDate - bDate;
			}
			
			// sort by offer name
			var compareNames = function(a, b){
				var sortReturn = (a['name'] < b['name']) 
				? -1
				: 1;
				return sortReturn;
			}
			
			/**
			 * Move ongoing offers to end of array
			 * 
			 * Deprecated
			 * 
			 * @param {Array} offers
			 */
				
			var shiftOngoingOffers = function(offers) {
				var ongoingOffers = [];
				var newOffers = [];
				for(var i = 0; i < offers.length; i++) {
					if(offers[i]['expDate'].length > 0){
						newOffers.push(offers[i]);
					}
					else {
						ongoingOffers.push(offers[i]);
					}
				}
				
				offers = newOffers.concat(ongoingOffers);
				
				return offers;
			}
			
			offerArray.sort(compareNames);
	
			if(sort == 'alpha-reversed') {
				offerArray.reverse();
			}

			// handle sorting by date
			if(sort == 'date' || sort.indexOf('date') != -1) {
				offerArray.sort(compareDates);
				offerArray = shiftOngoingOffers(offerArray);
			}
			
			mcd.privileges.filteredOfferArray = offerArray;
		}
	},
	
	pagination : {
		
		offersPerPage : 20,
		
		apply : function(){
			
			mcd.offerHandler.pagination.createList();
			
			var offers = mcd.privileges.filteredOfferArray;
			var pageNum = mcd.privileges.pageNum;
			var perPage = mcd.offerHandler.pagination.offersPerPage;
			var end = perPage * pageNum;
			var start = end - perPage;
			var page = [];
			
			// Ensure a correct starting point
			if (start < 0) {
				start = 0;
			}						
			
			// Ensure a correct limit			
			if (end > offers.length) {				
				end = offers.length;					
			}												
			
			// Hide the pager if we have less offers than perPage limit		
			if(offers.length < perPage) {				
				mcd.dom.removeClass('browse-merchant-offers-wrapper', 'pages');
				mcd.dom.addClass('pagination-container', 'hide');
			}
			
			// Push the offers for this page to the page
			for (var i = start; i < end; i++) {				
				page.push(offers[i]);				
			}
	
			mcd.privileges.filteredOfferArray = page;
		},
		
		createList : function(){			
			var offers = mcd.privileges.filteredOfferArray;
			var perPage = mcd.offerHandler.pagination.offersPerPage;
			var pageNum = parseInt(mcd.privileges.pageNum);
			var totalPages = offers.length / perPage;			
			var container = document.getElementById('pagination');					
		
			var arm = function(link){
				mcd.event.add(link, 'click', function(e){
					mcd.event.preventDefault(e);
					
					if(this.className.indexOf('disabled') == -1 && this.className.indexOf('active') == -1){
						var target = this.getAttribute('rel');
						mcd.privileges.pageNum = target;
						mcd.privileges.page.loadingOffers();
						mcd.privileges.page.setup(true);
					}
				});
			}
			
			var createPrevious = function(){
				var previous = mcd.privileges.util.createEl('li', container);
				var atts = {'rel' : pageNum - 1, 'href' : '#'};
			
				if (pageNum == 1) {
					atts['class'] = 'disabled';
				}
				
				var previousLink = mcd.privileges.util.createEl('a', previous, 'Previous', true, atts)
				
				arm(previousLink);
			}
			
			var createEnd = function() {
				var next = mcd.privileges.util.createEl('li', container, null, false, {'class' : 'next'});
				var atts = {'rel' : pageNum + 1, 'href' : '#'};
												
				if (pageNum == Math.ceil(totalPages)) {
					atts['class'] = 'disabled';
				}
				
				var nextLink = mcd.privileges.util.createEl('a', next, 'Next', true, atts)
				
				arm(nextLink);	
			}
			
			if (totalPages > 1) {
			
				createPrevious();				
				for (var i = 0; i < totalPages; i++) {
				
					var newPageNum = i + 1;
					var atts = {
						'href': '#',
						'rel': newPageNum
					};
					
					if (newPageNum == mcd.privileges.pageNum) {
						atts['class'] = 'active';
					}
					
					var li = mcd.privileges.util.createEl('li', container);
					var a = mcd.privileges.util.createEl('a', li, newPageNum, true, atts);
					
					arm(a);
				}
				
				createEnd();
				
				// assign width to ul for centering purposes
				var links = container.getElementsByTagName('li');
				container.style.width = links.length * 35 + 'px';
				
				// show
				mcd.dom.addClass('browse-merchant-offers-wrapper', 'pages');
				mcd.dom.removeClass('pagination-container', 'hide');
			}			
		}
	},
	
	/**
	 * Converts string with format yyyy,mm,dd, to Date object
	 * 
	 * @param {string} dateString
	 */
	
	getDate : function(dateString){
		
		dateString = dateString.split(',');
	
		var year = parseInt(dateString[0]);
		var month = parseInt(dateString[1]);
		var day = parseInt(dateString[2]);
		
		return new Date(year, month-1, day);
	},
	
	/**
	 * Find any offers with type "primary" or "secondary"
	 * and copy them to new array (mcd.privileges.filteredTopArray)
	 */
	
	extractTopOffers : function() {
		
		var offers = mcd.privileges.offerArray;
		var topOffers = [];
		var cat = mcd.privileges.activeCategory;
		var primaryCount = 0;
		var secondaryCount = 0;
		
		var filteredArray = [];
		var filtered = false;
		
		offers.sort(function() {return 0.5 - Math.random()});		
		for(var i = 0; i < offers.length; i++) {				
			if(offers[i]['promoType'].length > 0 && mcd.offerHandler.filter.test(offers[i], true)) {
				if(cat == 0){
					if(offers[i]['promoType'] == 'primary'){
						if(primaryCount < 1){
							topOffers.push(offers[i]);	
							primaryCount++;							
							filtered = true;
						}
					}
					else{
						if(secondaryCount < 2){
							topOffers.push(offers[i]);	
							secondaryCount++;
							filtered = true;
						}
					}						
				}
				else {
					topOffers.push(offers[i]);
					filtered = true;
				}						
			}
			
			if(!filtered) {				
				filteredArray.push(offers[i]);
			}
			
			filtered = false;
		}
						
		// Resort the array to take care of our deleted indices		
		mcd.privileges.generalOfferArray = filteredArray;
		mcd.privileges.filteredTopOfferArray = topOffers;
	},
	
	getType : function(offer) {
		var type = (offer['promoType'].length == 0) ? '' : offer['promoType'] ;
		return type;
	},
	
	/**
	 * Handles offers with type "secondary"
	 * Stores, and reserves to ensure proper positioning
	 */
	
	secondary : {
		
		storage : [],
		
		store : function(offer) {
			mcd.offerHandler.secondary.storage.push(offer);
		},
		
		resubmit : function() {
			
			var storage = mcd.offerHandler.secondary.storage;
			
			for(offer in storage) {
				mcd.offerHandler.buildTopOffer(storage[offer], storage[offer]['promoType'], true)
			}
			
			// reset secondary variables
			mcd.offerHandler.secondary.isRight = false;
			mcd.offerHandler.secondary.storage = [];
		},
		
		isRight : false
	},
	
	/**
	 * Creates a Top Offer
	 * 
	 * @param {Object} offer
	 * @param {String} type
	 * @param {Boolean} waited
	 */
	
	buildTopOffer : function(offer, type, waited){

		// store secondary offers and display at the end
		if (type == 'secondary' && !waited) {
			mcd.offerHandler.secondary.store(offer);
		}
		else {
			var domParent = document.getElementById('top-offers');
			
			var li = mcd.privileges.util.createEl('li', domParent, null, false, {
				'class': offer['promoType']
			});
			if(type == 'secondary') {
				mcd.privileges.util.createEl('img', li, null, false, {
					'src': mcd.privileges.imagesPath + offer['promoImage'],
					'title': offer['name'],
					'alt': '',
					'height' : '120',
					'width' : '110'
				})
			}
			else {
				mcd.privileges.util.createEl('img', li, null, false, {
					'src': mcd.privileges.imagesPath + offer['promoImage'],
					'title': offer['name'],
					'alt': '',
					'height' : '150',
					'width' : '230'
				})	
			}
				
			// create title, defaults to name if title not available
			var title = (offer['title']) ? offer['title'] : offer['name'];
			mcd.privileges.util.createEl('h4', li, title, true);
			
			var p = mcd.privileges.util.createEl('p', li, offer['shortDesc'], true);
			mcd.privileges.util.createEl('a', li, 'Details', false, {
				'title': 'Details',
				'href': '#details-overlay',
				'rel': 'details-overlay'
			})
			if (offer['expDate'].length > 0) {
				var deadline = mcd.privileges.util.createEl('p', li, 'Offer valid until ', false, {
					'class': 'deadline'
				});
				var date = mcd.offerHandler.getDate(offer['expDate']);
				var day = date.getDate();
				var month = mcd.date.getMonthName(date);
				var year = date.getFullYear();
				mcd.privileges.util.createEl('strong', deadline, day + ' ' + month + ' ' +year);
			}
			else {
				mcd.privileges.util.createEl('p', li, 'Ongoing Offer', false, {
					'class': 'deadline'
				});
			}
			
			mcd.offerHandler.buildOfferDetails(offer, li);
			
			if (type == 'secondary') {
				if (mcd.offerHandler.secondary.isRight) {
					li.className += ' right';
					mcd.offerHandler.secondary.isRight = false;
				}
				else 
					mcd.offerHandler.secondary.isRight = true;
			}
		}
	},

	/**
	 * Creates Standard Offer
	 * 
	 * @param {Object} offer
	 */
	
	buildStandardOffer : function(offer){
		
		var domParent = document.getElementById('browse-merchant-offers');	

		// tbody
		var tbody = mcd.privileges.util.createEl('tbody', domParent);
		
		// tr
		var tr = mcd.privileges.util.createEl('tr', tbody);
		
		// td (name)
		var name = mcd.privileges.util.createEl('td', tr, null, false, {'class' : 'merch-name'});
		var h4 = mcd.privileges.util.createEl('h4', name);

		mcd.privileges.util.createEl('a', h4, offer['name'], true, {'class' : 'details-trigger', 'title' : 'Details', 'href' : '#'})

		mcd.privileges.util.createEl('div', name, offer['shortDesc'], true, {'class' : 'shortDesc'});
	
		mcd.privileges.util.createEl('a', name, 'Details', false, {'class' : 'details-trigger', 'title' : 'Details', 'href' : '#'})

		// td (expDate)
		var exp = mcd.privileges.util.createEl('td', tr, null, false, {'class' : 'offer-exp sort-key'});
		if(offer['expDate'].length > 0) {
			var p = mcd.privileges.util.createEl('p', exp, 'Offer valid until', false);
			
			var date = mcd.offerHandler.getDate(offer['expDate']);
			var day = date.getDate();
			var month = mcd.date.getMonthName(date);
			var year = date.getFullYear();
			
			mcd.privileges.util.createEl('strong', p, day + ' ' + month + ' ' +year);	
		}
		else {
			mcd.privileges.util.createEl('p', exp, 'Ongoing Offer', false);
		}
		
		// td (image)
		var image = mcd.privileges.util.createEl('td', tr, null, false, {'class' : 'merchant-image'});
		
		if(offer['images'][0] && offer['images'][0].length > 0) {
				/* nakhade added below if condition 04/15/2011 to avoid image distortion if image size less than standard size 127*190*/
				var matchIndex = offer['images'][0].search(/:/);
				if(matchIndex != -1 ){
					var image_name = offer['images'][0].replace(/:.+?$/,'');
					mcd.privileges.util.createEl('img', image, null, false, {'src' : mcd.privileges.imagesPath + image_name, 'title' : offer['name'], 'alt' : ''})
					
				}else{
				mcd.privileges.util.createEl('img', image, null, false, {'src' : mcd.privileges.imagesPath + offer['images'][0], 'title' : offer['name'], 'alt' : '', 'width' : '190', 'height' : '127'})	
				}
			
			}
		
					
		// details
		var details = mcd.privileges.util.createEl('tr', tbody);
		var details = mcd.privileges.util.createEl('td', details, null, false, {'colSpan' : '3', 'class' : 'detailsContainer'})
		
		mcd.offerHandler.buildOfferDetails(offer, details);
	},
	
	/**
	 * Setup Obtrusive Overlay, attaches event handlers to details link
	 */
	
	setupOverlay : function() {
		
		mcd.ObtrusiveOverlay.manager.overlays['details-overlay'] = new mcd.ObtrusiveOverlay('details-overlay');
		mcd.ObtrusiveOverlay.manager.overlays['details-overlay'].registerTerminator('details-overlay-close', function () { return true; });
		
		var topOffers = document.getElementById('browse-top-offers').getElementsByTagName('li');
		for(var x = 0; x < topOffers.length; x++) {
			mcd.event.add(topOffers[x], 'click', function(e){
				mcd.event.preventDefault(e);
				mcd.offerHandler.displayDetailsOverlay(this);
			});
		}
	},
	
	/**
	 * Assigns event handler to trigger Standard offer details
	 */
	
	setupStandardDetails : function() {
		var links = mcd.dom.getElementsByAttribute('class', 'details-trigger', 'browse-merchant-offers', 'a', false);
		
		for(var i = 0; i < links.length; i++) {
			mcd.event.add(links[i], 'click', function(event){
				mcd.event.preventDefault(event);
				var tr = mcd.privileges.util.findParent('tbody', this);
				mcd.offerHandler.toggleStandardDetails(tr.getElementsByTagName('tr')[0])
				if(mcd.dom.hasClass(tr, 'details-showing')) {
					mcd.dom.removeClass(tr.getElementsByTagName('h4')[0].getElementsByTagName('a')[0], 'details-trigger');
				}
			});
		}
	},
	
	/**
	 * Replaces overlay content with Offer Details
	 * 
	 * @param {HTMLElement} offer
	 */
	
	displayDetailsOverlay : function(offer) {
		var overlayContent = document.getElementById('details-overlay-content');
		var details = offer.getElementsByTagName('div')[0];
		overlayContent.innerHTML = details.innerHTML;
		mcd.ObtrusiveOverlay.manager.enterObtrusive('details-overlay');
		overlayContent.scrollTop = 0;
	},
	
	
	/** 
	 * Toggle details showing
	 * 
	 * @param {HTMLElement} tr
	 */
	
	toggleStandardDetails : function(tr) {
		mcd.dom.toggleClass(tr, 'details-showing');
		mcd.dom.toggleClass(tr.nextSibling.getElementsByTagName('div')[0], 'hide');
	},
	
	/**
	 * Create Offer Details
	 * 
	 * @param {Object} offer
	 * @param {HTMLElement} parent
	 */
	
	buildOfferDetails: function(offer, parent){
		
		// div
		var details = mcd.privileges.util.createEl('div', parent, null, true, {
			'class': 'details hide'
		})
		
		// h3
		mcd.privileges.util.createEl('h3', details, offer['name'], true)
		
		// ul (images)
		var detailsImages = mcd.privileges.util.createEl('ul', details, null, false, {'class' : 'images'});
		for (var i = 1; i < offer['images'].length; i++) {
			var detailsImagesLi = mcd.privileges.util.createEl('li', detailsImages);
			mcd.privileges.util.createEl('img', detailsImagesLi, null, false, {
				'src': mcd.privileges.imagesPath + offer['images'][i],
				'alt' : '',
				'width' : '190',
				'height' : '127'
			});
		}
		
		// div (longDesc)
		if(parent.tagName == 'LI' && offer['images'].length > 1) {
			var text = mcd.privileges.util.createEl('div', details, null, false, {'class' : 'overlay-text'});
		}
		else {
			var text = mcd.privileges.util.createEl('div', details, null, false, {'class' : 'text'});	
		}
		
		mcd.privileges.util.createEl('div', text, offer['longDesc'], true, {'class' : 'desc'})
		
		// div (contact)
		var detailsContact = mcd.privileges.util.createEl('div', text);
		mcd.privileges.util.createEl('strong', detailsContact, 'Contact Information', true);
		var detailsContactUl = mcd.privileges.util.createEl('ul', detailsContact);
		mcd.privileges.util.createEl('li', detailsContactUl, offer['address'], true);
		mcd.privileges.util.createEl('li', detailsContactUl, offer['phone'], true, {'class' : 'phone'});
		mcd.privileges.util.createEl('li', detailsContactUl, offer['phone1'], true);
		mcd.privileges.util.createEl('li', detailsContactUl, offer['phone2'], true);
		if(offer['email'] != ''){
			var emailLi = mcd.privileges.util.createEl('li', detailsContactUl, 'Email: ');
			mcd.privileges.util.createEl('a', emailLi, offer['email'], true, {'href' : 'mailto:' + offer['email']})	
		}
		if(offer['uri'] != '') {
			if(offer['uri'].indexOf('http://') == -1){
				offer['uri'] = 'http://' + offer['uri'];
			}
			var uriLi = mcd.privileges.util.createEl('li', detailsContactUl, 'Website: ');
			mcd.privileges.util.createEl('a', uriLi, offer['uri'], true, {'href' : offer['uri']})
			mcd.privileges.util.createEl('li', detailsContactUl, offer['urinfo'], true, {'class' : 'urinfo'});
		}
		
		mcd.privileges.util.createEl('li', detailsContactUl, offer['otherContact'], true);
		
		// div (terms)
		var terms = mcd.privileges.util.createEl('div', text);
		mcd.privileges.util.createEl('strong', terms, 'Terms &amp; Conditions', true);
		//mcd.privileges.util.createEl('div', terms, offer['terms'], true);
		mcd.privileges.util.createEl('div', terms, offer['terms'], true, {'class' : 'termscond'});
		
		// a
		mcd.privileges.util.createEl('a', details, 'Details', true, {'class' : 'details-trigger', 'href' : '#'});
		mcd.privileges.util.createEl('div', details, null, false, {'class' : 'clear'});

	}
}
