function getElementFromEventAdvancedFormSupport(a_e)
{
   a_e = a_e || window.event;
	if('undefined' != typeof(a_e.srcElement))
	{
		 return a_e.srcElement;
	}
	else if('undefined' != typeof(a_e.target))
	{
		return a_e.target;
	}
   return null;
}

function isDefAdvancedFormSupport()
{
   for(var i=0;i<arguments.length;i++)
   {
      if('undefined' == typeof(arguments[i]))
         return false;
   }
	return true;
}

function trimLeftAdvancedFormSupport(a_szString, a_szSubString, a_optCount)
{
   if(a_szString)
   {
      if(null == a_szSubString)
      {
         a_szSubString = ' ';
      }

      var iCount = 0;
      while(0 == a_szString.indexOf(a_szSubString))
      {
         a_szString = a_szString.substring(a_szSubString.length,a_szString.length);        
         iCount++;
         if(a_optCount)
         {
            if(iCount >= a_optCount)
            {
               break;
            }
         }

      }
   }
    return a_szString;
}

function trimRightAdvancedFormSupport(a_szString, a_szSubString, a_optCount)
{
   if(a_szString)
   {
      if(null == a_szSubString)
      {
         a_szSubString = ' ';
      }

      var iDiff = a_szString.length - a_szSubString.length;
      var iCount = 0;
      while(a_szString.lastIndexOf(a_szSubString) == iDiff)
      {
         a_szString = a_szString.substring(0,a_szString.length-a_szSubString.length);        
         iDiff = a_szString.length - a_szSubString.length;
         iCount++;
         if(a_optCount)
         {
            if(iCount >= a_optCount)
            {
               break;
            }
         }
      }
   }
    return a_szString;
}

function trimAdvancedFormSupport(a_szString, a_szSubString)
{
   a_szString = trimLeftAdvancedFormSupport(a_szString, a_szSubString);
   return trimRightAdvancedFormSupport(a_szString, a_szSubString);
}



