//==============================================================================
// String functions
//==============================================================================

String.prototype.trim = function() {
    return this.replace( /^\s+|\s+$/, "" );
}; // end of 'trim()'

String.prototype.empty = function() {
    return this.trim().length == 0;
}; // end of 'trim()'

String.prototype.toUnix = function() {
    var str = this;
    str = str.replace(/\r\n/g, '\n');
    str = str.replace(/\r/g, '\n');
    return str;
}; // end of 'toUnix()'

String.prototype.stripTags = function() {
    return this.replace(/<[^>]+>\n*([^<]+)\n*<\/[^>]+>/g, '$1');
}; // end of 'stripTags()'

String.prototype.htmlspecialchars = function() {
    var str = this
        .replace(/&/g, '&amp;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;');
    return str;
}; // end of 'htmlspecialchars()'

String.prototype.htmlspecialcharsDecode = function() {
    var str = this
        .replace(/&amp;/g, '&')
        .replace(/&lt;/g, '<')
        .replace(/&gt;/g, '>');
    return str;
}; // end of 'htmlspecialcharsDecode()'

String.prototype.validate = function( type ) {

    var filters = {
        'email' : /^[a-z0-9\._%\-]+@(?:[a-z0-9\-]+\.)+[a-z]{2,4}$/i,
        'uri'   : /^(http:\/\/|https:\/\/){0,1}[A-Za-z0-9][A-Za-z0-9\-\.]*[A-Za-z0-9]\.[A-Za-z]{2,}[\43-\176]*$/i
    };
    
    return this.empty() || this.match(filters[type]);

} // end of 'validate()'


//==============================================================================
// Array functions
//==============================================================================

Array.prototype.inArray = function (value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] === value) {
			return true;
		}
	}
	return false;
};

if ( typeof Array.prototype.push != 'function' ) {
	Array.prototype.push = ArrayPush;
	function ArrayPush( value ){
		this[this.length] = value;
	}
}


/*
	forEach, version 1.0
	Copyright 2006, Dean Edwards
	License: http://www.opensource.org/licenses/mit-license.php
*/

// array-like enumeration
if (!Array.forEach) { // mozilla already supports this
	Array.forEach = function(array, block, context) {
		for (var i = 0; i < array.length; i++) {
			block.call(context, array[i], i, array);
		}
	};
}

// generic enumeration
Function.prototype.forEach = function(object, block, context) {
	for (var key in object) {
		if (typeof this.prototype[key] == "undefined") {
			block.call(context, object[key], key, object);
		}
	}
};

// character enumeration
String.forEach = function(string, block, context) {
	Array.forEach(string.split(""), function(chr, index) {
		block.call(context, chr, index, string);
	});
};

// globally resolve forEach enumeration
var forEach = function(object, block, context) {
	if (object) {
		var resolve = Object; // default
		if (object instanceof Function) {
			// functions have a "length" property
			resolve = Function;
		} else if (object.forEach instanceof Function) {
			// the object implements a custom forEach method so use that
			object.forEach(block, context);
			return;
		} else if (typeof object == "string") {
			// the object is a string
			resolve = String;
		} else if (typeof object.length == "number") {
			// the object is array-like
			resolve = Array;
		}
		resolve.forEach(object, block, context);
	}
};

/**
 * @require extends.js
 */

function addEvent( obj, type, fn ) {
	if (obj.addEventListener) {
		obj.addEventListener( type, fn, false );
		EventCache.add(obj, type, fn);
	}
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
		EventCache.add(obj, type, fn);
	}
	else {
		obj["on"+type] = obj["e"+type+fn];
	}
	return true; // add by pilgrim -- 2006-10-12
}
	
var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();

addEvent(window, 'unload', EventCache.flush);

