var InvalidDate	= new Date(1900,0,1);
var InvalidTime   = 9999;

// return true if valid date
function ValidDate(yy,mm,dd)
{
	var start_dt = new Date(yy,mm-1,dd);
	// Check if valid day for month 
	var validDate = (start_dt.getDate() == dd && dd != 0 && mm != 0 && yy != 0);
	return validDate;
}

// Convert date variable to yyyymmdd string format
function DateToStr(dt)
{
	var yy,mm,dd;
	yy = "" + dt.getFullYear();
	mm = "" + (dt.getMonth()+1);
	if (mm.length < 2)
		mm = "0" + mm;			
	dd = "" + dt.getDate();
	if (dd.length < 2)
		dd = "0" + dd;
	s = yy + mm + dd;
	return s;
}

// convert yyyymmdd string format to date variable
function StrToDate(s)
{
	var dt;
	if (s.length == 8) {
		var yy = parseInt(s.substr(0,4),10);
		var mm = parseInt(s.substr(4,2),10);
		var dd = parseInt(s.substr(6,2),10);
		dt = new Date(yy, mm-1, dd);
	}	
	else
		dt = InvalidDate;	// Invalid
	return dt 
}

// Format time string (e.x 23:15) from integer that represent time in g2
// format12 - if 1 use 12 hours format (24:00 --> 12:00) but without "AM" or "PM"
function TimeToStr(time_as_num,format12)
{
	var hours,minutes,rc;
	hours = time_as_num / 100;
	minutes = time_as_num % 100;
	if (format12==1) {
		if ((hours % 12)==0)
			hours=12;
		else
			hours=hours % 12;
	}
	if (hours >= 0 && hours <= 23 && minutes >= 0 && minutes <= 59) {
	    hours=""+hours;
		minutes=""+minutes;
		if (hours.length < 2) hours="0" + hours;
		if (minutes.length < 2) minutes="0" + minutes;
		rc=hours & ":" & minutes;
	}
	else
		rc="--:--";
	return rc;
}

//' Convert time string (e.x 23:15) to integer that represent time in g2
function StrToTime(strTime)
{
	var hours,minutes,rc
	rc = InvalidTime;
	if (strTime.indexOf(":") == 2) {
		hours = strTime.substr(0,2);
		minutes= strTime.substr(3,2);
		hours = parseInt(hours,10);
		minutes  = parseInt(minutes,10);
		if (hours <= 23 && hours >= 0 && minutes <= 59 && minutes >= 0)
			rc = hours*100 + minutes;
	}
	return rc;
}

// convert yyyymmddhhmm string format to date variable
function StrToDateTime(s)
{
	var dt;
	if (s.length >= 8) {
		var yy = parseInt(s.substr(0,4),10);
		var mm = parseInt(s.substr(4,2),10);
		var dd = parseInt(s.substr(6,2),10);
		var h = 0, m = 0;
		if (s.length == 12) {
			h = parseInt(s.substr(8,2),10);
			m = parseInt(s.substr(10,2),10);
		}
		dt = new Date(yy, mm-1, dd, h, m, 0);
	}	
	else
		dt = InvalidDate;	// Invalid
	return dt 
}

// Convert date variable to dd-mmm-yy string format
function FormatDate(dt)
{
	var mn = new Array();
	if (dt != InvalidDate) {
		mn[0] = "Jan";
		mn[1] = "Feb";
		mn[2] = "Mar";
		mn[3] = "Apr";
		mn[4] = "May";
		mn[5] = "Jun";
		mn[6] = "Jul";
		mn[7] = "Aug";
		mn[8] = "Sep";
		mn[9] = "Oct";
		mn[10] = "Nov";
		mn[11] = "Dec";
		var dd = dt.getDate();
		if (dd < 10) dd = "0" + dd;
		var yy = dt.getFullYear()%100;
		if (yy < 10) yy = "0" + yy;
		rc = dd + "-" + mn[dt.getMonth()] + "-" + yy;
	}	
	else
		rc = "";
	return rc;
}

