/*
 * Gestión de eventos - http://dean.edwards.name/my/events.js
 */

/*
 * Ejemplo:
 *
 * function foo(){
 *     alert('La página ha terminado de cargar');
 * }
 * addEvent(window, 'load', foo);
 *
 */
/*public*/ function addEvent(element, type, handler) { // v2005-12-06
	// assign each event handler a unique ID
	if (!handler.$$guid) handler.$$guid = addEvent.guid++;
	// create a hash table of event types for the element
	if (!element.events) element.events = {};
	// create a hash table of event handlers for each element/event pair
	var handlers = element.events[type];
	if (!handlers) {
		handlers = element.events[type] = {};
		// store the existing event handler (if there is one)
		if (element["on" + type]) {
			handlers[0] = element["on" + type];
		}
	}
	// store the event handler in the hash table
	handlers[handler.$$guid] = handler;
	// assign a global event handler to do all the work
	element["on" + type] = handleEvent;
};
// a counter used to create unique IDs
addEvent.guid = 1;

/*
 * Ejemplo: removeEvent(window, 'load', foo);
 */
/*public*/ function removeEvent(element, type, handler) { // v2005-12-06
	// delete the event handler from the hash table
	if (element.events && element.events[type]) {
		delete element.events[type][handler.$$guid];
	}
};


/*
 * Funciones privadas (son utilizadas por las dos anteriores)
 */
/*private*/ function handleEvent(event) { // v2005-12-06
	var returnValue = true;
	// grab the event object (IE uses a global event object)
	event = event || fixEvent(window.event);
	// get a reference to the hash table of event handlers
	var handlers = this.events[event.type];
	// execute each event handler
	for (var i in handlers) {
		this.$$handleEvent = handlers[i];
		if (this.$$handleEvent(event) === false) {
			returnValue = false;
		}
	}
	return returnValue;
};
/*private*/ function fixEvent(event) { // v2005-12-06
	// add W3C standard event methods
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
};
/*private*/ fixEvent.preventDefault = function() { // v2005-12-06
	this.returnValue = false;
};
/*private*/ fixEvent.stopPropagation = function() { // v2005-12-06
	this.cancelBubble = true;
};




/*
 * Precarga de imágenes
 */
/*private*/ function precarga(){ // v2005-05-22
	var argv=precarga.arguments;
	var argc=precarga.arguments.length
	if(!document.precarga_img){
		document.precarga_img=new Array();
	}

	for(var i=0; i<argc; i++){
		var j=document.precarga_img.length;
		document.precarga_img[j]=new Image();
		document.precarga_img[j].src=argv[i];
	}
}


/*
 * <img onmouseover="rollover(this, true)" onmouseout="rollover(this)">
 */
/*private*/ function rollover(imagen, resaltar){ // v2005-03-18
	if(resaltar){
		imagen.src=imagen.src.replace(/_h\.(png|gif|jpg)$/, '.$1');
		imagen.src=imagen.src.replace(/\.(png|gif|jpg)$/, '_h.$1');
	}else{
		imagen.src=imagen.src.replace(/_h\.(png|gif|jpg)$/, '.$1');
	}
}


/*
 * Añade efectos de rollover a todas las imágenes contenidas en el objeto dado
 * Se encarga también de la precarga de imágenes
 */
/*private*/ function anadir_rollover(obj){
	var imagenes;
	
	if(obj && obj.getElementsByTagName && (imagenes=obj.getElementsByTagName('img')) ){
		for(var i=0; i<imagenes.length; i++){
			/*
			 * Precarga
			 */
			var h=imagenes[i].src.replace(/\.(png|gif|jpg)$/, '_h.$1');
			precarga(h);

			/*
			 * Rollover
			 */
			addEvent(imagenes[i], 'mouseover', function(){
				rollover(this, true);
			});
			addEvent(imagenes[i], 'mouseout', function(){
				rollover(this);
			});
		}
	}
}


/*
 * Devuelve true si ambos URLs son de la misma página, false si no
 */
/*private*/ function son_urls_analogos(uno, dos, ignorar_query, solo_directorio){ /* v2006-03-27 */
	var pre=new RegExp('^(http|https):\/\/' + document.domain.replace('\.', '\\.'));
	var post=new RegExp('\/$|index\.php$');
	
	var uno=uno.replace(pre, '');
	var uno=uno.replace(post, '');
	var dos=dos.replace(pre, '');
	var dos=dos.replace(post, '');
	
	if(ignorar_query){
		var query=new RegExp('\\?.*$');
		
		var uno=uno.replace(query, '');
		var dos=dos.replace(query, '');
	}
	
	if(solo_directorio){
		var uno=uno.split('/')[1];
		var dos=dos.split('/')[1];
	}
	
	return uno==dos;
}


/*
 * Funciones para resaltar el menú correspondiente a la página actual
 */
/*private*/ function resaltar_menu_actual(obj, ignorar_query, solo_directorio){
	var enlaces;
	if( obj && (enlaces=obj.getElementsByTagName('a')) ){
		for(var i=0; i<enlaces.length; i++){
			var pagina=document.location.href;
			var enlace=enlaces[i].href;
			
			if(son_urls_analogos(pagina, enlace, ignorar_query, solo_directorio)){
				var imagen=enlaces[i].firstChild;
				enlaces[i].onmouseout=null;
				imagen.onmouseout=null;
				try{
					imagen.src=imagen.src.replace(/_h\.(png|gif|jpg)$/, '.$1');
					imagen.src=imagen.src.replace(/\.(png|gif|jpg)$/, '_h.$1');
				}catch(e){
				}
				//addClass(enlaces[i], 'res');
			}
		}
	}
}



/****************************************************************************************/


/*
 * Procesamos enlaces externos
 */
/*public*/ function enlaces_externos(primera_ejecucion){ // v2005-03-13
	if(!document.getElementsByTagName){
		return;
	}

	var icono='';

	var enlaces=document.getElementsByTagName('a');
	for(var i=0; i<enlaces.length; i++){
		var a=enlaces[i];
		if(a.getAttribute('href') && a.getAttribute('rel')=='external'){
			a.className='external';

			if(primera_ejecucion){
				a.innerHTML+=icono;
			}

			a.target='_blank';
			if(a.title!=''){
				a.title+=' [enlace externo]';
			}else{
				a.title='[enlace externo]';
			}
		}
	}
}


/*
 * Añade efectos de rollover a todas las imágenes contenidas el objeto con ID dado
 * Se encarga también de la precarga de imágenes
 */
/*public*/ function anadir_rollover_en_id(id){
	var obj;
	if( (obj=document.getElementById(id)) ){
		anadir_rollover(obj);
	}
}


/*
 * Establece el foco en el primer elemento de formulario que haya en la página
 */
/*public*/ function foco_en_primer_campo(){ // v2006-03-28
	if(document.forms && document.forms.length>0){
		var f=document.forms[0];
		if(f.elements && f.elements.length>0){
			try{
				f.elements[0].focus();
			}catch(e){
				// IE genera una excepción, pero sólo si no la recogemos :-?
			}
		}
	}
}


/*
 * Busca enlaces en el objeto con ID dado y resalta el URL que corresponda a la página actual
 *
 * Nota: si se emplean rollovers, éstos deben definirse previamente
 */
/*public*/ function resaltar_menu_actual_en_id(id, ignorar_query, solo_directorio){
	var obj;
	if( (obj=document.getElementById(id)) ){
		resaltar_menu_actual(obj, ignorar_query, solo_directorio);
	}
}

