/* --------------------------------------------------------------- */
// Search page manager
//
// var author = Remi Palard;
// author.email = remi.palard@gmail.com;
//
/* --------------------------------------------------------------- */

/* --------------------------------------------------------------- */
// Global vars - First letter in upper case
/* --------------------------------------------------------------- */
var FormBackup = '';
var ElemBackup;
var WindowCityPopup = '';
var AutoCompleteNotFound = false;
var CookieName = "aeroplan_airbooking";
var CommonFields = {'cityFrom':'','cityFromCode':'','cityToCode':'','cityTo':'','l':'', 'lDate':'','r':'', 'rDate':'', 'AdultsNb':'', 'ChildrenNb':''};
var CurrentTripTab = "return";
var inf = new dialog(false);
var nf = new nextFocus(); 
var isErrorTab = false;
var ErrorTab;
var ca = new cityAuto;
var cityArray = new Array();
var AjaxCityCalling = false;

/* --------------------------------------------------------------- */
// Functions
/* --------------------------------------------------------------- */

// Laurent Petit - 15/02/2006 - Storing current layer name in a var
function setCurrentTripTab(_nav) {
    CurrentTripTab = _nav;
}

/* --------------------------------------------------------------- */

function getCurrentTripTab() {
    return CurrentTripTab;
}

/* --------------------------------------------------------------- */
// Laurent Petit - 24/04/2006 - Show/Hide errors header div depending on tab clicked
function hideShowErrorsHeader(){
	var div_err1 = $('returnTravelWarning');
	var div_err2 = $('multicityTravelWarning');
	var div_err3 = $('multiTravelWarning');
	
	if ((div_err1!=null || div_err2!=null || div_err3!=null) && !isErrorTab){
		isErrorTab = true;
		ErrorTab = CurrentTripTab;
	}
	
	if(isErrorTab){
		if(CurrentTripTab==ErrorTab){
			show($(CurrentTripTab +'TravelWarning'));
		}else{
			hide($(CurrentTripTab +'TravelWarning'));
		}
	}
}

/* --------------------------------------------------------------- */

function travelNav(_nav, multicityNbBlock) {
    // Debug mode
    if (DebugMode && ($('debug') != null)) show('debug');

	// Storing current layer name
	setCurrentTripTab(_nav);
	
	// Hide errors header if switch tab
	hideShowErrorsHeader()	

    // Navigation
    switch (_nav) {
        case 'return':
            hide('multi');hide('multicity');show('return');hide('oneway');
            recoverCommonFields(_nav,0); 
            recoverSearch();
        break;
        case 'oneway':
            hide('return'); hide('multicity'); hide('multi');show('oneway');           
            recoverCommonFields(_nav,1);
        break;        
        case 'multicity':
            hide('return');hide('multi');show('multicity');hide('oneway');
            recoverCommonFields(_nav,2);
        break;
        case 'multi':
            hide('return'); hide('multicity'); show('multi');hide('oneway');           
            recoverCommonFields(_nav,3);
            showMoreDestinations();
        break;
    }
}

/* --------------------------------------------------------------- */
// Backup functions
/* --------------------------------------------------------------- */

function recoverBackup(el) {
	if (el.value == '' && AutoCompleteNotFound == false) {
		el.value = FormBackup;
		FormBackup = '';
	}
}

/* --------------------------------------------------------------- */

function noBackupClear(el) {
	FormBackup = '';
	el.value = '';
}


/* --------------------------------------------------------------- */

function backupAndClear(el) {
	
	// To prevent recover bug - clicking directly from a field to another field
	// Set the last element focused
	if (FormBackup != '' && ElemBackup.value == '') ElemBackup.value = FormBackup;
	
	ElemBackup = el;	
	FormBackup = el.value;
	el.value = '';
}

/* --------------------------------------------------------------- */

