
function preloadImages() {
   if (document.images) {
      for (var i = 0; i < preloadImages.arguments.length; i++) {
         (new Image()).src = preloadImages.arguments[i];
      }
   }
}
//onload="preloadImages('images/sample1.gif', 'images/sample2.gif');"

//Esta función bloquea los controles del formulario una vez que se pulsa el botón de enviar.
//De esta forma, se evita que se envie más de una vez (lo que es importante si lleva algún
//fichero adjunto), así como evita modificar el contenido de algun control input lo que daría
//la falsa impresión de que se envia el nuevo valor.

function block_form_for_send(f) {
	for (i=0; i<f.elements.length; i++ ) {
		if (f[i].type.toLowerCase() == "submit") {
			f[i].value = 'Enviado...'
		}
		f[i].disabled = true;

	}
	return true;
}

// Escribir un swf desde javascript (para burlar los estandares por ejemplo) --------------------------------

function write_swf(swf_file,width,heigth,bgcolor,id,style) {
  if (!id) {
    id='id';
  }
  if (!style) style="";
  document.write('<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" ');
  document.write('width="' + width +'" ');
  document.write('height="' + heigth + '" ');
  document.write('id="' + id + '" ');
  document.write('style="' + style + '" >'); 

  document.write('<param name="allowScriptAccess" value="sameDomain" />');
  document.write('<param name="movie" value="' + swf_file + '" />');
  document.write('<param name="quality" value="high" />');
  if (bgcolor=='transparet') {
    document.write('<param name="wmode" value="transparent">');
  } else {
    document.write('<param name="bgcolor" value="' + bgcolor + '" />');
  }

  document.write('<embed src="' + swf_file + '" ' );
  document.write('quality="high" ');
  if (bgcolor=='transparet') {
    document.write('wmode="transparent" ');
  } else {
  document.write('bgcolor="' + bgcolor + '" ');
  }
  document.write('width="' + width +'" '); 
  document.write('height="' + heigth + '" ');
  document.write('name="'+ id +'" ');
  document.write('align="middle" allowScriptAccess="sameDomain"');
  document.write('type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />');

  document.write('</object>');
}
// Esta funcion no lo uso ----------------------------------------------------------------------------------
function myGetElementById(id) {
	r = document.getElementById(id);
	if ( ! r ) {
		msg = 'No se econtró el elemento con id = ' + id ;
		alert(msg);
		throw(msg);
	}
}
// Funciones para lanzar excepciones -----------------------------------------------------------------------
function myThrow(exceptionMsg,errorCode) {
	if ( ! errorCode ) errorCode = 0; //No debería ser necesario, pero para consistencia de tipos
	alert(exceptionMsg);
	throw(exceptionMsg);
}
// Funciones de sonido -------------------------------------------------------------------------------------
function playSound(soundId) {
	document.all.sound.src = "click.wav";
	return;
	var sound = myGetElementById(soundId);
	try {
		sound.Stop();
		sound.Rewind();
	} catch (e) { }

	try {
		// For RealPlayer-enabled browsers.
		sound.DoPlay();
	} catch (e) {
		try {
			sound.Play();
		} catch(e) {
			
			myThrow ('El elemento con id = '+soundId+' no acepta los métodos Play() ni DoPlay() en playSound().');

		}
	}
}

function myAddEventListener(elementId,eventName,handlerFunction,doBubble) {
	element = document.getElementById(elementId);
	if ( ! element ) {
		msg = 'Elemento con id = '+elementId+' inexistente en myAddEventListener';
		alert(msg);
		throw(msg);
	}
	try {
		//Intentamos de la manera W3C
		//http://www.howtocreate.co.uk/tutorials/javascript/domevents
		if( document.implementation.hasFeature('MutationEvents','2.0') || window.MutationEvent || document.addEvelentListener ) {
  			element.addEventListener(eventName,handlerFunction,doBubble);
		} else {
			//Intentamos de la manera Microsoft Internet Explorer
			//alert(eventName+' '+handlerFunction+' '+elementId);
			element.attachEvent(eventName,handlerFunction);
			//Notese que de esta manera no puede especificarse si el evento causa Bubble
		}
	} catch(e) {
		alert('Su navegador no soporta eventos Javascript anidados.\nEstos son necesarios para el correcto funcionamiento de esta página.\nEs posible que algunos elementos no se muestren correctamente.');
	}
}

