/*
 * 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);
 *
 */
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);
 */
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)
 */
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;
};
function fixEvent(event) { // v2005-12-06
	// add W3C standard event methods
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
};
fixEvent.preventDefault = function() { // v2005-12-06
	this.returnValue = false;
};
fixEvent.stopPropagation = function() { // v2005-12-06
	this.cancelBubble = true;
};


/*
 * http://dean.edwards.name/IE7/caveats/
 */
function addClass(element, className) {
		if (!hasClass(element, className)) {
				if (element.className) element.className += " " + className;
				else element.className = className;
		}
};
function removeClass(element, className) {
		var regexp = new RegExp("(^|\\s)" + className + "(\\s|$)");
		element.className = element.className.replace(regexp, "$2");
};
function hasClass(element, className) {
		var regexp = new RegExp("(^|\\s)" + className + "(\\s|$)");
		return regexp.test(element.className);
};


/*
 * Precarga de imágenes
 */
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)">
 */
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 con ID dado
 * y se encarga de la precarga de imágenes
 *
 * Si la imagen tiene clase "res" se reemplaza la imagen por su versión _h y no se insertan eventos
 */
function anadir_rollovers(id){ // v2006-08-10*
	var obj, imagenes;
	
	if(document.getElementById){
		obj=document.getElementById(id);
	}
	if(obj && obj.getElementsByTagName && (imagenes=obj.getElementsByTagName('img')) ){
		for(var i=0; i<imagenes.length; i++){
			precarga(imagenes[i].src.replace(/\.(png|gif|jpg)$/, '_h.$1'));

			if(!hasClass(imagenes[i], 'res')){
				addEvent(imagenes[i], 'mouseover', function(){
					rollover(this, true);
				});
				addEvent(imagenes[i], 'mouseout', function(){
					rollover(this);
				});
			}else{
				rollover(imagenes[i], true);
			}
		}
	}
}


/*
 * Procesamos los enlaces marcados como externos (rel="external")
 *
 * etiqueta (cadena): HTML para añadir al final del enlace
 * enVentanaNueva (bool): ¿establecer target="_blank"?
 */
function enlacesExternos(etiqueta, enVentanaNueva){ // v2006-09-01
	if(!document.getElementsByTagName){
		return;
	}

	var titulo='enlace externo' + (enVentanaNueva ? ', nueva ventana' : '');
	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'){
			if(etiqueta){
				a.innerHTML+=etiqueta;
			}
			if(enVentanaNueva){
				a.target='_blank';
			}
			a.title+=(a.title!='' ? ' ' : '') + '[' + titulo + ']';
		}
	}
}


/*
 * Rotación de imágenes
 */
function rotar_imagenes(id_img, plantilla_ruta, num_imagenes, ms){
	if(!document || !document.getElementById){
		return;
	}
	for(var i=0; i<num_imagenes; i++){
		precarga(plantilla_ruta.replace(/%s/, i));
	}
	
	_rotar_imagenes(id_img, plantilla_ruta, num_imagenes, ms, 0);
}
function _rotar_imagenes(id_img, plantilla_ruta, num_imagenes, ms, actual){
	var img=document.getElementById(id_img);
	img.src=plantilla_ruta.replace(/%s/, actual);

	actual=(actual+1) % num_imagenes;
	
	setTimeout('_rotar_imagenes("' + id_img + '", "' + plantilla_ruta + '", ' + num_imagenes + ', ' + ms + ', ' + actual + ')', ms);
}




/*
 * Rellena el desplegable de tipos en función del desplegable de categorías
 */
function mostrar_tipos_por_categoria(campo_categoria, campo_tipo, tipos){
	var categoria=campo_categoria[campo_categoria.selectedIndex].value;
	
	campo_tipo.length=0;
	campo_tipo.options[0]=new Option('', '');
	
	/*
	 * Si hay una categoría marcada, mostramos los tipos correspondientes
	 */
	if(categoria!=''){
		for(var i=0; i<tipos.length; i++){
			if(tipos[i].categoria==categoria){
				campo_tipo.options[campo_tipo.options.length]=new Option(tipos[i].nombre, tipos[i].codigo);
			}
		}
	}
}