function recoverCommonFields(_nav, selectedRadio) {

    // Set form fields
    var f = document.forms[_nav + 'Travel'];

    if (_nav == 'return')
        var formFields = Array('city1FromReturn','city1FromReturnCode','city1ToReturnCode','city1ToReturn','l1Return', 'l1ReturnDate','r1Return', 'r1ReturnDate', 'ReturnAdultsNb', 'ReturnChildrenNb', 'l1ReturnTime', 'r1ReturnTime');
    else if (_nav == 'oneway')    
		var formFields = Array('city1FromOneway','city1FromOnewayCode','city1ToOnewayCode','city1ToOneway','l1Oneway', 'l1OnewayDate' , 'OnewayAdultsNb', 'OnewayChildrenNb', 'l1OnewayTime');
    else if (_nav == 'multicity')
        var formFields = Array('city1FromMulticity','city1FromMulticityCode','city1ToMulticityCode','city1ToMulticity','l1Multicity', 'l1MulticityDate' , 'MulticityAdultsNb', 'MulticityChildrenNb', 'l1MulticityTime');
    else
        var formFields = Array('city1FromMulti','city1FromMultiCode','city1ToMultiCode','city1ToMulti','l1Multi','l1MultiDate','r1Multi','r1MultiDate', 'MultiAdultsNb', 'MultiChildrenNb');

    //Revover
    for (var i=0;i<formFields.length;i++) {

    	/* Patch for f****** safari */
    	var ff = _nav.substr(0,1).toUpperCase();
    	var rr = _nav.substr(1,_nav.length);
    	var ucfirst = (ff + rr).toString();
   
    	
    	/* Little dirty hack cause fields aren't
    	   correctly named (city1FromReturn or r1ReturnDate or returnAdultsNb)
    	   for common fields
    	*/
    	reg = new RegExp(_nav + "|" + ucfirst + "|1|0","g");
    	cf = formFields[i].replace(reg,'');
      	if (f.elements[formFields[i]].type == 'select-one'){      		
      		for (o=1;o<f.elements[formFields[i]].options.length;o++){
      			if (f.elements[formFields[i]].options[o].value == CommonFields[cf]){
					f.elements[formFields[i]].selectedIndex=o;
					break;
				}
			}
    	} else if (f.elements[formFields[i]] != null) {
    		if (CommonFields[cf] != '') {
    			if (f.elements[formFields[i]].value == '' || f.elements[formFields[i]].value == _jssYYYYMMDD)
    				f.elements[formFields[i]].value = CommonFields[cf];
    			}
      	}
    }
    for (var i=0;i<f.elements['tabRadio'].length;i++) {
    	if (i==selectedRadio)
    		f.elements['tabRadio'][i].checked = true;
    	else
    		f.elements['tabRadio'][i].checked = false;
	}
    
}

/* --------------------------------------------------------------- */

function saveCommonFields(_id,_value) {
    var cases = Array('return','multicity','multi');

		if ($(_id) != null && _value != null && _value != '') {
			for (var i=0;i<cases.length;i++) {

					/* Patch for f****** safari */
					var f = cases[i].substr(0,1).toUpperCase();
					var r = cases[i].substr(1,cases[i].length);
					var ucfirst = (f + r).toString();

					var reg = new RegExp(cases[i] + "|" + ucfirst + "|1|0","g");
					var _id = _id.replace(reg,'');
				}
				CommonFields[_id] = _value;
		}
}

/* --------------------------------------------------------------- */
// Laurent Petit
function storePassengerMax(travelType) {
    var formName        = travelType.toLowerCase() + 'Travel';
    var cField          = travelType + 'ChildrenNb';
    var aField          = travelType + 'AdultsNb';
    var totField        = travelType + 'TotalPassengerNb';
    var nbAdults        = 0;
    var nbChildren      = 0;
    var t               = 0;
    var max             = 8;
    var f               = document.forms[formName];

    nbAdults = parseInt(f.elements[aField].options[f.elements[aField].selectedIndex].value,10);
    nbChildren = parseInt(f.elements[cField].options[f.elements[cField].selectedIndex].value,10);
    t = nbAdults + nbChildren;
    
	if (nbChildren > 0 && nbAdults == 0)
		show(travelType.toLowerCase() + 'unaccompaniedWarning');
	else
		hide(travelType.toLowerCase() + 'unaccompaniedWarning');    

	if (t > 8){
		show(travelType.toLowerCase() + 'maxWarning');
		$('paxdiff').innerHTML=_jssOopsMax.replace('[#####]',t - max);
	}
	else
		hide(travelType.toLowerCase() + 'maxWarning');    

    // Store total in a hidden field
    $(totField).value = t;
}
/* --------------------------------------------------------------- */

