/* 
	XmlHttpRequest Wrapper
	Version 1.2.2
	29 Jul 2005 
	adamv.com/dev/
*/

var Http = {
	ReadyState: {
		Uninitialized: 0,
		Loading: 1,
		Loaded:2,
		Interactive:3,
		Complete: 4
	},
		
	Status: {
		OK: 200,
		
		Created: 201,
		Accepted: 202,
		NoContent: 204,
		
		BadRequest: 400,
		Forbidden: 403,
		NotFound: 404,
		Gone: 410,
		
		ServerError: 500
	},
		
	Cache: {
		Get: 1,
		GetCache: 2,
		GetNoCache: 3,
		FromCache: 4
	},
	
	Method: {Get: "GET", Post: "POST", Put: "PUT", Delete: "DELETE"},
	
	enabled: false,
	logging: false,
	_get: null,	// Reference to the XmlHttpRequest object
	_cache: new Object(),
	
	Init: function(){
		Http._get = Http._getXmlHttp()
		Http.enabled = (Http._get != null)
		Http.logging = (window.Logging != null);
	},
	
	_getXmlHttp: function(){
	/*@cc_on @*//*@if (@_jscript_version >= 5)
		try { return new ActiveXObject("Msxml2.XMLHTTP"); } 
		catch (e) {} 
		try { return new ActiveXObject("Microsoft.XMLHTTP"); } 
		catch (e) {} 
	@end @*/
		try { return new XMLHttpRequest();}
		catch (e) {}

		return null;
	},

/*
	Params:
		url: The URL to request. Required.
		cache: Cache control. Defaults to Cache.Get.
		callback: onreadystatechange function, called when request is completed. Optional.
		method: HTTP method. Defaults to Method.Get.
*/
	get: function(params, callback_args){	
		if (!Http.enabled) throw "Http: XmlHttpRequest not available.";
		
		var url = params.url;
		if (!url) throw "Http: A URL must be specified";
				
		var cache = params.cache || Http.Cache.Get;
		var method = params.method || Http.Method.Get;
		var callback = params.callback;
		
		if ((cache == Http.Cache.FromCache) || (cache == Http.Cache.GetCache))
		{
			var in_cache = Http.from_cache(url, callback, callback_args)

			if (Http.logging){
				Logging.log(["Http: URL in cache: " + in_cache]);
			}

			if (in_cache || (cache == Http.Cache.FromCache)) return in_cache;
		}
		
		if (cache == Http.Cache.GetNoCache)
		{
			var sep = (-1 < url.indexOf("?")) ? "&" : "?"	
			url = url + sep + "__=" + encodeURIComponent((new Date()).getTime());
		}
	
		// Only one request at a time, please
		if ((Http._get.readyState != Http.ReadyState.Uninitialized) && 
			(Http._get.readyState != Http.ReadyState.Complete)){
			this._get.abort();
			
			if (Http.logging){
				Logging.log(["Http: Aborted request in progress."]);
			}
		}
		
		Http._get.open(method, url, true);

		Http._get.onreadystatechange =  function() {
			if (Http._get.readyState != Http.ReadyState.Complete) return;
			
			if (Http.logging){
				Logging.log(["Http: Returned, status: " + Http._get.status]);
			}

			if ((cache == Http.Cache.GetCache) && (Http._get.status == Http.Status.OK)){
				Http._cache[url] = Http._get.responseText;
			}
			
			if (callback_args == null) callback_args = new Array();

			var cb_params = new Array();
			cb_params.push(Http._get);
			for(var i=0;i<callback_args.length;i++)
				cb_params.push(callback_args[i]);
				
			callback.apply(null, cb_params);
		}
		
		if(Http.logging){
			Logging.log(["Http: Started\n\tURL: " + url + "\n\tMethod: " + method + "; Cache: " + Hash.keyName(Http.Cache,cache)])
		}
		
		Http._get.send(params.body || null);
	},
	
	from_cache: function(url, callback, callback_args){
		var result = Http._cache[url];
		
		if (result != null) {
			var response = new Http.CachedResponse(result)
			
			var cb_params = new Array();
			cb_params.push(response);
			for(var i=0;i<callback_args.length;i++)
				cb_params.push(callback_args[i]);
							
			callback.apply(null, cb_params);
				
			return true
		}
		else
			return false
	},
	
	clear_cache: function(){
		Http._cache = new Object();
	},
	
	is_cached: function(url){
		return Http._cache[url]!=null;
	},
	
	CachedResponse: function(response) {
		this.readyState = Http.ReadyState.Complete
		this.status = Http.Status.OK
		this.responseText = response
	}	
}

Http.Init()

function json_response(response){
	var js = response.responseText;
	try{
		return eval(js); 
	} catch(e){
		if (Http.logging){
			Logging.logError(["json_response: " + e]);
		}
		else{
			alert("Error: " + e + "\n" + js);
		}
		return null;
	}
}

function getResponseProps(response, header){
	try {
		var s = response.getResponseHeader(header || 'X-Ajax-Props');
		if (s==null || s=="")
			return new Object()
		else
			return eval("o="+s)
	} catch (e) { return new Object() }
}


