//=======================[ 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';
	//------------------[ 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(){
		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(){
  	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
    	}else error_handlerFunction();
  	}
 }
 //-------------------[ method to return response object
 this.getResponse=function(){
 		return response;
 }
}
//==================================[Specials helper class]========================================================
//-------------------[if we have multiple specials (new,used) we will use this class]--------------------
function Specials() {
	var SPECIALS_CONTAINER;//<-id of container holding specials
	var cars_perpage=0;
	var next=0;
	var btn_left;//id of prev button
	var btn_right;//id of next button
	var add_search="";//additional search param (like: type="new")
	var SPECIALS_TEMPLATE;//template holder for specials
	var request=new mAJAXRequest();
	var status=true;//status of current request ti prevent double requests
	
	this.setCarsPerPage=function(cpp){
		cars_perpage=cpp;
	}
	this.doNext=function(){
		next+=cars_perpage;
	}
	this.doPrev=function(){
		next-=cars_perpage;
		if(next<0) next=0;
	}
	this.getSpecials=function(){
		if(status){
			status=false;
			//we are defining these vars directly name.var=val so we need to reassign them so they will be available inside dataParser
			if(SPECIALS_CONTAINER==null) SPECIALS_CONTAINER=this.SPECIALS_CONTAINER
			if(SPECIALS_TEMPLATE==null) SPECIALS_TEMPLATE=this.SPECIALS_TEMPLATE;
		
			request.setRequestLocation("get_specials_xml.php");
			var req="next="+next+"&max="+cars_perpage;
			if(add_search!="") req+="&"+add_search;
			request.setData(req);
			request.assignParser(this.dataParser);
			request.assignErrorHandler(this.onRequestError);
			request.setResponseType('xml');
			request.send();
		}
	}
	this.dataParser=function(){
		status=true;
		try{
			/*  alert(SPECIALS_TEMPLATE);
					alert(SPECIALS_CONTAINER);
					alert(next);
					alert(cars_perpage);
					alert(btn_right); */
			var totalcars=request.getResponse().getElementsByTagName("VEHICLE").length;
			if(totalcars > 0){
				var specials_box='';
				for(var i=0;i<totalcars;i++){
					var car_id=request.getResponse().getElementsByTagName("ID")[i].childNodes[0].nodeValue;
					var car_name=request.getResponse().getElementsByTagName("TITLE")[i].childNodes[0].nodeValue;
					var car_price=request.getResponse().getElementsByTagName("PRICE")[i].childNodes[0].nodeValue;
					var car_url=request.getResponse().getElementsByTagName("URL")[i].childNodes[0].nodeValue;			
					var car_image=request.getResponse().getElementsByTagName("IMAGE")[i].childNodes[0].nodeValue;
					var special_item=eval(SPECIALS_TEMPLATE);
					
					specials_box+=special_item;
				}
				document.getElementById(SPECIALS_CONTAINER).innerHTML=specials_box;
				if(request.getResponse().getElementsByTagName("TOTAL_VEHICLES")[0].childNodes[0].nodeValue<=(next+cars_perpage))
					document.getElementById(btn_right).style.display="none";
				else document.getElementById(btn_right).style.display="inline";
			}else{//--if no valid result returned
				if(request.getResponse().getElementsByTagName("ERROR").length > 0){
					alert(request.getResponse().getElementsByTagName("ERROR")[0].childNodes[0].nodeValue);
				}else if(request.getResponse().getElementsByTagName("NOVEHICLES").length==1){//--no more cars
					next-=cars_perpage;
					//getSpecials();
					document.getElementById(btn_right).style.display="none";
					//we need to disable right button in this case
				}
			}
		}catch(err){
			this.onRequestError();
			//alert("WTF");
			//setTimeout("this.dataParser()",100);//recall dataparser in case of an error
		}
	}
	this.onRequestError=function(){
		status=true;
		alert("Error");
	}
	this.unhideButton=function(){
		if(next>0){
			document.getElementById(btn_left).style.display="inline";
		}else{
			if(next==0) document.getElementById(btn_left).style.display="none";
			document.getElementById(btn_right).style.display="inline";
		}
	}
	this.defineSearch=function(type){
		add_search=type;
	}
	this.defineButtons=function(btn_left_id,btn_right_id){
		btn_left=btn_left_id;
		btn_right=btn_right_id;
	}
}
//=================================================================================================
var request=new mAJAXRequest();
var doNext=0;
var procstatus=true;
function getNextSpecials(specials){
	//for(var i=0;i<arguments.length;i++)
	//	alert(arguments[i]);
	if(specials==null){//if null then default
		doNext+=cars_perpage;
		getSpecials();
		if(doNext>0) document.getElementById("btn_left").style.display="inline";
	}else{
		specials.doNext();
		specials.getSpecials();
		specials.unhideButton();
	}
}
function getPreviousSpecials(specials){
	if(specials==null){//if null then default
		doNext-=cars_perpage;
		if(doNext<0) doNext=0;
		if(doNext==0) document.getElementById("btn_left").style.display="none";
		document.getElementById("btn_right").style.display="inline";
		getSpecials();
	}else{
		specials.doPrev();
		specials.unhideButton();
		specials.getSpecials();
	}
}
function getSpecials(){
	if(procstatus){
		procstatus=false;
		request.setRequestLocation("get_specials_xml.php");
		request.setData("next="+doNext+"&max="+cars_perpage);
		request.assignParser(dataParser);
		request.assignErrorHandler(onRequestError);
		request.setResponseType('xml');
		request.send();
	}
}
function onRequestError(){
	procstatus=true;
	alert("Error");
}
function dataParser(){
	try{
		procstatus=true;
		var totalcars=request.getResponse().getElementsByTagName("VEHICLE").length;
		if(totalcars > 0){
			var specials_box='';
			for(var i=0;i<totalcars;i++){
				var car_id=request.getResponse().getElementsByTagName("ID")[i].childNodes[0].nodeValue;
				var car_name=request.getResponse().getElementsByTagName("TITLE")[i].childNodes[0].nodeValue;
				var car_price=request.getResponse().getElementsByTagName("PRICE")[i].childNodes[0].nodeValue;
				var car_url=request.getResponse().getElementsByTagName("URL")[i].childNodes[0].nodeValue;			
				var car_image=request.getResponse().getElementsByTagName("IMAGE")[i].childNodes[0].nodeValue;
				var special_item=eval(spec_template);

				specials_box+=special_item;
			}
			document.getElementById(SPECIALS_CONTAINER).innerHTML=specials_box;
			if(request.getResponse().getElementsByTagName("TOTAL_VEHICLES")[0].childNodes[0].nodeValue<=(doNext+cars_perpage))
				document.getElementById("btn_right").style.display="none";
		}else{//--if no valid result returned
			if(request.getResponse().getElementsByTagName("ERROR").length > 0){
				alert(request.getResponse().getElementsByTagName("ERROR")[0].childNodes[0].nodeValue);
			}else if(request.getResponse().getElementsByTagName("NOVEHICLES").length==1){//--no more cars
				doNext-=cars_perpage;
				//getSpecials();
				document.getElementById("btn_right").style.display="none";
				//we need to disable right button in this case
			}
		}
	}catch(err){
		setTimeout("dataParser()",100);//recall dataparser in case of an error
	}
}