

EventController = function() {
	this.eventTriggers = new Array(); // an array of events based on event attributes
	this.events = new Array(); // an array of events based on event attributes
	this.currentTarget = null;
	this.currentTargetValue = null;
}

EventController.prototype = {
    eventTriggers: null,
	dragTarget:null,
	currentTarget:null,
	currentTargetValue:null,
	
	register: function(tagName,id,className,eventType,description,targetFunction,preventDefault,keypress,userData) {
		var eventTrigger = new EventTrigger(tagName,id,className,eventType,keypress);
		var event = new Event(description,targetFunction,preventDefault);
		this.eventTriggers.push(eventTrigger);
		this.events.push(event);
	},
	
	getMatchingEvents: function(event) {
		var eventObjArray = new Array();
		
		var eventObj = new Event();
		eventObj.eventType = event.type;
		eventObj.target = event.target;
		eventObj.keypress = event.keypress;
		eventObj.xMousePos = event.xMousePos;
		eventObj.yMousePos = event.yMousePos;
		eventObjArray.push(eventObj);

		if ( eventObj.eventType == "mousedown" && this.dragTarget == null  ) {
			this.dragTarget = eventObj.target;
		}
		if ( eventObj.eventType == "mousemove" && this.dragTarget != null ) {
			var newEventObj = eventObj.clone();
			newEventObj.eventType = "drag";
			newEventObj.target = this.dragTarget;
			eventObjArray.push(newEventObj);
		}
		if ( eventObj.eventType == "mouseup" && this.dragTarget != null ) {
			var newEventObj = eventObj.clone();
			newEventObj.eventType = "dragstop";
			newEventObj.target = this.dragTarget;
			eventObjArray.push(newEventObj);
			this.dragTarget = null;
		}

		var output = "";
		for ( var i = 0 ; i < eventObjArray.length ; i++ ) {
			var thisEvent = eventObjArray[i];
			if ( thisEvent.eventType.indexOf("mouse") != 0 ) 
				output += thisEvent.eventType + ":" + thisEvent.target.id + "<br/>";
		}

		var results = new Array();
		for ( var i = 0 ; i < eventObjArray.length ; i++ ) {
			var resultsPerEvent = this.getMatchingEventsInternal(eventObjArray[i]);
			for ( var j = 0 ; j < resultsPerEvent.length ; j++ ) {
				results.push(resultsPerEvent[j]);
			}
		}

		return results;
	},
	
	getMatchingEventsInternal: function(event) {
		var result = new Array();
		for( var i = 0; i < this.eventTriggers.length; i++ ) {
			var eventTrigger = this.eventTriggers[i];
			if( (eventTrigger.tagName == null || eventTrigger.tagName == event.target.tagName) && 
			    (eventTrigger.eventType == null || eventTrigger.eventType == event.eventType) &&
			    (eventTrigger.id == null || eventTrigger.id == event.target.id) &&
			    (eventTrigger.keypress == null || eventTrigger.keypress == event.keypress) &&
			    (eventTrigger.className == null || matchesClass(event.target,eventTrigger.className) ))
			{
				var thisEvent = this.events[i];
				thisEvent.eventType = event.eventType;
				thisEvent.target = event.target;
				thisEvent.keypress = event.keypress;
				thisEvent.xMousePos = event.xMousePos;
				thisEvent.yMousePos = event.yMousePos;
				result.push(thisEvent);
			}
		}
		return result;
	}

}

function selectField(eventType) {
	unflagError(eventType.target); // get rid of any error styles that could be applied to this field
	eventType.target.select(); // highlight the field, so the user can start typing over the existing value
}

function clickSlider(eventType) {
	eventType.target.sliderObj.sliderLocation = eventType.xMousePos - getLeftPos(eventType.target);
	eventType.target.sliderObj.active = true;
}

function filterByPartner(eventType) {
	var radioObj = eventType.target;
	if ( !radioObj.checked && radioObj.value != "all" ) filterResults('type',radioObj.value,2);
	else if ( !radioObj.checked) removeFilter('type',2);
}

function dragSlider(eventType) {
	var sliderTarget = eventType.target;
	currentMargin = eventType.xMousePos - getLeftPos(sliderTarget.sliderObj.parent.sliderBarDiv) - sliderTarget.sliderObj.sliderLocation;
	if ( sliderTarget.sliderObj.type == 0 && 
				(currentMargin + sliderWidth) > sliderTarget.sliderObj.parent.rightSlider.currentMargin  ) {
				currentMargin = sliderTarget.sliderObj.parent.rightSlider.currentMargin - sliderWidth;
		}
		else if ( sliderTarget.sliderObj.type == 1 && 
				currentMargin < (sliderTarget.sliderObj.parent.leftSlider.currentMargin + sliderWidth)  ) {
				currentMargin = sliderTarget.sliderObj.parent.leftSlider.currentMargin + sliderWidth;
		}
		else if ( currentMargin < (-1 * (sliderWidth/2) ) ) {
			currentMargin = -1 * (sliderWidth/2);
		}
		else if ( (currentMargin + sliderWidth - (sliderWidth/2)) > sliderTarget.sliderObj.parent.width ) {
			currentMargin = sliderTarget.sliderObj.parent.width - sliderWidth + (sliderWidth/2);
		}
		sliderTarget.sliderObj.currentMargin = currentMargin;
		sliderTarget.style.left = currentMargin + "px";
		
		sliderObj = sliderTarget.sliderObj;
		targetClass = sliderTarget.sliderObj.parent.target;
		
		var sliderValue = targetClass.getSliderValueTranslation( sliderObj.filterField(),sliderObj.getValue(),sliderObj.type );
		showMovingAltTag(sliderTarget,sliderValue,eventType.xMousePos,getLeftPos(sliderTarget.sliderObj.parent.sliderBarDiv),getRightPos(sliderTarget.sliderObj.parent.sliderBarDiv));
		
		displayDiv = get(sliderTarget.sliderObj.parent.display + sliderObj.type);
		displayDiv.innerHTML = sliderValue;
		return false;
}