/*
	cssQuery, version 2.0.2 (2005-08-19)
	Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)
	License: http://creativecommons.org/licenses/LGPL/2.1/
*/
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('7 x=6(){7 1D="2.0.2";7 C=/\\s*,\\s*/;7 x=6(s,A){33{7 m=[];7 u=1z.32.2c&&!A;7 b=(A)?(A.31==22)?A:[A]:[1g];7 1E=18(s).1l(C),i;9(i=0;i<1E.y;i++){s=1y(1E[i]);8(U&&s.Z(0,3).2b("")==" *#"){s=s.Z(2);A=24([],b,s[1])}1A A=b;7 j=0,t,f,a,c="";H(j<s.y){t=s[j++];f=s[j++];c+=t+f;a="";8(s[j]=="("){H(s[j++]!=")")a+=s[j];a=a.Z(0,-1);c+="("+a+")"}A=(u&&V[c])?V[c]:21(A,t,f,a);8(u)V[c]=A}m=m.30(A)}2a x.2d;5 m}2Z(e){x.2d=e;5[]}};x.1Z=6(){5"6 x() {\\n  [1D "+1D+"]\\n}"};7 V={};x.2c=L;x.2Y=6(s){8(s){s=1y(s).2b("");2a V[s]}1A V={}};7 29={};7 19=L;x.15=6(n,s){8(19)1i("s="+1U(s));29[n]=12 s()};x.2X=6(c){5 c?1i(c):o};7 D={};7 h={};7 q={P:/\\[([\\w-]+(\\|[\\w-]+)?)\\s*(\\W?=)?\\s*([^\\]]*)\\]/};7 T=[];D[" "]=6(r,f,t,n){7 e,i,j;9(i=0;i<f.y;i++){7 s=X(f[i],t,n);9(j=0;(e=s[j]);j++){8(M(e)&&14(e,n))r.z(e)}}};D["#"]=6(r,f,i){7 e,j;9(j=0;(e=f[j]);j++)8(e.B==i)r.z(e)};D["."]=6(r,f,c){c=12 1t("(^|\\\\s)"+c+"(\\\\s|$)");7 e,i;9(i=0;(e=f[i]);i++)8(c.l(e.1V))r.z(e)};D[":"]=6(r,f,p,a){7 t=h[p],e,i;8(t)9(i=0;(e=f[i]);i++)8(t(e,a))r.z(e)};h["2W"]=6(e){7 d=Q(e);8(d.1C)9(7 i=0;i<d.1C.y;i++){8(d.1C[i]==e)5 K}};h["2V"]=6(e){};7 M=6(e){5(e&&e.1c==1&&e.1f!="!")?e:23};7 16=6(e){H(e&&(e=e.2U)&&!M(e))28;5 e};7 G=6(e){H(e&&(e=e.2T)&&!M(e))28;5 e};7 1r=6(e){5 M(e.27)||G(e.27)};7 1P=6(e){5 M(e.26)||16(e.26)};7 1o=6(e){7 c=[];e=1r(e);H(e){c.z(e);e=G(e)}5 c};7 U=K;7 1h=6(e){7 d=Q(e);5(2S d.25=="2R")?/\\.1J$/i.l(d.2Q):2P(d.25=="2O 2N")};7 Q=6(e){5 e.2M||e.1g};7 X=6(e,t){5(t=="*"&&e.1B)?e.1B:e.X(t)};7 17=6(e,t,n){8(t=="*")5 M(e);8(!14(e,n))5 L;8(!1h(e))t=t.2L();5 e.1f==t};7 14=6(e,n){5!n||(n=="*")||(e.2K==n)};7 1e=6(e){5 e.1G};6 24(r,f,B){7 m,i,j;9(i=0;i<f.y;i++){8(m=f[i].1B.2J(B)){8(m.B==B)r.z(m);1A 8(m.y!=23){9(j=0;j<m.y;j++){8(m[j].B==B)r.z(m[j])}}}}5 r};8(![].z)22.2I.z=6(){9(7 i=0;i<1z.y;i++){o[o.y]=1z[i]}5 o.y};7 N=/\\|/;6 21(A,t,f,a){8(N.l(f)){f=f.1l(N);a=f[0];f=f[1]}7 r=[];8(D[t]){D[t](r,A,f,a)}5 r};7 S=/^[^\\s>+~]/;7 20=/[\\s#.:>+~()@]|[^\\s#.:>+~()@]+/g;6 1y(s){8(S.l(s))s=" "+s;5 s.P(20)||[]};7 W=/\\s*([\\s>+~(),]|^|$)\\s*/g;7 I=/([\\s>+~,]|[^(]\\+|^)([#.:@])/g;7 18=6(s){5 s.O(W,"$1").O(I,"$1*$2")};7 1u={1Z:6(){5"\'"},P:/^(\'[^\']*\')|("[^"]*")$/,l:6(s){5 o.P.l(s)},1S:6(s){5 o.l(s)?s:o+s+o},1Y:6(s){5 o.l(s)?s.Z(1,-1):s}};7 1s=6(t){5 1u.1Y(t)};7 E=/([\\/()[\\]?{}|*+-])/g;6 R(s){5 s.O(E,"\\\\$1")};x.15("1j-2H",6(){D[">"]=6(r,f,t,n){7 e,i,j;9(i=0;i<f.y;i++){7 s=1o(f[i]);9(j=0;(e=s[j]);j++)8(17(e,t,n))r.z(e)}};D["+"]=6(r,f,t,n){9(7 i=0;i<f.y;i++){7 e=G(f[i]);8(e&&17(e,t,n))r.z(e)}};D["@"]=6(r,f,a){7 t=T[a].l;7 e,i;9(i=0;(e=f[i]);i++)8(t(e))r.z(e)};h["2G-10"]=6(e){5!16(e)};h["1x"]=6(e,c){c=12 1t("^"+c,"i");H(e&&!e.13("1x"))e=e.1n;5 e&&c.l(e.13("1x"))};q.1X=/\\\\:/g;q.1w="@";q.J={};q.O=6(m,a,n,c,v){7 k=o.1w+m;8(!T[k]){a=o.1W(a,c||"",v||"");T[k]=a;T.z(a)}5 T[k].B};q.1Q=6(s){s=s.O(o.1X,"|");7 m;H(m=s.P(o.P)){7 r=o.O(m[0],m[1],m[2],m[3],m[4]);s=s.O(o.P,r)}5 s};q.1W=6(p,t,v){7 a={};a.B=o.1w+T.y;a.2F=p;t=o.J[t];t=t?t(o.13(p),1s(v)):L;a.l=12 2E("e","5 "+t);5 a};q.13=6(n){1d(n.2D()){F"B":5"e.B";F"2C":5"e.1V";F"9":5"e.2B";F"1T":8(U){5"1U((e.2A.P(/1T=\\\\1v?([^\\\\s\\\\1v]*)\\\\1v?/)||[])[1]||\'\')"}}5"e.13(\'"+n.O(N,":")+"\')"};q.J[""]=6(a){5 a};q.J["="]=6(a,v){5 a+"=="+1u.1S(v)};q.J["~="]=6(a,v){5"/(^| )"+R(v)+"( |$)/.l("+a+")"};q.J["|="]=6(a,v){5"/^"+R(v)+"(-|$)/.l("+a+")"};7 1R=18;18=6(s){5 1R(q.1Q(s))}});x.15("1j-2z",6(){D["~"]=6(r,f,t,n){7 e,i;9(i=0;(e=f[i]);i++){H(e=G(e)){8(17(e,t,n))r.z(e)}}};h["2y"]=6(e,t){t=12 1t(R(1s(t)));5 t.l(1e(e))};h["2x"]=6(e){5 e==Q(e).1H};h["2w"]=6(e){7 n,i;9(i=0;(n=e.1F[i]);i++){8(M(n)||n.1c==3)5 L}5 K};h["1N-10"]=6(e){5!G(e)};h["2v-10"]=6(e){e=e.1n;5 1r(e)==1P(e)};h["2u"]=6(e,s){7 n=x(s,Q(e));9(7 i=0;i<n.y;i++){8(n[i]==e)5 L}5 K};h["1O-10"]=6(e,a){5 1p(e,a,16)};h["1O-1N-10"]=6(e,a){5 1p(e,a,G)};h["2t"]=6(e){5 e.B==2s.2r.Z(1)};h["1M"]=6(e){5 e.1M};h["2q"]=6(e){5 e.1q===L};h["1q"]=6(e){5 e.1q};h["1L"]=6(e){5 e.1L};q.J["^="]=6(a,v){5"/^"+R(v)+"/.l("+a+")"};q.J["$="]=6(a,v){5"/"+R(v)+"$/.l("+a+")"};q.J["*="]=6(a,v){5"/"+R(v)+"/.l("+a+")"};6 1p(e,a,t){1d(a){F"n":5 K;F"2p":a="2n";1a;F"2o":a="2n+1"}7 1m=1o(e.1n);6 1k(i){7 i=(t==G)?1m.y-i:i-1;5 1m[i]==e};8(!Y(a))5 1k(a);a=a.1l("n");7 m=1K(a[0]);7 s=1K(a[1]);8((Y(m)||m==1)&&s==0)5 K;8(m==0&&!Y(s))5 1k(s);8(Y(s))s=0;7 c=1;H(e=t(e))c++;8(Y(m)||m==1)5(t==G)?(c<=s):(s>=c);5(c%m)==s}});x.15("1j-2m",6(){U=1i("L;/*@2l@8(@\\2k)U=K@2j@*/");8(!U){X=6(e,t,n){5 n?e.2i("*",t):e.X(t)};14=6(e,n){5!n||(n=="*")||(e.2h==n)};1h=1g.1I?6(e){5/1J/i.l(Q(e).1I)}:6(e){5 Q(e).1H.1f!="2g"};1e=6(e){5 e.2f||e.1G||1b(e)};6 1b(e){7 t="",n,i;9(i=0;(n=e.1F[i]);i++){1d(n.1c){F 11:F 1:t+=1b(n);1a;F 3:t+=n.2e;1a}}5 t}}});19=K;5 x}();',62,190,'|||||return|function|var|if|for||||||||pseudoClasses||||test|||this||AttributeSelector|||||||cssQuery|length|push|fr|id||selectors||case|nextElementSibling|while||tests|true|false|thisElement||replace|match|getDocument|regEscape||attributeSelectors|isMSIE|cache||getElementsByTagName|isNaN|slice|child||new|getAttribute|compareNamespace|addModule|previousElementSibling|compareTagName|parseSelector|loaded|break|_0|nodeType|switch|getTextContent|tagName|document|isXML|eval|css|_1|split|ch|parentNode|childElements|nthChild|disabled|firstElementChild|getText|RegExp|Quote|x22|PREFIX|lang|_2|arguments|else|all|links|version|se|childNodes|innerText|documentElement|contentType|xml|parseInt|indeterminate|checked|last|nth|lastElementChild|parse|_3|add|href|String|className|create|NS_IE|remove|toString|ST|select|Array|null|_4|mimeType|lastChild|firstChild|continue|modules|delete|join|caching|error|nodeValue|textContent|HTML|prefix|getElementsByTagNameNS|end|x5fwin32|cc_on|standard||odd|even|enabled|hash|location|target|not|only|empty|root|contains|level3|outerHTML|htmlFor|class|toLowerCase|Function|name|first|level2|prototype|item|scopeName|toUpperCase|ownerDocument|Document|XML|Boolean|URL|unknown|typeof|nextSibling|previousSibling|visited|link|valueOf|clearCache|catch|concat|constructor|callee|try'.split('|'),0,{}))