function nextFocus() {
	var el;
	var toFocus;
	var timeout;
	
	this.timeout = 100;
	
	nextFocus.prototype.init = function (element) {	
		
		// When arriving from a popup
		if (element.id == null) element = $(element);
		
		this.el = element;
		this.toFocus = $(getNextFocus(this.el.name));	
		
		if (this.toFocus != undefined) {
			setTimeout(this.myFocus.bind(this), this.timeout);			
		}
	};
		
	nextFocus.prototype.myFocus = function () {
		if (this.el.value != '' && (this.toFocus.value == '' || this.toFocus.value == 'yyyymmdd' || this.toFocus.value == 'aaaammjj' || this.toFocus.value == 'mmddyyyy' || this.toFocus.value == 'jjmmaaaa' )) {
			this.toFocus.focus();
		}
	};
}
function getNextFocus(id){
	// Return
	if (id=='city1FromReturn') return 'city1ToReturn';
	if (id=='city1ToReturn') return 'l1Return';	
	if (id=='l1Return') return 'r1Return';
	if (id=='r1Return') return 'ReturnAdultsNb';
	if (id=='ReturnAdultsNb') return 'ReturnChildrenNb';		
	
	// Oneway
	if (id=='city1FromOneway') return 'city1ToOneway';
	if (id=='city1ToOneway') return 'l1Oneway';	
	if (id=='l1Oneway') return 'r1Oneway';
	if (id=='r1Oneway') return 'OnewayAdultsNb';
	if (id=='OnewayAdultsNb') return 'OnewayChildrenNb';			
	
	// Multicity
	if (id=='city1FromMulticity') return 'city1ToMulticity';
	if (id=='city1ToMulticity') return 'l1Multicity';	
	if (id=='l1Multicity') return 'city2FromMulticity';
	if (id=='city2FromMulticity') return 'city2ToMulticity';
	if (id=='city2ToMulticity') return 'l2Multicity';	
	if (id=='l2Multicity') return 'city3FromMulticity';	
	if (id=='city3FromMulticity') return 'city3ToMulticity';
	if (id=='city3ToMulticity') return 'l3Multicity';			
	if (id=='l3Multicity') return 'MulticityAdultsNb';
	if (id=='MulticityAdultsNb') return 'MulticityChildrenNb';			
	
	// Multi
	if (id=='city1FromMulti') return 'city1ToMulti';
	if (id=='city1ToMulti') return 'city2ToMulti';	
	if (id=='city2ToMulti') return 'city3ToMulti';
	if (id=='city3ToMulti') return 'city4ToMulti';
	if (id=='city4ToMulti') return 'city5ToMulti';			
	if (id=='city5ToMulti') return 'city6ToMulti';			
	if (id=='city6ToMulti') return 'city7ToMulti';	
	if (id=='city7ToMulti') return 'city8ToMulti';
	if (id=='city8ToMulti') return 'city9ToMulti';
	if (id=='city9ToMulti') return 'city10ToMulti';			
	if (id=='l1Multi') return 'r1Multi';
	if (id=='r1Multi') return 'MultiAdultsNb';
	if (id=='MultiAdultsNb') return 'MulticityChildrenNb';			
	
	return '';
	
}
function moveFocus(id){
	var nf;
	var el = $(id);	
	var toFocus = $(getNextFocus(el.name));
	
	if (toFocus != undefined) {
		if (el.value != '' && (toFocus.value == '' || toFocus.value == 'yyyymmdd' || toFocus.value == 'aaaammjj' || toFocus.value == 'mmddyyyy' || toFocus.value == 'jjmmaaaa' )) {
			toFocus.focus();
		}
	}	
	
}

