	
	var 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());
		},
		
		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);
			}
		},
		
		checkboxTreeDependence: function(obj){
			// hijos
			$(obj).parent().parent().find("ul input[type='checkbox']").each(function(){
				$(this).get(0).checked = obj.checked;
			});
			// padre
			if($(obj).parents("li").length > 1)
				$($(obj).parent().parent().parent().parent().find("input[type='checkbox']")[0]).get(0).checked = true;
		},
		
		jump: function(obj){
			top.location = obj[obj.selectedIndex].value;
		},

		hitTest: function(clickedObj, div, doWhenOutside){
			$(document).bind('click', function(e){
				var clicked = $(e.target);
				if (!(clicked.is(div) || clicked.parents().is(div))) {
					$(document).unbind('click');
					doWhenOutside(div);
				}else{
				}
			});
		},
	
		AJAX: function(Url, Pars, OnSuccess){
			this.XML = null;
			this.error = false;
			this.empty = true;
			var _this = this;
			$.ajax({
				type: "POST",
				dataType: "xml",
				url: Url,
				data: Pars,
				success: function(data){
					_this.XML = $(data).find("result");
					_this.empty = _this.single() == "";
					_this.error = !_this.XML.length;
					OnSuccess(_this.XML, _this);
				}
			});
			this.tag = function(name){
				return utilities.xml.tag(this.XML, name);
			}
			this.single = function(){
				return utilities.xml.single(this.XML);
			}
		},
		
		xml: {
			clean: function(data){
				return $.trim(data);
			},
			tag: function(father, name){
				var tg = $(father).find(name);
				var value = "";
				if (tg.length){
					var content = utilities.xml.clean(tg.text());
					if(tg.text()) value = utilities.xml.Int(content);
				}
				return value;
			},
			single: function(father){
				return utilities.xml.Int(utilities.xml.clean($(father).text()));
			},
			Int: function(value){
				var value = value.toString();
				if(value.match(/^[0-9]+$/)) 
					value = parseInt(value);
				return value;
			}
		},
		
		textClear: function(input, def){
			var d = def != undefined ? def : input.defaultValue;
			if(input.value != def) return false;
			if(input.value == d){
				input.value = "";
			}
		},
		
		textRestore: function(input, def) {
			var d = def != undefined ? def : input.defaultValue;
			if(input.value == ""){
				input.value = d
			}
		},
		 
		pad: function(str, len, pad, dir) {
			
			var str = str.toString();
			 
			var STR_PAD_LEFT = 1;
			var STR_PAD_RIGHT = 2;
			var STR_PAD_BOTH = 3;
		 
			if (typeof(len) == "undefined") { var len = 0; }
			if (typeof(pad) == "undefined") { var pad = ' '; }
			if (typeof(dir) == "undefined") { var dir = STR_PAD_RIGHT; }
		 
			if (len + 1 >= str.length) {
		 
				switch (dir){
		 
					case STR_PAD_LEFT:
						str = Array(len + 1 - str.length).join(pad) + str;
					break;
		 
					case STR_PAD_BOTH:
						var right = Math.ceil((padlen = len - str.length) / 2);
						var left = padlen - right;
						str = Array(left+1).join(pad) + str + Array(right+1).join(pad);
					break;
		 
					default:
						str = str + Array(len + 1 - str.length).join(pad);
					break;
		 
				} // switch
		 
			}
		 
			return str;
		 
		}
		
	}
	