/*
	domEl() function - painless DOM manipulation
	written by Pawel Knapik  //  pawel.saikko.com
*/
var domEl = function(e,c,a,p,x) {
 if (!c) c='';
    if(e||c) {
        c=(typeof c=='string'||(typeof c=='object'&&!c.length))?[c]:c;
        e=(!e&&c.length==1)?document.createTextNode(c[0]):e;
        var n = (typeof e=='string') ? document.createElement(e) : !(e&&e===c[0])?e.cloneNode(false):e.cloneNode(true);
        if(typeof e=='string' || e.nodeType!=3) {
            c[0]===e?c[0]='':'';
            for(var i=0,j=c.length;i<j;i++) {
                typeof c[i]=='string'? n.appendChild(document.createTextNode(c[i])) : n.appendChild(c[i].cloneNode(true));
            }
            if(a){
                 for (i in a) i=='class'?n.className=a[i]:n.setAttribute(i,a[i]);
                }
        }
    }
    if(!p) { return n; }
    p=(typeof p=='object'&&!p.length)?[p]:p;
    for(var k=(p.length-1);k>=0;k--) {
        if(x){while(p[k].firstChild)p[k].removeChild(p[k].firstChild);
            if(!e&&!c&&p[k].parentNode)p[k].parentNode.removeChild(p[k]);}
        if(n) p[k].appendChild(n.cloneNode(true));
    }
    return true;
}

