// ****************************************************************************
// ***** Service non accessible ***********************************************
// ****************************************************************************
// affiche une alerte JS dans la langue courante indiquant 
// que le service n'est actuellement pas accessible

  var msgnotavail = new Array();
  
// pour afficher correctement les lettres accentuees dans un message javascript
// dans une page encodee utf-8, il faut mettre le caractere en octal precede d'1 \

  msgnotavail['ENG'] = "This service is currently not available.\nPlease try again later.";
  msgnotavail['FRE'] = "Ce service n'est actuellement pas disponible.\nMerci de r\351essayer ult\351rieurement.";
  msgnotavail['SPA'] = "Este servicio no est\341 disponible actualmente.\nPor favor, int\351ntelo de nuevo m\341s tarde.";
// Este servicio no está disponible actualmente. Por favor, inténtelo de nuevo más tarde.

function DisplNotAvail(lang) {
  alert(msgnotavail[lang]);
}

// ***************************************************
// ***** Parametrage de l'autosoumission *************
// ***************************************************
// transfere des param ordonnes d'autosoumission php
// sur une insctruction javascript
// a utiliser premierement pour les listes declenchant une action
function send(f, asmfield, noasm, parmfield, valparm, envoiform, f2) {
  f.elements[asmfield].value = noasm;
  if (parmfield != "") f.elements[parmfield].value = valparm;
  if (envoiform) f.submit();
}

// ***************************************************
// ** VARIABLES GLOBALES POUR VERIF INTEGRITE SAISIE *
// ***************************************************
// expressions régulières utilisées pour vérifier contenu données saisies
// tous les signes toleres comme separateurs dans numero tel => pour filtrage
  var modNum1 = new RegExp('[\.\ \,]', 'g');
// pas de chiffres, pour tester par négation si autre chose que des chiffres
  var modNum2 = new RegExp('[^0-9]');
// seulement chiffres et lettres
  var modAlph3 = new RegExp('[^a-zA-Z0-9]');
// caractères autorisés dans adresse mail ou URL Website
  var regAlph1 = new RegExp('[^a-zA-Z0-9\._\-]');
  var regAlph1bis = new RegExp('[^a-zA-Z0-9\.\-]');
// caractéres alpha restreints pour tld dans domain name adresse mail
  var regAlph2 = new RegExp('[^a-zA-Z]');
// caract non autorisés dans adresse mail ou URL Website
  var regpb1 = '"';
  var regpb2 = "'";
  var regpb3 = ' ';
// caract non autorisés dans adresse mail
  var regpb4 = '/';


// ***************************************************
// ***** Fonction portee globale verif integrite *****
// ***************************************************
// supprime espaces devant et derriere chaine caracteres
// Thanks Martin Honnen, Vijay Solanki, http://faqts.com/
function trimString(str) {
  str = this != window? this : str;
  return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
}

// ***************************************************
// ********* VERIF INTEGRITE ADRESSE MAIL ************
// ***************************************************
// vérifie l'intégrité d'une adresse mail
function verifmel(ch) {
  if (ch.indexOf(regpb1) != -1) return false;
  if (ch.indexOf(regpb2) != -1) return false;
  if (ch.indexOf(regpb3) != -1) return false;
  if (ch.indexOf(regpb4) != -1) return false;
// recherche caract @
  var pos = ch.indexOf("@");
// si existe dans la chaine => découpage en chaine avant/apres
  if (pos > 0 && pos < ch.length) {
    var part1 = ch.substr(0, pos);
    var part2 = ch.substr(pos+1);
    if (part2.indexOf("@") != -1) return false;  // si 2° occ de @ => erreur
  } else return false;                           // si pas de caract @
  if (regAlph1.test(part1)) return false;       // si autre chose que alphanum ds part1
// recherche . dans 2° partie
  pos = part2.lastIndexOf(".");
  if (pos > 0 && pos < part2.length) {
    var part21 = part2.substr(0, pos);           // avant tld
    var part22 = part2.substr(pos+1);            // tld
  } else return false;
  if (regAlph1bis.test(part21)) return false;   // si autre chose que alphanum ds av tld
  if (part21.length < 2) return false;           // si longueur av tld < 2 caract
  if (regAlph2.test(part22)) return false;      // si autre chose que alpha dans tld
  if (part22.length < 2) return false;           // si longueur tld < 2 caract
  return true;
}

// ***************************************************
// *** VERIF INTEGRITE DONNEES ***********************
// *** donnees login *********************************
// ***************************************************
function verlogin(f) {

  f.login.value = trimString(f.login.value);
  f.passwd.value = trimString(f.passwd.value);

  if (f.login.value=="") {
    alert("Please enter your login");
    f.login.focus();
    return false;
  }
  if (f.passwd.value=="") {
    alert("Please enter your password");
    f.passwd.focus();
    return false;
  }
  return true;
}

