
var months = new Array ("January","February","March","April","May","June","July","August","September","October","November","December");

var daysFull = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
var days = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");

function formatTime(dateObj) {
	timeString = days[dateObj.getDay()] + " " + formatTimeOfDay(dateObj);
	return timeString;
}

function formatFullDate(dateObj) {
	year =  (dateObj.getYear() % 1900) + 1900; // IE returns full year, FF # years after 1900
	timeString = daysFull[dateObj.getDay()] + ", " + months[dateObj.getMonth()] + " " + dateObj.getDate() + " " +  year;
	return timeString;
}

function getEasternTimeOffset(timeString) {
	var easternDate = new Date("Wed Jul 25 13:49:42 EDT 2007");
	var localDate = new Date("Wed Jul 25 13:49:42 2007");
	var offset = easternDate.getTime() - localDate.getTime();
	return offset;
}

function formatTimeOfDay(origDateObj) {
	var dateObj = new Date(origDateObj.getTime());
	
	dateObj.setTime( dateObj.getTime()  );
	
	ampm = "am";
	hours = dateObj.getHours();
	
	if ( hours > 12 ) {
		hours -= 12;
		ampm = "pm";
	}
	else if ( hours == 12 ) ampm = "pm";
	
	if ( hours == 0 ) hours = 12;
	
	minutes = dateObj.getMinutes();
	if ( minutes < 10 ) {
		minutes = "0" + minutes;
	}
	timeString = hours + ":" + minutes + ampm;
	return timeString;
}

function roundToNearestMinutes(date,minuteInterval,roundUp) {
	numBlocks = date.getMinutes() / minuteInterval;
	if ( roundUp ) {
		numBlocks = Math.ceil(numBlocks);
	}
	else {
		numBlocks = Math.floor(numBlocks);
	}
	date.setMinutes( numBlocks * minuteInterval );
	return date;
}

function roundToNearestNumber(number,blockSize,roundUp) {
	numBlocks = number / blockSize;
	if ( roundUp ) {
		numBlocks = Math.ceil(numBlocks);
	}
	else {
		numBlocks = Math.floor(numBlocks);
	}
	return numBlocks * blockSize;
}

function displayMoney(number,roundCents) { return '$' + ( roundCents ? roundMoney_old(number) : roundMoney(number));}
function displayMoneyNoCurrency(number,reround) { return (reround=='no'? number : roundMoney(number));}

function roundMoney_old(num) {
num = num.toString().replace(/\$|\,/g,'');
if(isNaN(num))
num = "0";
sign = (num == (num = Math.abs(num)));
num = Math.floor(num*100+0.50000000001);
cents = num%100;
num = Math.floor(num/100).toString();
if(cents<10)
cents = "0" + cents;
for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
num = num.substring(0,num.length-(4*i+3))+','+
num.substring(num.length-(4*i+3));
return (((sign)?'':'-') + num + '.' + cents);
}

function roundMoney(num) {
return Math.round(num);
}

function round_decimals(original_number, decimals) {
    var result1 = original_number * Math.pow(10, decimals)
    var result2 = Math.round(result1)
    var result3 = result2 / Math.pow(10, decimals)
    return pad_with_zeros(result3, decimals)
}

function pad_with_zeros(rounded_value, decimal_places) {

    // Convert the number to a string
    var value_string = rounded_value.toString()
    
    // Locate the decimal point
    var decimal_location = value_string.indexOf(".")

    // Is there a decimal point?
    if (decimal_location == -1) {
        
        // If no, then all decimal places will be padded with 0s
        decimal_part_length = 0
        
        // If decimal_places is greater than zero, tack on a decimal point
        value_string += decimal_places > 0 ? "." : ""
    }
    else {

        // If yes, then only the extra decimal places will be padded with 0s
        decimal_part_length = value_string.length - decimal_location - 1
    }
    
    // Calculate the number of decimal places that need to be padded with 0s
    var pad_total = decimal_places - decimal_part_length
    
    if (pad_total > 0) {
        
        // Pad the string with 0s
        for (var counter = 1; counter <= pad_total; counter++) 
            value_string += "0"
        }
    return value_string
}

function sort(sortField) {
	submitAjaxFromQuery("sortResults",updateResults,"GET","sortField="+sortField,"Sorting");
}

function filterResults(filterField,value,type) {
	var query = "filterField=" + filterField;
	
	if ( filterField.indexOf("Time") >= 0 ) {
		value = new Date(value).getTime();
	}
	
	query += "&filterValue=" + value;
	query += "&filterType=" + type;
	submitAjaxFromQuery("filterResults",updateResults,"GET",query,"Updating");
	setTimeout("pointOutFilteredSize()",500);
}

