/**
 * Provides a method to encode any string into a URL-safe
 * form.
 * Non-ASCII characters are first encoded as sequences of
 * two or three bytes, using the UTF-8 algorithm, before being
 * encoded as %HH escapes.
 */

var  hex = [
	"%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
	"%08", "%09", "%0a", "%0b", "%0c", "%0d", "%0e", "%0f",
	"%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
	"%18", "%19", "%1a", "%1b", "%1c", "%1d", "%1e", "%1f",
	"%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27",
	"%28", "%29", "%2a", "%2b", "%2c", "%2d", "%2e", "%2f",
	"%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37",
	"%38", "%39", "%3a", "%3b", "%3c", "%3d", "%3e", "%3f",
	"%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47",
	"%48", "%49", "%4a", "%4b", "%4c", "%4d", "%4e", "%4f",
	"%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57",
	"%58", "%59", "%5a", "%5b", "%5c", "%5d", "%5e", "%5f",
	"%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67",
	"%68", "%69", "%6a", "%6b", "%6c", "%6d", "%6e", "%6f",
	"%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77",
	"%78", "%79", "%7a", "%7b", "%7c", "%7d", "%7e", "%7f",
	"%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87",
	"%88", "%89", "%8a", "%8b", "%8c", "%8d", "%8e", "%8f",
	"%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97",
	"%98", "%99", "%9a", "%9b", "%9c", "%9d", "%9e", "%9f",
	"%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7",
	"%a8", "%a9", "%aa", "%ab", "%ac", "%ad", "%ae", "%af",
	"%b0", "%b1", "%b2", "%b3", "%b4", "%b5", "%b6", "%b7",
	"%b8", "%b9", "%ba", "%bb", "%bc", "%bd", "%be", "%bf",
	"%c0", "%c1", "%c2", "%c3", "%c4", "%c5", "%c6", "%c7",
	"%c8", "%c9", "%ca", "%cb", "%cc", "%cd", "%ce", "%cf",
	"%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
	"%d8", "%d9", "%da", "%db", "%dc", "%dd", "%de", "%df",
	"%e0", "%e1", "%e2", "%e3", "%e4", "%e5", "%e6", "%e7",
	"%e8", "%e9", "%ea", "%eb", "%ec", "%ed", "%ee", "%ef",
	"%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
	"%f8", "%f9", "%fa", "%fb", "%fc", "%fd", "%fe", "%ff"
];

  /**Encode a string to the "x-www-form-urlencoded" form, enhanced
   *  with the UTF-8-in-URL proposal. This is what happens:
   *
   * 
   * The ASCII characters 'a' through 'z', 'A' through 'Z',
   *   and '0' through '9' remain the same.
   *
   * The unreserved characters - _ . ! ~ * ' ( ) remain the same.
   *
   * The space character ' ' is converted into a plus sign '+'.
   *
   * All other ASCII characters are converted into the
   *   3-character string "%xy", where xy is
   *   the two-digit hexadecimal representation of the character
   *   code
   *
   * All non-ASCII characters are encoded in two steps: first
   *   to a sequence of 2 or 3 bytes, using the UTF-8 algorithm;
   *   secondly each of these bytes is encoded as "%xx".
   * 
   *
   * @param s The string to be encoded
   * @return The encoded string
   *
   **/
   
  function CustomEncodeURI(s)
  {
	
    var sbuf = "" ;
    var len = s.length;
    var i; 
    var ch;
    var chCode;
    var count = 0;
   
    for (i = 0; i < len; i++) 
    {  
      ch = s.charAt(i);
      chCode = s.charCodeAt(i);
      if ('A' <= ch && ch <= 'Z') // 'A'..'Z'
      {		
		sbuf = sbuf + ch;
      } 
      else if ('a' <= ch && ch <= 'z') // 'a'..'z'
      {	
		sbuf[i]= ch;
		sbuf = sbuf + ch;
      } 
      else if ('0' <= ch && ch <= '9') // '0'..'9'
      {	
		sbuf = sbuf + ch;
      } 
      //else if (ch == ' ') {			// space
		//sbuf[i]= ch;
	//	sbuf = sbuf + ch;
    //  } 
      else if (ch == '-' || ch == '_'		// unreserved
          || ch == '.' || ch == '!'
          || ch == '~' || ch == '*'
          || ch == '\'' || ch == '('
          || ch == ')') {
		sbuf = sbuf + ch;
      } 
      else if (chCode <= 0x007f) // other ASCII
      {		
		sbuf = sbuf + hex[chCode];
      } 
      else if (chCode <= 0x07FF) // non-ASCII <= 0x7FF
      {		
		sbuf = sbuf + hex[0xc0 | (chCode >> 6)];
		sbuf = sbuf + hex[0x80 | (chCode & 0x3F)];
      } 
      else // 0x7FF < ch <= 0xFFFF
      {					
		sbuf = sbuf + hex[0xe0 | (chCode >> 12)];
		sbuf = sbuf + hex[0x80 | ((chCode >> 6) & 0x3F)];
		sbuf = sbuf + hex[0x80 | (chCode & 0x3F)];
      }
    }
    return sbuf;
  }