// ***************************************************
// ********** OUVERTURE FENETRE PAR-DESSUS ***********
// ***************************************************
var fen;
fen = null;

var attr;
attr = "dependent=yes,scrollbars=yes,directories=no,menubar=no,status=no,";
attr+= "toolbar=no,hotkeys=no,location=no,titlebar=no,resizable=yes";
// attr+= "width=700,height=600,";

function pop(URL) {
  attr+= "";
  fen = window.open(URL, "wdw", attr);
  if (fen != null) fen.focus();  
}

function sizeXY(max_wdth, max_hgth, iniX, iniY) {
  var larg = (screen.availWidth < max_wdth + iniX) ? screen.availWidth - iniX : max_wdth;
  var haut = (screen.availHeight < max_hgth + iniY) ? screen.availHeight - iniY : max_hgth;
  window.moveTo(iniX, iniY);
  window.resizeTo(larg, haut-5);
}

function wdwcenter(wdth, hgth) {
  var larg = (screen.availWidth  < wdth) ? screen.availWidth  : wdth;
  var haut = (screen.availHeight < hgth) ? screen.availHeight : hgth;
  var gauc = (screen.availWidth  - wdth) / 2;
  var top  = (screen.availHeight - hgth) / 2;
  self.resizeTo(larg, haut-5);
  self.moveTo(gauc, top);
}

//////// Prototype's $ function
///////////////////////////////
function $(){
  var elements = new Array();
  for (var i = 0; i < arguments.length; i++) { 
    var element = arguments[i];
    if (typeof element == 'string')
	  element = document.getElementById(element);
    if (arguments.length == 1)	
      return element;
    elements.push(element);
  }
  return elements;
}