// take day and month and return year for month+day comboboxes (no year combo)
function CalcYearByMonthDay(year,month,day)
{
	var now=new Date();
	if ( ((now.getMonth()+1 > month) || (now.getMonth()+1 == month && now.getDate() > day)) && now.getFullYear() >= year )
	{
		year=now.getFullYear();
		year+=1;
	}	
	return year;
}

// Construct string YYYYMMDD from day,month,year - used with date comboboxes
function DatePartsToStr(yyVal,mmVal,ddVal)
{
	var dd,mm,yy;
	yy = "" + (yyVal);
	mm = "" + (mmVal);
	if (mm.length < 2)
		mm = "0" + mm;			
	dd = "" + (ddVal);
	if (dd.length < 2)
		dd = "0" + dd;			
	return (yy + mm + dd);
}

// Get value from form control (array or not)
function GetValue(field, i)
{
	var rc;
	if (field.length)
		rc = field[i].value;
	else	
		rc = field.value;
	return rc;
}

function GetSelectText(field, i, field2)
{
	var rc;
	if (field2.length)
		rc = field[i].item(field[i].selectedIndex).text;
	else	
		rc = field.item(field.selectedIndex).text;
	return rc;
}
// Set value in form control (array or not)
function SetValue(field, i, val)
{
	if (field.length)
		field[i].value = val;
	else	
		field.value = val;
}

// Get attribue of object
function GetAttr(obj, attrName)
{
	var rc = "";
	rc = eval("obj." + attrName);
	
	if (typeof(rc) == "undefined")
		rc = "";
	return rc;
}

// Set attribue of object
function SetAttr(obj, attrName, val)
{
	eval("obj." + attrName + "='" + val + "'");
}

function GetChecked(field, i)
{
	var rc;
	if (field.length)
		rc = field[i].checked;
	else	
		rc = field.checked;
	return rc;
}

function GetCheckIndex(obj)
{
	var rc = -1;
	if (obj == null) 
		return rc;
		
	if (obj.length) {
		for (var i = 0; i < obj.length; i++) {
			if (obj[i].checked) {
				rc = i;
				break;
			}
		}
	}
	else if (obj.checked)
		rc = 0;
	return rc;
}

function GetFieldIndex(field, val)
{
	var rc = -1;
	if (field.length) {
		for (var i = 0; i < field.length; i++) {
			if (field[i].value == val)
				return i;
		}
	}
	else if (field.value == val)
		rc = 0;
	return rc;
}

// Get value in form HTML tag (array or not)
function GetInnerHTML(field, i)
{
	var rc;
	if (field.length)
		rc = field[i].innerHTML;
	else	
		rc = field.innerHTML;
	return rc;
}

// Set value in HTML tag (array or not)
function SetInnerHTML(field, i, val)
{
	if (field.length)
		field[i].innerHTML = val;
	else	
		field.innerHTML = val;
}

function FormatAmt(num)
{
	if (num == 0)
		return "0.00";
	var negative = (num < 0);		
	if (negative)
		num = -num;		
	num /= 100;
	s = num.toString();
	var pos = s.lastIndexOf(".");
	if (pos == -1) {
		s += ".00";
		pos = s.lastIndexOf(".");
	}	
	if (s.length - pos < 3)
		s += "0";
	pos -= 3;
	while (pos > 0) {
		s = s.substring(0, pos) + "," + s.substring(pos, s.length);
		pos -= 3;
	}
	if (negative)
		s = "-" + s;
	return s;
}

function GetAmountStr(amt)
{
	var s = amt.toString();
	var pos = s.lastIndexOf(".");
	if (pos == -1) 
		s += ".00";
	else {
		while (s.length - pos < 3)
			s += "0";
		if (s.length - pos > 3)
			s = s.substr(0, pos+3);
	}
	return s;
}

function GetAmountCurrStr(amt,curr,currLeft)
{
	var s = "";
	var currStr = curr.toLowerCase();
	if( currStr == "usd" )
		s =	"$";
	else if( currStr == "eur" )
		s =	"&#128;";
	else if( currStr == "jpy" )
		s =	"&#165;";
	else if( currStr == "gbp" )
		s =	"&#163;";
	else if( currStr == "nis" )
		s =	"&#8362;";	
	//Check if need to add the currency name
	if( s.length > 0 )
		s = s + GetAmountStr(amt);
	else
		if (currLeft)
			s = curr + " " + GetAmountStr(amt);
		else
			s = GetAmountStr(amt) + " " + curr;
	if(curr=="AUD")
		s = "$" + s
	return s;
}

