/**
 * @author Arturo, ruvart <ruvart@balam-dt.com>
 * @version 1.0 20/marzo/2009
 */

//*****************************  Variables Globales  *****************************

var IE = document.all?true:false;
var mX = 0;
var mY = 0;
var V = {};

$(document).bind("mousemove", function(e){ mX = e.pageX; mY = e.pageY; if (mX < 0){mX = 0;} if (mY < 0){mY = 0;} });

//*****************************  FIN Variables Globales  *****************************


//*****************************  Clases  *****************************

/**
 * Los metodos de un objeto XMLHttpRequest son:

    * abort(): Aborta la peticiÃ³n actual.
    * getAllResponseHeaders(): Devuelve todas las cabeceras (etiquetas y valores) como un string.
    * getResponseHeader("headerLabel"): Devuelve el valor de la cabecera etiquetada como headerLabel.
    * open("method", "URL"[, asyncFlag[, "userName"[, "password"]]]): Abre una conexiÃ³n a una URL, con un mÃ©todo HTTP (get o post), y otros parÃ¡metros opcionales.
    * send(content): EnvÃ­a la peticiÃ³n. Suele ser un String o un objeto DOM
    * setRequestHeader("label", "value"): Crea un par etiqueta/valor para ser enviado en la cabecera de la peticiÃ³n.

 * Las Propiedades son:

    * onreadystatechange: Guarda el nombre de la funciÃ³n Javascript que manejarÃ¡ los cambios de estado en la peticiÃ³n.
    * readyState: Entero que codifica el estado actual de la peticiÃ³n:
      0 = No Inicializado
      1 = Cargando
      2 = Cargado
      3 = Interactuando
      4 = Completado
    * responseText: VersiÃ³n en forma de String de los datos devueltos por el servidor.
    * responseXML: Objeto DOM compatible de la respuesta del servidor.
    * status: CÃ³digo de estado devuelto por el servidor, como 404 para No encontrado o 200 para Ok.
    * statusText: Mensaje que acompaÃ±a al cÃ³digo de estado.


 * ConstrucciÃ³n de un "send" de ejemplo:

    * send("valor="+valor+"&valor2="+valor2)
 */

/**
 * Clase Ajax
 * 
 * Clase que prove un poco de mÃ¡s funcionalidad a la clase XMLHttpRequest.
 */
