/*************
Encode Base64
***************/
  var base64Chars = new Array(
   'A','B','C','D','E','F','G','H',
   'I','J','K','L','M','N','O','P',
   'Q','R','S','T','U','V','W','X',
   'Y','Z','a','b','c','d','e','f',
   'g','h','i','j','k','l','m','n',
   'o','p','q','r','s','t','u','v',
   'w','x','y','z','0','1','2','3',
   '4','5','6','7','8','9','+','/'
  );
 
  var reverseBase64Chars = new Array();
    for (var i=0; i < base64Chars.length; i++){
      reverseBase64Chars[base64Chars[i]] = i;
     }

function setBase64Str(str){
  base64Str = str;
  base64Count = 0;
}

function readBase64(){
    if (!base64Str) return 'END_OF_INPUT';
      if (base64Count >= base64Str.length) return 'END_OF_INPUT';
        var c = base64Str.charCodeAt(base64Count) & 0xff;
        base64Count++;
        return c;
      }

  var base64Str;
  var base64Count;

function encodeBase64(str){
 setBase64Str(str);
 var result = '';
 var inBuffer = new Array(3);
 var lineCount = 0;
 var done = false;
 while (!done && (inBuffer[0] = readBase64()) != 'END_OF_INPUT'){
    inBuffer[1] = readBase64();
   inBuffer[2] = readBase64();
   result += (base64Chars[ inBuffer[0] >> 2 ]);
   if (inBuffer[1] != 'END_OF_INPUT'){
       result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30) | (inBuffer[1] >> 4) ]);
       if (inBuffer[2] != 'END_OF_INPUT'){
           result += (base64Chars [((inBuffer[1] << 2) & 0x3c) | (inBuffer[2] >> 6) ]);
           result += (base64Chars [inBuffer[2] & 0x3F]);
      } else {
           result += (base64Chars [((inBuffer[1] << 2) & 0x3c)]);
           result += ('=');
           done = true;
       }
    } else {
        result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30)]);
        result += ('=');
        result += ('=');
       done = true;
    }
    lineCount += 4;
    if (lineCount >= 76){
        //result += ('\n');
        lineCount = 0;
    }
  }
  return result;
}

var hexVals = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
              "A", "B", "C", "D", "E", "F");
var unsafeString = '\"<>%\\^[]`\+\$\,';

function isUnsafe(compareChar)
// this function checks to see if a char is URL unsafe.
// Returns bool result. True = unsafe, False = safe
{
if (unsafeString.indexOf(compareChar) == -1 && compareChar.charCodeAt(0) > 32 && compareChar.charCodeAt(0) < 123)
   { return false; 
   } // found no unsafe chars, return false
else
   { return true; }
}

function convert(val) // this converts a given char to url hex form
{ return  "%" + decToHex(val.charCodeAt(0), 16); }

function decToHex(num, radix)
// part of the hex-ifying functionality
{
var hexString = "";
while (num >= radix)
      {
       temp = num % radix;
       num = Math.floor(num / radix);
       hexString += hexVals[temp];
      }
hexString += hexVals[num];
return reversal(hexString);
}

function reversal(s) // part of the hex-ifying functionality
{
var len = s.length;
var trans = "";
for (i=0; i<len; i++)
    { trans = trans + s.substring(len-i-1, len-i); }
s = trans;
return s;
}

//function URLEncode(val)
//{
//var len     = val.length;
//var i       = 0;

//var newStr  = "";
//var frag    = "";
//var encval  = "";
//var original = val;

//for (i=0;i<len;i++)
//{
//   if (val.substring(i,i+1).charCodeAt(0) < 255)  
//    {
//        if (isUnsafe(val.substring(i,i+1)) == false)
//             { newStr = newStr + val.substring(i,i+1); }
//        else
//             { newStr = newStr + convert(val.substring(i,i+1)); }
//     }
//     else 
//     {
//        alert ("Found a non-ISO-8859-1 character at position: " + (i+1) + ",\nPlease eliminate before continuing.");
//        newStr = original; 
//        i=len;                
//     }
//}
//    return newStr;
//}

function URLEncode(val)
{
	// The Javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	var SAFECHARS = "0123456789" +					// Numeric
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'()+";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";

	var plaintext = val;
	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
		    encoded += "+";				// x-www-urlencoded, rather than %20
		} else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		} else {
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
			    alert( "Unicode Character '" 
                        + ch 
                        + "' cannot be encoded using standard URL encoding.\n" +
				          "(URL encoding only supports 8-bit characters.)\n" +
						  "A space (+) will be substituted." );
				encoded += "+";
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for

	//document.URLForm.F2.value = encoded;
	return encoded;
};