function releaseSlider(eventType) {
	var sliderTarget = eventType.target;
	targetClass = sliderTarget.sliderObj.parent.target;
	sliderObj = sliderTarget.sliderObj;
	targetClass.handleSliderUpdate(sliderObj.filterField(),sliderObj.getValue(),sliderObj.type,true);
	var sliderValue = targetClass.getSliderValueTranslation(sliderObj.filterField(),sliderObj.getValue(),sliderObj.type );
	displayDiv = get(sliderTarget.sliderObj.parent.display + sliderObj.type);
	displayDiv.innerHTML = sliderValue;
	sliderTarget = null;
	hideAPAltTag();
}

function showMouseOver(eventType) {
	var mouseOverMsg = get("goDealsMouseoverDiv");
	if ( defined(mouseOverMsg) ) {
		mouseOverMsg.style.top = getBottomPos(eventType.target) + "px";
		mouseOverMsg.style.left = (getLeftPos(eventType.target) + -120) + "px";
	}
}

function hideMouseOver(eventType) {
	var mouseOverMsg = get("goDealsMouseoverDiv");
	if ( defined(mouseOverMsg) ) {
		mouseOverMsg.style.top = "-1000px";
		mouseOverMsg.style.left = "-1000px";
	}
}

function hideAPAltTag() {
	if ( get("movingAltTag") ) get("movingAltTag").style.display = "none";
	if ( defined(showingAirportCodeDesc) ) clearTimeout(showingAirportCodeDesc);
}

function initTextPrompt(eventType) {
	unflagError(eventType.target); // get rid of any error styles that could be applied to this field
	var promptValue = " City name or code";
	if ( eventType.eventType == "blur" && eventType.target.value == "" ) {
		eventType.target.value = promptValue;
	}
	else if ( eventType.eventType == "focus" && eventType.target.value == promptValue ) {
		eventType.target.value = "";
		eventType.target.focus();
	}
	else if ( eventType.eventType == "focus" && eventType.target.id == "inboundJawAirport" ) {
		eventType.target.blur();
	}
	else if ( eventType.eventType == "focus" && eventType.target.className == "airportField" ) {
		eventType.target.select(); // highlight the field, so the user can start typing over the existing value
	}
}

function initEmailField(eventType) {
	var promptValue = " Enter your email";
	if ( eventType.eventType == "blur" && eventType.target.value == "" ) {
		eventType.target.value = promptValue;
	}
	else if ( eventType.eventType == "focus" && eventType.target.value == promptValue ) {
		eventType.target.value = "";
	}
}

function initGroupEmailField(eventType) {
	var promptValue = " For Confirmation";
	if ( eventType.eventType == "blur" && eventType.target.value == "" ) {
		eventType.target.value = promptValue;
	}
	else if ( eventType.eventType == "focus" && eventType.target.value == promptValue ) {
		eventType.target.value = "";
	}
}

function initFirstNameField(eventType) {
	var promptValue = " First";
	
	if ( eventType.eventType == "change") {
		eventType.target.attributes["defaultVal"].nodeValue = "changed";
	}
	
	if ( eventType.eventType == "blur" && eventType.target.value == "" ) {
		eventType.target.value = promptValue;
		eventType.target.attributes["defaultVal"].nodeValue = "default";
		eventType.target.style.color = "#F6480E";
	}
	else if ( eventType.eventType == "focus" && eventType.target.value == promptValue ) {
		eventType.target.value = "";
		eventType.target.style.color = "#000000";
	}
	else if ( eventType.eventType == "focus" && eventType.target.value != promptValue) {
		
		eventType.target.style.color = "#000000";
	}
	else if ( eventType.eventType == "load" && eventType.target.value != promptValue) {
		eventType.target.style.color = "#000000";
	}
	else if ( eventType.eventType == "load" && eventType.target.value == promptValue) {
		eventType.target.style.color = "#F6480E";
	}
}

function initMiddleNameField(eventType) {
	var promptValue = " Middle (optional)";
	
	if ( eventType.eventType == "change") {
		eventType.target.attributes["defaultVal"].nodeValue = "changed";
	}
	
	if ( eventType.eventType == "blur" && eventType.target.value == "" ) {
		eventType.target.value = promptValue;
		eventType.target.attributes["defaultVal"].nodeValue = "default";
	}
	else if ( eventType.eventType == "focus" && eventType.target.value == promptValue ) {
		eventType.target.value = "";
	}
}

function initLastNameField(eventType) {
	var promptValue = " Last";
	
	if ( eventType.eventType == "change") {
		eventType.target.attributes["defaultVal"].nodeValue = "changed";
	}
	
	if ( eventType.eventType == "blur" && eventType.target.value == "" ) {
		eventType.target.value = promptValue;
		eventType.target.attributes["defaultVal"].nodeValue = "default";
		eventType.target.style.color = "#F6480E";
	}
	else if ( eventType.eventType == "focus" && eventType.target.value == promptValue ) {
		eventType.target.value = "";
		eventType.target.style.color = "#000000";
	}
	else if ( eventType.eventType == "focus" && eventType.target.value != promptValue) {
		eventType.target.style.color = "#000000";
	}
	else if ( eventType.eventType == "load" && eventType.target.value != promptValue) {
		eventType.target.style.color = "#000000";
	}
	else if ( eventType.eventType == "load" && eventType.target.value == promptValue) {
		eventType.target.style.color = "#F6480E";
	}
}


