/////////////////////////////////////////////////////////////////////////////////////////
// Page functions
// copyright 2008, Alpha Genesis Networks, Inc., subsidiary of Alpha Genesis Terra Corporation (AGTC)
// copyright 2008, www.TicketingSystems.com.
//
// Author: James L. Lainé (AGTC)
//
// Permission granted to use, republish, sell and otherwise
// benefit from this code as you see fit, provided you keep
// this notice intact. You may remove comments below this line.
//
// END OF NOTICE
/////////////////////////////////////////////////////////////////////////////////////////
 var XML_UI		= '<UI><FN>\t</FN><LN>\t</LN><MI>\t</MI><AD>\t</AD><CT>\t</CT><ST>\t</ST><ZC>\t</ZC></UI>';

 var BILLING_CART			= 'Billing';
 var BILLING_TRANS_CODE		= 'BTC';
 var BILLING_ACCOUNT_NUMBER	= 'BAN';
 var BILLING_PAYMENT_METHOD	= 'BPM';
 var BILLING_SERVICE		= 'BS';
 var BILLING_SERVICE_DESCRIPTION= 'BSD';
 var BILLING_PERIOD			= 'BPd';
 var BILLING_DUE_DATE		= 'BDD';
 var BILLING_TRANS_DATE		= 'BTD';
 var BILLING_TIME_STAMP		= 'BTS';
 var BILLING_AMOUNT			= 'BA';
 var BILLING_PAST_CHARGES	= 'BPC';
 var BILLING_PAYMENT		= 'BPt';
 var BILLING_PROCESSING_FEE	= 'BPF';
 var BILLING_TOTAL_PAYMENT	= 'BTP';
 var BILLING_BILLER_INFO	= 'BBI';
 var BILLING_OPERATOR_ID	= 'BOID';
 var BILLING_BILLER_MERC_ID	= 'BBMID';
 var BILLING_BILLER_MERC_PWD	= 'BBMPWD';
 
 var POST_MAIL_BILL_TO		= 'PMBT';
 var POST_PAYMENT_NOTIFICATION_TO = 'PPNT';

 var ECOM_ACCOUNT_NUMBER= 'EAN';
 var ECOM_TRANS_CODE	= 'ETC';
 var ECOM_PAYMENT_METHOD= 'EPM';
 var ECOM_CART_COUNT	= 'ECC';
 var ECOM_CART_ITEM	= 'ECI';
 var ECOM_TRANS_DATE	= 'ETD';
 var ECOM_TIME_STAMP	= 'ETS';
 var TRANSACTION	= 'Transaction';
 var ECOM_CART		= 'EC';
 var ECOM_PROCESSING_FEE= 'EPF';
 var ECOM_TOTAL_AMOUNT	= 'ETA';
 var ECOM_BILLER_INFO	= 'EBI';
 var ECOM_OPERATOR_ID	= 'EOID';
 var ECOM_MERCHANT_ID	= 'EBMID';
 var ECOM_MERCHANT_PWD	= 'EBMPWD';
 var MAX_ECOM_CART_FIELDS = 5;
 var PROCESSING_FEE	= 1.00;
 var PROCESSING_FEE_PERCENTAGE	= .01;

 var MSIE	= 'MSIE';
 var FIREFOX	= 'FIREFOX';
 var CHROME	= 'CHROME';
 var SAFARI	= 'SAFARI';
 var OPERA	= 'OPERA';
 var OPERA_MINI = 'OPERA MINI';


 function Update_UI_XML(XML_UI_String)
 {
    //UI Info
    var objFirstName		= document.getElementById('First_Name');
    var objMidInitial		= document.getElementById('Middle_Initial');
    var objLastName		= document.getElementById('Last_Name');
    var objAddress		= document.getElementById('Address');
    var objCity			= document.getElementById('City');
    var objState		= document.getElementById('State');
    var objZipCode		= document.getElementById('Zip_Code');

    var szAlert			=  ('objFirstName == ' + objFirstName + '\n');
    szAlert			+= ('objMidInitial == ' + objMidInitial + '\n');
    szAlert			+= ('objLastName == ' + objLastName + '\n');
    szAlert			+= ('objAddress == ' + objAddress + '\n');
    szAlert			+= ('objCity == ' + objCity + '\n');
    szAlert			+= ('objState == ' + objState + '\n');
    szAlert			+= ('objZipCode == ' + objZipCode + '\n');
    //alert(szAlert);

    if (objFirstName && objMidInitial && objLastName && 
         objAddress && objCity && objState && objZipCode)
    {
       //UI Info 
       var szXML_UI	= SetTag(XML_UI_String, 'FN',	objFirstName.value);
       szXML_UI		= SetTag(szXML_UI, 'MI',	objMidInitial.value);
       szXML_UI		= SetTag(szXML_UI, 'LN',	objLastName.value);
       szXML_UI		= SetTag(szXML_UI, 'AD',	objAddress.value);
       szXML_UI		= SetTag(szXML_UI, 'CT',	objCity.value);
       szXML_UI		= SetTag(szXML_UI, 'ST',	objState.value);
       szXML_UI		= SetTag(szXML_UI, 'ZC',	objZipCode.value);
       //alert(szXML_UI);

       return szXML_UI;
    }  

    return null;    
 }

 function GetTag(XMLString, Tag)
 {
   var bValidParams	= XMLString.length > 0 && Tag.length > 0;

   if (bValidParams)
   {

     var STag		= '<' + Tag + '>';
     var ETag		= '</' + Tag + '>';
     var nSTag		= XMLString.indexOf(STag);

     if (nSTag > -1)
     { 
       nSTag		+= STag.length;
       var nETag	=  XMLString.indexOf(ETag, nSTag);

       if (nETag > -1)
       {
          var FTag	= XMLString.substr(nSTag, (nETag - nSTag));
          return FTag;
       } 
     }
   }

  return '';
}

function SetTag(XMLString, Tag, NewValue)
{
  //alert("Tag==" + Tag);
  var TagVal	= GetTag(XMLString, Tag);
  var OldVal	= "<" + Tag + ">" + TagVal + "</" + Tag + ">";
  var NewVal	= "<" + Tag + ">" + NewValue + "</" + Tag + ">";

  var NewXMLString	= XMLString.replace(OldVal, NewVal);
  
  return NewXMLString;
}

function CalculateProcessingFee(BillingAmount)
{
  //alert('here 2');
  var bValidIn		= IsNumeric(BillingAmount);
  var ProcessingFee 	= PROCESSING_FEE;

  if (bValidIn)
  {
     ProcessingFee		= BillingAmount * PROCESSING_FEE_PERCENTAGE;
     var bValidProcessingFee	= ProcessingFee > 1;

     if (!bValidProcessingFee)
        ProcessingFee		= PROCESSING_FEE;
  }
  return Number(ProcessingFee).toFixed(2);
}

function GetProcessingFeePct()
{
  return Number(PROCESSING_FEE_PERCENTAGE * 100).toFixed(2);
}