function IsNumber(val)
{
	foundDot = false;
	for (i = 0; i < val.length; i++) {
		if (val.charAt(i) != '.')
		{
			if (val.charAt(i) < "0") {
				return false;
			}
			if (val.charAt(i) > "9") {
				return false;
			}	
		}
		else
		{
			if (foundDot) 
				return false;
			foundDot = true;	
		}	
	}		
	return true;
}

function IsValidDate(dt)
{
	return dt != InvalidDate;
}

//  Calculate extra days/nights for a service
function ExtraDays(servType, startTime, endTime, startDate, endDate)
{
	var rc = 0;
	switch (servType) {
		// Always add one day, as dates are inclusive in insurance
		case IDS_SERVTYPE_INSURANCE 	:
		case IDS_SERVTYPE_GENERAL		:
			rc++; break;

		// Add a day, if last day is more than 24 hours
		case IDS_SERVTYPE_TOUR			:
		case IDS_SERVTYPE_TOUR_FIT		:
		case IDS_SERVTYPE_CRUISE		:
		case IDS_SERVTYPE_VISAPASS		:
		case IDS_SERVTYPE_GUIDE			:
		case IDS_SERVTYPE_RESTAURANT	:
		case IDS_SERVTYPE_CURRCHANGE	:
		case IDS_SERVTYPE_EFEE			:
		case IDS_SERVTYPE_EFEE_TICKET	:
		case IDS_SERVTYPE_CARRNT		:
		case IDS_SERVTYPE_TRANSFER   	:
			if (endTime > startTime)
				rc++;
			else {
				if (servType == IDS_SERVTYPE_TRANSFER)
					if (IsValidDate(startDate) && endDate == startDate && (startTime==9999 || endTime==9999))
						rc++;
			}
			break;

		// Add a day for day-use
		case  IDS_SERVTYPE_HOTEL		:
		case  IDS_SERVTYPE_PCKG			:
			if ( (endDate == startDate) && (endTime > startTime) )
				rc++;
			break;
	}
	return rc;
}

// SoftWeek for listbox/combobox
var keybdBuf = "";
var keybdTick = 0;
var keybdElementName = "";
function onSelectKeyPress()
{
	var now = new Date();
	if (now.valueOf() > keybdTick.valueOf()+1500 || window.event.srcElement.name != keybdElementName)
		keybdBuf = "";		
	keybdTick = now;		
	keybdElementName = window.event.srcElement.name;
	var keyCode = parseInt(window.event.keyCode,10);
	keybdBuf += MakeUpper(String.fromCharCode(keyCode));
	var index = -1, s;
	for (var i = 0; i < window.event.srcElement.length; i++) {
		s = MakeUpper(window.event.srcElement.item(i).text);
		s = s.substr(0, keybdBuf.length);
		if (s == keybdBuf) {
			index = i;
			break;
		}
	}
	if (index != -1) {
		window.event.srcElement.selectedIndex = index;
		window.event.returnValue = false;
		if (window.event.srcElement.onchange)
			window.event.srcElement.onchange();
	}	
	return false;
}

function onSortSelectKeyPress(firstIndex)
{
	var now = new Date();
	if (now.valueOf() > keybdTick.valueOf()+1500 || window.event.srcElement.name != keybdElementName)
		keybdBuf = "";		
	keybdTick = now;		
	keybdElementName = window.event.srcElement.name;
	var keyCode = parseInt(window.event.keyCode,10);
	keybdBuf += MakeUpper(String.fromCharCode(keyCode));
	var index = -1, s;
	var lower = firstIndex;
    var upper = window.event.srcElement.length-1;
    var middle;
    while (lower <= upper) {
        middle = parseInt((lower+upper)/2,10);
		s = MakeUpper(window.event.srcElement.item(middle).text);
		s = s.substr(0, keybdBuf.length);
        if (s == keybdBuf) {
			index = middle;
            break;
        }
		else if (s < keybdBuf)
            lower = middle+1;
        else
            upper = middle-1;
	}
	if (index != -1) {
		// Find the first occurance of key, in case of duplicate keys
		var prevIndex = index;
		index--;
		while (index >= firstIndex) {
			s = MakeUpper(window.event.srcElement.item(index).text);
			s = s.substr(0, keybdBuf.length);
			if (s == keybdBuf) {
				prevIndex = index;
				index--;
			}
			else
				break;
		}
		index = prevIndex;
		window.event.srcElement.selectedIndex = index;
		window.event.returnValue = false;
		if (window.event.srcElement.onchange)
			window.event.srcElement.onchange();
	}	
	return false;
}