function removeFilter(filterField,type) {
	var query = "filterField=" + filterField;
	query += "&filterType=" + type;
	submitAjaxFromQuery("filterResults",updateResults,"GET",query,"Updating");
	setTimeout("pointOutFilteredSize()",500);
}

function updateResults(returnMsg) {
	var json = eval("new Object(" + returnMsg + ")");
	var returnObj = eval("new Object(" + json.returnMsg + ")");
	var startIndex = parseInt(returnObj.startIndex,10) + 1;
	var endIndex = parseInt(returnObj.endIndex,10) + 1;
	//get("navLinksBottom").innerHTML = ""; // this is so the lines below don't have interference from this duplicate div
	get("firstItin").innerHTML = startIndex;
	get("lastItin").innerHTML = endIndex;
	get("listSize").innerHTML = returnObj.totalResults;
	get("filteredSize").innerHTML = returnObj.visibleResults;
	get("numInList").innerHTML = returnObj.visibleResults;
	get("prevPageLink").className = ( startIndex == 1 ) ? "grayed-out":"";
	get("nextPageLink").className = ( returnObj.hasNextPage ) ? "":"grayed-out";
	get("firstPageLink").className = ( startIndex == 1 ) ? "grayed-out":"";
	get("lastPageLink").className = ( returnObj.hasNextPage ) ? "":"grayed-out";

	if ( returnObj.visibleResults > 0 ) {
		//get("navLinksBottom").innerHTML = ""; // this is so the lines below don't have interference from this duplicate div
		//get("navLinksBottom").innerHTML = get("navLinks").innerHTML + "";
		showElement("navLinks");
		//showElement("navLinksBottom");
		showElement("perPageChoice");
		showElement("addlTerms");
	}
	else {
	
		hideElement("navLinks");
		//hideElement("navLinksBottom");
		hideElement("perPageChoice");
		hideElement("addlTerms");
	}
	setTimeout("redisplay()",0);
}

function registerPopupLinks(e) {
	var url = this.href;
	if ( this.tagName != "A" ) url = this.parentNode.href;	
	$.get(url, function(returnMsg){
		openPopup(returnMsg,e.pageX,e.pageY);
	});
	return false;
}

function toggleItinDetails(thisIndex) {
	var itinInfo = get("itin"+thisIndex)
	var itinDetailInfo = get("itinDetailRow"+thisIndex);
	var detailsLink = get("detailsLink"+thisIndex);
	$.ajax({
	    url: "/fly/airsearchResultsItinDetail.jsp?index="+thisIndex,
	    type: 'POST',
	    dataType: 'html',
	    data:
		    {
	    	},
	    timeout: 5000,
	    error: function(){
	    	window.location.reload();
	    	//document.execCommand("refresh");
	    	//selectThis(this.id);
	    	//filterResults('airline','1A',2);
	        return false;
	    },
	    success: function(returnMsg){
	    	if (returnMsg.indexOf("Session Expired") >= 0) {
	    		goToURL( "/sessionExpired.html" );
	    	} else {
	    		if (itinDetailInfo.innerHTML.length == 0) {
					itinDetailInfo.innerHTML = returnMsg;
					itinInfo.className = "itinRow-expanded";
					detailsLink.className = "detailsLink-expanded";
					$("a.popupLink, img.popupLink, a.airportCodeLink, a#popupLink").each(function(){
						if($(this).attr("rel")!="facebox[.bigsizeBox]") $(this).attr("rel","facebox[.bigsizeBox]").facebox();
					})
				} else {
					itinDetailInfo.innerHTML = "";
					itinInfo.className = "itinRow";
					detailsLink.className = "detailsLink";
				}
			}
	    }
	});	
}

function redisplay() {
	var updateDisplay = function(returnMsg) {
		if ( get("filteredSize").innerHTML != "0" ) get("outputArea").innerHTML = returnMsg;
		else get("outputArea").innerHTML = get("noMatchesMsg").innerHTML + "";
		
		$("a.popupLink, img.popupLink, a.airportCodeLink, a#popupLink").each(function(){
			if($(this).attr("rel")!="facebox[.bigsizeBox]") $(this).attr("rel","facebox[.bigsizeBox]").facebox();
		})
   		$("SPAN#apAltTag, SPAN.apAltTag").mouseout(function () {
      			if ( get("movingAltTag") ) get("movingAltTag").style.display = "none";
				if ( defined(showingAirportCodeDesc) ) clearTimeout(showingAirportCodeDesc);	
      	});
	}

	xmlBasicRequest("/fly/airsearchResultsDetail.jsp",updateDisplay,"GET");
}

