// This section just tests AJAX on their browser to see if it is supported. 
var httpRequest = false;

try { 
	// Mozilla, Safari, ...
	httpRequest = new XMLHttpRequest();
	/* This section isn't required for testing, but you do need it for the actual request.
	if (httpRequest.overrideMimeType) {
		//httpRequest.overrideMimeType('text/xml');
		httpRequest.overrideMimeType('text/html');
	}*/
} catch (e) { 
  	// IE
   try {
   	httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
  	} catch (e) {
      try {
           httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
       	httpRequest = false;
     	}
   }
}

if (!httpRequest) {
	alert("Your browser does not support AJAX!");
}

// Clear the variable.
httpRequest = null;

function makeRequest(mode, target, url, obj){

	// If you don't create a new request here, IE won't work beyond the first request, though
	// optimally you would create the variable above and re-use it...

	var httpRequest = false;
	
	try { 
		// Mozilla, Safari, ...
		httpRequest = new XMLHttpRequest();
		if (httpRequest.overrideMimeType) {
			//httpRequest.overrideMimeType('text/xml');
			httpRequest.overrideMimeType('text/html');
		}
	} catch (e) { 
	  	// IE
	   try {
	   	httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
	  	} catch (e) {
	      try {
	           httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
	      } catch (e) {
	       	httpRequest = false;
	     	}
	   }
	}
	
	if (!httpRequest) {
		alert("Your browser does not support AJAX!");
	} else {
		switch (mode) {
			case 'POST':
				var param = "";
				for (i=0; i < obj.elements.length; i++) {
			      if (obj.elements[i].tagName == "INPUT") {
			         if (obj.elements[i].type == "text") {
			            param += obj.elements[i].name + "=" + obj.elements[i].value + "&";
			         }
			         if (obj.elements[i].type == "checkbox") {
			            if (obj.elements[i].checked) {
			               param += obj.elements[i].name + "=" + obj.elements[i].value + "&";
			            }
			         }
			         if (obj.elements[i].type == "radio") {
			            if (obj.elements[i].checked) {
			               param += obj.elements[i].name + "=" + obj.elements[i].value + "&";
			            }
			         }
			      }
			      if (obj.elements[i].type == "textarea") {
			      	param += obj.elements[i].name + "=" + obj.elements[i].value + "&";
			      }
			      if (obj.elements[i].tagName == "SELECT") {
			         var sel = obj.elements[i];
			         param += sel.name + "=" + sel.options[sel.selectedIndex].value + "&";
			      }
			   }
			   if (param.length > 0) {
			   	param = param.substring(0, param.length - 1);
			   }
			break;
		}
		
		httpRequest.onreadystatechange = function() {
			try {
				if (httpRequest.readyState == 4) {
					if (httpRequest.status == 200) {
						if (document.getElementById(target).tagName == "SELECT") {
							select_innerHTML(document.getElementById(target), httpRequest.responseText);
						} else {
							document.getElementById(target).innerHTML = httpRequest.responseText;
						}
					} else {
						alert('There was a problem with the request.');
					}
		      } else {
		      		if (document.getElementById(target).tagName == "SELECT") {
							select_innerHTML(document.getElementById(target), "Loading...please wait.");
						} else {	
		      			document.getElementById(target).innerHTML = "Loading...please wait.";
		      		}
		      }
			} catch (e) {
				alert('Caught Exception: ' + e.description);
			}
		}
		
		switch (mode) {
			case 'POST':
				try {
					httpRequest.open('POST', url, true);
				   httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				   httpRequest.setRequestHeader("Content-length", param.length);
				   httpRequest.setRequestHeader("Connection", "close");
				   httpRequest.send(param);
				} catch (e) {
					alert('Caught Error: ' + e.description);
				}
			break;
			case 'GET':
				try {
					httpRequest.open('GET', url, true);
					httpRequest.send(null);
				} catch (e) {
					alert('Caught Error: ' + e.description);
				}
			break;
		}
	}
}

function select_innerHTML(objeto, innerHTML){
/******
* select_innerHTML - innerHTML to add option(s) to select(s)
* Problem: http://support.microsoft.com/default.aspx?scid=kb;en-us;276228
* Creative Commons license
* Versão: 1.0 - 06/04/2006
* Author: Micox - Náiron J.C.G - micoxjcg@yahoo.com.br - elmicoxcodes.blogspot.com
* Parametros:
* objeto(tipo object): the select
* innerHTML(tipo string): the new innerHTML
*******/
    objeto.innerHTML = ""
    //creating phantom element to receive temp innerHTML
    var selTemp = document.createElement("micoxselect")
    var opt;
    selTemp.id="micoxselect1"
    document.body.appendChild(selTemp)
    selTemp = document.getElementById("micoxselect1")
    selTemp.style.display="none"
    if(innerHTML.toLowerCase().indexOf("<option")<0){//if not option, convert do option
        innerHTML = "<option>" + innerHTML + "</option>"
    }
    innerHTML = innerHTML.replace(/<option/g,"<span").replace(/<\/option/g,"</span")
    selTemp.innerHTML = innerHTML
    //transfering childs of phantom element to options
    for(var i=0;i<selTemp.childNodes.length;i++){
        if(selTemp.childNodes[i].tagName){
            opt = document.createElement("OPTION")
            for(var j=0;j<selTemp.childNodes[i].attributes.length;j++){
                opt.setAttributeNode(selTemp.childNodes[i].attributes[j].cloneNode(true))
            }
            opt.value = selTemp.childNodes[i].getAttribute("value")
            opt.text = selTemp.childNodes[i].innerHTML
            if(document.all){ //IEca
                objeto.add(opt)
            }else{
                objeto.appendChild(opt)
            }                    
        }    
    }
    //clear phantom
    document.body.removeChild(selTemp)
    selTemp = null
}