/*
 * Copyright 2005 Matthew Eernisse (mde@fleegix.org)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Original code by Matthew Eernisse (mde@fleegix.org), March 2005
 * Additional bugfixes by Mark Pruett (mark.pruett@comcast.net), 12th July 2005
 * Multi-select added by Craig Anderson (craig@sitepoint.com), 24th August 2006
 *
 * Version 1.3
*/

/**
 * Serializes the data from all the inputs in a Web form
 * into a query-string style string.
 * @param docForm -- Reference to a DOM node of the form element
 * @param formatOpts -- JS object of options for how to format
 * the return string. Supported options:
 *    collapseMulti: (Boolean) take values from elements that
 *    can return multiple values (multi-select, checkbox groups)
 *    and collapse into a single, comman-delimited value
 *    (e.g., thisVar=asdf,qwer,zxcv)
 * @returns query-string style String of variable-value pairs
 */
function formData2QueryString(docForm, formatOpts) {
  
  var opts = formatOpts || {};
  var str = '';
  var formElem;
  var lastElemName = '';
  
  for (i = 0; i < docForm.elements.length; i++) {
    formElem = docForm.elements[i];
    
    switch (formElem.type) {
      // Text fields, hidden form elements
      case 'text':
      case 'hidden':
      case 'password':
      case 'textarea':
      case 'select-one':
        str += formElem.name + '=' + encodeURI(formElem.value) + '&'
        break;
        
      // Multi-option select
      case 'select-multiple':
        var isSet = false;
        for(var j = 0; j < formElem.options.length; j++) {
          var currOpt = formElem.options[j];
          if(currOpt.selected) {
            if (opts.collapseMulti) {
              if (isSet) {
                str += ',' + encodeURI(currOpt.value);
              }
              else {
                str += formElem.name + '=' + encodeURI(currOpt.value);
                isSet = true;
              }
            }
            else {
              str += formElem.name + '=' + encodeURI(currOpt.value) + '&';
            }
          }
        }
        if (opts.collapseMulti) {
          str += '&';
        }
        break;
      
      // Radio buttons
      case 'radio':
        if (formElem.checked) {
          str += formElem.name + '=' + encodeURI(formElem.value) + '&'
        }
        break;
        
      // Checkboxes
      case 'checkbox':
        if (formElem.checked) {
          // Collapse multi-select into comma-separated list
          if (opts.collapseMulti && (formElem.name == lastElemName)) {
            // Strip of end ampersand if there is one
            if (str.lastIndexOf('&') == str.length-1) {
              str = str.substr(0, str.length - 1);
            }
            // Append value as comma-delimited string
            str += ',' + encodeURI(formElem.value);
          }
          else {
            str += formElem.name + '=' + encodeURI(formElem.value);
          }
          str += '&';
          lastElemName = formElem.name;
        }
        break;
        
    }
  }
  // Remove trailing separator
  str = str.substr(0, str.length - 1);
  return str;
}


var http_request = false; 
var strObject = false;
var $rt = false;
var $nofade=0;


function ff2() {
  $so=document.getElementById(strObject);
  $so.innerHTML=$rt;
  $("#"+strObject).fadeIn(1000);
}
	
function ff() {
  $("#"+strObject).fadeOut(300);
  setTimeout('ff2()',300);
}