function prevAPChoice() {
	var currentIndex = SearchForm.getAPChoiceIndex();
	SearchForm.prevAPChoice();
	if ( currentIndex != SearchForm.getAPChoiceIndex() ) {
		get("airportChoice" + currentIndex ).className = "airportChoice";
		get("airportChoice" + SearchForm.getAPChoiceIndex() ).className = " selectedAirport";
	}
}

function nextAPChoice() {
	var currentIndex = SearchForm.getAPChoiceIndex();
	SearchForm.nextAPChoice();
	if ( currentIndex != SearchForm.getAPChoiceIndex() ) {
		get("airportChoice" + currentIndex ).className = "airportChoice";
		get("airportChoice" + SearchForm.getAPChoiceIndex() ).className = " selectedAirport";
	}
}

function changeAPChoice(index) {
	if ( index != SearchForm.getAPChoiceIndex() ) {
		get("airportChoice" + SearchForm.getAPChoiceIndex() ).className = "airportChoice";
		SearchForm.setAPChoice(index);
		get("airportChoice" + SearchForm.getAPChoiceIndex() ).className = " selectedAirport";
	}
}

var apCodeEvent = null;
var minLengthToLookup = 3;
var maxAirportsToShow = 20;

function changeAirportField(eventType) {
	if ( SearchForm.hasChoices() ) { // if airport choices are shown, pick the selected index
		SearchForm.setByFieldId(eventType.target.id,SearchForm.getAPChoice().apCode,true,SearchForm.getAPChoice().apDesc);
		resetLookup(false); 
	}
	else {
		var value = trim(eventType.target.value); // trim whitespace
		if ( value.length >= minLengthToLookup ) {
			apCodeSearchLookup(eventType.target.id,value,false);
		}
		resetLookup(false); 
	}
}

function typingAirportCode(eventType) {
	if ( eventType.keypress == 9 ) { resetLookup(false); return; }
	if ( eventType.keypress == 13 ) { return; }
	else if ( eventType.keypress == 38 && SearchForm.hasChoices() ) { prevAPChoice(); return; }
	else if ( eventType.keypress == 40 && SearchForm.hasChoices() ) { nextAPChoice(); return; }
	var value = trim(eventType.target.value); // trim whitespace
	if ( value.length >= minLengthToLookup ) { // if input isn't enough chars, the layer showing airport choices which may already be up
		resetLookup(true);
		apCodeEvent = setTimeout("apCodeSearchLookup('" + eventType.target.id + "','" + value + "',true)",lookupDelay);
	}
	else {
		resetLookup(false); 
	}
	SearchForm.setByFieldId(eventType.target.id,value);
}

function resetLookup(keepCurrentResults) {
	try { clearTimeout(apCodeEvent); } // clear any outstanding requests to show airport code choices
	catch(e) {}
	if ( !keepCurrentResults ) {
		SearchForm.resetAPChoices();
		hideAirportResults();
	}
}

function apCodeSearchLookup(targetID,value,showChoices) {
	apCodeLookupTargetID = targetID;
	var returnFunction = ( showChoices ) ? apCodeSearchLookupReturnFunction1:apCodeSearchLookupReturnFunction2;
	submitAjaxFromQuery("lookupAirport",returnFunction,"GET","lookupString="+value);
}

var apCodeLookupTargetID;

function apCodeSearchLookupReturnFunction(jsonReturnMsg,showChoices) {
	var json = eval("new Object(" + jsonReturnMsg + ")");
	
	var airports = eval(json.returnMsg);
	var apCodesOutput = "";
	if ( airports.length == 0 ) {
		hideAirportResults();
	}
	else if ( showChoices)  {
		SearchForm.resetAPChoices();
		for ( var i = 0 ; i < airports.length && i < maxAirportsToShow ; i++ ) {
			var apObject = airports[i];
			SearchForm.addAPChoice(apObject);
			var divClass;
			if (i == SearchForm.getAPChoiceIndex() ) var divClass = "airportChoice selectedAirport";
			else divClass = "airportChoice";
			apCodesOutput += "<div id='airportChoice" + i + "' class='" + divClass + "'><a class='airportChoiceLink' href='' id='" + apCodeLookupTargetID + "/" + apObject.apCode + "' onclick='chooseAirport(this); return false' onmouseover='changeAPChoice(" + i + ")'>";
			apCodesOutput += apObject.apDesc;
			apCodesOutput += "</a></div>\n";
			if ( i == 0 ) {
				if ( apCodeLookupTargetID == "outboundAirport" ) SearchForm.setOutboundAirport(apObject.apCode);
				else if ( apCodeLookupTargetID == "inboundAirport" ) SearchForm.setInboundAirport(apObject.apCode);
				else if ( apCodeLookupTargetID == "outboundJawAirport" ) SearchForm.setOutboundJawAirport(apObject.apCode);
			}
		}
		var lookupResultsDiv = createElement("div","airportLookupResults");
		lookupResultsDiv.style.top = getBottomPos(get(apCodeLookupTargetID)) + "px";
		lookupResultsDiv.style.left = getLeftPos(get(apCodeLookupTargetID)) + "px";
		lookupResultsDiv.innerHTML = apCodesOutput;
		lookupResultsDiv.style.display = "block";
	}
	else {
		var apObject = airports[0];
		SearchForm.setByFieldId(apCodeLookupTargetID,apObject.apCode,true,apObject.apDesc);
	}
}

