var group_calendar = function() {
	
	/*
	 * Promotions Markup Obj: Holds the Markup that its generated by iterating through the
	 * "1697_group_promotion.xml".
	 * This xml data its used when iterating through each date that corresponds to the main xml file
	 *  
	 */
	
	var promotionsMarkUpObj = {};
	
	/* ===============================================================*/
	/*
	 * The following functions iterate through the main xml document,
	 * "1697_event.xml" at the same time generates the makup by combining 
	 * its own elements with elements of the "1697_group_promotion.xml"
	 */
	
	function xmlToArray(xmlDoc, selectorTag){ 
		var output = []; 
		var rawData = xmlDoc.getElementsByTagName(selectorTag); 
		var i, j, oneRecord, oneObject; 
		
		for (i = 0; i < rawData.length; i++) { 
			
			if (rawData[i].nodeType === 1) {
				 
				oneRecord = rawData[i];
				oneObject = output[output.length] = {}; 
				
				for (j = 0; j < oneRecord.childNodes.length; j++) { 
					if (oneRecord.childNodes[j].nodeType === 1) { 
						oneObject[oneRecord.childNodes[j].tagName] = oneRecord.childNodes[j].firstChild.nodeValue;
					} 
				}
			} 
		}
		 
		return output; 
		
	}
	
	function getDayString(eventDate){
		var rawDay = eventDate.split(' '),
			day;
		
		day = (rawDay[0].split('/')[1]) * 1;
		
		return day;
	}
	
	function getTimeString(eventDate){
	
		var rawTime,
			timeString,
			rawHour,
			rawMinutes,
			hour,
			minutes,
			datePart;
		
		rawTime = eventDate.split(' ')[1];
		rawTime = rawTime.split(':');
		
		rawHour = rawTime[0] * 1;
		rawMinutes = rawTime[1];
		
		if( rawHour > 12 && rawHour < 24){
			datePart = 'PM';
			hour = rawHour - 12;
			minutes = rawMinutes;
		} else if(rawHour === 0){
			datePart = 'AM';
			hour = '12';
			minutes = rawMinutes;
		} else if(rawHour == 12){
			datePart = 'PM';
			hour = rawHour;
			minutes = rawMinutes;
		} else {
			datePart = 'AM';
			hour = rawHour *1;
			minutes = rawMinutes;
		}
		
		
		return hour + ':' + minutes + ' ' + datePart;
		
	}
	
	function getDateString(eventDate){
		
		var rawDate = eventDate.split(' ')[0],
			date,
			year,
			month,
			day,
			days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
			months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
		
		rawDate = rawDate.split('/');
		
		year = rawDate[2] * 1;
		month = (rawDate[0] * 1) - 1;
		day = rawDate[1] * 1;
		
		
		date = new Date(year, month, day);
		
		return days[date.getDay()] + ', ' + months[date.getMonth()] + ' ' + date.getDate() + ' - ' + getTimeString(eventDate);
			
	}
	
	
	function getElemId(fieldName){
		
		var dateString;
		
		dateString = fieldName;
		dateString = dateString.split('/');
		return 'date_' + dateString[0] + '-' + dateString[1];
		
	}
	
	function getSubArray(xmlArray, objId){
		
		var len = xmlArray.length,
			i,
			currentId,
			subArray = [];
		
		for(i=0; i<len; i++){
			currentId = getElemId(xmlArray[i].event_date.split(' ')[0]);
			
			if(currentId === objId){
				subArray[subArray.length] = xmlArray[i];
			}
			
		}
		
		return subArray;
		
	}
	
	function getMarkupSelectorIds(objArray){
		
		var len = objArray.length,
			i,
			idsArray = [],
			eventDate;
		
		
		for(i=0; i<len; i++){
			
			//for group calendar we filter by: group_sales === 1
			if ((objArray[i].group_sales * 1) === 1) {
				eventDate = objArray[i].event_date.split(' ')[0];
				idsArray[idsArray.length] = getElemId(eventDate);
			}
			
		}
		
		return idsArray;
		
	}
	
	function getDateMarkup(){
		var markup =
		'<li>' +
			'<a href="##ticket_master_url##" target="_blank" class="##classname##" id="##data##">' +
				'##time##'+
			'</a>' +
				'<div class="price">' +
					'##special_message_title##' +
					'<h3>##event_date##</h3>' +
					'##group_info##' +
				'</div>' +
			'</li>';
			
		return markup;
	}
	
	function setObjMarkup(obj, dateMarkup){
		var isPeakSales,
			timeString,
			linkUrl = 'https://orders.thegarden.com/rccssalesform.jsp?', 
			peakPerformance = 'Non-Peak Performance',
			groupSalesName,
			isGroupSales,
			isSoldOut, 
			timeString, 
			isExpired,
			isMessage,
			isMessagetitle,
			startDate = new Date(obj.event_date),
			endDate = new Date(readCookie('new_server_time')),
			classname = 'time',
			objUrl = {};
			
		isSoldOut = (obj.sold_out * 1) === 1 ? true : false;
		isGroupSales = (obj.group_sales * 1) === 1 ? true : false;
		isExpired =  (startDate < endDate) ? true : false;
		
		if(isGroupSales){
		
			isPeakSales = (obj.peak_sales * 1) === 1 ? true : false;
		
			timeString = getTimeString(obj.event_date);
		
		if(isPeakSales){
			timeString = timeString;
			peakPerformance = 'Peak Performance';
		}
		
		if(isExpired){
			timeString = '<span class="expired">' + timeString + '</span>';
			classname = 'expired';
		}
		
		if(isSoldOut){
			timeString = '<span class="sold-out">' + timeString + '</span>';
		}
		
		isMessage = obj.special_message;
		if(isSoldOut){
			isMessageTitle = '<span class="special-message-title">Sold Out</span>';
		} else {
			isMessageTitle ='';
		}
		
		
		linkUrl = linkUrl.concat('id=1697&performance=',obj.event_date,'&pricing_cat=',obj.group_sales_promotion);
		
		groupSalesName = obj.group_sales_promotion;
		
		dateMarkup = dateMarkup.replace('##event_date##', getDateString(obj.event_date));
		dateMarkup = dateMarkup.replace('##time##', timeString);
		dateMarkup = dateMarkup.replace('##ticket_master_url##',linkUrl);
		dateMarkup = dateMarkup.replace('##special_message_title##',isMessageTitle);
		dateMarkup = dateMarkup.replace('##classname##', classname);
		
		//data
		dateMarkup = dateMarkup.replace('##data##', $.param(obj));
		
		
		if(promotionsMarkUpObj[groupSalesName]){
			dateMarkup = dateMarkup.replace('##group_info##',promotionsMarkUpObj[groupSalesName]);
		}
	
		} else {
			dateMarkup = '';
		}
		return dateMarkup;
	}
	
	function setMarkup(subArray){
		
		var len = subArray.length,
			i,
			markup,
			dateMarkup = getDateMarkup();
		
		markup = '<span>'+ getDayString(subArray[0].event_date)  +'</span> ';
		markup += '<ul class="showtime">';
		for(i =0; i<len; i++){
			markup += setObjMarkup(subArray[i], dateMarkup);	
		}
		markup += '</ul>';
		
		return markup;
	}
	
	function getServerZoneTime(){
		$.ajax({
			url : '/wp-content/themes/rccs/includes/date.php',
			dataType:'text',
			//method: 'get',
			async: false,
			cache: false,
			success: function(data){
		        var new_server_time;
				new_server_time = data;
				//console.log(new_server_time);
				createCookie('new_server_time',new_server_time,620)
			}
		});
	}
	
	function setEventDates(){
		$.ajax({
			//url: "/wp-content/themes/rccs/p.php?url=http://cma.thegarden.com/ajax/data/1697_event.xml",
			url: "/wp-content/themes/rccs/ajax/xml/1697_event.xml",
			dataType:'xml',
			async:false,
			cache: false,
			complete: function(){
				$('.loading').hide();
			},
			success: function(xml){
			
				var objArr,
					selectorIds,
					i,
					currId,
					subArray,
					dateMarkup;
					
				//set xml data into an array of js objects	
				objArr = xmlToArray(xml, 'performance');
			
				//iterate through obj array to set data
				selectorIds = getMarkupSelectorIds(objArr);
				
				
				for(i=0; i<selectorIds.length; i++){
					
					currId = selectorIds[i];
					
					subArray = getSubArray(objArr, currId);
					dateMarkup = setMarkup(subArray);
					
					/*
					 * Inject all the markup to the caledar using
					 * element id, which corresponds to currId
					 */
					
					$('#'+currId).html(dateMarkup);
					
				}
				
				
			},
			error:function(jqXHR, textStatus, errorThrown){
			}
		});
	}
	
	
	/* ===============================================================*/
	/*				SET GROUP LEVEL MARKUP STRUCTURE
	 * 
	 * The following functions control the interaction to "1697_group_promotion.xml"
	 * The main function is to grab the data on the xml file and place it on an object that 
	 *  has a "key name" equal to "the group name"
	 * 
	 * That way, when iterating through the main xml file, it can map the group name to the 
	 * key of this object which name is "promotionsMarkUpObj"
	 * 
	 */
	
	
	function setLevels(level){
	
		
		var levelMarkup = '',
			label = level.getElementsByTagName('label')[0].firstChild.nodeValue,
			ticket_price = level.getElementsByTagName('ticket_price')[0].firstChild.nodeValue;
		
		levelMarkup += 
			'<dl class="prices clearfix">' +
				'<dt>$' + ticket_price + '</dt>' +
				'<dd>' + label + '</dd>' +
			'</dl>';
			
		return levelMarkup;
		
		
	}

	function getGroupName(group){
		
		var text = 'For Groups of ',
			minimum = group.getElementsByTagName('tickets_minimum')[0].firstChild.nodeValue,
			maximum = group.getElementsByTagName('tickets_maximum')[0].firstChild.nodeValue;
		
		if((maximum * 1) === 999){
			return text + minimum + ' or More';
		} else {
			return text + minimum + ' - ' + maximum;
		}
		
	}
	
	
	
	function setPromotions(promotionXML){
	
		var promotionMarkup = '',
			groupsXML = promotionXML.getElementsByTagName('group'),
			levelsXML,
			i,
			j;
		
		for(i=0; i<groupsXML.length; i++ ){
			
			promotionMarkup += '<h5>' + getGroupName(groupsXML[i]) +'</h5>';
			
			promotionMarkup += '<ul>';
			
			levelsXML = groupsXML[i].getElementsByTagName('level');
			
			for(j=0; j<levelsXML.length; j++){
				
				promotionMarkup += setLevels(levelsXML[j]);
				
			}
			
			promotionMarkup += '</ul>';			
			
		} 
	
		return promotionMarkup;
		
	}
	
	/*
	 * Fetches the xml data from "1697_group_promotion.xml"
	 * Places it onto the "promotionsMarkUpObj"
	 * 
	 */
	function getPromotionsXML(){
		
		$.ajax({
			//url: "/wp-content/themes/rccs/p.php?url=http://cma.thegarden.com/ajax/data/1697_group_promotion.xml",
			url: "/wp-content/themes/rccs/ajax/xml/1697_group_promotion.xml",
			dataType:'xml',
			async:false,
			cache: false,
			success: function(xml){
				
				try {
					
					var promotions = [],
						promotionsXML,
						promotionsObj,
						promotionTag,
						name,
						markup = '';
					
					
					promotionsXML = xml.getElementsByTagName('promotion');
					
					for(var i=0; i<promotionsXML.length; i++){
						
						promotionsObj = {};
						
						promotionTag = promotionsXML[i];
						
						name = promotionTag.getElementsByTagName('info')[0].getElementsByTagName('name')[0].firstChild.nodeValue;
						
						markup = '<h4>' +name+ '</h4>';
						markup += setPromotions(promotionTag);
						
						promotions[name] = markup;
						
					}
					
					promotionsMarkUpObj = promotions;
									
				} catch(err){ }
			
			}
		});
	}
	
	function init(){
		getServerZoneTime();
		getPromotionsXML();
		setEventDates();
		
	}
  
	return {
		init : init    
	};
}();

