//
// AJAX wrapper
//
function AJAX(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() + "&event=verifyemailaddress&emailaddress=" + encodeURI(a_szEmailAddress);

      sendPost(m_szPostMessage, a_fnCallback, a_param);
   }
   this.postEmailAddress = postEmailAddress;

   function postHost(a_szHost, a_fnCallback, a_param)
   {
      if(!a_szHost);
      if(!m_szServerPage) return;
      abort();

      m_szPostMessage = "sid=" + Math.random() + "&event=verifyhost&host=" + encodeURI(a_szHost);

      sendPost(m_szPostMessage, a_fnCallback, a_param);

   }
   this.postHost = postHost;

   function postForm(a_oFormElement, a_fnCallback, a_param)
   {
      if(!a_oFormElement) return;
      if(!m_szServerPage) return;
      abort();

      m_szPostMessage = "sid=" + Math.random() + '&event=submitform&';
      var formEncodedString = getEncodedFormData(a_oFormElement);

      if(formEncodedString)
      {
         m_szPostMessage += formEncodedString;

         sendPost(m_szPostMessage,a_fnCallback, a_param);
      }
   }
   this.postForm = postForm;

   function abort()
   {
      if(m_oXmlHttp && m_bPostingData)
      {
         m_oXmlHttp.abort();
      };

      m_fncallback = null;
      m_param = null;
      m_oXmlHttp = null;
      this.m_szResponseText = null;
      m_bPostingData = false;
   }
   this.abort = abort;

   function sendPost(a_szMessage,a_fnCallback,a_param,a_bAsync)
   {
      if(!a_szMessage) return;

      m_oXmlHttp = GetXmlHttpObject(stateChanged);
      if(m_oXmlHttp)
      {
         this.m_szResponseText = null;
         m_bPostingData = true;
         m_fncallback = a_fnCallback;
         m_param = a_param;
         if( (null == a_bAsync) || a_bAsync )
         {
            m_oXmlHttp.open("POST", m_szServerPage , true);
         }
         else
         {
            m_oXmlHttp.open("POST", m_szServerPage , false);
         }
         m_oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
         m_oXmlHttp.send(a_szMessage);
         if( (null == a_bAsync) || a_bAsync )
         {
            //Wait for stateChanged
         }
         else
         {
            this.m_szResponseText = m_oXmlHttp.responseText;
            m_bPostingData = false;
         }
      }
   }
   this.sendPost = sendPost;

   //
   // 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 null;
      }
      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 null;
         } 
      } 
      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 + 
                                          '=' + encodeURIComponent(a_oFormElement.elements[i].value) + '&';
                  }
                  break;
            case 'hidden':
                  szEncodedFormData += a_oFormElement.elements[i].name +
                                       '=' + encodeURIComponent(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 + 
                                          '=' + encodeURIComponent(a_oFormElement.elements[i].value) + '&';
                  } 
                  break;
            case 'radio':
            case 'select-one':
                  if(!a_oFormElement.elements[i].disabled)
                  {
                      //szEncodedFormData += encodeURIComponent(a_oFormElement.elements[i].name + "=" + a_oFormElement.elements[i].options[a_oFormElement.elements[i].selectedIndex].value) + "&";
                      szEncodedFormData += a_oFormElement.elements[i].name + "=" + encodeURIComponent( a_oFormElement.elements[i].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 + "[]" + "=" + encodeURIComponent(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)

} //End of function AJAX(a_szServerPage)