function IsNumeric(NumValue)
{
   var str_len	= String(NumValue).length;
   var bDecimal = false; 
   if(str_len==0) return false;
   for (var ch=0; ch<str_len; ++ch)
   {
     var ch_val = String(NumValue).charAt(ch);
     if(isNaN(parseInt(ch_val)))
     {
       if(ch_val.indexOf(".")!=-1 && bDecimal==false) 
         bDecimal=true;
       else
         return false;
     }
   }
   return true;
}
/////////////////////////////////////////////////////////////////////////////////////////
//
// This function disables the right click event
//
//	Parameters:	object event		The event to trap
//	Returns:	None
//
//	Author:		James L. Lainé
//	Date Imp:	03.29.2008
//	Version:	1.0
//	Notes:		Version 1.0 - Initial implementation
//				
/////////////////////////////////////////////////////////////////////////////////////////
 var whiteSpaceChars 	= '\n\f\r\t\v ';

 function RTrim(str)
 {
   if (str.length==0)
      return "";

   var strRet;

   var lastChar = str.charAt(str.length - 1);

   if(whiteSpaceChars.indexOf(lastChar) > -1)
     strRet = RTrim(str.substr(0, str.length - 1));
   else
     return str;
    
   return strRet;
 }

 function LTrim(str)
 {
   if (str.length==0)
      return "";

   var strRet;

   var firstChar = str.charAt(0);

   if(whiteSpaceChars.indexOf(firstChar) > -1)
     strRet = LTrim(str.substr(1));
   else
     return str;
    
   return strRet;
 }

 function Trim(str)
 {
   if (str.length==0)
      return "";

    var strRet = LTrim(str);
    strRet     = RTrim(strRet);

    return strRet;
 }

 function GrowFormBody(groupName, growBy)
 {
   var DivTags  = document.getElementsByTagName('div');
   var nNumDivTags =  DivTags.length;
   var tag;

   for (tag=0; tag < nNumDivTags - 1; tag++)
   {
     if (DivTags[tag].name)
     {
       if(DivTags[tag].name == 'bl' + groupName || DivTags[tag].name == 'br' + groupName || DivTags[tag].name == 'bd' + groupName)
       {
         DivTags[tag].style.height = String(parseInt(DivTags[tag].style.height) + growBy) + 'px';
       }
     }
   }
  }

  function AddMultipleSelectionControls(tableName, rowIndex, dataIndex, colSpan, returnAnchor, returnPrompt, paddingLeft)
  {
    var MSCCCell;
    var UpdateActionItem0 = "return UpdateActionItems('" + tableName + "_chkDoActions', 0, " + rowIndex + ");";
    var UpdateActionItem1 = "return UpdateActionItems('" +tableName + "_chkDoActions', 1, " + rowIndex + ");";
    var ConfirmAction0    = "return ConfirmAction('" + tableName + "_chkDoActions', 0, " + rowIndex + ", " + dataIndex + ", 0);";
    var ConfirmAction1    = "return ConfirmAction('" + tableName + "_chkDoActions', 1, " + rowIndex + ", " + dataIndex + ", 0);";

    var MSCCCellObj  = "<img style=\"padding-left:3px; padding-right:10px\" src=\"images/ActionArrow.PNG\" width=\"29px\" height=\"21px\">\r\n";
    MSCCCellObj     += "<a href=\"...\" id=\"ActionCheckAll\"  style=\"font-size:small\" onclick=\"" + UpdateActionItem1 + "\"><strong>Check All</strong></a> \\ <a href=\"...\" id=\"ActionUncheckAll\"  style=\"font-size:small\" onclick=\"" + UpdateActionItem0 + "\"><strong>Uncheck All</strong></a>\r\n";
    MSCCCellObj     += "&nbsp;&nbsp;&nbsp;<i>With Selected:</i>\r\n";
    MSCCCellObj     += "<input id=\"button_delete\" type=\"image\" name=\"submit_mult_delete\" value=\"Delete\" title=\"Delete\" src=\"images/BTN_DELETE_MULTI_16.PNG\" onclick=\"" + ConfirmAction0 + "\"/>\r\n";
    MSCCCellObj     += "<input style=\"margin-left:15px\" id=\"button_edit\" type=\"image\" name=\"submit_mult_edit\" value=\"Edit\" title=\"Edit\" src=\"images/BTN_EDIT_MULTI_16.PNG\" onclick=\"" + ConfirmAction1 + "\"/>\r\n";

    if (returnAnchor.length > 0 && returnPrompt.length > 0)
    {
      MSCCCellObj   += "<a id='" + tableName + "_returnAnchor' name='" + tableName + "_returnAnchor' style='font-size:small' href='" + returnAnchor + "'><img style='margin-left:" + paddingLeft + "px; margin-right:5px; display:inline; border:none' height='22' width='18' src='images/RETURN_TO.PNG'/>" + returnPrompt + "</a>";
    }
    else
    {
      if (rowIndex > 1)
      {
        var objAnchor = document.getElementById(tableName + '_returnAnchor');

        if (objAnchor)
        {
          var innerHTML = objAnchor.innerHTML;
          returnAnchor  = objAnchor.href;
          MSCCCellObj   += "<a id='" + tableName + "_returnAnchor' name='" + tableName + "_returnAnchor' style='font-size:small' href='" + returnAnchor + "'>" + innerHTML + "</a>";
         }
      } 
   }
 
    if (rowIndex > 1)
    {
       MSCCCell  = document.getElementById(tableName + '_MultipleSelectionControlsCell');
    }
    else
    {
      var NewRowIndex         = document.getElementById(tableName).rows.length;
      var NewRow              = document.getElementById(tableName).insertRow(NewRowIndex);
      var NewRowHeight        = '30px';
      var NewRowPaddingTop    = '10px';

      NewRow.style.fontSize      = "small";
      NewRow.id                  = tableName + '_MultipleSelectionControlsRow';
      NewRow.name                = tableName + '_MultipleSelectionControlsRow';
      NewRow.style.height        = NewRowHeight; 
      NewRow.style.paddingTop    = NewRowPaddingTop;
      NewRow.style.paddingBottom = 0;

      MSCCCell	                   = NewRow.insertCell(0);
      MSCCCell.id                  = tableName + '_MultipleSelectionControlsCell';
      MSCCCell.name                = tableName + '_MultipleSelectionControlsCell';
      MSCCCell.colSpan             = colSpan;
      MSCCCell.style.paddingTop    = NewRowPaddingTop;
      MSCCCell.style.paddingBottom = 0;
      MSCCCell.style.backgroundColor = '#c0c0c0'; //'#ebffff';

      GrowFormBody('_manAcc', (parseInt(NewRowHeight) + parseInt(NewRowPaddingTop)));
    }

    if (MSCCCell) 
      MSCCCell.innerHTML = MSCCCellObj; 
  }

function disableRightClick(event)
{
  var message = "Right click has been disabled.";
  
  if(!document.rightClickDisabled) // initialize
  {
    if(document.layers) 
    {
      document.captureEvents(Event.MOUSEDOWN);
      document.onmousedown = disableRightClick;
    }
    else document.oncontextmenu = disableRightClick;
    return document.rightClickDisabled = true;
  }

  if(document.layers || (document.getElementById && !document.all))
  {
    if (event.which==2 || event.which==3)
    {
      alert(message);
      return false;
    }
  }
  else
  {
    alert(message);
    return false;
  }
}

/////////////////////////////////////////////////////////////////////////////////////////
//
// This function launches the Add a Favorite tool window, and adds a new page
// defined by urlAddress and pageTitle
//
//	Parameters:	string urlAddress	The URL of the page to add
//			string pageTitle	The page's description
//	Returns:	None
//
//	Author:		James L. Lainé
//	Date Imp:	03.29.2008
//	Version:	1.0
//	Notes:		Version 1.0 - Initial implementation
//				
/////////////////////////////////////////////////////////////////////////////////////////
function BookmarkPage(urlAddress, pageTitle)
{
  if (window.external)
  {
   window.external.AddFavorite(urlAddress, pageTitle);
  }
  else
  { 
   alert("Sorry! Your browser doesn't support this function.");
  }
}

/////////////////////////////////////////////////////////////////////////////////////////
//
// This function prints the page displayed in the browser
//
//	Parameters:	object thisDocument	The current document
//	Returns:	None
//
//	Author:		James L. Lainé
//	Date Imp:	03.29.2008
//	Version:	1.0
//	Notes:		Version 1.0 - Initial implementation
//				
/////////////////////////////////////////////////////////////////////////////////////////
function PrintThisPage(thisDocument) 
{ 
  print(thisDocument); 
}

/////////////////////////////////////////////////////////////////////////////////////////
//
// This function attempts to find an object within the specified document
//
//	Parameters:	string szObjToFind	The object to find
//			Object thisDocument	The HTML document to search or NULL
//	Returns:	Object objFound		The object found within the document
//
//	Author:		James L. Lainé
//	Date Imp:	03.29.2008
//	Version:	1.0
//	Notes:		Version 1.0 - Initial implementation
//				
/////////////////////////////////////////////////////////////////////////////////////////
function AGN_findObj(szObjToFind, thisDocument) 
{
  var nIndexOf;			//function IndexOf return value
  var nObj;			//Object iterator	
  var objFound;  		//Holds object to return if found within the document

  if (!thisDocument) 		//If document argument was not passed
     thisDocument = document;	//Assign a default document  

  if ((nIndexOf = szObjToFind.indexOf("?")) > 0 && parent.frames.length) 
  {
    thisDocument	= parent.frames[szObjToFind.substring(nIndexOf + 1)].document; 
    szObjToFind		= szObjToFind.substring(0, nIndexOf);
  }
  
  //Search the document for the object
  if(!(objFound = thisDocument[szObjToFind]) && thisDocument.all)
    objFound	= thisDocument.all[szObjToFind]; 

  //Search through the documents forms
  for (nObj = 0;!objFound && nObj < thisDocument.forms.length; nObj++) 
      objFound	= thisDocument.forms[nObj][szObjToFind];

  //Search throught the document's layers
  for (nObj = 0;!objFound && thisDocument.layers && nObj < thisDocument.layers.length; nObj++)
      objFound	= AGN_findObj(szObjToFind, thisDocument.layers[nObj].document);

  //Finally use getElementByid
  if (!objFound && thisDocument.getElementById) 
     objFound	= thisDocument.getElementById(szObjToFind); 

  return objFound;
}

