function trim(s) {
    return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
}

/**
* Pausa de numberMillis milisegundos.
*/
function pause(numberMillis) {
        var now = new Date();
        var exitTime = now.getTime() + numberMillis;
        while (true) {
            now = new Date();
            if (now.getTime() > exitTime)
                return;
        }
}

/**
* Completa con el carácter dado por la izquierda.
* cadena, string
* n_caracteres, int
* caracter, string
*/
function lpad(cadena, n_caracteres, caracter) {
    var s = "";
    for (var i = cadena.length + 1; i <= n_caracteres; i++)
        s = s + caracter;
    return s + cadena;
}

/**
* Completa con el carácter dado por la derecha.
* cadena, string
* n_caracteres, int
* caracter, string
*/
function rpad(cadena, n_caracteres, caracter) {
    var s = "";
    for (var i = cadena.length + 1; i <= n_caracteres; i++)
        s = s + caracter;
    return cadena + s;
}

/**
* Si no se ha cargado una imagen la substituye por otra alternativa.
* imgName, nombre imagen con extensión
* imgNameAlt, nombre imagen alternativa con extensión
*/
function errorLoadingImage(imgName, imgNameAlt) {
      eval("var " + imgName + "= new Image;");
	  if (document.images)
         document[name].src= "images/" + imgNameAlt;
}

function detectBrowser (oNav) {
	try {
		var nVer = oNav.appVersion;
		var nAgt = oNav.userAgent;
		var browserName  = oNav.appName;
		var fullVersion  = ''+parseFloat(oNav.appVersion);
		var majorVersion = parseInt(oNav.appVersion,10);
		var nameOffset,verOffset,ix;
		// In MSIE, the true version is after "MSIE" in userAgent
		if ((verOffset=nAgt.indexOf("MSIE"))!=-1) {
			browserName = "Microsoft Internet Explorer";
			fullVersion = nAgt.substring(verOffset+5);
		}
		// In Opera, the true version is after "Opera"
		else if ((verOffset=nAgt.indexOf("Opera"))!=-1) {
			browserName = "Opera";
			fullVersion = nAgt.substring(verOffset+6);
		}
		// In Chrome, the true version is after "Chrome"
		else if ((verOffset=nAgt.indexOf("Chrome"))!=-1) {
			browserName = "Chrome";
			fullVersion = nAgt.substring(verOffset+7);
		}
		// In Safari, the true version is after "Safari"
		else if ((verOffset=nAgt.indexOf("Safari"))!=-1) {
			browserName = "Safari";
			fullVersion = nAgt.substring(verOffset+7);
		}
		// In Firefox, the true version is after "Firefox"
		else if ((verOffset=nAgt.indexOf("Firefox"))!=-1) {
			browserName = "Firefox";
			fullVersion = nAgt.substring(verOffset+8);
		}
		// In most other browsers, "name/version" is at the end of userAgent
		else if ( (nameOffset=nAgt.lastIndexOf(' ')+1) < (verOffset=nAgt.lastIndexOf('/')) ) {
			browserName = nAgt.substring(nameOffset,verOffset);
			fullVersion = nAgt.substring(verOffset+1);
		 if (browserName.toLowerCase()==browserName.toUpperCase()) {
			browserName = oNav.appName;
		 }
		}
		// trim the fullVersion string at semicolon/space if present
		if ((ix=fullVersion.indexOf(";"))!=-1)
			fullVersion=fullVersion.substring(0,ix);
		if ((ix=fullVersion.indexOf(" "))!=-1)
			fullVersion=fullVersion.substring(0,ix);
		majorVersion = parseInt(''+fullVersion,10);
		if (isNaN(majorVersion)) {
			fullVersion  = ''+parseFloat(oNav.appVersion);
			majorVersion = parseInt(oNav.appVersion,10);
		}
		return browserName + " " + fullVersion;
	} catch (e) {
		return "";
	}
}

// Detecta sistema operativo.
// http://www.javascripter.net/faq/index.htm
//
function detectOS(oNav) {
    try {
        if (navigator.appVersion.indexOf("Win")!=-1) return "Windows";
        if (navigator.appVersion.indexOf("Mac")!=-1) return "MacOS";
        if (navigator.appVersion.indexOf("X11")!=-1) return "Unix";
        if (navigator.appVersion.indexOf("Linux")!=-1) return "Linux";
        return "Unknown";
    } catch (e) {
        return "";
    }
}

// rollover
function rollOver (imageName, imageFile) {
	var flip = eval ("document." + imageName);
	flip.src = imageFile;
}