function Ajax() {
	this.loaded_xmlHttp = false;
	this.Content_Type = 'application/x-www-form-urlencoded';
	this.xmlHttp = null;
	this.user = '';
	this.pass = '';
	this.aviso = '';
	this.valOn = '';
	this.valOff = '';
	this.avisoTipo = '';
	
	this.func_cargando = null;
	this.func_cargado = null;
	this.func_interact = null;
	this.func_complet = null;
	
	/**
	 * FunciÃ³n que crea el objeto XMLHttpRequest y lo agrega como propiedad al ojeto Ajax.
	 */
	this.load_xmlHttp = function() {
		try {
			this.xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
			this.loaded_xmlHttp = true;
		} catch (e) {
			try {
				this.xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
				this.loaded_xmlHttp = true;
			} catch (E) {
				this.loaded_xmlHttp = false;
			}
		}
		if (!this.loaded_xmlHttp && typeof XMLHttpRequest!='undefined') {
			this.xmlHttp = new XMLHttpRequest();
			this.loaded_xmlHttp = true;
		}
	}
	
	/**
	* FunciÃ³n que se ejecuta cuando se envÃ­a la peticiÃ³n al servidor.
	*/
	this.func_cargando = function() {
		if ( this.aviso != '' && this.valOn != '' ) {
			var toDo = '';
			if ( this.avisoTipo != '' ) { toDo = this.aviso + '~;~css~;~display~=~' + this.avisoTipo + '~.~'; }
			actions(toDo + this.aviso + '~=~' + this.valOn);
		}
	}
	
	/**
	* FunciÃ³n que se ejecuta cuando se recibe la respuesta del servidor.
	*/
	this.func_complet = function() {
		if ( this.aviso != '' && this.valOff != '' ) {
			var toDo = '';
			if ( this.avisoTipo != '' ) { toDo = this.aviso + '~;~css~;~display~=~none~.~'; }
			actions(toDo + this.aviso + '~=~' + this.valOff);
		}
		if ( this.xmlHttp.responseText.indexOf("~=~") === -1 ) { actions('mensaje~;~error~;~Error en el sistema~=~'+this.xmlHttp.responseText); }
		else { actions(this.xmlHttp.responseText); }
	}
	
	/**
	 * FunciÃ³n encargada de la conecciÃ³n con el servidor (enviar y recibir datos).
	 * 
	 * @param String metodo mÃ©todo por el que se van a enviar los datos (GET o POST).
	 * @param String url la direcciÃ³n a la que se va a comunicar el Ajax.
	 * @param Bolean async Bandera que indica si se harÃ¡ conecciÃ³n sincrona o asincrona (true o false).
	 * @param String values Cadena de valores que se enviarÃ¡n al servidor o null.
	 */
	this.enviar = function(metodo, url, values, aviso, valOn, valOff, avisoTipo, async) {
		//arreglo mis variables
		this.aviso = aviso || this.aviso;
		this.valOn = valOn || this.valOn;
		this.valOff = valOff || this.valOff;
		this.avisoTipo = avisoTipo || this.avisoTipo;
		async = async || true;
		//--------------------------------------
		
		//abro mi conecciÃ³n hacia el servidor;
		if ( this.user == '' ) {
			this.xmlHttp.open(metodo, url, async);
		}
		else {
			this.xmlHttp.open(metodo, url, async, this.user, this.pass);
		}
		//--------------------------------------
		
		//ejecuto las acciones que me piden al cambiar de estado;
		var ajaxObject = this;
		this.xmlHttp.onreadystatechange = function() {
			if ( ajaxObject.xmlHttp.readyState == 1 && ajaxObject.func_cargando != null ) {
					ajaxObject.func_cargando();
			}
			else if ( ajaxObject.xmlHttp.readyState == 2 && ajaxObject.func_cargado != null ) {
				ajaxObject.func_cargado();
			}
			else if ( ajaxObject.xmlHttp.readyState == 3 && ajaxObject.func_interact != null ) {
				ajaxObject.func_interact();
			}
			else if ( ajaxObject.xmlHttp.readyState == 4 && ajaxObject.func_complet != null ) {
				ajaxObject.func_complet();
			}
		}
		//--------------------------------------
		
		//envÃ­o los datos, o null en caso de que sea por GET
		try{
			this.xmlHttp.setRequestHeader('Content-Type',this.Content_Type);
			this.xmlHttp.send(values);
		} catch (e) {
			//alert(this.readyState);
		}
		//--------------------------------------
	}
	
	//proceso de cargado del objeto XMLHttpRequest
	this.load_xmlHttp();
	//------------------------------------------
}

//*****************************  FIN Clases  *****************************


//*****************************  Funciones Generales  *****************************

/**
* FunciÃ³n que retorna la posiciÃ³n del mouse.
*
* @param e event El evento del mouse
*/
function getMouseXY(e) {}

/**
* FunciÃ³n que facilita la paginaciÃ³n y redireccionamiento de una liga.
*
* @param pag String La ruta de la pÃ¡gina a abrir.
* @param target String Indica donde se va a abrir la pÃ¡gina (en la misma ventana o en otra nueva).
*/
function paginacion(pag,target) {
	if ( target && target != '' ) { window.open(pag,target); }
	else { window.open(pag,"_self"); }
}

/**
* FunciÃ³n que cambia la ruta de acciÃ³n de un formulario.
*
* @param nombre String Id del formulario a modificar.
* @param direccion String La nueva ruta de acciÃ³n del formulario.
* @param boton String Nombre del botÃ³n que es el submit.
*/
function next(id,direccion,boton) {
	document.getElementById(id).action = direccion;
	document.getElementsByName(boton)[0].click();
}

/**
* FunciÃ³n que nos dice si una variable es un arreglo.
*
* @param variable Mixed La variable a revisar.
* @return Boolean True o False.
*/
function is_array(variable) {
	return ( variable instanceof Array ) ? true : false;
}