/////////////////////////////////////////////////////////////////////////////
//
// This form should utilize the power of regular expressions to validate
// emails and phone numbers. At present to get this page going will refactor
// this code for self-documentation only.
//
//	Parameters:	None
//	Returns:	None
//
//	Author:		James L. Lainé
//	Date Imp:	03.29.2008
//	Version:	1.0
//	Notes:		Version 1.0 - Initial implementation
//			A form's object is passed to this function in the
//			following manner:
//			0.	object name
//			1.	undefined
//			2.	object test criteria
//                      Make sure the the object's id and name variables
//                      have been set.
//
/////////////////////////////////////////////////////////////////////////////
var bSilentFormValidation             = false;
var SilentFormValidationErrorMessage  = '';
function AGN_validateForm() 
{
  var vFuncArgs		= AGN_validateForm.arguments;
  var nFuncArgIndex;   					//Index to vFuncArgs
  var objVal;						//Holds the object returned by AGN_findObj
							//then if it is not NULL holds the object's value
  var objValName;					//Holds the name of the object found
  var objTestCriteria;					//Contains various test criterias defined for the object
  var nIndexOf;						//Function IndexOf return value
  var numValue;						//If the object is supposed to return a numerical value
  var minRange;						//If objTestCriteria contains 'inRange' the minimum range
  var maxRange;						//If objTestCriteria contains 'inRange' the maximum range
  var szErrors		= '';				//Error string

  //iterate through the function's argument list and validate form objects
  for (nFuncArgIndex = 0; nFuncArgIndex < (vFuncArgs.length - 2); nFuncArgIndex+=3)
  { 
    objVal		= AGN_findObj(vFuncArgs[nFuncArgIndex]);

    if (objVal)
    { 
      objTestCriteria	= vFuncArgs[nFuncArgIndex + 2];
      objValName	= objVal.name;

      //if it is not blank then process
      if ((objVal = objVal.value) != "") 
      {
        //if it is not blank - is it an email address field?
        if (objTestCriteria.indexOf('isEmail') != -1)
        {

          var MyEmail		= objVal;
          var bValidEmail	= MyEmail.match(/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.(?:[a-zA-Z]|aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|us|AERO|ASIA|BIZ|CAT|COM|COOP|EDU|GOV|INFO|INT|JOBS|MIL|MOBI|MUSEUM|NAME|NET|ORG|PRO|TEL|TRAVEL|US)$/);

/*
          var nIndexOfAt	= objVal.indexOf('@');
          var nIndexOfDot	= objVal.indexOf('.');
         
          var bValidEmail	= nIndexOfAt < nIndexOfDot && nIndexOfAt != -1 && nIndexOfDot != -1 && nIndexOfDot - nIndexOfAt > 1;

          if (bValidEmail)
          {
             var arrSplitAt	= objVal.split("@");
             var arrSplitDot    = objVal.split(".");

             bValidEmail	= arrSplitAt.length == 2 && arrSplitDot.length == 2;
 
             if (bValidEmail)
             {
                bValidEmail	= arrSplitDot[1].length >= 2 && isNaN(arrSplitAt[0].charAt(0));
             }
          }
*/

          if (!bValidEmail) 
             szErrors+='- '+ objValName +': Must contain an e-mail address i.e. support@ticketingsystems.com\n';
        }
        else if (objTestCriteria.indexOf('isNumeric') != -1) //Is it a decimal or non decimal - numeric value field? 
        {
          numValue = parseFloat(objVal);
          //It is supposed to be a numeric value field - is it?
          if (isNaN(objVal))                                
             szErrors+= '- ' + objValName + ': Must contain a numeric value.\n';
          
          if (objTestCriteria.indexOf('inRange') != -1)
          {
            nIndexOf	= objTestCriteria.indexOf(':');
            minRange	= objTestCriteria.substring(8, nIndexOf); 
            maxRange	= objTestCriteria.substring(nIndexOf + 1);
            if (numValue < minRange || maxRange < numValue)
               szErrors+= '- '+ objValName +': Must contain a number between ' + minRange + ' and ' + maxRange +'.\n';
          }
        }
        else if (objTestCriteria.indexOf('isInteger') != -1) //Is it a non decimal - numeric value field? 
        {
          //It is supposed to be a numeric value field - is it?
          if (isNaN(objVal))                                
             szErrors+= '- ' + objValName + ': Must contain a non-decimal numeric value, i.e. 10, 20 30, etc...\n';
          else
          {
             var nIndexOfDot	= objVal.indexOf('.');
             if (nIndexOfDot != -1)
                szErrors+= '- ' + objValName + ': Must contain a non-decimal numeric value, i.e. 10, 20 30, etc...\n';
          }
          
          if (objTestCriteria.indexOf('inRange') != -1)
          {
            nIndexOf	= objTestCriteria.indexOf(':');
            minRange	= objTestCriteria.substring(8, nIndexOf); 
            maxRange	= objTestCriteria.substring(nIndexOf + 1);
            if (numValue < minRange || maxRange < numValue)
               szErrors+= '- '+ objValName +': Must contain a number between ' + minRange + ' and ' + maxRange +'.\n';
          }
        }
        else if (objTestCriteria.indexOf('isTelephone') != -1) //Is it a telephone value field? 
        {
           var szTempTel	= objVal;
           szTempTel		= szTempTel.replace(" ", "");
           szTempTel		= szTempTel.replace(" ", "");
           szTempTel		= szTempTel.replace("(", "");
           szTempTel		= szTempTel.replace(")", "");
           szTempTel		= szTempTel.replace("-", "");
           szTempTel		= szTempTel.replace("-", "");
           szTempTel		= szTempTel.replace(".", "");
           szTempTel		= szTempTel.replace(".", "");
           szTempTel		= szTempTel.replace(",", "");
           szTempTel		= szTempTel.replace(",", "");
           szTempTel		= szTempTel.replace("*", "");
           szTempTel		= szTempTel.replace("*", "");
	
           var bValidLength	= szTempTel.length == 10;
           var bValidConversion	= !isNaN(szTempTel);

           var bValidTelephone	= bValidLength && bValidConversion;

           if (bValidTelephone)
           {
	      bValidTelephone = szTempTel != "1234567890" && szTempTel != "0987654321" &&
                                szTempTel != "1111111111" && szTempTel != "2222222222" &&  
                                szTempTel != "3333333333" && szTempTel != "4444444444" &&  
                                szTempTel != "5555555555" && szTempTel != "6666666666" &&  
                                szTempTel != "7777777777" && szTempTel != "8888888888" &&  
                                szTempTel != "9999999999" && szTempTel != "0000000000";
           }
 
	   if (!bValidTelephone)       
	      szErrors+= '- '+ objValName +': please enter a 10 digit telephone number. i.e. (760) 480-1002 \n';
           else
           {
              objVal		= AGN_findObj(vFuncArgs[nFuncArgIndex]);
              if (objVal)
              {
                objVal.value = "(" + szTempTel.substring(0,3) + ") " + szTempTel.substring(3,6) + "-" + szTempTel.substring(6);
              }
           }
        }
        else if (objTestCriteria.indexOf('isDate') != -1) //Is it a Date value field? 
        {
           var szTempDate	= objVal;
           var nCheckDate	= Date.parse(szTempDate);
           var bValidDate	= !isNaN(nCheckDate);

           if (!bValidDate)
           {
              szErrors+= '- '+ objValName +': Enter a valid date. i.e. mm/dd/yyyy use a 4 digit year and / as seperator.\n';
           }
           else
           {
              var szaDateParts	= new Array();
              szaDateParts	= szTempDate.split('/');
              bValidDate	= (szaDateParts.length == 3);

              if (!bValidDate)
              {
                 szErrors+= '- '+ objValName +': Enter a valid date. i.e. mm/dd/yyyy use a 4 digit year and / as seperator.\n';
              }
              else
              {
                 bValidDate 	= (szaDateParts[0].length >= 1 && szaDateParts[1].length >= 1 && szaDateParts[2].length == 4);

                 if (!bValidDate)
                 {
                    szErrors+= '- '+ objValName +': Enter a valid date. i.e. mm/dd/yyyy use a 4 digit year and / as seperator.\n';
                 }
                 else
                 {
                    var dtCheckDate	= new Date(nCheckDate);
                    var szCheckDate     = String(dtCheckDate.getMonth() + 1) + "/" + String(dtCheckDate.getDate()) + "/" + String(dtCheckDate.getFullYear());
                    var szCheckDate2    = String(Number(szaDateParts[0])) + "/" + String(Number(szaDateParts[1])) + "/" + String(Number(szaDateParts[2]));

                    bValidDate		= (szCheckDate2 == szCheckDate);

                    if (!bValidDate)
                    {
                       szErrors+= '- '+ objValName +': Enter a valid date. i.e. mm/dd/yyyy use a 4 digit year and / as seperator.\n';
                    }
                    else
                    {
                       objVal		= AGN_findObj(vFuncArgs[nFuncArgIndex]);
                       if (objVal)
                       {
                         objVal.value = szCheckDate2;
                       }
                    }
                 }
              }
           }

        }
        else if (objTestCriteria.indexOf('isZipcode') != -1) //Is it a zipcode field? 
        {
           var szTempZip	= objVal;
           szTempZip		= szTempZip.replace(" ", "");
           szTempZip		= szTempZip.replace("-", "");

           var bValidLength	= szTempZip.length == 5 || szTempZip.length == 9;
           var bValidConversion	= !isNaN(szTempZip);
           var bvalidZipcodeVal = szTempZip != "00000" && szTempZip != "11111" &&
                                  szTempZip != "22222" && szTempZip != "33333" && 
                                  szTempZip != "44444" && szTempZip != "55555" && 
                                  szTempZip != "66666" && szTempZip != "77777" && 
                                  szTempZip != "88888" && szTempZip != "99999" && 
                                  szTempZip != "111111111" && szTempZip != "222222222" &&  
                                  szTempZip != "333333333" && szTempZip != "444444444" &&  
                                  szTempZip != "555555555" && szTempZip != "666666666" &&  
                                  szTempZip != "777777777" && szTempZip != "888888888" &&  
                                  szTempZip != "999999999" && szTempZip != "000000000";

           var bValidZipcode	= bValidLength && bValidConversion && bvalidZipcodeVal;

           if (!bValidZipcode)
              szErrors+= '- '+ objValName +': please enter a 5 or 9 digit zipcode. i.e. 92025 or 92025-5248 \n';
           else
           {
              objVal		= AGN_findObj(vFuncArgs[nFuncArgIndex]);
              if (objVal)
              {
                if (szTempZip.length == 9)
                  objVal.value = szTempZip.substring(0,5) + "-" + szTempZip.substring(5);
                else
                  objVal.value = szTempZip;
              }
           } 
        }
        else if (objTestCriteria.indexOf('isCustomerID') != -1) //Is it a customer ID field? 
        {
           var szCustomerID	= objVal;
           var bValidCustomerID	= false;

           //validate customer ID
           // Must start with oneof the following
           //1.	C0- to Cn-, n<=20
           //2. MERCCC- 
           //3.	RS:SRV-
           //4. RS:CLNT-
           //5.	OPOS-
           //5.	MGC-

           //validate multiPOS
           if (szCustomerID.indexOf('C') == 0)
           {
              var nComputer = 0;
              for (nComputer=0; nComputer <=20; ++nComputer)
              {
                bValidCustomerID = szCustomerID.indexOf('C'+ nComputer + '-') == 0;
                if (bValidCustomerID)
                   break;
              }
           }
           else if (szCustomerID.indexOf('MERCCC-') == 0) 
           {
             bValidCustomerID = true;
           }
           else if (szCustomerID.indexOf('RS:SRV-') == 0) 
           {
             bValidCustomerID = true;
           }
           else if (szCustomerID.indexOf('RS:CLNT-') == 0) 
           {
             bValidCustomerID = true;
           }
           else if (szCustomerID.indexOf('OPOS-') == 0) 
           {
             bValidCustomerID = true;
           }
           else if (szCustomerID.indexOf('MGC-') == 0) 
           {
             bValidCustomerID = true;
           }
           else if (szCustomerID.indexOf('NC-') == 0) 
           {
             bValidCustomerID = true;
           }

           if(!bValidCustomerID)
           {
             szErrors+='- '+ objValName +': You have entered an unrecognized Customer Number or ID.\n';
           } 
        }
        //At this point it is neither an:
        //  1.	email address 
	//  2,	numeric value 
	//  3.	telephone number
	//  4.  date
	//  4.  zipcode
        //  5.  CustomerID
        //  field it must therefore default to a text field 
      } 
      else if (objTestCriteria.charAt(0) == 'R') //if it is blank - is it a required field?
        szErrors += '- '+ objValName +' is required.\n'; 
    }
  }

  if (szErrors)
  {
     if (bSilentFormValidation == false) 
        alert('The following error(s) occurred:\n'+szErrors);
     else
        SilentFormValidationErrorMessage = szErrors;
  }

  document.AGN_returnValue = (szErrors == '');
  bSilentFormValidation = false;

  return document.AGN_returnValue;
}