var selModel =  '' // set via SearchResults.aspx in initialiseSearchForm()
function handleOnChange(dd1, s)
	{
	  var idx = dd1.selectedIndex;
	  var val = dd1[idx].value;
	  var par = document.forms["frmSelect"];
	  var parelmts = par.elements;
	  var prezsel = parelmts["Model"];
	  
	  var $selectedModel = $('#Model option:selected');
	  if (selModel == '' || selModel == 'Model') {
	    selModel = $selectedModel.text();
	  }
	  
	  var make = val;
	  var type = $("input[name='SalesType']:checked").val();
    var makeUrl = GetMakeUrl(make, type);
	    
	  if (make != "Select make")
	  {
	 	Http.get(
	 	    {
			    url: makeUrl,
			    callback: fillPrez,
			    cache: Http.Cache.Get
		    },
		    [prezsel]
		  );
	  }
	}

	function fillPrez(xmlreply, prezelmt)
	{
	  if (xmlreply.status == Http.Status.OK)
	  {
	    var prezresponse = xmlreply.responseText;
	    var prezar = prezresponse.split("|");
	    prezelmt.length = 1;
	    prezelmt.length = prezar.length;
	    for (o=1; o < prezar.length; o++)
	    {
	      var ddValues = prezar[o].split(",");
	      prezelmt[o].text = ddValues[0];
	      prezelmt[o].value = ddValues[1];
	    }
	    
      $("#Model").find("option:eq(1)").attr("selected", "selected");
      
      selectModel(selModel);
	  }
	}

  function selectModel(model) {
      if (model != "Model") {
        $('#Model').find("option[text='" + model.toUpperCase() + "']").attr("selected", "selected");
      }

      $("#Model").trigger('change');  
  }

var searchParameters = function() {

 var init = function(salesType, firstLoad) {
 
		var carObj = GetCarObj();
                           
		var makeOptions = '';
		var modelOptions = '';
		var bodyOptions = '';
		var fuelOptions = '';
		var doorOptions = '';
		var transmissionOptions = '';
		var minpriceOptions = '';
		var maxpriceOptions = '';
		
		  // record current selection
		  var selectedOptions = {
		    make: $('#Make option:selected').text(),
		    model: $('#Model option:selected').text(),
		    doors: $('#doors option:selected').text(),
			  body: $('#bodytype option:selected').text(),
			  fuel: $('#fueltype option:selected').text(),
			  transmission: $('#transmission option:selected').text(),
			  minprice: $('#minprice option:selected').text(),
			  maxprice: $('#maximum-price option:selected').text()
		  };
		  
			$('#Make').empty();
			$('#bodytype').empty();
			$('#fueltype').empty();
			$('#doors').empty();
			$('#transmission').empty();
			$('#minprice').empty();
			$('#maximum-price').empty();

			for (var type in carObj[salesType].make ) 
			{
				makeOptions += '<option value="' + carObj[salesType].make[type] + '">' + type + '</option>';
			}
			
			for (var type in carObj[salesType].bodytype ) 
			{
			  bodyOptions += '<option value="' + carObj[salesType].bodytype[type] + '">' + type + '</option>';
			}

			for (var type in carObj[salesType].fueltype ) 
			{
				fuelOptions += '<option value="' + carObj[salesType].fueltype[type] + '">' + type + '</option>';
			}

			for (var type in carObj[salesType].doors ) 
			{
				doorOptions += '<option value="' + carObj[salesType].doors[type] + '">' + type + '</option>';
			}
			
			for (var type in carObj[salesType].transmission ) 
			{
				transmissionOptions += '<option value="' + carObj[salesType].transmission[type] + '">' + type + '</option>';
			}

      for (var type in carObj[salesType].minprice ) 
      {
				minpriceOptions += '<option value="' + carObj[salesType].minprice[type] + '">' + type + '</option>';
			}

			for (var type in carObj[salesType].maxprice) 
			{
				maxpriceOptions += '<option value="' + carObj[salesType].maxprice[type] + '">' + type + '</option>';
			}
			
			//modelOptions = '<option value="0">Select model</option>';

			$(document).ready(function(){
				$("id:make").attr("id",(salesType));
			});
			addHandleEvent(firstLoad);
            
			$(makeOptions).appendTo('#Make');
			$(bodyOptions).appendTo('#bodytype');
			$(fuelOptions).appendTo('#fueltype');
			$(doorOptions).appendTo('#doors');
			$(transmissionOptions).appendTo('#transmission');
			$(minpriceOptions).appendTo('#minprice');
			$(maxpriceOptions).appendTo('#maximum-price');
			
			autoSelect(selectedOptions, firstLoad);
  };
  
  
  var addHandleEvent = function(firstLoad)
  {
    if(firstLoad) {
      $('#Make').change(function() {
        handleOnChange(this);
        $('#Model').attr('disabled', '');
      });
    }
  }

  var autoSelect = function(selectedOptions, firstLoad) {
    
    $('#Make').find("option[text='" + selectedOptions.make + "']").attr("selected", "selected");
        
    if (!firstLoad) $('#Make').trigger('change');

    $('#bodytype').find("option:contains('" + selectedOptions.body + "')").attr('selected', 'selected');
		$('#fueltype').find("option:contains('" + selectedOptions.fuel + "')").attr('selected', 'selected');
		$('#doors').find("option:contains('" + selectedOptions.doors + "')").attr('selected', 'selected');
		$('#transmission').find("option:contains('" + selectedOptions.transmission + "')").attr('selected', 'selected');
		$('#minprice').find("option:contains('" + selectedOptions.minprice + "')").attr('selected', 'selected');
		$('#maximum-price').find("option:contains('" + selectedOptions.maxprice + "')").attr('selected', 'selected');
  };

	return {
		init:init
	};
}();

function setOptions(salesType) {

  searchParameters.init(salesType, false);
  
  $('form').attr('class', salesType);
  if (salesType == 'new') {
    $('#PostCode').attr('disabled', 'disabled')
    $('fieldset.location').hide();
  }
  else {
    $('#PostCode').attr('disabled', '')
    $('fieldset.location').show();
  }
}

// extend jquery to provide a case-insensitive contains function
jQuery.expr[':'].contains = function(a,i,m){
    return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};