function firstPage() {
	submitAjaxFromQuery("firstPage",updateResults,"GET","");//scroll(0,0);
}
	
function prevPage() {
	submitAjaxFromQuery("prevPage",updateResults,"GET","");//scroll(0,0);
}
	
function nextPage() {
	submitAjaxFromQuery("nextPage",updateResults,"GET","");//scroll(0,0);
}

function lastPage() {
	submitAjaxFromQuery("lastPage",updateResults,"GET","");//scroll(0,0);
}

function initializeResults() {
	initSliderValues();
}

function setSelectBoxValue(selectBoxObj,value) {
	for ( var i = 0 ; i < selectBoxObj.options.length ; i++ ) {
		if ( selectBoxObj.options[i].value == value ) {
			selectBoxObj.selectedIndex = i;
		}
	}
}

function hideItinDetails(itinNumber) {
	thisItin = itinList.get(itinNumber);
	thisItinRow = get("itinDetailRow"+itinNumber);
	//thisItinRow.style.display = "none";
	
	thisItinRow = get("itinDetail"+itinNumber);
	thisItinRow.innerHTML = "";
	
	thisItin.expanded = false;
	itinList.set(itinNumber,thisItin);
	
	thisItinRow = get("itin"+itinNumber);
	thisItinRow.className = "itinRow";
	
	detailsLink = get("detailsLink"+itinNumber);
	detailsLink.className = "detailsLink";
}

function changeFilter(radioObj,doNotReset) {
	radioObj.checked = true;
	thisID = radioObj.id;
	if ( thisID == "obDepartTime" ) { 
		showElement("obDepartTimeFilter",true);
		hideElement("obArriveTimeFilter",true);
		if ( !defined(doNotReset) ) setTimeout('resetSliders("obArriveTime")',0);
	}
	else if ( thisID == "obArriveTime" ) {
		showElement("obArriveTimeFilter",true);
		hideElement("obDepartTimeFilter",true);
		if ( !defined(doNotReset) ) setTimeout('resetSliders("obDepartTime")',0);
	}
	else if ( thisID == "ibDepartTime" ) { 
		showElement("ibDepartTimeFilter",true);
		hideElement("ibArriveTimeFilter",true);
		if ( !defined(doNotReset) ) setTimeout('resetSliders("ibArriveTime")',0);
	}
	else if ( thisID == "ibArriveTime" ) {
		showElement("ibArriveTimeFilter",true);
		hideElement("ibDepartTimeFilter",true);
		if ( !defined(doNotReset) ) setTimeout('resetSliders("ibDepartTime")',0);
	}
}

function resetSliders(sliderFieldName) {
	var sliders;
	if ( isIE() ) {
		sliders = getElementsByClassName(document, '*', getSliderClassName());
	}
	else {
		sliders = getElementsByClassName(get(sliderFieldName+"Filter"), 'div', getSliderClassName());
	}
	for ( var i = 0 ; i < sliders.length ; i++ ) {
		thisSlider = sliders[i];
		sliderObj = thisSlider.sliderObj;
		if ( sliderObj.filterField() == sliderFieldName && (sliderObj.type == 0 && sliderObj.getValue() != 0 || sliderObj.type == 1 && sliderObj.getValue() != 1) ) {
			if ( sliderObj.type == 0 ) sliderObj.setValue(0);
			else if ( sliderObj.type == 1 ) sliderObj.setValue(100);
			targetClass = sliderObj.parent.target;
			displayDiv = get(sliderObj.parent.display + sliderObj.type);
			displayDiv.innerHTML = targetClass.getSliderValueTranslation( sliderObj.filterField(),sliderObj.getValue(),sliderObj.type );
			targetClass.handleSliderUpdate(sliderObj.filterField(),sliderObj.getValue(),sliderObj.type);
			removeFilter(sliderFieldName,sliderObj.type)
		}
	}
	setTimeout("redisplay()",0);
}

var pointOutTimer;

function pointOutFilteredSize() {
	if ( defined(pointOutTimer) ) clearTimeout(pointOutTimer);
	get("filteredSize").className = "updated";
	pointOutTimer = setTimeout("stopPointingOut()",3250);
}

function stopPointingOut() {
	get("filteredSize").className = "";
	clearTimeout(pointOutTimer);
}