/*
	getElementsByClass - algorithm by Dustin Diaz, shortened by Pawel Knapik
*/
function getElementsByClass(s,n,t) {
	var c=[], e=(n?n:document).getElementsByTagName(t?t:'*'),r=new RegExp("(^|\\s)"+s+"(\\s|$)");
	for (var i=0,j=e.length;i<j;i++) r.test(e[i].className)?c.push(e[i]):''; return c }
	
/*
	$() based on prototype.js dollar function idea, optimized by Pawel Knapik.
*/
function $(){var r=[],a=arguments;for(var i=0,j=a.length;i<j;i++){(typeof a[i]=='string')?(r.push(document.getElementById(a[i]))):(r.push(a[i]))}
return(r.length==1)?r[0]:r}



function getAncestorByTagName( node, tag ) {

    var ancestor = node.parentNode;
    if ( ancestor == null ) return null;
    if ( ancestor.nodeName == tag.toUpperCase() ) return ancestor;
    else return getAncestorByTagName(ancestor, tag);

} // end of 'getAncestorByTagName()'

function getPreviousSiblingByTagName( node, tag ) {

    var sibling = node.previousSibling;
    if ( sibling == null ) return null;
    if ( sibling.nodeName == tag.toUpperCase() ) return sibling;
    else return getPreviousSiblingByTagName(sibling, tag);

} // end of 'getPreviousSiblingByTagName()'


