/**
 * -- Breeze Content Management --
 * AJAX javascript prototype
 * @author Yuri_S
 * @version 1.2
 * 
 */

Breeze.Ajax = function (url) {
	this.errorMsgs = new Array("Unexpected error: \n", "Errors encountered by script: \n", "Unknown error: ", "Error encountered. Contact the administrator", "HTTP Request failed. Your browser does not support XMLHttpRequest. Upgrade to a modern browser.");
	this.hideErrors = false;
	this.tokenID = false;
	this.query = new Object();
	this.requestObj = false;
	this.onLoad = false;
	this.onSuccess = false;
	this.onError = false;
	
	if (window.XMLHttpRequest) {
		this.requestObj = new XMLHttpRequest();
	} else {
		var objects = new Array('Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0','Msxml2.XMLHTTP','Microsoft.XMLHTTP');
		var objecttest = false;
		for (var i = 0; i < objects.length; i++) {
			try {
				objecttest = new ActiveXObject(objects[i]);
			} catch(e) {
				objecttest = false;
			}
			if (objecttest !== false) {
				this.requestObj = objecttest;
				break;
			}
		}
	}
	if (this.requestObj === false) {
		alert(this.errorMsgs[4]);
	}
	if (url.indexOf('?') > -1 && url.substring(url.length-1) != '?') {
		url = url+'&';
	} else if (url.indexOf('?') == -1) {
		url = url+'?';
	}
	this.url = url;
}

Breeze.Ajax.prototype = {
	
	get: function () {
		return this.request('GET', '');
	},
	
	post: function (form) {
		return this.request('POST', this.transformQuery(form));
	},

	request: function (method, content) {
		var internal = this;
		this.requestObj.abort();
		this.requestObj.onreadystatechange = function () {
			if (internal.requestObj.readyState == 1 && internal.onLoad !== false) {
				internal.onLoad();
			} else if (internal.requestObj.readyState == 4) {
				if (internal.requestObj.status == 200) {
					if (!isset(internal.requestObj.responseXML)) {
						alert(internal.errorMsgs[0] + internal.requestObj.responseText);
					} else if (isset(internal.requestObj.responseXML.getElementsByTagName('errors').item(0))) {
						if (internal.hideErrors == true) {
							var msg = internal.errorMsgs[3];
						} else {
							var root = internal.requestObj.responseXML.getElementsByTagName('errors').item(0);
							var msg = internal.errorMsgs[1];
							for (var i = 0; i < root.childNodes.length; i++) {
								var el = root.childNodes.item(i);
								if (isset(internal.errorMsgs[el.getAttribute('code')])) {
									msg += '- '+internal.errorMsgs[el.getAttribute('code')]+"\n";
								} else {
									msg += '- '+internal.errorMsgs[2]+el.getAttribute('code')+"\n";
								}
							}
						}
						alert(msg);
					} else if (internal.onSuccess !== false) {
						internal.onSuccess(internal.requestObj);
					}
				} else if (internal.onError !== false) {
					internal.onError(internal.requestObj);
				}
			}
		}
		if (method.toUpperCase() == 'POST') {
			this.requestObj.setRequestHeader('Content-type', 'multipart/form-data');
		} else {
			content = null;
		}
		var url = this.url;
		if (this.tokenID !== false) {
			url = url+'httpreqtoken='+this.tokenID;
		}
		url = url+this.transformQuery(this.query)+'&'+Math.floor(Math.random()*501);
		this.requestObj.open(method.toUpperCase(), url, true);
		this.requestObj.send(content);
		return true;
	},
	
	transformQuery: function (fields) {
		var start = '&';
		var output = '';
		for (var key in fields) {
			if (typeof fields[key] != 'function') {
				output += start + key + '=' + fields[key];
			}
		}
		return output;
	}
	
}