function updateSliders() {
	var sliderHash = itinList.sliderHash;
	for ( var sliderID in sliderHash ) {
		var sliderHashValue = sliderHash[sliderID];
		var displayValue = sliderHashValue.split(":::")[0];
		var displayMarginLeft = sliderHashValue.split(":::")[1];
		var sliderDiv = document.getElementById(sliderID);
		var sliderObj = document.getElementById(sliderID).sliderObj;
		
		for ( var i = 0 ; i < itinList.selectedTimeFilters.length ; i++ ) {
			var radioObj = get(itinList.selectedTimeFilters[i]);
			changeFilter(radioObj,true);
		}
		
		var displayDiv = get(sliderObj.parent.display + sliderObj.type);
		displayDiv.innerHTML = displayValue;
		sliderDiv.style.left = displayMarginLeft;
	}
}

function showAllResults() {
	$("div").removeClass("airlineMatrix-selected");
	$("div#1A div").addClass("airlineMatrix-selected");
	
	clearFilters();
	get("obDepartTime").checked = true;
	if ( defined(get("ibDepartTime")) ) {
		get("ibDepartTime").checked = true;
	}
	

	if ( itinList.tripType > 1 ) get("ibDepartTime").checked = true;

	$('#jQsliderOB').slider('moveTo',0,0);
	var maxOB = $('#jQsliderOB').slider('option', 'max');
	$('#jQsliderOB').slider('moveTo',maxOB,1);
	$('#jQsliderIB').slider('moveTo',0,0);
	var maxIB = $('#jQsliderIB').slider('option', 'max');
	$('#jQsliderIB').slider('moveTo',maxIB,1);
	
	$("input[id='airportinput']").attr("checked","on");
	
	$("#userTypeStudent").attr('checked', true);
	$("#userTypeFaculty").attr('checked', true);
	$("#userTypeYouth").attr('checked', true);
	$("#purchasable").attr('checked', false);
	setTimeout("pointOutFilteredSize()",500);
}

function clearFilters() {
	submitAjaxFromQuery("showAllResults",updateResults,"GET","","Updating");
}

function selectThis(airlineDivID) {
	var divs = getElementsByClassName(document,"div","airlineMatrix-selected");
	for ( i = 0 ; i < divs.length ; i++ ) divs[i].className = "airlineMatrix";
	
	if (get(airlineDivID)){  // check to see if doing "classic search" with airline matrix
		get(airlineDivID).className = "airlineMatrix-selected";
	}
}









Itinerary = function() { 
	
}

Itinerary = function(itinIndex,legs,parentList) { 
	this.itinIndex = itinIndex;
	this.legs = legs;
	this.parentList = parentList;
}

Itinerary.prototype = {
    itinIndex: null,
	uuid: null,
	price: null,
	tax: null,
	usTax: null,
	serviceFee: null,
	airline: null,
	tripType: null,
	btic: null,
	showAvailability: null,
	marketingMsg: null,
	
	legs:null, 
	numStops: null,
	visible: true,
	parentList: null,
	rank: null,
	expanded: false,
	seatCount: null,

	uuid: function() { return this.uuid; },
	tax: function() { return this.tax; },
	serviceFee: function() { return this.serviceFee; },
	total: function() { return ( this.price + this.usTax + this.tax + this.serviceFee); },
	numSeats: function() { return this.seatCount },
	obDepartAP: function() { return this.legs[0].segments[0].departAP ; },
	
	obArriveAP: function() {
        lastSegment = this.legs[0].segments.length - 1;
		return this.legs[0].segments[lastSegment].arriveAP ;
	},
		
	obDepartTime: function() { return new Date( this.legs[0].segments[0].departTime); },
	
	obArriveTime: function() {
        lastSegment = this.legs[0].segments.length - 1;
		return new Date( this.legs[0].segments[lastSegment].arriveTime);
	},
		
	ibDepartAP: function() { return this.legs[1].segments[0].departAP ; },
	
	ibArriveAP: function() {
        lastSegment = this.legs[1].segments.length - 1;
		return this.legs[1].segments[lastSegment].arriveAP ;
	},
	
	returnAirportChange: function() {
		if ( this.tripType > 1 && this.obDepartAP() != this.ibArriveAP() ) return true;
		else return false;
	},
	
	destinationAirportChange: function() {
		if ( this.tripType == 2 && this.obArriveAP() != this.ibDepartAP() ) return true;
		else return false;
	},
	
	ibDepartTime: function() { 
		if ( !this.isOneWay() ) return new Date( this.legs[1].segments[0].departTime);
	},
	
	ibArriveTime: function() {
        lastSegment = this.legs[1].segments.length - 1;
		return new Date( this.legs[1].segments[lastSegment].arriveTime);
	},
	
	stopsOB: function() { return this.legs[0].segments.length - 1; },
	
	stopsIB: function() { 
		if ( !this.isOneWay() ) return this.legs[1].segments.length - 1;
		else return 0;
	},
	
	stops: function() { return this.stopsOB() + this.stopsIB(); },

	rank: function() { return this.rank; },
	
	getOutboundSegments: function() { 
		return this.legs[0].segments;
	},
	
	getInboundSegments: function() { 
		return this.legs[1].segments;
	},
	
	getMarketingMessage: function() {
		return this.marketingMsg;
	},
	
	hideAvailability: function() {
		return ( this.showAvailability != "true" );
	},
	
	isOneWay: function() {
		if ( this.legs.length == 1 ) return true;
		else return false;
	},
	
	getValueByName: function(name) {
		if ( name == "total") return this.total();
		else if ( name == "airline") return this.airline;
		else if ( name == "obDepartTime") return this.obDepartTime();
		else if ( name == "obArriveTime") return this.obArriveTime();
		else if ( name == "ibDepartTime") return this.ibDepartTime();
		else if ( name == "ibArriveTime") return this.ibArriveTime();
		else if ( name == "type") return this.type;
		else alert(name + " not defined in getValueByName function!");
	}
}