/* --------------------------------------------------------------- */

function closeLastCityPopup() {
	if (WindowCityPopup != '') {
		try {		
			WindowCityPopup.close();	
		}
		catch(e) {}	
	}
}


/* --------------------------------------------------------------- */
// Laurent Petit
// Do we have to show the 5 more destinations fields ?
function showMoreDestinations() {
	var showTen = false;

    for (var i=6;i<=10;i++)	
    	if ($('city' + i + 'ToMultiCode').value != '') showTen = true;
    
    if(showTen) {
    	hide('add5moreLink');hide('add5moreLinkSep');show('add5more');
    }
}

/* --------------------------------------------------------------- */
/* ...than the coyote */
/* --------------------------------------------------------------- */
function bipbipIsFaster(el) {
	var _nav;	
	var code = el.id + 'Code'; 
	var out = '';  
	var apCode = el.value;
	
	if (apCode.toLowerCase() == 'xi') apCode = 'XIY'; // Patch for the only 2 letters city...
	
	// Set the hidden field
	//if (el.value != '' && el.value.length <= 3 ) $(code).value = apCode.toUpperCase();
	if (el.value.length <= 3 ) $(code).value = apCode.toUpperCase();
	
	// Show the correct city (first one found)
	if (el.value != '') { 		
		for (var i = 0; i < cityArray.length; i++) {		
			
			if (el.value.toLowerCase() == cityArray[i][0].toLowerCase() || 
				cityArray[i][3].toLowerCase().indexOf(el.value.toLowerCase()) > -1) {
				
				// Set value
				out += cityArray[i][3] + ' - ';
				out += cityArray[i][2] == '' ? '' : cityArray[i][2] + ' - ';
				out += cityArray[i][1] + ' - ';
				out += cityArray[i][0];				
				$(el.id).value = out;
				
				// Stop searching
				i = cityArray.length;			
			}	
		}
	}
		
	// Fix recover bug
	saveCommonFields(el.id,el.value);	
	saveCommonFields(code,$(code).value);	
}

/* --------------------------------------------------------------- */

function cityAutoOld(_id,_target) {
    new Autocompleter.Local(_id,_target, cityArray, { partialChars: 3, fullSearch: false, partialSearch: false });
}

/* --------------------------------------------------------------- */

function cityAuto() {	
	var id,target;
  var myAjax;
	var URL; 
	var entry;
	var lastRequest;
  var c = undefined;

	// To avoid unuseful ajax calls  
	this.lastRequest = '';
	
	/* ------------------------------- */
	
	cityAuto.prototype.init = function(id,list) {
		this.id = id;
		this.target = id + 'AutoComplete';	
		this.URL = '/adr/AirportSearch.do';
		
		if(list!=null){
			this.URL = this.URL+'?list='+list;
		}		
				
		// Start Listener
    this.c = new Autocompleter.Local(this.id,this.target, cityArray, { partialChars: 3, fullSearch: false, partialSearch: false });						  					
  }
  
  /* ------------------------------- */
  
	cityAuto.prototype.startSearch = function() {	  			
		this.entry = $(this.id).value;
		
		// Start call
		if ($(this.id).value.length >= 3 && this.lastRequest != this.entry) {
			
			var myAjax = new Ajax.Request( 
				this.URL, { 
				method: 'post', 
				parameters: 'airport=' + this.entry, 
				onComplete: this.setLocalArray.bind(this) 
				}
			); 
				
			// Stop Autocompletion listener
			AjaxCityCalling = true;  	
	
		} 		
	}
	
	/* ------------------------------- */
         
  cityAuto.prototype.setLocalArray = function(originalRequest) {  	  	 	 	

  	// Set cityArray
  	eval(originalRequest.responseText.substr(0,originalRequest.responseText.indexOf('###tag###')));
  	
  	// Stop ajax boolean
  	AjaxCityCalling = false;  
    
    // Refresh array
    this.c.options.array = cityArray;
    this.c.hasFocus = true;  
    this.c.startIndicator(); 
    this.c.showMatchingList();
    
	// Re Init Last Request                                     
	this.lastRequest = this.entry; 		  
  };
}