function apCodeSearchLookupReturnFunction1(jsonReturnMsg) {
	apCodeSearchLookupReturnFunction(jsonReturnMsg,true);
}

function getAirportResults(apSearchString,recursive) {
	if ( validAPDescription(apSearchString) ) {
		apSearchString = getAirportCode(apSearchString); // if input field has a valid airport description, replace with code here
	}
	apCodes = new Array();
	for ( var i = 0 ; i < airports.length ; i++ ) {
		var airport = airports[i];
		if ( airport.code.toLowerCase().match( apSearchString.toLowerCase() ) || 
			airport.city.toLowerCase().indexOf( apSearchString.toLowerCase() ) == 0 || 
			airport.name.toLowerCase().indexOf( apSearchString.toLowerCase() ) == 0 || 
			airport.stateName.toLowerCase().indexOf( apSearchString.toLowerCase() ) == 0 || 
			airport.country.toLowerCase().indexOf( apSearchString.toLowerCase() ) == 0|| 
			airport.description().toLowerCase().indexOf( apSearchString.toLowerCase() ) == 0 ) {
			apCodes.push(airport);   
		}
	}
	if ( apCodes.length > 0 ) {
		apSortValue = apSearchString.toLowerCase();
		apCodes.sort(sortApCodes);
	}
	else if ( !recursive && apSearchString.split(",").length > 1 ) {
		apCodes = getAirportResults( apSearchString.split(",")[0],true );
	}
	else if ( !recursive && apSearchString.split(", ").length > 1 ) {
		apCodes = getAirportResults( apSearchString.split(", ")[0],true );
	}
	else if ( !recursive && apSearchString.split(" ").length > 1 ) {
		apCodes = getAirportResults( apSearchString.split(" ")[0],true );
	}
	return apCodes;
}

function apCodeSearchLookupReturnFunction2(jsonReturnMsg) {
	apCodeSearchLookupReturnFunction(jsonReturnMsg,false);
}

function chooseAirport(thisAnchor) {
	var inputID = thisAnchor.id.split("/")[0];
	var apCode = thisAnchor.id.split("/")[1];
	var apDesc = thisAnchor.innerHTML;
	SearchForm.setByFieldId(inputID,apCode,true,apDesc);
	resetLookup();
}

var apSortValue;
function sortApCodes(ap1,ap2) {
	if ( ap1.code.toLowerCase() == apSortValue ) return -1;
	else if ( ap2.code.toLowerCase() == apSortValue.toLowerCase() ) return 1;
	else if ( ap1.city.toLowerCase().indexOf(apSortValue) == 0 && ap2.city.toLowerCase().indexOf(apSortValue) != 0 ) return -1;
	else if ( ap2.city.toLowerCase().indexOf(apSortValue) == 0 && ap1.city.toLowerCase().indexOf(apSortValue) != 0 ) return 1;
	else if ( ap1.rank < ap2.rank ) return -1;
	else if ( ap1.rank > ap2.rank ) return 1;
	else return 0;
}

function submitSearch(eventType) {
	if ( eventType.target.className == "dateField" ) changedDate(eventType);
	SearchForm.startSearch();
}

function getDateFromString(dateString) {
	// replace dashes and periods with slashes
	dateString = dateString.replace(/-/g,"/");
	dateString = dateString.replace(/\./g,"/");
	
	// convert no year format to show year
	dateString = convertNoYearFormat(dateString);

	// convert 2 digit years to 4
	dateString = dateString.replace(/\/(\d\d)$/,"/20$1");
	
	var validFormat = /(^\d\d\/\d\d\/\d\d\d\d$)/;
	if ( !validFormat.test(dateString) ) return null;
	else return new Date(dateString);
}

function updateDate(eventType) {
	unflagError(eventType.target); // get rid of any error styles that could be applied to this field
	var dateField = eventType.target; // target element that changed
	var value = trim(dateField.value); // trim whitespace
	var date = validatedDate(value);
	SearchForm.setByFieldId(eventType.target.id,date,false);
}

function changedDate(eventType) {
	var dateField = eventType.target; // target element that changed
	var value = trim(dateField.value); // trim whitespace
	var date = validatedDate(value);
	SearchForm.setByFieldId(eventType.target.id,date,false);
	SearchForm.initField(eventType.target.id);
}

function changedOBFlexibility(eventType) {
	SearchForm.setByFieldId(eventType.target.id,eventType.target.value,false);
}

function changedIBFlexibility(eventType) {
	SearchForm.setByFieldId(eventType.target.id,eventType.target.value,false);
}

function validateDate(dateField,suppressErrorMessages) {
	// replace dashes and periods with slashes
	dateField.value = dateField.value.replace(/-/g,"/");
	dateField.value = dateField.value.replace(/\./g,"/");
	
	// convert no year format to show year
	dateField.value = convertNoYearFormat(dateField.value);

	// convert 2 digit years to 4
	dateField.value = dateField.value.replace(/\/(\d\d)$/,"/20$1");

	var validFormat = /(^\d\d\/\d\d\/\d\d\d\d$)/;
	
	if ( !validFormat.test(dateField.value) ) { 
		if ( !suppressErrorMessages ) {
			if ( dateField.id == "outboundDate" ) {
				alert("Please enter a valid departure date.  Enter using the format mm/dd/yyyy");
			}
			if ( dateField.id == "inboundDate" ) {
				alert("Please enter a valid return date.  Enter using the format mm/dd/yyyy");
			}
			dateField.focus();
		}
		return false;
	}
	else {
		var thisDate = new Date(dateField.value);
		var dayOfWeekDivID = dateField.id + "DayOfWeek";
		get(dayOfWeekDivID).innerHTML = thisDate.format("DD");
		return true;
	}
}