/////////////////////////////////////////////////////////////////////////////////////////
//
// This function validates state and US territory initials
//
//	Parameters:	string szStateInitials	The initials to validate
//	Returns:	boolean
//
//	Author:		James L. Lainé
//	Date Imp:	03.30.2008
//	Version:	1.0
//	Notes:		Version 1.0 - Initial implementation
//				
/////////////////////////////////////////////////////////////////////////////////////////
function AGN_ValidateState(szStateInitials)
{
  //Validate function parameters
  var bValidFuncParam = (szStateInitials.length > 0);

  if (bValidFuncParam)
  {
    var szAllStates = "AL,AK,AS,AZ,AR,CA,CO,CT,DE,DC,FM,FL,GA,GU,HI,ID,IL,IN,IA,KS,KY,LA,ME,MH,MD,MA,MI,MN,MS,MO,MT,NE,NV,NH,NJ,NM,NY,NC,ND,MP,OH,OK,OR,PW,PA,PR,RI,SC,SD,TN,TX,UT,VT,VI,VA,WA,WV,WI,WY";
    bValidFuncParam = (szAllStates.indexOf(szStateInitials) != -1);
  }  

  return bValidFuncParam;
}

/////////////////////////////////////////////////////////////////////////////////////////
//
// This function converts state and US territory initials to the state and territory name
//
//	Parameters:	string szStateInitialsToConvert	The state initials to convert
//	Returns:	string				The state string
//
//	Author:		James L. Lainé
//	Date Imp:	03.30.2008
//	Version:	1.0
//	Notes:		Version 1.0 - Initial implementation.
//				
/////////////////////////////////////////////////////////////////////////////////////////
function AGN_ConvertStateInitialsToString(szStateInitialsToConvert)
{
  var bValidFuncParam = (szStateInitialsToConvert.length > 0);
  var szNoConversion = "";

  //Validate function parameters
  if (bValidFuncParam)
  {
    //Validate function parameters
    var bValidFuncParamContent = AGN_ValidateState(szStateInitialsToConvert);
    
    if (bValidFuncParamContent)
    {
       if (szStateInitialsToConvert == "AL") return "ALABAMA";
       if (szStateInitialsToConvert == "AK") return "ALASKA";
       if (szStateInitialsToConvert == "AS") return "AMERICAN SAMOA";
       if (szStateInitialsToConvert == "AZ") return "ARIZONA";
       if (szStateInitialsToConvert == "AR") return "ARKANSAS";
       if (szStateInitialsToConvert == "CA") return "CALIFORNIA";
       if (szStateInitialsToConvert == "CO") return "COLORADO";
       if (szStateInitialsToConvert == "CT") return "CONNECTICUT";
       if (szStateInitialsToConvert == "DE") return "DELAWARE";
       if (szStateInitialsToConvert == "DC") return "DISTRICT OF COLUMBIA";
       if (szStateInitialsToConvert == "FM") return "FEDERATED STATES OF MICRONESIA";
       if (szStateInitialsToConvert == "FL") return "FLORIDA";
       if (szStateInitialsToConvert == "GA") return "GEORGIA";
       if (szStateInitialsToConvert == "GU") return "GUAM";
       if (szStateInitialsToConvert == "HI") return "HAWAII";
       if (szStateInitialsToConvert == "ID") return "IDAHO";
       if (szStateInitialsToConvert == "IL") return "ILLINOIS";
       if (szStateInitialsToConvert == "IN") return "INDIANA";
       if (szStateInitialsToConvert == "IA") return "IOWA";
       if (szStateInitialsToConvert == "KS") return "KANSAS";
       if (szStateInitialsToConvert == "KY") return "KENTUCKY";
       if (szStateInitialsToConvert == "LA") return "LOUISIANA";
       if (szStateInitialsToConvert == "ME") return "MAINE";
       if (szStateInitialsToConvert == "MH") return "MARSHALL ISLANDS";
       if (szStateInitialsToConvert == "MD") return "MARYLAND";
       if (szStateInitialsToConvert == "MA") return "MASSACHUSETTS";
       if (szStateInitialsToConvert == "MI") return "MICHIGAN";
       if (szStateInitialsToConvert == "MN") return "MINNESOTA";
       if (szStateInitialsToConvert == "MS") return "MISSISSIPPI";
       if (szStateInitialsToConvert == "MO") return "MISSOURI";
       if (szStateInitialsToConvert == "MT") return "MONTANA";
       if (szStateInitialsToConvert == "NE") return "NEBRASKA";
       if (szStateInitialsToConvert == "NV") return "NEVADA";
       if (szStateInitialsToConvert == "NH") return "NEW HAMPSHIRE";
       if (szStateInitialsToConvert == "NJ") return "NEW JERSEY";
       if (szStateInitialsToConvert == "NM") return "NEW MEXICO";
       if (szStateInitialsToConvert == "NY") return "NEW YORK";
       if (szStateInitialsToConvert == "NC") return "NORTH CAROLINA";
       if (szStateInitialsToConvert == "ND") return "NORTH DAKOTA";
       if (szStateInitialsToConvert == "MP") return "NORTHERN MARIANA ISLANDS";
       if (szStateInitialsToConvert == "OH") return "OHIO";
       if (szStateInitialsToConvert == "OK") return "OKLAHOMA";
       if (szStateInitialsToConvert == "OR") return "OREGON";
       if (szStateInitialsToConvert == "PW") return "PALAU";
       if (szStateInitialsToConvert == "PA") return "PENNSYLVANIA";
       if (szStateInitialsToConvert == "PR") return "PUERTO RICO";
       if (szStateInitialsToConvert == "RI") return "RHODE ISLAND";
       if (szStateInitialsToConvert == "SC") return "SOUTH CAROLINA";
       if (szStateInitialsToConvert == "SD") return "SOUTH DAKOTA";
       if (szStateInitialsToConvert == "TN") return "TENNESSEE";
       if (szStateInitialsToConvert == "TX") return "TEXAS";
       if (szStateInitialsToConvert == "UT") return "UTAH";
       if (szStateInitialsToConvert == "VT") return "VERMONT";
       if (szStateInitialsToConvert == "VI") return "VIRGIN ISLANDS";
       if (szStateInitialsToConvert == "VA") return "VIRGINIA";
       if (szStateInitialsToConvert == "WA") return "WASHINGTON";
       if (szStateInitialsToConvert == "WV") return "WEST VIRGINIA";
       if (szStateInitialsToConvert == "WI") return "WISCONSIN";
       if (szStateInitialsToConvert == "WY") return "WYOMING";
    }
  }
  
  return szNoConversion;
}

