//-----------------------------------------------------------------------------------
function setOptions(selecttagid,values,alltext){//this will create option tags with values and returns qty of values
	var selectelem=document.getElementById(selecttagid);
	selectelem.options.length=0;
	var opt=document.createElement("OPTION");
	selectelem.options.add(opt);
	opt.innerHTML="All "+alltext;
	opt.value="";
	for(var i=0;i<values.length;i++){			
		opt=document.createElement("OPTION");
		selectelem.options.add(opt);
		opt.innerHTML=values[i];			
		opt.value=values[i];
	}
	return values.length;
}
//-----------------------------------------------------------------------------------
function optionsLoading(selecttagid,alltext){
	var selectelem=document.getElementById(selecttagid);
	selectelem.options.length=0;
	var opt=document.createElement("OPTION");
	selectelem.options.add(opt);
	opt.innerHTML=alltext;
	opt.value="";
	selectelem.disabled=true;
}
//=======================[ AJAX based class to make transparent requests to the server ]===========
function mAJAXRequest(){
	var requestObj;
	var request_location;
	var requestData;
	var responseType;
	var resp_parserFunction;
	var error_handlerFunction;
	var response;
	var reqType="POST";
	var resp_status;
	//------------------[ method to set type of returning data (if requested XML it has to be set to xml)
	this.setResponseType=function(type){
		responseType=type;
	}
	//------------------[ method to set request type (GET or POST(default))
	this.setRequestType=function(type){
		reqType=type;
	}
	this.setRequestLocation=function(toaddr){
		request_location=toaddr;
	}
	//------------------[ mthod to set data that will be transmitted
	this.setData=function(data){
		requestData=data;
	}
	//------------------[ method to assign function that will parse incoming response
	this.assignParser=function(parser){
		resp_parserFunction=parser;
	}
	//------------------[ method to assign function that will handle errors
	this.assignErrorHandler=function(errorFunc){
		error_handlerFunction=errorFunc;
	}
	//------------------[ this function will send request to the server
	this.send=function(){
		resp_status=false;
		if(window.ActiveXObject){
			requestObj = new ActiveXObject("Msxml2.XMLHTTP");
    	if(!requestObj)
      	requestObj = new ActiveXObject("Microsoft.XMLHTTP");
  		//----------------------------------------------------
		}else{//if FF we can reuse requestObj if we created it before so check for it first
			if(!requestObj)
				requestObj=new XMLHttpRequest();
			if(responseType=="xml")
				requestObj.overrideMimeType("text/xml");
		}
		//------------------------------------------------------
		requestObj.onreadystatechange=this.responseServer;
  	requestObj.open(reqType,request_location,true);
  	requestObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  	requestObj.send(requestData);//if no requestData and method is GET so for ie it has to be NULL but for ff it can be empty
  	return true;
	}
	//------------------[ private method for ajax
	this.responseServer=function(){
		try{
			if(requestObj.readyState==4){
  			var status=requestObj.status;
    		if(status==200){
    			if(responseType=="xml")
    				response=requestObj.responseXML;
    			else response=requestObj.responseText;
    			resp_parserFunction();//<-call our result parsing function
    			resp_status=true;
    		}else error_handlerFunction();
  		}
  	}catch(err){ error_handlerFunction(); }
 }
 this.getStatus=function(){
 	return resp_status;
 }
 //-------------------[ method to return response object
 this.getResponse=function(){
 		return response;
 }
}
//=================================================================================================
var searchReq=new mAJAXRequest();
searchReq.setRequestLocation(sURL+"isapi_xml.php");
searchReq.assignErrorHandler(onRequestError);
searchReq.setResponseType("xml");
searchReq.assignParser(searchParser);
var curMake;
var curType="ALL";
var typeID="type";
var makeID="make";
var modelID="model";
function requestData(){
	searchReq.setData("module=search&type="+curType+"&make="+curMake);
	searchReq.send();
}
function onRequestError(){
	alert("Error");
}
function searchParser(){
	try{
		var arr=new Array();
		if(curMake==""){
			var makes=searchReq.getResponse().getElementsByTagName("MAKE");
			if(makes.length > 0){
				for(var i=0;i<makes.length;i++){
					arr[i]=makes[i].childNodes[0].nodeValue;
				}
			}
			setOptions(makeID,arr,"Makes");
			setOptions(modelID,Array(),"Models");
		}else{
			var models=searchReq.getResponse().getElementsByTagName("MODEL");
			if(models.length > 0){
				for(var i=0;i<models.length;i++){
					arr[i]=models[i].childNodes[0].nodeValue;
				}
			}
			setOptions(modelID,arr,"Models");
		}
		document.getElementById(typeID).disabled=false;
		document.getElementById(makeID).disabled=false;
		document.getElementById(modelID).disabled=false;
	}catch(err){
		alert("error: "+err);
		document.getElementById(typeID).disabled=false;
		setOptions(makeID,Array(),"Makes");
		setOptions(modelID,Array(),"Models");
	}
}
function setMake(type){
	document.getElementById(typeID).disabled=true;
	optionsLoading(makeID,"Loading");
	optionsLoading(modelID,"All Models");
	curType=type;
	curMake="";
	requestData();
}
function setModel(makeobj){
	if(makeobj.value!=""){
		document.getElementById(typeID).disabled=true;
		curObj=makeobj.id;
		makeobj.disabled=true;
		optionsLoading(modelID,"Loading");
		curMake=makeobj.value;
		requestData();
	}else setOptions(modelID,Array(),"Models");
}
//---------------------------------------------