function toggleElementDisplay(element) {
  if( element ) {
    var currentDisplayValue = element.style.display;
    var hidden = (currentDisplayValue == 'none');
    if( hidden ) {
      if( element.previousDisplayValue ) {
        element.style.display = element.previousDisplayValue;
      } else {
        element.style.display = '';
      }
    } else {
      element.previousDisplayValue = element.style.display;
      element.style.display = 'none';
    } 
  }
}

function toggleElementDisplayById(elementId) {
  if( elementId ) {
    var element = document.getElementById(elementId);
    if( element ) {
      toggleElementDisplay( element );
    }
  }
}

function getOrdinal(wholeNumber) {
	if(wholeNumber==0) {
		return 'first';
	} else if(wholeNumber==1) {
		return 'second';
	} else if(wholeNumber==2) {
		return 'third';
	} else if(wholeNumber==3) {
		return 'fourth';
	} else if(wholeNumber==4) {
		return 'fifth';
	} else if(wholeNumber==5) {
		return 'sixth';
	} else if(wholeNumber==6) {
		return 'seventh';
	}
	return wholeNumber+" not mapped yet!";
}

function dateBefore(firstDateStr, secondDateStr) {
// Returns whether firstDateStr occurs before secondDateStr
  var l = new Date(firstDateStr).getTime();
  var r = new Date(secondDateStr).getTime();
  return (l < r);  
}

function daysBetween(date1, date2) {
    var DSTAdjust = 0;
    var oneMinute = 60000;
    var oneDay = oneMinute*60*24;
    date1.setHours(0);
    date1.setMinutes(0);
    date1.setSeconds(0,0);
    date2.setHours(0);
    date2.setMinutes(0);
    date2.setSeconds(0,0);
    if(date2 > date1){
        DSTAdjust =
            (date2.getTimezoneOffset() - date1.getTimezoneOffset())*oneMinute;
    } else {
        DSTAdjust =
            (date1.getTimezoneOffset() - date2.getTimezoneOffset())*oneMinute;
    }
    var diff = date2.getTime() - date1.getTime() - DSTAdjust;
    return Math.ceil(diff/oneDay);
}
function signedDaysBetween(date1, date2) {
    var DSTAdjust = 0;
    var oneMinute = 60000;
    var oneDay = oneMinute*60*24;
    date1.setHours(0);
    date1.setMinutes(0);
    date1.setSeconds(0);
    date2.setHours(0);
    date2.setMinutes(0);
    date2.setSeconds(0);
    DSTAdjust =
        (date2.getTimezoneOffset() - date1.getTimezoneOffset())*oneMinute;
    var diff = date2.getTime() - date1.getTime() - DSTAdjust;
    return Math.ceil(diff/oneDay);
}
function makeDate(fld) {
	var dateParts = fld.value.split('/');
	var dateObj = new Date(dateParts[0]+'/'+dateParts[1]+'/20'+dateParts[2]);
	return dateObj;
}
	
function stringToDate(str) {
// alias to support existing code
	return makeDate(str);
}
	
function checkDate(fld,displayErrors) {
	 if (checkDate.arguments.length == 1) displayErrors = true;    
	 var mo, da, yr;
    var entry = fld.value;
    var re = /\s+/;
    if(!entry || entry==''||re.test(entry)) {
        fld.value = '';
        return true;
    }
    re = /\b\d{1,2}[\/]\d{1,2}[\/]\d{2}\b/;
    if(re.test(entry)) {
        var delimChar = "/";
        var delim1 = entry.indexOf(delimChar);
        var delim2 = entry.lastIndexOf(delimChar);
        mo = parseInt(entry.substring(0, delim1), 10);
        day = parseInt(entry.substring(delim1+1, delim2), 10);
        yr = parseInt(entry.substring(delim2+1), 10)+2000;
        var testDate = new Date(yr, mo-1, day);
        if(testDate.getDate() == day) {
            if(testDate.getMonth() + 1==mo) {
                if(testDate.getFullYear() == yr) {
                    return true;
                } else {
                	if(displayErrors) alert("There is a preoblem with the year entry.");
                }
            } else {
                if(displayErrors) alert("There is a problem with the month entry.");
            }
        } else {
            if(displayErrors) alert("There is a problem with the date entry.");
        }
    } else {
        if(displayErrors) alert("Incorrect date format. Enter as mm/dd/yy.");
    }
    return false;
}