function MakeUpper(s)
{
	var outStr, c;
	outStr = "";
	for (var i = 0; i < s.length; i++) {
		c = s.charCodeAt(i);
		if (c >= 97 && c <= 122)
			c -= 32;
		outStr += String.fromCharCode(c);
	}
	return outStr;
}

function Trim(text)
{
	for(var j=0;j<text.length && text.charAt(j)==' ';j++);
	text = text.substr(j);
	for(j=text.length-1;j>=0 && text.charAt(j)==' ';j--);
	text1 = text.substr(0,j+1);
	return text1;
} 

function GetServType(servTypeIds)
{
	var serv;
	switch(servTypeIds) {
		case IDS_SERVTYPE_FLIGHT:	serv="FLIGHT";	break;
		case IDS_SERVTYPE_HOTEL	:	serv="HOTEL";	break;
		case IDS_SERVTYPE_CARRNT:	serv="CAR";		break;
		case IDS_SERVTYPE_INSURANCE:serv="INSURANCE"; break;
		case IDS_SERVTYPE_VISAPASS: serv="VISA";	break;
		case IDS_SERVTYPE_TRANSFER: serv="TRANSPORT"; break;
		case IDS_SERVTYPE_CRUISE:   serv="CRUISE";	break;
		case IDS_SERVTYPE_TRAIN:	serv="TRAIN"; break;
		case IDS_SERVTYPE_CURRCHANGE:serv="CURRENCY"; break;
		case IDS_SERVTYPE_TOUR:		serv="TOUR"; break;
		case IDS_SERVTYPE_PCKG:		serv="PACKAGE"; break;
		case IDS_SERVTYPE_EFEE:		serv="E_FEE"; break;
		case IDS_SERVTYPE_RESTAURANT:serv="RESTAURANT"; break;
		case IDS_SERVTYPE_FERRY:	serv="FERRY"; break;
		case IDS_SERVTYPE_GUIDE:	serv="GUIDE"; break;
		case IDS_SERVTYPE_GENERAL:	serv="GENERAL"; break;
		case IDS_SERVTYPE_VACATION:	serv="VACATION"; break;
		case IDS_SERVTYPE_EFEE_TICKET:	serv="TICKET"; break;
		case IDS_SERVTYPE_TOUR_FIT:	serv="TOUR_FIT"; break;
		case IDS_SERVTYPE_TRANSFER_ALLOC:	serv="TRANSPORT_ALLOC"; break;
        case IDS_SERVTYPE_RESTAURANT_ALLOC: serv="RESTAURANT_ALLOC"; break;
	}	
	return serv;
}

function InStr(str1, str2)
{
	for (var i = 0; i < str1.length; i++)
		if (str1.substr(i, str2.length) == str2)
			return i;
	return -1;
} 

function IsEmpty(fld)
{
	return (!fld || fld.value == "");
}

// Set OnChange event on combox
function SetOnChange(divname, comboFldName, func)
{
	var s;
		
	try {
		s = eval(divname+comboFldName+".innerHTML");
	}
	catch (e) {
		return;	
	}
	var arr = s.split(";");
	var ctrlName;
	for (var i = 0; i < arr.length; i++) {
		ctrlName = "form." + comboFldName + "_" + arr[i];
		eval(ctrlName + ".onchange = func");
	}
}

