	/**
	*
	*	UTF-8 data encode / decode
	*	http://www.webtoolkit.info/
	*
	**/
	 
	var Utf8 = {
	 
		// public method for url encoding
		encode : function (string) {
			string = string.replace(/\r\n/g,"\n");
			var utftext = "";
	 
			for (var n = 0; n < string.length; n++) {
	 
				var c = string.charCodeAt(n);
	 
				if (c < 128) {
					utftext += String.fromCharCode(c);
				}
				else if((c > 127) && (c < 2048)) {
					utftext += String.fromCharCode((c >> 6) | 192);
					utftext += String.fromCharCode((c & 63) | 128);
				}
				else {
					utftext += String.fromCharCode((c >> 12) | 224);
					utftext += String.fromCharCode(((c >> 6) & 63) | 128);
					utftext += String.fromCharCode((c & 63) | 128);
				}
	 
			}
	 
			return utftext;
		},
	 
		// public method for url decoding
		decode : function (utftext) {
			var string = "";
			var i = 0;
			var c = c1 = c2 = 0;
	 
			while ( i < utftext.length ) {
	 
				c = utftext.charCodeAt(i);
	 
				if (c < 128) {
					string += String.fromCharCode(c);
					i++;
				}
				else if((c > 191) && (c < 224)) {
					c2 = utftext.charCodeAt(i+1);
					string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
					i += 2;
				}
				else {
					c2 = utftext.charCodeAt(i+1);
					c3 = utftext.charCodeAt(i+2);
					string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
					i += 3;
				}
	 
			}
	 
			return string;
		}
	 
	}
	
	
	/**
	 * Concatenates the values of a variable into an easily readable string
	 * by Matt Hackett [scriptnode.com]
	 * @param {Object} x The variable to debug
	 * @param {Number} max The maximum number of recursions allowed (keep low, around 5 for HTML elements to prevent errors) [default: 10]
	 * @param {String} sep The separator to use between [default: a single space " "]
	 * @param {Number} l The current level deep (amount of recursion). Do not use this parameter: it"s for the function"s own use
	 */
	function print_r(x, max, sep, l) {
		l = l || 0;
		max = max || 10;
		sep = sep || " ";
		if (l > max) {
			return "[WARNING: Too much recursion]\n";
		}
		var
			i,
			r = "",
			t = typeof x,
			tab = "";
		if (x === null) {
			r += "(null)\n";
		} else if (t == "object") {
			l++;
			for (i = 0; i < l; i++) {
				tab += sep;
			}
			if (x && x.length) {
				t = "array";
			}
			r += "(" + t + ") :\n";
			for (i in x) {
				try {
					r += tab + "[" + i + "] : " + print_r(x[i], max, sep, (l + 1));
				} catch(e) {
					return "[ERROR: " + e + "]\n";
				}
			}
		} else {
			if (t == "string") {
				if (x == "") {
					x = "(empty)";
				}
			}
			r += "(" + t + ") " + x + "\n";
		}
		return r;
	};
	var_dump = print_r;
	
	function unserialize(data){
	// http://kevin.vanzonneveld.net
	// +		 original by: Arpad Ray (mailto:arpad@php.net)
	// +		 improved by: Pedro Tainha (http://www.pedrotainha.com)
	// +		 bugfixed by: dptr1988
	// +			revised by: d3x
	// +		 improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// %						note: We feel the main purpose of this function should be to ease the transport of data between php & js
	// %						note: Aiming for PHP-compatibility, we have to translate objects to arrays 
	// *			 example 1: unserialize("a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}");
	// *			 returns 1: ["Kevin", "van", "Zonneveld"]
	// *			 example 2: unserialize("a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}");
	// *			 returns 2: {firstName: "Kevin", midName: "van", surName: "Zonneveld"}
		var error = function (type, msg, filename, line){throw new window[type](msg, filename, line);};
		var read_until = function (data, offset, stopchr){
			var buf = [];
			var chr = data.slice(offset, offset + 1);
			var i = 2;
			while(chr != stopchr){
				if((i+offset) > data.length){
					error("Error", "Invalid");
				}
				buf.push(chr);
				chr = data.slice(offset + (i - 1),offset + i);
				i += 1;
			}
			return [buf.length, buf.join("")];
		};
		var read_chrs = function (data, offset, length){
			buf = [];
			for(var i = 0;i < length;i++){
				var chr = data.slice(offset + (i - 1),offset + i);
				buf.push(chr);
			}
			return [buf.length, buf.join("")];
		};
			var _unserialize = function (data, offset){
			 if(!offset) offset = 0;
			 var buf = [];
			 var dtype = (data.slice(offset, offset + 1)).toLowerCase();
			 
			 var dataoffset = offset + 2;
			 var typeconvert = new Function("x", "return x");
			 var chrs = 0;
			 var datalength = 0;
			 
			 switch(dtype){
				case "i":
				 typeconvert = new Function("x", "return parseInt(x)");
				 var readData = read_until(data, dataoffset, ";");
				 var chrs = readData[0];
				 var readdata = readData[1];
				 dataoffset += chrs + 1;
				break;
				case "b":
				 typeconvert = new Function("x", "return (parseInt(x) == 1)");
				 var readData = read_until(data, dataoffset, ";");
				 var chrs = readData[0];
				 var readdata = readData[1];
				 dataoffset += chrs + 1;
				break;
				case "d":
				 typeconvert = new Function("x", "return parseFloat(x)");
				 var readData = read_until(data, dataoffset, ";");
				 var chrs = readData[0];
				 var readdata = readData[1];
				 dataoffset += chrs + 1;
				break;
				case "n":
				 readdata = null;
				break;
				case "s":
				//CRX 2009 LOS CHARS UTF VALEN * 2
				var ccount = read_until(data, dataoffset, ":");
				var chrs = ccount[0];
				var stringlength = ccount[1];
				dataoffset += chrs + 2;
				
				var readData = read_chrs(data, dataoffset+1, parseInt(stringlength));
				var chrs = readData[0];
				var readdata = readData[1];
				dataoffset += chrs + 2;
				if(chrs != parseInt(stringlength) && chrs != readdata.length){
				error("SyntaxError", "String length mismatch");
				}
				break;
				case "a":
				 var readdata = {};
				 
				 var keyandchrs = read_until(data, dataoffset, ":");
				 var chrs = keyandchrs[0];
				 var keys = keyandchrs[1];
				 dataoffset += chrs + 2;
				 
				 for(var i = 0;i < parseInt(keys);i++){
					var kprops = _unserialize(data, dataoffset);
					var kchrs = kprops[1];
					var key = kprops[2];
					dataoffset += kchrs;
					
					var vprops = _unserialize(data, dataoffset);
					var vchrs = vprops[1];
					var value = vprops[2];
					dataoffset += vchrs;
					
					readdata[key] = value;
				 }
				 
				 dataoffset += 1;
				break;
				default:
				 error("SyntaxError", "Unknown / Unhandled data type(s): " + dtype);
				break;
			 }
			 return [dtype, dataoffset - offset, typeconvert(readdata)];
			};
		return _unserialize(data, 0)[2];
	}
	
	function replaceHtml(el, html) {
		if (el != null) {
			var oldEl = (typeof el === "string" ? document.getElementById(el) : el);
			var newEl = document.createElement(oldEl.nodeName);
			// Preserve the elements id and class (other properties are lost)
			newEl.id = oldEl.id;
			newEl.className = oldEl.className;
			// Replace the old with the new
			newEl.innerHTML = html;
			oldEl.parentNode.replaceChild(newEl, oldEl);
		}
		/* Since we just removed the old element from the DOM, return a reference
		to the new element, which can be used to restore variable references. */
		return newEl;
	}

	function ExtraeDato(pagina) {
			inicio = pagina.indexOf("<crx>");
			fin = pagina.lastIndexOf("</crx>");
			if (inicio >=0 ) {
				return ( pagina.substring(inicio + 5 , fin ) );
			} else {
				alert ("ERROR AL EXTRAER DATA");
				return pagina;
			}
	}

	function getXMLHttp() {
		var xmlHttp
		try {
			//Firefox, Opera 8.0+, Safari
			xmlHttp = new XMLHttpRequest();
		}
		catch(e) {
			//Internet Explorer
			try {
				xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch(e) {
				try {
					xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(e) {
					alert("Your browser does not support AJAX!")
					return false;
				}
			}
		}
		return xmlHttp;
	}

	function normaliza(action) {
		//alert(action);
		//normaliza una direccion por ejemplo si es sitio/app/controller/edit/33 0 .../add la accion actual entrega /app/controller/
		//solo sirve para acciones con parametros opcionales (edit - add)
		direccion = location.href;
		
		adireccion = direccion.split("/");
		prefijo = adireccion[0];
		if ( ( prefijo == "http:" ) || ( prefijo == "https:" ) ) {
			//Ojo solo funciona si el sitio esta en una carpeta para sitio raiz hay 4 = 3 5 = 4
			//SOLUCION llamar controller/action en ves de action y truncarla con href
			prefijo = prefijo + "//";
			sitio = adireccion[2] + "/";
			folder = adireccion[3] + "/";
			controller = adireccion[4] +"/";
			//action = adireccion[5];
			return prefijo + sitio + folder + controller + action;
		} else {
			alert("Error al normalizar dirección")
			return pagina;
		}
		
		return direccion + pagina;
	}
	
	function FunctionAjax(url) {
		//Llama a php y trae el dato listo para javascript
		// DATO <crx>datos serializados</crx>
		var xmlHttp = getXMLHttp();
		xmlHttp.open("GET", normaliza(url), false);
		xmlHttp.send(null);
		return eval('(' + ExtraeDato(xmlHttp.responseText) + ')');
	}
	
	function CheckInt(Val) {
			//Verifica si una variable es entera
		if (Val != parseInt(Val)) {
			return false;
		} else {
			return true;
		}
	}

		function ForceInt(Val) {
			//fuerza una variable a entero, retorna cero si es erroneo.
		if (Val != parseInt(Val)) {
			return 0;
		} else {
			return Val;
		}
	}

	function ProcedureAjax(url) {
		//Ejecuta php sin retorno
		var xmlHttp = getXMLHttp();
		xmlHttp.open("GET", normaliza(url), false);
		xmlHttp.send(null);
		return true;
	}

	function HtmlAjax(url) {
		//Retorna html puro entre los div <crx></crx>
		var xmlHttp = getXMLHttp();
		xmlHttp.open("GET", normaliza(url), false);
		xmlHttp.send(null);
		return ExtraeDato(xmlHttp.responseText);
	}

	function DivAjax(url, div) {
		//Reemplaza un div con el html de php
		replaceHtml( div, HtmlAjax( url ) )
	}
	
	function HtmlAjax2(url) {
		//Retorna html puro entre los div <crx></crx>
		var xmlHttp = getXMLHttp();
		xmlHttp.open("GET", normaliza(url), false);
		xmlHttp.send(null);
		return xmlHttp.responseText;
	}

	function DivAjax2(url, div) {
		//Reemplaza un div con el html de php
		replaceHtml( div, HtmlAjax2( url ) )
	}
	
	function number_format( number, decimals, dec_point, thousands_sep ) {
		var n = number, prec = decimals;
		n = !isFinite(+n) ? 0 : +n;
		prec = !isFinite(+prec) ? 0 : Math.abs(prec);
		var sep = (typeof thousands_sep == "undefined") ? ',' : thousands_sep;
		var dec = (typeof dec_point == "undefined") ? '.' : dec_point;

		var s = (prec > 0) ? n.toFixed(prec) : Math.round(n).toFixed(prec); //fix for IE parseFloat(0.55).toFixed(0) = 0;

		var abs = Math.abs(n).toFixed(prec);
		var _, i;

		if (abs >= 1000) {
				_ = abs.split(/\D/);
				i = _[0].length % 3 || 3;

				_[0] = s.slice(0,i + (n < 0)) +
							_[0].slice(i).replace(/(\d{3})/g, sep+'$1');

				s = _.join(dec);
		} else {
				s = s.replace('.', dec);
		}

		return s;
	}


	
	function ToRut(numero) {
		aux = numero;
		ddv = "X";
		factor = 2;
		suma = 0;
		while (aux != 0) {
			digito = aux % 10;
			suma = suma + factor * digito;
			aux/= 10;
			factor++;
			if (factor == 8) factor = 2;
		}
		ddv = parseInt(11 - (suma % 11));
		if (ddv == 10) ddv = "K";
		if (ddv == 11) ddv = "0";
		if (numero != '') return number_format(numero, 0, ",", ".") + "-" + ddv;
	}
	//FUNCIONES DE INDEX
	function Ordena(campo) {
		DivAjax( "ordena/" + campo , document.getElementById("ResultadoDiv") );
	}

	function CambiaLimite() {
		limite = document.getElementById("Limite").value;
		limite = parseInt(limite);
		limite = limite.toString();
		if ( (limite == document.getElementById("Limite").value) && (limite > 0) ) {
			DivAjax( "inicio" , document.getElementById("ResultadoDiv") );
			DivAjax( "cambialimite/"+limite , document.getElementById("ResultadoDiv") );
		} else {
			alert("Limite No Valido");
		}
	}
	
	function CambiaPagina() {
		pagina = document.getElementById("PaginaActual").value;
		pagina = parseInt(pagina);
		pagina = pagina.toString();
		if ( (pagina == document.getElementById("PaginaActual").value) && (pagina > 0) ) {
			DivAjax( "cambiapagina/"+pagina , document.getElementById("ResultadoDiv") );
		} else {
			alert("Pagina No Valida");
		}
	}

	function Siguiente() {
		DivAjax( "siguiente" , document.getElementById("ResultadoDiv") );
	}

	function Previo() {
		DivAjax( "previo" , document.getElementById("ResultadoDiv") );
	}

	function Inicio() {
		DivAjax( "inicio" , document.getElementById("ResultadoDiv") );
	}

	function Final() {
		DivAjax( "fin" , document.getElementById("ResultadoDiv") );
	}
	
	function ActualizaDv(strrut) {
		var arut = new Array(8);
		var i, j, dv;
		for (i=1; i<9;i++) {
			arut[i]=0; 
		}
		
		i=0;
		for (j = (9-(strrut.length)); j<9;j++) {
			if (( strrut.substr(i,1) >= 0) & ( strrut.substr(i,1) <= 9)) {
				arut[j] = strrut.substr(i,1); i++; 
			} else { 
				
				i=0; 
				break; 
			}
		}
			
		if (i>0) {
			dv = 11 - (( (arut[1]*3) + (arut[2]*2) + (arut[3]*7) + (arut[4]*6) + (arut[5]*5) + (arut[6]*4) + (arut[7]*3) + (arut[8]*2) )%11)
			if (dv === 10) {
				dv = "K"; 
			} else if (dv === 11) {
				dv = "0"; 
			}
			
			document.getElementById("Dv").value=dv
		}
	}