function dateToString(aDate) {
    var year = String(aDate.getFullYear());
    var month = String(aDate.getMonth() + 1);
    month = (month.length<2)?'0'+month:month;
    var day = String(aDate.getDate());
    day = (day.length<2)?'0'+day:day;

    return month + '/' + day + '/' + year.substring(2);
}

function daysToMs(numDays) {
	return numDays * 86400000;
}

function incDays(inDate, days) {
	var yy = inDate.getFullYear();
	var mm = inDate.getMonth();
	var dd = inDate.getDate();
	
	var result = new Date(yy, mm, dd, 0, 0, 0);
	var day = result.getDate() + parseInt(days);
	result.setDate(day);
	return result;
// 	return new Date(inDate.getTime() + daysToMs(days));
}

function decDays(inDate, days) {
	return incDays(inDate, -1 * days);
//	return new Date(inDate.getTime() - daysToMs(days));
}

function daysBetweenValues(val1, val2) {
	var ldate = new Date(val1);
	var rdate = new Date(val2);
	return daysBetween(ldate, rdate);		
}

function dateChanged(sender, startId, endId, nightsId) {
// Called from Start and Plan page
	var startElement = document.getElementById(startId);
	var endElement = document.getElementById(endId);
	var nightsElement = document.getElementById(nightsId);

	if ((startElement == null) || (endElement == null) || (nightsElement == null)) {			
		return;
	}

	if ((!checkDate(startElement)) || (!checkDate(endElement))) {
		return;
	}
	var startDate = stringToDate(startElement);
	var endDate = stringToDate(endElement);
	var nights;
	var MIN_TRIP_NIGHTS = 1;
	var night_error = 'Please enter a valid number of nights.';
	
	// Nights changed
	if (sender == nightsElement) {		
    	if(parseInt(nightsElement.value)<MIN_TRIP_NIGHTS) {
    		alert(night_error);        	
        	return;
        }
        else {    	
			nights = nightsElement.value;
			endElement.value = dateToString(incDays(startDate, nights));
			return;
		}
	}
	else {	// Start or end date changed		
		nights = daysBetweenValues(startElement.value, endElement.value);
		var absoluteNights = Math.abs(nights);
		
		if (absoluteNights < MIN_TRIP_NIGHTS) {
			alert(night_error);
	        return;
		}
		
		if (sender == startElement) {
			if (startDate.getTime() >= endDate.getTime()) {
				endElement.value = dateToString(incDays(startDate, nightsElement.value));
			}
			else { 
				nightsElement.value = absoluteNights;
			}
		}
		else if (sender == endElement) {
			if (endDate.getTime() <= startDate.getTime()) {
				startElement.value = dateToString(decDays(endDate, nightsElement.value));
			}
			else {
				nightsElement.value = absoluteNights;
			}
		}	
	}
}

function isInt(fld) {
    var entry = fld.value;
    var re = /\d+/;
    if(re.test(entry)) {
        return true;
    } else {
        return false;
    }
}