/**
Hide/show a div
Credits: http://www.netlobo.com/div_hiding.html
*/
function toggleLayer( whichLayer) {
  var elem, vis;
  if( document.getElementById ) // this is the way the standards work
    elem = document.getElementById( whichLayer );
  else if( document.all ) // this is the way old msie versions work
      elem = document.all[whichLayer];
  else if( document.layers ) // this is the way nn4 works
    elem = document.layers[whichLayer];
  vis = elem.style;
  // if the style.display value is blank we try to figure it out here
  if(vis.display==''&&elem.offsetWidth!=undefined&&elem.offsetHeight!=undefined)
    vis.display = (elem.offsetWidth!=0&&elem.offsetHeight!=0)?'block':'none';
  vis.display = (vis.display==''||vis.display=='block')?'none':'block';
}

// Decodifica email
function decodeEmail(e) {
	if (e == '')
		return '';
    var array= e.split('-');
    var email= '';
    for (i=0; i<array.length; i=i+1) {
        email+= String.fromCharCode((array[i]/3)-2);
    }
    return email;
}

/**
* Añade un parámetro al action de un form teniendo en cuenta si es el primero o no.
* action
* paramName
* paramValue
* return action
*/
function addParameter (action, paramName, paramValue) {
	if (action.indexOf('?') < 0)
	   action= action + '?';
	else
	   action= action + '&';
    action= action + paramName + '=' + paramValue;
    return action;
}

/**
* Devuelve tokenizada una serie de elementos de un formulario.
* oForm como document.forms[0]
* elementType como "text" o "hidden"
* nameElement como "name_"
* separator como ";"
* tokenNull representa un valor vacío
*/
function getValuesTokenized (oForm, elementType, elementName, separator, tokenNull) {
	var allElements= oForm.elements.length;
	var dummy= '';
	var values= '';
	var element;
	for (var i=0 ; i < allElements ; i++) {
		element = oForm.elements[i];
	   	if (element.type == elementType && element.name.indexOf(elementName) == 0) {
	   		dummy= trim(element.value);
	   		if (dummy == '')
	   			dummy= tokenNull;
  			values+=  dummy + separator;
  		}
	}
	return values;
}

// El ActionForm debe tener estas propiedades:
//	private String[] selectNotAssigned;
//	private String[] selectAssigned;
//
// assign: quita un registro (su Id) de oNotAssigned y lo asigna (su Id) a oAssigned
// parámetros: document.forms[0].selectNotAssigned, document.forms[0].selectAssigned
function assign(oAssigned, oNotAssigned) {
	var sValue;
	if (oNotAssigned.selectedIndex >= 0) {
		for (i= oNotAssigned.options.length - 1; i >=0 ; i--)  {
			if (oNotAssigned.options[i].selected)  {
			  	sValue= oNotAssigned.options[oNotAssigned.selectedIndex].value;
				if (sValue != "#" && !valueInSelect(oAssigned, sValue)) {
					var option = new Option(oNotAssigned.options[oNotAssigned.selectedIndex].text, sValue);
					oAssigned.options[oAssigned.length]=option;
					oNotAssigned.options[oNotAssigned.selectedIndex] = null;
				}
			}
		}
	}
}

// deassign: desasigna un registro (su Id) de oAssigned y lo añade (su Id) a oNotAssigned
// parámetros: document.forms[0].selectNotAssigned, document.forms[0].selectAssigned
function deassign(oAssigned, oNotAssigned) {
	var sValue;
	if (oAssigned.selectedIndex >= 0) {
		for (i= oAssigned.options.length - 1; i >=0 ; i--)  {
			if (oAssigned.options[i].selected)  {
			  	sValue= oAssigned.options[oAssigned.selectedIndex].value;
				if (sValue != "#" && !valueInSelect(oNotAssigned, sValue)) {
					var option = new Option(oAssigned.options[oAssigned.selectedIndex].text, sValue);
					oNotAssigned.options[oNotAssigned.length]=option;
					oAssigned.options[oAssigned.selectedIndex] = null;
				}
			}
		}
	}
}

// getAssigned(): rellena el oAssign pasado como parámetro
//		con las opciones disponibles en el html:select informado
//		NO tiene en cuenta opciones con valor "#"
// parámetro: oAssign
// Ejemplo: getAssigned(document.forms[0].selectAssigned);
function getAssigned(oAssign) {
	for (i=0; i<oAssign.length; i++) {
		//alert(oAssign[i].value);
		if (oAssign[i].value != "#")
	  		oAssign[i].selected=true;
	}
}