function myAddBodyOnLoadEvent(handlerFunction,doBubble) {
	try {
		//Intentamos de la manera W3C
		//http://www.howtocreate.co.uk/tutorials/javascript/domevents
		if( document.implementation.hasFeature('MutationEvents','2.0') || window.MutationEvent ) {
	  			element.addEventListener('load',handlerFunction,doBubble);
		} else if( document.addEventListener ) {
	  			document.addEventListener('load',handlerFunction,doBubble);
		} else {
			//Intentamos de la manera Microsoft Internet Explorer
			document.attachEvent(eventName,handlerFuction);
			//Notese que de esta manera no puede especificarse si el evento causa Bubble
		}
	} catch(e) {
		//document.onload=handlerFunction;
		alert('Su navegador no soporta eventos Javascript anidados.\nEstos son necesarios para el correcto funcionamiento de esta página.\nEs posible que algunos elementos no se muestren correctamente.');
	}	
}
//----------------------------------------------------------------------------------------------------------
//-- Funciones para controles de formulario
//----------------------------------------------------------------------------------------------------------

function getVirtualRows(text,width) {
  	var lines = text.split('\n');
  	//alert(lines.Length);
  //width = width - 2; //ajuste internet explprer
	var total_len = 0;
	var line_len = 0;
	var rows = 0;
	for( var i = 0 ; i < lines.length ; i++ ) {
		words = lines[i].split(' ');
		for( var j = 0 ; j < words.length ; j++ ) { //partimos en palabras
			if ( ( line_len + words[j].length + 1 ) > width ) {
				total_len += line_len + 1;
				line_len = 0;
				rows++;
			} else {
        line_len += words[j].length + 1;
      }
		}
		rows++;
	}
	//info_lines = document.getElementById('lines'); info_letters= document.getElementById('letters');
	//info_lines.value = rows; info_letters.value = line_len;
	
	return rows;
}
function adjustTextarea(ta) {
	
	var vrows = getVirtualRows(ta.value,ta.cols-1);
	//
	//if ( !document.all && !window.opera) { //mozilla
	//alert(vrows);
	if (ta.rows != vrows ) {
		ta.rows = vrows;
		ta.style.height = vrows+'em';
	}
}
function adjustTextareaEvent(e) {
	//alert('ok');
	if ( ! e ) { 
		e = documet.event;
	} 
	e.currentTarget.rows = getVirtualRows(e.currentTarget.value,e.currentTarget.cols);
}
function setTextareaAutoCols(textareaId) {
	myAddEventListener(textareaId,'onkeyup'  ,adjustTextareaEvent,true);
	myAddEventListener(textareaId,'onkeydown',adjustTextareaEvent,true);
	myAddEventListener(textareaId,'onchange' ,adjustTextareaEvent,true);
	myAddEventListener(textareaId,'onclick'  ,adjustTextareaEvent,true);
	myAddEventListener(textareaId,'onfocus'  ,adjustTextareaEvent,true);
	myAddEventListener(textareaId,'onblur'   ,adjustTextareaEvent,true);
	myAddBodyOnLoadEvent(adjustTextarea,true);
}
//----------------------------------------------------------------------------------------------------------
//-- Funciones de impresión
//----------------------------------------------------------------------------------------------------------
function printPreview() {
	// Para que funcione, tiene que utilizarse desde Internet Explorer, y sale un aviso a menos
	// que se añada el dominio local a los dominios de confianza.
	var OLECMDID = 7;
	/* OLECMDID values:
	* 6 - print
	* 7 - print preview
	* 1 - open window
	* 4 - Save As
	*/
	var PROMPT = 1; // 2 DONTPROMPTUSER 
	var WebBrowser = '<OBJECT ID="WebBrowser1" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></OBJECT>';
	//alert('aha');
	self.document.body.insertAdjacentHTML('beforeEnd', WebBrowser); 
	WebBrowser1.ExecWB(OLECMDID, PROMPT);
	WebBrowser1.outerHTML = "";
}
function printPreviewConfigAlert() {
	var msg = 'Esta característica solo funciona en Internet Explorer.\n\n';
	msg = msg + 'Debe añadir este dominio web a la zona "Intranet Local" para que el botón Vista de Impresión funcione.\n\n';
	msg = msg + 'En Herramientas, Opciones de Internet, Seguridad, Sitios de Confianza, Sitios.\n';
	msg = msg + 'Desmarque "Requerir comprobación del servidor (https)" y añada "http://'+window.location.hostname+'" a la lista.\n\n'
	msg = msg + 'No olvide al imprimir seleccionar la orientación de folio vertical si la tabla se extiende más allá del margen derecho.';
	alert(msg);
}
function printPage() {
	window.print();
}