function replaceStyleClass(element, oldClassName, newClassName) {
    element.className = element.className.replace(new RegExp("\\b" + oldClassName + "\\b"), newClassName);
}
function removeStyleClass(element, className) {
    var arr = element.className.split(" ");
    for(var i = 0; i < arr.length; i++) {
        if( arr[i] == className ) {
            arr.splice(i, 1);
            break;
        }
    }
    element.className = arr.join(" ");
}
function appendStyleClass(element, className) {
    if( implementsStyleClass(element, className) ) {
        return;
    }
    element.className += (" " + className);
}
function implementsStyleClass(element, className) {
    var arr = element.className.split(" ");
    for(var i = 0; i < arr.length; i++) {
        if( arr[i] == className ) {
            return true;
        }
    }
    return false;
}
function undoBack(elementWindow) {
    elementWindow.history.forward();
}
function getSelectedValue(selectWidget) {
    var options = selectWidget.options;
    for(var i=0; i<options.length; ++i) {
        if(options[i].selected) {
            return options[i].value;
        }
    }
    return 0;
}
function getSelectedIndex(selectWidget) {
	var options = selectWidget.options;
	for(var i=0; i<options.length; ++i) {
		if(options[i].selected) {
			return i;
		}
	}
	return null;
}
function selectOption(selectWidget,index) {
	clearOptions(selectWidget);
	if(index && index>=0) {
		var options = selectWidget.options;
		options[index].selected = true;
	}
}
function clearOptions(selectWidget) {
	var options = selectWidget.options;
	for(var i=0; i<options.length; ++i) {
		options[i].selected=false;
	}
}
function clearPage() {
    if(document.getElementById('main')) {
        document.getElementById('main').style.display='none';
    }
}
var g_calendar;
function closeCalendar() {
    if(g_calendar) {
        g_calendar.close();
    }
}
function openCalendar(calendar) {
    g_calendar = calendar;
    calendar.popup();
}
function handlePrintCommand(commandCode) {
  var element = document.getElementById("commissionData");
  
  var showCommission = false;  
  if( element ) {
    showCommission = ! (element.style.display == 'none');
  }
  
  window.open('booking?command='+commandCode+'&show_commission='+showCommission,'printWindow',
    'width=800,height=600,resizable=yes,status=no,toolbar=no,scrollbars=yes');
}
function handleVoucherPrintCommand(bookingNumber) {
  window.open('voucher?booking='+bookingNumber,'aatMainFrame');
}
  
  function strToDate(str) {
    var dateParts = str.split('/');
    if (dateParts.length < 3) {
       return null;
    }
    
    var month = dateParts[0];
    var day = dateParts[1];
    var year = dateParts[2];
    if (year.length == 2) {
      year = '20' + year;
    }
  	var dateObj = new Date(month + '/' + day + '/' + year);
  	return dateObj;
  }

  function isToday(strDate) {
    var dateObj = strToDate(strDate);
    var today = new Date();

    if (dateObj == null) {
       return false;
    }
    /* 
    alert('Comparison: ' + dateObj.getYear() + ' ' + dateObj.getMonth() + ' ' + 
      dateObj.getDate() + ' to ' + today.getYear() + ' ' + dateObj.getMonth() + 
      ' ' + dateObj.getDate());
    */
      
    return ((dateObj.getYear() == today.getYear()) && 
        (dateObj.getMonth() == today.getMonth()) &&
        (dateObj.getDate() == today.getDate()));           
  }
  
  function isFuture(strDate) {
    var dateObj = strToDate(strDate);
    var today = new Date();
    
    if (dateObj == null) {
       return false;
    }
    
    // if date is today
    if (isToday(strDate)) { 
        return false;
    }                 
    
    // If prior
    if (dateObj.getYear() < today.getYear()) {
        return false;
    }
    
    if ((dateObj.getYear() == today.getYear()) &&
        (dateObj.getMonth() < today.getMonth())) {
        return false;
    }   
    
    if ((dateObj.getYear() == today.getYear()) &&    
        (dateObj.getMonth() == today.getMonth())) {
        return (dateObj.getDate() > today.getDate());
    }
    
    // Otherwise
    return true;
  }

var selectorsHash = new Object();
var inputsHash    = new Object();

