/**
 *  hmsutil JavaScript framework, version 1.0
 *  Copyright (c) 2006 Elvis Navarro Vega ( http://www.unipamplona.edu.co )
 *	@autor: Ing Elvis Navarro Vega
 *  @email: elvisnv@unipamplona.edu.co
 *	Grupo de Desarrollo Plataforma - Universidad de Pamplona.
 *	Pamplona (Norte de Santander). Colombia.
 *	Jueves 12 de Octubre del 2006
 *	hmsajax.js
 *	@descripcion :	Comprende el manejo de funciones que son requeridas por los demas
 *					paquetes
 */
 
hms = window.hms || {} ;

/*--------------------------------------------------------------------------*/
/*
 * Manejo de funciones para el objeto hms.util
 */

hms.util = window.hms.util || {} ;


hms.util.createXMLHttpRequest = function () {
	var httpRequest = null;
	if ( window.XMLHttpRequest ) { 
		//--> Mozilla, Safari,...
		httpRequest = new XMLHttpRequest () ;
		if ( httpRequest.overrideMimeType ) 
			httpRequest.overrideMimeType ( 'text/html' ) ;
	} else if ( window.ActiveXObject ) { // IE
    	try { 
            httpRequest = new ActiveXObject ( 'Msxml2.XMLHTTP' ) ;
        } catch (e) {
        	try {
				httpRequest = new ActiveXObject ( 'Microsoft.XMLHTTP' ) ;
            } catch (e) {}
        }
    }
	return httpRequest;
} ;

/*--------------------------------------------------------------------------*/
/*
 * Manejo de funciones para la verificacion de las fechas y para la conversion
 * de las mismas a su equivalente numerico
 */


hms.util.processDate = function ( strDate ) {
	var afecha	= strDate.split ( '-' ) ;
	var fecha 	= new Date ( afecha [ 2 ], afecha [ 1 ] - 1, afecha [ 0 ] );
	if ( fecha.getMonth () != Number ( afecha [ 1 ] - 1 ) )
		return false ;
	return true ;
} ;

hms.util.convertTime = function ( strTime ) {
	var cmpTime = strTime.split ( ':' ) ;
	return Number ( cmpTime [ 0 ] + '' + cmpTime [ 1 ] + '' + cmpTime [ 2 ] ) ;
} ;

hms.util.convertDate = function ( strDate ) {
	var cmpTime = strDate.split ( '-' ) ;
	return Number ( cmpTime [ 2 ] + '' + cmpTime [ 1 ] + '' + cmpTime [ 0 ] ) ;
} ;

/*--------------------------------------------------------------------------*/
/*
 * Captura los campos de un formulario y arma una cadena de parametros
 */

hms.util.setParameters = function ( form ) {
	var parameters = '' ;
	for ( var i = 0; i < form.elements.length; i++ ) {
		var el = form.elements [ i ] ;
		switch ( el.type.toLowerCase () ) {
			case 'radio' :
			case 'checkbox':
				if ( el.checked )
					parameters += el.name + '=' + el.value + '&' ;
				break ;
			case 'button' :	
				break ;
			default:
//				if ( ! hms.field.empty ( el.name ) )
				if ( ! el.value.isEmpty() )
					parameters += el.name + '=' +  el.value + '&' ; 
				break ;
		}
	}
	parameters = parameters.substr ( 0, parameters.length - 1 ) ;
	return ( parameters ) ;
}

/**
 * á ( %E1 )	é ( %E9 )	í ( %ED )	ó ( %F3 )	ú ( %FA )	
 * Á ( %C1 )	É ( %C9 )	Í ( %CD )  	Ó ( %D3 )  	Ú ( %DA )
 * ñ ( %F1 )   	Ñ ( %D1 ) 
 */