function getTimeString_omniture(eventDate){
	
		var rawTime,
			timeString,
			rawHour,
			rawMinutes,
			hour,
			minutes,
			datePart;
		
		date = eventDate.split('+')[0]
		rawTime = eventDate.split('+')[1];
		rawTime = rawTime.split(':');
		
		rawHour = rawTime[0] * 1;
		rawMinutes = rawTime[1];
		
		if( rawHour > 12 && rawHour < 24){
			datePart = 'PM';
			hour = rawHour - 12;
			minutes = rawMinutes;
		} else if(rawHour === 0){
			datePart = 'AM';
			hour = '0';
			minutes = rawMinutes;
		} else if(rawHour == 12){
			datePart = 'PM';
			hour = rawHour;
			minutes = rawMinutes;
		} else {
			datePart = 'AM';
			hour = rawHour *1;
			minutes = rawMinutes;
		}
		
		
		return date + ' - ' + hour + ':' + minutes + ' ' + datePart;
		
	}
	



//On Document ready
$(document).ready(function() {
	
	//Month Tabs
	$("#calendar-dates ol").hide(); //Hide all content
	$("#calendar-tabs li:eq(2) a").addClass("active").show(); //Activate this tab
	$("#calendar-dates ol:eq(2)").show(); //Show this tab content
	
	
	$("#calendar-tabs a").click(function() {
		$("#calendar-tabs a").removeClass("active"); //Remove any "active" class
		$(this).addClass("active"); //Add "active" class to selected tab
		$("#calendar-dates ol").hide(); //Hide all tab content
		var activeTab = $(this).attr("href"); //Find the href attribute value to identify the active tab + content
		$(activeTab).show(); //Show the active content
		return false;
	});
	
	
	//Initialize Group Calendar
	group_calendar.init();
	
	
	//Tooltip when user mouseovers time
	window.setTimeout(function(){
		$('.time').tooltip({ 
			track: true, 
			delay: 0, 
			showURL: false,
			opacity: 1,
			bodyHandler: function(){
				var tooltip = $(this).next().html();
				return tooltip;
			}
		});
	}, 1000);
	
	$('.expired').click(function(e) {
		e.preventDefault();
	});

});