/* --------------------------------------------------------------- */

function arrayShellSort(arrayName,element,sortOrder) {
	var length = arrayName.length;
	var j, i, v, h=1, s=3, k;
	while(h < length)
		h=s*h+1;
	while(h > 1) {
		h=(h-1)/s;
		for (k=0; k<h; k++)
			for (i=k+h, j=i; i<length; i+=h, j=i) {
			v=arrayName[i];
			while(true)
				if (sortOrder == 'ASC'){
					if ((j-=h) >= 0 && arrayName[j][element] > v[element])
						arrayName[j+h]=arrayName[j];
					else
						break;
				} else {
					if ((j-=h) >= 0 && arrayName[j][element] < v[element])
						arrayName[j+h]=arrayName[j];
					else
						break;
				}
			arrayName[j+h]=v;
		}
	}
	return arrayName;
}
/* --------------------------------------------------------------- */

function filterTimeSelect(tripType,blockNo) {
	var period;

	var selectTimeID;
	var selectDateID;
	var nextTimeID;
	var nextDateID;
	
	if (tripType == 'Return'){
		if (blockNo == 2) {
			return;
		}
		else {		
			selectTimeID = 'l1ReturnTime';
			selectDateID = 'l1ReturnDate';		
			nextTimeID = 'r1ReturnTime';
			nextDateID = 'r1ReturnDate';
		}
	} else if (tripType == 'Multicity'){
		if (blockNo == 3) {
			return;
		}
		else {
			selectTimeID = 'l' + blockNo + 'MulticityTime';
			selectDateID = 'l' + blockNo + 'MulticityDate';
			nextTimeID = 'l' + (blockNo + 1) + 'MulticityTime';	
			nextDateID = 'l' + (blockNo + 1) + 'MulticityDate';	
		}
	} else {
		return;	
	}

	// get minimum period
	if ($(selectDateID).value != $(nextDateID).value) {
		period = 0;
	} else {
		period = getPeriodByValue($(selectTimeID).value);
		if (period == 0){
			period = getPeriodByValue($(selectTimeID).options[1].value);
		} 		
	}

	// save previous selection value
	var oldSelection = $(nextTimeID).value;
	
	// display period equals or greater than the selected one
	$(nextTimeID).options.length = 0;
	for (var i=0;i<searchTime.length;i++) {
		if ((searchTime[i][0] >= searchTime[period][0]) || i == 0){
		    var optionObject = new Option(searchTime[i][2],searchTime[i][1])
		    $(nextTimeID).options[$(nextTimeID).options.length]=optionObject				
		}
	}

	// set old selection if possible
	var sel = 0;
	if ((oldSelection.indexOf(':') > -1) && $(selectTimeID).options[$(selectTimeID).selectedIndex].value > oldSelection) {
		sel = 0;
	} else {
		for (var i=0;i<$(nextTimeID).options.length;i++) {
			if ($(nextTimeID).options[i].value == oldSelection) {
				sel = i;
				break;
			}
		}
	}
	
	$(nextTimeID).selectedIndex = sel;
	
	// If we change the 1st time, we also need to reset 2nd and 3rd
	if (tripType == 'Multicity' && blockNo == 1){
		filterTimeSelect(tripType,2);
	}
}
function getPeriodByValue(v){
	for (var i=0;i<searchTime.length;i++) {
		if (searchTime[i][1] == v) {
			return i;
			break;
		}
	}
	return 0;
}
function resetTimeSelect(tripType,blockNo) {
	setTimeout("resetTimeSelect2('" + tripType + "'," + blockNo + ")",200);
}
function resetTimeSelect2(tripType,blockNo) {
	if (blockNo == 1) {
		filterTimeSelect(tripType,1);
	}
	else if (blockNo == 2) {
		filterTimeSelect(tripType,1);
		filterTimeSelect(tripType,2);
	}
	else if (blockNo == 3) {
		filterTimeSelect(tripType,1);
		filterTimeSelect(tripType,2);
		filterTimeSelect(tripType,3);
	}
}