// extract front part of string prior to searchString
function getFront(mainStr,searchStr){
	foundOffset = mainStr.indexOf(searchStr)
	if (foundOffset == -1) {
		return null
	}
	return mainStr.substring(0,foundOffset)
}

// extract back end of string after searchString
function getEnd(mainStr,searchStr) {
	foundOffset = mainStr.indexOf(searchStr)
	if (foundOffset == -1) {
		return null
	}
	return mainStr.substring(foundOffset+searchStr.length,mainStr.length)
}

// insert insertString immediately before searchString
function insertString(mainStr,searchStr,insertStr) {
	var front = getFront(mainStr,searchStr)
	var end = getEnd(mainStr,searchStr)
	if (front != null && end != null) {
		return front + insertStr + searchStr + end
	}
	return null
}

// remove deleteString
function deleteString(mainStr,deleteStr) {
	return replaceString(mainStr,deleteStr,"")
}

// replace searchString with replaceString
function replaceString(mainStr,searchStr,replaceStr) {
	var front = getFront(mainStr,searchStr)
	var end = getEnd(mainStr,searchStr)
	if (front != null && end != null) {
		return front + replaceStr + end
	}
	return null
}


// modified by TJD 19/7/02
// the Javascript escape function does not escape the plus sign
// ***note + char is encode properly using the CustomEncodeURI function now
function escapePlus(inStr){
	var i, c;
	var strTemp = CustomEncodeURI(inStr) + "";
	
	return strTemp;
}


// checkString for empty 
// returns true if empty
function checkString(theField)  //, emptyOK)
{   var emptyOk = false;
  if  (isEmpty(theField.value)) 
    {
		if (emptyOk)
		{
			return true 
		}else{
			return false }
	}	
return true;
}

// Returns true if string s is empty or
// space characters only.
function isEmpty(s) {
	var i;
	if (s == null) return true;
	if (s.length == 0) return true;
	if (isAllSpaces(s)) return true;
	return false ; 
}

// Returns true if string s is contains space characters only.
function isAllSpaces (s) {
	var i;
    // Search through string's characters until find a non-whitespace character.
    // When we do, return false; if we don't, return true.
    for (i = 0; i < s.length; i++) {   
        if (s.charAt(i) != " ") return false;
    }
    // All characters are whitespace.
    return true;
}

// Returns string with leading space characters removed
function lTrim (s) {
	var i;
	if (s==null)
		return "";

	s = s.toString();
	// Search through string's characters until find a non-space character.
	// When do, return string with initial spaces removed
    for (i = 0; i < s.length; i++) {
		if (s.charAt(i) != " ") {
			return s.substring(i,s.length);
		}
	}
	return "";
}

// Returns string with trailing space characters removed
function rTrim (s) {
	var i;
	if (s==null)
		return "";

	s = s.toString();
	// Search through string's characters from the right until find a non-space character.
	// When do, return string with trailing spaces removed
    i = s.length - 1
    while (i >= 0) {
		if (s.charAt(i) != " ") {
			break;
		}
		i--
	}
	return s.substring(0,i + 1);
}

