var formDef = {};
var formChecker = {};
var Selections = {};

function SHA1 (msg) {
 
	function rotate_left(n,s) {
		var t4 = ( n<<s ) | (n>>>(32-s));
		return t4;
	};
 
	function lsb_hex(val) {
		var str="";
		var i;
		var vh;
		var vl;
 
		for( i=0; i<=6; i+=2 ) {
			vh = (val>>>(i*4+4))&0x0f;
			vl = (val>>>(i*4))&0x0f;
			str += vh.toString(16) + vl.toString(16);
		}
		return str;
	};
 
	function cvt_hex(val) {
		var str="";
		var i;
		var v;
 
		for( i=7; i>=0; i-- ) {
			v = (val>>>(i*4))&0x0f;
			str += v.toString(16);
		}
		return str;
	};
 
 
	function Utf8Encode(string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
 
		for (var n = 0; n < string.length; n++) {
 
			var c = string.charCodeAt(n);
 
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
 
		}
 
		return utftext;
	};
 
	var blockstart;
	var i, j;
	var W = new Array(80);
	var H0 = 0x67452301;
	var H1 = 0xEFCDAB89;
	var H2 = 0x98BADCFE;
	var H3 = 0x10325476;
	var H4 = 0xC3D2E1F0;
	var A, B, C, D, E;
	var temp;
 
	msg = Utf8Encode(msg);
 
	var msg_len = msg.length;
 
	var word_array = new Array();
	for( i=0; i<msg_len-3; i+=4 ) {
		j = msg.charCodeAt(i)<<24 | msg.charCodeAt(i+1)<<16 |
		msg.charCodeAt(i+2)<<8 | msg.charCodeAt(i+3);
		word_array.push( j );
	}
 
	switch( msg_len % 4 ) {
		case 0:
			i = 0x080000000;
		break;
		case 1:
			i = msg.charCodeAt(msg_len-1)<<24 | 0x0800000;
		break;
 
		case 2:
			i = msg.charCodeAt(msg_len-2)<<24 | msg.charCodeAt(msg_len-1)<<16 | 0x08000;
		break;
 
		case 3:
			i = msg.charCodeAt(msg_len-3)<<24 | msg.charCodeAt(msg_len-2)<<16 | msg.charCodeAt(msg_len-1)<<8	| 0x80;
		break;
	}
 
	word_array.push( i );
 
	while( (word_array.length % 16) != 14 ) word_array.push( 0 );
 
	word_array.push( msg_len>>>29 );
	word_array.push( (msg_len<<3)&0x0ffffffff );
 
 
	for ( blockstart=0; blockstart<word_array.length; blockstart+=16 ) {
 
		for( i=0; i<16; i++ ) W[i] = word_array[blockstart+i];
		for( i=16; i<=79; i++ ) W[i] = rotate_left(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1);
 
		A = H0;
		B = H1;
		C = H2;
		D = H3;
		E = H4;
 
		for( i= 0; i<=19; i++ ) {
			temp = (rotate_left(A,5) + ((B&C) | (~B&D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}
 
		for( i=20; i<=39; i++ ) {
			temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}
 
		for( i=40; i<=59; i++ ) {
			temp = (rotate_left(A,5) + ((B&C) | (B&D) | (C&D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}
 
		for( i=60; i<=79; i++ ) {
			temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}
 
		H0 = (H0 + A) & 0x0ffffffff;
		H1 = (H1 + B) & 0x0ffffffff;
		H2 = (H2 + C) & 0x0ffffffff;
		H3 = (H3 + D) & 0x0ffffffff;
		H4 = (H4 + E) & 0x0ffffffff;
 
	}
 
	var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);
 
	return temp.toLowerCase();
 
}

function isDefined(variable) { 
  try {
    return ( typeof(variable) === 'undefined' ) ? false : true;
  } catch(e) {
    return false; 
  }
}

function getChild(node,id) {
  
  if ( node.hasChildNodes() ) {
    for ( var child = node.firstChild; child != node.lastChild; child = child.nextSibling ) {
      if ( child.id == id ) {
        return child; 
      }
    }
  }
  return null;
  
}

function formDisable(formId) {
  // Désactivation des éléments du formulaire 'formId'
  if ( isDefined(window.document.forms[formId]) ) {
    DOM_form = window.document.forms[formId];
    
    for ( var node = DOM_form.firstChild; node != DOM_form.lastChild; node = node.nextSibling ) {
      if ( ( node.nodeType == 1 ) ) {
        node.disabled = true;
      }
    }
    return true;
  }
  
  return false;
}

function formEnable(formId) {
  // Aactivation des éléments du formulaire 'formId'
  if ( isDefined(window.document.forms[formId]) ) {
    DOM_form = window.document.forms[formId];
    
    for ( var node = DOM_form.firstChild; node != DOM_form.lastChild; node = node.nextSibling ) {
      if ( ( node.nodeType == 1 ) ) {
        node.disabled = false;
      }
    }
    return true;
  }
  
  return false;
}

function formSetInfo(formId,msg,doEffect,setClass) {
  
  if ( typeof(doEffect) === 'undefined' ) doEffect = false;
  if ( typeof(setClass) === 'undefined' ) setClass = false;

/*  if ( window.document.forms[formId] ) {*/
    var DOM_info = window.document.getElementById(formId+'Info');
    if ( msg == 'error' ) DOM_info.className = "ko";
    if ( DOM_info ) {
      DOM_info.innerHTML = "";
      if ( setClass != false ) DOM_info.className = setClass;
      if ( formDef[formId][msg] ) DOM_info.innerHTML = formDef[formId][msg];
      if ( doEffect ) blendOpacity(DOM_info.id,0,100,1000);
      return true; 
    }
/*  }*/
  return false;
}

function formInfoSetClass(formId,classId) {
  if ( window.document.forms[formId] ) {
    DOM_info = window.document.getElementById(formId+'Info');
    if ( DOM_info ) {
      DOM_info.className = classId;
      return true;
    }
  }
  return false;
}

function setClass(Id,classId) {
  
  var DOM_object = window.document.getElementById(Id);

  if ( DOM_object !== null ) {
    return ( DOM_object.className = classId );
  }
  return false;
}

function checkField(formId,fieldId) {
  
  var DOM_form = window.document.forms[formId];
  if ( typeof(DOM_form) !== 'undefined' ) {
    
    var DOM_field = DOM_form.elements[fieldId];
    if ( typeof(DOM_field) === 'undefined') {
      DOM_field = window.document.getElementById(fieldId);
    }
    if ( ( DOM_field !== null ) && ( typeof(DOM_field) !== 'undefined' ) ) {
      var tagName = DOM_field.tagName;
      tagName     = tagName.toLowerCase();
      if ( ! /^textarea|input$/.test(tagName) ) return true;
      // Champ mot de passe
      if ( DOM_field.id == 'sha_'+fieldId ) return checkPassword(formId,fieldId);
      
      // Champ texte normal
      if ( typeof(formChecker[formId][fieldId]) !== 'undefined' ) {
        var regExp = new RegExp(formChecker[formId][fieldId]);
        if ( regExp.test(DOM_field.value) ) {
          setClass(fieldId,'valid');
          return true; 
        }
       
        setClass(fieldId,'error');
        return false;
      }
      
    }
  }
  return true;
}

function checkPassword(formId,fieldId) {
  
  if ( window.document.forms[formId] && formChecker && formChecker[formId] ) {
    DOM_form = window.document.forms[formId];
    
/*  Formulaire avec password :
      . <input type='hidden' id='sha_`fieldId`' name=`fieldId`>   => document.forms[`fieldId`]
        <input type="password' id=`fieldId`>  => document.getElementById(`fieldId`) */
    
    DOM_hidden    = DOM_form.elements[fieldId];
    DOM_password  = window.document.getElementById(fieldId);
    if ( ( typeof(DOM_hidden) !== 'undefined' ) && ( typeof(DOM_password) !== 'undefined' ) ) {
    
      var regString = ( typeof(formChecker[formId][fieldId]) !== 'undefined' ) ? formChecker[formId][fieldId] : '^.*$';
      var regExp = new RegExp(regString);
      if ( regExp.test(DOM_password.value) ) {
        setClass(fieldId,'valid');
        var sha = SHA1(DOM_password.value);
        DOM_hidden.value = sha;
        return true; 
      }
      
      DOM_hidden.value = "";
    }
  }
  
  setClass(fieldId,'error');
  return false;
  
}

function checkForm(formId) {
  
  if (  ( typeof(formChecker) !== 'undefined' )  && ( typeof(formChecker[formId]) !== 'undefined' )  ) {
    
    for ( var field in formChecker[formId] ) {
      // Parcours de tous les champs du formulaire
      
      if ( ! checkField(formId,field) ) {
        // Mise à jour zone d'info du formulaire
        formSetInfo(formId,'error',true,'error');
        return false;
      }
      
    }
    
    formSetInfo(formId,'info');
    // Le formulaire a passé la validation avec succès, sortie
    return true;
  }
  
  // Un des éléments nécessaire à la validation (formulaire, ou formats) n'a pas été trouvé, Sortie
  return false;
  
}

function HTTPRequest() {
  var req = null;
  try {
    req = new XMLHttpRequest();
  } catch (trymicrosoft) {
    try {
      req = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (othermicrosoft) {
      try {
        req = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (failed) {
        req = null;
      }
    }
  }

  return req;
}

function checkEquals(formId,currentId,targetId) {
  var DOM_current = window.document.getElementById(currentId);
  var DOM_target  = window.document.getElementById(targetId);
  
  if ( ( typeof(DOM_current) !== 'undefined' ) && ( typeof(DOM_target) !== 'undefined' ) ) {
    if ( DOM_current.value == DOM_target.value ) {
      setClass(currentId,'valid');
      return true; 
    }
    setClass(currentId,'error');
    return false;
  }
  return false;
}

function clearForm(formId) {
  var DOM_form = window.document.getElementById(formId);
  if ( DOM_form && ( DOM_form.tagName === 'form') ) {
    DOM_form.reset();
  }
}

function submitForm(url,formId,skipCheck) {
  var doSubmit = ( typeof(skipCheck) === 'undefined' ) ? checkForm(formId) : true;
  if ( doSubmit ) {
    window.document.forms[formId].setAttribute('action',url);
    window.document.forms[formId].setAttribute('method','post');
    window.document.forms[formId].submit();
    return true;
  } 
  return false;
}

function submitPassword(url,formId) {
  
  if ( checkForm(formId) ) {
    if ( checkEquals(formId,'confirm','password') ) {
      window.document.forms[formId].setAttribute('action',url);
      window.document.forms[formId].setAttribute('method','post');
      DOM_password = window.document.forms[formId].elements['password'];
      DOM_password.value = SHA1(DOM_password.value);
      window.document.forms[formId].submit();
      return true;
    } else {
      formSetInfo(formId,'mismatch');
    }
  }
  return false;

}

var POSTX = {};

function doGetResponse() {
  
  for ( var reqId in AJAX ) {
    var doClean = false;
    if ( AJAX[reqId].readyState === 4 ) {
      if ( AJAX[reqId].status === 200 ) {
        var XML = AJAX[reqId].responseXML;
        if ( ( XML === null ) || ( typeof(XML) === 'undefined' ) ) { delete(AJAX[reqId]); return false;	}

        // Récupération status
	var Xstatus = ( XML.getElementsByTagName('status').length > 0 ) ? XML.getElementsByTagName('status').item(0).firstChild.nodeValue : '500';
	if ( Xstatus !== '200' ) { 

	 // Affichage message d'erreur
	 var RESP_notif = ( XML.getElementsByTagName('response').length > 0 ) ? XML.getElementsByTagName('response').item(0).firstChild.nodeValue : null;
	 if ( RESP_notif !== null ) {
           DOM_notif = window.document.getElementById('notification');
           if ( DOM_notif === null ) DOM_notif = window.document.getElementById(reqId+'Info');
           if ( DOM_notif !== null ) {
             DOM_notif.setAttribute('class','failed');
  	     DOM_notif.innerHTML = RESP_notif;
	     setOpacity('notification',100);
	     setTimeout("blendOpacity('notification',100,0,500)",1500);
           }
	 } else {
           // Mise à jour zone de notification
           var resp = XML.getElementsByTagName('msg');
           var msg  = ( resp.length > 0 ) ? resp.item(0).firstChild.nodeValue : null;
           if ( msg !== null ) formDef[reqId]["ERRORBUF"] = msg;

            switch(Xstatus) {
              case '403' :
                // Forbidden
                formSetInfo(reqId, ( msg === null ) ? "authError" : "ERRORBUF" ,true,"failed");
                setClass('captcha','error');
                blendOpacity('result',0,100,1000);
                flagTreated = true;
                break;

              case '400' :
                // Bad request
                formSetInfo(reqId, ( msg === null ) ? "badRequestError" : "ERRORBUF" ,true,"failed");
                blendOpacity('result',0,100,1000);
                flagTreated = true;
                break;

              case '500' :
                // Internal server error
                formSetInfo(reqId, ( msg === null ) ? "serverError" : "ERRORBUF" ,true,"failed");
                blendOpacity('result',0,100,1000);
                flagTreated = true;
                break;
            }

	 }
	 delete(AJAX[reqId]); return false; 
	
	}
        
        // Traitement message
        var respMsg = XML.getElementsByTagName('msg');
        var msgKey  = ( respMsg.length > 0 ) ? respMsg.item(0).firstChild.nodeValue : null;

        if ( msgKey && typeof(formDef[reqId][msgKey]) !== 'undefined' ) {
          formSetInfo(reqId, msgKey,true,"success");
        }
	
	// Traitement redirection
	var redirect = ( XML.getElementsByTagName('redirect').length > 0 ) ? XML.getElementsByTagName('redirect').item(0) : null;
	if ( redirect !== null ) {
          var URL = redirect.firstChild.nodeValue;
	  delete(AJAX[reqId]);

	  var delay = redirect.getAttribute('delay');
          var URL = redirect.firstChild.nodeValue;
          delete(AJAX[reqId]);

          if ( typeof(delay) === 'undefined' ) {
            window.document.location = URL;
          } else {
            setTimeout("window.document.location = '"+URL+"'",delay);
          }

	}

	// Traitement Réponse
        var response = ( XML.getElementsByTagName('response').length > 0 ) ? XML.getElementsByTagName('response').item(0) : null;
        if ( ( response === null ) || ( ! response.hasChildNodes() ) ) { 
	  delete(AJAX[reqId]);
	  return false;
	}
             
        var DOM_node     = response.firstChild;
        var flagContinue = ( ( DOM_node === null ) || ( typeof(DOM_node) === 'undefined' ) ) ? false : true;
        var total        = 0;
	
        while (flagContinue) {
          var tagName = DOM_node.tagName;
          if ( tagName !== null ) {
            var DOM_target = window.document.getElementById(tagName);
            if ( DOM_target !== null ) {
	      if ( ( tagName === 'article' ) && ( typeof(slides) !== 'undefined' ) ) { // Nettoyage des timers de diaporama
                for ( var containerId in slides ) {
                  if ( slides[containerId]['timer'] ) {
                    clearTimeout(slides[containerId]['timer']);
                    delete(slides[containerId]); 
                  }
                }
                slides = {};
  	      }
	      
              setOpacity(tagName,0);
              DOM_target.innerHTML = "";
              copyXML(DOM_target,DOM_node);
              setTimeout("blendOpacity('"+tagName+"',0,100,1000)", 250 * total);
              total++;
            }             
          }
          if ( DOM_node === response.lastChild ) flagContinue = false;
          if ( flagContinue && ( DOM_node.nextSibling === null ) ) flagContinue = false;
          if ( flagContinue ) DOM_node = DOM_node.nextSibling;
        }
        delete(AJAX[reqId]);
        return true;
      }
    }
  }
  return false;
}

function doGetConfirm(serviceId,actionId,args,message) {
  
  var result = confirm(message);
  if ( result === true ) {
    doGet(serviceId,actionId,args);
  }

}

function doGet(serviceId,actionId,args) {
    var URL = "saintax.php?"+serviceId+":"+actionId;
    if ( typeof(args) !== 'undefined' ) URL = URL + '=' + args;

    var respTarget = window.document.getElementById(serviceId+'Info');
    var tagId = ( typeof(respTarget) === 'undefined') ? SHA1(URL) : serviceId;

    if ( typeof(AJAX[tagId]) === 'undefined' ) AJAX[tagId] = HTTPRequest();

    AJAX[tagId].onreadystatechange = doGetResponse;
    AJAX[tagId].open('GET',URL,true);
    AJAX[tagId].send(null); 

}

function doUploadResponse(formId,iframeId) {

//  var DOM_iframe   = window.document.getElementById(iframeId);

  var DOM_iframe   = top.frames[iframeId];
  var DOC_response = ( DOM_iframe.document.XMLDocument ) ? DOM_iframe.document.XMLDocument : DOM_iframe.document;

  if ( ! DOC_response ) { return false; }
  // Réponse au format XML_RPC

  var status  = DOC_response.getElementsByTagName('status')[0].firstChild.nodeValue;

  tmpResult = DOC_response.getElementsByTagName('msg');
  var message = ( tmpResult.length > 0 ) ? tmpResult.item(0).firstChild.nodeValue : null;

  tmpResult = DOC_response.getElementsByTagName('redirect');
  var redirect = ( tmpResult.length > 0 ) ? tmpResult.item(0) : null;

  tmpResult = DOC_response.getElementsByTagName('response');
  var response = ( tmpResult.length > 0 ) ? tmpResult.item(0) : null;

  var info = null;
  if ( response && response.hasChildNodes() ) {
    var DOM_child = response.firstChild;
    if ( DOM_child && ( ( DOM_child.nodeType === 3 ) || ( DOM_child.nodeType ===4 )  ) ) info = DOM_child.nodeValue;
  }
  var DOM_wait = window.document.getElementById('replacement_'+formId);

  // Affichage message si nécessaire
  if ( ! formDef[formId] ) formDef[formId] = {};
  if ( info ) formDef[formId]['BUFFER'] = info;
  if ( ! message && info ) message = 'BUFFER';

  // Traitement Réponse
  var DOM_wait     = window.document.getElementById('replacement_'+formId);
  var removeWait   = true;

  if ( ( status == '200' ) && DOM_wait && message ) { 
    DOM_wait.innerHTML = formDef[formId][message];
    DOM_wait.className = 'success';
    removeWait = false;
  }

  if ( removeWait ) {
    DOM_wait.parentNode.removeChild(DOM_wait);
    if ( message ) formSetInfo(formId,message,false,'failed');
    blendOpacity(formId,0,100,1000);
  }

  // Traitement redirection
  if ( redirect ) {
    var url   = redirect.firstChild.nodeValue;
    var delay = redirect.getAttribute('delay');
    if ( delay || message ) {
      setTimeout("window.document.location = '" + url + "'", ( delay ? delay : 1000 ) );
    } else {
      window.document.location = url;
    }
  }

  // Suppression iframe
  if ( DOM_iframe && DOM_iframe.parentNode ) {
    DOM_container = DOM_iframe.parentNode;
    if ( DOM_container.parentNode ) DOM_container.parentNode.removeChild(DOM_container);
  }
  return true;

}

function doUpload(formId,serviceId,actionId,args) {

  var DOM_form = ( window.document.forms[formId] ) ? window.document.forms[formId] : null;
  if ( DOM_form === null) return false;

  setOpacity(formId,0);
  if ( ! formDef[formId] ) formDef[formId] = {};
  if ( ! formDef[formId]['waitMsg'] ) formDef[formId]['waitMsg'] = "Uploading, please wait...";

  var DOM_div = window.document.createElement('div');
  DOM_div.setAttribute('class','info');
  DOM_div.setAttribute('id','replacement_'+formId);
  DOM_div.innerHTML = formDef[formId]['waitMsg'];
  DOM_form.parentNode.insertBefore(DOM_div,DOM_form);


  var id     = 'up' + Math.floor(Math.random() * 99999);

  var DOM_divframe = window.document.createElement('div');
//  DOM_divframe.innerHTML = '<iframe style=\'display:none\' src=\'about:blank\' id=\''+id+'\' name=\''+id+'\' onload="doUploadResponse(\''+formId+'\',\''+id+'\');" />';
  DOM_divframe.innerHTML = '<iframe style=\'width:0px;height:0px;margin:0px;padding:0px;border:none\' src=\'about:blank\' id=\''+id+'\' name=\''+id+'\' onload="doUploadResponse(\''+formId+'\',\''+id+'\');" />';

/*
  var DOM_iframe = window.document.createElement('iframe');
  DOM_iframe.setAttribute('style','display:none');
  DOM_iframe.setAttribute('src','about:blank');
  DOM_iframe.setAttribute('id',id);
  DOM_iframe.setAttribute('name','id');
  DOM_iframe.setAttribute('onload','doUploadResponse(\''+formId+'\',\''+id+'\')');
  DOM_divframe.appendChild(DOM_iframe);
*/  
  window.document.body.appendChild(DOM_divframe);

  var URL = "saintax.php?"+serviceId+":"+actionId;
  if ( args ) URL = URL + '=' + args;
  
  DOM_form.setAttribute('enctype','multipart/form-data');
  DOM_form.setAttribute('method','post');
  DOM_form.setAttribute('action',URL);
  DOM_form.setAttribute('target',id);
  DOM_form.submit();

  return true;
}


function setFormFieldValue(formId,fieldName,newValue) {
  var DOM_form = ( window.document.forms[formId] ) ? window.document.forms[formId] : null;
  if ( DOM_form === null ) return false;

  var DOM_field  = ( DOM_form.elements[fieldName] ) ? DOM_form.elements[fieldName] : null;
  if ( DOM_field === null ) return false;
  
  return ( DOM_field.value = newValue );
}
function doSubmit(formId) {
  var DOM_form = ( window.document.forms[formId] ) ? window.document.forms[formId] : null;
  if ( DOM_form !== null ) DOM_form.submit();
}

function doPost(formId,serviceId,actionId,args) {

    var DOM_form = ( window.document.forms[formId] ) ? window.document.forms[formId] : null;
    if ( DOM_form === null) return false;

    if ( ( typeof(formChecker) === 'undefined' ) || ( typeof(formChecker[formId]) === 'undefined' ) ) return false;

    var URL = "saintax.php?"+serviceId+":"+actionId;
    if ( typeof(args) !== 'undefined' ) URL = URL + '=' + args;

//    var tagId     = SHA1(URL);
    var tagId = formId;
    var POST_DATA = "";

    // Validation champs et construction POST
    var addSeparator = false;
    
    for ( var field in formChecker[formId] ) {
      var DOM_field = ( DOM_form.elements[field] ) ? DOM_form.elements[field] : window.document.getElementById(field);
      if ( ( DOM_field === null ) || ( typeof(DOM_field) === 'undefined' ) ) return false;

      if ( DOM_field.nodeType !== 1 ) {
        for (var j = 0; j < DOM_field.length; j++) {
          if ( DOM_field[j].checked === true ) DOM_field = DOM_field[j];
        }
      }

      if ( formChecker[formId][field] === 'checkbox' ) {
        if ( DOM_field.checked === true ) {
           if ( addSeparator ) POST_DATA += '&';
           POST_DATA += field + '=' + escape(encodeURI(DOM_field.value));
           //POST_DATA += field + '=' + DOM_field.value;
           addSeparator = true;
	}
      } else {
        var regExp = new RegExp(formChecker[formId][field]);
        var result = regExp.test(DOM_field.value);
        if ( regExp.test(DOM_field.value) ) {
          if ( addSeparator ) POST_DATA += '&'; 

	  // Traitement spécial des champs password si un 'challenge' est activé
	  var value = DOM_field.value;
	  if ( ( DOM_field.type === 'password' ) && ( challenge !== null ) ) {
            value = SHA1(challenge+SHA1(DOM_field.value)); 
	  }

	  POST_DATA += field + '=' + escape(encodeURI(value));
	  //POST_DATA += field + '=' + DOM_field.value;
	  addSeparator = true;
        } else {
 
          DOM_field.setAttribute('class','error');
          DOM_error = window.document.getElementById('notification');
	  if ( DOM_error === null ) {
            DOM_error = window.document.getElementById(formId+'Info');
	  }
	  if ( DOM_error !== null ) {
            DOM_error.innerHTML = 'Champs invalide';
	    DOM_error.setAttribute('class','failed');
	    setTimeout("blendOpacity('notification',100,0,1000)",1500);
            setOpacity('notification',100);
	  }
	  return false;

	}
      }
      
    }

    if ( typeof(AJAX[tagId]) === 'undefined' ) AJAX[tagId] = HTTPRequest();

    if ( formDef && formDef[formId] && formDef[formId]['waitMsg'] ) {
      formSetInfo(formId,'waitMsg',true,'info');
    }

    AJAX[tagId].onreadystatechange = doGetResponse;
    AJAX[tagId].open('POST',URL,true);
    AJAX[tagId].setRequestHeader("Content-type","application/x-www-form-urlencoded");
    AJAX[tagId].send(POST_DATA);
    return true;

}


function submitFormWithChallenge(formId,method) {
 
    var DOM_form = window.document.forms[formId];
    if ( typeof(DOM_form) === 'undefined' ) return false; // BAD_ARG

    var URL  = "saintax.php?"+formId+":"+method;
    var POST = "";

    // Erreur Interne
    if (  ( typeof(formChecker) === 'undefined' )  && ( typeof(formChecker[formId]) === 'undefined' )  ) return false;

    // Validation champ et construction POST
    var addSeparator = false;
    for ( var field in formChecker[formId] ) {
      if ( addSeparator ) POST += "&";

      var DOM_field = ( ( window.document.forms[formId] ) && ( window.document.forms[formId].elements[field] ) ) ? window.document.forms[formId].elements[field] : window.document.getElementById(field);
      if ( DOM_field === null ) return false; // erreur interne
      if ( DOM_field.nodeType !== 1 ) {
        for (var j = 0; j < DOM_field.length; j++) {
          if ( DOM_field[j].checked === true ) DOM_field = DOM_field[j];
	}
      }
      var fieldValue = DOM_field.value;
      var msg        = 'msgError';
      var isValid    = false;

      if ( typeof(formChecker[formId][field]) !== 'undefined' ) {
        if ( formChecker[formId][field] === 'checkbox' ) {
          isValid = true;
	} else {
          var regExp = new RegExp(formChecker[formId][field]);
          if ( regExp.test(fieldValue) ) {
            isValid = true;
          } else {
            msg = ( /^[^\s]+$/.test(fieldValue) ) ? 'msgInvalid' : 'msgMandatory';         
          }
	}
      }

      if ( isValid === true ) {
        setClass(field,'valid');
      } else {
        setClass(field,'error');
        // Mise à jour zone d'info du formulaire
	setOpacity(formId+'Info',0);
        formSetInfo(formId,msg,true,'failed');
        if ( DOM_field.focus ) {
          DOM_field.focus();
	}
        return false;
      }

      // Construction POST
      // Traitement
      if ( /^radio|checkbox$/.test(DOM_field.getAttribute('type')) ) {
        // Traitement spécial des champs 'input' de type 'radio' ou 'checkbox'
        addSeparator = ( DOM_field.checked === true ) ? true : false;
      } else {
        addSeparator = ( /^\s*$/.test(fieldValue) ) ? false: true; 
      }
      if ( addSeparator ) POST += field + "=" + fieldValue;
    }

    if ( typeof(POSTX[formId]) === 'undefined' ) POSTX[formId] = HTTPRequest();

    setOpacity('result',0);
    formSetInfo(formId,"waitMsg",true);

    POSTX[formId].onreadystatechange = function() {
      
      for ( var formId in POSTX ) {
        var X = POSTX[formId];
	var XML = null;
        if ( X.readyState == 4 ) {

          if ( X.status == 200 ) {
            XML = X.responseXML;
	    var respStatus = XML.getElementsByTagName('status').item(0);
            var flagTreated = false;

	    if ( ( respStatus !== null ) && ( typeof(respStatus) !== 'undefined' ) ) {
	      var resp = XML.getElementsByTagName('msg');
              var msg  = ( resp.length > 0 ) ? resp.item(0).firstChild.nodeValue : null;
              if ( msg !== null ) formDef[formId]["ERRORBUF"] = msg; 
                
	      switch(respStatus.firstChild.nodeValue) {
                case '403' :
                  // Forbidden
		  formSetInfo(formId, ( msg === null ) ? "authError" : "ERRORBUF" ,true,"failed");
		  setClass('captcha','error');
		  blendOpacity('result',0,100,1000);
		  flagTreated = true;
		  break;

		case '400' :
                  // Bad request
 		  formSetInfo(formId, ( msg === null ) ? "badRequestError" : "ERRORBUF" ,true,"failed");
		  blendOpacity('result',0,100,1000);
		  flagTreated = true;
		  break;

		case '200' :
                  // Request OK
		  formSetInfo(formId,"msgDone",true,"success");
                  var OUT = window.document.getElementById('result');
		  if ( typeof(OUT) !== 'undefined' ) {
		    OUT.innerHTML = "";
  		    OUT.innerHTML = formDef[formId]['thanksMsg'];
		    blendOpacity('result',0,100,1000);
		  }
                  setOpacity(formId,0);
                  flagTreated = true;
                 
                  // Traitement Réponse
                  var response = ( XML.getElementsByTagName('response').length > 0 ) ? XML.getElementsByTagName('response').item(0) : null;
                  if ( ( response === null ) || ( ! response.hasChildNodes() ) ) break; 

                  var DOM_node     = response.firstChild;
                  var flagContinue = ( ( DOM_node === null ) || ( typeof(DOM_node) === 'undefined' ) ) ? false : true;
                  var total        = 0;

                  while (flagContinue) {
                    var tagName = DOM_node.tagName;
                    if ( tagName !== null ) {
                      var DOM_target = window.document.getElementById(tagName);
                      if ( DOM_target !== null ) {
                        if ( ( tagName === 'article' ) && ( typeof(slides) !== 'undefined' ) ) { // Nettoyage des timers de diaporama
                          for ( var containerId in slides ) {
                            if ( slides[containerId]['timer'] ) {
                              clearTimeout(slides[containerId]['timer']);
                              delete(slides[containerId]);
                            }
                          }
                          slides = {};
                        }

                        setOpacity(tagName,0);
                        DOM_target.innerHTML = "";
                        copyXML(DOM_target,DOM_node);
                        setTimeout("blendOpacity('"+tagName+"',0,100,1000)", 250 * total);
                        total++;
                      }
                    }
                    if ( DOM_node === response.lastChild ) flagContinue = false;
                    if ( flagContinue && ( DOM_node.nextSibling === null ) ) flagContinue = false;
                    if ( flagContinue ) DOM_node = DOM_node.nextSibling;
                  }

		  break;

	      }
	    }
          }

	  if ( flagTreated === false ) {
            formSetInfo(formId,"internalError",true,"failed");
            blendOpacity('result',0,100,1000);
	  }
          delete(POSTX[formId]);
        }
      }
    }

    POSTX[formId].open('POST',URL,true);
    POSTX[formId].setRequestHeader("Content-type","application/x-www-form-urlencoded");
    POSTX[formId].send(POST);
    return true;
}

function queryFilter(url,formId,separator) {
  
  if ( typeof(separator) === 'undefined' ) separator = '/';
  
  if ( typeof(formId) === 'undefined' ) window.document.location = url;
  
  if ( window.document.forms[formId] ) {
    var DOM_form = window.document.forms[formId];
    var filterField = null;
    var filterValue = null;
    
    var DOM_node = getChild(DOM_form,'filterField');
    if ( DOM_node ) filterField = DOM_node.value;
    
    DOM_node = getChild(DOM_form,'filterValue');
    if ( DOM_node ) filterValue = DOM_node.value;
    
    if ( filterField ) url += filterField;
    if ( filterValue ) url += escape(separator) + filterValue;
    
    window.document.location = url;
  }
}

function resetFocus(formId,field) {
  if ( window.document.forms[formId] ) { 
    DOM_node = getChild(window.document.forms[formId],field);
    if ( DOM_node ) { 
      DOM_node.value = '';
      DOM_node.focus();
    }
    return true;
  }
  return false;
}

function toggleVisibility(blockId,controlId) {
  
  var DOM_ctrl = ( controlId ) ? window.document.getElementById(controlId) : null;
  if ( DOM_ctrl ) { 
    var newClass = ( DOM_ctrl.className == 'plus' ) ? 'minus' : 'plus';
    DOM_ctrl.className = newClass;
  }
  
  var DOM_block = ( blockId ) ? window.document.getElementById(blockId) : null;
  if ( DOM_block ) { 
    var newClass = ( DOM_block.className == 'visible' ) ? 'hidden' : 'visible';
    DOM_block.className = newClass;
    return true;
  }
    
  return false;
}

function removeDiv(divId) {
  
  var DIV = window.document.getElementById(divId);
  if (DIV && DIV.parentNode) {
    DIV.parentNode.removeChild(DIV); 
  }
  
}

function doLogin(formId) {
    
  if ( ! checkForm(formId) ) {
    return false;
  }
  
  var DOM_form = window.document.forms[formId];
  
  formDisable(formId);
  formSetInfo(formId,'doLogin');
  
  var password = DOM_form.elements['password'].value;
  if ( isDefined(challenge) ) {
    password = SHA1(challenge+SHA1(password));
  } else {
    password = SHA1(password); 
  }
  
  var GET  = "?auth:login="+escape(DOM_form.elements['login'].value);
  var POST = "pass="+password;
  
  var result = {};
  
  try {
    req = HTTPRequest();
    req.open("POST",GET,false);
    req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    req.send(POST); 
    result = eval( '(' + req.responseText +')' );
  } catch (error) {
    result['result'] = false;
    result['msg'] = 'Server error';
  }
    
  if ( result['result'] ) {

    if ( isDefined(result['redirect']) ) {
      document.location = result['redirect'];    
      return true;
    } else {
      
      // Suppression du formulaire
      if ( DOM_form.hasChildNodes() ) {
        var child = DOM_form.firstChild;
        for ( ; child != DOM_form.lastChild; ) {
          node = child;
          if ( node != DOM_form.lastChild ) child = node.nextSibling;
          DOM_form.removeChild(node);
        }
      }
      
      INFO = document.createElement('span');
      INFO.setAttribute('id','info');
      INFO.innerHTML = result['msg'];
      DOM_form.appendChild(INFO);
      
      BUTTON = document.createElement('a');
      BUTTON.setAttribute('href','?auth:logout');
      BUTTON.setAttribute('alt','Se déconnecter');
      BUTTON.innerHTML = '&nbsp;[&nbsp;Se déconnecter&nbsp;]&nbsp;';
      
      DOM_form.appendChild(BUTTON);
      
    }
  }
  
  formEnable(formId);
  DOM_info = window.document.getElementById(formId+'Info');
  if ( result['msg'] ) {
    var message = result['msg'];
    DOM_info.innerHTML = formDef['auth'][message];
    DOM_info.className = "ko";
  }
  
  return false;
}

var HTTPRequests = {};

var req = false;
var destTag = null;

function findChildNode(DOM_node,nodeId) {
  
  if ( DOM_node.id && ( DOM_node.id.match(nodeId) ) ) return DOM_node; 
  
  if ( DOM_node.hasChildNodes() ) {
    
    var flagContinue = true;
    var DOM_tmp = DOM_node.firstChild;
    
    while ( flagContinue ) {
      if ( DOM_tmp ) {
        var child = findChildNode(DOM_tmp,nodeId);
        if ( child ) return child;
      }
      if ( DOM_tmp && DOM_tmp.nextSibling ) {
        DOM_tmp = DOM_tmp.netxSibling; 
      } else {
        flagContinue = false; 
      }
      
    }
    
  }
  
  return null;
  
}

var challenge = null;
var AJAX = {};

function displayArticle(articleId) {
  
  if ( articleId === '' ) {
    DOM_tag = window.document.getElementById(tagId);
    if ( DOM_tag ) {
      DOM_tag.innerHTML = ""; 
    }
    return true;
  }
  var tagId = SHA1(articleId);
  if ( typeof(AJAX[tagId]) === 'undefined' ) AJAX[tagId] = HTTPRequest();
  

  var url = "?article:xml=" + articleId;
  AJAX[tagId].onreadystatechange = updateArticle;
  AJAX[tagId].open('GET',url,true);
  AJAX[tagId].send(null); 
  return true;  
}

function updateArticle() {
  
  for ( var idx in AJAX ) {
    if (AJAX[idx].readyState == 4) {

      if (AJAX[idx].status == 200) {
        var clean = {};
	var last  = {};
        var total = 0;

        var xmlResp = AJAX[idx].responseXML;
	if ( ( xmlResp === null ) || ( typeof(xmlResp) === 'undefined' ) ) {
          delete(AJAX[idx]);
	  return false;
	}

	DOM_result = xmlResp.getElementsByTagName("xmlresult").item(0);
	if ( DOM_result !== null ) {
	  if ( DOM_result.hasChildNodes() ) {
            var DOM_node = DOM_result.firstChild;
	    var flagContinue = ( DOM_node !== null ) ? true : false;
	    while ( flagContinue) {

	      var tagName = DOM_node.tagName;
	      if ( typeof(clean[tagName]) === 'undefined' ) clean[tagName] = 0;
	      if ( tagName !== null ) {
                var DOM_target = null;
		if ( typeof(last[tagName]) === 'undefined' ) last[tagName] = null;
		var flagSearch = true;
		
		for ( var j = clean[tagName]; flagSearch === true;) {

		  var targetName = ( j == 0 ) ? tagName : tagName + j;
                  DOM_target = window.document.getElementById(targetName);
		  if ( DOM_target === null ) {
                    if ( ++j > 4 ) flagSearch = false;
		  } else {
		    var targetName = ( j === 0 ) ? tagName : tagName + j;
                     
		    setOpacity(targetName,0);
                    DOM_target.innerHTML = "";
		    copyXML(DOM_target,DOM_node);

	            clean[tagName] = j+1;
		    last[tagName] = j;
		    flagSearch = false;

		    setTimeout("blendOpacity('"+targetName+"',0,100,1000)", 250 * total);
                    total++;
		  }
		}

		if ( ( DOM_target === null ) && ( last[tagName] !== null ) ) {
		  j = last[tagName];
		  targetName = ( j == 0 ) ? tagName : tagName + j;
		  DOM_target = window.document.getElementById(targetName);
		  if ( DOM_target !== null ) copyXML(DOM_target,DOM_node);
		}

	      }

              if ( DOM_node === DOM_result.lastChild ) flagContinue = false;
              if ( flagContinue && ( DOM_node.nextSibling === null ) ) flagContinue = false;

              if ( flagContinue ) DOM_node = DOM_node.nextSibling;
	    }
	  }
        }
      }
      delete AJAX[idx];
    }
  
  }
  return true; 
}

function copyAttributes(DOM_new,DOM_source) {

  var length = DOM_source.attributes.length;
  if ( length > 0 ) {
    for ( var j = 0; j < length; j++ ) {
      if ( DOM_source.attributes[j].specified ) {
          switch(DOM_source.attributes[j].name) {
            case 'class':
                DOM_new.className = DOM_source.attributes[j].value;
                break;
            case 'onkeyup' :
            case 'onclick':
              if ( DOM_new.attachEvent ) {
                var value = DOM_source.attributes[j].value;
                DOM_new.attachEvent(DOM_source.attributes[j].name,function() { return eval(value); });
                break;
              }
            default :
              try {
                DOM_new.setAttribute( DOM_source.attributes[j].name , DOM_source.attributes[j].value );
              } catch(e) {
                var attrName  = DOM_source.attributes[j].name; attrName = attrName.toLowerCase();
                var attrValue = DOM_source.attributes[j].value; attrValue = attrValue.toLowerCase();

                DOM_copy = window.document.createElement(DOM_source.tagName);
                DOM_copy.setAttribute(attrName,attrValue);
                copyAttributes(DOM_copy,DOM_new);
          
                DOM_new.parentNode.replaceChild(DOM_copy,DOM_new);
                DOM_new = DOM_copy;
              }
              break;
          }
      }
    }
  }
}

function copyXML(DOM_target,DOM_source) {

  var treated = false;

  if ( DOM_source === null) return;


  if ( DOM_source.nodeType === 1 ) {
    
    var DOM_new = null;
    if ( ( DOM_source.tagName !== null ) && ( DOM_target.id !== DOM_source.tagName ) ) {
      DOM_new = window.document.createElement(DOM_source.tagName);
      DOM_target.appendChild(DOM_new);
    }
   
    if ( DOM_new === null ) DOM_new = DOM_target;

    if ( DOM_source.hasChildNodes() ) {
      var DOM_node = DOM_source.firstChild;
      var flagContinue = ( DOM_node ) ? true : false;
      while (flagContinue) {
        copyXML(DOM_new,DOM_node);

	if ( DOM_node === DOM_source.lastChild ) flagContinue = false;
        if ( flagContinue && ( DOM_node.nextSibling === null ) ) flagContinue = false;

        if ( flagContinue ) DOM_node = DOM_node.nextSibling;
      }
      treated = true;
    }

    copyAttributes(DOM_new,DOM_source);
/*    var length = DOM_source.attributes.length;
    if ( length > 0 ) {
      for ( var j = 0; j < length; j++ ) {
        if ( DOM_source.attributes[j].specified ) {
	  try { 
 	    switch(DOM_source.attributes[j].name) {
	      case 'onkeyup' :  
              case 'onclick':
	        if ( DOM_new.attachEvent ) {
 	          var value = DOM_source.attributes[j].value;
	          DOM_new.attachEvent(DOM_source.attributes[j].name,function() { return eval(value); });
	          break;
	        } 
	      default :
	        DOM_new.setAttribute( DOM_source.attributes[j].name , DOM_source.attributes[j].value );
	        break;
	    }
	  } catch(e) {
	    var attrName  = DOM_source.attributes[j].name; attrName = attrName.toLowerCase();
	    var attrValue = DOM_source.attributes[j].value; attrValue = attrValue.toLowerCase();

            alert("setAttribute(" + DOM_source.attributes[j].name + "=" + DOM_source.attributes[j].value+")\n"+
	          "["+e.name+"] "+e.message+"\n"+
		  "tag: "+DOM_new+" ("+DOM_new.tagName+")");

	  }
        }
      } 
    } */
  } 
  
  // Traitement noeud 'TEXT_NODE'/'CDATA_SECTION_NODE'
  if ( ( ! treated ) && ( ( DOM_source.nodeType === 3 ) || ( DOM_source.nodeType ===4 ) ) )  {
    var value = DOM_source.nodeValue;
    if ( value ) {
      try {
        var DOM_text = window.document.createTextNode(value);
        DOM_target.appendChild(DOM_text); 
      } catch (Exception) {
        var tagName = DOM_target.tagName;
	tagName     = tagName.toLowerCase();
        if ( tagName === 'script' ) {
          eval(value);
	} else if (tagName === 'style') {
	  window.document.styleSheets[0].cssText += value;
	}
      }

    }
  }
  
}

function menuToggleDisplay(menuId) {

  var DOM_menu = window.document.getElementById(menuId);
  if ( DOM_menu !== null ) {
    var doDisplay = ( DOM_menu.style.display == 'block' ) ? false : true;
    DOM_menu.style.display = ( doDisplay ) ? 'block' : 'hidden';
  }
}

function delayedJump(url,divId,msg,timer) {

  var DOM_tag = document.getElementById(divId);
  if ( DOM_tag ) {
    DOM_tag.innerHTML = msg + ' ' + timer;
    if ( timer <= 0 ) {
      window.document.location = url;
    } else {
      timer--;
      setTimeout("delayedJump('"+url+"','"+divId+"','"+msg+"','"+timer+"')",1000);
    }
  }

}

var TIMERS = {};

function loadDiaporama(containerId,slideId,delay) {

  if ( ( slides === null ) || ( slides[containerId] === null ) ) return;

  slides[containerId]['isLoaded'] = false;

  // Initialisation structure interne et pré-chargement images
  for ( var j = 0; j <= slides[containerId]['lastIdx']; j++ ) {
    if ( typeof(slides[containerId][j]['obj']) === 'undefined' ) {
      slides[containerId][j]['isLoaded'] = false;
      slides[containerId][j]['obj'] = new Image();
      slides[containerId][j]['obj'].onLoad = diapoLoaded(containerId,j,delay);
      slides[containerId][j]['obj'].src = 'provider.php?'+slides[containerId][j]['src'];
    }
  }
      
}

function diapoLoaded(containerId,slideId,delay) {

  if ( slides[containerId][slideId]['obj'] === null ) return;

  if ( slides[containerId]['isLoaded'] === true ) return;

  if (  slides[containerId][slideId]['isLoaded'] === false ) slides[containerId][slideId]['isLoaded'] = true;

  for ( var j = 0; j <= slides[containerId]['lastIdx']; j++ )
    if ( ( slides[containerId][j]['isLoaded'] === null ) || ( slides[containerId][j]['isLoaded'] === false ) ) return;
  
  slides[containerId]['isLoaded'] = true;
  displayImage(containerId,0,delay);

}

function displayImage(containerId,slideId,delay) {

  if ( typeof(slides[containerId]) === 'undefined' ) return;

  // Image utilisée pour l'effet de transition
  var DOM_front = window.document.getElementById(''+containerId+'_front');
  if ( DOM_front === null ) return;

  // Image principale d'affichage
  var DOM_back  = window.document.getElementById(containerId+'_back');
  if ( DOM_back === null ) return;
  
  // Récupération ancien contenu
  var match = /provider.php\?(.*)/.exec(DOM_back.getAttribute('src'));
  var oldSrc = ( match ) ? match[1] : null;
  
  if ( oldSrc === null ) {
    // Démarrage du diaporama
    var frontSrc  = 'provider.php?'+slides[containerId][0]['src'];
    DOM_front.src = frontSrc;
    DOM_back.src  = frontSrc;

    var title     = slides[containerId][0]['title'];
    if ( title ) DOM_front.setAttribute('title',title);
    
    var alt       = slides[containerId][0]['alt'];
    if ( alt ) {
      DOM_front.setAttribute('alt',alt)
    } else {
      if ( DOM_front.getAttribute('alt') ) DOM_front.removeAttribute('alt');
    }

    var link = slides[containerId][0]['link'];
    if ( link ) {

      try {
        var value = "doGet('out','jump','"+link+"');";
        if ( DOM_front.attachEvent ) {
	  slides[containerId]['function'] = function() { return eval(value); } ;
          DOM_front.attachEvent('onclick', slides[containerId]['function'] );
        } else {
          DOM_front.setAttribute( 'onclick' , value + 'return false;' );
        }
      } catch(e) { ; }

    }

    blendOpacity(containerId+'_front',100,0,100);
    slides[containerId]['timer'] = setTimeout("displayImage('"+containerId+"',1,"+delay+")",delay*1000);
    return;
  }
  
  // Affichage de la prochaine image du diaporama
  
  // Récupération prochain contenu
  var curSlideId = null;
  for ( var j = 0 ; j <= slides[containerId]['lastIdx']; j++) {
    if ( slides[containerId][j] === null ) break;
    if ( slides[containerId][j]['src'] === oldSrc ) {
      curSlideId = j;
      break;
    }
  }
  if ( curSlideId === null) return;

  var nexSlideId = ( ( curSlideId + 1 ) > slides[containerId]['lastIdx'] ) ? 0 : (curSlideId + 1);
  var nexSrc     = slides[containerId][nexSlideId]['src'];
  var nexTitle   = slides[containerId][nexSlideId]['title'];
  var nexAlt     = slides[containerId][nexSlideId]['alt'];
  var nexLink    = slides[containerId][nexSlideId]['link'];

  // Vérification dimensions
  if ( typeof(slides[containerId]['width'])  === 'undefined' ) slides[containerId]['width']  = DOM_back.width;
  if ( typeof(slides[containerId]['height']) === 'undefined' ) slides[containerId]['height'] = DOM_back.height;

  // Initialisation de la nouvelle image de premier plan
  DOM_front.onLoad = setImgSize(containerId+'_front',slides[containerId]['width'],slides[containerId]['height']);
  DOM_front.src    = 'provider.php?'+oldSrc;
  
  if ( nexTitle ) DOM_front.setAttribute('title',nexTitle);
  if ( nexAlt   ) {
    DOM_front.setAttribute('alt',nexAlt);
  } else {
    if ( DOM_front.getAttribute('alt') ) DOM_front.removeAttribute('alt');
  }

  if ( nexLink ) {

    try {
      var value = "doGet('out','jump','"+nexLink+"');";

      if ( DOM_front.attachEvent ) {
        DOM_front.detachEvent('onclick', slides[containerId]['function'] );

        slides[containerId]['function'] = function() { return eval(value); } ;
        DOM_front.attachEvent('onclick', slides[containerId]['function'] );
      } else {
        DOM_front.setAttribute( 'onclick' , value );
      }
    } catch(e) { ; }

  }

  setOpacity(containerId+'_front',100);
  
  // Initialisation de la nouvelle image d'arrière plan
  DOM_back.onLoad = setImgSize(containerId+'_back',slides[containerId]['width'],slides[containerId]['height'])
  DOM_back.src    = 'provider.php?'+nexSrc;
  setOpacity(containerId+'_back',100);

  // Blend
  blendOpacity(containerId+'_front',100,0,500);
  
  // Armement timer
  slides[containerId]['timer'] =  setTimeout("displayImage('"+containerId+"',"+nexSlideId+","+delay+")",delay*1000);
  
}

function setImgSize(imgId,w,h) {
  var DOM = window.document.getElementById(imgId);
  if (DOM) {
    DOM.width  = (w)? w : DOM.width;
    DOM.height = (h)? h : DOM.height;
  }
}

function toggle(target,caption) {

  DOM_target = window.document.getElementById(target);
  if ( typeof(DOM_target) === 'undefined' ) return false;

  DOM_caption = window.document.getElementById(caption);
  if ( typeof(DOM_caption) === 'undefined' ) return false;

  var display = DOM_target.className;
  if ( display === 'visible' ) {
    blendOpacity(target,100,0,500);
    setTimeout("setClass('"+target+"','hidden'); setClass('"+caption+"','')",500);
  } else {
    blendOpacity(target,0,100,500);
    DOM_target.className = 'visible';
    DOM_caption.className = 'visible';
  }
  return true;
}

function blendOpacity(id,start,end,delay) {

  var count = 0;
  if ( start > end ) {
    var speed = delay / ( start-end);
    for ( var opacity = start; opacity >= end; opacity-- ) {
      setTimeout("setOpacity('" + id + "'," + opacity + ")", ( count*speed ) );
      count++;
    }
  } else if ( end > start ) {
    var speed = delay / (end - start);
    for ( var opacity = start; opacity <= end; opacity++ ) {
      setTimeout("setOpacity('" + id + "'," + opacity + ")", ( count*speed ) );
      count++;
    }
  }
}

function setOpacity(id,opacity) {
  var DOM_object = window.document.getElementById(id);
  if ( DOM_object ) {
    var style = DOM_object.style;
    if ( style ) {
      style.opacity      = ( opacity / 100 );
      style.MozOpacity   = ( opacity / 100 );
      style.KhtmlOpacity = ( opacity / 100 );
      style.filter       = "alpha(opacity=" + opacity + ")";
    }
  }
}

function resetChallenge(id) {
  var DOM_img = window.document.getElementById(id);
  if ( DOM_img && ( DOM_img.tagName === 'img' ) ) {
    var timestamp = Math.floor((new Date()).getTime() / 1000) ;
    DOM_img.src='captcha.php?'+timestamp;
  }
}

function deleteContainer(id) {
  var DOM_node = window.document.getElementById(id);
  if ( typeof(DOM_node) === 'undefined' ) return false;

  DOM_node.parentNode.removeChild(DOM_node);
  return true;
}

function removeContainer(id,delay) {

  var DOM_node = window.document.getElementById(id);
  if ( typeof(DOM_node) === 'undefined' ) return false;

  var count = 0;
  var speed = delay / 100;
  for ( var opacity = 100; opacity >= 0; opacity-- ) {
    setTimeout("setOpacity('" + id + "'," + opacity + ")", ( count*speed ) );
    count++;
  }
  setTimeout("deleteContainer('" + id + "')", (count*speed));
  return true;
}

function doSelection(selectionId,id) {

  if ( ! Selections[selectionId] ) {
    Selections[selectionId] = {};
  }

  if ( ! Selections[selectionId][id] ) Selections[selectionId][id] = 0;
  Selections[selectionId][id] = (Selections[selectionId][id]+1)%2;
  
}