function convertNoYearFormat(dateString) {
	var now = getCurrentDateRef();
	todaysMonth = now.getMonth() + 1;
	todaysDate = now.getDate();
	todaysYear = now.getFullYear();
	
	var noYearFormat = /^\d+\/\d+$/;
	if ( noYearFormat.test(dateString) ) {
		var month = parseInt(dateString.split("/")[0],10);
		var date = parseInt(dateString.split("/")[1],10);
		if ( month < todaysMonth || month == todaysMonth && date < todaysDate ) {
			dateString += "/" + (todaysYear + 1);
		}
		else {
			dateString += "/" + todaysYear;
		}
	}
	return dateString;
}

function showPopup(eventType) {
	var url = eventType.target.href;
	if ( eventType.target.tagName != "A" ) url = eventType.target.parentNode.href;	
    var returnFunction = function(returnMsg) { 
		openPopup(returnMsg,eventType.xMousePos,eventType.yMousePos);
		return false;
	}
	xmlBasicRequest(url,returnFunction,"GET",null);
}

function newWindow(eventType) {
	window.open(eventType.target.href);
}

function submitNewsletterBox(eventType) {
	get("newsletter").submit(); return false;
}

function showFAQ(eventType) {
	var faqLink = eventType.target;
	if ( faqLink.parentNode.className.indexOf(" ") < 0 ) {
		changeClass(faqLink.parentNode,faqLink.parentNode.className + " visited");
	}
	else {
		spaceIndex = faqLink.parentNode.className.indexOf(" ");
		changeClass(faqLink.parentNode,faqLink.parentNode.className.substring(0,spaceIndex));
	}
	return false;
}

var defaultDaysBetweenDates = 14;

function resolveLinkPath(eventType) {
	eventType.target.href = resolveScheme(eventType.target.href);
	return true;
}

function linkClick(eventType) {
	resolveLinkPath(eventType);
	return true;
}

function signUp(eventType) {
	var returnFunction = function(returnMsg) {
		if ( returnMsg.indexOf("success") >= 0 ) goToURL("/confirmJoin.html");
		else if ( returnMsg.indexOf("permissionToVerify:") == 0 ) {
			// if permissionToVerify is the only error
			alert('You must check the box above the Continue button, agreeing to the Terms and Conditions.');
		}
		else showErrors("errorTop",returnMsg,true);
	}
	submitAjax("signUp",returnFunction,"POST",eventType.target.form,"Attempting to sign up");
}

function updateProfile(eventType) {
	var returnFunction = function(returnMsg) {
		if ( returnMsg.indexOf("success") >= 0 ) replaceURL("/");
		else showErrors("errorTop",returnMsg,true);
	}
	submitAjax("updateProfile",returnFunction,"POST",eventType.target.form,"Updating Profile");
}

function login(eventType) {
	var returnFunction = function(returnMsg) {
		if ( returnMsg.indexOf("success") >= 0 ) {
			if ( returnMsg.indexOf("page:") >= 0 ) {
				returnURL = returnMsg.split("page:")[1];
				replaceURL(returnURL);
			}
			else replaceURL("/");
		}
		else showErrors("error",returnMsg);
	}
	hideErrors("error");
	submitAjax("login",returnFunction,"POST",eventType.target.form,"Logging in");
}

function billShipSubmit(eventType) {
	hideErrors("error");
	submitAjax("billShipInfo",billShipReturn,"POST",eventType.target.form,"Submitting info");
}

function logout(eventType) {
	var returnFunction = function(returnMsg) { goToURL("/register"); return false }
	submitAjax("logout",returnFunction,null,null,"Logging out");
}

function changePerPage(eventType) {
	var selectObj = eventType.target;
	resultsPerPage = parseInt( getSelectBoxValue(selectObj),10 );
	selectObj.blur();
	submitAjaxFromQuery("changePerPage",updateResults,"GET","value="+resultsPerPage);//scroll(0,0);
}

function showCalendars(eventType) {
	if ( eventType.target.id == "outbound-calendarIcon" ) {
		try { 
				showCalendar("outboundDate",SearchForm.getOutboundDate().getMonth(),SearchForm.getOutboundDate().getFullYear());
				get("outboundFlexibility").style.display = "none";
				if(get("searchBox").className == "roundTrip"){
					get("inboundFlexibility").style.display = "block"; 
				}
			}
		catch(e) { showCalendar("outboundDate",SearchForm.getDefaultOutboundDate().getMonth(),SearchForm.getDefaultOutboundDate().getFullYear()); }
	}	
	else if ( eventType.target.id == "inbound-calendarIcon" ) {
		try { 
				showCalendar("inboundDate",SearchForm.getInboundDate().getMonth(),SearchForm.getInboundDate().getFullYear());
				get("inboundFlexibility").style.display = "none";
				if(get("searchBox").className == "roundTrip" || get("searchBox").className == "oneWay"){
					get("outboundFlexibility").style.display = "block"; 
				}
				 
				}
		catch(e) { showCalendar("inboundDate",SearchForm.getDefaultInboundDate().getMonth(),SearchForm.getDefaultInboundDate().getFullYear()); }
	}
}

function showGroupTravelCalendars(eventType){
	if ( eventType.target.id == "outbound-calendarIcon" ) {
		try { showCalendar("outboundDate",SearchForm.getOutboundDate().getMonth(),SearchForm.getOutboundDate().getFullYear()); }
		catch(e) { showCalendar("outboundDate",SearchForm.getDefaultOutboundDate().getMonth(),SearchForm.getDefaultOutboundDate().getFullYear()); }
	}	
	else if ( eventType.target.id == "inbound-calendarIcon" ) {
		try { showCalendar("inboundDate",SearchForm.getInboundDate().getMonth(),SearchForm.getInboundDate().getFullYear()); }
		catch(e) { showCalendar("inboundDate",SearchForm.getDefaultInboundDate().getMonth(),SearchForm.getDefaultInboundDate().getFullYear()); }
	}
}