function eiAdvancedFormSupport(a_szId)
{
   if(a_szId == null)
   {
      return null;
   }
   if('string' != typeof(a_szId))
   {
      return a_szId;
   }
   if(document.getElementById && document.getElementById(a_szId))
   {
      return document.getElementById(a_szId);
   }
   else if (document.all && document.all(a_szId))
   {  
      return document.all(a_szId);
   } 
   else if (document.layers && document.layers[a_szId])
   { 
      return document.layers[a_szId];
   }
   else
   {
      return null;
   }
}
function CAdvancedFormSupportValidateForm()
{
   //
   // Public variables
   //
   var m_arrIllegalUSAreaCodes = new Array( 211, 311, 411, 456, 500, 511, 555, 600, 611, 700, 711, 811, 900, 911, 976, 999 );
   this.m_arrIllegalUSAreaCodes = m_arrIllegalUSAreaCodes;

   var m_arrLegalUSAreaCodes = {
                                 201 : "NJ",
                                 202 : "DC",
                                 203 : "CT",
                                 204 : "MB",
                                 205 : "AL",
                                 206 : "WA",
                                 207 : "ME",
                                 208 : "ID",
                                 209 : "CA",
                                 210 : "TX",
                                 212 : "NY",
                                 213 : "CA",
                                 214 : "TX",
                                 215 : "PA",
                                 216 : "OH",
                                 217 : "IL",
                                 218 : "MN",
                                 219 : "IN",
                                 224 : "IL",
                                 225 : "LA",
                                 226 : "ON",
                                 228 : "MS",
                                 229 : "GA",
                                 231 : "MI",
                                 234 : "OH",
                                 236 : "VA",
                                 239 : "FL",
                                 240 : "MD",
                                 242 : "Bahamas",
                                 246 : "Barbados",
                                 248 : "MI",
                                 250 : "BC",
                                 251 : "AL",
                                 252 : "NC",
                                 253 : "WA",
                                 254 : "TX",
                                 256 : "AL",
                                 260 : "IN",
                                 262 : "WI",
                                 264 : "Anguilla",
                                 267 : "PA",
                                 268 : "Antigua and Barbuda",
                                 269 : "MI",
                                 270 : "KY",
                                 276 : "VA",
                                 278 : "MI",
                                 281 : "TX",
                                 283 : "OH",
                                 284 : "British Virgin Islands",
                                 289 : "ON",
                                 301 : "MD",
                                 302 : "DE",
                                 303 : "CO",
                                 304 : "WV",
                                 305 : "FL",
                                 306 : "SK",
                                 307 : "WY",
                                 308 : "NE",
                                 309 : "IL",
                                 310 : "CA",
                                 312 : "IL",
                                 313 : "MI",
                                 314 : "MO",
                                 315 : "NY",
                                 316 : "KS",
                                 317 : "IN",
                                 318 : "LA",
                                 319 : "IA",
                                 320 : "MN",
                                 321 : "FL",
                                 323 : "CA",
                                 325 : "TX",
                                 330 : "OH",
                                 331 : "IL",
                                 334 : "AL",
                                 336 : "NC",
                                 337 : "LA",
                                 339 : "MA",
                                 340 : "US Virgin Islands",
                                 341 : "CA",
                                 345 : "Cayman Islands",
                                 347 : "NY",
                                 351 : "MA",
                                 352 : "FL",
                                 360 : "WA",
                                 361 : "CA",
                                 380 : "OH",
                                 385 : "UT",
                                 386 : "FL",
                                 401 : "RI",
                                 402 : "NE",
                                 403 : "AB",
                                 404 : "GA",
                                 405 : "OK",
                                 406 : "MT",
                                 407 : "FL",
                                 408 : "CA",
                                 409 : "TX",
                                 410 : "MD",
                                 412 : "PA",
                                 413 : "MA",
                                 414 : "WI",
                                 415 : "CA",
                                 416 : "ON",
                                 417 : "MO",
                                 418 : "RI",
                                 419 : "OH",
                                 423 : "TN",
                                 424 : "CA",
                                 425 : "WA",
                                 430 : "TX",
                                 434 : "VA",
                                 435 : "UT",
                                 438 : "QC",
                                 440 : "OH",
                                 441 : "Bermuda",
                                 442 : "CA",
                                 443 : "MD",
                                 450 : "QC",
                                 464 : "IL",
                                 469 : "TX",
                                 470 : "GA",
                                 473 : "Grenada",
                                 475 : "CT",
                                 478 : "GA",
                                 479 : "AR",
                                 480 : "AZ",
                                 484 : "PA",
                                 501 : "AR",
                                 502 : "KY",
                                 503 : "OR",
                                 504 : "LA",
                                 505 : "NM",
                                 506 : "NB",
                                 507 : "MN",
                                 508 : "MA",
                                 509 : "WA",
                                 510 : "CA",
                                 512 : "TX",
                                 513 : "OH",
                                 514 : "QC",
                                 515 : "IA",
                                 516 : "NY",
                                 517 : "MI",
                                 518 : "NY",
                                 519 : "ON",
                                 520 : "AZ",
                                 530 : "CA",
                                 540 : "VA",
                                 541 : "OR",
                                 551 : "NJ",
                                 557 : "MO",
                                 559 : "CA",
                                 561 : "FL",
                                 562 : "CA",
                                 563 : "IA",
                                 564 : "WA",
                                 567 : "OH",
                                 570 : "PA",
                                 571 : "VA",
                                 573 : "MO",
                                 574 : "IN",
                                 580 : "OK",
                                 585 : "NY",
                                 586 : "MI",
                                 601 : "MS",
                                 602 : "AZ",
                                 603 : "NH",
                                 604 : "BC",
                                 605 : "SD",
                                 606 : "KY",
                                 607 : "NY",
                                 608 : "WI",
                                 609 : "NJ",
                                 610 : "PA",
                                 612 : "MN",
                                 613 : "ON",
                                 614 : "OH",
                                 615 : "TN",
                                 616 : "MI",
                                 617 : "MA",
                                 618 : "IL",
                                 619 : "CA",
                                 620 : "KS",
                                 623 : "AZ",
                                 626 : "CA",
                                 627 : "CA",
                                 628 : "CA",
                                 630 : "IL",
                                 631 : "NY",
                                 636 : "MO",
                                 641 : "IA",
                                 646 : "NY",
                                 647 : "ON",
                                 649 : "Turks & Caicos Islands",
                                 650 : "CA",
                                 651 : "MN",
                                 660 : "MO",
                                 661 : "CA",
                                 662 : "MS",
                                 664 : "Montserrat",
                                 669 : "CA",
                                 670 : "MP",
                                 671 : "GU",
                                 678 : "GA",
                                 679 : "MI",
                                 682 : "TX",
                                 684 : "American Samoa",
                                 689 : "FL",
                                 701 : "ND",
                                 702 : "NV",
                                 703 : "VA",
                                 704 : "NC",
                                 705 : "ON",
                                 706 : "GA",
                                 707 : "CA",
                                 708 : "IL",
                                 709 : "NL",
                                 710 : "US Government",
                                 712 : "IA",
                                 713 : "TX",
                                 714 : "CA",
                                 715 : "WI",
                                 716 : "NY",
                                 717 : "PA",
                                 718 : "NY",
                                 719 : "CO",
                                 720 : "CO",
                                 724 : "PA",
                                 727 : "FL",
                                 731 : "TN",
                                 732 : "NJ",
                                 734 : "MI",
                                 737 : "TX",
                                 740 : "OH",
                                 747 : "CA",
                                 754 : "FL",
                                 757 : "VA",
                                 758 : "St. Lucia",
                                 760 : "CA",
                                 762 : "GA",
                                 763 : "MN",
                                 764 : "CA",
                                 765 : "IN",
                                 767 : "Dominica",
                                 769 : "MS",
                                 770 : "GA",
                                 772 : "FL",
                                 773 : "IL",
                                 774 : "MA",
                                 775 : "NV",
                                 778 : "BC",
                                 780 : "AB",
                                 781 : "MA",
                                 784 : "St. Vincent & Grenadines",
                                 785 : "KS",
                                 786 : "FL",
                                 787 : "PR",
                                 800 : "US/Canada toll free",
                                 801 : "UT",
                                 802 : "VT",
                                 803 : "SC",
                                 804 : "VA",
                                 805 : "CA",
                                 806 : "TX",
                                 807 : "ON",
                                 808 : "HI",
                                 809 : "Dominican Republic",
                                 810 : "MI",
                                 812 : "IN",
                                 813 : "FL",
                                 814 : "PA",
                                 815 : "IL",
                                 816 : "MO",
                                 817 : "TX",
                                 818 : "CA",
                                 819 : "QC",
                                 822 : "US/Canada toll free",
                                 828 : "NC",
                                 829 : "Dominican Republic",
                                 830 : "TX",
                                 831 : "CA",
                                 832 : "TX",
                                 833 : "US/Canada toll free",
                                 835 : "PA",
                                 843 : "SC",
                                 844 : "US/Canada toll free",
                                 845 : "NY",
                                 847 : "IL",
                                 848 : "NJ",
                                 850 : "FL",
                                 855 : "US/Canada toll free",
                                 856 : "NJ",
                                 857 : "MA",
                                 858 : "CA",
                                 859 : "KY",
                                 860 : "CT",
                                 862 : "NJ",
                                 863 : "FL",
                                 864 : "SC",
                                 865 : "TN",
                                 866 : "US/Canada toll free",
                                 867 : "YT",
                                 868 : "Trinidad and Tobago",
                                 869 : "St. Kitts & Nevis",
                                 870 : "AR",
                                 872 : "IL",
                                 876 : "Jamaica",
                                 877 : "US/Canada toll free",
                                 880 : "Paid Toll-free Service",
                                 881 : "Paid Toll-free Service",
                                 882 : "Paid Toll-free Service",
                                 888 : "US/Canada toll free",
                                 898 : "VoIP service",
                                 901 : "TN",
                                 902 : "NS",
                                 903 : "TX",
                                 904 : "FL",
                                 905 : "ON",
                                 906 : "MI",
                                 907 : "AK",
                                 908 : "NJ",
                                 909 : "CA",
                                 910 : "NC",
                                 912 : "GA",
                                 913 : "KS",
                                 914 : "KY",
                                 915 : "TX",
                                 916 : "CA",
                                 917 : "NY",
                                 918 : "OK",
                                 919 : "NC",
                                 920 : "WI",
                                 925 : "CA",
                                 928 : "AZ",
                                 931 : "TN",
                                 935 : "CA",
                                 936 : "TX",
                                 937 : "OH",
                                 939 : "PR",
                                 940 : "TX",
                                 941 : "FL",
                                 947 : "MI",
                                 949 : "CA",
                                 951 : "CA",
                                 952 : "MN",
                                 954 : "FL",
                                 956 : "TX",
                                 957 : "NM",
                                 959 : "CT",
                                 969 : "MD",
                                 970 : "CO",
                                 971 : "OR",
                                 972 : "TX",
                                 973 : "NJ",
                                 975 : "MO",
                                 978 : "MA",
                                 979 : "TX",
                                 980 : "NC",
                                 984 : "NC",
                                 985 : "LA",
                                 989 : "MI"
                               };


   var m_arrIllegalUSLocalNumberHi = new Array( 555 );
   this.m_arrIllegalUSLocalNumberHi = m_arrIllegalUSLocalNumberHi;

   var m_arrIllegalUSPhoneNumbers = new Array();
   this.m_arrIllegalUSPhoneNumbers = m_arrIllegalUSPhoneNumbers;

   var m_arrIllegalDomainNames = new Array();
   this.m_arrIllegalDomainNames = m_arrIllegalDomainNames;
   //
   // Private variables
   //
   //
   // Constructor
   //
   //
   // Public Functions
   //
   function addIllegalUSPhoneNumbers()
   {
      for(var i = 0; i < arguments.length; i++)
      {
         addIllegalUSPhoneNumber(arguments[i]);
      }
   }
   this.addIllegalUSPhoneNumbers = addIllegalUSPhoneNumbers;

   function addIllegalDomainNames()
   {
      for(var i = 0; i < arguments.length; i++)
      {
         addIllegalDomainName(arguments[i]);
      }
   }
   this.addIllegalDomainNames = addIllegalDomainNames;

   function addIllegalUSPhoneNumber(a_szUSPhoneNumber)
   {
      var oFakeInputElement = new Object();
      oFakeInputElement.value = a_szUSPhoneNumber;
      if( isUSPhoneNumberFormatValid(oFakeInputElement) )
      {
         var oNewPhoneNumber = new Object();
         oNewPhoneNumber.usAreaCode       = getUSAreaCode(oFakeInputElement);
         oNewPhoneNumber.usLocalNumberHi  = getUSLocalNumberHi(oFakeInputElement);
         oNewPhoneNumber.usLocalNumberLow = getUSLocalNumberLow(oFakeInputElement);

         m_arrIllegalUSPhoneNumbers.push(oNewPhoneNumber);
      }
   }
   this.addIllegalUSPhoneNumber = addIllegalUSPhoneNumber;

   function addIllegalDomainName(a_szDomainName)
   {
      if(a_szDomainName)
      {
         m_arrIllegalDomainNames.push(a_szDomainName.toLowerCase());
      }
   }
   this.addIllegalDomainName = addIllegalDomainName;

   function isEmailValid(a_oInput)
   {
      //rfc822
      var szValue = getValueFromElement(a_oInput);
      if(0 == szValue.toLowerCase().search(/^[a-z0-9]+[a-z0-9._-]*@((([a-z0-9][a-z0-9-]*[a-z0-9][.])*([a-z][a-z0-9-]*[a-z0-9][.])+[a-z]{2,4})|(([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})))$/) )
      {
         return true;
      }
      return false;
   }
   this.isEmailValid = isEmailValid;

   function isNameValid(a_oInput)
   {
      var szValue = getValueFromElement(a_oInput);
      if(0 == szValue.search(/^(([a-zA-Z]+[,.]?)(\s*))+(([a-zA-Z]+[-][a-zA-Z]+)?)$/) )
      {
         return true;
      }
      return false;
   }
   this.isNameValid = isNameValid;

   function isUSPhoneNumberFormatValid(a_oInput)
   {
      //rfc3966 - US numbers only
      var szValue = getValueFromElement(a_oInput);
      szValue = szValue.toLowerCase().replace(/\s/g,'');

      //1-(800)555-1212
      //1-(800)-555-1212
      //1(800)555-1212
      //1-800-555-1212
      //1.800.555.1212
      //(800)555-1212
      //(800)-555-1212
      //(800)555-1212
      //800555-1212
      //800-555-1212
      //800.555.1212
      if(0 == szValue.search(/^(1[-.]?)?([\(]?\d{3}[\)]?)([-.]?\d{3}[-.]?\d{4})$/) )
      {
         return true;
      }
      return false;
   }
   this.isUSPhoneNumberFormatValid = isUSPhoneNumberFormatValid;

   function isEmailAddressDomainNameLegal(a_oInput)
   {
      return isHttpURLDomainNameLegal(a_oInput);
   }
   this.isEmailAddressDomainNameLegal = isEmailAddressDomainNameLegal;

   function isHttpURLDomainNameLegal(a_oInput)
   {
      var szHttpURLDomainName = getHttpURLDomainName(a_oInput);
      if(szHttpURLDomainName)
      {
         szHttpURLDomainName = szHttpURLDomainName.toLowerCase();
         for(var i = 0; i < m_arrIllegalDomainNames.length; i++)
         {
            if(szHttpURLDomainName == m_arrIllegalDomainNames[i])
            {
               return false;
            }
         }
         return true;
      }
      return false;
   }
   this.isHttpURLDomainNameLegal = isHttpURLDomainNameLegal;

   function isUSPhoneNumberLegal(a_oInput)
   {
      var szUSAreaCode       = getUSAreaCode(a_oInput);
      var szUSAreaCodeRegion = getUSAreaCodeRegion(a_oInput);
      var szUSLocalNumberHi  = getUSLocalNumberHi(a_oInput);
      var szUSLocalNumberLow = getUSLocalNumberLow(a_oInput);

      if(isDefAdvancedFormSupport(szUSAreaCode,szUSLocalNumberHi,szUSLocalNumberLow) )
      {
         //Illegal Area Codes
         for(var i = 0; i < m_arrIllegalUSAreaCodes.length; i++)
         {
            if(szUSAreaCode == m_arrIllegalUSAreaCodes[i])
            {
               return false;
            }
         }
         //Illegal Prefix
         for(var i = 0; i < m_arrIllegalUSLocalNumberHi.length; i++)
         {
            if(szUSLocalNumberHi == m_arrIllegalUSLocalNumberHi[i])
            {
               return false;
            }
         }
         //Illegal Numbers
         for(var i = 0; i < m_arrIllegalUSPhoneNumbers.length; i++)
         {
            if( (szUSAreaCode       == m_arrIllegalUSPhoneNumbers[i].usAreaCode      ) &&
                (szUSLocalNumberHi  == m_arrIllegalUSPhoneNumbers[i].usLocalNumberHi ) &&
                (szUSLocalNumberLow == m_arrIllegalUSPhoneNumbers[i].usLocalNumberLow)
              )
            {
               return false;
            }
         }

         return true;
      }

      return false;      
   }
   this.isUSPhoneNumberLegal = isUSPhoneNumberLegal;

   function isDimention(a_oInput, a_ioptMinCount, a_ioptMaxCount)
   {
      var szValue   = getValueFromElement(a_oInput);
      var iMinCount = (null==a_ioptMinCount)?0:a_ioptMinCount;
      var iMaxCount = (null==a_ioptMaxCount)?1024:a_ioptMaxCount;

      if( (szValue.length >= iMinCount) && (szValue.length <= iMaxCount) )
      {
         return true;
      }
      return false;
   }
   this.isDimention = isDimention;

   function getUSAreaCodeRegion(a_oInput)
   {
      var szValue      = getValueFromElement(a_oInput);
      var szUSAreaCode = getUSAreaCode(a_oInput);
      var szUSAreaCodeRegion = '';
      if(szValue && szUSAreaCode)
      {
         szUSAreaCodeRegion = m_arrLegalUSAreaCodes[szUSAreaCode];
         if(null == szUSAreaCodeRegion)
         {
            szUSAreaCodeRegion = '';            
         }
      }
      return szUSAreaCodeRegion;
   }
   this.getUSAreaCodeRegion = getUSAreaCodeRegion;

   function getEmailAddressHost(a_oInput)
   {
      return getHttpURLHost(a_oInput);
   }
   this.getEmailAddressHost = getEmailAddressHost;

   //
   // Private functions
   //
   function getUSLocalNumberHi(a_oInput)
   {
      var szValue = getValueFromElement(a_oInput);
      szValue = szValue.toLowerCase().replace(/\s/g,'');

      var szUSLocalNumberHi = szValue.replace(/[-.\(\)]/g, '');

      if(10 == szUSLocalNumberHi.length)
      {
         return szUSLocalNumberHi.substring(3,6);
      }
      else
      {
         return szUSLocalNumberHi.substring(4,7);
      }
   }
   this.getUSLocalNumberHi = getUSLocalNumberHi;

   function getUSLocalNumberLow(a_oInput)
   {
      var szValue = getValueFromElement(a_oInput);
      szValue = szValue.toLowerCase().replace(/\s/g,'');

      var szUSLocalNumberHi = szValue.replace(/[-.\(\)]/g, '');

      if(10 == szUSLocalNumberHi.length)
      {
         return szUSLocalNumberHi.substring(6,10);
      }
      else
      {
         return szUSLocalNumberHi.substring(7,11);
      }
   }
   this.getUSLocalNumberLow = getUSLocalNumberLow;

   function getUSAreaCode(a_oInput)
   {
      var szValue = getValueFromElement(a_oInput);
      szValue = szValue.toLowerCase().replace(/\s/g,'');

      var szAreaCode = szValue.match(/^(1[-.]?)?([\(]?\d{3}[\)]?)/);
      if(szAreaCode)
      {
         if(szAreaCode[0].length >= 3)
         {
             szAreaCode = szAreaCode[0];
         }
         else
         {
              szAreaCode = szAreaCode.toString();
         }
         szAreaCode = szAreaCode.replace(/[-.\(\)]/g, '');

        if(4 == szAreaCode.length)
        {
           szAreaCode = szAreaCode.substring(1,4);
        }

         return szAreaCode;
      }
      return null;
   }
   this.getUSAreaCode = getUSAreaCode;

   function getEmailAddressDomainName(a_oInput)
   {
      //Returns 'address' from "email@address.com"
      return getHttpURLDomainName(a_oInput);
   }

   function getEmailAddressUserName(a_oInput)
   {
      //Returns 'email' from "email@address.com"
      var szValue = getValueFromElement(a_oInput);
      var szUserName = szValue.match(/^[a-zA-Z0-9]+[a-zA-Z0-9._-]*@/);

      if(szUserName)
      {
         szUserName = trimRightAdvancedFormSupport(szUserName,'@');
      }
      return szUserName;
   }

   function getValueFromElement(a_oInput)
   {
      if(!a_oInput) return '';
      if(null == a_oInput.value) return '';
      var szValue = a_oInput.value;
      if(szValue)
      {
         szValue = trimAdvancedFormSupport(szValue);
         return szValue;
      }
      return '';
   }

   function getHttpURLHost(a_oInput)
   {
      //Returns  'netscape.com' from 'http://www.netscape.com'
      var szValue = getValueFromElement(a_oInput);
      var szDomainName = szValue.toLowerCase().match(/((([a-z][a-z0-9-]*[a-z0-9][.])[a-z]{2,4}[/]?)|([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}[/]?))$/) ;

      if(szDomainName)
      {
         if(szDomainName[0].length > 1)
         {
            szDomainName = szDomainName[0];
         }
         return trimRightAdvancedFormSupport(szDomainName,'/');
      }
      return null;
   }
   this.getHttpURLHost = getHttpURLHost;


   function getHttpURLDomainName(a_oInput)
   {
      //Returns  'netscape' from 'http://www.netscape.com'
      var szHost = getHttpURLHost(a_oInput);

      if(szHost)
      {
         var szArray = szHost.split('.');
         if(szArray && (szArray[0].length > 1))
         {
            return szArray[0].toString();
         }
         return szArray.toString();
      }
      return null;
   }

} //End of function CAdvancedFormSupportValidateForm()