// Returns string with leading and trailing space characters removed
function Trim (s) {
	return lTrim(rTrim(s));
}

function FormatNumForValidation(num,strDigitSeparator,strDecimalSymbol) {
   var strFormatNumber
   var strTemp
   strFormatNumber = num;
   
   strTemp = replaceString(strFormatNumber,strDecimalSymbol,"DEC");
   if (strTemp != null) {
		strFormatNumber = strTemp}
		
   strTemp = replaceString(strFormatNumber,strDigitSeparator,"DGT");
   if (strTemp != null) {
		strFormatNumber = strTemp}
   
   strTemp = replaceString(strFormatNumber,"DGT","");
   if (strTemp != null) {
		strFormatNumber = strTemp}
		
   strTemp = replaceString(strFormatNumber,"DEC",".");
      if (strTemp != null) {
		strFormatNumber = strTemp}
   return strFormatNumber;
}

// Returns true if is a number with max of 2 decimal places
// To specify different # of decimal places, 
//   pass optional numeric parameter for #
// Allows negative sign in 1st position
// Pass Trim(s) if want to allow leading & trailing space characters
function isNumber (s, strLabel, strDecimal) {
	var strNum = s
	var i;
	var maxDecimals;
	var seenDecimalPoint = false;
	var indexOfDecimalPoint = -1;
	var argArray = isNumber.arguments;
	var argPassed = argArray.length;
	var strInvalidMsg = "Invalid " + strLabel + ".\n\n"
	
	strNum = strNum + "";
		
	if ( strNum == null ) return true;
	if ( strNum.length == 0 ) return true;

	if ( strNum == "." || (strNum == "-") ) {
		alert(strInvalidMsg)
		return false;
	}
	
	// if third parameter not passed, assume max of 2 decimal places
	if ( argPassed == 3 ) {
		argArray[3] = 2;
	}
	
	maxDecimals = argArray[3];
			
    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.
    for ( i = 0; i < strNum.length; i++ ) {
		// Check that current character is number.
		var c = strNum.charAt(i);
		if ( i == 0 && c == "-" ) {
			continue;
		}	
		if ( c == strDecimal && !seenDecimalPoint ) {
			seenDecimalPoint = true;
			indexOfDecimalPoint = i;
			continue;
		}       
        if ( !isDigit(c) ) {
			alert(strInvalidMsg + "Invalid characters found in number.");
			return false;
        }
    }
    if ( indexOfDecimalPoint != -1 ) {
		if ( strNum.length - (indexOfDecimalPoint + 1) > maxDecimals ) {
			alert(strInvalidMsg + "Invalid number of decimal places.\nMaximum number of decimals is " + maxDecimals + ".")
			return false;
		}
    }
    // All characters are numbers.
    return true;
}


// Returns true if character c is a digit 
// (0 .. 9).
function isDigit (c)
{  
return ((c >= "0") && (c <= "9"))
}


function isAlpha( c )
{   
	return ( (c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z") )
}

// This function receives a number in american format (1,000.00), and converts it
// into the desired format.
function FormatNumForDisplay(num,strDigitSeparator,strDecimalSymbol) 
{
	var strFormatNumber;
	var strTemp;
	strFormatNumber = num;
   
	strTemp = replaceString(strFormatNumber,".","DEC");	
	if (strTemp != null) {
		strFormatNumber = strTemp;
	}	

	strTemp = replaceString(strFormatNumber,",","DGT");
	if (strTemp != null) {
		strFormatNumber = strTemp;
	}
   
	strTemp = replaceString(strFormatNumber,"DGT",strDigitSeparator);
	if (strTemp != null) {
		strFormatNumber = strTemp;
	}
		
	strTemp = replaceString(strFormatNumber,"DEC",strDecimalSymbol);
	if (strTemp != null) {
		strFormatNumber = strTemp;
	}

	return strFormatNumber;
}	