//----------------------------------------------------------------------------------------------------------
//-- Funciones para tratamiento de cookies
//----------------------------------------------------------------------------------------------------------

// Funciones sacadas de http://www.iec.csic.es/criptonomicon/cookies/recejava.html

// Esta es la función que usa Heinle para recuperar una cookie
// name - nombre de la cookie deseada
// devuelve un string conteniendo el valor de la cookie especificada o null si la cookie no existe
function getCookie(name){
  var cname = name + "=";               
  var dc = document.cookie;             
  if (dc.length > 0) {              
    begin = dc.indexOf(cname);       
    if (begin != -1) {           
      begin += cname.length;       
      end = dc.indexOf(";", begin);
      if (end == -1) end = dc.length;
        return unescape(dc.substring(begin, end));
    } 
  }
  return null;
}

// Esta es una adaptación de la función de Dorcht para colar una cookie
// http://www.webcoder.com/scriptorium/index.html
// name - nombre de la cookie
// value - valor de la cookie
// [expires] - fecha de caducidad de la cookie (por defecto, el final de la sesión)
// [path] - camino para el cual la cookie es válida (por defecto, el camino del documento que hace la llamada)
// [domain] - dominio para el cual la cookie es válida (por defecto, el dominio del documento que hace la llamada)
// [secure] - valor booleano que indica si la trasnmisión de la cookie requiere una transmisión segura
// al especificar el valor null, el argumento tomará su valor por defecto
function setCookie(name, value, expires, path, domain, secure) {
  document.cookie = name + "=" + escape(value) + 
  ((expires == null) ? "" : "; expires=" + expires.toGMTString()) +
  ((path == null) ? "" : "; path=" + path) +
  ((domain == null) ? "" : "; domain=" + domain) +
  ((secure == null) ? "" : "; secure");
}


// Esta es una adaptación de la función de Dorcht para borrar una cookie
// http://www.hidaho.com/cookies/cookie.txt
// name - nombre de la cookie
// [path] - camino de la cookie (debe ser el mismo camino que el especificado al crear la cookie)
// [domain] - dominio de la cookie (debe ser el mismo dominio que el especificado al crear la cookie)
// se considera el camino y dominio por defecto si se especifica null o no se proporcionan argumentos
function delCookie (name,path,domain) {
  if (getCookie(name)) {
    document.cookie = name + "=" +
    ((path == null) ? "" : "; path=" + path) +
    ((domain == null) ? "" : "; domain=" + domain) +
    "; expires=Thu, 01-Jan-70 00:00:01 GMT";
  }
}