function getNextSiblingByTagName( node, tag ) {

    var sibling = node.nextSibling;
    if ( sibling == null ) return null;
    if ( sibling.nodeName == tag.toUpperCase() ) return sibling;
    else return getNextSiblingByTagName(sibling, tag);

} // end of 'getNextSiblingByTagName()'


function addClass(el, name) {
	delClass(el, name);
	return el && ( el.className += ( el.className ? ' ' : '' ) + name );
}

function delClass(el, name) {
	return el && ( el.className = el.className.replace(new RegExp('^' + name + '\\b\\s*|\\s*\\b' + name + '\\b', 'g'), '') );
}

function hasClass(el, name) {
	return ( !el || !el.className ) ? false : ( new RegExp('\\b' + name + '\\b') ).test(el.className);
}

function EffectManager() {

    function construct() {

        this.setOpacity = function( el, opacity ) {

            opacity = ( opacity == 100 ) ? 99.999 : opacity;
            el.style.filter         = 'alpha(opacity:' + opacity + ')';
            el.style.KHTMLOpacity   = opacity/100;
            el.style.MozOpacity     = opacity/100;
            el.style.opacity        = opacity/100;
            el.emOpacity            = opacity;

        }; // end of 'setOpacity()'

        this.fadeIn = function( el, maxOpacity, callback ) {
        
            el.emOpacity = el.emOpacity || 0;
            el.emOpacity += 5;

            if ( el.emOpacity <= maxOpacity ) {
                Effect.setOpacity(el, el.emOpacity);
                el.emOpacity = el.emOpacity + 5;
                window.setTimeout(function() {
                    Effect.fadeIn(el, maxOpacity, callback);
                }, 10);
            }
            
            else {
                try { callback(); } catch(e) {};
            }

        }; // end of 'fadeIn()'

        this.fadeOut = function( el, minOpacity, callback ) {
        
            el.emOpacity = el.emOpacity || 100;
            el.emOpacity = el.emOpacity - 5;

            if ( el.emOpacity >= minOpacity ) {
                Effect.setOpacity(el, el.emOpacity);
                el.emOpacity -= 5;
                window.setTimeout(function() {
                    Effect.fadeOut(el, minOpacity, callback);
                }, 10);
            }
            
            else {
                try { callback(); } catch(e) {};
            }
        
        }; // end of 'fadeOut()'
        
    }

    return new construct();

};