function showCalendar(dateFieldID,month,year) {
	var output = getCalendarMonthOutput(dateFieldID,month,year);
	var calendarDiv = createElement("div","calendarDiv");
	calendarDiv.style.top = getTopPos(get(dateFieldID)) + "px";
	calendarDiv.style.left = getRightPos(get(dateFieldID)) + "px";
	calendarDiv.innerHTML = output;
	calendarDiv.style.display = "block";
}

function getCalendarMonthOutput(dateFieldID,month,year) {
	var currentDate = new Date(year,month,1,12,0,0,0);
	var lastDayLastMonth = currentDate.clone();
	lastDayLastMonth.addDay(-1);
	var prevMonth = lastDayLastMonth.getMonth();
	var prevMonthYear = lastDayLastMonth.getFullYear();
	
	var firstDayNextMonth = currentDate.clone();
	if ( firstDayNextMonth.getMonth() < 11 ) {
		firstDayNextMonth.setMonth(firstDayNextMonth.getMonth()+1);
	} else {
		 firstDayNextMonth.setMonth(0);
		 firstDayNextMonth.setFullYear(firstDayNextMonth.getFullYear()+1)
	}
	var nextMonth = firstDayNextMonth.getMonth();
	var nextMonthYear = firstDayNextMonth.getFullYear();
	
	//var prevMonth = 0;var prevYear= 0;var nextMonth = 0;var nextYear = 0;
	
	// calculate earliest travel date ( 2 days after today )
	var earliestTravelDate = getCurrentDateRef();
	earliestTravelDate.setHours(0);earliestTravelDate.setMinutes(0);earliestTravelDate.setSeconds(0);earliestTravelDate.setMilliseconds(0);
	//earliestTravelDate.addDay(2);
	
	// calculate latest travel date ( a year from yesterday )
	var latestTravelDate = earliestTravelDate.clone();
	latestTravelDate.setFullYear( latestTravelDate.getFullYear() + 1 );
	latestTravelDate.addDay(-1);
	
	var showPrevMonth = false;
	if ( lastDayLastMonth.getTime() >= earliestTravelDate.getTime() ) {
		showPrevMonth = true;
	}
	
	var showNextMonth = false;
	if ( firstDayNextMonth.getTime() <= latestTravelDate.getTime() ) {
		showNextMonth = true;
	}

	var output = "<table class=\"calendar " + dateFieldID + "\" cellspacing=0 cellpadding=2><tr><th></th>";
	
	
	if ( showPrevMonth ) {
		output += "<th><a href='' onclick=\"showCalendar('" + dateFieldID + "'," + prevMonth + "," + prevMonthYear + ");return false\"><img class='calendarArrow' src='" + imageHost + "/images/su08/calendarArrowLeft.gif' width='9' height='13' alt='Previous Month'/></a></th>";
	}
	else {
		output += "<th>&nbsp;</th>";
	}
	
	output += "<th colspan=3>" + currentDate.getFullMonthName() + "&nbsp;" + currentDate.getFullYear() + "</th>";

	if ( showNextMonth ) {
		output += "<th><a href='' onclick=\"showCalendar('" + dateFieldID + "'," + nextMonth + "," + nextMonthYear + ");return false\"><img class='calendarArrow' src='" + imageHost + "/images/su08/calendarArrowRight.gif' width='9' height='13' alt='Next Month'/></a></th>";
	}
	else {
		output += "<th>&nbsp;</th>";
	}

	output += "<th><a href='' onclick=\"hideCalendar();return false\"><img style=\"margin-left:5px\" src='" + imageHost + "/images/su08/closeWindowButton.gif' width='15' height='15' alt='Close Calendar'/></a></th></tr>";
	
	output += "<tr><td class=\"dayOfWeek\">Su</td><td class=\"dayOfWeek\">Mo</td><td class=\"dayOfWeek\">Tu</td><td class=\"dayOfWeek\">We</td><td class=\"dayOfWeek\">Th</td><td class=\"dayOfWeek\">Fr</td><td class=\"dayOfWeek\">Sa</td></tr>";
	
	
	// pad days of week to calendar if first day of month is not a Sunday
	var startDayOfWeek = 0;
	while ( currentDate.getDay() > startDayOfWeek ) {
		output += "<td>&nbsp;</td>";
		startDayOfWeek++;
	} 
	
	while ( currentDate.getMonth() == month || currentDate.getDay() != 0 ) {
		var calDateClass = "invalid";
		var validDate = false;
		
		if ( currentDate.getTime() >= earliestTravelDate && currentDate.getTime() <= latestTravelDate ) {
			calDateClass = "validDate";
			validDate = true;
			
			try {
				
				if ( currentDate.getTime() == SearchForm.getOutboundDate().getTime() ) {
					//alert(currentDate.getDate() +"\n"+	currentDate.getMonth() +"\n"+	currentDate.getFullYear() +"\n");
					calDateClass += " date1";
				}
				if ( SearchForm.tripType > 1 && currentDate.getTime() == SearchForm.getInboundDate().getTime() ) calDateClass += " date2";
			}
			catch(e) {} // above block won't work when there is an invalid date in one of the fields

	    }
	
		if ( currentDate.getDay() == 0 ) output += "<tr>";
		
		if ( currentDate.getMonth() != month ) {
			output += "<td>&nbsp;</td>"; // padded days after last day of month
		}
		else if ( validDate ) {
			output += "<td onclick='chooseDate(\"" + dateFieldID + "\"," + currentDate.getTime() + ");return false' class='" + calDateClass + "'><a id='calChoice' href='#' onclick='return false'>" + currentDate.getDate() + "</a></td>";
		}
		else {
			output += "<td class='" + calDateClass + "'>" + currentDate.getDate() + "</td>";
		}
		
		if ( currentDate.getDay() == 6 ) output += "</tr>";
		currentDate.addDay();
	}
	output += "</table>";

	return output;
}