/**
* FunciÃ³n que realiza las acciones indicadas por la "cadena de acciÃ³n".
*
* @param C_A String "cadena de acciÃ³n" a ser ejecutada.
*/
function actions( C_A ) {
	C_A = C_A.split('~.~');
	var U_A,U_D,elemento;
	
	for ( var x = 0; x < C_A.length; x ++ ) {
		U_A = C_A[x].split('~=~');
		U_D = U_A[0].split('~;~');
		//si javascript
		if ( U_D[0] == 'jscript' ) { eval(U_A[1]); }
		//si mensaje
		else if ( U_D[0] == 'mensaje' ) {
			if ( U_D.length == 1 ) { alerta(U_A[1]); }
			else if ( U_D.length == 2 ) { alerta(U_A[1],'',U_D[1]); }
			else { alerta(U_A[1],U_D[2],U_D[1]); }
		}
		//si nuevo documento
		else if ( U_D[0] == 'abrir' ) {
			var wind = null;
			if ( U_D.length == 1 ) { wind = window.open('about:blank',"_self"); }
			else if ( U_D.length == 2 ) { wind = window.open('about:blank',U_D[1]); }
			else { wind = window.open('about:blank',U_D[1],U_D[2]); }
			wind.document.open(); wind.document.write(U_A[1]); wind.document.close();
		}
		//si acción
		else {
			//edito el innerHTML
			if ( U_D.length == 1 || U_D[1] == 'html' ) { $(U_D[0]).html(U_A[1]); }
			//edito el value
			else if ( U_D[1] == 'val' ) { $(U_D[0]).val(U_A[1]); }
			//edito el estilo
			else if ( U_D[1] == 'css' ) { $(U_D[0]).css(U_D[2],U_A[1]); }
			//edito un atributo
			else if ( U_D[1] == 'attr' ) { $(U_D[0]).attr(U_D[2],U_A[1]); }
			//inserto un html
			else if ( U_D[1] == 'append' ) { $(U_D[0]).append(U_A[1]); }
		}
	}
}

/**
* FunciÃ³n que sirve para conectarse a una direcció web con Ajax (equivalente a paginacion() pero con ajax).
*
* @param pag String La ruta de la pÃ¡gina a abrir
* @param param String Cadena de parámetros a enviar por POST
* @param aviso String Ruta a un elemento que valla a servir como indicador de estado
* @param valOn String Código que aparecerá en el indicador de estado cuando se inicie la petición ajax
* @param valOff String Código que aparecerá en el indicador de estado cuando finalize la petición ajax
* @param avisoTipo String Indica cómo se mostrará el indicador de estado. Ejemplo: 'block', 'inline', ''
* @param ajax Objeto Ajax en caso de que esté personalizado
*/
function paginacionAjax(pag,param,aviso,valOn,valOff,avisoTipo,ajax) {
	var Ajax1 = ajax || new Ajax();
	param = ( param && param != '' ) ? param + '&ajax=true' : 'ajax=true';
	
	Ajax1.enviar('POST',pag,param,aviso,valOn,valOff,avisoTipo);
}

/**
* FunciÃ³n que sirve para enviar un formulario por medio de Ajax.
*
* @param form String Ruta al elemento que contenga el formulario
* @param pagina String Página a la cual se enviará el formulario
* @param aviso String Ruta a un elemento que valla a servir como indicador de estado
* @param valOn String Código que aparecerá en el indicador de estado cuando se inicie la petición ajax
* @param valOff String Código que aparecerá en el indicador de estado cuando finalize la petición ajax
* @param avisoTipo String Indica cómo se mostrará el indicador de estado. Ejemplo: 'block', 'inline', ''
* @param ajax Objeto Ajax en caso de que esté personalizado
*/
function formAjax(form,pagina,aviso,valOn,valOff,avisoTipo,ajax) {
	var Ajax1 = ajax || new Ajax();
	var params = '',campos,campos_2,x,y;
	
	//tomo los texto
	campos = $(form + " input[type=text]").get();
	for ( x = 0; x < campos.length; x++ ) { params += ( campos[x].disabled !== true ) ? campos[x].name + '=' + campos[x].value + '&' : ''; }
	
	//tomo los hidden
	campos = $(form + " input[type=hidden]").get();
	for ( x = 0; x < campos.length; x++ ) { params += ( campos[x].disabled != true ) ? campos[x].name + '=' + campos[x].value + '&' : '';	}
	
	//tomo los password
	campos = $(form + " input[type=password]").get();
	for ( x = 0; x < campos.length; x++ ) { params += ( campos[x].disabled != true ) ? campos[x].name + '=' + campos[x].value + '&' : '';	}
	
	//tomo los textarea
	campos = $(form + " textarea").get();
	for ( x = 0; x < campos.length; x++ ) {	params += ( campos[x].disabled != true ) ? campos[x].name + '=' + campos[x].value + '&' : '';	}
	
	//tomo los select
	campos = $(form + " select").get();
	for ( x = 0; x < campos.length; x++ ) {
		if ( campos[x].multiple != true ) { params += ( campos[x].disabled != true ) ? campos[x].name + '=' + campos[x].value + '&' : ''; }
		else if ( campos[x].disabled != true ) {
			campos_2 = campos[x].getElementsByTagName('option');
			for ( y = 0; y < campos_2.length; y++ ) { params += ( campos_2[y].selected == true ) ? campos[x].name + '[' + y + ']=' + campos_2[y].value + '&' : ''; }
		}
	}
	
	//tomo los radio
	campos = $(form + " input[type=radio]").get();
	for ( x = 0; x < campos.length; x++ ) { params += ( campos[x].disabled != true && campos[x].checked == true ) ? campos[x].name + '=' + campos[x].value + '&' : ''; }
	
	//tomo los checkbox
	campos = $(form + " input[type=checkbox]").get();
	for ( x = 0; x < campos.length; x++ ) { params += ( campos[x].disabled != true && campos[x].checked == true ) ? campos[x].name + '=' + campos[x].value + '&' : ''; }
	
	params += 'ajax=true';
	Ajax1.enviar('POST',pagina,params,aviso,valOn,valOff,avisoTipo);
}

