/******************************
doPriceSync:
window_openWH:
validateEmail:
nonWS:
jsTrim:
validateNoQuotes:
validateNonZero:
validatePresence:
validateCheckBox:
validatePresenceAlphaNumeric:
validatePresenceNonNegNumber:
validateLimit:
validateCurrency:
validatePresenceBound:
validatePresenceAtLeast:
isStringAlphaNumeric:
isCharAlphaNumeric:
jsLen:
jsRight:
jsMid:
existFile:
getValueFromString:
jsInStr:

ValidatePhoneNumber: validate phone numbers, it cannot be empty, must a number, must 10 digits
noWhiteSpace: replace white space with empty

*******************************/
function doPriceSync(gp, bShowWithGST, obj)
{
 // Note: Keep tenths of cents...
 var p1 = obj.value;

 if (bShowWithGST)
 {
  obj.value = Math.round(p1 * (1.0 + gp / 100.0) * 1000) / 1000.0;
 }
 else
 {
  obj.value = Math.round(p1 / (1.0 + gp / 100.0) * 1000) / 1000.0;
 }
}


function window_openWH(url, w, h)
{
 window.open(url, '_blank', 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=' + w + ',height=' + h);
}


function validateEmail(obj, msg, bAllowBlank)
{
 var str = obj.value;
 if (jsTrim(str) == "")
 {
  if (bAllowBlank)
  {
   return true;
  }
  else
  {
   alert(msg);
   obj.focus();
   return false;
  }
 }

 var at = "@";
 var dot = ".";
 var lat = str.indexOf(at);
 var lstr = str.length;
 var ldot = str.indexOf(dot);

 if ( (str.indexOf(at) == -1)
   || (str.indexOf(at) == -1 || str.indexOf(at) == 0 || str.indexOf(at) == lstr)
   || (str.indexOf(dot) == -1 || str.indexOf(dot) == 0 || str.indexOf(dot) == lstr)
   || (str.indexOf(at, (lat + 1)) != -1)
   || (str.substring(lat - 1, lat) == dot || str.substring(lat + 1, lat + 2) == dot)
   || (str.indexOf(dot, (lat + 2)) == -1)
   || (str.indexOf(" ") != -1) )
 {
  alert(msg);
  obj.focus();
  return false;
 }
 return true;
}

 
function nonWS(s)
{
 if (s == " ") return false;
 if (s == "\t") return false;
 return true;
}


function jsTrim(s)
{
 var nLen = s.length;
 var nStart = 0;
 var nEnd = nLen - 1;
 var i;

 for (nStart = 0; nStart <= nEnd; nStart++)
  if (nonWS(s.charAt(nStart))) break;

 for (nEnd = nLen - 1; nEnd >= nStart; nEnd--)
  if (nonWS(s.charAt(nEnd))) break;

 return s.substr(nStart, nEnd - nStart + 1);
}


function validateNoQuotes (obj, msg)
{
 var s = new String(obj.value);
 var i;
 for (i = 0; i < s.length; i++)
 {
  switch (s.charAt(i))
  {
   case "'":
   case '"':
    alert(msg);
    obj.focus();
    return false;
  }
 }
 return true;
}


function validateNonZero(obj, msg)
{
 if (obj == null)
 {
  return true;
 }
 if (obj.value == '0')
 {
  alert(msg);
  obj.focus();
  return false;
 }
 return true;
}


function validatePresence(obj, msg)
{
 if (obj == null)
 {
  return true;
 }
 if (jsTrim(obj.value) == '')
 {
  alert(msg);
  obj.focus();
  return false;
 }
 return true;
}

function validateCheckBox(obj, msg)
{
 if (obj.checked != true)
 {
  alert(msg);
  obj.focus();
  return false;
 }
 return true;
}

function validatePresenceAlphaNumeric(obj, msg, msgAlpha)
{
 if (jsTrim(obj.value) == '')
 {
  alert(msg);
  obj.focus();
  return false;
 }
 if (!isStringAlphaNumeric(obj.value))
 {
  alert(msgAlpha);
  obj.focus();
  return false;
 }
 return true;
}


function validatePresenceNonNegNumber(obj, msg)
{
 if (jsTrim(obj.value) == '')
 {
  alert(msg);
  obj.focus();
  return false;
 }
 if (!isFinite(obj.value) || obj.value < 0)
 {
  alert(msg);
  obj.focus();
  return false;
 }
 return true;
}


function validateLimit(obj, nLimit, sLimitMsg)
{
 if (obj.value.length > nLimit)
 {
  alert(sLimitMsg);
  obj.focus();
  return false;
 }
 return true;
}


function validatePresenceLimit(obj, sMsg, nLimit, sLimitMsg)
{
 if (jsTrim(obj.value) == "")
 {
  alert(sMsg);
  obj.focus();
  return false;
 }
 if (obj.value.length > nLimit)
 {
  alert(sLimitMsg);
  obj.focus();
  return false;
 }
 return true;
}


function validateCurrency(sName, sDesc)
{
 var ta;
 ta = document.getElementById(sName);
 if (ta)
 {
  if (!isFinite(ta.value))
  {
   alert('Please enter a number for ' + sDesc + '.');
   ta.focus();
   return false;
  }
 }
 return true;
}


function validatePresenceBound(obj, sMsg, nLow, nHigh, sBoundMsg)
{
 if (!isFinite(obj.value))
 {
  alert(sMsg);
  obj.focus();
  return false;
 }
 if (obj.value < nLow || obj.value > nHigh)
 {
  alert(sBoundMsg);
  obj.focus();
  return false;
 }
 return true;
}


function validatePresenceAtLeast(obj, sMsg, nLow)
{
 if (jsTrim(obj.value) == "")
 {
  alert(sMsg);
  obj.focus();
  return false;
 }
 if (!isFinite(obj.value))
 {
  alert(sMsg);
  obj.focus();
  return false;
 }
 if (obj.value < nLow)
 {
  alert(sMsg);
  obj.focus();
  return false;
 }
 return true;
}


function isStringAlphaNumeric(s)
{
 var i;
 for (i = s.length - 1; i >= 0; i--)
  if (!isCharAlphaNumeric(s.charAt(i))) return false;

 return true;
}


function isCharAlphaNumeric(c)
{
 return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || (c == '_'));
}