function switchToStudent(){
	get("userTypeId").value="Student";
	get("selectStudent").className="toggleOn";
	get("selectFaculty").className="toggleOff";
}
function switchToFaculty(){
	get("userTypeId").value="Faculty";
	get("selectStudent").className="toggleOff";
	get("selectFaculty").className="toggleOn";

}

var ec = new EventController();

ec.register("A","newsletterGoLink",null,"click","Clicked newsletter go link",submitNewsletterBox,null,null,null);
ec.register("A","logout",null,"click","Logging out",logout,true,null,null);
ec.register("A","wrongUserLogoutLink",null,"click","Logging out",logout,true,null,null);
ec.register("A","newsletterGoLink",null,"click","Clicked newsletter sign up Submit",submitNewsletterBox,true,null,null);
ec.register("A",null,"roundTripToggle","mousedown","Clicked round-trip link",switchToRoundTrip,null,null,null);
ec.register("A",null,"oneWayToggle","mousedown","Clicked one-way link",switchToOneWay,null,null,null);
ec.register("A",null,"openJawToggle","mousedown","Clicked open-jaw link",switchToOpenJaw,null,null,null);
ec.register("IMG",null,"roundTripToggle","mousedown","Clicked round-trip link",switchToRoundTrip,null,null,null);
ec.register("IMG",null,"oneWayToggle","mousedown","Clicked one-way link",switchToOneWay,null,null,null);
ec.register("IMG",null,"openJawToggle","mousedown","Clicked open-jaw link",switchToOpenJaw,null,null,null);
//ec.register("A",null,"studentToggle","mousedown","Clicked student link",switchToStudent,null,null,null);
//ec.register("A",null,"facultyToggle","mousedown","Clicked faculty link",switchToFaculty,null,null,null);


ec.register("A",null,"popupLink","click","Clicked popupLink",showPopup,true,null,null);
ec.register("IMG",null,"popupLink","click","Clicked popupLink",showPopup,true,null,null);

ec.register("A",null,"newWindowLink","click","Clicked new window link",newWindow,null,null,null);
ec.register("A",null,"faqQ","click","Clicked FAQ link",showFAQ,true,null,null);
ec.register("A",null,"taxesAndFeesLink","click","Clicked Taxes and Fees link",showTaxesAndFees,true,null,null);
ec.register("A",null,"airportCodeLink","click","Clicked Airport Codes link",aironClick,true,null,null);
ec.register("A",null,null,"mouseover","Moused over link",resolveLinkPath,null,null,null);
ec.register("A",null,null,"focus","Focused on link",resolveLinkPath,null,null,null);
ec.register("A",null,null,"click","Clicked link",linkClick,null,null,null);

ec.register("INPUT","groupEmail",null,"focus","Initializing group email field",initGroupEmailField,null,null,null);
ec.register("INPUT","groupEmail",null,"blur","Initializing group email field",initGroupEmailField,null,null,null);
ec.register("INPUT",null,"groupFirstName","focus","Initializing First Name field",initFirstNameField,null,null,null);
ec.register("INPUT",null,"groupFirstName","blur","Initializing First Name field",initFirstNameField,null,null,null);
ec.register("INPUT",null,"groupFirstName","load","Initializing First Name field",initFirstNameField,null,null,null);
ec.register("INPUT",null,"groupFirstName","change","Initializing First Name field",initFirstNameField,null,null,null);
ec.register("INPUT",null,"groupMiddleName","focus","Initializing Middle Name field",initMiddleNameField,null,null,null);
ec.register("INPUT",null,"groupMiddleName","blur","Initializing Middle Name field",initMiddleNameField,null,null,null);
ec.register("INPUT",null,"groupMiddleName","change","Initializing Middle Name field",initMiddleNameField,null,null,null);
ec.register("INPUT",null,"groupLastName","focus","Initializing Last Name field",initLastNameField,null,null,null);
ec.register("INPUT",null,"groupLastName","blur","Initializing Last Name field",initLastNameField,null,null,null);
ec.register("INPUT",null,"groupLastName","change","Initializing Last Name field",initLastNameField,null,null,null);

ec.register("INPUT","email",null,"focus","Initializing newsletter email field",initEmailField,null,null,null);
ec.register("INPUT","email",null,"blur","Initializing newsletter email field",initEmailField,null,null,null);
ec.register("INPUT",null,"airportField","focus","Focusing on airport code field",initTextPrompt,null,null,null);
ec.register("INPUT",null,"airportField","blur","Focusing on airport code field",initTextPrompt,null,null,null);
ec.register("INPUT",null,"airportField","change","Entering airport code",changeAirportField,false,null,null);
ec.register("INPUT",null,"airportField","keydown","Pressed enter button in airport field",changeAirportField,true,13,null);
ec.register("INPUT",null,"airportField","keyup","Entering airport code",typingAirportCode,true,null,null);
ec.register("INPUT",null,"dateField","change","Changed date",changedDate,null,null,null);
ec.register("INPUT",null,"dateField","keyup","Pressed enter button",submitSearch,true,13,null);
ec.register("INPUT",null,"shipCountryField","click","Changed shipping country dropdown",loadStates,false,null,null);
ec.register("INPUT",null,"flightTypeFilter","mousedown","Clicked partner radio",filterByPartner,false,null,null);

