	
	
	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);
			}
		},
		
		frm2uri : function(f){
			//alert('codificando');
			var str = '';
			//alert(frm.elements.length);
			var frm = document.getElementById(f);
			
			//alert(frm.elements);
			var elementos = frm.elements.length;
				for(var i=0; i<elementos; i++){
					//validar campos ?
					if(!frm.elements[i].disabled){ 			
						str += (i==0) ? frm.elements[i].name+'=' : '&'+frm.elements[i].name+'=';	
						str += encodeURIComponent(frm.elements[i].value);			
					}
				}
				//alert(str);
			return str;
		},
		
		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();
		},
		
		handleAjaxResponse2: function(xmlStr, fn){
			//alert(xmlStr);
			var oXml = utilities.xmlTree(xmlStr);
			 //alert(oXml.toString());
			
			var errors 	= (oXml.errors != undefined) ? oXml.errors : "";
			var res 		= oXml.result;
			var msg = oXml.message;
			//var error 	= oXml.message"";
			 //alert("aa:"+res+msg+errors);
			fn();
			/*
			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();*/
		},
		
		ajax: function(msg, fn){
			var oXml = utilities.xmlTree(msg);
			fn(oXml.error, oXml.result.error, oXml.result.ok);
		},
		
		/*
			TODO : pasar los errores en una estructura legible / <ul><li>
		*/
		ajax2: function(xmldoc, fn){
			//var oXml = utilities.xmlTree(msg);
			//var errors 	= (xmldoc.getElementsByTagName('errors')[0].childNodes[0].nodeValue) ? xmldoc.getElementsByTagName('errors')[0].childNodes[0].nodeValue : '';
			//var result 	= xmldoc.getElementsByTagName('result')[0].childNodes[0].nodeValue;
			//var message = xmldoc.getElementsByTagName('message')[0].childNodes[0].nodeValue;						
			var accio   = $(xmldoc).find("action").text();
			var errors 	= $(xmldoc).find("errors").text();
			var result 	= $(xmldoc).find("result").text();
			var message = $(xmldoc).find("message").text();
			
			
			fn(result, message, errors);
		}
		
	}
	