	
	
	utilities = {
		
		xmlTree: function(xml){
			var tree = new XML.ObjTree();
			return tree.parseXML(xml); 
		},
		
		randomString: function(length) {
			var sChrs;
			var type = (arguments.length > 1) ? arguments[1] : 'alphanumeric';
			var numeric = "0123456789"; 
			var alpha = "abcdefghijklmnopqrstvwxyz";
			alpha += alpha + alpha.toUpperCase();
			switch(type){
				case 'alphanumeric': sChrs = numeric + alpha; break;
				case 'numeric': sChrs = numeric; break;
				case 'alpha': sChrs = alpha; break;
			}
			var sRnd = '';
			for(var x = 0; x < length; x++){
				var i = Math.floor(Math.random() * sChrs.length);
				sRnd += sChrs.charAt(i);
			}
			return sRnd;
		},
	
		getUniqueId: function(){
			var now = new Date();
			return(now.getTime());
		},
		
		thisFormTrigger: function(){
			tinyMCE.triggerSave(false, true);
		},
		
		currentPage: function(){
			var page = location.href.split("/");
			return page[page.length - 1].split("?")[0];
		},
		
		ask: function(url){
			if(!confirm("Estas seguro?")) return false;
			self.location = url;
		},
		
		accents: function(string){
			string = string.replace(/�/g, "&aacute;");
			string = string.replace(/�/g, "&eacute;");
			string = string.replace(/�/g, "&iacute;");
			string = string.replace(/�/g, "&oacute;");
			string = string.replace(/�/g, "&uacute;");
			return string;
		},
		
		mousePositionOnClick: function(fn){
			document.onclick = function(e){
				if (!e) var e = window.event;
				if (e.pageX || e.pageY){
					PosX = e.pageX;
					PosY = e.pageY;
				}else if (e.clientX || e.clientY){
					PosX = e.clientX + document.body.scrollLeft;
					PosY = e.clientY + document.body.scrollTop;
				}
				fn(PosX, PosY);
			}
		},
		
		URLEncode: function(string){
			// The Javascript escape and unescape functions do not correspond
			// with what browsers actually do...
			var SAFECHARS = "0123456789" +					// Numeric
							"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
							"abcdefghijklmnopqrstuvwxyz" +
							"-_.!~*'()";					// RFC2396 Mark characters
			var HEX = "0123456789ABCDEF";
		
			var plaintext = string;
			var encoded = "";
			for (var i = 0; i < plaintext.length; i++ ) {
				var ch = plaintext.charAt(i);
			    if (ch == " ") {
				    encoded += "+";				// x-www-urlencoded, rather than %20
				} else if (SAFECHARS.indexOf(ch) != -1) {
				    encoded += ch;
				} else {
				    var charCode = ch.charCodeAt(0);
					if (charCode > 255) {
					    alert( "Unicode Character '" 
					+ ch 
					+ "' cannot be encoded using standard URL encoding.\n" +
							  "(URL encoding only supports 8-bit characters.)\n" +
								  "A space (+) will be substituted." );
						encoded += "+";
					} else {
						encoded += "%";
						encoded += HEX.charAt((charCode >> 4) & 0xF);
						encoded += HEX.charAt(charCode & 0xF);
					}
				}
			} // for
		
			return encoded;
		},
		
		URLDecode: function(string){
		   // Replace + with ' '
		   // Replace %xx with equivalent character
		   // Put [ERROR] in output if %xx is invalid.
		   var HEXCHARS = "0123456789ABCDEFabcdef"; 
		   var encoded = string;
		   var plaintext = "";
		   var i = 0;
		   while (i < encoded.length) {
		       var ch = encoded.charAt(i);
			   if (ch == "+") {
			       plaintext += " ";
				   i++;
			   } else if (ch == "%") {
					if (i < (encoded.length-2) 
							&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1 
							&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
						plaintext += unescape( encoded.substr(i,3) );
						i += 3;
					} else {
						alert( 'Bad escape combination near ...' + encoded.substr(i) );
						plaintext += "%[ERROR]";
						i++;
					}
				} else {
				   plaintext += ch;
				   i++;
				}
			} // while
		   return plaintext;
		},
		
		checkboxTreeDependence: function(obj){
			// hijos
			$(obj).parent().parent().find("ul input[type='checkbox']").each(function(){
				$(this).get(0).checked = obj.checked;
			});
			// padre
			$($(obj).parent().parent().parent().parent().find("input[type='checkbox']")[0]).get(0).checked = true;
		},
		
		jump: function(obj){
			top.location = obj[obj.selectedIndex].value;
		},
		
		/*********************************************************************************
		 * Metodos AJAX
		 * 
		 **/
		
		handleAjaxResponse: function(msg, fn){
			var oXml = utilities.xmlTree(msg);
			message = "";
			if(oXml.error != undefined)
				alert(oXml.error);
			else if(oXml.result != undefined){
				if (oXml.result.error != undefined) {
					if (oXml.result.error.length) {
						for (var i in oXml.result.error) {
							message += oXml.result.error[i];
						} alert(message);
					}
				}else{
					fn(oXml.result);
				}
			}else
				fn();
		}
		
	}
	