/**
  * Javascript class for handling the xmlHttpRequest object
  *
  * @author Rick Robinson <rrobinson@itpdx.com>
  * @version 0.0.1
  *
  */
function scks_XHR()
{
    //Member Variables
    var m_XHR = false;
    var m_cbFunction = false;
    var m_sURL = "";
    var m_objForm = false;
    var m_sMethod = "POST";
    var m_sVariables = "";
    
    //Class Functions
    this.sendRequest = sendRequest;
    
    //Class Variables
    this.setForm = setForm;
    this.getForm = getForm;
    this.setCallback = setCallback;
    this.getCallback = getCallback;
    this.setURL = setURL;
    this.getURL = getURL;
    this.setMethod = setMethod;
    this.getMethod = getMethod;
    this.XHR = XHR;
    
    function setForm(objForm)    {m_objForm = objForm;}
    function getForm()           {return m_objForm;}
    function setCallback(cbFunc) {m_cbFunction = cbFunc;}
    function getCallback()       {return m_cbFunction;}
    function setURL(sURL)        {m_sURL = sURL;}    
    function getURL()            {return m_sURL;}    
    function setMethod(sMethod)  {m_sMethod = sMethod;}    
    function getMethod()         {return m_sMethod;}
    function XHR()               {return m_XHR;}
    
    //on initialization try and create a new xmlHttpRequest object
    //the return value should be checked to ensure success before
    //proceeding
    createXHR();
    if(!m_XHR)
    {
        return false;
    }else{
        return true;
    }
    
    /**
      * Trys to create a xmlHttpRequest object
      *     Internal function only
      */
    function createXHR()
    {
        m_XHR=false;
        // Check if IE
        if(window.ActiveXObject) {
    	    try {
        	    m_XHR = new ActiveXObject("Msxml2.XMLHTTP");
      	    } catch(e) {
        	    try {
          		    m_XHR = new ActiveXObject("Microsoft.XMLHTTP");
        	    } catch(e) {
          		    m_XHR = false;
        	    }
		    }
        // Netscape compatible browsers
        } else if(window.XMLHttpRequest) {
       	    
             try {
			    m_XHR = new XMLHttpRequest();
            } catch(e) {
			    m_XHR = false;
            }
        }

    }
    
    /**
      * Sends a 'GET' request based on member variables
      *     Internal Function
      *
      * @see sendRequest
      */
    function sendGET() 
    { 
     
        m_XHR.open(m_sMethod, m_sURL + "?" + m_sVariables); 
        m_XHR.onreadystatechange = m_cbFunction; 
        m_XHR.send(null); 
    }
    
    /**
      * Sends a post request based on member variables
      *     Internal Function
      *
      * @see sendRequest
      */ 
    function sendPOST() 
    {

        m_XHR.open(m_sMethod, m_sURL); 
        m_XHR.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        m_XHR.onreadystatechange = m_cbFunction;       
        m_XHR.send(m_sVariables);

    }
    
    /**
      * Sends xmlHttpRequest
      * 1. Checks value of m_sMethod
      * 2. Check value of m_objForm.Method
      * 3. Defaults to 'POST' 
      *
      * @param sMethod POST or GET
      *
      * @see sendPOST
      * @see sendGET
      */
    function sendRequest(sMethod)
    {
        buildRequestVariables();
        if(m_sMethod != "GET")
        {
            m_sMethod = "POST";
            sendPOST();
        }else{
            sendGET();
        }          
    }

    /**
      * Builds the request string based on form variables
      *     Internal Function
      * in the format of name=value&
      */
    function buildRequestVariables() 
    {
    
      
      var formElem;
      var lastElemName = '';
      
      m_sVariables = '';
      for (i = 0; i < m_objForm.elements.length; i++) {
        
        formElem = m_objForm.elements[i];
        var elName = formElem.name;
        switch (formElem.type) {
          // Text fields, hidden form elements
          case 'text':
          case 'hidden':
          case 'password':
          case 'textarea':
          case 'select-one':
            if(formElem.tagName == "SELECT")
            {
                if(formElem.value == "")
                {
                    m_sVariables += formElem.name + '=' + escape(formElem.options[formElem.selectedIndex].text) + '&';
                }else{
                     m_sVariables += formElem.name + '=' + escape(formElem.value) + '&';
                }
            }else{ 
                m_sVariables += formElem.name + '=' + escape(formElem.value) + '&';
            }
            break;
          case 'select-multiple':   
                //creates entries for all variables in a multiple select object.
                // if entry is not selected the format is elemname_idx=elemtext
                //if the entry is selected the format is elemname_sel_idx=elemtext   
                for( var o = 0; o < formElem.length; o++)
                {
                    m_sVariables += formElem.name + '_' + o + '=' + escape(formElem[o].text) + '&';
                    if(formElem[o].selected == true)
                    {
                        m_sVariables += formElem.name + '_sel_' + o + '=' + escape(formElem[o].text) + '&';
                    } 
                }
                   
            break;
          // Radio buttons
          case 'radio':
            if (formElem.checked) {
              m_sVariables += formElem.name + '=' + escape(formElem.value) + '&'
            }
            break;
            
          // Checkboxes
          case 'checkbox':
            if (formElem.checked) {
              // Continuing multiple, same-name checkboxes
              if (formElem.name == lastElemName) {
                // Strip of end ampersand if there is one
                if (m_sVariables.lastIndexOf('&') == m_sVariables.length-1) {
                  m_sVariables = m_sVariables.substr(0, m_sVariables.length - 1);
                }
                // Append value as comma-delimited string
                m_sVariables += ',' + escape(formElem.value);
              }
              else {
                m_sVariables += formElem.name + '=' + escape(formElem.value);
              }
              m_sVariables += '&';
              lastElemName = formElem.name;
            }
            break;
            
        }
      }
      // Remove trailing separator
      m_sVariables = m_sVariables.substr(0, m_sVariables.length - 1);
    }
    

}