ItinList = function(lowestTotal,highestTotal,obDepartTimeEarliest,obDepartTimeLatest,obArriveTimeEarliest,obArriveTimeLatest,ibDepartTimeEarliest,ibDepartTimeLatest,ibArriveTimeEarliest,ibArriveTimeLatest) {
	this.totalLowest = lowestTotal;
	this.totalHighest = highestTotal;
	this.obDepartTimeEarliest = new Date(obDepartTimeEarliest);
	this.obDepartTimeLatest = new Date(obDepartTimeLatest);
	this.obArriveTimeEarliest = new Date(obArriveTimeEarliest);
	this.obArriveTimeLatest = new Date(obArriveTimeLatest);
	this.ibDepartTimeEarliest = new Date(ibDepartTimeEarliest);
	this.ibDepartTimeLatest = new Date(ibDepartTimeLatest);
	this.ibArriveTimeEarliest = new Date(ibArriveTimeEarliest);
	this.ibArriveTimeLatest = new Date(ibArriveTimeLatest);
},

ItinList.prototype = {
    itinArray: null,
	visibleItinArray: null,
	sortFieldArray: null,
	currentPrimarySortField: null,
	filterArray: null,
	numVisible: null,
	perPage: null,
	selectedAirline: null,
	airlineInfoList: null,
	
	handleSliderUpdate: function(targetField,value,type,showWaitMessage) {
		if ( targetField == "total" ) {
			number = this.getNumberFromSliderValue(value,targetField);
			filterResults(targetField,number,type)
		}
		else {
			dateToShow = this.getTimeFromSliderValue(value,targetField);
			filterResults(targetField,dateToShow,type)
		}
	},
	
	getSliderValueTranslation: function(targetField,value,type) {
		if ( targetField == "total" ) {
			totalToShow = this.getNumberFromSliderValue(value,targetField);
			return displayMoney(totalToShow);
		}
		else {
			dateToShow = this.getTimeFromSliderValue(value,targetField);
			return formatTime(dateToShow,true);
		}
	},
	
	getNumberFromSliderValue: function(percentage,fieldToCheck) {
		lowestTotal = eval("this." + fieldToCheck + "Lowest");
		highestTotal = eval("this." + fieldToCheck + "Highest");
		priceSpread = highestTotal - lowestTotal;
		priceOffset = percentage * priceSpread;
		return Math.round(lowestTotal + priceOffset);
	},
	
	getTimeFromSliderValue: function(percentage,fieldToCheck) {
		earliestTime = eval("this." + fieldToCheck + "Earliest");
		latestTime = eval("this." + fieldToCheck + "Latest");
		timeSpread = latestTime.getTime() - earliestTime.getTime();
		timeOffset = percentage * timeSpread;
		numFifteenMinBlocks = Math.round(timeOffset / 900000);
		newTime = numFifteenMinBlocks * 900000;
		dateObj = new Date( earliestTime.getTime() + newTime );
	return dateObj;
	}
	
}