function isUsingIE() {
	return (navigator.appName == "Microsoft Internet Explorer");
}

function SelectWrapper(selectObjId) {	
	if( ! selectObjId ) {
		return;
	}
	
	this.selectObj = document.getElementById(selectObjId);
	if( ! this.selectObj ) {
		return;
	}
	
	this.selectObj.wrapper = this;
	
	this.resetTimeout = 2000;
	this.accum = "";
	this.accumListeners = new Array();
		
	this.append = function(ch) {
		if( ch ) {
			this.accum += ch;
		}
		
		this.updateAccumListeners(); 
		this.startTimer();		
	}
	
	this.reset = function() {
		this.accum = "";
		this.updateAccumListeners(); 
	}
	
	this.resetOnSame = function(value) {
		if( this.accum == value ) {
			this.reset();
		}
	}
	
	this.startTimer = function() {
		var jscmd = "document.getElementById('" + this.selectObj.id + "').wrapper.resetOnSame('" + this.accum + "')";
		setTimeout(jscmd, this.resetTimeout);
	}
	
	this.updatePosition = function() {
		if( ! isUsingIE() ) {
			return;
		}
	
		var chars = this.accum;
		var size = this.accum.length;
		var options = this.selectObj.options;
		
		for(var i = 0; i < options.length; i++) {
			var text = options[i].text.toUpperCase();
			if( text.length >= size ) {
				if( chars == text.substr(0, size) ) {
					this.selectObj.selectedIndex = i;
					return;
				}
			}
		}
	}
	
	this.onfocus = function(evt) {
		evt = (evt) ? evt : ((window.event) ? event : null);
		if(evt) {
			var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
			if(elem) {
				elem.wrapper.onfocusvalue = elem.value;
			}
		}
	}
	this.selectObj.onfocus = this.onfocus;

	this.onblur = function(evt) {
		evt = (evt) ? evt : ((window.event) ? event : null);
		if(evt) {
			var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
			if(elem) {
				if( (elem.wrapper) && (elem.wrapper.onfocusvalue) && elem.value != elem.wrapper.onfocusvalue ) {
					elem.onchange(evt);
					delete elem.wrapper.onfocusvalue;
				}
			}
		}
	}
	this.selectObj.onblur = this.onblur;
	
	this.keypress = function(evt) {
		evt = (evt) ? evt : ((window.event) ? event : null);
		if(evt) {
			var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
			if(elem) {
				var charCode = (evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode);
				
				if( (charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122 ) || (charCode == 32) ) {
					var ch = String.fromCharCode(charCode).toUpperCase();
					this.append(ch);
					
					this.updatePosition();
									
					evt.cancelBubble = true;
					evt.returnValue = false;
				}
				
				if( charCode == 13 || charCode == 3 ) {
					elem.onchange(evt);
				}
			}
		}
	}
	if( isUsingIE() ) {
		this.selectObj.onKeyPress = this.keypress;
	}
	
	this.updateAccumListeners = function() {
		for(var i = 0; i < this.accumListeners.length; i++) {
			var func = this.accumListeners[i];
			func(this.accum);
		}
	}
	
	this.addAccumListener = function(callbackFunc) {
		var index = this.accumListeners.length++;
		this.accumListeners[index] = callbackFunc;
	}	
}