// getDeAssigned(): rellena el oDeAssign pasado como parámetro
//		con las opciones disponibles en el html:select informado
//		NO tiene en cuenta opciones con valor "#"
// parámetro: oDeAssign
// Ejemplo: getDeAssigned(document.forms[0].selectDeAssigned);
function getDeAssigned(oDeAssign) {
	for (i=0; i<oDeAssign.length; i++) {
	    //alert(oDeAssign[i].value);
		if (oDeAssign[i].value != "#")
			oDeAssign[i].selected=false;
	}
}

// setAssigned(): marca los elementos del oSelect pasado como parámetro
//		con las opciones disponibles en el html:select informado
//		NO tiene en cuenta opciones con valor "#"
// parámetro: oSelect
// Ejemplo: setSelected(document.forms[0].selectAssigned1);
function setSelected(oSelect) {
	for (i=0; i<oSelect.length; i++) {
		//alert(oSelect[i].value);
		if (oSelect[i].value != "#")
	  		oSelect[i].selected=true;
	}
}

// setDeSelected(): desmarca los elementos del oSelect pasado como parámetro
//		con las opciones disponibles en el html:select informado
//		NO tiene en cuenta opciones con valor "#"
// parámetro: oSelect
// Ejemplo: setDeSelected(document.forms[0].selectDeAssigned1);
function setDeSelected(oSelect) {
	for (i=0; i<oSelect.length; i++) {
		//alert(oSelect[i].value);
		if (oSelect[i].value != "#")
	  		oSelect[i].selected=false;
	}
}

// valueInSelect (): Comprueba si el elemento esta en el html:select o no
function valueInSelect(oSelect,  vValue) {
  var i;
  var sText, sValue;
  if (oSelect.length >= 1) {
	for (i=0; i < oSelect.length; i++) {
	  if (oSelect.options[i].value == vValue)
		return true;
	}
  }
  return false;
}

// Función para retornar el mensaje de error formateado o '' si la validación tiene éxito.
function formatError (errorMsg) {
    if (errorMsg == '')
    	return '';
    else
	    return '* ' + errorMsg + '\n';
}

// Función privada para retornar el mensaje de error o '' si la validación tiene éxito.
function validationResult (isValid, errorMsg) {
    if (isValid)
    	return '';
    else
	    return formatError (errorMsg);
}

// Valida si el campo está informado o no
// Params:  field: campo a validar, ej: document.forms[0].name
//			errorMsg: String con el mensaje de error
function validateMandatory (field, errorMsg) {
	var isValid = true;
	var value = '';
	if (field.type == 'text' ||
	    field.type == 'textarea' ||
	    field.type == 'file' ||
	    field.type == 'select-one' ||
	    field.type == 'radio' ||
	    field.type == 'password') {
			// get field's value
			if (field.type == "select-one") {
				var si = field.selectedIndex;
				if (si >= 0)  {
					value = field.options[si].value;
				}
			} else {
				value = trim(field.value);
			}
		    if (value.length == 0) {
				isValid = false;
				field.focus();
		    }
		}
	return validationResult	(isValid, errorMsg);
}

/**
* Valida que el formato del mail sea correcto
* http://javascript.internet.com
*/
  function validateEmail(emailStr,errorMsg) {
  var isValid = true;
     if (emailStr.length == 0) {
         isValid = true;
     }
     var emailPat=/^(.+)@(.+)$/;
     var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
     var validChars="\[^\\s" + specialChars + "\]";
     var quotedUser="(\"[^\"]*\")";
     var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
     var atom=validChars + '+';
     var word="(" + atom + "|" + quotedUser + ")";
     var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
     var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
     var matchArray=emailStr.match(emailPat);
     if (matchArray == null) {
         isValid = false;
         return validationResult	(isValid, errorMsg);
     }
     var user=matchArray[1];
     var domain=matchArray[2];
     if (user.match(userPat) == null) {
         isValid = false;
         return validationResult	(isValid, errorMsg);
     }
     var IPArray = domain.match(ipDomainPat);
     if (IPArray != null) {
         for (var i = 1; i <= 4; i++) {
            if (IPArray[i] > 255) {
              isValid = false;
              return validationResult	(isValid, errorMsg);
            }
         }
         isValid = true;
         return validationResult	(isValid, errorMsg);
     }
     var domainArray=domain.match(domainPat);
     if (domainArray == null) {
      isValid = false;
      return validationResult	(isValid, errorMsg);
     }
     var atomPat=new RegExp(atom,"g");
     var domArr=domain.match(atomPat);
     var len=domArr.length;
     if ((domArr[domArr.length-1].length < 2) ||
         (domArr[domArr.length-1].length > 3)) {
         isValid = false;
         return validationResult	(isValid, errorMsg);
     }
     if (len < 2) {
         isValid = false;
         return validationResult	(isValid, errorMsg);
     }
    return validationResult	(isValid, errorMsg);
}