var Effect = new EffectManager();

/**
 * messages functions
 * 
 * @require dom.js
 * @require events.js
 * @require effets.js
 */

var Message = function( node ) {

    $self = this,

    this.className = 'message',

    this.show = function( text ) {
    
        var msg = domEl('div', domEl('p', text), {'class':$self.className});

        Effect.setOpacity(msg, 0);

        node.parentNode.appendChild(msg);
        msg.style.width = node.offsetWidth + 'px';

        Effect.fadeIn(msg, 90);

        window.setTimeout(function() {
            Effect.fadeOut(msg, 0, function() { msg.parentNode.removeChild(msg); });
        }, 3000);

    };
        
    this.clear = function() {
            
        var msgs = cssQuery('div.' + $self.className, node.parentNode);
        for ( var i = 0, count = msgs.length; i < count; i++ ) {
            msgs[i].parentNode.removeChild(msgs[i]);
        }
    
    };
    
    this.count = function() {
        
        return cssQuery('div.' + $self.className, node.parentNode).length;
        
    };
    
    return this;

}; // end of 'Message()'


function messagebox( type, message, container, callback ) {

    if ( typeof container == 'undefined' || container == '' ) container = $('content').firstChild;
    
    var msgbox = domEl('div', '', {'class':'msgbox ' + type});
    var msg = msgbox.appendChild(domEl('p', '', {'class':'message'}));
    msg.innerHTML = message;
    
    var p = msgbox.appendChild(domEl('p', '', {'class':'buttons'}));
    if ( type == 'information' || type == 'warning' ) {
        var button = domEl('input', '', {'type':'button', value:'OK'});
        button.onclick = function() {
            var node = getAncestorByTagName(this, 'div');
            Effect.fadeOut(node, 100, function() { node.parentNode.removeChild(node); });
        }
        p.appendChild(button);
    }    
    else {
        var buttonYES = domEl('input', '', {'type':'button', value:'Oui'});
        buttonYES.onclick = function() {
            var node = getAncestorByTagName(this, 'div');
            Effect.fadeOut(node, 100, function() { node.parentNode.removeChild(node); });
            try { callback(); } catch(e) {};
            return true;
        }
        p.appendChild(buttonYES);
        p.appendChild(domEl('', ' '));
        var buttonNO = domEl('input', '', {'type':'button', value:'Non'});
        buttonNO.onclick = function() {
            var node = getAncestorByTagName(this, 'div');
            Effect.fadeOut(node, 100, function() { node.parentNode.removeChild(node); });
            return false;
        }
        p.appendChild(buttonNO);
    }
    
    Effect.setOpacity(msgbox, 0);
    container.parentNode.insertBefore(msgbox, container);
    Effect.fadeIn(msgbox, 0);
    
    return msgbox;

} // end of 'messagebox()'