function RemoveTrailingZeros(theNumber)
{
	var charsAfterDelimeter, charsBeforeDelimeter;
	var decimalPointPos = theNumber.indexOf(".",0);
	if (decimalPointPos >= 0) {
		charsAfterDelimeter		=	theNumber.substr(decimalPointPos+1,2)
		charsBeforeDelimeter	=	theNumber.substr(0,decimalPointPos);
		if (parseInt(charsAfterDelimeter,10) == 0)
			return charsBeforeDelimeter;
	}
	return theNumber;
}

//Find the X position of an obj relative to the page beginning
function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

//Find the Y position of an obj relative to the page beginning
function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

// Query string functions 
var queryStringKeys, queryStringValues;

//Get the value of a query parameter by its key. If that key doesn't exists the function will return NULL 
//This function should be called after calling the QueryString_Parse() function!
function QueryString(key)
{
	var value = null;
	
	for (var i=0;i < queryStringKeys.length;i++)
	{
		if (queryStringKeys[i]==key)
		{
			value = queryStringValues[i];
			break;
		}
	}	
	return value;
}
	  
//Function to init the query string parameters. Call this function once before using the QueryString() function
function QueryString_Parse()
{	
	queryStringKeys = new Array();	
	queryStringValues = new Array();
	
	var query = window.location.search.substring(1);
	var pairs = query.split("&");
	
	for (var i=0; i < pairs.length; i++)
	{
		var pos = pairs[i].indexOf('=');
		if (pos >= 0)
		{
			var argname = pairs[i].substring(0,pos);
			var value = pairs[i].substring(pos+1);
			queryStringKeys[queryStringKeys.length] = argname;
			queryStringValues[queryStringValues.length] = value;	
		}
	}
}

function FillUpToNumDays(selNum, count)
{
	for(i=1 ; i<= count; i++)
	{
		document.write("<OPTION VALUE="+i);
		if (i == selNum)
			document.write(" SELECTED");
		document.write(">" + i);	
	}				 
}

function DispAvailHeader(size, y, m, d)
{	
	var monthName = new Array(13);
	eval(monthNames);
//	if (m == 12)
		var dt = new Date(y, m-1, d);
//	else
//		var dt = new Date(y, m, d);
	for(i=0 ; i<=size; i++)
	{
		document.write("<TD align='center' style='background-color:gainsboro;' nowrap class='HtlSubTtl'>");
		if (dt.getDate() < 10)
			document.write("0");

		document.write(dt.getDate());
	//	if (m == 12)
			document.write(monthName[dt.getMonth()+1].substr(0,3));
	//	else
	//		document.write(monthName[dt.getMonth()].substr(0,3));
		
		document.write("</TD>");
		dt.setDate(dt.getDate()+1);
	}	
}
	
	
//if the user clicks the X on the top right corner of the Browser window in order to close
//it, a popup will be created.

function showExitPopUp(popUrl)
{
    showExitPopUp(popUrl, false);
}
	
function showExitPopUp(popUrl, forceOpen)
{    
	if (forceOpen || (window.event.clientX < 0 && window.event.clientY < 0))
	{	
		window.open(popUrl,'ptpwin','width=402,height=620,toolbar=no,menubar=no,location=no, directories=no,status=no,scrollbar=no,resize=no');
	}
}

function pause(numberMillis) 
{
    var now = new Date();
    var end = now.getTime() + numberMillis;
    while (true) {
        now = new Date();
        if (now.getTime() > end)
            return;
    }
}

function Left(str, n){
	if (n <= 0)
	    return "";
	else if (n > String(str).length)
	    return str;
	else
	    return String(str).substring(0,n);
}

function Right(str, n){
    if (n <= 0)
       return "";
    else if (n > String(str).length)
       return str;
    else {
       var iLen = String(str).length;
       return String(str).substring(iLen, iLen - n);
    }
}

function UpdateDateEdit(dyFld,mnFld,yrFld,edit,inputIdx,inputDir,timeLimit)
{
	if (dyFld == null || mnFld == null || yrFld == null || edit == null)
		return;
	edit.value = dyFld.value+ "/" + mnFld.value + "/" + yrFld.value;	
	if (inputIdx!=""){
		updateInputDates(inputIdx,inputDir,timeLimit)
	}
}

