////////////////////////////////////
// algo related functions

function KeyMapToIndex(key, ArrayElements) {
	var index = -1;
	for (var i=0; i<ArrayElements.length; i++) {
		if (ArrayElements[i] == key) {
			index = i;
			break;
		}
	}

	return index;
}

function ValueCompare(x, y) {
	return (x[0] - y[0]);
}

function StringCompare (x, y) {
	if (x[0] > y[0]) {
		return 1;
	} else if (x[0] == y[0]) {
		return 0;
	} else  {
		return -1;
	}
}

function ReadGetVar(name) {

	var tmp = document.URL;
	var pos = tmp.indexOf(name + '=');

	if (pos == -1) {
		return '';
	}

	tmp = tmp.substr(pos);
	pos = tmp.indexOf('=');

	tmp = tmp.substr(pos+1);
	pos = tmp.indexOf('&');

	if (pos != -1) {
		tmp = tmp.substring(0, pos);
	}

	return tmp;
}

function sprintf() {

	if (!arguments || arguments.length < 1 || !RegExp) {
		return;
	}

	var str = arguments[0];
	var re = /([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;
	var a = b = [], numSubstitutions = 0, numMatches = 0;
	
	while (a = re.exec(str)) {

		var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4];
		var pPrecision = a[5], pType = a[6], rightPart = a[7];
		
		//alert(a + '\n' + [a[0], leftpart, pPad, pJustify, pMinLength, pPrecision);

		numMatches++;
		if (pType == '%') {
			subst = '%';
		} else {

			numSubstitutions++;
			if (numSubstitutions >= arguments.length) {
				alert('sprintf err ' + (arguments.length - 1) + ' - ' + numSubstitutions);
			}

			var param = arguments[numSubstitutions];
			var pad = '';
			
			if (pPad && pPad.substr(0,1) == "'") pad = leftpart.substr(1,1);
			else if (pPad) pad = pPad;
			
			var justifyRight = true;
			if (pJustify && pJustify === "-") justifyRight = false;
			var minLength = -1;
			if (pMinLength) minLength = parseInt(pMinLength);
			var precision = -1;
			if (pPrecision && pType == 'f') precision = parseInt(pPrecision.substring(1));
			var subst = param;
			if (pType == 'b') subst = parseInt(param).toString(2);
			else if (pType == 'c') subst = String.fromCharCode(parseInt(param));
			else if (pType == 'd') subst = parseInt(param) ? parseInt(param) : 0;
			else if (pType == 'u') subst = Math.abs(param);
			else if (pType == 'f') subst = (precision > -1) ? Math.round(parseFloat(param) * Math.pow(10, precision)) / Math.pow(10, precision): parseFloat(param);
			else if (pType == 'o') subst = parseInt(param).toString(8);
			else if (pType == 's') subst = param;
			else if (pType == 'x') subst = ('' + parseInt(param).toString(16)).toLowerCase();
			else if (pType == 'X') subst = ('' + parseInt(param).toString(16)).toUpperCase();
		}
		str = leftpart + subst + rightPart;
	}
	return str;
}

function ReadCookie(name) { 
	var CookieValue = '';
	var search = name + '=';
	if(document.cookie.length > 0) { 
		offset = document.cookie.indexOf(search); 
		if (offset != -1) { 
			offset += search.length; 
			end = document.cookie.indexOf(';', offset); 
			if (end == -1) {
				end = document.cookie.length;
			} 
			CookieValue = decodeURIComponent(document.cookie.substring(offset, end));
		} 
	} 

	return CookieValue;
} 

function SetCookie(name, value) { 
	var cookie_str = name + "=" + escape(value);
	var now = new Date();
	var exp = new Date(now.getYear(), now.getMonth()+1, now.getDate());
	if (navigator.userAgent.indexOf('IE') != -1) {
		cookie_str += "; expires=" + exp.toGMTString();
	}
	cookie_str += "; path=/";
	document.cookie = cookie_str;
}

function CheckRef() {
	var ref = ReadGetVar('ref');
	if (ref != '') {
		SetCookie('ref', ref);
	}
}

function implode(com, arr) {
	var str;
	if (arr.length) {
		str = arr[0];
	}
	for (var i=1; i<arr.length; ++i) {
		str += com + arr[i];
	}
	return str;
}

function AssociativeArrayCopy(arr) {
	var result = [];
	var i;
	for (i in arr) {
		result[i] = arr[i];
	}
	return result;
}

function ComputeDateDiff(date1, date2) {

	var strDateArray1 = date1.split("-");
	var strDate1 = new Date(strDateArray1[0], parseInt(strDateArray1[1], 10) - 1, parseInt(strDateArray1[2], 10));

	var strDateArray2 = date2.split("-");
	var strDate2 = new Date(strDateArray2[0], parseInt(strDateArray2[1], 10) - 1, parseInt(strDateArray2[2], 10));
	
	var intDay = (strDate1-strDate2)/(1000*3600*24);
	
	return intDay;
}

function ComputeFutureDate(date, diff) {

	date = date.split("-");
	date = new Date(date[0], parseInt(date[1], 10) - 1, parseInt(date[2], 10));
	var rdate = new Date(date.getTime() + 86400000 * diff);
	
	return ConvertToTextualDate(rdate);
}

function openWindow(URL, width, height) {
	var window_top = (screen.availHeight/2)-(height/2);
	var window_left = (screen.availWidth/2)-(width/2);
	var param = "menubar=no,toolbar=no,location=no,directories=no,status=no,resizable=no,scrollbars=yes,width="+width+",height="+height+",top="+window_top+",left="+window_left;
	window.open(URL,'',param);
}

function CheckRadioElement(radios) {
	if (radios.length == undefined) {
		if (radios.checked) {
			return true;
		} else {
			return false;
		}
	}
	var numradios = radios.length;
	for (var i = 0; i < numradios; i++) {
		if (radios[i].checked) {
			return true;
		}
	}
	return false;
}

function GetRadioElement(radios) {

	if (radios.length == undefined) {
		return radios.value;
	}

	var numradios = radios.length;
	for (var i=0; i<numradios; i++) {
		if (radios[i].checked) {
			return radios[i].value;
		}
	}
}

function GetEleAbsolutePos(el) {
	var r = { x: el.offsetLeft, y: el.offsetTop };
	if (el.offsetParent) {
		var tmp = GetEleAbsolutePos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
}

function FormatDate(control, ddate) {
	var date = control.value;
	if (date.search('^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$') != -1) {
		date = date.split('-');
		date = date[0] + '-' + ((date[1].length == 1) ? '0'+date[1] : date[1]) + '-' + ((date[2].length == 1) ? '0'+date[2] : date[2]);
	} else {
		date = ddate;
	}
	control.value = date;
}

function CheckDate(year, mon, day) {
switch (mon) {
	case 1: case 3: case 5: case 7: case 8: case 10: case 12:
	if (day > 31) {return false;}
	break;
	case 4: case 6: case 9: case 11:
	if (day > 30) {return false;} 
	break;
	case 2:
	if ((year % 100 == 0) && (year % 400 == 0)) {
		if (day > 29) {return false;}
	} else {
		if (day > 28) {return false;}
	}
	break;
	default:
	return false;
}
return true;
}

function ConvertToPrintableDate(sdate) {
	var t;
	var mon = parseInt(sdate.substring(2, 4), 10);
	switch (mon) {
		case 1: t = "Jan"; break;
		case 2: t = "Feb"; break;
		case 3: t = "Mar"; break;
		case 4: t = "Apr"; break;
		case 5: t = "May"; break;
		case 6: t = "Jun"; break;
		case 7: t = "Jul"; break;
		case 8: t = "Aug"; break;
		case 9: t = "Sep"; break;
		case 10: t = "Oct"; break;
		case 11: t = "Nov"; break;
		case 12: t = "Dec"; break;
	}

	return sprintf("%s %d, %d", t, parseInt(sdate.substring(4), 10), parseInt('20'+sdate.substring(0, 2), 10));
}

function ConvertToTextualDate(date) {

	var year = date.getFullYear();
	var mon = date.getMonth() + 1;
	var day = date.getDate();

	mon = (mon < 10) ? ("0" + mon) : mon;
	day = (day < 10) ? ("0" + day) : day;

	return year + "-" + mon + "-" + day;
}

function ConvertToSimpleDate(sdate) {
	var sdates = sdate.split("-");
	return sdates[0].substring(2) + sdates[1] + sdates[2];
}

function IsDateInPeriods(date, periods) {
	var period;
	for (var i=0; i<periods.length; ++i) {
		period = periods[i];
		if (period.length == 1) {
			if (period[0] == date) {
				return true;
			}
		} else {
			if (period[0] <= date && date <= period[1]) {
				return true;
			}
		}
	}

	return false;
}

var GL_Images = [];
function DisplayImages () {
	for (var i in GL_Images) {
		for (var loop=0; loop<GL_Images[i][1]; ++loop) {
			document.getElementById(i + "_" + loop).src = GL_Images[i][2].src;
		}
	}
	GL_Images = [];
}

// ajax function
var GL_HTTP_REQUEST = false;
function send_request(url, data, proc){

	// IE Browser
	try{
		GL_HTTP_REQUEST = new ActiveXObject("Msxml2.XMLHTTP");
	} catch(e){
		try{
			GL_HTTP_REQUEST = new ActiveXObject("Microsoft.XMLHTTP");
		} catch(e1){
			GL_HTTP_REQUEST = new XMLHttpRequest();
		}
	}

	if(!GL_HTTP_REQUEST){
		alert = "Cannot create XMLHttpRequest Instance!"
	}

	GL_HTTP_REQUEST.onreadystatechange=proc;
	if (data == '') {
		GL_HTTP_REQUEST.open("GET",url,true);
		GL_HTTP_REQUEST.send(null);
	} else {
		GL_HTTP_REQUEST.open("POST",url,true);
		GL_HTTP_REQUEST.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		GL_HTTP_REQUEST.send(data);
	}
}

function ShowCalendar(id, Container, Element, property, text, div, update) {
	
	var c = document.getElementById(Container);

	if (CurCalendarPtr != undefined) {
		CurCalendarPtr.hide();
	}

	CurAssociatedTextbox = text;
	CurAssociatedDiv = div;
	CurAssociatedUpdate = update;

	CurCalendarPtr = new YAHOO.widget.CalendarGroup(id, Container, property);

	var CurDate = document.getElementById(text).value;
	if(CurDate != '') {
		var tmp = CurDate.substr(5, 2) + "/" + CurDate.substr(8, 2) + "/" + CurDate.substr(0, 4);
		CurCalendarPtr.select(tmp);
		var firstDate = CurCalendarPtr.getSelectedDates()[0];
		
		// Set the Calendar's page to the earliest selected date
		CurCalendarPtr.cfg.setProperty("pagedate", (firstDate.getMonth()+1) + "/" + firstDate.getFullYear()); 
		// set min max date
		CurCalendarPtr.cfg.setProperty("mindate", GL_DEPART_DATE.substr(5, 2) + "/" + GL_DEPART_DATE.substr(8, 2) + "/" + GL_DEPART_DATE.substr(0, 4)); 
		CurCalendarPtr.cfg.setProperty("maxdate", GL_MAX_DATE.substr(5, 2) + "/" + GL_MAX_DATE.substr(8, 2) + "/" + GL_MAX_DATE.substr(0, 4)); 
	}

	CurCalendarPtr.render();
	CurCalendarPtr.selectEvent.subscribe(HandleCalendarSelect, CurCalendarPtr, true);

	var el = document.getElementById(Element);
	var p = GetEleAbsolutePos(el);
	
	CurCalendarPtr.show();

	c.style.left = (p.x - c.offsetWidth / 2) + "px";
	c.style.top = (p.y + el.offsetHeight) + "px";
}

function HandleCalendarSelect(type,args,obj) {
	
	var dates = args[0];
	var date = dates[0];
	var year = date[0], month = date[1], day = date[2];

	var txtDate = document.getElementById(CurAssociatedTextbox);
	var mon = parseInt(month, 10);
	mon = (mon < 10) ? ("0" + mon) : mon;
	var day = parseInt(day, 10);
	day = (day < 10) ? ("0" + day) : day;
	txtDate.value = year + "-" + mon + "-" + day;

	if (CurAssociatedDiv != '') {
		var DivDate = document.getElementById(CurAssociatedDiv);
		DivDate.innerHTML = txtDate.value;
	}

	if (CurAssociatedUpdate != '') {
		UpdateReturnDate(CurAssociatedTextbox, CurAssociatedUpdate);
	}

	CurCalendarPtr.hide();
}

function UpdateReturnDate(CurAssociated, CurAssociatedUpdate) {
	
	var date = document.getElementById(CurAssociated).value
	var rdate = ComputeFutureDate(date, 6);
	document.getElementById(CurAssociatedUpdate).value = rdate;
}


function ParseForCity(city) {

	city = city.toUpperCase();
	
	// check for ()
	var pos = city.indexOf('(');
	if (pos != -1) {
		city = city.substr(pos+1, 3);
	}
	
	// check for city code
	if (city.length == 3) {
		for (var i=0; i<GL_CITY_CODE.length; ++i) {
			if (GL_CITY_CODE[i] == city) {
				return i;
			}
		}
	}

	// use for city name
	for (var i=0; i<GL_CITY.length; ++i) {
		for (var j=0; j<GL_CITY[i][0].length; ++j) {
			if (GL_CITY[i][0][j].toUpperCase() == city) {
				return i;
			}
		}
	}

	return -1;
}

var ACJSFunction = function(){

	var oACDS;
	var oAutoComp;

	return {

		init: function(sType, aArgs) {

			// Instantiate JS Function DataSource
			oACDS = new YAHOO.widget.DS_JSFunction(ACJSFunction.GetCities);
			oACDS.maxCacheEntries = 0;

			// Instantiate AutoComplete
			oAutoComp = new YAHOO.widget.AutoComplete(aArgs.one, aArgs.two, oACDS);
			//oAutoComp = new YAHOO.widget.AutoComplete('user_src_city', 'src_city_container', oACDS);
			oAutoComp.prehighlightClassName = "yui-ac-prehighlight";
			oAutoComp.useIFrame = true;
			oAutoComp.queryDelay = 0;
			oAutoComp.minQueryLength = 1;
			oAutoComp.maxResultsDisplayed = 10;
			oAutoComp.formatResult = function(oResultItem, sQuery) {
				var sMarkup = oResultItem[0];
				return (sMarkup);
			};

			// Subscribe to Custom Events
			oAutoComp.dataReturnEvent.subscribe(ACJSFunction.myOnDataReturn);

			// Set initial content in the container
			oAutoComp.sendQuery("");
		},

		// Define Custom Event handlers
		myOnDataReturn: function(sType, aArgs) {

			var oAutoComp = aArgs[0];
			var sQuery = aArgs[1];
			var aResults = aArgs[2];
		},

		GetCities: function(sQuery) {

			var aResults = [];
			var str, length;

			sQuery = decodeURI(sQuery);

			if (sQuery && sQuery.length > 0) {

				length = sQuery.length;
				sQuery = sQuery.toUpperCase();
				
				for (var i = GL_CITY.length - 1; i >= 0; i--) {
					for (var j=0; j<GL_CITY[i][0].length; j++) {
						
						if (GL_CITY[i][0][j].length < length) {
							continue;
						}

						str = GL_CITY[i][0][j].substr(0, length);
						str = str.toUpperCase();

						if (str == sQuery) {
							aResults.unshift([GL_CITY[i][0][0] + ', ' + GL_COUNTRY[KeyMapToIndex(GL_CITY[i][2], GL_COUNTRY_CODE)] + ' (' + GL_CITY_CODE[i] + ')', '']);
							break;
						}
					}
				}
				return aResults;
			}
		}
	};
}();


function WriteHeader() {

	var cookie = ReadCookie('UID');
	var str = "<table width='756' height='23' cellpadding='0' cellspacing='0'><tr style='font-weight:bold;color: #2a62b5'>";
	str += "<td width='15'>&nbsp;</td>";
	
	if (cookie != '') {
		str += "<td width='18'><img src='/icon/icon_signup.gif'></td>";
		str += "<td width='154'>Welcome, " + cookie + "</td>";
		str += "<td width='419'>&nbsp;</td>";
		str += "<td width='85'><a href='/en/home.dll' class='header'>My Fetrip</a></td>";
		str += "<td width='14'> | </td>";
		str += "<td width='66'><a href='/en/logout.dll' class='header'>Log Out</a></td>";
	} else {
		str += "<td width='18'><img src='/icon/icon_signin.gif'></td>";
		str += "<td width='54'><a href='/en/login.dll' class='header'>Sign In</a></td>";
		str += "<td width='18'><img src='/icon/icon_signup.gif'></td>";
		str += "<td width='57'><a href='/en/register.html' class='header'>Sign Up</a></td>";
		str += "<td width='419'>&nbsp;</td>";
		str += "<td width='85'><a href='/en/login.dll' class='header'>My Fetrip</a></td>";
		str += "<td width='14'> | </td>";
		str += "<td width='66'>Log Out</td>";
	}

	str += "</tr></table>";
	document.write(str);
}