hms.util.convertTildes = function ( form ) {
	for ( var i = 0; i < form.elements.length; i++ ) {
		var el = form.elements [ i ] ;
		switch ( el.type.toLowerCase () ) {
			case 'text' : 
			case 'hidden' :
			case 'textarea' :
				if ( ! el.value.isEmpty() ) {
					this.executeConvert ( el, /á/g, '%E1' ) ;
					this.executeConvert ( el, /é/g, '%E9' ) ;
					this.executeConvert ( el, /í/g, '%ED' ) ;
					this.executeConvert ( el, /ó/g, '%F3' ) ;
					this.executeConvert ( el, /ú/g, '%FA' ) ;
					
					this.executeConvert ( el, /Á/g, '%C1' ) ;
					this.executeConvert ( el, /É/g, '%C9' ) ;
					this.executeConvert ( el, /Í/g, '%CD' ) ;
					this.executeConvert ( el, /Ó/g, '%D3' ) ;
					this.executeConvert ( el, /Ú/g, '%DA' ) ;
					
					this.executeConvert ( el, /ñ/g, '%F1' ) ;
					this.executeConvert ( el, /Ñ/g, '%D1' ) ;
					
					this.executeConvert ( el, /\%/g, '%25' ) ;
					this.executeConvert ( el, /\+/g, '%2B' ) ;
					
					this.executeConvert ( el, /&/g, '%26' ) ;
					this.executeConvert ( el, /~/g, '%7E' ) ;
					
				}
				break ;
		}
	}
}

hms.util.reverseTildes = function ( form ) {
	for ( var i = 0; i < form.elements.length; i++ ) {
		var el = form.elements [ i ] ;
		switch ( el.type.toLowerCase () ) {
			case 'text' : 
			case 'hidden' :
			case 'textarea' :
				if ( ! el.value.isEmpty() ) {
					this.executeConvert ( el, /%E1/g, 'á' ) ;
					this.executeConvert ( el, /%E9/g, 'é' ) ;
					this.executeConvert ( el, /%ED/g, 'í' ) ;
					this.executeConvert ( el, /%F3/g, 'ó' ) ;
					this.executeConvert ( el, /%FA/g, 'ú' ) ;
					
					this.executeConvert ( el, /%C1/g, 'Á' ) ;
					this.executeConvert ( el, /%C9/g, 'É' ) ;
					this.executeConvert ( el, /%CD/g, 'Í' ) ;
					this.executeConvert ( el, /%D3/g, 'Ó' ) ;
					this.executeConvert ( el, /%DA/g, 'Ú' ) ;
					
					this.executeConvert ( el, /%F1/g, 'ñ' ) ;
					this.executeConvert ( el, /%D1/g, 'Ñ' ) ;

					this.executeConvert ( el, /%25/g, '%' ) ;
					this.executeConvert ( el, /%2B/g, '+' ) ;
					
					this.executeConvert ( el, /%26/g, '&' ) ;
					this.executeConvert ( el, /%7E/g, '~' ) ;
					
				}
				break ;
		}
	}
}

hms.util.executeConvert = function ( el, expReg, value ) {
	el.value = el.value.replace ( expReg, value ) ;							
}

/**
 * Captura las coordenadas de un objeto y se incluyen el ancho y alto del mismo
 * @param el, contiene el elemento del cual se desean sacar las coordenadas
 * @return c, contiene los datos del objeto, null en caso de que no se envie el objeto como parametro
 */
hms.util.getCoords = function ( el ) {
	if ( !el ) 
		return null;
	var c = { height: el.offsetHeight, width: el.offsetWidth, left: 0, top: 0, bottom: 0, right:0 } ;
	while ( el && el.tagName != 'BODY' ) {
		c.left += el.offsetLeft ;
		c.top  += el.offsetTop ;
		el 		= el.offsetParent ;
	}
	c.bottom	= c.top + c.height ;
	c.right  	= c.left + c.width ;
	return c;
} ;


/**
 * Actualiza la lista. Es usada por la clase Paginador
 * @return void
 */
hms.util.refreshList = function ( url, seccion, combo ) {
	
	if ( combo )
		url = url + '?intervalo=' + combo.value ;
	
	try {

		var o = new hms.ajax ( url, $(seccion) ) ;
		o.request () ;
		o = null ;

	} catch (e) {
		alert ( 'hmsError : \n' + e.message ) ;
	} 	

}


/**
 * Crea elementos HTML de forma dinámica
 * @param type: tipo de elemento, parent: documento en el que será creado el elemento
 * @return object: el elemento creado
 */
hms.util.createElement = function ( type, parent ) {
	var el = null;
	if ( window.self.document.createElementNS )
		el = window.self.document.createElementNS ( 'http://www.w3.org/1999/xhtml', type ) ;
	else
		el = window.self.document.createElement ( type ) ;  

	if ( typeof parent != 'undefined' && parent != null )
		parent.appendChild ( el ) ;
	return ( el ) ;   
} ;	