function tabNext(idx, length,thisId,nextId)
{
	try
	{
		var thisObj = document.getElementById(thisId);
		var nextObj = document.getElementById(nextId);
		if(window.event.keyCode == 16){
			thisObj.focus();
			thisObj.select();
		}
		else if(window.event.keyCode != 16 && window.event.keyCode != 9){
			var skip = false;
			if (thisObj)
				skip = (thisObj.value.length == length);
			if (nextObj && skip){
				nextObj.focus();
				if(nextId!="fltStat"+idx)
					nextObj.select();
			}
		}
	}
	catch(e){}	
}
function OpenCityWindow(cityFldname) 
{
    if (window.event.srcElement.disabled)
        return;
	var url = "CitySelect.asp?cityFld=" + cityFldname + "&servType=FLIGHT";
	var winOptions = "width=240,height=280,toolbar=no,location=no,directories=no,status=no,menubar=no,resizable=yes,copyhistory=yes";
	var wnd = window.open(url,"",winOptions);
	window.event.returnValue = false;
}

function PrintStatusCombo(id)
{
	document.write("<SELECT class='ComboBoxes' name='status' ID='" + id + "' style='width:50px;'>");
	document.write("<option selected value=''></option>");
	document.write("<option value='RQ'>RQ</option>");
	document.write("<option value='OK'>OK</option>");
	document.write("<option value='WL'>WL</option>");
	document.write("<option value='SO'>SO</option>");
	document.write("<option value='CX'>CX</option>");
	document.write("<option value='XX'>XX</option>");
	document.write("</SELECT>");
}

function EId(id)
{
	return document.getElementById(id);
}

function Wrt(str)
{
	document.write(str);
}

function HideShowElement(idText, moreText, closeText, idToShowHide)
{	
	var objIdText = EId(idText);
	var objIdToShowHide = EId(idToShowHide);
	
	if (objIdText == null || objIdToShowHide == null)
		return;
		
	if (objIdToShowHide.style.display == "")
	{
		objIdToShowHide.style.display = "none";
		objIdText.innerHTML = moreText;
	}	
	else
	{
		objIdToShowHide.style.display = "";
		objIdText.innerHTML = closeText;
	}			
}

function GetValById(id)
{
	var obj=EId(id);
	return Trim(obj.value);
}

function VBAlert(title,msg,icon,buts,mods) 
{
	var res;
	IE4 = document.all;
	if (IE4)	
		res = makeMsgBox(title,msg,icon,buts,0,mods);
	else
	{
		alert(msg);
		res = null;
	}
	return res;
}
function AsAmnt(amnt)
{
	return AsDecAmnt(amnt,2);
}

function AsDecAmnt(sAmnt, d)
{ // parse the string sAmnt to float number with d digits after the decimal point 
	if (typeof(d) == "undefined")
		d = 0;
	var src = new String(parseFloat(sAmnt));
	if (isNaN(src))
		src = "0";
	var arr = src.split(".");
	var dst = arr[0];
	if (arr.length > 1 && d > 0) {
		src = arr[1];
		dst += ".";
		var n = src.substr(0,d);
		if (d < src.length) {
			// round up if next digit is 5 and up
			if (parseInt(src.charAt(d)) >= 5 )  {
				//count leading zeros 
				var zeros = 0;
				for (i=0; i<n.length; i++){
					if (n.charAt(i) == "0")
						zeros++;
					else
						break;
				}
				while(zeros > 0) {
					dst += "0";
					zeros--;
				}
				n = parseInt(n) + 1;
			}
			dst += n;
			arr = dst.split(".");
			dst = arr[0] + "." + arr[1].substr(0,d);
		}
		else if (d > src.length) {
			dst += n;
			for (var i=0; i<(d-src.length); i++)
				dst += "0";
		}
		else {
			dst += n;
		}
	}
	else if (d > 0) { 
		dst += ".";
		for (var i=0; i<d; i++)
			dst += "0";
	}
	return dst; 
}

//Return date representation in format YYYY-MM-DD
function GetDateDeshFormat(y, m, d)
{
    if (m.length < 2)
		m = "0" + m;	
	if (d.length < 2)
		d = "0" + d;
	return y + "-" + m + "-" + d;		
}