/**
 * Validation automatique des formulaires
 *   - champs obligatoires
 *   - type de données (email, uri)
 *
 * @require events.js
 * @require styles.js
 * @require messages.js
 */

addEvent(window, 'load', function() {

var validate = function () {

    var element = arguments[0].className ? arguments[0] : this;

    // Présence de la validation pendant la saisie
    this.eventKeyup = this.eventKeyup || {};
    this.eventKeyup[element.getAttribute('id')] = this.eventKeyup[element.getAttribute('id')] || false;

    // Suppression des messages précédents
    Message(element).clear();

    // Présence du champ obligatoire
    if ( hasClass(element, 'required') && element.value.empty() ) {
        if ( !this.eventKeyup[element.getAttribute('id')] ) this.eventKeyup = addEvent(element, 'keyup', validate);
        Message(element).show(element.title);
        return false;
    } // end if
    
    // Ajout de la validation pendant la validation
    //if ( !this.eventKeyup[element.getAttribute('id')] ) this.eventKeyup = addEvent(element, 'keyup', validate);
    
    // Format de données
    if ( hasClass(element, 'type-email') && !element.value.validate('email') ) {
        Message(element).show('Votre adresse email n\'est pas valide');
        return false;
    }

    else if ( hasClass(element, 'type-uri') && !element.value.validate('uri') ) {
        Message(element).show('Votre adresse internet n\'est pas valide');
        return false;
    }

    return true;

} // end of 'validate()'

// var validateFormat = function() {
// 
//     if ( hasClass(element, 'type-email') && !element.value.validate('email') ) {
//         return 'Votre adresse email n\'est pas valide';
//     }
// 
//     else if ( hasClass(element, 'type-uri') && !element.value.validate('uri') ) {
//         return 'Votre adresse internet n\'est pas valide';
//     }
//     
//     return true;
// 
// } // end of 'validateFormat()'

// Préparation des formulaires
var forms = document.getElementsByTagName('form');
for ( var i = 0, count = forms.length; i < count; i++ ) {

    //forms[i].setAttribute('autocomplete', 'off');
    
    for ( var j = 0, count2 = forms[i].elements.length, element; j < count2; j++ ) {

        if ( !( element = forms[i].elements[j]).className ) continue;
        if ( !element.getAttribute('id') ) element.setAttribute('id', 'el:' + i + ':' + j);
        addEvent(element, 'blur', validate);

    } // end for
    
    forms[i].onsubmit = function() {

        // Préparation des éléments du formulaire
        for ( var i = 0, count = this.elements.length, element; i < count; i++ ) {
    
            if ( !( element = this.elements[i] ).className ) continue;
            validate(element);
            
        }
        
        return ( Message(this).count() == 0 );
    
    }; // end of 'submit()'

} // end for

}); // end of 'addEvent()'