/**
* FunciÃ³n que sirve para limpiar un formulario.
*
* @param form String Ruta al elemento que contenga el formulario
*/
function cleanForm(form) {
	//limpio los texto
	$(form + " input[type=text]").val('');
	//limpio los hidden
	$(form + " input[type=hidden]").val('');
	//limpio los password
	$(form + " input[type=password]").val('');
	//limpio los textarea
	$(form + " textarea").val('');
	//limpio los select
	$(form + " select").val('');
	//limpio los radio
	$(form + " input[type=radio]").attr("checked",false);
	//limpio los checkbox
	$(form + " input[type=checkbox]").attr("checked",false);
	//limpio los listadoRegistro
	$(form + " [name=listadoRegistro] table tbody").html('');
}

/**
 * Función que convierte un número decimal a hexadecimal de 2 dígitos.
 * 
 * @param Int Dec Número decimal a ser convertido
 */
function Hexa(Dec) {
	var nb = Dec.toString(16)
	return ( nb.length < 2 ) ? "0" + nb : nb;
}

/**
 * Función que valida que un número se encuentre entre dos valores o lo limita a esos dos valores.
 * 
 * @param Number valor Número a ser evaluado
 * @param Number menor Valor límite menor
 * @param Number mayor Valor límite mayor
 */
function entre(valor,menor,mayor) {
	return ( valor < menor ) ? menor : ( ( valor > mayor ) ? mayor : valor );
}

/**
 * Función que entrega las propiedades de un objeto.
 * 
 * @param Object objeto Objeto que se va a revisar de sus propiedades
 * @param Boolean completo Bandera que indica si se muestran solo las propiedades o tambien el valor de cada una de estas
 */
function propiedades(objeto,completo) {
	completo = completo || false;
	var salida = '';
	for ( var prop in objeto ) { salida += ( completo ) ? prop + '= ' + objeto[prop] + ', ' : prop + ', '; }
	return salida.substring(0,salida.length-2);
}

/**
 * Función que sirve para cambiar la clase que marca como seleccionado a un elemento.
 * 
 * Sirve para marcar elementos de menus, submenus, listas, tablas, etc.
 * 
 * @param String lista Cadena de texto que nos identifica la lista
 * @param String clase Nombre de la clase
 * @param Int sel Número del elemento (en caso que se requiera) que será marcado como seleccionado
 */
function selectClass(lista,clase,sel) {
	$(lista).removeClass(clase);
	if ( sel !== false && sel !== null ) { $(lista+':eq('+sel+')').addClass(clase); }
}

function getPN(obj,dad) {
	for ( x = 0; x < dad; x++ ) { obj = ( obj.parentNode ) ? obj.parentNode : obj; }
	return obj;
}
//*****************************  FIN Funciones Generales  *****************************


//*****************************  Funciones de Mensajes  *****************************

/**
* FunciÃ³n que muestra un mensaje de texto.
*
* @param String msg Mensaje que se desea mostrar
* @param String titulo El tÃ­tulo del mensaje
* @param String tipo Tipo de mensaje (info = información, error = error, warning = advertencia)
*/
function alerta(msg,titulo,tipo) {
	titulo = titulo || '';
	if (tipo == 'warning') { tipo = 'class="warningCuadro"'; }
  else if (tipo == 'error') { tipo = 'class="errorCuadro"'; }
  else { tipo = 'class="infoCuadro"'; }
	
	var estilo = ' style="width:'+($(document).width()-2)+'px; height:'+($(document).height()-2)+'px;"';
	$('body').append('<div id="alertaFondo"'+estilo+'></div>');
	estilo = ' style="max-width:'+($(window).width()-80)+'px;"';
	$('body').append('<div id="alertaCuadro" '+tipo+'><div><h1>'+titulo+'</h1><div id="alertaMsg"'+estilo+'>'+msg+'</div><br/><button type="button" onclick="cerrarMsg()">Aceptar</button><div></div>');
	$('#alertaCuadro').css('top',($(document).scrollTop()+($(window).height()/4))+'px').css('min-width',($(window).width()*(2/5))+'px').hide().fadeIn('slow');
	$('#alertaCuadro').css('left',($(document).scrollLeft() + (($(window).width() - $('#alertaCuadro').width())/2))+'px');
}