/////////////////////////////////////////////////////////////////////////////////////////
//
// This function creates an under constrution message for the state selected
//
//	Parameters:	string szStateInitialSelected	The initials to create the message for
//	Returns:	None
//
//	Author:		James L. Lainé
//	Date Imp:	03.30.2008
//	Version:	1.0
//	Notes:		Version 1.0 - Initial implementation
//				
/////////////////////////////////////////////////////////////////////////////////////////
function AGN_SelectStateMessage(szStateInitialSelected)
{
  var szMessage;
  var bValidFuncParam = (szStateInitialSelected.length > 0);
  var bValidFuncParamContent = false;

  //Validate function parameters
  if (bValidFuncParam)
  {
    //Validate function parameters
    bValidFuncParamContent = AGN_ValidateState(szStateInitialSelected);

    if (bValidFuncParamContent)
    {
      var szStateName = AGN_ConvertStateInitialsToString(szStateInitialSelected);
      szMessage = szStateName + " EVENTS AND VENUES:\r\n\r\n" + "This page is currently under construction.\r\n You will be able to select venues and events from the state of " + szStateName + " shorlty.\r\n\r\n Thank you for navigating our pages.";
    }
    else
    {
      szMessage = "You have selected an invalid state, please try again.";
    }
  }
  else
  {
     szMessage = "Please select a state.";
  }
   
  alert(szMessage);
}

/////////////////////////////////////////////////////////////////////////////////////////
//
// This function starts a demo .wmv file listed on the demo page
//
//	Parameters:	string szDemoToShow	The name of the demo to show
//			string szCtlTagId	The id of the img tag to replace
//	Returns:	None
//
//	Author:		James L. Lainé
//	Date Imp:	04.09.2008
//	Version:	1.1
//	Notes:		Version 1.0 - Initial implementation
//                      Version 1.1 - Added szImgTagId to differentiate where the call is 
//                                    coming from 
//				
/////////////////////////////////////////////////////////////////////////////////////////
function AGN_ShowVideoDemo(szCtlTagId, szDemoToShow)
{
  var bValidFuncParam = (szDemoToShow.length > 0);
  var bValidFuncParam2= (szCtlTagId.length > 0);
  
  if(bValidFuncParam) //Turn everything to lower case
     szDemoToShow = szDemoToShow.toLowerCase();

  var bValidFileType = (szDemoToShow.indexOf('.wmv') != -1) || (szDemoToShow.indexOf('.mpeg') != -1) || (szDemoToShow.indexOf('.mpg') != -1) || (szDemoToShow.indexOf('.mov') != -1) || (szDemoToShow.indexOf('.sfw') != -1);
  var imgVideoFound = false;
  var embVideoFound = false;

  var szErrMsg;
  if (bValidFuncParam && bValidFuncParam2 && bValidFileType)
  {
    if (document.getElementById)
    { 
      imgVideoFound = document.getElementById('img-' + szCtlTagId);

      if (imgVideoFound)
      {
        imgVideoFound.parentNode.innerHTML= '\x3Cembed id=\'emb-' + szCtlTagId + '\' src=\'' + szDemoToShow + '\' width=\'512\' height=\'456\' autostart=\'1\' showcontrols=\'1\' showstatusbar=\'1\' type=\'application/x-mplayer2\' pluginspage=\'http://www.microsoft.com/windows/windowsmedia/download/\'\x3E \x3C/embed\x3E';
      }
      else
      {
        if (!imgVideoFound)  
        {    
          embVideoFound = document.getElementById('emb-' + szCtlTagId);
          if (embVideoFound)
          { 
            embVideoFound.parentNode.innerHTML= '\x3Cimg name=\'img-' + szCtlTagId + '\' id=\'img-' + szCtlTagId + '\' src=\'images/video-control.png\' alt=\'img-video-control\' width=\'512px\' height=\'384px\'/\x3E';
            AGN_ShowVideoDemo(szCtlTagId, szDemoToShow);
          }
          else
          {
            szErrMsg = "An <img> parent tag with name and id equaling [video-control] has not been added to this page...";
            alert(szErrMsg);
          }
        }
      }
    }
  }
  else
  {
    if(!bValidFuncParam)
      szErrMsg = "Invalid function parameter, cannot be zero length...";
     
    if(bValidFuncParam && !bValidFileType)
      szErrMsg = szDemoToShow + " is an unrecognized flash extension.";

   alert(szErrMsg); 
  }
 }

 function AGN_AlertLogin()
 {
    alert("Please Login!");
    document.AGN_returnValue = false;
 }

 var numMenus=4;

 function expandByID(divId, tdId, aId, DisplayTab)
 {
  for (i=1; i<=numMenus;++i)
  {
    var menuDivId = "Menu" + i;
    var menuTDId  = "td" + i;
    var menuAId   = "a" + i;	 
    collapseByID(menuDivId, menuTDId, menuAId, i);

    if (DisplayTab == i)
    {
      var dmh = "div_message_head" + i;
      var dmb = "div_message_body" + i;
   
      var div_message_head = document.getElementById(dmh);
      if (div_message_head)
         div_message_head.className = "messageHeadHover";

      var div_message_body = document.getElementById(dmb);
      if (div_message_body)
         div_message_body.className = "messageBodyHover";
    }
  }
		
  var div = document.getElementById(divId);
  div.className = "menuHover";

  var td = document.getElementById(tdId);
  td.className = "menuHover";

  var a = document.getElementById(aId);
  a.className  = "menuHover";

  return false;
 }
	
 function collapseByID(divId, tdId, aId, i)
 {
   var div = document.getElementById(divId);
   div.className = "menuNormal";

   var td = document.getElementById(tdId);
   td.className = "menuNormal";
 
   var a  = document.getElementById(aId);
   a.className = "menuNormal";

   var dmh = "div_message_head" + i;
   var dmb = "div_message_body" + i;
   
   var div_message_head = document.getElementById(dmh);
   if (div_message_head)
      div_message_head.className = "messageHeadNormal";

   var div_message_body = document.getElementById(dmb);
   if (div_message_body)
      div_message_body.className = "messageBodyNormal";
  
  return false;
 }

  var CITEM	= 0;
  var CUPC	= 1;
  var CQTY	= 2;
  var CPRICE	= 3;
  var CSTOTAL	= 4;

  function ValidateECom_Cart(XMLString)
  {
     //Validate Counts
     var CartCount	= GetTag(XMLString, ECOM_CART_COUNT);
     var CartSet	= GetTag(XMLString, ECOM_CART);
     var bValidEComCart	= false;
     var subTotal	= 0;
  
     for (var nItem = 0; nItem < CartCount; ++nItem)
     {
       var arrItem	= GetCartItem(CartSet, CartCount, nItem);

       if (arrItem)
       {
          if (arrItem.length == MAX_ECOM_CART_FIELDS);
          {
             bValidEComCart = arrItem[CITEM].length > 0 && Number(arrItem[CQTY]) > 0 && (Number(arrItem[CQTY]) * Number(arrItem[CPRICE]) == Number(arrItem[CSTOTAL]));

             if (!bValidEComCart)
             {
                SilentFormValidationErrorMessage = arrItem[CITEM] + "\t\t" + arrItem[CQTY] + "\t\t$" + Number(arrItem[CPRICE]).toFixed(2) + "\t\t$" + Number(arrItem[CSTOTAL]).toFixed(2);
                break;
             }

             subTotal += Number(arrItem[CSTOTAL]);
          }
       }
     }

     if (bValidEComCart)
     {
        var objSubTotal	= document.getElementById('Sub_Total');
       
        if (objSubTotal)
           bValidEComCart = Number(objSubTotal.value) == subTotal && subTotal > 0;
        else
           bValidEComCart = false;

        if (bValidEComCart)
        {
           var EComAccountNumber= GetTag(XMLString, ECOM_ACCOUNT_NUMBER);
           var EComTransCode	= GetTag(XMLString, ECOM_TRANS_CODE);
           var EComMerchantId	= GetTag(XMLString, ECOM_MERCHANT_ID);
           var EComMerchantPwd	= GetTag(XMLString, ECOM_MERCHANT_PWD);
           var EComBillerInfo	= GetTag(XMLString, ECOM_BILLER_INFO);
           var EComOperatorID	= GetTag(XMLString, ECOM_OPERATOR_ID);

           bValidEComCart	= EComMerchantId.length > 0 &&  EComMerchantPwd.length > 0 && EComBillerInfo.length > 0 &&
                                  EComOperatorID.length > 0 && EComAccountNumber.length > 0 && EComTransCode.length > 0;

           if (!bValidEComCart)
              SilentFormValidationErrorMessage = "Merchant information has been omitted from this submission."
        }
     }

     return bValidEComCart;
  }

  function ValidateBilling_Cart(XMLString)
  {
     var CartSet		= GetTag(XMLString, BILLING_CART);

     var BillingAccntNo		= GetTag(CartSet, BILLING_ACCOUNT_NUMBER);
     var BillingTransCode	= GetTag(CartSet, BILLING_TRANS_CODE);
     var BillingService		= GetTag(CartSet, BILLING_SERVICE);
     var BillingPeriod		= GetTag(CartSet, BILLING_PERIOD);
     var BillingDueDate		= GetTag(CartSet, BILLING_DUE_DATE);
     var BilllingAmount		= GetTag(CartSet, BILLING_AMOUNT);
     var BillingPastCharges	= GetTag(CartSet, BILLING_PAST_CHARGES);
     var BillingBillerInfo	= GetTag(CartSet, BILLING_BILLER_INFO);
     var BillingBillerMercId	= GetTag(CartSet, BILLING_BILLER_MERC_ID);
     var BillingBillerMercPwd	= GetTag(CartSet, BILLING_BILLER_MERC_PWD);

     var bValidBillingInfo	= BillingService.length > 0 && BillingPeriod.length > 0 && BillingDueDate.length > 0 && BilllingAmount.length > 0 && Number(BilllingAmount) > 0;
     var bValidBillingMercInfo	= BillingBillerMercId.length > 0 && BillingBillerMercPwd.length > 0 && BillingAccntNo.length > 0 && BillingTransCode.length > 0;
     var bValidBillingCart	= bValidBillingInfo && bValidBillingMercInfo;
                                  
    //Debug alerts
    //alert(BillingService); 
    //alert(BillingPeriod); 
    //alert(BillingDueDate); 
    //alert(BilllingAmount); 
    //alert(BillingBillerMercId); 
    //alert(BillingBillerMercPwd); 

    if (!bValidBillingCart)
    {
       if (!bValidBillingInfo)
          SilentFormValidationErrorMessage = "Invalid Billing Information - Missing Field.";

       if (!bValidBillingMercInfo)
       {
          if (SilentFormValidationErrorMessage.length > 0)
             SilentFormValidationErrorMessage += "\r\n";

          SilentFormValidationErrorMessage += "Merchant information has been omitted from this submission.";       
       } 
    }
    
    return bValidBillingCart;
  }


  function GetCartItem(CartSet, CartCount, nItem)
  {
    if (IsValidCartSet(CartSet, CartCount) && nItem >= 0 && nItem < CartCount)
    {
      var Item = GetTag(CartSet, ECOM_CART_ITEM + nItem);
      return Item.split('~');
    }

    return null;
  }

  function IsValidCartSet(CartSet, CartCount)
  {
     var bvalidCartSet		= CartCount > 0 && CartSet.length > 0;

     if (bvalidCartSet) 
     {
        var TCartSet		= CartSet;
        var nItemsDetected	= 0;

        for (var nItem = 0; nItem < CartCount; nItem++)
        {
           if (IsTagAvailable(TCartSet, ECOM_CART_ITEM + nItem))
           {
              var FTag		= GetTag(TCartSet, ECOM_CART_ITEM + nItem);
              TCartSet		= DeleteTag(TCartSet, ECOM_CART_ITEM + nItem);
              var ArrCItem	= FTag.split('~');

              if (ArrCItem.length == MAX_ECOM_CART_FIELDS)            
                 nItemsDetected++;
              else
                 break;
           }
           else
                break;
        }

        bvalidCartSet	= nItemsDetected == nItem && TCartSet.length == 0;
     }

     return bvalidCartSet;
  }

  function IsTagAvailable(XMLString, Tag)
  {
     var XMLTag	= GetTag(XMLString, Tag);

     return XMLTag.length > 0;
  }

  function DeleteTag(XMLString, Tag)
  {
    var TagVal	= GetTag(XMLString, Tag);
    var OldVal	= "<" + Tag + ">"  + TagVal + "</" + Tag + ">";
    var NewXMLString= XMLString.replace(OldVal, "");

    return NewXMLString;
  }