//
// AJAX wrapper
//
function CAdvancedFormSupportAJAX(a_szServerPage)
{
   //
   // Public variables
   //
   var m_szServerPage = a_szServerPage;
   this.m_szServerPage = m_szServerPage;

   var m_szPostMessage = '';
   this.m_szPostMessage = m_szPostMessage;

   var m_szResponseText = '';
   this.m_szResponseText = m_szResponseText;
   //
   // Private variables
   //
   var m_oXmlHttp = null;
   var m_fncallback = null;
   var m_param = null;
   var m_bPostingData = false;
   //
   // Constructor
   //
   //
   // Public functions
   //
   function postEmailAddress(a_szEmailAddress, a_fnCallback, a_param)
   {
      if(!a_szEmailAddress) return;
      if(!m_szServerPage) return;
      abort();

      m_szPostMessage = "sid=" + Math.random() + "&action=verifyemailaddress&emailaddress=" + encodeURI(a_szEmailAddress);

      sendPost(m_szPostMessage, a_fnCallback, a_param);
   }
   this.postEmailAddress = postEmailAddress;

   //
   // Private functions
   //      
   function stateChanged() 
   { 
      if( 4 == m_oXmlHttp.readyState || m_oXmlHttp.readyState=="complete")
      {
         if(m_fncallback)
         {
            if(m_param)
            {
               m_fncallback(m_oXmlHttp.responseText,m_param);
            }
            else
            {
               m_fncallback(m_oXmlHttp.responseText);
            }
         }
         m_bPostingData = false;
      } 
   } 

   function GetXmlHttpObject(handler)
   { 
      var oXmlHttp = null;
      if( navigator.userAgent.indexOf("Opera") >= 0 )
      {
         return;
      }
      if(navigator.userAgent.indexOf("MSIE") >= 0 )
      { 
         var strName="Msxml2.XMLHTTP";
         if (navigator.appVersion.indexOf("MSIE 5.5")>=0)
         {
            strName = "Microsoft.XMLHTTP";
         } 
         try
         { 
            oXmlHttp = new ActiveXObject(strName);
            oXmlHttp.onreadystatechange=handler;
            return oXmlHttp;
         } 
         catch(e)
         { 
            return;
         } 
      } 
      if(navigator.userAgent.indexOf("Mozilla") >= 0 )
      {
         oXmlHttp = new XMLHttpRequest();
         oXmlHttp.onload  = handler;
         oXmlHttp.onerror = handler;
         return oXmlHttp;
      }
   } 

   function getEncodedFormData(a_oFormElement)
   {
      if(!a_oFormElement.elements) return '';
      
      var szEncodedFormData = '';
      for(var i = 0;i < a_oFormElement.elements.length;i++)
      {
         switch(a_oFormElement.elements[i].type)
         {
            case 'text':
            case 'textarea':
            case 'password':
                  if(!a_oFormElement.elements[i].disabled)
                  {
                     szEncodedFormData += a_oFormElement.elements[i].name + 
                                          '=' + encodeURI(a_oFormElement.elements[i].value) + '&';
                  }
                  break;
            case 'hidden':
                  szEncodedFormData += a_oFormElement.elements[i].name +
                                       '=' + encodeURI(a_oFormElement.elements[i].value) + '&';
                  break;
            case 'checkbox':
                  if(a_oFormElement.elements[i].checked && !a_oFormElement.elements[i].disabled)
                  {
                     szEncodedFormData += a_oFormElement.elements[i].name + 
                                          '=' + encodeURI(a_oFormElement.elements[i].value) + '&';
                  } 
                  break;
            case 'radio':
            case 'select-one':
                  if(!a_oFormElement.elements[i].disabled)
                  {
                      szEncodedFormData += encodeURI(a_oFormElement.elements[i].name + "=" + a_oFormElement.elements[i].options[a_oFormElement.elements[i].selectedIndex].value) + "&";
                  }
                  break;
            case 'select-multiple':
                  if (!a_oFormElement.elements[i].disabled)
                  {
                     for (var j = 0; j < a_oFormElement.elements[i].length; j++)
                     {
                        var optElem = a_oFormElement.elements[i].options[j];
                        if(optElem.selected == true)
                        {
                           szEncodedFormData += elem.name + "[]" + "=" + encodeURI(optElem.value) + "&";
                        }
                     }
                  }
                  break;
            case 'button':
            case 'file':
            case 'reset':
            case 'submit':
                  //Not supported at this time
               break;

          } //End of switch(a_oFormElement.elements[i].type)
      }
      szEncodedFormData = szEncodedFormData.substr(0,(szEncodedFormData.length - 1));
      return szEncodedFormData;
     
   } //End of function getEncodedFormData(a_oFormElement)

   function abort()
   {
      if(m_oXmlHttp && m_bPostingData)
      {
         m_oXmlHttp.abort();
      };

      m_fncallback = null;
      m_param = null;
      m_oXmlHttp = null;
      m_bPostingData = false;
   }

   function sendPost(a_szMessage,a_fnCallback,a_param)
   {
      if(!a_szMessage) return;

      m_oXmlHttp = GetXmlHttpObject(stateChanged);
      if(m_oXmlHttp)
      {
         m_bPostingData = true;
         m_fncallback = a_fnCallback;
         m_param = a_param;
         m_oXmlHttp.open("POST", m_szServerPage , true);
         m_oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
         m_oXmlHttp.send(m_szPostMessage);
      }
   }

} //End of function AJAX(a_szServerPage)