/**
* FunciÃ³n que se ejecuta al cerrar el mensaje y que ejecuta el cÃ³digo javascript pedido.
*
* @param String accion CÃ³digo javascript a ser ejecutado
*/
function cerrarMsg(accion,fast) {
	if ( fast ) { $('#alertaCuadro').remove();$('#alertaFondo').remove(); }
	else { $('#alertaCuadro').fadeOut('slow',function(){$(this).remove();$('#alertaFondo').remove();}); }
}

/**
 * Función que crea una tooltip.
 * 
 * @param String msg Mensaje que se desea mostrar
 * @param String Tipo de mensaje (info = información, error = error, warning = advertencia)
 */
function toolTip(elemento,msg,tipo) {
	if (tipo == 'warning') { tipo = 'class="warningCuadro"'; }
  else if (tipo == 'error') { tipo = 'class="errorCuadro"'; }
  else { tipo = 'class="infoCuadro"'; }

	$('body').append('<div id="toolTip" '+tipo+' style="top:'+(mY+1)+'px; left:'+(mX+1)+'px;"><div id="alertaMsg">'+msg+'</div></div>');
	$(elemento).one('mouseout', function(e){ $('#toolTip').remove(); });
}

/**
 * Función que muestra un formulario flotante (desplegable).
 * 
 * @param String form Estructura del formulario
 * @param String titulo El título del formulario
 * @param String pagina Página a la cual se enviará el formulario
 * @param String valOn Código que aparecerá en el indicador de estado cuando se inicie la petición ajax
 */
function alertaForm(form,titulo,pagina,valOn) {
	titulo = titulo || '';
	valOn = "$(\\'#status\\').html(\\'"+valOn+"\\').css(\\'display\\',\\'block\\')";
	var estilo = ' style="width:'+($(document).width()-2)+'px; height:'+($(document).height()-2)+'px;"';
	$('body').append('<div id="alertaFondo"'+estilo+'></div>');
	estilo = ' style="max-width:'+($(window).width()-80)+'px;"';
	var app = '<div id="alertaCuadro" class="alertaForm"><div><h1>'+titulo+'</h1><div id="alertaMsg"'+estilo+'>'+form+'</div><div id="status" class="statusBloque"></div><br/>';
	app += '<button type="button" onclick="formAjax(\'#alertaMsg\',\''+pagina+'\',\'jscript\',\''+valOn+'\',\'cerrarMsg(true,true);\')">Guardar</button>';
	app += '<button type="button" onclick="cerrarMsg()">Cancelar</button>';
	app += '<button type="button" onclick="cleanForm(\'#alertaMsg\')">Limpiar</button><div></div>';
	$('body').append(app);
	$('#alertaCuadro').css('top',($(document).scrollTop()+($(window).height()/4))+'px').css('min-width',($(window).width()*(2/5))+'px').hide().fadeIn('slow');
	$('#alertaCuadro').css('left',($(document).scrollLeft() + (($(window).width() - $('#alertaCuadro').width())/2))+'px');
}

//*****************************  FIN Funciones de Mensajes  *****************************


//*****************************  Funciones Particulares  *****************************



//*****************************  FIN Funciones Particulares  *****************************


//***************************** Funcion para el menu ***********************************

/**
 * La funcion devuelve direcion de la pagina en la que se encuentra
 */
function getURL() {
	var myLink;
	var contacto = /contacto/

	if( location.href == "http://balam.mx/" || location.href == "http://balam.mx/inicio"){
		myLink = "inicio";
	}
	else if( location.href == "http://balam.mx/quienes"){
		myLink = "b1";
	}
	else if( location.href == "http://balam.mx/servicios" ){
		myLink = "b2";
	}
	else if( location.href == "http://balam.mx/productos"){
		myLink = "b3";
	}
	else if( location.href == "http://balam.mx/portafolio" ){
		myLink = "b4";
	}
	else if( location.href == "http://balam.mx/contacto" || contacto.test(location.href) ){
		myLink = "b5";
	}
	else if( location.href == "http://blog.balam.mx/" ){
		myLink = "b6";
	}

	return myLink;
}
/****************************************************************************************/

function abrir(url) {
	open(url) ; 
}