function popup(url, window_name) 
{
    //alert(url);
    var popup_window_name = new (String);

    if (window_name)
       popup_window_name=window_name;
    else
       popup_window_name = "window_all_purpose1";

    //alert(popup_window_name);
    
    var width  = screen.width; //800;

    if (popup_window_name=="window_display_bill_from_report1" || popup_window_name=="window_display_payment_proc_tech_spec1")
        width  = 800;

    var height = screen.height; //600;
    
    if (popup_window_name=="printer_popup")
    {
    	width  = screen.width;
    	height = screen.height;
    }
    
    var left    = (screen.width  - width)/2;
    var top     = (screen.height - height)/2;
    var params  = new String('width='+width+', height='+height);
    params 		+= ', top='+top+', left='+left;

    if (popup_window_name!="printer_popup")
    {
	    params += ', directories=no';
	    params += ', location=no'; 
	    params += ', scrollbars=yes';
	
	    if (popup_window_name=="window_display_bill_from_report1" || popup_window_name=="window_display_payment_proc_tech_spec1")
	       params += ', resizable=no';
	    else
	       params += ', resizable=yes';
	
	    params += ', menubar=no';
	    params += ', status=no';
	    params += ', toolbar=no';
    }
    else
    {
	    params += ', directories=yes';
	    params += ', location=yes'; 
	    params += ', scrollbars=yes';
	    params += ', resizable=yes';
	    params += ', menubar=yes';
	    params += ', status=yes';
	    params += ', toolbar=yes';
    }

    //alert(params);
    
    var newwin=window.open(url,popup_window_name, params);
    if (window.focus)
    {
       newwin.focus();
    }
    
    if (popup_window_name=="printer_popup")
    	return newwin;
    else
    	return false;
}

function esignature_popup(url) 
{
    //alert(url);

    var newwin=window.open(url, "", "width=690,height=590");
    if (window.focus)
    {
       newwin.focus();
    }
    return false;
}


/***************************************************************************
****************************************************************************
****************************************************************************

* CALENDAR FUNCTIONS

****************************************************************************
****************************************************************************
***************************************************************************/

var CALENDAR_MONTH_SELECTION	= new String("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec");
var CALENDAR_WEEK_DAYS			= new String("Sun,Mon,Tue,Wed,Thu,Fri,Sat");
var CALENDAR_STARTING_YEAR		= new Number(1900);
var CALENDAR_ENDING_YEAR		= new Number(2035);
var gArrCalMonths				= CALENDAR_MONTH_SELECTION.split(',');
var gArrCalWeekdays				= CALENDAR_WEEK_DAYS.split(',');
var gSelDate					= new Date();

function popup_calendar(theField)
{
    var newwin=window.open("https://www.bizznest.net/PHP Functions/calendar.php", "", "width=400,height=250");

    newwin.creator=self;

    theDateField = document.getElementById(theField);

    if (window.focus)
    {
       newwin.focus();
    }
    return false;
}

/***************************************************************************

* Javascript: Initialize the calendar, first time use only

***************************************************************************/
function init_calendar(szInSelDate)
{
	 //var szInSelDate	= new String(window.opener.document.getElementById('ODB_From_Date').value);
	 DrawCalHeaders();
	 var bValInSelDate	= validate_init_sel_date(szInSelDate);
	 
	 
	 var dtToday		= new Date();
	 var curMonth		= new Number(dtToday.getMonth());
	 var curYear		= new Number(dtToday.getFullYear());
	
	/*
	 if (bValInSelDate)
	   alert('change 3: ' + szInSelDate + ' is a valid date');
	 else
	   alert('change 3: ' + szInSelDate + ' is an invalid date');
	*/
	
	 document.getElementById('sel_month').value=curMonth;
	 document.getElementById('sel_year').value=curYear;
	 DrawCalBody();
}

/***************************************************************************

* Javascript: Validate initial date from calling form

***************************************************************************/
function validate_init_sel_date(szInitSelDate)
{
  var bValidDate		= false;
  try
  {
    var arrDateParts	= szInitSelDate.split('-');

    //Date format validation
    var bValidDateFormat	= (arrDateParts.length==3 && arrDateParts[0].length==4 && arrDateParts[1].length==2 && arrDateParts[2].length==2 && szInitSelDate.length==10);

    if(bValidDateFormat)
    {
      var objYears		= document.getElementById('sel_year');
      bValidDateObject	= (objYears!=null);

      if(bValidDateObject)
      {

        //Numeric range validation
        var arrYears	= objYears.options;
        var starting_year	= arrYears[0].value;
        var ending_year	= arrYears[arrYears.length - 1].value;
        var nYear		= new Number(arrDateParts[0]);
        var nMonth		= new Number(arrDateParts[1] - 1);
        var nDate		= new Number(arrDateParts[2]);
        bValidDateNumRange	= (nYear>=starting_year && nYear<=ending_year && nMonth>=0 && nMonth<=11 && nDate>=1 && nDate<=31);

        if (bValidDateNumRange)
        {
             //Javascript date object validation
             gSelDate.setFullYear(nYear);
             gSelDate.setMonth(nMonth);
             gSelDate.setDate(nDate);
             bValidDate	= (gSelDate.getFullYear()==nYear && gSelDate.getMonth()==nMonth && gSelDate.getDate()==nDate);
        }
      }
    }
  }
  catch(err)
  { }
  return bValidDate;
}