function InputCoordinator(inputElementId, selectElementId) {
	this.inputElementId = inputElementId;
	this.selectElementId = selectElementId;
	
	if( ! (this.inputElementId) ) {
		return;
	}
	
	this.input = document.getElementById(this.inputElementId);
	if( ! (this.input) ) {
		return;
	}
	
	this.getSelect = function() {
		var select = document.getElementById(this.selectElementId);
		if( (!(select)) || (!(select.tagName)) ) {
			this.input.value = "";
			this.input.disabled = true;
			this.storeCurrentLength();
			return null;
		}
		return select;
	}
	
	this.input.wrapper = this;
	
	this.setValue = function(value) {
		this.input.value = value;
		this.storeCurrentLength();
		this.updateSelect();
	}
	
	this.keypress = function(evt) {
		evt = (evt) ? evt : ((window.event) ? event : null);
		if(evt) {
			var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
			if(elem) {
				var charCode = (evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode);
				
				if( (charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122 ) ) {
					if( charCode >= 97 ) {
						evt.keyCode = charCode - 32;
					}
				}
			}
		}
	}
	this.input.onkeypress = this.keypress;	
	
	this.onLengthChange = function() {
		this.updateSelect();
	}
	
	this.storeCurrentLength = function() {
		this.input.prevLength = this.input.value.length;
	}
	this.storeCurrentLength();
	
	this.lengthHasChanged = function() {
		return ( (!(this.input.prevLength)) || (this.input.prevLength != this.input.value.length) );
	}
	
	this.onkeyup = function(evt) {
		evt = (evt) ? evt : ((window.event) ? event : null);
		if(evt) {
			var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
			if(elem) {
				var charCode = (evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode);
				
				if( elem.wrapper.lengthHasChanged() ) {
					elem.wrapper.onLengthChange();
				}
				
				elem.wrapper.storeCurrentLength();
			}
		}	
	}
	this.input.onkeyup = this.onkeyup;
	
	this.getSelectOptionValue = function() {
		var select = this.getSelect();
		if( select ) {
			var selIndex = select.selectedIndex < 0 ? 0 : select.selectedIndex;
			return select.options[selIndex].value;
		}
		return null;
	}
	
	this.updateSelect = function() {
		var select = this.getSelect();
		if( select ) {					
			this.input.value = this.input.value.toUpperCase(); // redundant -- for Netscape
			select.value = this.input.value;	
			
			var optionValue = this.getSelectOptionValue();
			if( select.value != optionValue ) {
				select.value = optionValue;
				this.input.value = optionValue;
			}
		
			this.updateOtherSelect( select );
			
			if( select.value != this.input.value || select.value.length == 0 ) { // for Netscape
				select.selectedIndex = 0;
			} 
		}
	}
	
	this.updateOtherSelect = function(select) {
		if( select ) {
			if( select.wrapper ) {
				if( select.value == this.input.value ) {
					select.wrapper.updateOtherSelect(this.input.value);
				}
			}
		}
	}
	
	this.onchange = function(evt) {
		evt = (evt) ? evt : ((window.event) ? event : null);
		if(evt) {
			var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
			if(elem) {
				elem.wrapper.updateSelect();
			}
		}
	}
	this.input.onchange = this.onchange;	
	
	this.onblur = function(evt) {
		evt = (evt) ? evt : ((window.event) ? event : null);
		if(evt) {
			var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
			if(elem) {
				var select = elem.wrapper.getSelect();
				if( select ) {
					var optionValue = elem.wrapper.getSelectOptionValue();
					if( elem.value != optionValue ) {
						elem.wrapper.setValue( optionValue );
					}
				}
			}
		}
	}
	this.input.onblur = this.onblur;
	
	this.onfocus = function(evt) {
		evt = (evt) ? evt : ((window.event) ? event : null);
		if(evt) {
			var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
			if(elem) {
				var select = elem.wrapper.getSelect();
				if( select ) {
					if( elem.value != select.value ) {
						elem.wrapper.setValue( select.value );
						elem.wrapper.updateOtherSelect( select );
					}
				}
			}
		}
	}
	this.input.onfocus = this.onfocus;
	
	this.updateAirportCode = function(code) {
		select = this.getSelect();
		if( select ) {
			if( select.value == "" ) {
				select.value = code;
				this.input.value  = code;
				this.storeCurrentLength();
			} 
		}
	}
	
	this.init = function() {
		var select = this.getSelect();
		if( select ) {
			this.input.value = select.value;
		}
	}
	this.init();
}