function makeRequestNofade(url,objName,nofading) { 
  strObject=objName;
  $nofade=nofading;
  document.getElementById(objName).style.display="block";
  makeRequest(url,objName);  
}
function makeRequest(url,objName) { 
	 strObject=objName;
     if (window.XMLHttpRequest) { // Mozilla, Safari,... 
         http_request = new XMLHttpRequest(); 
     } else if (window.ActiveXObject) { // IE 
         http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     http_request.onreadystatechange = updateItem; 
     http_request.open('GET', url, true); 
     http_request.send(null); 
} 

function updateItem() { 
     if (http_request.readyState == 4) { 
         if (http_request.status == 200) { 
             responseText=http_request.responseText;
             $rt=responseText;
             if ($nofade==0) {
             ff();} else {
             document.getElementById(strObject).innerHTML=responseText; 
             }
         } else { 
             document.getElementById(strObject).innerHTML="System Error: Code=Ajax"; 
         } 
     } 
}



function makeRequestField(url,objName) { 
	   strObject=objName;
       if (window.XMLHttpRequest) { // Mozilla, Safari,... 
           http_request = new XMLHttpRequest(); 
       } else if (window.ActiveXObject) { // IE 
           http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
       } 
       http_request.onreadystatechange = updateItemField; 
       http_request.open('GET', url, true); 
       http_request.send(null); 
} 

function updateItemField() { 
       if (http_request.readyState == 4) { 
           if (http_request.status == 200) { 
               responseText=http_request.responseText;
               document.getElementById(strObject).value=responseText; 
           } else { 
               document.getElementById(strObject).value="*** Error ***"; 
           } 
       } 
}




   var mrSelectData = '';
   
   function makeRequestSelect(url,objName,data) { 
	   strObject=objName;
	   mrSelectData=data;
       if (window.XMLHttpRequest) { // Mozilla, Safari,... 
           http_request = new XMLHttpRequest(); 
       } else if (window.ActiveXObject) { // IE 
           http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
       } 
       http_request.onreadystatechange = updateItemSelect; 
       http_request.open('GET', url, true); 
       http_request.send(null); 
} 

function updateItemSelect() { 
       if (http_request.readyState == 4) { 
           if (http_request.status == 200) { 
					document.getElementById(strObject).innerHTML=mrSelectData+http_request.responseText+'</select>'; 
           } else { 
					document.getElementById(strObject).innerHTML="Data unavailable"; 
			} 
       } 
}

function makeRequestOptions(url,objName) { 
	   strObject=objName;
    if (window.XMLHttpRequest) { // Mozilla, Safari,... 
        http_request = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { // IE 
        http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    http_request.onreadystatechange = updateItemSelect; 
    http_request.open('GET', url, true); 
    http_request.send(null); 
} 

function updateItemSelect() { 
    if (http_request.readyState == 4) { 
        if (http_request.status == 200) { 
					document.getElementById(strObject).innerHTML=http_request.responseText; 
        } else { 
					document.getElementById(strObject).innerHTML="Data unavailable"; 
			} 
    } 
}




function makeRequestForm(url,objName,formName) { 

//alert(url+' - '+objName+' - '+formName);

       var myformName=document.getElementById(formName);
	   strObject=objName;
       if (window.XMLHttpRequest) { // Mozilla, Safari,... 
           http_request = new XMLHttpRequest(); 
       } else if (window.ActiveXObject) { // IE 
           http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
       } 
       http_request.onreadystatechange = updateItemForm; 
       http_request.open('POST', url, true); 
       http_request.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); 
       formParams=formData2QueryString(myformName);
//       alert(formParams);
       http_request.send(formParams); 
} 

function updateItemForm() { 
       if (http_request.readyState == 4) { 
           if (http_request.status == 200) { 
               document.getElementById(strObject).innerHTML=http_request.responseText; 
           } else { 
               document.getElementById(strObject).innerHTML="There was a problem with the request"; 
           } 
       } 
}

 
function makeRequestFunction(url,$fName) { 
    if (window.XMLHttpRequest) { // Mozilla, Safari,... 
        http_request = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { // IE 
        http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    http_request.onreadystatechange = window[$fName]; //loadCompanyData; 
    http_request.open('GET', url, true); 
    http_request.send(null); 
} 



function makeRequestPost(url,params,strObject) { 
    if (window.XMLHttpRequest) { // Mozilla, Safari,... 
        http_request = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { // IE 
        http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 

    http_request.open("POST", url, true);

    //Send the proper header information along with the request
    http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    http_request.setRequestHeader("Content-length", params.length);
    http_request.setRequestHeader("Connection", "close");

    http_request.onreadystatechange = function() {//Call a function when the state changes.
        if (http_request.readyState == 4) { 
            if (http_request.status == 200) { 
                responseText=http_request.responseText;
                $rt=responseText;
                document.getElementById(strObject).innerHTML=responseText; 
            } else { 
                document.getElementById(strObject).innerHTML="System Error: Code=Ajax"; 
            } 
        } 
    }
    http_request.send(params);
 
} 