ec.register("IMG","goDealsIcon",null,"mouseover","Moused over GoDeal icon",showMouseOver,null,null,null);
ec.register("IMG","goDealsIcon",null,"mouseout","Moused out from GoDeal icon",hideMouseOver,null,null,null);
ec.register("IMG",null,"calendarLink","click","Clicked Calendar link",showCalendars,true,null,null);
ec.register("IMG",null,"groupTravelCalendarLink","click","Clicked Calendar link",showGroupTravelCalendars,true,null,null);

ec.register("SPAN",null,"apAltTag","mouseout",null,hideAPAltTag,null,null,null);

ec.register("SELECT","perPage",null,"change","Changed per page choice",changePerPage,false,null,null);
ec.register("SELECT","universityCountryID",null,"change","Changed university country dropdown",loadStates,false,null,null);
ec.register("SELECT","universityLocationID",null,"change","Changed university state dropdown",loadUnivs,false,null,null);
ec.register("SELECT","billcountry",null,"change","Changed billing country dropdown",loadStates,false,null,null);
ec.register("SELECT","outboundFlexibility",null,"change","Changed outbound flexibility",changedOBFlexibility,false,null,null);
ec.register("SELECT","inboundFlexibility",null,"change","Changed inbound flexibility",changedIBFlexibility,false,null,null);

ec.register("FORM","",null,"submit","Submitted Bill/Ship info",billShipSubmit,true,null,null);

ec.register("BUTTON","searchButton",null,"click","Clicked Search Button",submitSearch,true,null,null);
ec.register("BUTTON","goButton",null,"click","Clicked Search Button",submitSearch,null,null,null);
ec.register("BUTTON","billShipSubmitButton",null,"click","Submitted Bill/Ship info",billShipSubmit,true,null,null);
ec.register("BUTTON","signInButton",null,"click","Press sign in button",login,true,null,null);

ec.register("BUTTON","continueBtnJoin",null,"click","Submitting sign up form",signUp,true,null,null);
ec.register("BUTTON","saveBtn",null,"click","Updating profile",updateProfile,true,null,null);

ec.register(null,null,getSliderClassName(),"mousedown","Clicking Slider",clickSlider,true,null,null);
ec.register(null,null,getSliderClassName(),"drag","Dragging Slider",dragSlider,true,null,null);
ec.register(null,null,getSliderClassName(),"dragstop","Released Slider",releaseSlider,true,null,null);

var xMousePos;
var yMousePos;

function processEvent(event) {
		if ( window.event ) event = window.event;  // account for IE using different object to get the event
		if ( event.srcElement ) event.target = event.srcElement;  // account for IE using different object to get the target of the event
		if ( event.keyCode ) event.keypress = event.keyCode;
		else if ( event.charCode ) event.keypress = event.charCode;
		if (document.layers) { 
			event.xMousePos=event.pageX;
			event.yMousePos=event.pageY;
		}
		else if (document.all) { 
			event.xMousePos=window.event.x+document.documentElement.scrollLeft;
			event.yMousePos=window.event.y+document.documentElement.scrollTop;
    	} 
		else if (document.getElementById) {
        	event.xMousePos =event.pageX;
			event.yMousePos =event.pageY;
    	}
		
		xMousePos = event.xMousePos;
		yMousePos = event.yMousePos;
		
		var eventsToExecute = ec.getMatchingEvents(event);
		
		if ( (event.type == "click" || event.type == "mouseup") && eventsToExecute.length > 0 && needTimeout() ) {
			//keepAlive();
		}
		
		// if ( insecureHost == "http://192.168.1.76" ) showMatchingEvents(eventsToExecute); // (debug)
		
		var output="";
		for ( var i = 0 ; i < eventsToExecute.length ; i++ ) {
			var thisEvent = eventsToExecute[i];
			output += thisEvent.description +"\n";
			thisEvent.execute();
			if ( thisEvent.preventDefault ) preventDefault(event);
		}
	}
	
function showMatchingEvents(eventsToExecute) {
	var output = "";
	for ( var i = 0 ; i < eventsToExecute.length ; i++ ) {
		var thisEvent = eventsToExecute[i];
		if ( thisEvent.description ) output += thisEvent.toString() + "<br/>";
	}
	var eventLogger = createElement("div","eventLogger");
	eventLogger.innerHTML = output + eventLogger.innerHTML;
}	



function initEventHandlers() {
	document.onmousedown = processEvent;
	document.onmouseup   = processEvent;
	document.onmouseover = processEvent;
	document.onmouseout  = processEvent;
	document.onmousemove = processEvent;
	document.onkeyup     = processEvent;
	document.onkeydown   = processEvent;
	document.onclick     = processEvent;
	document.onload      = processEvent;
	var selectBoxes = getElementsByTagName("select");
	for ( var i = 0 ; i < selectBoxes.length ; i++ ) {
		selectBoxes[i].onchange = processEvent;
		selectBoxes[i].onfocus = processEvent;
		selectBoxes[i].onblur = processEvent;
	}
	var inputBoxes = getElementsByTagName("input");
	for ( var i = 0 ; i < inputBoxes.length ; i++ ) {
		inputBoxes[i].onchange = processEvent;
		inputBoxes[i].onfocus = processEvent;
		inputBoxes[i].onblur = processEvent;
	}
}

windowLoadTasks.add(initEventHandlers);