function validateImageSelection(sSel, sImgBrowse, sMsg)
{
 var imgSel = document.getElementById(sSel);
 if (imgSel.value == "/get")
 {
  alert('Please select a file.');
  imgSel.focus();
  return false;
 }
 if (imgSel.value == '/upload')
 {
  var imgUp = document.getElementById(sImgBrowse);
  if (jsTrim(imgUp.value) == '')
  {
   alert(sMsg);
   imgUp.focus();
   return false;
  }
 }
 return true;
}

function jsLen(str)
/***
        IN: str - the string whose length we are interested in

        RETVAL: The number of characters in the string
***/
{  return String(str).length;  }

function jsRight(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 jsMid(str, start, len)
/***
        IN: str - the string we are LEFTing
            start - our string's starting position (0 based!!)
            len - how many characters from start we want to get

        RETVAL: The substring from start to start+len
***/
{
        // Make sure start and len are within proper bounds
        if (start < 0 || len < 0) return "";

        var iEnd, iLen = jsLen(str);
        if (start + len > iLen)
                iEnd = iLen;
        else
                iEnd = start + len;

        return String(str).substring(start,iEnd);
}


// BEWARE - WEIRD FUNCTION!!!
function existFile(sFilenames, sFilenameToCompare, vsSeparator)
{
//	var bFound = false;
//	var nCount = 1;
//	var sValue = " ";

//	if (jsTrim(sFilenameToCompare) == "")
//		return false;
//	else
//	{
//		while ((sValue != "") && (!bFound))
//		{
//			sValue = getValueFromString(sFilenames, nCount, vsSeparator);
//			if (sValue.toUpperCase() == sFilenameToCompare.toUpperCase())
//				bFound = true;	
//			else
//				nCount++;
//		}
//		if (bFound)
//			return true;
//		else
//			return false;
//	}
	
	var s = sFilenameToCompare;
	sFilenameToCompare = s.replace("(", "<"); 
	s = sFilenameToCompare;
	sFilenameToCompare = s.replace(")", ">"); 
	var re = new RegExp(vsSeparator + sFilenameToCompare + vsSeparator, "gi");
	var m = re.exec(sFilenames);
	if (m == null) 
		return false;
	else
		return true;
}

function getValueFromString(vsString, vnFieldNumber, vsSeparator) 
{
	var bFound = false;
	var nCharCount1;
	var nCharCount2;
	var nFieldCount;
	var sFieldName = "";
	nFieldCount = 1;
	nCharCount1 = 0;
	nCharCount2 = jsInStr(nCharCount1, vsString, vsSeparator);
	while ((nCharCount2 > 0) && (!bFound)) 
	{
		if (nFieldCount == vnFieldNumber) 
		{
			sFieldName = jsMid(vsString, nCharCount1, nCharCount2 - nCharCount1);
			bFound = true;
		}
		else
		{
			nCharCount2 = jsInStr(nCharCount1, vsString, vsSeparator);
			if (nCharCount2 > 0) 
			{
				nFieldCount++;
				nCharCount1 = nCharCount2 + 2;
				nCharCount2 = jsInStr(nCharCount1, vsString, vsSeparator);
				if (nCharCount2 == 0)
					nCharCount2 = jsLen(vsString);
			}
		}
	}
	return sFieldName;
}

// InStr function written by: Steve Bamelis - steve.bamelis@pandora.be

function jsInStr(nStartCharPos, strSearch1, strSearchFor)
/*
InStr(strSearch, charSearchFor) : Returns the first location a substring (SearchForStr)
was found in the string str. (If the character is not
found, -1 is returned.)

Requires use of:
Mid function
Len function
*/
{
	if (strSearch1.indexOf(strSearchFor) < 0)
		return 0;
	else
	{
		if ((jsLen(strSearch1) - nStartCharPos) > 0)
		{
			if (strSearch1.lastIndexOf(strSearchFor) >= nStartCharPos)
			{
				var strSearch2 = jsMid(strSearch1, nStartCharPos, jsLen(strSearch1) - nStartCharPos);
				return strSearch2.indexOf(strSearchFor) + nStartCharPos;
			} 
			else
				return 0;
		}
		else
			return 0;
	}
}


function ValidatePhoneNumber(obj)
{
	 if (obj == null)
	 {
	  return true;
	 }
	//alert('obj.value'+obj.value); 
	//alert('trim(obj.value)='+noWhiteSpace(obj.value)); 
	
	//if phone number is empty 
	/*if (trim(obj.value) == '')
	 {
	  alert('Phone number cannot be empty');
	  obj.focus();
	  return false;
	 }*/	 
	 
	//check if the phone number is a number 
	if (isNaN(noWhiteSpace(obj.value)))
	 {
	  alert('Phoner number must a number');
	  obj.focus();
	  return false;
	 }
	//check if the phone number is 10 digits
 
	if (((noWhiteSpace(obj.value)).length !=10) && (noWhiteSpace(obj.value) != ''))
	{
	  alert('Phone number must 10 digits');
	  obj.focus();
	  return false;
	} 	 
	return true;
}


function trim(s)
{	
	if((s==null)||(typeof(s)!='string')||!s.length)
	return'';
	return s.replace(/^\s+/,'').replace(/\s+$/,'')
} 

function removeAllSpaces(s)
{	
	if ((s == null) || (typeof(s) != 'string') || !s.length)
	{
		return '';
	}
	return s.replace(/\s+/g, '');
} 

function noWhiteSpace(s)
{	
	if((s==null)||(typeof(s)!='string')||!s.length)
		return'';
	return s.replace(/\s+/g,'')
}

function isValidTime(obj, msg) 
{
	var re = /^\d{1,2}[:]\d{2}$/;
	var value = obj.value;
	var bValidTime = true;
	if (!re.test(value)) { bValidTime = false; }
	var values = value.split(":");
	if ((parseFloat(values[0]) < 0) || (parseFloat(values[0]) > 23) ) { bValidTime = false; }
	if ((parseFloat(values[1]) < 0) || (parseFloat(values[1]) > 59) ) { bValidTime = false; }

	if(!bValidTime)
	{
		alert(msg);
		obj.focus();
		return false;
	}
	else
	{
		return true;
	}
}


// Determine whether the end time IS later than the start time by nHour.
// Return true if so, false if not.
function IsEndLaterThanStart(dStartDate, sStartTime, dEndDate, sEndTime, nHour, sMsg)
{
	var tmpDropOffDate = dStartDate.split("/");
	var tmpDropOffTime = sStartTime.split(":");
	
	var tmpPickupDate = dEndDate.split("/");
	var tmpPickupTime = sEndTime.split(":");

	//Date(Year, Month, Date, Hour, Mins)
	var start = new Date(tmpDropOffDate[2], tmpDropOffDate[1], tmpDropOffDate[0], tmpDropOffTime[0], tmpDropOffTime[1]); 
	var end = new Date(tmpPickupDate[2], tmpPickupDate[1], tmpPickupDate[0], tmpPickupTime[0], tmpPickupTime[1]); 

	var isValid = true;
	var compareMillieSeconds = nHour * 60 * 60 * 1000; //hour * mins * seconds * milli-seconds
	
	//alert((end - start)/1000/60/60);

	if (end - start < compareMillieSeconds)
	{
		isValid = false;
	}
	
	if (!isValid)
	{
		alert(sMsg);
		return false;
	}
	else
	{
		return true;
	}	
}


// Determine whether the end time IS later than the start time by nHour.
// Just like IsEndLaterThanStart, but just check the times (assume the same day!)
// Return true if so, false if not.
function IsTimeEndLaterThanStart(oStartTime, oEndTime, nHour, sMsg)
{
	var tmpDropOffTime = oStartTime.value.split(":");
	var tmpPickupTime = oEndTime.value.split(":");

	//Date(Year, Month, Date, Hour, Mins)
	var start = new Date(2009, 1, 1, tmpDropOffTime[0], tmpDropOffTime[1]); 
	var end = new Date(2009, 1, 1, tmpPickupTime[0], tmpPickupTime[1]); 

	var isValid = true;
	var compareMillieSeconds = nHour * 60 * 60 * 1000; //hour * mins * seconds * milli-seconds
	
	//alert((end - start)/1000/60/60);

	if (end - start < compareMillieSeconds)
	{
		isValid = false;
	}
	
	if (!isValid)
	{
		alert(sMsg);
		oStartTime.focus();
		return false;
	}
	else
	{
		return true;
	}	
}


// Determine whether the end date/time IS later than NOW by nHour.
// Return true if so, false if not.
function IsEndLaterThanNow(oEndDate, oEndTime, nHour, sMsg)
{
	var dNow = new Date();
	var sEndDate = oEndDate.value;
	var sEndTime = oEndTime.value;

	var tmpPickupDate = sEndDate.split("/");
	var tmpPickupTime = sEndTime.split(":");

	var start = new Date();
	var end = new Date(tmpPickupDate[2], tmpPickupDate[1] - 1, tmpPickupDate[0], tmpPickupTime[0], tmpPickupTime[1]); 

	var isValid = true;
	var compareMilliSeconds = nHour * 60 * 60 * 1000; //hour * mins * seconds * milli-seconds
	
	if (end - start < compareMilliSeconds)
	{
		isValid = false;
	}
	
	if (!isValid)
	{
		alert(sMsg);
		oEndTime.focus();
		return false;
	}
	else
	{
		return true;
	}	
}


// Ensure that the time is within a given range (sTimeFrom, sTimeTo in 24 hour format).
function isValidBookingTime(obj, sTimeFrom, sTimeTo, sType)
{
	var aTime = obj.value.split(":");
	var nTimeHours = parseFloat(aTime[0]);
	var nTimeMins = parseFloat(aTime[1]);

	var aTimeFrom = sTimeFrom.split(":");
	var nTimeFromHours = parseFloat(aTimeFrom[0]);
	var nTimeFromMins = parseFloat(aTimeFrom[1]);

	var aTimeTo = sTimeTo.split(":");
	var nTimeToHours = parseFloat(aTimeTo[0]);
	var nTimeToMins = parseFloat(aTimeTo[1]);

	var bValidTime = true;

	// Check starting time.
	if (nTimeHours < nTimeFromHours)
	{
		bValidTime = false;
	}

	if (nTimeHours == nTimeFromHours)
	{
		if (nTimeMins < nTimeFromMins)
		{
			bValidTime = false;
		}
	}

	// Check ending time.
	if (nTimeHours > nTimeToHours)
	{
		bValidTime = false;
	}

	if (nTimeHours == nTimeToHours)
	{
		if (nTimeMins > nTimeToMins)
		{
			bValidTime = false;
		}
	}

	if (!bValidTime)
	{
		alert("Invalid " + sType + ".\r\n" + "Please make sure the " + sType + " is between " + sTimeFrom + " and " + sTimeTo + ".");
		obj.focus();
		return false;
	}
	else
	{
		return true;
	}
}

function textCounter(field,cntfield,maxlimit)
{
	if (field.value.length > maxlimit) // if too long...trim it!
	{
		field.value = field.value.substring(0, maxlimit);
	}
	// otherwise, update 'characters left' counter
	else
	{
		if(document.all)
		{
			cntfield.innerText = maxlimit - field.value.length;
		}
		else
		{
			cntfield.textContent = maxlimit - field.value.length;
		}
	}

}

//check if it is [a-zA-z0-9], including underscore
function checkIllegalChars(obj, sMsg)
{
	var illegalChars = /\W/; // allow letters, numbers, and underscores
	if (illegalChars.test(removeAllSpaces(obj.value))) 
	{
	    alert(sMsg + "\nOnly letters (a-z), numbers (0-9), and underscore (_) are allowed.");
		obj.focus();
        return false; 
    }
   return true;   
}

function RemoveLastSlice(sString)
{
	if(sString.indexOf("/", sString.length - 1) > 0)
	{
		sString = sString.slice(0,sString.length - 1)
	}
	
	return sString;
}

function GetQuery(sQueryName) 
{
	var sQuerys = window.location.search.substring(1);
	var aQuerys= sQuerys.split("&");
	for (i=0;i<aQuerys.length;i++)
	{
		aQueryValues = aQuerys[i].split("=");
		if (aQueryValues[0] == sQueryName) 
		{
			return aQueryValues[1];
		}
	}
}


