var TXT_ERRMSG_REQUIRED = "Das Feld '{0}' muss ausgefüllt werden.";
var TXT_ERRMSG_URL = "Das Feld '{0}' muss eine gültige Internetadresse enthalten, die mit http:// ftp:// usw. beginnt.";
var TXT_ERRMSG_NUMBER_BETWEEN = "Das Feld '{0}' muss eine Zahl zwischen {1} und {2} enthalten.";
var TXT_ERRMSG_NUMBER = "Das Feld '{0}' muss eine Zahl enthalten";
var TXT_ERRMSG_PWCOPY = "Das Feld '{0}' muss entsprechen";
var TXT_ERRMSG_EMAIL = "Das Feld '{0}' muss eine gültige E-Mail enthalten.";
var TXT_ERRMSG_DATE = "Das Feld '{0}' muss ein Datum im Format {1} enthalten.";
var TXT_ERRMSG_SIZE_BETWEEN = "Das Feld '{0}' muss zwischen {1} und {2} Zeichen enthalten.";
var TXT_ERRMSG_SIZE = "Das Feld '{0}' darf maximal {1} Zeichen enthalten.";
var TXT_ERRMSG_CURRENCY = "Das Feld '{0}' muss einen Betrag im Format {1} enthalten.";
//---------------------------------------------------------------------------
// 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(element, big_url, big_width, big_height) {

	var thumb = $(element);
	var state = 'ready';
	var r1, r2, time;
	var big, img, zoom, overlay;
	var m = 10;
	var bigloaded = false;

	var getRect = function(r1, r2, ratio) {
		return {
			top: (r1.top - (r1.top - r2.top) * ratio),
			left: (r1.left - (r1.left - r2.left) * ratio),
			width: (r1.width + (r2.width - r1.width) * ratio),
			height: (r1.height + (r2.height - r1.height) * ratio)
		};
	};

	var applyRect = function(item, r, m) {
		item.css({ 
			left: Math.round(r.left - m) + 'px',
			top: Math.round(r.top - m) + 'px',
			width: Math.round(r.width + m + m) + 'px',
			height: Math.round(r.height + m + m) + 'px',
			display: 'block'
		});
	};

	var start = function() {
		r1 = thumb.offset();
		r1.left += parseInt(thumb.css('paddingLeft'));
		r1.width = thumb.width();
		r1.height = thumb.height();

		var w = $(window);
		r2 = {
			top: Math.max(m, w.scrollTop() + (w.height() - big_height) / 2),
			left: Math.max(m, w.scrollLeft() + (w.width() - big_width) / 2),
			width: big_width,
			height: big_height
		};

		overlay = $('<div></div>').css({
			position: 'fixed', background: '#000000', opacity: 0,
			left: 0, top: 0, right: 0, bottom: 0
		}).appendTo(document.body);

		zoom = $('<div></div>').css({
			position: 'absolute',
			border: '1px solid black',
			backgroundColor: '#fff',
			display: 'none'
		}).appendTo(document.body);

		img = $('<img />').attr('src', thumb.attr('src')).appendTo(zoom);

		big = new Image();
		big.src = big_url;
		big.onload = function() { bigloaded = true; }

		op = 0;
		time = new Date().getTime();
		zoomIn();
		state = 'running';
	};

	var hide = function(event) {
		event.preventDefault();
		event.stopPropagation();
		img.attr('src', thumb.attr('src'));
		time = new Date().getTime();
		zoomOut();
		return false;
	}

	var zoomOut = function() {
		var ratio = 1 - (new Date().getTime() - time) / 250;
		if(ratio<=0) ratio = 0;

		var r = getRect(r1, r2, ratio);
		applyRect(zoom, r, m);
		applyRect(img, r, 0);
		img.css('margin', m + 'px');

		if(ratio==0) {
			document.body.removeChild(zoom[0]);
			document.body.removeChild(overlay[0]);
			state = 'ready';
		}
		else {
			setTimeout(zoomOut, 25);
		}
	}

	var zoomIn = function() {
		var ratio = (new Date().getTime() - time) / 250;
		if(ratio>=1) ratio = 1;
		var r = getRect(r1, r2, ratio);
		applyRect(zoom, r, m);
		applyRect(img, r, 0);
		img.css('margin', m + 'px');

		if(ratio==1) {
			overlay.click(hide);
			zoom.click(hide);			
			img.attr('src', big.src);	
		}
		else {
			setTimeout(zoomIn, 25);
		}
	}

	if(state=='ready') start();
	return false;
}

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);
	}
}

$(function() {
	$("span.shownext").css({ display: '', cursor: 'pointer' }).click(function(event) {
		$(this).css('display', 'none').next('span').css('display', '');
	}).next('span').css('display', 'none');
	$("span.hidenext").css({ display: '', cursor: 'pointer' }).click(function(event) {
		$(this).parent().css('display', 'none');
		$(this).parent().prev('span').css('display', '');
	});

});