//////// Validation library V2
//////////////////////////////
var errored = false;            // Global for validate function
var exClassName = new Object(); // Global for Changed classnames
var styleAdded = false;         // Global for checking sytle status
function validate(elem,type,lang,option){	// Main function
	// 29-04-2009 / DB: ajouté parametre lang (langue) pour localiser les messages erreur
	// lang = 'ENG' (default), 'FRE' et 'SPA'
	var lang   = (lang)  ? lang :   "ENG";
	if (lang != 'ENG' && lang != 'FRE' && lang != 'SPA') lang = 'ENG';
	var option = (option)? option : "";
	if(!styleAdded) {			// Add style for Error warnings
	var style = document.createElement('style');
	var sprop  = '@charset "utf-8";';
	sprop += '.error{ border:1px red solid; background:#f6f6f6 }';
	sprop += '.Errortext{ color:#FF0000;font-family:"Trebuchet MS"; font-size:9pt; }';
// 	sprop += '.messageerror{ margin:0px; padding:0px; background:#f6f6f6; color:#FF0000;font-family:"Trebuchet MS"; font-size:10px; }';
	style.setAttribute("type", "text/css");
	if (style.styleSheet){   // for IE
	style.styleSheet.cssText = sprop;
	} else {
	var newStyle = document.createTextNode(sprop);
	style.appendChild(newStyle);
	}
	document.getElementsByTagName('head')[0].appendChild(style);
	styleAdded = true; //don't add again.
	}

	
	///////////
	//Checking for mail validation
	var checkmail = function(email){
		var splitted = email.match("^(.+)@(.+)$");
		if(splitted == null) return false;
		if(splitted[1] != null )   {
			var regexp_user=/^\"?[\w-_\.]*\"?$/;
			if(splitted[1].match(regexp_user) == null) return false;
		}
		if(splitted[2] != null)  {
			var regexp_domain=/^[\w-\.]*\.[A-Za-z0-9]{2,4}$/;
			if(splitted[2].match(regexp_domain) == null) {
				var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
				if(splitted[2].match(regexp_ip) == null) return false;
			}
			return true;
		}
		return false;
	}
	var warned = false;

	//////////////
	// Function to run onsubmit;
	var onSubmit = function(elem){
		errored = false;
		var form = document.forms[elem];
		var div = document.getElementsByTagName('div');
			for(var node = 0;node < form.length; node++) 
				if((""+form[node].onblur).match("validate") && form[node].parentNode.parentNode.parentNode.parentNode.parentNode.style.display != 'none'){
				form[node].onblur(); 
				}
		if(errored){
			if(!warned){
				var inputs = form.getElementsByTagName('input');
				for(var x =0; x< inputs.length; x++){
					if((inputs[x].type == 'submit') && inputs[x].value !='<< Previous'){
						var errdiv = document.createElement('div');
						errdiv.className = 'messageerror';
						if (lang == 'ENG') {
						  errdiv.innerHTML =  'Certain fields have been incorrectly completed.<br />';
						  errdiv.innerHTML += 'Please return to the field indicated.';
						}
						if (lang == 'FRE') {
						  errdiv.innerHTML =  "Certains champs n'ont pas &eacute;t&eacute; remplis correctement.<br />";
						  errdiv.innerHTML += "Merci de remplir les champs indiqu&eacute;s.";
						}
						if (lang == 'SPA') {
						  errdiv.innerHTML =  'Algunas casillas no se llenaron correctamente.<br />';
						  errdiv.innerHTML += 'Por favor vuelva a las casillas indicadas.';
						}
						inputs[x].parentNode.insertBefore(errdiv, inputs[x].nextSibling);
					}
				}
				warned = true;
			}
			return false;
		}
		else form.submit();
	}

	//////////////
	// Function to set error messages
	var getMsg = function(type,elem,lang){
	// 29-04-2009 / DB: ajouté parametre lang (langue) pour localiser les messages erreur
 		if (lang == 'ENG') switch(type){
			case "LessThan":           return "Maximum number of characters authorised: " + option['LessThan'] + " (current length: " + elem.value.length + ") <br /> Please amend to proceed."
			case "GreaterThan":        return "This field's length should be greater than (" + option['GreaterThan'] + ")"
			case "Equal":			   return "This field's length should be equal to (" + option['Equal'] + ")"
			case "MinusThan":		   return "Should not exceed "+option['MinusThan']+"."
			case "Alphabetic":         return "Cannot contain non-alphabetic characters."
			case "RequiredAlphabetic": return "This field is required and cannot contain non-alphabetic characters."
			case "Numeric":            return "Please enter numbers only."
			case "RequiredNumeric":    return "This field is required and should contain numbers only."
			case "Email":              return "Please enter a valid email address."
			case "Required":           return "This field is required."
			case "confirm":            return "Please type password"
			case "Regex":              return "This entry does not match (" + option + ")."
			default:                   return "Undefined error messagee"
		}
		if (lang == 'FRE') switch(type){
			case "LessThan":           return "Nombre maximum de  caract&egrave;res autorise&eacute;: " + option['LessThan'] + " (longueur actuelle: " + elem.value.length + ") <br /> Merci de corriger pour continuer."
			case "GreaterThan":        return "La longueur de ce champ est limit&eacute;e &agrave; (" + option['GreaterThan'] + ") caract&egrave;res."
			case "Equal":			   return "La longueur de ce champ doit &ecirc;tre &eacute;gal &agrave; (" + option['Equal'] + ") caract&egrave;res."
			case "MinusThan":		   return "Ne doit pas excéder ("+option['MinusThan'] + ") caract&egrave;res."
			case "Alphabetic":         return "Ne doit pas contenir de caract&egrave;res non alphab&eacute;tiques."
			case "RequiredAlphabetic": return "Ce champ est obligatoire et ne doit pas contenir de caract&egrave;res non-alphab&eacute;tiques."
			case "Numeric":            return "Merci de ne saisir que des chiffres."
			case "RequiredNumeric":    return "Ce chemp est obligatoire et ne doit contenir que des chiffres."
			case "Email":              return "Merci d'inscrire une adresse email valide."
			case "Required":           return "Ce champ est obligatoire."
			case "confirm":            return "Merci de saisir le mot de passe"
			case "Regex":              return "Cette valeur ne peut &ecirc;tre (" + option + ")."
			default:                   return "Message d'erreur ind&eacute;fini"
		}
 		if (lang == 'SPA') switch(type){
			case "LessThan":           return "Cantidad m&aacute;xima de car&aacute;cteres " + option['LessThan'] + " (current length: " + elem.value.length + ") <br /> Por favor cambie para continuar."
			case "GreaterThan":        return "Esta casilla debe tener m&aacute;s de (" + option['GreaterThan'] + ") car&aacute;cteres"
			case "Equal":			   return "Esta casilla debe tener (" + option['Equal'] + ") car&aacute;cteres"
			case "MinusThan":		   return "Debe tener menos de "+option['MinusThan']+" car&aacute;cteres"
			case "Alphabetic":         return "No puede contener car&aacute;cteres no alfab&eacute;ticos."
			case "RequiredAlphabetic": return "Esta casilla es obligatoria y no puede contener car&aacute;cteres no alfab&eacute;ticos."
			case "Numeric":            return "Por favor teclee s&oacute;lo n&uacute;meros."
			case "RequiredNumeric":    return "Esta casilla es obligatoria y deber&iacute;a contener s&oacute;lo n&uacute;meros."
			case "Email":              return "Por favor teclee una direcci&oacute;n de email v&aacute;lida."
			case "Required":           return "Por favor llene."
			case "confirm":            return "Por favor teclee la contrase&ntilde;a "
			case "Regex":              return "Esto no corresponde a (" + option + ")."
			default:                   return "Mensaje de error indefinido"
		}
	}

	/////////////
	// Function to check is error printed?
	var checkForErrorDiv = function(elem){
		for(var node = 0;node < elem.parentNode.childNodes.length; node++)
		if(elem.parentNode.childNodes[node].className == "Errortext")
		return true;
		return false;
	}

	/////////////
	// Function to define errors and print messages
	var error = function(elem, type, message, lang){
	// 29-04-2009 / DB: ajouté parametre lang (langue) pour transferer lang a getMSg
	// et dans chanque appel de error
		correct(elem);
		if(!checkForErrorDiv(elem)){
			//alert(elem.parentNode.parentNode.parentNode.parentNode.parentNode.id + " " +elem.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName);
			div = document.createElement("div");
			div.innerHTML = (message)? message : getMsg(type,elem,lang);
			div.className = "Errortext";
			elem.parentNode.appendChild(div);
			//elem.parentNode.insertBefore(div, elem.nextSibling);
		}
		if(elem.className != "error")
		exClassName[elem.name] = elem.className;
		if(elem.type != "checkbox" && elem.type != "radio"){
			elem.className = "error";
		}
		errored = true;
		return true;
	}

	/////////////
	// Function to revert Errored fields
	var correct = function(elem){
		var parent = elem.parentNode;
		for(x = 0; x < parent.childNodes.length; x++){
			var node = parent.childNodes[x];
			if(node){
				if(node.className == "Errortext")
				node.parentNode.removeChild(node);
				if(node.className == "error")
				node.className = exClassName[node.name];
			}
		}
	}

	///////////////
	// Check for optional validations
	if(option['Equal']){
		if(elem.value.length != option['Equal']){
			error(elem,"Equal",option['message'],lang);
			return false;
		}else
		correct(elem);
	}
	if(option['LessThan']){
		if(elem.value.length > option['LessThan']){
			error(elem,"LessThan",option['message'],lang);
			return false;
		}else
		correct(elem);
	}
	if(option['MinusThan']){
		if(parseInt(elem.value) > option['MinusThan']){
			error(elem,"MinusThan",option['message'],lang);
			return false;
		}else
		correct(elem);
	}
	if(option['GreaterThan']){
		if(elem.value.length < option['GreaterThan']){
			error(elem,"GreaterThan", option['message'],lang);
			return false;
		}else
		correct(elem);
	}
	if(option.confirm){
		if(elem.value != $(option.confirm).value){
			error(elem, "confirm", option['message'],lang);
			error($(option.confirm), "confirm", option['message'],lang);
			return false;
		}else{
			correct(elem);
			correct($(option.confirm));
		}

	}

	//////////////
	// Make all the validations
	switch(type) {
		case "Alphabetic":
		var charpos = elem.value.search(/[^a-zA-Z\s\-\_]/);
		if(charpos >= 0) error(elem,type,option['message'],lang); else correct(elem);
		break;
		case "RequiredAlphabetic":
		if(elem.value.length <= 0) error(elem,type,option['message'],lang);
		else{
			var charpos = elem.value.search(/[^a-zA-Z\s\-\_]/);
			if(charpos >= 0) error(elem,type,option['message'],lang); else correct(elem);
		}
		break;
		case "Numeric":
//		var charpos = elem.value.search(/[^0-9\.\,\s\-\_]/);
		var charpos;
		if(charpos >= 0) error(elem,type,option['message'],lang); else correct(elem);
		break;
		case "RequiredNumeric":
		if(elem.value.length <= 0) error(elem,type,option['message'],lang);
		else {
//			var charpos = elem.value.search(/[^0-9\.\,\s\-\_]/);
			var charpos;
			if(charpos >= 0) error(elem,type,option['message'],lang); else correct(elem);
		}
		break;
		case "Email":
		if(!checkmail(elem.value)) error(elem,type,option['message'],lang); else correct(elem);
		break;
		case "Required":
		if(elem.type == "checkbox" || elem.type == "radio"){
			var parent = elem.parentNode;
			var ok = false;
			for(x = 0; x < parent.childNodes.length; x++)
			if(parent.childNodes[x].checked == true)
			ok = true;
			if(ok) correct(elem,true); else error(elem,type,option['message'],lang);
		}else{
			if(elem.options)
			// Here can be edited for checking text to "Please Select one" or similar text
			// in this example it looks for blank <option> to give error (Modifié : recherche la valeur "NULL")
			if(elem.value == "NULL") error(elem,type,option['message'],lang); else correct(elem);
			else
			if(elem.value.length <= 0) error(elem,type,option['message'],lang); else correct(elem);
		}
		break;
		case "Regex":
		if(elem.value.match(option['expression'])) correct(elem);
		else error(elem,type,option['message'],lang);
		break;
		default:	// Default is for defining the form and setting onsubmit function
		var form = document.forms[elem];
		form.onsubmit = function(){ onSubmit(elem); return false; };
		break;
	}
}