function CAdvancedFormSupportFormStatus(a_cValidateForm, a_szSubmitID, a_szNameID, a_szRankRate, a_szEmailAddressID, a_szPhoneNumberID, a_szoptErrorMessageID)
{
   //
   // Public variables
   //
   var m_cValidateForm = a_cValidateForm;
   this.m_cValidateForm = m_cValidateForm;

   var m_szSubmitID = a_szSubmitID;
   this.m_szSubmitID = m_szSubmitID;

   var m_szNameID = a_szNameID;
   this.m_szNameID = m_szNameID;
   
   var m_szRankRate = a_szRankRate;
   this.m_szRankRate = m_szRankRate;

   var m_szEmailAddressID = a_szEmailAddressID;
   this.m_szEmailAddressID = m_szEmailAddressID;

   var m_szPhoneNumberID = a_szPhoneNumberID;
   this.m_szPhoneNumberID = m_szPhoneNumberID;

   var m_szoptErrorMessageID = a_szoptErrorMessageID;
   this.m_szoptErrorMessageID = m_szoptErrorMessageID;


   var m_arrItemSelStore = new Array();
   for(var i=8;i<arguments.length;i++)
   {
      m_arrItemSelStore[i] = eiAdvancedFormSupport(arguments[i]);
   }

   var m_arrImageStore = {
                           good:       "url('images/formstatus/form_item_good.gif')",
                           bad:        "url('images/formstatus/form_item_bad.gif')",
                           busy:       "url('images/formstatus/form_item_busy.gif')",
                           required:   "url('images/formstatus/form_item_required.gif')"
                         };
   this.m_arrImageStore = m_arrImageStore;
   //
   // Private variables
   //
   var m_szResponseText;
   var m_oSubmit       = eiAdvancedFormSupport(m_szSubmitID);
   var m_oSendFormData = (m_oSubmit) ? new CAdvancedFormSupportAJAX('advancedformsupport.php') : null;
   var m_oErrorMessage = eiAdvancedFormSupport(m_szoptErrorMessageID);

   for(var szItemSel in m_arrItemSelStore)
   {
      for(var szItemSel in m_arrItemSelStore)
      {
         var oe = m_arrItemSelStore[szItemSel];
         if(oe)
         {
            m_arrItemSelStore.isEmpty = false;
            break;         
         }
      }
   }

   var m_arrItemStore = {
                           name         :  eiAdvancedFormSupport(m_szNameID),
                           rankrate     :  eiAdvancedFormSupport(m_szRankRate),
                           emailaddress :  eiAdvancedFormSupport(m_szEmailAddressID),
                           phonenumber  :  eiAdvancedFormSupport(m_szPhoneNumberID)
                        };
   if(m_arrItemStore['phonenumber'])
   {
      m_arrItemStore['phonenumber'].areacode          = eiAdvancedFormSupport(m_szPhoneNumberID + "areacode");
      m_arrItemStore['phonenumber'].localnumberprefix = eiAdvancedFormSupport(m_szPhoneNumberID + "localnumberprefix");
      m_arrItemStore['phonenumber'].localnumbersuffix = eiAdvancedFormSupport(m_szPhoneNumberID + "localnumbersuffix");
   }
   //
   // Constructor
   //
   if(isDefAdvancedFormSupport(m_cValidateForm,m_oSubmit,m_arrItemStore) )
   {
      if(isDefAdvancedFormSupport(m_oSubmit.disabled))
      {
         m_oSubmit.disabled = true;         
      }
      m_oSubmit.onclick = checkValidSubmit;

      for(var szItem in m_arrItemStore)
      {
         var oe = m_arrItemStore[szItem];
         if(oe)
         {
            oe.oStatus      = eiAdvancedFormSupport(oe.id + '_status');
            oe.isItemValid  = false;
            oe.isItemblured = false;
         }
      }

      var oStatus = null;
      for(var szItemSel in m_arrItemSelStore)
      {
         var oe = m_arrItemSelStore[szItemSel];
         if(oe)
         {
            oTestStatus = eiAdvancedFormSupport(oe.id + '_status');
            if(oTestStatus)
            {
               oStatus = oTestStatus;
            }
            oe.oStatus = oStatus;
            oe.onchange     = itemSelChange;
         }
      }

      if(m_arrItemStore['name'])        { m_arrItemStore['name'].onkeyup         = itemNameKeyUp;           m_arrItemStore['name'].onblur         = itemNameBlur;         }
      if(m_arrItemStore['rankrate'])    { m_arrItemStore['rankrate'].onkeyup     = itemRankRateKeyUp;       m_arrItemStore['rankrate'].onblur     = itemRankRateBlur;     }
      if(m_arrItemStore['emailaddress']){ m_arrItemStore['emailaddress'].onkeyup = itemEmailAddressKeyUp;   m_arrItemStore['emailaddress'].onblur = itemEmailAddressBlur; }

      if( m_arrItemStore['phonenumber'] && m_arrItemStore['phonenumber'].areacode && m_arrItemStore['phonenumber'].localnumberprefix && m_arrItemStore['phonenumber'].localnumbersuffix )
      {
         m_arrItemStore['phonenumber'].onkeyup  = itemPhoneNumberKeyUp;
         m_arrItemStore['phonenumber'].onblur  = itemPhoneNumberBlur;
      }
   }
   //
   // Public functions
   //
   //
   // Private functions
   //
   function itemSelChange(a_e)
   {
      var oe = getElementFromEventAdvancedFormSupport(a_e);
      if(!oe) return;
      if(null == oe.oStatus) return;

      var bIsItemValid = false;
      for(var szItemSel in m_arrItemSelStore)
      {
         var oItem = m_arrItemSelStore[szItemSel];
         if(oItem)
         {
            if(oItem.selectedIndex > 0)
            {
               bIsItemValid = true;
            }
         }
      }

      if(bIsItemValid)
      {
         setStatus(oe, 'good', '');
      }
      else
      {
         setStatus(oe, 'bad', 'Please select at least one unit to reserve.')
      }
   }
   
   function itemRankRateBlur(a_e)
   {
      var oe = getElementFromEventAdvancedFormSupport(a_e);
      if(!oe) return;
      if(null == oe.oStatus) return;

      oe.isItemblured = true;
      itemRankRateKeyUp(a_e);
   }

   function itemRankRateKeyUp(a_e)
   {
      var oe = getElementFromEventAdvancedFormSupport(a_e);
      if(!oe) return;
      if(null == oe.oStatus) return;
      if(!oe.isItemblured) return;

      oe.isItemValid = false;
      if(m_cValidateForm.isDimention(oe, 3, 40) )
      {
         setStatus(oe, 'good', '');
         return;
      }
      if("" == trimAdvancedFormSupport(oe.value))
      {
         oe.isItemblured = false;
         setStatus(oe, 'required', '');
         return;
      }
      setStatus(oe, 'bad', 'Invalid Rank/Rate');
   }

   function itemNameBlur(a_e)
   {
      var oe = getElementFromEventAdvancedFormSupport(a_e);
      if(!oe) return;
      if(null == oe.oStatus) return;

      oe.isItemblured = true;
      itemNameKeyUp(a_e);
   }

   function itemNameKeyUp(a_e)
   {
      var oe = getElementFromEventAdvancedFormSupport(a_e);
      if(!oe) return;
      if(null == oe.oStatus) return;
      if(!oe.isItemblured) return;

      oe.isItemValid = false;
      if(m_cValidateForm.isNameValid(oe) && m_cValidateForm.isDimention(oe, 3, 40) )
      {
         setStatus(oe, 'good', '');
         return;
      }
      if("" == trimAdvancedFormSupport(oe.value))
      {
         oe.isItemblured = false;
         setStatus(oe, 'required', '');
         return;
      }
      setStatus(oe, 'bad', 'Invalid Name');
   }

   function itemEmailAddressBlur(a_e)
   {
      var oe = getElementFromEventAdvancedFormSupport(a_e);
      if(!oe) return;
      if(null == oe.oStatus) return;

      oe.isItemblured = true;
      itemEmailAddressKeyUp(a_e);
   }

   function itemEmailAddressKeyUp(a_e)
   {
      var oe = getElementFromEventAdvancedFormSupport(a_e);
      if(!oe) return;
      if(null == oe.oStatus) return;
      if(!oe.isItemblured) return;

      oe.isItemblured = false;
      if(m_cValidateForm.isEmailValid(oe) && m_cValidateForm.isDimention(oe, 9, 40) )
      {
         if( m_cValidateForm.isEmailAddressDomainNameLegal(oe) )
         {
            var bReturn = checkUserExistOnEmailAddressHost(oe);
            if(null == bReturn)
            {
               setStatus(oe, 'busy', 'Verifying user...');
               return;
            }
            else if( bReturn )
            {
               setStatus(oe, 'good', '');
               return;
            }
            else
            {
               setStatus(oe, 'bad', 'Invalid User on Email Host Address');
               return;
            }
         }
      }
      if("" == trimAdvancedFormSupport(oe.value))
      {
         setStatus(oe, 'required', '');
         return;
      }
      setStatus(oe, 'bad', 'Malformed Email Address');
   }

   function itemPhoneNumberBlur(a_e)
   {
      var oe = getElementFromEventAdvancedFormSupport(a_e);
      if(!oe) return;
      if(null == oe.oStatus) return;

      oe.isItemblured = true;
      itemPhoneNumberKeyUp(a_e);
   }

   function itemPhoneNumberKeyUp(a_e)
   {
      var oe = getElementFromEventAdvancedFormSupport(a_e);
      if(!oe) return;
      if(null == oe.oStatus) return;
      if(!oe.isItemblured) return;

      if( m_cValidateForm.isUSPhoneNumberFormatValid(oe) )
      {
         if( m_cValidateForm.isUSPhoneNumberLegal(oe) )
         {
            var szUSAreaCodeRegion = m_cValidateForm.getUSAreaCodeRegion(oe);
            if(szUSAreaCodeRegion)
            {
               m_arrItemStore['phonenumber'].areacode.value          = m_cValidateForm.getUSAreaCode(oe);
               m_arrItemStore['phonenumber'].localnumberprefix.value = m_cValidateForm.getUSLocalNumberHi(oe);
               m_arrItemStore['phonenumber'].localnumbersuffix.value = m_cValidateForm.getUSLocalNumberLow(oe);

               setStatus(oe, 'good', 'Area Code Region: ' + szUSAreaCodeRegion);
               return;
            }
            else
            {
               setStatus(oe, 'bad', 'Invalid Area Code Region');
               return;
            }

         }
         else
         {
            setStatus(oe, 'bad', 'Illegal Phone Number');
            return;
         }
      }
      if("" == trimAdvancedFormSupport(oe.value))
      {
         oe.isItemblured = false;
         setStatus(oe, 'required', '');
         return;
      }
      setStatus(oe, 'bad', 'Invalid Phone Number');
   }


   function setStatus(a_oe, a_szState, a_szErrorMessage)
   {
      var szImageSrc = m_arrImageStore[a_szState];
      if(null == szImageSrc) return;
      a_oe.oStatus.style.backgroundImage = szImageSrc;

      if('good' == a_szState)
      {
         a_oe.isItemValid = true;
      }
      else
      {
         a_oe.isItemValid = false;
      }

      var bInvalid = false;
      for(var szItem in m_arrItemStore)
      {
         var oItem = m_arrItemStore[szItem];
         if(oItem && (null != oItem.isItemValid))
         {
            if(!oItem.isItemValid)
            {
               bInvalid = true;
            }
         }
      }

      if(false == m_arrItemSelStore.isEmpty)
      {
         var bSelValid = null;
         for(var szItemSel in m_arrItemSelStore)
         {
            var oe = m_arrItemSelStore[szItemSel];
            if(oe)
            {
               if(oe.selectedIndex > 0)
               {
                  bSelValid = true;
                  break;
               }
               else
               {
                  bSelValid = false;
               }
            }
         }
   
         if(null == bSelValid)
         {
            //Do nothing
         }
         else if(!bInvalid)
         {
            bInvalid = !bSelValid;
         }
      }

      if(isDefAdvancedFormSupport(m_oSubmit.disabled))
      {
         m_oSubmit.disabled = bInvalid;
      }

      switch(a_szState)
      {
         case 'bad':
            a_oe.disabled = false;
            if(m_oErrorMessage) m_oErrorMessage.style.color = "#ff0000";
            if(m_oErrorMessage) m_oErrorMessage.innerHTML = a_szErrorMessage;
            break;
         case 'busy':
            a_oe.disabled = true;
            if(m_oErrorMessage) m_oErrorMessage.style.color = "#000000";
            if(m_oErrorMessage) m_oErrorMessage.innerHTML = a_szErrorMessage;
            break;
         case 'good':
         case 'required':
            a_oe.disabled = false;
            if(m_oErrorMessage) m_oErrorMessage.style.color = "#000000";
            if(m_oErrorMessage) m_oErrorMessage.innerHTML = a_szErrorMessage;
            break;
         default:
            if(m_oErrorMessage) m_oErrorMessage.innerHTML = '_Illegal State_';
            break;
      }
  } //End of setStatus(a_oe, a_szState, a_szErrorMessage)

   function checkUserExistOnEmailAddressHost(a_oInput)
   {
      if(!a_oInput) return;
      if(!m_cValidateForm) return;
      var szEmailAddress = a_oInput.value;

      if(szEmailAddress)
      {
         var bReturn = checkCache(a_oInput,szEmailAddress);
         if(null == bReturn)
         {
            m_oSendFormData.postEmailAddress(szEmailAddress,recieveUserExistOnEmailAddressHostResponse,a_oInput);
            return null;
         }
         else
         {
            return bReturn;
         }
      }
      return false;      
   }

   function checkValidSubmit()
   {
      if(!m_oSendFormData) return false;

      for(var szItem in m_arrItemStore)
      {
         var oe = m_arrItemStore[szItem];
         if(oe)
         {
            if(oe.isItemValid)
            {
            }
            else
            {
               return false;
            }
         }
      }

      if(false == m_arrItemSelStore.isEmpty)
      {
         for(var szItemSel in m_arrItemSelStore)
         {
            var oe = m_arrItemSelStore[szItemSel];
            if(oe)
            {
               if(oe.selectedIndex > 0)
               {
                  m_oSubmit.value = "Processing..."
            
                  return true;
               }
               else
               {
               }
            }
         }
         return false;
      }

      m_oSubmit.value = "Processing..."

      return true;

   }

   function recieveUserExistOnEmailAddressHostResponse(a_szResponseText,a_oInput)
   {
      m_szResponseText = a_szResponseText;
      if(!m_szResponseText) return;
      if(!a_oInput) return;
      if('404' == m_szResponseText)
      {
         addToBadCache(a_oInput);
         setStatus(a_oInput, 'bad', 'Invalid User on Email Host Address');
         return;
      }
      else
      {
         addToGoodCache(a_oInput);
         setStatus(a_oInput, 'good', '');
      }
   }

   function checkCache(a_oInput, a_szValue)
   {
      if(!a_oInput) return null;
      if(!a_szValue) return null;

      if(a_oInput.goodCache)
      {
         if( a_oInput.goodCache[a_szValue.toLowerCase()] )
         {
            return true;
         }
      }
      if(a_oInput.badCache)
      {
         if( a_oInput.badCache[a_szValue.toLowerCase()] )
         {
            return false;
         }
      }
      return null;
   }

   function addToBadCache(a_oInput)
   {
      if(null == a_oInput.badCache)
      {
         a_oInput.badCache = new Array();
      }
      a_oInput.badCache[a_oInput.value.toLowerCase()] = true;
   }

   function addToGoodCache(a_oInput)
   {
      if(null == a_oInput.goodCache)
      {
         a_oInput.goodCache = new Array();
      }
      a_oInput.goodCache[a_oInput.value.toLowerCase()] = true;
   }

} //End of function CFormStatus(a_szSubmitID, a_szMyWebSiteID, a_szNameID, a_szEmailAddressID, a_szPhoneNumberID, a_szoptErrorMessageID)
