var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

var ERROR_NOT_LOGGED = "login";
var LOGIN_PAGE = "login.html";

var ELEMENT_NODE = 1;
var ATTRIBUTE_NODE = 2;
var TEXT_NODE = 3;
var CDATA_SECTION_NODE = 4;
var ENTITY_REFERENCE_NODE = 5;
var ENTITY_NODE = 6;
var PROCESSING_INSTRUCTION_NODE = 7;
var COMMENT_NODE = 8;
var DOCUMENT_NODE = 9;
var DOCUMENT_TYPE_NODE = 10;
var DOCUMENT_FRAGMENT_NODE = 11;
var NOTATION_NODE = 12;

function AjaxException(msg) 
{
	var str = (msg.message) ? msg.message : msg;
	this.message = "AjaxException: " + str;
}

function RequesterException(msg)
{
	var str = (msg.message) ? msg.message : msg;
	this.message = "RequesterException: " + str;
}

var Ajax = {
	/* - - - CONSTANTES - - - */
	UNINITIALIZED: 0,
	LOADING: 1,
	LOADED: 2,
	INTERACTIVE: 3,
	COMPLETE: 4,
	NOT_FOUND: 404,
	OK: 200,

	getTransport: function () {
		var rV = null;
		if (window.XMLHttpRequest) {
			rV = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			var versions = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP", "Msxml2.XMLHTTP.7.0", "Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0"];

			for (var i=0; i < versions.length ; i++) {
				try {
					rV = new ActiveXObject(versions[i]);
					if (rV) break;
				} catch (objException) { };
			}
		}

		return rV;
	}
}

function Requester() {
	this.transport = Ajax.getTransport();
	this._method = "POST";

	this.setMethod = function(m) { this._method = m; }

	this.request = function(url, fields, callback) {
		try {
			if (!this.transport) throw "No Transport found";

			if (!fields) fields = "dummy=1";
			this.transport.onreadystatechange = this._createCallback(this, this.transport, callback);

			this.transport.open(this._method, url, true);
			if (this._method.toUpperCase() == "POST") {
				this.transport.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
				if (BrowserDetect.browser.toLowerCase() != "safari") {
					this.transport.setRequestHeader('Content-Length', fields.length);
				}
			}			
			this.transport.send(fields);
			this.showStatus();
		} catch (e) {
			throw new RequesterException(e);
		}	
	}

	this._createCallback = function(obj, trsprt, callback) { 
		retValue = function() {
			if (trsprt.readyState == Ajax.COMPLETE) {
				if (trsprt.status == Ajax.OK) {
					response = null;
					if (BrowserDetect.browser.toLowerCase() == "safari") {
						response = new DOMParser().parseFromString(this.responseText, 'application/xml');
					} else {
						response = trsprt.responseXML.documentElement;
					}
					
					obj.hideStatus();
					
					var _status = Ajax.OK;
					if (response.getElementsByTagName('status').length > 0) {
						_status = response.getElementsByTagName('status')[0].firstChild.data;
					}

					if (_status == ERROR_NOT_LOGGED) {
						document.location = LOGIN_PAGE;
					} else {
						callback.apply(this, [response, trsprt.responseText]);
					}
				} else {
					throw new RequesterException("Error retreiving XML data:\n" + trsprt.statusText);
				}
			}
		}

		return retValue;
	}

	this.showStatus = function() {
		if (document.getElementById("Status"))
			document.getElementById("Status").className = "Procesando";
	}

	this.hideStatus = function() {
		if (document.getElementById("Status"))
			document.getElementById("Status").className = "Hidden Procesando";
	}
}