/***************************************************************************

*Javascript: Draw the calendar body

***************************************************************************/
function DrawCalBody()
{
	var dtToday		= new Date();
	var nDayOfMonth	= new Number(dtToday.getDate());
	var objCalendarCell	= document.getElementById('calendar_cell');
    var nSelMonth 	= new Number(document.getElementById('sel_month').value);
	var nSelYear 	= new Number(document.getElementById('sel_year').value);	
	var dtCal		= new Date();
	var Line		= new String();
	var nDate		= new Number(1);
	var backColor	= new String('background-color:white;');

    dtCal.setMonth(nSelMonth);
    dtCal.setDate(nDate);
    dtCal.setFullYear(nSelYear);
    nStartingWeekday 	= dtCal.getDay();
    Line += '<table id=\"calendar\" name=\"calendar\" style=\"background-color:white;\">';
    Line += ' <tr>';

    //Draw first Row
    for(nDayOfWeek=0;nDayOfWeek<7;++nDayOfWeek)
    {
      if (nDayOfWeek>=nStartingWeekday)
      {
         if (nDayOfMonth==nDate)
             backColor	= 'background-color:#FFCC99;';

         Line += '   <td class=\"calendar_date_cell\" id=\"date_cell_' + nDate.toString() + '\" style=\"' + backColor + ' \">';
         Line += '     <span class=\"clickable_header\" style=\"font-weight:normal; color:blue;\" onclick=\"Javascript:SelectThisDate(' + nDate.toString() + ')\">&nbsp;&nbsp;' + nDate.toString() + '&nbsp;&nbsp;</span>';
         Line += '   </td>';
         nDate++;
      }
      else
      {
         Line += '   <td class=\"calendar_date_cell\">';
         Line += '     &nbsp;';
         Line += '   </td>';
      }
    }
    Line += ' </tr>';

    //Draw remaining rows
    dtCal.setDate(nDate);
    while(dtCal.getMonth()==nSelMonth)
    {
      Line += ' <tr>';
      for(nDayOfWeek=0;nDayOfWeek<7;++nDayOfWeek)
      {

         if (nDayOfMonth==nDate)
             backColor	= 'background-color:#FFCC99;';

         else
             backColor	= 'background-color:white;';


         Line += '   <td class=\"calendar_date_cell\" id=\"date_cell_' + nDate.toString() + '\" style=\"' + backColor + ' \">';
         Line += '     <span class=\"clickable_header\"style=\"font-weight:normal; color:blue;\" onclick=\"Javascript:SelectThisDate(' + nDate.toString() + ')\">&nbsp;&nbsp;' + nDate.toString() + '&nbsp;&nbsp;</span>';
         Line += '   </td>';
         nDate++;

         dtCal.setDate(nDate);
         if(dtCal.getMonth()!=nSelMonth)
           break;
      }
      Line += ' </tr>';
    }

    Line += '</table>';

    //if (objCalendarCell)
      objCalendarCell.innerHTML=Line;
    //else
    //	return Line;
}

/***************************************************************************

* Javascript: Select the next month using the » selection control

***************************************************************************/
function SelectNextMonth()
{
  var nCurrentMonth = new Number(document.getElementById('sel_month').value);

  if (nCurrentMonth + 1 > 11)
    nCurrentMonth=0;
  else
    nCurrentMonth++;

  document.getElementById('sel_month').value=nCurrentMonth;
  DrawCalBody();
}

/***************************************************************************

* Javascript: Select the previous month using the « selection control

***************************************************************************/
function SelectPreviousMonth()
{
  var nCurrentMonth = new Number(document.getElementById('sel_month').value);

  if (nCurrentMonth - 1 < 0)
    nCurrentMonth=11;
  else
    nCurrentMonth--;

  document.getElementById('sel_month').value=nCurrentMonth;
  DrawCalBody();
}

/***************************************************************************

* Javascript: Select the next year using the » selection control

***************************************************************************/
function SelectNextYear()
{
  var nCurrentYear = new Number(document.getElementById('sel_year').value);

  if (nCurrentYear + 1 > CALENDAR_ENDING_YEAR)
    nCurrentYear=CALENDAR_STARTING_YEAR;
  else
    nCurrentYear++;

  document.getElementById('sel_year').value=nCurrentYear;
  DrawCalBody();
}

/***************************************************************************

* Javascript: Select the previous year using the « selection control

***************************************************************************/
function SelectPreviousYear(nCurrentYear)
{
  var nCurrentYear = new Number(document.getElementById('sel_year').value);

  if (nCurrentYear - 1 < CALENDAR_STARTING_YEAR)
    nCurrentYear=CALENDAR_ENDING_YEAR;
  else
    nCurrentYear--;

  document.getElementById('sel_year').value=nCurrentYear;
  DrawCalBody();

}

/***************************************************************************

*  Javascript: Select the date the user clicked on the calendar

***************************************************************************/
function SelectThisDate(nDate)
{
  var nCurrentYear	= new Number(document.getElementById('sel_year').value);
  var nCurrentMonth	= new Number(document.getElementById('sel_month').value + 1);
  var szDate		= new String(nDate.toString());
  var szMonth		= new String(nCurrentMonth.toString());

  if (szDate.length==1)
      szDate = '0' + szDate;

  if (szMonth.length==1)
      szMonth = '0' + szMonth;

  var selectedDate	= new String(nCurrentYear.toString() + '-' + szMonth + '-' + szDate);

  ClearSelectedDate();

  document.getElementById('date_cell_' + nDate.toString()).style.backgroundColor='#00FF80';
}

/***************************************************************************

* Javascript: Clear the date the user clicked on the calendar

***************************************************************************/
function ClearSelectedDate()
{
   var dtToday	= new Date();
   var nDayOfMonth		= new Number(dtToday.getDate());

   for (var nDate=1; nDate<=31; ++nDate)
   {
     if (document.getElementById('date_cell_' + nDate.toString()))
     {
        if (nDayOfMonth==nDate)
           document.getElementById('date_cell_' + nDate.toString()).style.backgroundColor='#FFCC99';
        else
           document.getElementById('date_cell_' + nDate.toString()).style.backgroundColor='white';
     }
     else
        break;
   }

}

function CreateMonthSelectionControl(selMonth)
{
  var Line	= new String("              <select name='sel_month' id='sel_month' onchange='Javascript:DrawCalBody()' style='font-family:arial; font-size:8pt;'>\r\n");

  for(var nDIndex=0; nDIndex<12; nDIndex++)
  {
	if (gArrCalMonths[nDIndex] == gArrCalMonths[selMonth])
		Line	+= "                 <option value='" + nDIndex + "' selected>" + gArrCalMonths[nDIndex] + "</option>\r\n";
	else
		Line	+= "                 <option value='" + nDIndex + "'>" + gArrCalMonths[nDIndex] + "</option>\r\n";
  }
  
  Line		+= "               </select>\r\n";

  return Line;
}

function CreateYearSelectionControl(selYear)
{
  var Line	= new String("              <select name='sel_year' id='sel_year' onchange='Javascript:DrawCalBody()' style='font-family:arial; font-size:8pt;'>\r\n");

  for (nYear=CALENDAR_STARTING_YEAR; nYear<=CALENDAR_ENDING_YEAR; ++nYear)
  {
	  if (nYear == selYear)
		  Line	+= "                 <option value='" + nYear + "' selected>" + nYear + "</option>\r\n";
	  else
		  Line	+= "                 <option value='" + nYear + "'>" + nYear + "</option>\r\n";
  }
  
  Line		+= "               </select>\r\n";

  return Line;
}

function CreateWeekdayHeader()
{
  var Line	= new String();

  for (var nDIndex=0; nDIndex<7; nDIndex++)
  {
     Line	+= "    <td class='weekday_header' id='weekday_" + nDIndex.toString() + "' name='weekday_" + nDIndex.toString() + "'>\r\n";
     Line	+= "      " + gArrCalWeekdays[nDIndex] + "\r\n";
     Line	+= "    </td >\r\n";
  } 

  return Line;
}

