
/**
 * Package
 */
var biz;
if (!biz) {
	biz = {};
} else if (typeof biz != "object") {
	throw new Error("biz already exists and is not an object!");
}

if (!biz.newave) {
	biz.newave = {};
} else if (typeof biz.newave != "object") {
	throw new Error("biz.newave already exists and is not an object!");
}



/**
 * Documentin, eli sivun käsittelyssä käytettävää yleissettiä
 */
if (!biz.newave.Document) {
	biz.newave.Document = {};
} else if (typeof biz.newave != "object") {
	throw new Error("biz.newave.Document already exists and is not an object!");
}

// getElementById
if (biz.newave.Document.id) { throw new Error("biz.newave.Document.id already exists!"); }
biz.newave.Document.id = function (_e) {
	typeof(_e) == "object" ? null : _e = document.getElementById(_e);
	return _e;
}

// Submit form
if (biz.newave.Document.submitForm) { throw new Error("biz.newave.Document.submitForm already exists!"); }
biz.newave.Document.submitForm = function (_e) {
	biz.newave.Document.id(_e).submit();
}

// Reset Instance
if (biz.newave.Document.resetInstance) { throw new Error("biz.newave.Document.resetInstance already exists!"); }
biz.newave.Document.resetInstance = function (_instance, _class) {
	_instance = new _class();
}

// XMLHttpRequestObject 
if (biz.newave.Document.create_XHRObject) { throw new Error("biz.newave.Document.create_XHRObject already exists!"); }
biz.newave.Document.create_XHRObject = function () 
{
	var _XMLHttp;
	// this should work for all browsers except IE6 and older
	try { 
		_XMLHttp = new XMLHttpRequest();
	} catch(e) {
		// assume IE6 or older
		var XMLHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
										"MSXML2.XMLHTTP.5.0",
										"MSXML2.XMLHTTP.4.0",
										"MSXML2.XMLHTTP.3.0",
										"MSXML2.XMLHTTP",
										"Microsoft.XMLHTTP");
	
		for (var i=0; i<XMLHttpVersions.length && !_XMLHttp; i++) {
			try { 
				_XMLHttp = new ActiveXObject(XMLHttpVersions[i]);
			} catch (e) {}
		}
	}
	
	if (!_XMLHttp) { 
		alert("Error creating the XMLHttpRequest object.");
	} else {
		return _XMLHttp;
	}
}


/**
 * Yleistä AJAX-settiä
 */
if (!biz.newave.AJAX) {
	biz.newave.AJAX = {};
} else if (typeof biz.newave.AJAX != "object") {
	throw new Error("biz.newave.AJAX already exists and is not an object!");
}

//  SendAndLoad
if (biz.newave.AJAX.SendAndLoad) { throw new Error("biz.newave.AJAX.SendAndLoad already exists!"); }
// Jotta siihen voisi viitata vähän järkevämmin.
var SendAndLoad_2011 = biz.newave.AJAX.SendAndLoad = function () 
{
	// Tila !!!
	this.IDLE = 1;
	this.SENDING_REQUEST = 2;
	this.WAITING_FOR_REPLY = 3;
	this.PROCESSING_REPLY = 4;
	this.ERROR = 5;
	
	this.state = this.IDLE;
	
	// Shortcuts
	this.id = biz.newave.Document.id;
	this.XMLHttp = biz.newave.Document.create_XHRObject();
	this.resetInstance = biz.newave.Document.resetInstance;
	
	// Muuttujat
	this.queue = new Array();
	
	// !!!
	this.freezeOnError = false;
	this.set_freezeOnError = function (_val) { this.freezeOnError = _val; }
};
biz.newave.AJAX.SendAndLoad.prototype.sendAndLoad = function(_server, _callback, _element, _method, _params, _errorHandler) 
{
	if (_errorHandler == null ||
		_errorHandler == undefined) {
		_errorHandler = this.displayError;
	}
	this.addToQueue(_server, _callback, _element, _method, _params, _errorHandler);
};
biz.newave.AJAX.SendAndLoad.prototype.addToQueue = function(_server, _callback, _element, _method, _params, _errorHandler) 
{
	var n = this.queue.length;
	this.queue[n] = new Object();
	this.queue[n].server = _server;
	this.queue[n].callback = _callback;
	this.queue[n].element = _element;
	this.queue[n].method = _method;
	this.queue[n].params = _params;
	this.queue[n].errorHandler = _errorHandler;
	
	// Jos lisätty objekti on listan ainua,
	// pitää listan pyörittäminen käynnistää.
	this.queue.length == 1 ? this.processQueue() : this.idle();
};
biz.newave.AJAX.SendAndLoad.prototype.remFromQueue = function() 
{
	this.queue.shift();
	this.queue.length > 0 ? this.processQueue() : null;
};
biz.newave.AJAX.SendAndLoad.prototype.processQueue = function() 
{
	this.process(this.queue[0].server, this.queue[0].method, this.queue[0].params);
};
biz.newave.AJAX.SendAndLoad.prototype.idle = function() {
	this.state = this.IDLE;	
}
	
// XMLHttp:t
biz.newave.AJAX.SendAndLoad.prototype.process = function(_server, _method, _params) 
{
	this.state = this.SENDING_REQUEST;
	
	if (this.XMLHttp) {
		if(_method == "GET") {
			_server += "?" + _params;
			_params = null;
		}
		if (_method == "POST" && !_params) _params = "fill=bill";
		
		// try to connect to the server
		try {
			if (this.XMLHttp.readyState == 4 || this.XMLHttp.readyState == 0) {
				this.XMLHttp.open(_method, _server, true);
				
				if(_method == "POST") this.XMLHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
				var me = this;
				this.XMLHttp.onreadystatechange = function()
				{
					me.handleRequestStateChange();
				}
				this.XMLHttp.send(_params);
			} else {}
		} catch (e) {
			this.relayError(e);
			this.freezeOnError ? this.resetInstance(this, biz.newave.AJAX.SendAndLoad) : this.remFromQueue();
		}
	}
};
biz.newave.AJAX.SendAndLoad.prototype.handleRequestStateChange = function ()
{
	this.state = this.WAITING_FOR_REPLY;
	
	if (this.XMLHttp.readyState == 4 && 
		this.XMLHttp.status == 200) {
		try {
			this.executeQueueElement();
		} catch(e) {
			this.relayError(e);
			this.freezeOnError ? this.resetInstance(this, biz.newave.AJAX.SendAndLoad) : this.remFromQueue();
		}
	}
};
biz.newave.AJAX.SendAndLoad.prototype.executeQueueElement = function() 
{
	this.state = this.PROCESSING_REPLY;
	
	// retrieve the server's response 
	var response = this.XMLHttp.responseText;
	// server error?
	if (response.indexOf("ERRNO") >= 0 
		|| response.indexOf("error:") >= 0
		|| response.length == 0)
		throw(response.length == 0 ? "Server error." : response);
	
	// Lähetetään funktiolle takaisin alussa vastaanotetut arvot.
	var inputValues = this.queue[0];
	this.queue[0].callback(this.XMLHttp.responseXML, this.queue[0].element, inputValues);
	this.remFromQueue()
};
	
biz.newave.AJAX.SendAndLoad.prototype.relayError = function(e) 
{
	this.state = this.ERROR;
	
	var inputValues = this.queue[0];
	this.queue[0].errorHandler(e.toString(), this.queue[0].element, inputValues);
};
// Default Error Handler
biz.newave.AJAX.SendAndLoad.prototype.displayError = function(_e, _element, _inputValues) 
{
	alert(_e);
};
