/*
 * 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;
};




/*
 * Añade/Quita/Busca clases CSS - http://dean.edwards.name/IE7/caveats/
 */
function addClass(element, className) { // v2004-10-24
	if (!hasClass(element, className)) {
		if (element.className) element.className += " " + className;
		else element.className = className;
	}
};
function removeClass(element, className) { // v2004-10-24
	var regexp = new RegExp("(^|\\s)" + className + "(\\s|$)");
	element.className = element.className.replace(regexp, "$2");
};
function hasClass(element, className) { // v2004-10-24
	var regexp = new RegExp("(^|\\s)" + className + "(\\s|$)");
	return regexp.test(element.className);
};



function version_ie(){ // v2005-03-14
	var re=/MSIE ([^ ;]+)/;
	return re.test(navigator.userAgent)? re.exec(navigator.userAgent)[1]: -1;
}


/*
 * 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];
	}
}



/*
 * 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 + ']';
		}
	}
}


/*
 * Establece el foco en el objeto con id "foco" o bien el primer elemento de formulario
 * de la página si aquél no existe
 */
/*public*/ function foco_en_formulario(){ // v2007-02-07
	var foco=document.getElementById('foco');
	if(foco!=null){
		foco.focus();
	}else 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 :-?
			}
		}
	}
}



function ajustes_para_css(){
	/*
	 * Efectos para los botones
	 */
	var input=document.getElementsByTagName('input');
	for(var i=0; i<input.length; i++){
		if(hasClass(input[i], 'submit') || hasClass(input[i], 'reset') || hasClass(input[i], 'button')){
			addEvent(input[i], 'mouseover', function(){
				addClass(this, 'res');
			});
			addEvent(input[i], 'mouseout', function(){
				removeClass(this, 'res');
			});
			addEvent(input[i], 'click', function(){
				removeClass(this, 'res');
				addClass(this, 'pulsado');
			});
		}
	}
}


/*
 * Rellena el desplegable de subcategorías en función de la categoría elegida
 */
function mostrar_subcategorias(categoria, desplegable, subcategorias, /*opc*/id_subcategoria_actual){
	desplegable.setAttribute('disabled', 'disabled');
	desplegable.setAttribute('readOnly', 'readonly');

	/*
	 * Primero vaciamos el desplegable
	 */
	desplegable.length=0;
	desplegable.options[0]=new Option('(Elija una sección para ver las categorías)', '');


	/*
	 * Si hay una categoría marcada, mostramos los tipos correspondientes
	 */
	if(categoria!=''){
		for(var i=0; i<subcategorias.length; i++){
			if(subcategorias[i].categoria==categoria){
				desplegable.options[0]=new Option('(Elija una categoría)', '');

				/*
				 * Hay subcategorías
				 */
				for(var j=0; j<subcategorias[i].subcategorias.length; j++){
					var pos=desplegable.options.length;
					
					desplegable.options[pos]=
						new Option(subcategorias[i].subcategorias[j].nombre, subcategorias[i].subcategorias[j].id);
						
					if(id_subcategoria_actual && id_subcategoria_actual==subcategorias[i].subcategorias[j].id){
						desplegable.selectedIndex=pos;
					}
				}
			}
		}
		
		/*
		 * Si no hay subcategorías, avisamos
		 */
		if(desplegable.length==1){
			desplegable.options[0]=new Option('(No se han definido categorías)', '');
		}else{
			desplegable.removeAttribute('disabled');
			desplegable.removeAttribute('readOnly');
		}
	}
}


/*
 * Busca los DIV con clase `clase_caja` y los convierte en enlaces
 *
 * El URL se toma del primer enlace encontrado en cada caja
 *
 * Sólo actúa dentro de bloques con clase `clase_todo`
 *
 */
function enlaces_en_caja(clase_todo, clase_caja){
	var bloques=document.getElementsByTagName("div");
	for(var i=0; i<bloques.length; i++){
		if(hasClass(bloques[i], clase_todo)){
			var cajas=bloques[i].getElementsByTagName("div");
			for(var j=0; j<cajas.length; j++){
				var enlaces=cajas[j].getElementsByTagName("a");
				if(enlaces.length>0){
					cajas[j].href=enlaces[0].href;
					addEvent(cajas[j], "click", function(){
						document.location=this.href;
					});
					addEvent(cajas[j], "mouseover", function(){
						this.style.cursor="pointer";
						window.status=this.href;
					});
					addEvent(cajas[j], "mouseout", function(){
						this.style.cursor="default";
						window.status='';
					});
				}
			}
		}
	}
}