/**
 * Iniclializa las variables en el parent para las funcionalidades relacionadas
 * @param HMSCurFunc: case para la funcionalidad actual, HMSSessionName: Nombre del VO en sesión, 
 * @param HMSClassName: nombre de la clase del VO, HMSParametersNames: valores que deben ser recuperados
 * @return void
 */
hms.util.instanceFuncDescriptors = function ( HMSSessionName, HMSClassName, HMSParametersNames, HMSCurFuncName, HMSCurFuncURL ) {
	parent.HMSSessionName		=	HMSSessionName ;
	parent.HMSClassName			=	HMSClassName ;
	parent.HMSParametersNames	=	HMSParametersNames ;
	parent.HMSCurFuncName		=	HMSCurFuncName ;
	parent.HMSCurFuncURL		=	HMSCurFuncURL ;
} ;

/**
 * fncLoad genérica
 * @param url: página que va a ser cargada, seccion: id del div, 
 * @param frm: id del formulario en la página
 * @return void
 */
 /*
hms.util.fncLoad = function ( url, seccion, frm ) {
	
	var oForm = null ;

	if ( frm ) oForm = $ ( frm ) ;
	else oForm = $ ( 'fGeneral' ) ;

	try {
		this.convertTildes ( oForm ) ;
		var p = this.setParameters ( oForm ) ;	
		var o = new hms.ajax ( url, $( seccion ), { parameters: p } ) ;
		o.request () ;
		o = null ;
		this.reverseTildes ( oForm ) ;
	} catch ( e ) {
		alert ( 'hmsErrorUtil \n' + e.message ) ;
	} 	
} ;


/**
 * Toma un date y construye la cadena "dd-mm-yyyy"
 * @param infecha: variable de tipo date
 * @return String
 */
hms.util.stringFromDate = function ( infecha ) {
	return (
		(infecha.getDate() < 10 ? '0' : '') + infecha.getDate() + "-"
		+ (infecha.getMonth() < 9 ? '0' : '') + (infecha.getMonth() + 1) + "-"
		+ infecha.getFullYear()
	);
}	


/**
 * Toma un date y construye la cadena "24hh-mm-ss"
 * @param infecha: variable de tipo date
 * @return String
 */
hms.util.stringFromTime = function ( infecha ) {
	return (
		( infecha.getHours() < 10 ? '0' : '' ) + ( infecha.getHours() + ":" ) +
		( infecha.getMinutes() < 10 ? '0' : '' ) + ( infecha.getMinutes() + ":")  +
		( infecha.getSeconds() < 10 ? '0' : '' ) + ( infecha.getSeconds() ) 
	);
}	


/**
 * Usada por la clase Paginador: recarga la página que contiene la lista.
 * @param seccion: el div en que será cargada la lista
 *        url: la página que contiene la lista
 *        combo: el objeto combo de la paginación
 * @return void
 */
hms.util.refreshPagination = function ( url, seccion, options ) {
	if ( options.interval ) 
		url = url + '?interval=' + options.interval.value;

	if ( options.count ) 
		url = url + '?count=' + options.count.value;

	if ( options.sort ) 
		url = url + '?sort=' + options.sort + '&field=' + options.field ;

	try {
		var o = new hms.ajax ( url, $(seccion) ) ;
		o.request () ;
		o = null ;
	} catch (e) {
		alert ( 'Hms Refresh Pagination : \n' + e.message ) ;
	} 	
}

/** 
 * Adiciona un evento para un elemento
 * @param elemento, contiene el elemento al que se le asignara el evento
 * @param evname, contiene el nombre del evento que se desea instanciar
 * @param funcion, contiene la funcion que se asignara al objeto para cuando se ejecute el evento
 */
hms.util.addEvent = function ( elemento, evname, funcion ) {
	if (elemento.attachEvent) { 
		// IE
		elemento.attachEvent ( 'on' + evname, funcion ) ;
	} else if (elemento.addEventListener) { 
		// Gecko / W3C
		elemento.addEventListener ( evname, funcion, false ) ;
	} else {
		elemento [ 'on' + evname ] = funcion ;
	}
};

