var go2web =
{
	READY_STATE_UNINITIALIZED : 0,
	READY_STATE_LOADING       : 1,
	READY_STATE_LOADED        : 2,
	READY_STATE_INTERACITVE   : 3,
	READY_STATE_COMPLETE      : 4,

	ContentLoader : function(component, url, method, requestParams) {
		this.component     = component;
		this.url           = url;
		this.method        = method;
		this.requestParams = requestParams;
	}
}

go2web.ContentLoader.prototype = {
	getTransport : function() {
		var transport;
		if (window.XMLHttpRequest)
			transport = new XMLHttpRequest();
		else if (window.ActiveXObject) {
			try  {
				transport = new ActiveXObject('Msxml2.XMLHTTP');
			}
			catch(error) {
				transport = new ActiveXObject('Microsoft.XMLHTTP');
			}
		}
		return transport;
	},

	sendRequest : function() {
		var requestParams = [];
		for (var i=0; i < arguments.length; i++)
			requestParams.push(arguments[i]);
	
		var request = this.getTransport();
		request.open(this.method, this.url, true);
		request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		var that = this;
		request.onreadystatechange = function() {
			that.handleAjaxResponse(request) };
		request.send( this.queryString(requestParams) );
	},

	queryString : function(args) {
		var requestParams = [];
		for (var i=0; i < this.requestParams.length; i++)
			requestParams.push(this.requestParams[i]);
		for (var j=0; j < args.length; j++)
			requestParams.push(args[j]);

		var queryString = "";
		if ( requestParams && requestParams.length > 0 ) {
			for (var i=0; i < requestParams.length; i++)
				queryString += requestParams[i] + '&';
			queryString = queryString.substring(0, queryString.length-1);
		}
		return queryString;
	},

	handleAjaxResponse : function(request) {
		var loading = new Object();
		if (request.readyState == go2web.READY_STATE_COMPLETE) {
			if (this.isSucess(request)) {
				this.component.ajaxUpdate(request);
			} else this.component.handleError(request);
		} else if (request.readyState == go2web.READY_STATE_UNINITIALIZED){
			loading.responseText = '{"entry" : [{"optionText":"load","optionValue":"1"}]}';
			this.component.ajaxUpdate(loading);
		} else if (request.readyState == go2web.READY_STATE_LOADING) {
			loading.responseText = '{"entry" : [{"optionText":"loading...","optionValue":"1"}]}';
			this.component.ajaxUpdate(loading);
		} else if (request.readyState == go2web.READY_STATE_LOADED) {
			loading.responseText = '{"entry" : [{"optionText":"loading...","optionValue":"1"}]}';
			this.component.ajaxUpdate(loading);
		} else if (request.readyState == go2web.READY_STATE_INTERACITVE) {
			loading.responseText = '{"entry" : [{"optionText":"loading...","optionValue":"1"}]}';
			this.component.ajaxUpdate(loading);
		}
	},

	isSucess : function(request) {
		return request.status == 0 || (request.status >= 200 && request.status < 300);
	}
}

function DoubleCombo(masterId, slaveId, addFieldId, addSecondFieldId,url, options) {
	this.master = document.getElementById(masterId);
	this.slave  = document.getElementById(slaveId);

	if (addFieldId == "") this.addFieldId = null;
	else this.addFieldId = document.getElementById(addFieldId);

	if (addSecondFieldId == "") this.addSecondFieldId = null;
	else this.addSecondFieldId = document.getElementById(addSecondFieldId);

	this.options = options;
	this.ajaxHelper = new go2web.ContentLoader(this, url, "POST", options || []);

	this.initializeBehavior();
}

DoubleCombo.prototype = {
	initializeBehavior: function() {
		var that = this;
		this.master.onchange = function() { that.masterComboChanged();};
	},

	masterComboChanged: function() {
		var addsec = null;
		var add = null;
		var query = this.master.options[this.master.selectedIndex].value;

		if (!!this.addSecondFieldId) {
			addsec = this.addSecondFieldId.options[this.addSecondFieldId.selectedIndex].value;
			addsec = 'add2=' + addsec;
		}
		if (!!this.addFieldId) {
			add = this.addFieldId.options[this.addFieldId.selectedIndex].value;
			add = 'add=' + add;
		}

		if ((!!addsec) && (!!add)) this.ajaxHelper.sendRequest('query=' + query, add, addsec); 
		else if (!!add) this.ajaxHelper.sendRequest('query=' + query, add); 
		else if (!!addsec) this.ajaxHelper.sendRequest('query=' + query, addsec); 
		else this.ajaxHelper.sendRequest('query=' + query); 
	},

	ajaxUpdate: function(request) {
		this.slave.length = 0;
		var jsonText = eval('('+request.responseText+')');
		for (var i=0; i < jsonText.entry.length; i++) {
			var text = jsonText.entry[i]['optionText'];
			var value = jsonText.entry[i]['optionValue'];
			var option = new Option(text, value);
			try {
				this.slave.options.add(option, null);
			} catch (error) {
				this.slave.options.add(option, -1);
			}
		}
		if(this.slave.onchange != null) this.slave.onchange.call();
	},

	handleError: function(request) {
		if (this.options.errorHandler)
			this.options.errorHandler(request);
	}
}

function injectComponentBehaviours() {
	var option = ['field=vehicle'];
	new DoubleCombo("vehicleid", "sizeid", "", "", "http://" + location.host + "/set_form_field.php", option);
	option = ['field=size'];
	new DoubleCombo("sizeid", "seasonid", "vehicleid", "", "http://" + location.host + "/set_form_field.php", option);

	var masterv = document.getElementById("vehicleid");
	masterv.onchange.call();
	var masters = document.getElementById("sizeid");
	masters.onchange.call();
}