function URLDecode( )
{
   // Replace + with ' '
   // Replace %xx with equivalent character
   // Put [ERROR] in output if %xx is invalid.
   var HEXCHARS = "0123456789ABCDEFabcdef"; 
   var encoded = document.URLForm.F2.value;
   var plaintext = "";
   var i = 0;
   while (i < encoded.length) {
       var ch = encoded.charAt(i);
	   if (ch == "+") {
	       plaintext += " ";
		   i++;
	   } else if (ch == "%") {
			if (i < (encoded.length-2) 
					&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1 
					&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
				plaintext += unescape( encoded.substr(i,3) );
				i += 3;
			} else {
				alert( 'Bad escape combination near ...' + encoded.substr(i) );
				plaintext += "%[ERROR]";
				i++;
			}
		} else {
		   plaintext += ch;
		   i++;
		}
	} // while
   document.URLForm.F1.value = plaintext;
   return false;
};

function decode64(input) {
			var keyStr =	"ABCDEFGHIJKLMNOP" +
										"QRSTUVWXYZabcdef" +
									  "ghijklmnopqrstuv" +
										"wxyz0123456789+/" +
										"=";
										
      var output = "";
      var chr1, chr2, chr3 = "";
      var enc1, enc2, enc3, enc4 = "";
      var i = 0;

      // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
      var base64test = /[^A-Za-z0-9\+\/\=]/g;
      //if (base64test.exec(input)) {
      //   alert("There were invalid base64 characters in the input text.\n" +
      //         "Valid base64 characters are A-Z, a-z, 0-9, '+', '/', and '='\n" +
      //         "Expect errors in decoding.");
      //}
      input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

      do {
         enc1 = keyStr.indexOf(input.charAt(i++));
         enc2 = keyStr.indexOf(input.charAt(i++));
         enc3 = keyStr.indexOf(input.charAt(i++));
         enc4 = keyStr.indexOf(input.charAt(i++));

         chr1 = (enc1 << 2) | (enc2 >> 4);
         chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
         chr3 = ((enc3 & 3) << 6) | enc4;

         output = output + String.fromCharCode(chr1);

         if (enc3 != 64) {
            output = output + String.fromCharCode(chr2);
         }
         if (enc4 != 64) {
            output = output + String.fromCharCode(chr3);
         }

         chr1 = chr2 = chr3 = "";
         enc1 = enc2 = enc3 = enc4 = "";

      } while (i < input.length);

      return output;
}

function ClearTextboxValues(oField,sMsg){
    if (oField.value == sMsg){
      oField.value = "";
    }
  }


//Functions for checking dates: START
function CheckNumeric(sField,sType) {
    var bReturn = false;
    var sFieldValue = "";
    var count = 0;    
    var str = sField.value;   
    var sMsg = "";
	  var CountPeriod = 0; //PLS add this to the top variables before the loop starts

    sType = sType.toLowerCase();

    if (sType == 'integer'){
    bReturn = true;
    }
    if (sType == 'long'){
    bReturn = true;
    }
    if (sType == 'double'){
		bReturn = true;
    }
    
    if (bReturn = false){
    return false;
    }

	for (var i = 0; i < str.length; i++){
      var c = str.charAt(i);
      if ((c == '0') || (c == '1') || (c == '2') || (c == '3') || (c == '4') || (c == '5') || (c == '6') || (c == '7') || (c == '8') || (c == '9'))
      {
        bReturn = true;
        sFieldValue = sFieldValue + c;
      }
      else if(c == '.'){
	      CountPeriod = CountPeriod + 1;
        if (CountPeriod == 2){
					alert('Please do not use more than one full stop (.)');
					sField.select();
					sField.focus();
					return false
				}
        if (sType == 'integer'){
          alert('Please do not use a full stop (.)');
          sField.select();
          sField.focus();
          sField.value = '';
          return false
        }
        if (sType == 'long'){
          alert('Please do not use a full stop (.)');
          sField.select();
          sField.focus();
          sField.value = '';
          return false
        }
        bReturn = true
        sFieldValue = sFieldValue + c;
      }
      else if (c == ',') {
        if (sType == 'integer'){
          alert('Please do not use a comma (,)');
          sField.select();
          sField.focus();
          sField.value = '';
          return false
        }
        if (sType == 'long'){
          alert('Please do not use a comma (,)');
          sField.select();
          sField.focus();
          sField.value = '';
          return false
        }
        alert('Please replace the comma (,) with a full stop (.)');
        sField.select();
        sField.value = '';
        return false
      }
      else {
        sField.value = ''
        alert('Please use only numerical characters');
        return false
      }
    }
    if (bReturn == true) {
      sField.value = sFieldValue;
    }  
  }


