var TXT_ERRMSG_REQUIRED = "Le champ '{0}' est requis";
var TXT_ERRMSG_URL = "Le champ '{0}' doit contenir un url valide, qui commence par http:// ftp:// etc.";
var TXT_ERRMSG_NUMBER_BETWEEN = "Le champ '{0}' doit contenir un nombre compris entre {1} et {2}";
var TXT_ERRMSG_NUMBER = "Le champ '{0}' doit contenir un nombre";
var TXT_ERRMSG_PWCOPY = "Le champ '{0}' doit correspondre";
var TXT_ERRMSG_EMAIL = "Le champ '{0}' doit contenir un email valide";
var TXT_ERRMSG_DATE = "Le champ '{0}' doit contenir une date de la forme {1}";
var TXT_ERRMSG_SIZE_BETWEEN = "Le champ '{0}' doit contenir entre {1} et {2} caratères";
var TXT_ERRMSG_SIZE = "Le champ '{0}' doit contenir au maximum {1} caratère(s)";
var TXT_ERRMSG_CURRENCY = "Le champ '{0}' doit contenir un montant de la forme {1}";
//---------------------------------------------------------------------------
// Fonction javascript du Framework
//
// (c)2005 - Marc Chappuis - Ludomedia - Switzerland - scripts@ludomedia.ch
//---------------------------------------------------------------------------

var DATE_SEP = '.';
var TIME_SEP = ':';

//---------------------------------------------------------------------------
// Fonctions privées
//---------------------------------------------------------------------------

// affiche un message en substituant les parametre à un message type
function _message(message) {
	for(var i=1;i<_message.arguments.length;i++) {
		message = message.replace('{'+(i-1)+'}', _message.arguments[i]);
	}
	window.alert(message);
}

// parse une date de la forme jj?mm?aaaa hh?mm?ss
function _parseAnyDate(v) {
	v += '0000000000000000000';
	var dd = v.substring(0, 2)-0;
	var mm = v.substring(3, 5)-1;
	var yyyy = v.substring(6, 10)-0;
	var HH = v.substring(11, 13)-0;
	var MM = v.substring(14, 16)-0;
	var SS = v.substring(17, 19)-0;
	return new Date(yyyy, mm, dd, HH, MM, SS , 0);
}

// ajoute autant de 0 à gauche que nécessaire pour que le résultat aie n caractères
function _padInt(v, n) {
	var r = v + '';
	while( r.length < n ) r = '0' + r;
	return r;
}

// formate une date jj.mm.aaaa
function _formatDate(d) {
	return _padInt(d.getDate(), 2) + DATE_SEP + _padInt(d.getMonth()+1, 2) + DATE_SEP + d.getFullYear();
}

// formatte une date jj.mm.aaaa hh:mm
function _formatDateHM(d) {
	return _formatDate(d) + ' ' + _padInt(d.getHours(), 2) + TIME_SEP + _padInt(d.getMinutes(), 2);
}

// formatte une date jj.mm.aaaa hh:mm:ss
function _formatDateHMS(d) {
	return _formatDateHM(d) + TIME_SEP + _padInt(d.getSeconds(), 2);
}

// nettoye les espace avant et apres un texte
function _trimText(text) {
	var i, j, c, spaces = "\t\n\r ";
	for(i=0;i<text.length;i++) {
		c = text.charAt(i);
		if(spaces.indexOf(c)==-1) break;
	}
	for(j=text.length;j>i;j--) {
		c = text.charAt(j-1);
		if(spaces.indexOf(c)==-1) break;
	}
	return text.substring(i, j);
}

// retourn la valeur d'un champ et le trim
function _trimField(field) {
	var v = field.value;
	v = _trimText(v);
	field.value = v;
	return v;
}

//---------------------------------------------------------------------------
// Fonctions de validation
//---------------------------------------------------------------------------

// verifie si un champ contient un certain nombre de caractères
// si un seul paramettre est donné c'est la taille max
// si deux paramettre sont donnés c'est min et max
function JS_Size(formName, fieldName, caption) {
	var field = document.forms[formName].elements[fieldName];
	var v = _trimField(field);
	if(v.length==0) return false;
	var minlength = 0, maxlength = Number.MAX_VALUE;
	if(JS_Size.arguments.length>4) {
		minlength = JS_Size.arguments[3]-0;
		maxlength = JS_Size.arguments[4]-0;
	} else if(JS_Size.arguments.length>3) {
		maxlength = JS_Size.arguments[3]-0;
	}
	if(v.length>=minlength && v.length<=maxlength) return false;
	if(minlength!=0) _message(TXT_ERRMSG_SIZE_BETWEEN, caption, minlength, maxlength);
	else _message(TXT_ERRMSG_SIZE, caption, maxlength);
	field.focus();
	return true;
}

// verifie si un champ contient un date valide de la forme jj.mm.aaaa
function JS_Date(formName, fieldName, caption) {
	var field = document.forms[formName].elements[fieldName];
	var v = _trimField(field);
	if(v.length==0) return false;
	var pd = _parseAnyDate(v);
	if(v!=_formatDate(pd)) {
		_message(TXT_ERRMSG_DATE, caption, _formatDate(new Date()) );
		field.focus();
		return true;
	}
}

// verifie si un champ contient un date valide de la forme jj.mm.aaaa hh:mm
function JS_DateHM(formName, fieldName, caption) {
	var field = document.forms[formName].elements[fieldName];
	var v = _trimField(field);
	if(v.length==0) return false;
	var pd = _parseAnyDate(v);
	if(v!=_formatDateHM(pd)) {
		_message(TXT_ERRMSG_DATE, caption, _formatDateHM(new Date()) );
		field.focus();
		return true;
	}
}