/***************************************************************************

Javascript: Draw the calendar headers

***************************************************************************/
function DrawCalHeaders()
{
  var objMainFrameCell	= document.getElementById('main_frame_cell');
  var dtToday		= new Date();
  var curMonth		= new Number(dtToday.getMonth());
  var curYear		= new Number(dtToday.getFullYear());
  
  var Line		= new String();

  Line	+= "<center>\r\n";
  Line	+= "<table id='month_year_selection_header' name='month_year_selection_header' style='background-color:white'>\r\n";
  Line	+= "  <tr>\r\n";
  Line	+= "    <td class='month_year_header' id='month_header' name='month_header'>\r\n";
  Line	+= "      <span class='clickable_header' onclick='Javascript:SelectPreviousMonth()'>«</span>\r\n";
  Line  += CreateMonthSelectionControl(curMonth);
  Line	+= "      <span class='clickable_header' onclick='Javascript:SelectNextMonth()'>»</span>\r\n";
  Line	+= "    </td >\r\n";
  Line	+= "    <td class='month_year_header' id='year_header' name='year_header'>\r\n";
  Line	+= "      <span class='clickable_header' onclick='Javascript:SelectPreviousYear()'>«</span>\r\n"; 
  Line  += CreateYearSelectionControl(curYear);
  Line	+= "      <span class='clickable_header' onclick='Javascript:SelectNextYear()'>»</span>\r\n";
  Line	+= "    </td >\r\n";
  Line	+= "  </tr>\r\n";
  Line	+= "</table>\r\n";
  Line	+= "<table id='weekday_header' name='weekday_header' style='background-color:white'>\r\n";
  Line	+= "  <tr>\r\n";
  Line  += CreateWeekdayHeader();
  Line	+= "  </tr>\r\n";
  Line	+= "</table>\r\n";
  Line	+= "<table id='calender_frame' name='calender_frame' style='background-color:white'>\r\n";
  Line	+= "  <tr>\r\n";
  Line	+= "    <td id='calendar_cell' name='calendar_cell'>\r\n";
  Line	+= "    </td >\r\n";
  Line	+= "  </tr>\r\n";
  Line	+= "  <tr>\r\n";
  Line	+= "    <td id='legend_cell' name='legend_cell'>\r\n";
  Line	+= "      <hr />\r\n";
  Line	+= "      <table id='legend_frame' name='legend_frame' style='background-color:white'>\r\n";
  Line	+= "        <td id='legend_cell_today_caption' style='background-color:white; font-family:Arial'>\r\n";
  Line	+= "          Today's day of the month\r\n";
  Line	+= "        </td>\r\n";
  Line	+= "        <td class='calendar_date_cell' id='legend_cell_today' style='background-color:#FFCC99; font-family:Arial'>\r\n";
  Line	+= "          &nbsp;&nbsp;\r\n";
  Line	+= "        </td>\r\n";
  Line	+= "        <td id='legend_cell_today_caption' style='background-color:white; font-family:Arial'>\r\n";
  Line	+= "          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Selected day\r\n";
  Line	+= "        </td>\r\n";
  Line	+= "        <td class='calendar_date_cell' id='legend_cell_today' style='background-color:#00FF80; font-family:Arial'>\r\n";
  Line	+= "          &nbsp;&nbsp;\r\n";
  Line	+= "        </td>\r\n";
  Line	+= "      </table>\r\n";
  Line	+= "    </td >\r\n";
  Line	+= "  </tr>\r\n";
  Line	+= "</table>\r\n";
  Line	+= "</center>\r\n";

  objMainFrameCell.innerHTML	= Line;
}

/***************************************************************************
****************************************************************************
****************************************************************************

* END CALENDAR FUNCTIONS

****************************************************************************
****************************************************************************
***************************************************************************/

function startClock(szPageClockElementId)
{
    var objPageClockElement = document.getElementById(szPageClockElementId);

    if (objPageClockElement)
    {
        var today	= new Date();
        var hours 	= today.getHours();
        var minutes	= today.getMinutes();
        var seconds	= today.getSeconds();

        // add a zero in front of numbers<10
        hours	= formatTimeSegment(hours);
        minutes	= formatTimeSegment(minutes);
        seconds	= formatTimeSegment(seconds);
        objPageClockElement.innerHTML = hours + ":" + minutes + ":" + seconds;
        var stoid	= setTimeout('startClock(szPageClockElementId)',500);
    }
}

function formatTimeSegment(timeSeg)
{
  if (timeSeg < 10)
  {
    timeSeg ="0" + timeSeg;
  }
  return timeSeg;
}

  /***************************************************************************

  Javascript: Get Numbers From String

  ***************************************************************************/
function GetNumbersFromString(EvalString)
{
   var stringToCheck	= new String(EvalString);
   var sLen			= stringToCheck.length;
   var bisValidString	= sLen > 0;
   var sNumbersFromString	= new String();

  if (bisValidString)
  {
     for (var nCh=0; nCh<sLen; ++nCh)
     {
        var oCh		= parseInt(stringToCheck.charAt(nCh));
        if (!isNaN(oCh))
             sNumbersFromString += oCh;
     }
  }

  return sNumbersFromString;

}


  /***************************************************************************

  Javascript: Get Alphas From String

  ***************************************************************************/
function GetAlphasFromString(EvalString)
{
   var stringToCheck	= new String(EvalString);
   var sLen		= stringToCheck.length;
   var bisValidString	= sLen > 0;
   var sAlphasFromString	= new String();

  if (bisValidString)
  {
     for (var nCh=0; nCh<sLen; ++nCh)
     {
        var sCh		= stringToCheck.charAt(nCh);
        if (IsAlpha(sCh))
             sAlphasFromString += sCh;
     }
  }

  return sAlphasFromString;

}


  /***************************************************************************

  Javascript: IsAlpha

  ***************************************************************************/
function IsAlpha(sCh)
{
   var szAlphaSet = new String('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
   return szAlphaSet.indexOf(sCh) > -1;
}

function toProper(szString)
{ 
    //alert("'" + szString + "'");

    if (szString.length == 0)
        return szString;

    var szArrWhiteSpace = new Array();
    szArrWhiteSpace[0] = " ";
    szArrWhiteSpace[1] = "\n";
    szArrWhiteSpace[2] = "\r";
    szArrWhiteSpace[3] = "\t";  

    var szReturnString = szString.toLowerCase();

    //alert("'" + szReturnString + "'");


    for (nWS = 0; nWS < szArrWhiteSpace.length; ++nWS)
    {
        //Do space a whitespace character
       var szArrTokens = szReturnString.split(szArrWhiteSpace[nWS]);

       if (!szArrTokens)
           continue;

       if (szArrTokens.length == 0)
           continue;
        
       szReturnString = makeProper(szArrTokens, szArrWhiteSpace[nWS]);

       //alert(nWS + ' ' + szReturnString);
    }

    //alert("'" + szReturnString + "'");

    return szReturnString;
}

function makeProper(szArrTokens, szWhiteSpace)
{
    var szProperString = new String(); 

    for (var nToks = 0; nToks < szArrTokens.length; ++nToks)
    {
       var szToken	= szArrTokens[nToks];
       if (szToken.length == 0)
           szArrTokens[nToks]= szWhiteSpace;
       else if (szToken.length == 1)
       {
          if (IsAlpha(szToken))
             szArrTokens[nToks] = szToken.toUpperCase();
          else 
             szArrTokens[nToks] = szToken;
       }
       else if (szToken.length > 1)
       {
          if (IsAlpha(szToken.charAt(0)))
             szArrTokens[nToks] = szToken.charAt(0).toUpperCase() + szToken.slice(1);
          else 
             szArrTokens[nToks] = szToken;
       }
   }

    for (var nToks = 0; nToks < szArrTokens.length; ++nToks)
    {
       if (szProperString.length > 0)
          szProperString += szWhiteSpace;

       szProperString += szArrTokens[nToks];
    }

   return szProperString;
}

function set_gears_animated_gif(embed_in_obj, sub_title)
{
  var LineOut		= new String();
  var objEmbeObj	= document.getElementById(embed_in_obj);

  if (objEmbeObj)
  {
        //alert("set_gears_animated_gif");
        LineOut += '<table id="tblProcessPending" style="width:100%; height:100%" cellspacing="0px" cellpadding="0px">\n';
        LineOut += '  <tr>\n';
        LineOut += '    <td style="width:100%;height:100%;font-family:Arial; font-size:8pt; text-align:center;vertical-align:center;">\n';
        LineOut += '      <img src="https://www.bizznest.net/Images/gears_animated.gif" /><br />' + sub_title + '\n';
        LineOut += '    </td>\n';
        LineOut += '  </tr>\n';
        LineOut += '</table>\n';

        objEmbeObj.innerHTML = LineOut;
  }
}

function sYYYY_MM_DD()
{
	var dDate	= new Date();
	var sYear	= new String(dDate.getFullYear());
	
	//alert(sYear);

	var sMonth	= new String(dDate.getMonth()+1); //This is the most idiotic function using 0 based indexing
	if (sMonth.length == 1)
		sMonth	= "0" + sMonth;

	var sDate	= new String(dDate.getDate());
	if (sDate.length == 1)
		sDate	= "0"+sDate;

	return sYear + "-" + sMonth + "-" + sDate;
}

function sYYYYMMDD()
{
	var dDate	= new Date();
	var sYear	= new String(dDate.getYear());

	var sMonth	= new String(dDate.getMonth());
	if (sMonth.length == 1)
		sMonth	= "0" + sMonth;

	var sDate	= new String(dDate.getDate());
	if (sDate.length == 1)
		sDate	= "0"+sDate;

	return sYear + sMonth + sDate;
}

function sMM_DD_YYYY()
{
	var dDate	= new Date();
	var sYear	= new String(dDate.getYear());

	var sMonth	= new String(dDate.getMonth());
	if (sMonth.length == 1)
		sMonth	= "0" + sMonth;

	var sDate	= new String(dDate.getDate());
	if (sDate.length == 1)
		sDate	= "0"+sDate;

	return sMonth + "/" + sDate + "/" + sYear;
}