function CheckDate(oDay,oMonth,oYear) {
  var bReturn = true;
  var IsDayEmpty = false;
  var IsMonthEmpty = false;
  var IsYearEmpty = false;
  var leap = 0;
  var str = oDay.value+oMonth.value+oYear.value;
  
  if(bReturn == true){
    //Check for leap years
    if ((oYear.value % 4 == 0) ||		(oYear.value % 100 == 0) ||		(oYear.value % 400 == 0)) {
      	leap = 1;
    }
    if ((oMonth.value == 2) && (leap == 1) && (oDay.value > 29)) {
		  oDay.select();
		  oDay.focus();
		  alert("The date you provided is invalid. Please correct it.");
		  bReturn = false
    }
    if ((oMonth.value == 2) && (leap != 1) && (oDay.value > 28)) {
		  oDay.select();
		  oDay.focus();
		  alert("The date you provided is invalid. The year you provided was not a leap year. Please correct it.");
		  bReturn = false
    }
    //Check for month specific day dates
    if (oDay.value > 31) {
      alert('The day you provided is invalid. It does not exist. Please correct it.');
      oDay.select();
		  oDay.focus();
		  bReturn = false
    }
    if (oMonth.value > 12) {
      alert('The month you provided is invalid. Please correct it.');
      oMonth.select();
		  oMonth.focus();
		  bReturn = false
    }
    if (oDay.value > 30){
      if ((oMonth.value == "4") || (oMonth.value == "6") || (oMonth.value == "9")||(oMonth.value == "11")) {
        oDay.select();
		    oDay.focus();
		    alert('The day you provided is invalid. Please correct it.');
		    bReturn = false
      }
    }
    return bReturn
  }
}

function DateCheck(oField,oNextField,DoChange){
  CheckNumeric(oField,'integer')
  if(DoChange == true){
    if (oNextField != oField){
      AddNowDate(oField,oNextField,oField.name)
    }
  }
  BgBlur(oField.name)
}

function AddNowDate(oField,oNextField,sFieldName){
  var dDate
  var newDate
  now = new Date()
  sFieldName = sFieldName.toUpperCase();
  if (sFieldName.indexOf("DAY")>0){
    dDate = now.getMonth()
    newDate = dDate + 1
    if (oNextField.value == 'mm' || oNextField.value == ''){
      oNextField.value = newDate
    }
  }
  if (sFieldName.indexOf("MONTH")>0){
    dDate = now.getYear()
    dDate = (dDate < 1000) ? dDate + 1900 : dDate;
    if (oNextField.value == 'yyyy' || oNextField.value == ''){
      oNextField.value = dDate
    }
  }
}

function ShowMessage(sMsg){
    confirm(sMsg);
}

function AddZero(sFieldName){
  var sValue = "";

  sValue = document.frmMaint.elements(sFieldName).value;
  if (sValue.length == 1){
    document.frmMaint.elements(sFieldName).value = "0" + sValue 
  }
}
function popUpWindow(sPageToOpen){
  if(sPageToOpen == "ShowMaintHelp"){
    window.open("ShowMaintHelp.html","GeneralMaintenanceHelp","width=400,height=300,left=590,top=270,resizable=yes,scrollbars=yes,toolbar=no,location=no,menubar=no,titlebar=yes");
  }
  if(sPageToOpen == "ShowBrwHelp"){
    window.open("ShowBrwHelp.html","GeneralBrowseHelp","width=400,height=300,left=590,top=270,resizable=yes,scrollbars=yes,toolbar=no,location=no,menubar=no,titlebar=yes");
  }
  if(sPageToOpen == "ShowReportHelp"){
    window.open("ShowReportHelp.html","GeneralReportHelp","width=400,height=300,left=590,top=270,resizable=yes,scrollbars=yes,toolbar=no,location=no,menubar=no,titlebar=yes");
  }
}  
function replaceAll( str, from, to ) { //str=the string; from=what you want to replace; to=new value
  var idx = str.indexOf(from);
  while ( idx > -1 ) {
    str = str.replace(from,to);
    idx = str.indexOf(from);
  }
  return str;
}

function ReportPrint(sURL) { 
  window.open(sURL,'Report','menubar=no,location=no,toolbar=no,personalbar=no,status=yes,resizable=yes,scrollbars=1');
}