var highlight = function() {

var highlight = function( $str, $language ) {

    $str += '\n';

    $str = replaceLiteralComments($str);
    $str = replaceLiteralStrings($str);
    
    $str = $str.replace(/\b(arguments|break|case|continue|default|delete|do|else|false|for|function|if|in|instanceof|new|null|return|switch|this|true|typeof|var|void|while|with)\b/ig, '<span class="keyword">$1</span>');
    
    $str = restoreLiteralStrings($str);
    $str = restoreLiteralComments($str);
    
    return $str;

}; // end of 'highlight()'

var literalComments = [];

var replaceLiteralComments = function( $str ) {

    var re = /(\/\/\s*[^\n]+\n|\/\*[^*]*\*+([^\/][^*]*\*+)*\/)/;
    literalComments = [];
    var matches, i = 0;
    while ( matches = re.exec($str) ) {
        literalComments[i] = matches[0];
        $str = $str.replace(matches[0], '__comment:' + i + '__');
        i++;
    }
    
    return $str;

}; // end of 'replaceLiteralComments()'

var restoreLiteralComments = function( $str ) {

    for ( var i = 0; i < literalComments.length; i++ ) {
        $str = $str.replace(new RegExp('__comment:' + i + '__'), '<span class="comment">' + literalComments[i] + '</span>');
    };
    
    return $str;

};  // end of 'restoreLiteralComments()'

var literalStrings = [];

var replaceLiteralStrings = function( $str, delimiters ) {
    
    if ( typeof delimiters == 'undefined' ) delimiters = '\'"';

    var c, t, j, lines, escaped, quoteChar, inQuote, literal;
    
    literalStrings = [];
    t = '';
    
    // Split script into individual lines.
    lines = $str.split('\n');

    for ( var i = 0; i < lines.length; i++ ) {

        j = 0;
        inQuote = false;
        while ( j <= lines[i].length ) {
            c = lines[i].charAt(j);
            
            // If not already in a string, look for the start of one.
            if ( !inQuote ) {
                //if ( c == '"' || c == "'" ) {
                if ( delimiters.indexOf(c) > -1 ) {
                    inQuote = true;
                    escaped = false;
                    quoteChar = c;
                    literal = c;
                }
                else t += c;
            }
            
            // Already in a string, look for end and copy characters.
            else {
                if ( c == quoteChar && !escaped ) {
                    inQuote = false;
                    literal += quoteChar;
                    t += '__string:' + literalStrings.length + '__';
                    literalStrings[literalStrings.length] = literal;
                }
                else if ( c == '\\' && !escaped ) escaped = true;
                else escaped = false;
                literal += c;
            }
            j++;
        }
        t += '\n';
    }

    return t.replace(/\n$/, '');

};  // end of '_replaceLiteralStrings()'

var restoreLiteralStrings = function( $str ) {

    for ( var i = 0; i < literalStrings.length; i++ ) {
        $str = $str.replace(new RegExp('__string:' + i + '__'), '<span class="string">' + literalStrings[i] + '</span>');
    }
    
    return $str;

};  // end of '_restoreLiteralStrings()'

return highlight;

}(); // end of 'highlight()'



if ( document.getElementById && !/MSIE/.test(navigator.userAgent) ) {
	addEvent(window, 'load', function() {
        var pre = document.getElementsByTagName('pre');
        for ( var i in pre ) {
            if ( pre[i].innerHTML ) pre[i].innerHTML = highlight(pre[i].innerHTML, pre[i].className);
        }
    });
}

addEvent(window, 'load', function() {

    var boxes = cssQuery('div.msgbox');
    forEach ( boxes, function( msgbox ) {

        Effect.setOpacity(msgbox, 100);

        if ( hasClass(msgbox, 'information') || hasClass(msgbox, 'warning') ) {

            var p = msgbox.appendChild(domEl('p', '', {'class': 'buttons'}));

            var btnOk = p.appendChild(domEl('button', 'OK', {type: 'button'}));
            addEvent(btnOk, 'click', function() {
                Effect.fadeOut(msgbox, 0, function() { msgbox.parentNode.removeChild(msgbox); });
            });
            window.setTimeout(function() {
                Effect.fadeOut(msgbox, 0, function() { msgbox.parentNode.removeChild(msgbox); });
            }, 5000);

        }

        if ( hasClass(msgbox, 'question') ) {
        
            var p = cssQuery('p.buttons', msgbox)[0];
            
            domEl('', ' ', '', p);

            var btnNo   = p.appendChild(domEl('button', 'Non', {type: 'button'}));
            addEvent(btnNo, 'click', function() { history.back(); });

        }

    });

});

addEvent(window, 'load', function() {

    var items = cssQuery('#content h2');
    for ( var i = 0, count = items.length; i < count; i++ ) {
        items[i].insertBefore(domEl('span'), items[i].firstChild);
    }

});

