/*************************************************************
* The wOnLoadSet() function will set the window.onload function to
* be wOnLoadGo() which will run all of your window.onload
* functions.
*************************************************************/
function wOnLoadSet(){
  window.onload = wOnLoadGo;
}
/*************************************************************
* The wOnLoadGo() function loops through the wOnLoadFunctions array and
* runs each function in the array.
*************************************************************/
function wOnLoadGo(){
  for(var i = 0;i < wOnLoadFunctions.length;i++)
    eval(wOnLoadFunctions[i]);
}
/*************************************************************
* The wOnLoadAdd() function will add another function to the wOnLoadFunctions
* array to be run when the page loads.
*************************************************************/
function wOnLoadAdd(func){
  wOnLoadFunctions[wOnLoadFunctions.length] = func;
}
/*************************************************************
* The wOnLoadFunctions array holds all of the functions you wish to run
* when the page loads.
*************************************************************/
var wOnLoadFunctions = new Array();

var Events = {
	// private property
    _localizedPath : "",
	_commonPath : "",
	_categoryMarkerIcons : [],
	_eventsByType : [],
	_eventTypesInitialized : false,
	
	initalLoad : true,
	labels : {},
	thirdEvents : [],
	customerEvents : [],
	prospectEvents : [],
	developerEvents : [],
	lugEvents : [],
	onlineEvents : [],
	featuredEvents : [],
	categories : [],
	
	initializeEvents : function () {
		this.parseJson();
		this.displayEvents();
		
		EventMap.createMap();
		
		if (!this._hasFlashPlayed('SalesForce_Earth_FINAL').valueOf() && jQuery('#fContainer').length) {
			//this.loadSWF('events_banner_video_fVars.swf?vid=SalesForce_Earth_FINAL.flv', 'fContainer');
			this.toggleMapDisplay('f'); //, 'events_banner_video_fVars.swf?vid=SalesForce_' + flv + '.flv'
		} else {
			if (this.initalLoad) {
				this.searchEvents();
				this.initalLoad = false;
			}
			
			this.toggleMapDisplay("m");
		}
	},
	
	displayEvents : function () {
		var oEvents = "";
		var featuredEventsHTML = '';
		var imgPlaceHolder = 'example1.png';
		
		for (var i = 3; i < this.onlineEvents.length; i++) {
			oEvents += '<h3><a onclick="this.href=getDriver(this.href);"' + this.getEventDetailsLink(this.onlineEvents[i]) + '>' + this.onlineEvents[i].title + '</a></h3>';
			oEvents += '<p class="smallText">' + this.onlineEvents[i].Event_Start_Date__c + ' - ' + truncateString(this.onlineEvents[i].Event_Description__c, 60) + '</p>';
		}
		
		if (this.featuredEvents) {
			for (var i = 0; i < this.featuredEvents.length; i++) {
				var featuredEventImage = this.featuredEvents[i].Feature_Event_Image_Location__c;
				
				if (featuredEventImage.length == 0 && this.featuredEvents[i].Venue_Image_Location__c != null && this.featuredEvents[i].Venue_Image_Location__c.length > 0) {
					featuredEventImage = this.featuredEvents[i].Venue_Image_Location__c;
				}
				
				if (featuredEventImage.length == 0) {
					featuredEventImage = this.getCommonPath() + '/assets/images/events/default_venue.jpg';
				}
				
				featuredEventsHTML += '<li><div class="item"><a onclick="this.href=getDriver(this.href);"' + this.getEventDetailsLink(this.featuredEvents[i]) + '><img src="' + featuredEventImage + '" width="70" height="50" alt="' + this.featuredEvents[i].Event_Display_Name__c + ": " + this.featuredEvents[i].Display_City__c + '" /></a><br />'; 
				featuredEventsHTML += '<h1><a onclick="this.href=getDriver(this.href);"' + this.getEventDetailsLink(this.featuredEvents[i]) + '>' + truncateString(this.featuredEvents[i].Event_Display_Name__c + ":", 13) + '</a></h1>';
				featuredEventsHTML += this.featuredEvents[i].Display_City__c + '<br />';
				featuredEventsHTML += this.featuredEvents[i].Event_Start_Date__c + '<br />'; 
				featuredEventsHTML += truncateString(this.featuredEvents[i].Feature_Event_Content__c, 40) + '</div></li>';
			}
		} else {
			featuredEventsHTML += '<li><div class="item"></div></li>';
		}
		
		//$("eventList").innerHTML = oEvents;
		$("widgetcarousel").innerHTML = featuredEventsHTML;
		
		jQuery('#widgetcarousel').jcarousel();
	},
	
	populatePickLists : function () {
		var eventTypePL = $("Web_Category__c");
		var eventLocationPL = $("Region__c");
		
		for (var i = 0; i < eventCategories.length; i++) {
			this.createPicklistOption(eventTypePL, eventCategories[i]);
		}
		
		for (var l = 0; l < eventLocations.length; l++) {
			this.createPicklistOption(eventLocationPL, eventLocations[l]);
		}
	},
	
	createPicklistOption : function (plElement, key) {
		var option = document.createElement('option');
		option.text = this.labels[key];
		option.value = key;
		
		try {
			plElement.add(option);
		} catch (ex) {
			plElement.add(option, null);
		}
	},
	
	searchEvents : function () {
		var eventResults = "";
		var searchForm = document.forms["eventSearchForm"];
		var searchParams = new Array();
		var searchedEvents = new Array();
		var elementId;
		var elementValue;
		var fieldValue;
		var arrFieldValues;
		var matchedValue;
		var includeEvent;
		
		EventMap.setCategoryType(null);
		
		for (var sfIndex=0; sfIndex < searchForm.elements.length; sfIndex++) {
			var element = searchForm.elements[sfIndex];
			
			if (element.selectedIndex > 0) {
				searchParams.push(element);
			}
		}
		
		//loop through all events
		for (var eIndex = 0; eIndex < events.length; eIndex++) {
			//reset include event
			includeEvent = false;
			
			if (this._isEventPubliclyAvailable(events[eIndex])) {
				//by default, include all events in results
				includeEvent = true;
				//loop through all of the search values from the form
				for (var spIndex = 0; spIndex < searchParams.length; spIndex++) {
					//get the current elements id & value
					elementId = searchParams[spIndex].id;
					elementValue = searchParams[spIndex].options[searchParams[spIndex].selectedIndex].value;
					fieldValue = events[eIndex][elementId];
					matchedValue = false;
					
					//if this event field has multiple values, break them into an array
					if (fieldValue.indexOf(";") != -1) {
						arrFieldValues = fieldValue.split(";");
						
						for (var fieldIndex = 0; fieldIndex < arrFieldValues.length; fieldIndex++) {
							if (arrFieldValues[fieldIndex] == elementValue) {
								matchedValue = true;
							}
						}
					} else {
						if (fieldValue == elementValue) {
							matchedValue = true;
						}
					}
					
					//if this is the date element and the start date for this event is outside the selected date range, exclude this event
					if (elementId == "Event_Start_Date__c") {
						var dateRange = new Date();
						var eventStartDate = new Date(events[eIndex].Event_Sort_Date_Start);
						
						dateRange.setDate(dateRange.getDate() + parseInt(elementValue));
						
						if (eventStartDate > dateRange) {
							includeEvent = false;
							break;
						}
					}
					//if the value of the property for this event  is not equal to the elements selected value then exclude this event
					if (elementId != "Event_Start_Date__c" && !matchedValue) {
						includeEvent = false;
						break;
					}
				}
			}
			
			//if this event was not excluded by any of the conditions above, then add the object to the searchedEvents array and results html string.
			if (includeEvent) {
				searchedEvents.push(events[eIndex]);
				
				eventResults += this.createListItem(events[eIndex], eIndex);
			}
		}
		
		$("eventsResults").innerHTML = eventResults;
		
		if (!this.initalLoad) {
			jQuery('.showLocator').show();
		}
		
		if ($("map")) {
			EventMap.mapEvents(searchedEvents);
		}
	},
	
	getLocalizedPath : function () {
		return this._localizedPath;
	},
	
	setLocalizedPath : function (path) {
		if (path.length > 1) {
			this._localizedPath = path;
		}
	},
	
	getCommonPath : function () {
		return this._commonPath;
	},
	
	setCommonPath : function (path) {
		this._commonPath = path;
	},
	
	displayEventList : function (events) {
		var eventResults = "";
		
		for (var eIndex = 0; eIndex < events.length; eIndex++) {
			eventResults += this.createListItem(events[eIndex], eIndex);
		}
		
		$("eventsResults").innerHTML = eventResults;
	},

	createListItem : function (event, index) {
		var eventListItem = "";
		
		eventListItem += '<div class="listing"><a onclick="this.href=getDriver(this.href);"' + this.getEventDetailsLink(event) + ' onmouseover="EventMap.showEventMarker(\'' + event.id + '\');"><span class="left">' + event.Display_City__c + '</span>';
		eventListItem += '<span class="right">' + event.Event_Start_Date__c + '</span></a></div>';
		
		return eventListItem;
	},
	
	getEvent : function (eventId) { 
		var eventResult = '';
		var eventDetails = '';
		var eventAgenda = '';
		var eventDetailType;
		var eventObj;
		var currentEventType;
		var eventSessionIds;
		var eventSession;
		var eventSpeaker;
		
		var qs = jQuery.parseQuery();
	
		if (qs.tab && !isNaN(qs.tab)) {
			toggleTab(qs.tab);
		}
	
		//loop through all events
		for (var eIndex = 0; eIndex < events.length; eIndex++) {
			if (this._isEventPubliclyAvailable(events[eIndex])) {
				//get the event type of the current event
				currentEventType = events[eIndex].Event_Type__c;
				//check if an event type grouping already exists for this event type.
				if (this._eventsByType[currentEventType] == null) {
					this._eventsByType[currentEventType] = new Array();
				}
				//store events grouped by their event type
				this._eventsByType[currentEventType].push(events[eIndex]);
			}
			
			if (events[eIndex].id == eventId) {
				eventObj = events[eIndex];
				//save the event type of the selected event 
				eventDetailType = eventObj.Event_Type__c
				
				if (eventObj.Venue_Image_Location__c != null && eventObj.Venue_Image_Location__c.length > 0) {
					eventResult += '<img src="' + eventObj.Venue_Image_Location__c + '" width="232" height="139" border="0" class="imgRight" />';
				}
				
				eventResult += '<h1>' + eventObj.Event_Display_Name__c + ": " + eventObj.Display_City__c + '</h1>';
				eventResult += '<p class="event_start_date">' + eventObj.Event_Start_Date__c + '</p>';
				eventResult += '<br /><p>';
				
				if (eventObj.venue_name) {
					eventResult += eventObj.venue_name + '<br />';
				}
				
				if (eventObj.venue_address) {
					eventResult += eventObj.venue_address + '<br />';
					eventResult += eventObj.venue_city + ", " + eventObj.venue_state + " " + eventObj.venue_zip + '<br />';
				}
				
				if (eventObj.venue_phone) {
					eventResult += eventObj.venue_phone;
				}
				eventResult += '</p><br />';
				eventResult += '<div class="but_med"><a href="#tabs" onclick="toggleTab(4)"><span>' + this.labels['RegisterNow'] + '</span></a></div>';
				eventResult += '<br clear="all" />';
				/*
				eventDetails = eventObj.Event_Details__c;
				eventAgenda = eventObj.General_Agenda__c;
				
				if (vp.isCustomer()) {
					customerEventDetails = eventObj.Customer_Event_Details__c;
					customerEventAgenda = eventObj.Customer_Agenda__c;
					
					if (customerEventDetails != null) {
						eventDetails = customerEventDetails;
					}
					
					if (customerEventAgenda != null) {
						eventAgenda = customerEventAgenda;
					}
				} 
				
				eventDetails = eventDetails.replace(/&lt;/g, "<");
				eventDetails = eventDetails.replace(/&gt;/g, ">");
				
				eventAgenda = eventAgenda.replace(/&#xD;/g, "<br/>");
				eventAgenda = eventAgenda.replace(/&lt;/g, "<");
				eventAgenda = eventAgenda.replace(/&gt;/g, ">");
				*/
				$("eventInfo").innerHTML = eventResult;
				//$("eventTabContent1").innerHTML = eventDetails;
				//$("eventTabContent2").innerHTML = eventAgenda.replace(/&#xD;/g, "<br/>");
				$("eventTabContent3").innerHTML = eventResult;
				
				if (eventObj.Available_Seats > 0) {
					jQuery("#registration_open").remove().appendTo("#eventTabContent4");
				} else {
					if (eventObj.Custom_Max_Reg_Message__c) {
						$("eventTabContent4").innerHTML = '<b>' + eventObj.Custom_Max_Reg_Message__c + '.</b>';
					} else {
						$("eventTabContent4").innerHTML = $("registration_closed").innerHTML;
					}
				}
				
				eventSessionIds = eventObj.Event_Sessions;
				var sessionProperty;
				var sessionInfo = '';
				
				for (var sIndex = 0; sIndex < eventSessionIds.length; sIndex++) {
					sessionProperty = "Session_" + eventSessionIds[sIndex];
					eventSession = eventObj[sessionProperty];
					
					sessionInfo += eventSession.Session_Time__c + "(S:" + eventSession.Session_Start_Time__c + " E:" + eventSession.Session_End_Time__c;
					sessionInfo += '<div><div id="sessionRadio">';
					
					if (eventSession.Multiple_Session_at_Same_Time__c == 'true') {
						sessionInfo += '<input type="radio">';
					}
					
					sessionInfo += '</div><div class="pad5"><h5>' + eventSession.Session_Name + "</h5></div>";
					sessionInfo += '<div id="sessionAbstract">' + eventSession.Session_Abstract__c + "</div></div>";
				}
				
				//$("sessionInfo").innerHTML = sessionInfo;
				
				var speakersHTML = '';
				eventSpeakerIds = eventObj.Event_Speakers;
				var speakerObj;
				
				for (var si = 0; si < eventSpeakerIds.length; si++) {
					speakerObj = "Speaker_" + eventSpeakerIds[si];
					eventSpeaker = eventObj[speakerObj];
					
					speakersHTML += '<li><img src="' + eventSpeaker.Speaker_Image__c + '" width="70" height="50" alt="' + eventSpeaker.Speaker_Name + '" /><br />'; 
					speakersHTML += '<h3>' + eventSpeaker.Speaker_Name + '</h3>';
					speakersHTML += '<p class="smallText">' + eventSpeaker.Speaker_Detial__c + '</p></li>';
				}
				
				$("speakersList").innerHTML = speakersHTML;
				
				if (eventSpeakerIds.length > 0) {
					$("speakers").className = "speakers show";
				}
			}	
		}
		
		this._eventTypesInitialized = true;
		
		this.listEventsByType(eventDetailType);
	},
	
	listEventsByType : function (eventType) {	//get all events that are the same type as selected event
		var eventTypeList = '';
		
		this._intializeEventTypes();
		
		var eventsOfType = this._eventsByType[eventType];
	
		if (eventsOfType != null) {
			eventTypeList += '<div class="listingWrapper"><div class="listingWrapper2"><h3>' + eventType + '</h3><div class="listings">';
			
			for (var aIndex = 0; aIndex < eventsOfType.length; aIndex++) {
				eventTypeList += '<div class="listing"><a onclick="this.href=getDriver(this.href);"' + this.getEventDetailsLink(eventsOfType[aIndex]) + '><span class="left">' + eventsOfType[aIndex].Display_City__c + '</span><span class="right">' + eventsOfType[aIndex].Event_Start_Date__c + '</span></a></div>';
			}
			
			eventTypeList += '<br clear="all" /></div></div></div>';
					
			$("eventTypeList").innerHTML = eventTypeList;
		}
	},
	
	_intializeEventTypes : function () {
		if (!this._eventTypesInitialized) {
			//loop through all events
			for (var eIndex = 0; eIndex < events.length; eIndex++) {
				if (this._isEventPubliclyAvailable(events[eIndex])) {
					//get the event type of the current event
					currentEventType = events[eIndex].Event_Type__c;
					//check if an event type grouping already exists for this event type.
					if (this._eventsByType[currentEventType] == null) {
						this._eventsByType[currentEventType] = new Array();
					}
					//store events grouped by their event type
					this._eventsByType[currentEventType].push(events[eIndex]);
				}
			}
			
			this._eventTypesInitialized = true;
		}
	},
	
	showSearchResults : function () {
		$("tablight2").style.display = 'block';
	},
	
	mapEventsByType : function (element, eventCategory, flv, headerText) {
		jQuery('#mapSort a').removeClass('selected');
		jQuery(element).addClass('selected');
		
		this.updateLocatorHeader(headerText);
		
		if (!this._hasFlashPlayed(flv).valueOf()) {
			//this.toggleMapDisplay('f',  this.getLocalizedPath() + '/assets/swf/events_banner_video_fVars.swf?vid=SalesForce_' + flv + '.flv');
		}
		
		if (!this.categories[eventCategory]) {
			this.categories[eventCategory] = [];
		}
		
		this.displayEventList(this.categories[eventCategory]);
		doSwitch2(2);
		EventMap.setCategoryType(eventCategory);
		EventMap.mapEvents(this.categories[eventCategory]);
	},
	
	updateLocatorHeader : function (headerText) {
		$('eventSearchHeader').innerHTML = headerText;
		
		if (headerText != jQuery('.showLocator').text()) {
			jQuery('.showLocator').show();
		} else {
			jQuery('.showLocator').hide();
		}
	},
	
	toggleMapDisplay : function (displayed, /* optional */ swf) {
		if (displayed == "f") {
			$('fContainer').className = "visible";
			$('map').className = "map invisible";
			this.loadSWF(swf, 'fContainer');
		} else {
			jQuery('#fContainer').addClass('invisible');
			jQuery('#fContainer').css('visibility', 'hidden');
			jQuery('#map').addClass('visible');
			//$('fContainer').className = "invisible";
			//$('fContainer').style.visibility = "hidden";
			//$('map').className = "map visible";
		}
	},
	
	loadSWF : function (url, container){
		swfobject.embedSWF(url, container, "692", "263", "7");
	},
	
	parseJson : function () {
		var web_category;
		var arrCategories;
		var prioritizedFEvents = [];
		var reserveFEvents = [];
		
		for (var eIndex = 0; eIndex < events.length; eIndex++) {
			if (this._isEventPubliclyAvailable(events[eIndex])) {
				web_category = events[eIndex].Web_Category__c;
				
				//if this event field has multiple values, break them into an array
				if (web_category.indexOf(";") != -1) {
					arrCategories = web_category.split(";");
					
					for (var catIndex = 0; catIndex < arrCategories.length; catIndex++) {
						this.categorizeEvent(events[eIndex], arrCategories[catIndex]);
					}
				} else {
					this.categorizeEvent(events[eIndex], web_category);
				}
				//if this is a featured event
				if (events[eIndex].Feature_Event__c == 'true') {
					if (events[eIndex].Feature_Event_Hierarchy__c.length == 0) {
						events[eIndex].Feature_Event_Hierarchy__c = 6;
					}
					
					//if an array fot this priority level does not exist, create one.
					if (!prioritizedFEvents[events[eIndex].Feature_Event_Hierarchy__c]) {
						prioritizedFEvents[events[eIndex].Feature_Event_Hierarchy__c] = [];
					}
					//add this event to it's associated array based on it's priority
					prioritizedFEvents[events[eIndex].Feature_Event_Hierarchy__c].push(events[eIndex]);
				} else if (reserveFEvents.length < 3 && events[eIndex].Featurable == 'true') {
					reserveFEvents.push(events[eIndex]);
				}
			}
		}
		//add the featured events to their array in priortized order.
		for (var pIndex = 0; pIndex < prioritizedFEvents.length; pIndex++) {
			if (prioritizedFEvents[pIndex]) {
				for (var index = 0; index < prioritizedFEvents[pIndex].length; index++) {
					this.featuredEvents.push(prioritizedFEvents[pIndex][index]);
				}
			}
		}
		//if there are not 3 or more featured events, we need some in events in reserve to show in featured events croller
		if (this.featuredEvents.length < 3) {
			//determine how many reserve events are needed
			var reserveEventsNeeded = 3 - this.featuredEvents.length;
			var reserveIndex = 0;
			var allEventsIndex = 0;
			
			while (reserveIndex < reserveEventsNeeded) {
				if (reserveFEvents[reserveIndex]) {
					this.featuredEvents.push(reserveFEvents[reserveIndex]);
				}
				
				reserveIndex++;
			}
			
			if (this.featuredEvents.length < 3) {
				while (allEventsIndex < reserveEventsNeeded) {
					if (events[allEventsIndex]) {
						this.featuredEvents.push(events[allEventsIndex]);
					}
					
					allEventsIndex++;
				}
			}
		}
		
	},
	
	_initCategoryMarkerIcons : function (arrCategories) {
		this._categoryMarkerIcons[arrCategories[0]] = 'icon-red';
		this._categoryMarkerIcons[arrCategories[1]] = 'icon-blue';
		this._categoryMarkerIcons[arrCategories[2]] = 'icon-orange';
		this._categoryMarkerIcons[arrCategories[3]] = 'icon-black';
	},
	
	_hasFlashPlayed : function (flv) {
		if (jQuery.browser.msie) {
			return true;
		}
		
		var ch = new CookieHandler();
		var eventsFlashPlayed;
		var flashPlayed = new Boolean(false);
		
		//check for cookie handler
		if (ch != null) {
			//get flash cookie values
			eventsFlashPlayed = ch.getCookie("eventsFlashPlayed");
			//if a cookie existed for flash
			if (eventsFlashPlayed != null) {
				//does a value for the current flash exist in the cookie
				flashPlayed = new Boolean(eventsFlashPlayed.indexOf(flv) != -1);
				//if a value for the cuurent flash did not exist in the cookie, set one.
				if (!flashPlayed.valueOf()) {
					ch.setCookie("eventsFlashPlayed", eventsFlashPlayed + "," + flv);
				}
			} else {
				//if no flash cookie exists, create one.
				ch.setCookie("eventsFlashPlayed", flv);
			}
		}
		
		return flashPlayed;
	},
	
	getEventDetailsLink : function (event) {
		var link =  ' href="';
		
		if (event.Event_Link__c != null && event.Event_Link__c.length > 0) {
			link += event.Event_Link__c + '" target="_blank" ';
		} else {
			if (event.Language__c != 'us') {
				link += "/" + event.Language__c;
			}
			
			link += '/events/details/' + event.id + '.jsp" ';
		}
		
		return link;
	},
	
	getCategoryMarkerIcons : function (category) {
		return this._categoryMarkerIcons[category];
	},
	
	categorizeEvent : function (event, eventCategory) {
		if (!this.categories[eventCategory]) {
			this.categories[eventCategory] = [];
			this._categoryMarkerIcons[eventCategory] = 'icon-default';
		}
		
		event.icon = this.getCategoryMarkerIcons(eventCategory);
		
		this.categories[eventCategory].push(event);
	},
	
	getRegistrationInfo : function () {
	
	},
	
	initCategories : function (arrCategories) {
		for (var catIndex = 0; catIndex < arrCategories.length; catIndex++) {
			this.categories[arrCategories[catIndex]] = [];
		}
		
		this._initCategoryMarkerIcons(arrCategories);
	},
	
	_isEventPubliclyAvailable : function (event) {
		var isAvailable = false;
		var eventEndDate = new Date(event.Event_Sort_Date_End);
		//set time to midnight of the end date
		eventEndDate.setHours(23,59,59,999);
		var today = new Date();
		var currentEvent = (eventEndDate >= today); 
		
		if (event.Private_Event__c != 'true' && currentEvent) {
			isAvailable = true;
		}
		
		return isAvailable;
	}
}


function truncateString(descText, truncLen) {
	if (descText && descText.length > truncLen) {
		//var subLen = descText.indexOf(' ', truncLen);
		
		//if (subLen != -1) {
			return descText.substr(0, truncLen) + '...';
		//}
	}
	
	return descText;
}

function doSwitch2(which){
	for(i=1;i<=8;i++){
		var n = $("tablight"+i);
		var m = $("tlink"+i);
		
		if (null != n) {
			n.style.display="none";
		}
		
		if (null != m) {
			m.className="";
		}
	}	
		
	var n = $("tablight"+which);
	var m = $("tlink"+which);
	
	if (null != n) {
		n.style.display="block";
	}
	
	if (null != m) {
		m.className="selected";
	}
}