function DecimalCheck(Decimal, oField){
  var nStr = oField.value + '';
  var x = nStr.split('.');
	var x1 = x[0];
	var x2 = x.length > 1 ? + x[1] : '';
	if((x1=="")&&(x2=="")){
	  x1 = "00"
	  x2 = "00"
	  oField.value = x1+"."+x2
	  return
	}
	if(!(x1=="")&&(x2=="")){
	  x2 = "00"
	  oField.value = x1+"."+x2
	  return
	}
	if(!(x1=="")&& !(x2=="")){
	  oField.value =  parseFloat(oField.value).toFixed(Decimal)
    return 
  }
}

var req;

function loadXMLDoc(url)
{
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
        req.onreadystatechange = processReqChange;
        req.open("GET", url, true);
        req.send(null);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            req.onreadystatechange = processReqChange;
            req.open("GET", url, true);
            req.send();
        }
    }
}
function ShowToolbarButton(bAdd, bEdit, bRevert, bSave, bDelete)
{
  if(bAdd && CanAdd){
    document.all.item("cmdAdd").innerHTML = '<IMG SRC="Images/new.gif" align="absmiddle" border=0 alt="Add a new entry">';
  }
  else{
    document.all.item("cmdAdd").innerHTML = '';
  }
  if(bEdit && CanEdit){
    document.all.item("cmdEdit").innerHTML = '<IMG SRC="Images/edit.gif" align="absmiddle" border=0 alt="Edit this entry">';
  }
  else{
    document.all.item("cmdEdit").innerHTML = '';
  }
  if(bRevert){
    document.all.item("cmdRevert").innerHTML = '<IMG SRC="Images/revert.gif" align="absmiddle" border=0 alt="Undo">';
  }
  else{
    document.all.item("cmdRevert").innerHTML = '';
  }
  if(bSave){
    document.all.item("cmdSave").innerHTML = '<IMG SRC="Images/save.gif" align="absmiddle" border=0 alt="Save">';
  }
  else{
    document.all.item("cmdSave").innerHTML = '';
  }
  if(bDelete && CanDelete){
    document.all.item("cmdDelete").innerHTML = '<IMG SRC="Images/delete.gif" align="absmiddle" border=0 alt="Delete">';
  }
  else{
    document.all.item("cmdDelete").innerHTML = '';
  }
}

function ShowMoveButton(bTop, bPrevious, bNext, bBottom)
{
  if(bTop && CanView){
    document.all.item("cmdMoveTop").innerHTML = '<IMG SRC="Images/first.gif" align="absmiddle" border=0 alt="Move Top">';
  }
  else{
    document.all.item("cmdMoveTop").innerHTML = '<IMG SRC="Images/first_disabled.gif" align="absmiddle" border=0 alt="Move Top">';
  }
  if(bPrevious && CanView){
    document.all.item("cmdMovePrevious").innerHTML = '<IMG SRC="Images/previous.gif" align="absmiddle" border=0 alt="Move Previous">';
  }
  else{
    document.all.item("cmdMovePrevious").innerHTML = '<IMG SRC="Images/previous_disabled.gif" align="absmiddle" border=0 alt="Move Previous">';
  }
  if(bNext && CanView){
    document.all.item("cmdMoveNext").innerHTML = '<IMG SRC="Images/next.gif" align="absmiddle" border=0 alt="Move Next">';
  }
  else{
    document.all.item("cmdMoveNext").innerHTML = '<IMG SRC="Images/next_disabled.gif" align="absmiddle" border=0 alt="Move Next">';
  }
  if(bBottom && CanView){
    document.all.item("cmdMoveLast").innerHTML = '<IMG SRC="Images/last.gif" align="absmiddle" border=0 alt="Move Bottom">';
  }
  else{
    document.all.item("cmdMoveLast").innerHTML = '<IMG SRC="Images/last_disabled.gif" align="absmiddle" border=0 alt="Move Bottom">';
  }
}

function EnterEventSubmitSearch(){
  document.SearchBar.SearchEntryValue.value = encodeBase64(document.SearchBar.SearchEntry.value);
  if(window.event){
    var key = window.event.keyCode;
    if (key == 13){
      DoSearch();
    }
  }
  else{
    //Mozilla browsers
    document.onkeypress = keypressHandler; 
  }   
}

function keypressHandler(e){
  var e
  e = e.which;
  if (e == 13){
    //Form will submit automatically because enter was used
  }
}


function DoSearch(){
  if(document.SearchBar){
    if(document.SearchBar.SearchEntry.value == ""){
      alert('Please enter a keyword to search for.');
      document.SearchBar.SearchEntry.focus();
      return false;
    }
    document.SearchBar.SearchEntryValue.value = encodeBase64(document.SearchBar.SearchEntry.value);
    if (window.event && window.event.keyCode == 13){
      //Form will submit automatically because enter was used
    }else{
      document.SearchBar.submit()
    }
  }
}


