var Mapserver = Class.create();

Mapserver.prototype = {
	RequestInfoDiv: "request",	// The target DIV to spit out the query string for debug purpose.
	UpdatingLegend: false,		// IF this is true, other tasks affecting legends should not be run.
	randomParm: 0,
	TimeoutFuncId: null,
	TimeoutFuncName: "",
	Timeout: 10800000,		// 3 hours in milseconds
	parameters: {
		sid: "",
		mode: "",
		outputformat: "PNG"
	},

	ajax_parameters: {
		method: "POST",
		asynchronous: true
	},

	initialize: function(mapserver_url, sid) {
	    this.url = mapserver_url;
		this.CurrentLayer = "";
		this.CurrentLayerID = "";
		this.CurrentClass = {};
	    Object.extend(this.parameters, {sid: sid});
	},

	request: function(mode, callback, parameters, serialized_parameters, ajax_parameters) {
		// Save mode
		this.parameters = $H(this.parameters).merge({mode: mode}).toObject();	// keep this.parameters a dictionary instead of a hash
		// For other parameters, no need to save them.
		var hParams = $H(this.parameters).merge(parameters);	// $H returns cloned one since v1.6.

	    var post_data = hParams.toQueryString();
	    if (serialized_parameters != "") {
	    	post_data += "&" + serialized_parameters;
	    }

		var hAjaxParams = $H(this.ajax_parameters).merge(ajax_parameters);
	    hAjaxParams.update({
	    		onSuccess: callback,
				onFailure: this.requestFailed.bindAsEventListener(this),
	    		parameters: post_data
	    	});

		new Ajax.Request(this.url, hAjaxParams.toObject());	// v1.6

		clearTimeout(this.TimeoutFuncId);
		this.TimeoutFuncId = setTimeout(this.TimeoutFuncName, this.Timeout);
	},

	requestFailed: function (oj) {
		$(this.RequestInfoDiv).update($H(this.parameters).toQueryString());
		$('error_info').update(oj.statusText);
		alert("Request to Mapserver failed. See Information for details.");
	},

	mapserverRequest: function (parameters) {
		var hParams = new Hash(this.parameters);
		hParams = hParams.merge(parameters);
		var mapserver_request = this.url + "?" + hParams.toQueryString() + "&" + this.randomParm;
		if ($(this.RequestInfoDiv)) {
			$(this.RequestInfoDiv).update(mapserver_request);
		}
		return mapserver_request;
	},

	refresh: function () {
		this.randomParm = (new Date()).format('mmddyyyyhhnnss');
	}
}