// verifie si un champ contient un date valide de la forme jj.mm.aaaa hh:mm:ss
function JS_DateHMS(formName, fieldName, caption) {
	var field = document.forms[formName].elements[fieldName];
	var v = _trimField(field);
	if(v.length==0) return false;
	var pd = _parseAnyDate(v);
	if(v!=_formatDateHMS(pd)) {
		_message(TXT_ERRMSG_DATE, caption, _formatDateHMS(new Date()) );
		field.focus();
		return true;
	}
}

// vérifie si un champ contient un email valide
function JS_Email(formName, fieldName, caption)
{
	var field = document.forms[formName].elements[fieldName];
	var v = _trimField(field);
	if(v.length==0) return false;
	var fa = v.indexOf('@');
	var fb = v.indexOf('@', fa + 1);
	var fc = v.indexOf('.', fa + 2);
	if(fa<0 || fb>0 || fc<0) {
		_message(TXT_ERRMSG_EMAIL, caption);
		field.focus();
		return true;
	}
	return false;
}

// check si le champ de copie correspond au mot de passe
function JS_PasswordCopy(formName, fieldName, caption) {
	var copy = document.forms[formName].elements[fieldName];
	var field = document.forms[formName].elements[fieldName.replace('COPY_', 'FF_')];
	if(field.value!=copy.value) {
		_message(TXT_ERRMSG_PWCOPY, caption);
		copy.focus();
		return true;
	}
	return false;
}

// check si le champ contient un nombre
function JS_Number(formName, fieldName, caption) {
	var field = document.forms[formName].elements[fieldName];
	var minv = JS_Number.arguments.length>3 ? JS_Number.arguments[3]-0 : Number.MININT;
	var maxv = JS_Number.arguments.length>4 ? JS_Number.arguments[4]-0 : Number.MAXINT;
	var v = _trimField(field);
	if(v.length==0) return false;
	var v = parseInt(v);
	if(isNaN(v)) {
		_message(TXT_ERRMSG_NUMBER, caption);
		field.focus();
		return true;
	}
	if(v<minv || v>maxv) {
		_message(TXT_ERRMSG_NUMBER_BETWEEN, caption, minv, maxv);
		field.focus();
		return true;
	}
	return false;
}

function JS_Currency(formName, fieldName, caption) {
	var field = document.forms[formName].elements[fieldName];
	var v = parseFloat(_trimField(field));	
	if(isNaN(v)) {
		_message(TXT_ERRMSG_CURRENCY, caption, '13.50');
		field.focus();
		return true;
	}
	return false;
}

// check si le champ contient un url
function JS_Url(formName, fieldName, caption)
{
	var field = document.forms[formName].elements[fieldName];
	var v = _trimField(field);
	if(v.length==0) return false;
	var fa = v.indexOf('://');
	var fb = fa<0 ? -1 : v.indexOf('.', fa + 3);
	if(fa<0 || fb<0)
	{
    	_message(TXT_ERRMSG_URL, caption);
		field.focus();
		return true;
	}
	return false;
}

// check si un champ est remplis
function JS_Required(formName, fieldName, caption) {
	var field = document.forms[formName].elements[fieldName];
	var type = field.type ? field.type.toLowerCase() : (field.length ? field[0].type.toLowerCase() : '' );
	
	if(type=='select') {
		var v = field.options[field.selectedIndex].value;
		if(v.length!=0) return false;
	}
	else if(type=='radio') {
		if(field.length) {
			for(var i=0;i<field.length;i++) if(field[i].checked) return false;
			field = field[0];
		} 
		else if(field.checked) return false;
	}
	else {
		var v = field.value;
		if(v.length!=0) return false;
	}
	_message(TXT_ERRMSG_REQUIRED, caption);
	field.focus();
	return true;
}
function showImage(url, width, height)
{
	var max_width = screen.width-100;
	var max_height = screen.height-100;
	var full_view = max_width>=width && max_height>=height;
	var win_width = full_view ? width : Math.min(width, max_width);
	var win_height = full_view ? height : Math.min(height, max_height);
	var win_top = Math.floor((screen.height - win_height - 16)/2);
	var win_left = Math.floor((screen.width - win_width)/2);
	var sb = full_view ? '' : ',scrollbars=yes';
	var wnd = window.open("", "wf2image", "width=" + win_width + ",height=" + win_height + ",left=" + win_left + ",top=" + win_top + sb );
	var doc = wnd.document;
		
	doc.open();
				
	doc.write('<html><head><title></title></head>');
	if(full_view) {
		doc.write('<body style="margin: 0; background-color: #000000; background: url('+url+') no-repeat 0 0;" onBlur="self.close()">'); 
	    doc.write('&nbsp;');
		doc.write('</body></html>');
		doc.close();
		wnd.onmouseup = function(event) {
			var e = event || window.event;
			if(e.button<2) wnd.close();
		}
	}
	else {
		doc.write('<body style="margin: 0; background-color: #000000;" onBlur="self.close()">'); 
		doc.write('<img onclick="window.close();" src="' + url + '" width="' + width + '" height="' + height + '" alt="" border="0">');
		doc.write('</body></html>');
		doc.close();
	}
	wnd.focus();
}

function addEvent(obj, evType, fn) {
	if (obj.addEventListener){
    	obj.addEventListener(evType, fn, true);
		return true;
	} else if (obj.attachEvent){
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	} else {
		return false;
	}
}

Function.prototype.bind = function(object) {
	var __method = this;
	return function() {
		return __method.apply(object, arguments);
	}
}

