function checkEmail (email) {
    var reg = /^[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]+(\.[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]+)*@(([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){1,63}\.)+([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){2,63}$/i;
	if (reg.exec(email) == null) {
	    return false;
	} else {
	   return true;
	}
}

function checkLogin (loginForm) {
    var errors = '';
    
    //Vérification de l'email
    if (loginForm.email.value == '') {
        errors += "- Veuillez saisir un email.<br/>";
    } else if (!checkEmail(loginForm.email.value)) {
        errors += "- L'adresse email est invalide.<br/>";
    }
    
    //Vérification du mot de passe
    if (loginForm.password.value == '') {
        errors += "- Veuillez entrer un mot de passe.<br/>";
    }
    
    //Si tout est OK on valide le formulaire.
    if (errors == '') {
        var password = MD5(loginForm.password.value);
        loginForm.password.value = password;
        loginForm.submit();
    } else {
        document.getElementById('errorLogin').innerHTML = "Veuillez vérifier votre saisie :<br/>"+errors;
        document.getElementById('tblIdentifier').style.marginTop='8px';
    }
    
    return false;
}

function checkCreateAccount (createAccountForm,action) {
    var errors = '';
    
    if (createAccountForm.civilite[2].checked && createAccountForm.societe.value == '') {
        errors += " - Veuillez saisir une Soci&eacute;t&eacute;.<br/>";
    } else if (createAccountForm.civilite[0].checked && createAccountForm.nom.value == '') {
        errors += " - Veuillez saisir un Nom.<br/>";
    }
    if (createAccountForm.prenomP.value == '') {
        errors += "- Veuillez saisir un Prénom.<br/>";
    }
    if (createAccountForm.emailP.value == '') {
        errors += "- Veuillez saisir un Email.<br/>";
    } else if (!checkEmail(createAccountForm.emailP.value)) {
        errors += "- L'adresse email est invalide.<br/>";
    }
    if (action !='modif'){
	    if (createAccountForm.confirmEmail.value == '' || createAccountForm.confirmEmail.value != createAccountForm.emailP.value) {
	        errors += "- Veuillez confirmer votre Email.<br/>";
	    }
	    if (createAccountForm.passwrd.value == '') {
	        errors += "- Veuillez saisir un Mot de passe.<br/>";
	    }
	    if (createAccountForm.confirmer.value == '' || createAccountForm.confirmer.value != createAccountForm.passwrd.value) {
	        errors += "- Veuillez confirmer votre Mot de passe.<br/>";
	    }
	} 
    if (createAccountForm.leiuP.value == '') {
        errors += "- Veuillez saisir une Adresse.<br/>";
    }
    if (createAccountForm.cpP.value == '') {
        errors += "- Veuillez saisir un Code Postal.<br/>";
    }
    if (createAccountForm.villeP.value == '') {
        errors += "- Veuillez saisir une Ville.<br/>";
    }
    if(createAccountForm.paysP.value == '' || createAccountForm.paysP.value =='-1'){
			 errors += "- Veuillez choisir un pays.<br/>";
	}
    if (createAccountForm.gsmP.value == '' && createAccountForm.fixeP.value == '') {
        errors += "- Veuillez saisir un numéro de téléphone .<br/>";
    }
    if (action !='modif'){
	    if (createAccountForm.txtCaracCompte.value == '') {
	        errors += "- Veuillez saisir le code de vérification.<br/>";
	    }
	}
	/*
	if(document.getElementById('cgv')){
		if(createAccountForm.form.value !=='modifierCmpte' && document.getElementById('cgv').value =='valider'){
		    if (!createAccountForm.condi.checked) {
		        errors += "- Veuillez accepter les Conditions Générales de Vente.<br/>";
		    }
	    }
	}
	*/
    if (errors == '') {
        createAccountForm.submit();
    } else {
        document.getElementById('errorBox').innerHTML = "Veuillez vérifier votre saisie :<br/>"+errors;
    }
    
    return false;
}

function checkCreateAddress (createAddressForm) {
    var errors  = '';
    addressName = createAddressForm.addressName.value;
    if (createAddressForm.chkCivilite[0].checked) {
        chkCivilite = 'M.';
    } else if (createAddressForm.chkCivilite[1].checked) {
        chkCivilite = 'Mme';
    } else {
        chkCivilite = 'Sa';
    }
    societe     = createAddressForm.societe.value;
    nom         = createAddressForm.nom.value;
    prenom      = createAddressForm.prenom.value;
    etage       = createAddressForm.etage.value;
    batiment    = createAddressForm.batiment.value;
    voie        = createAddressForm.voie.value;
    lieu        = createAddressForm.lieu.value;
    code        = createAddressForm.Code.value;
    ville       = createAddressForm.ville.value;
    pays        = createAddressForm.pays.value;
    portable    = createAddressForm.portable.value;
    fixe        = createAddressForm.fixe.value;
  
    if (addressName == '') {
        errors += "- Veuillez saisir un titre pour cette adresse.<br/>";
    }
    if (chkCivilite == 'SOC' && societe == '') {
        errors += "- Veuillez saisir une Société.<br/>";
	} else if (chkCivilite != 'SOC' && nom == '') {
        errors += "- Veuillez saisir un Nom<br/>";
	}
    if (prenom == '') {
        errors += "- Veuillez saisir un Prénom.<br/>";
    }
    if (voie == '') {
        errors += "- Veuillez saisir une Adresse.<br/>";
    }
    if (code == '') {
        errors += "- Veuillez saisir un Code Postal.<br/>";
    }
    if (ville == '') {
        errors += "- Veuillez saisir une Ville.<br/>";
    }
    if (portable == '' && fixe == '') {
        errors += "- Veuillez saisir un numéro de téléphone fixe ou portable.<br/>";
    }
    
    if (errors == '') {
        return true;
    } else {
        document.getElementById('errorBoxAddress').innerHTML = "Veuillez vérifier votre saisie :<br/>"+errors;
        return false;
    }
    
   
}

function checkRecuperation () {
    
    for (i=0; i < document.getElementById('popFormContainer1').getElementsByTagName('input').length; i++) {
        if (document.getElementById('popFormContainer1').getElementsByTagName('input')[i].id == 'chkCyberbrico') {
            var cyber    = document.getElementById('popFormContainer1').getElementsByTagName('input')[i].checked;
        } else if (document.getElementById('popFormContainer1').getElementsByTagName('input')[i].id == 'chkServices') {
            var services = document.getElementById('popFormContainer1').getElementsByTagName('input')[i].checked;
        }
    }
    
    if (cyber == false && services == false) {
        error = "Vous devez cocher au moins une des cases pour accéder à la récupération de votre compte."
            +" Si vous ne possédiez de compte sur aucun de ces 2 sites, veuillez procéder à la <a href=\"/compte/compte/creation-compte-bhv.html\">création de votre compte BHV</a>.";
	    for (i=0; i < document.getElementById('popFormContainer1').getElementsByTagName('div').length; i++) {
	        if (document.getElementById('popFormContainer1').getElementsByTagName('div')[i].id == 'errorBox') {
                document.getElementById('popFormContainer1').getElementsByTagName('div')[i].innerHTML = error;
	        }
	    }
    } else {
        for (i=0; i < document.getElementById('popFormContainer1').getElementsByTagName('div').length; i++) {
            if (document.getElementById('popFormContainer1').getElementsByTagName('div')[i].id == 'popFormContainer1C') {
                document.getElementById('popFormContainer1').getElementsByTagName('div')[i].innerHTML = document.getElementById('RecupStep2').innerHTML;
            }
        }
        if (cyber == true) {
	        for (i=0; i < document.getElementById('popFormContainer1').getElementsByTagName('tr').length; i++) {
	            if (document.getElementById('popFormContainer1').getElementsByTagName('tr')[i].id == 'cyber') {
	                document.getElementById('popFormContainer1').getElementsByTagName('tr')[i].style.display = "";
	            }
	        }
            for (i=0; i < document.getElementById('popFormContainer1').getElementsByTagName('input').length; i++) {
	            if (document.getElementById('popFormContainer1').getElementsByTagName('input')[i].id == 'bCyber') {
	                document.getElementById('popFormContainer1').getElementsByTagName('input')[i].value = "true";
	            }
	        }
        }
        if (services == true) {
			for (i=0; i < document.getElementById('popFormContainer1').getElementsByTagName('tr').length; i++) {
			    if (document.getElementById('popFormContainer1').getElementsByTagName('tr')[i].id == 'services') {
			        document.getElementById('popFormContainer1').getElementsByTagName('tr')[i].style.display  = "";
			    }
			}
	        for (i=0; i < document.getElementById('popFormContainer1').getElementsByTagName('input').length; i++) {
			    if (document.getElementById('popFormContainer1').getElementsByTagName('input')[i].id == 'bServices') {
			        document.getElementById('popFormContainer1').getElementsByTagName('input')[i].value = "true";
			    }
			}
        }
    }
    return false;
}

function checkRecuperation2 (form, btnValid) {
    var bCyber      = form.bCyber.value;
    var idCyber     = form.idCyber.value;
    var pwdCyber    = htmlentities(form.pwdCyber.value);
    var bServices   = form.bServices.value;
    var idServices  = form.idServices.value;
    var pwdServices = form.pwdServices.value;
    var stringData  = '';
    for (i=0; i < document.getElementById('popFormContainer1').getElementsByTagName('td').length; i++) {
        if (document.getElementById('popFormContainer1').getElementsByTagName('td')[i].id == 'errorBoxCyber') {
            var tdCyber    = document.getElementById('popFormContainer1').getElementsByTagName('td')[i];
        } else if (document.getElementById('popFormContainer1').getElementsByTagName('td')[i].id == 'errorBoxServices') {
            var tdServices = document.getElementById('popFormContainer1').getElementsByTagName('td')[i];
        } else if (document.getElementById('popFormContainer1').getElementsByTagName('td')[i].id == 'successMsg') {
            var tdSuccess = document.getElementById('popFormContainer1').getElementsByTagName('td')[i];
        }
    }
    
    if (bCyber == 'true') {
        if (idCyber != '' && pwdCyber != '') {
	        stringData += '&idCyber='+ idCyber + '&pwdCyber='+ MD5(pwdCyber);
        } else if (btnValid == 'cyber') {
            tdCyber.style.color   = 'red';
            tdCyber.style.display = '';
            tdCyber.innerHTML     = 'Veuillez renseigner un Pseudo et un Mot De Passe.';
        }
    }
    if (bServices == 'true') {
        if (idServices != '' && pwdServices != '') {
            stringData += '&idServices='+ idServices + '&pwdServices='+ pwdServices;
        } else if (btnValid == 'services') {
            tdServices.style.color   = 'red';
            tdServices.style.display = '';
            tdServices.innerHTML     = 'Veuillez renseigner un Identifiant et un Mot De Passe.';
        }
    }
    if (stringData != '') {
        $.ajax({
	        type: "POST",
	        url: urlScript,
	        data: 'form=consolidation' + stringData,
	        success: function(msg){
				var php = new PHP_Serializer(true);
				var consolidation = php.unserialize(msg);
                form.result.value = consolidation['cyber']+consolidation['services'];
	            
	            if (consolidation['cyber'] == 0 && bCyber == 'true' && btnValid == 'cyber') {
	               tdCyber.innerHTML = 'Votre identifiant ou votre mot de passe est incorrect.';
	               tdCyber.style.color = 'red';
	            } else if (consolidation['cyber'] == 1) {
                   tdSuccess.style.display = '';
                   tdSuccess.style.color = 'green';
	            }
                if (consolidation['services'] == 0 && bServices == 'true' && btnValid == 'services') {
                   tdServices.innerHTML = 'Votre identifiant ou votre mot de passe est incorrect.';
                   tdServices.style.color = 'red';
                } else if (consolidation['services'] == 1) {
                   tdSuccess.style.display = '';
                   tdSuccess.style.color = 'green';
                }
                
				form.cyber.value     = consolidation['cyber'];
                form.services.value  = consolidation['services'];
				form.civilite.value  = consolidation['civilite'];
				form.cyberbric.value = consolidation['cyberbric'];
				form.nom.value       = consolidation['nom'];
				form.nom1.value      = consolidation['nom1'];
				form.nom2.value      = consolidation['nom2'];
				form.prenomP.value   = consolidation['prenomP'];
				form.prenomP1.value  = consolidation['prenomP1'];
				form.prenomP2.value  = consolidation['prenomP2'];
				form.emailP.value    = consolidation['emailP'];
				form.emailP1.value   = consolidation['emailP1'];
				form.emailP2.value   = consolidation['emailP2'];
				form.leiuP.value     = consolidation['leiuP'];
				form.leiuP1.value    = consolidation['leiuP1'];
				form.leiuP2.value    = consolidation['leiuP2'];
				form.cpP.value       = consolidation['cpP'];
				form.cpP1.value      = consolidation['cpP1'];
				form.cpP2.value      = consolidation['cpP2'];
				form.villeP.value    = consolidation['villeP'];
				form.villeP1.value   = consolidation['villeP1'];
				form.villeP2.value   = consolidation['villeP2'];
				form.paysP.value     = consolidation['paysP'];
				form.gsmP.value      = consolidation['gsmP'];
				form.fixeP.value     = consolidation['fixeP'];
			},
	        error: function(msg){
	            tdCyber.innerHTML   = 'Une erreur est survenue, veuillez réessayer un peu plus tard.';
	            tdCyber.style.color = 'red';
	        }
	    });
    }
    return false;
}

function checkRecuperation3 (form) {
    
    var result  = form.result.value;
    for (i=0; i < document.getElementById('popFormContainer1').getElementsByTagName('td').length; i++) {
        if (document.getElementById('popFormContainer1').getElementsByTagName('td')[i].id == 'errorBoxCyber') {
            var tdCyber = document.getElementById('popFormContainer1').getElementsByTagName('td')[i];
        }
    }
    for (i=0; i < document.getElementById('popFormContainer1').getElementsByTagName('div').length; i++) {
        if (document.getElementById('popFormContainer1').getElementsByTagName('div')[i].id == 'popFormContainer1C') {
            var popup = document.getElementById('popFormContainer1').getElementsByTagName('div')[i];
        }
    }
    
    if (result == '') {
        error = 'Veuillez renseigner les champs ci-dessus ou cliquez d\'abord sur Valider pour acc&eacute;der &agrave; l\'&eacute;tape suivante.';
        tdCyber.innerHTML = error;
    } else if (result == '0') {
        popup.innerHTML = document.getElementById('RecupNoResult').innerHTML;
    } else {
        form.submit();
    }
    
    return false;
}

function changePassword (form) {
    var old         = form.old.value;
    var new1        = form.new1.value;
    var new2        = form.new2.value;
    var stringData  = '';
    for (i=0; i < document.getElementById('PopUpPanier').getElementsByTagName('td').length; i++) {
        if (document.getElementById('PopUpPanier').getElementsByTagName('td')[i].id == 'errorBox') {
            tdError = document.getElementById('PopUpPanier').getElementsByTagName('td')[i];
        }
    }
    
    if (old == '' || new1 == '' || new2 == '') {
        tdError.innerHTML = 'Veuillez renseigner tous les champs.';
        tdError.style.color = 'red';
    } else if (old == new1) {
        tdError.innerHTML = 'Le nouveau et l\'ancien mot de passe sont identiques.';
        tdError.style.color = 'red';
    } else if (new1 != new2) {
        tdError.innerHTML = 'Vous n\'avez pas confirm&eacute; correctement le nouveau mot de passe.';
        tdError.style.color = 'red';
    } else {
        stringData += '&old=' + MD5(old) + '&new1=' + MD5(new1) + '&new2=' + MD5(new2);
    }
    
    if (stringData != '') {
        $.ajax({
            type: "POST",
            url: urlScript,
            data: 'form=changePassword' + stringData,
            success: function(msg){
                if (msg == 1) {
                    tdError.style.color = 'green';
                    tdError.innerHTML = 'Votre mot de passe a bien &eacute;t&eacute; modifi&eacute;.';
                } else {
                    tdError.innerHTML = 'Vous n\'avez pas saisi le bon mot de passe.';
                    tdError.style.color = 'red';
                }
            },
            error: function(msg){
                tdError.innerHTML   = 'Une erreur est survenue, veuillez réessayer un peu plus tard.';
                tdError.style.color = 'red';
            }
        });
    }
    
    return false;
}

function setPseudo (form) {
    
    var pseudo      = form.pseudo.value;
    var stringData  = '';
    var tdError     = document.getElementById('PopUpPanier').getElementsByTagName('td')['errorBox'];
    
    if (pseudo == '') {
        tdError.innerHTML = 'Veuillez renseigner un pseudo.';
        tdError.style.color = 'red';
    } else {
        stringData += '&pseudo='+pseudo;
    }
    
    if (stringData != '') {
        $.ajax({
            type: "POST",
            url: urlScript,
            data: 'form=setPseudo' + stringData,
            success: function(msg){
                if (msg == 1) {
                    tdError.style.color = 'green';
                    document.getElementById('cyber').innerHTML = '<br />'
                        +'Pseudo : '+pseudo
                        +'<div class="bouton">'
                            +'<a href="/cyberbricoleur/index.php?act=UserCP&CODE=04">'
                                +'<input type="button" class="boutonTypique8" value="MODIFIER MES OPTIONS CYBERBRICOLEUR" />'
                            +'</a>'
                        +'</div>';
                    tdError.innerHTML = 'Votre compte Cyberbricoleur a &eacute;t&eacute; cr&eacute;&eacute;.';
                    document.getElementById('PopUpPanier').getElementsByTagName('input')['validCyber'].style.display = 'none';
                } else {
                    tdError.innerHTML = 'Pseudo d&eacute;j&agrave; existant.';
                    tdError.style.color = 'red';
                }
            },
            error: function(msg){
                tdCyber.innerHTML   = 'Une erreur est survenue, veuillez réessayer un peu plus tard.';
                tdCyber.style.color = 'red';
            }
        });
    }
    return false;
}


/*---- fonction de validation des champs du  ----*/
/*---- ----formulaire modification---------- ----*/
/*---- ---------stephane--------------- ----*/
function verifChampsCompte(val,msg,label,style,numadr){
	if(val !='portable'+numadr && val !='fixe'+numadr && val !='portableadd' && val !='fixeadd'){
		if(val =='paysP'+numadr || val =='pays'+numadr || val=='paysA'+numadr || val=='paysadd'){
			
			if(document.getElementById(val).value =='' || document.getElementById(val).value =='-1'){
				document.getElementById(val).className = 'EmailBox_invalid';
				if(val=='paysadd'){
					document.getElementById('labelpaysencadrerajout').className = 'EmailBox_invalid';
				}else{
					document.getElementById('labelpaysencadrer').className = 'EmailBox_invalid';
				}
				document.getElementById(label).className = 'valid_label';
			}else{
				document.getElementById(val).className = style;
				if(val=='paysadd'){
					document.getElementById('labelpaysencadrerajout').className = style;
				}else{
					document.getElementById('labelpaysencadrer').className = style;
				}
				document.getElementById(label).className = '';
			}
		}
		else if(val !='Civilite'+numadr){
			
			if(document.getElementById(val).value ==''){
				document.getElementById(val).className = 'EmailBox_mdp_invalid';
				document.getElementById(label).className = 'valid_label';
			}else{
				document.getElementById(val).className = style;
				document.getElementById(label).className = '';
			}
		}else{
			
			counter=0;
			for(i=1;i<=3;i++){
				if(document.getElementById(val+i).checked ==true){
					counter++;
				}
			}
			if(counter==0){
				document.getElementById(label).className = 'valid_label';
			}else{
				document.getElementById(label).className = '';
			}
	}
	}else{
		
		 switch(val){
            case 'portable'+numadr: 
            		validateTelCompte(val,'fixe'+numadr,label,'fixe1'+numadr);
            break;
            case 'fixe'+numadr: 
            		validateTelCompte(val,'portable'+numadr,label,'portable1'+numadr);
            break;
            case 'portableadd': 
            		validateTelCompte(val,'fixeadd'+numadr,label,'fixe3add');
            break;
            case 'fixeadd': 
            		validateTelCompte(val,'portableadd'+numadr,label,'portable3add');
            break;
            }
	}
}

//--la fonction prend deux parametres------------------------------------------//
//--le premier est la valeur de l'input qui est tester-------------------------//
//--et le second est l'autre telephone-----------------------------------------//
//--exemplevalidateTel(telephone,telphone2,label_telephone,label_telephone2)---//
function validateTelCompte(val,parameter2,label,label2){
	if(document.getElementById(val).value == '' && document.getElementById(parameter2).value == ''){
		document.getElementById(val).className='EmailBox_mdp_invalid';
		document.getElementById(parameter2).className='EmailBox_mdp_invalid';
		document.getElementById(label).className='valid_label';
		document.getElementById(label2).className='valid_label';
	}else{
		document.getElementById(val).className='EmailBox_mdp_valid';
		document.getElementById(parameter2).className='EmailBox_mdp_valid';
		document.getElementById(label).className='';
		document.getElementById(label2).className='';
	}
}

/**
 * Object PHP_Serializer
 *  JavaScript to PHP serialize / unserialize class.
 * This class converts php variables to javascript and vice versa.
 *
 * PARSABLE JAVASCRIPT < === > PHP VARIABLES:
 *  [ JAVASCRIPT TYPE ]     [ PHP TYPE ]
 *  Array       < === >     array
 *  Object      < === >     class (*)
 *  String      < === >     string
 *  Boolean     < === >     boolean
 *  null        < === >     null
 *  Number      < === >     int or double
 *  Date        < === >     class
 *  Error       < === >     class
 *  Function    < === >     class (*)
 *
 * (*) NOTE:
 * Any PHP serialized class requires the native PHP class to be used, then it's not a
 * PHP => JavaScript converter, it's just a usefull serilizer class for each
 * compatible JS and PHP variable types.
 * Lambda, Resources or other dedicated PHP variables are not usefull for JavaScript.
 * There are same restrictions for javascript functions*** too then these will not be sent.
 *
 * *** function test(); alert(php.serialize(test)); will be empty string but
 * *** mytest = new test(); will be sent as test class to php
 * _____________________________________________
 *
 * EXAMPLE:
 *  var php = new PHP_Serializer(); // use new PHP_Serializer(true); to enable UTF8 compatibility
 *  alert(php.unserialize(php.serialize(somevar)));
 *  // should alert the original value of somevar
 * ---------------------------------------------
 * @author              Andrea Giammarchi
 * @site        www.devpro.it
 * @date                2005/11/26
 * @lastmod             2006/05/15 19:00 [modified stringBytes method and removed replace for UTF8 and \r\n]
 *          [add UTF8 var again, PHP strings if are not encoded with utf8_encode aren't compatible with this object]
 *          [Partially rewrote for a better stability and compatibility with Safari or KDE based browsers]
 *          [UTF-8 now has a native support, strings are converted automatically with ISO or UTF-8 charset]
 *
 * @specialthanks   Fabio Sutto, Kentaromiura, Kroc Camen, Cecile Maigrot, John C.Scott, Matteo Galli
 *
 * @version             2.2, tested on FF 1.0, 1.5, IE 5, 5.5, 6, 7 beta 2, Opera 8.5, Konqueror 3.5, Safari 2.0.3
 */
function PHP_Serializer(UTF8) {
    
    /** public methods */
    function serialize(v) {
        // returns serialized var
        var s;
        switch(v) {
            case null:
                s = "N;";
                break;
            default:
                s = this[this.__sc2s(v)] ? this[this.__sc2s(v)](v) : this[this.__sc2s(__o)](v);
                break;
        };
        return s;
    };
    
    function unserialize(s) {
        // returns unserialized var from a php serialized string
        __c = 0;
        __s = s;
        return this[__s.substr(__c, 1)]();
    };
    
    function stringBytes(s) {
        // returns the php lenght of a string (chars, not bytes)
        return s.length;
    };
    
    function stringBytesUTF8(s) {
        // returns the php lenght of a string (bytes, not chars)
        var     c, b = 0,
            l = s.length;
        while(l) {
            c = s.charCodeAt(--l);
            b += (c < 128) ? 1 : ((c < 2048) ? 2 : ((c < 65536) ? 3 : 4));
        };
        return b;
    };
    
    /** private methods */
    function __sc2s(v) {
        return v.constructor.toString();
    };
    
    function __sc2sKonqueror(v) {
        var f;
        switch(typeof(v)) {
            case ("string" || v instanceof String):
                f = "__sString";
                break;
            case ("number" || v instanceof Number):
                f = "__sNumber";
                break;
            case ("boolean" || v instanceof Boolean):
                f = "__sBoolean";
                break;
            case ("function" || v instanceof Function):
                f = "__sFunction";
                break;
            default:
                f = (v instanceof Array) ? "__sArray" : "__sObject";
                break;
        };
        return f;
    };
    
    function __sNConstructor(c) {
        return (c === "[function]" || c === "(Internal Function)");
    };
    
    function __sCommonAO(v) {
        var b, n,
            a = 0,
            s = [];
        for(b in v) {
            n = v[b] == null;
            if(n || v[b].constructor != Function) {
                s[a] = [
                    (!isNaN(b) && parseInt(b).toString() === b ? this.__sNumber(b) : this.__sString(b)),
                    (n ? "N;" : this[this.__sc2s(v[b])] ? this[this.__sc2s(v[b])](v[b]) : this[this.__sc2s(__o)](v[b]))
                ].join("");
                ++a;
            };
        };
        return [a, s.join("")];
    };
    
    function __sBoolean(v) {
        return ["b:", (v ? "1" : "0"), ";"].join("");
    };
    
    function __sNumber(v) {
        var     s = v.toString();
        return (s.indexOf(".") < 0 ? ["i:", s, ";"] : ["d:", s, ";"]).join("");
    };
    
    function __sString(v) {
        return ["s:", v.length, ":\"", v, "\";"].join("");
    };
    
    function __sStringUTF8(v) {
        return ["s:", this.stringBytes(v), ":\"", v, "\";"].join("");
    };
    
    function __sArray(v) {
        var     s = this.__sCommonAO(v);
        return ["a:", s[0], ":{", s[1], "}"].join("");
    };
    
    function __sObject(v) {
        var     o = this.__sc2s(v),
            n = o.substr(__n, (o.indexOf("(") - __n)),
            s = this.__sCommonAO(v);
        return ["O:", this.stringBytes(n), ":\"", n, "\":", s[0], ":{", s[1], "}"].join("");
    };
    
    function __sObjectIE7(v) {
        var     o = this.__sc2s(v),
            n = o.substr(__n, (o.indexOf("(") - __n)),
            s = this.__sCommonAO(v);
        if(n.charAt(0) === " ")
            n = n.substring(1);
        return ["O:", this.stringBytes(n), ":\"", n, "\":", s[0], ":{", s[1], "}"].join("");
    };
    
    function __sObjectKonqueror(v) {
        var o = v.constructor.toString(),
            n = this.__sNConstructor(o) ? "Object" : o.substr(__n, (o.indexOf("(") - __n)),
            s = this.__sCommonAO(v);
        return ["O:", this.stringBytes(n), ":\"", n, "\":", s[0], ":{", s[1], "}"].join("");
    };
    
    function __sFunction(v) {
        return "";
    };
    
    function __uCommonAO(tmp) {
        var a, k;
        ++__c;
        a = __s.indexOf(":", ++__c);
        k = parseInt(__s.substr(__c, (a - __c))) + 1;
        __c = a + 2;
        while(--k)
            tmp[this[__s.substr(__c, 1)]()] = this[__s.substr(__c, 1)]();
        return tmp;
    };

    function __uBoolean() {
        var b = __s.substr((__c + 2), 1) === "1" ? true : false;
        __c += 4;
        return b;
    };
    
    function __uNumber() {
        var sli = __s.indexOf(";", (__c + 1)) - 2,
            n = Number(__s.substr((__c + 2), (sli - __c)));
        __c = sli + 3;
        return n;
    };
    
    function __uStringUTF8() {
        var     c, sls, sli, vls,
            pos = 0;
        __c += 2;
        sls = __s.substr(__c, (__s.indexOf(":", __c) - __c));
        sli = parseInt(sls);
        vls = sls = __c + sls.length + 2;
        while(sli) {
            c = __s.charCodeAt(vls);
            pos += (c < 128) ? 1 : ((c < 2048) ? 2 : ((c < 65536) ? 3 : 4));
            ++vls;
            if(pos === sli)
                sli = 0;
        };
        pos = (vls - sls);
        __c = sls + pos + 2;
        return __s.substr(sls, pos);
    };
    
    function __uString() {
        var     sls, sli;
        __c += 2;
        sls = __s.substr(__c, (__s.indexOf(":", __c) - __c));
        sli = parseInt(sls);
        sls = __c + sls.length + 2;
        __c = sls + sli + 2;
        return __s.substr(sls, sli);
    };
    
    function __uArray() {
        var a = this.__uCommonAO([]);
        ++__c;
        return a;
    };
    
    function __uObject() {
        var     tmp = ["s", __s.substr(++__c, (__s.indexOf(":", (__c + 3)) - __c))].join(""),
            a = tmp.indexOf("\""),
            l = tmp.length - 2,
            o = tmp.substr((a + 1), (l - a));
        if(eval(["typeof(", o, ") === 'undefined'"].join("")))
            eval(["function ", o, "(){};"].join(""));
        __c += l;
        eval(["tmp = this.__uCommonAO(new ", o, "());"].join(""));
        ++__c;
        return tmp;
    };
    
    function __uNull() {
        __c += 2;
        return null;
    };
    
    function __constructorCutLength() {
        function ie7bugCheck(){};
        var o1 = new ie7bugCheck(),
            o2 = new Object(),
            c1 = __sc2s(o1),
            c2 = __sc2s(o2);
        if(c1.charAt(0) !== c2.charAt(0))
            __ie7 = true;
        return (__ie7 || c2.indexOf("(") !== 16) ? 9 : 10;
    };
    
    /** private variables */
    var     __c = 0,
        __ie7 = false,
        __b = __sNConstructor(__c.constructor.toString()),
        __n = __b ? 9 : __constructorCutLength(),
        __s = "",
        __a = [],
        __o = {},
        __f = function(){};
    
    /** public prototypes */
    PHP_Serializer.prototype.serialize = serialize;
    PHP_Serializer.prototype.unserialize = unserialize;
    PHP_Serializer.prototype.stringBytes = UTF8 ? stringBytesUTF8 : stringBytes;
    
    /** serialize: private prototypes */
    if(__b) { // Konqueror / Safari prototypes
        PHP_Serializer.prototype.__sc2s = __sc2sKonqueror;
        PHP_Serializer.prototype.__sNConstructor = __sNConstructor;
        PHP_Serializer.prototype.__sCommonAO = __sCommonAO;
        PHP_Serializer.prototype[__sc2sKonqueror(__b)] = __sBoolean;
        PHP_Serializer.prototype.__sNumber = 
        PHP_Serializer.prototype[__sc2sKonqueror(__n)] = __sNumber;
        PHP_Serializer.prototype.__sString = PHP_Serializer.prototype[__sc2sKonqueror(__s)] = UTF8 ? __sStringUTF8 : __sString;
        PHP_Serializer.prototype[__sc2sKonqueror(__a)] = __sArray;
        PHP_Serializer.prototype[__sc2sKonqueror(__o)] = __sObjectKonqueror;
        PHP_Serializer.prototype[__sc2sKonqueror(__f)] = __sFunction;
    }
    else { // FireFox, IE, Opera prototypes
        PHP_Serializer.prototype.__sc2s = __sc2s;
        PHP_Serializer.prototype.__sCommonAO = __sCommonAO;
        PHP_Serializer.prototype[__sc2s(__b)] = __sBoolean;
        PHP_Serializer.prototype.__sNumber = 
        PHP_Serializer.prototype[__sc2s(__n)] = __sNumber;
        PHP_Serializer.prototype.__sString = PHP_Serializer.prototype[__sc2s(__s)] = UTF8 ? __sStringUTF8 : __sString;
        PHP_Serializer.prototype[__sc2s(__a)] = __sArray;
        PHP_Serializer.prototype[__sc2s(__o)] = __ie7 ? __sObjectIE7 : __sObject;
        PHP_Serializer.prototype[__sc2s(__f)] = __sFunction;
    };
    
    /** unserialize: private prototypes */
    PHP_Serializer.prototype.__uCommonAO = __uCommonAO;
    PHP_Serializer.prototype.b = __uBoolean;
    PHP_Serializer.prototype.i =
    PHP_Serializer.prototype.d = __uNumber;
    PHP_Serializer.prototype.s = UTF8 ? __uStringUTF8 : __uString;
    PHP_Serializer.prototype.a = __uArray;
    PHP_Serializer.prototype.O = __uObject;
    PHP_Serializer.prototype.N = __uNull;
};

function htmlentities(texte) {
    texte = texte.replace(/"/g,'&quot;'); // 34 22
    texte = texte.replace(/&/g,'&amp;'); // 38 26
    texte = texte.replace(/\'/g,'&#039;'); // 39 27
    texte = texte.replace(/</g,'&lt;'); // 60 3C
    texte = texte.replace(/>/g,'&gt;'); // 62 3E
    texte = texte.replace(/\^/g,'&circ;'); // 94 5E
    texte = texte.replace(/‘/g,'&lsquo;'); // 145 91
    texte = texte.replace(/’/g,'&rsquo;'); // 146 92
    texte = texte.replace(/“/g,'&ldquo;'); // 147 93
    texte = texte.replace(/”/g,'&rdquo;'); // 148 94
    texte = texte.replace(/•/g,'&bull;'); // 149 95
    texte = texte.replace(/–/g,'&ndash;'); // 150 96
    texte = texte.replace(/—/g,'&mdash;'); // 151 97
    texte = texte.replace(/˜/g,'&tilde;'); // 152 98
    texte = texte.replace(/™/g,'&trade;'); // 153 99
    texte = texte.replace(/š/g,'&scaron;'); // 154 9A
    texte = texte.replace(/›/g,'&rsaquo;'); // 155 9B
    texte = texte.replace(/œ/g,'&oelig;'); // 156 9C
    texte = texte.replace(//g,'&#357;'); // 157 9D
    texte = texte.replace(/ž/g,'&#382;'); // 158 9E
    texte = texte.replace(/Ÿ/g,'&Yuml;'); // 159 9F
    texte = texte.replace(/¡/g,'&iexcl;'); // 161 A1
    texte = texte.replace(/¢/g,'&cent;'); // 162 A2
    texte = texte.replace(/£/g,'&pound;'); // 163 A3
    texte = texte.replace(/¥/g,'&yen;'); // 165 A5
    texte = texte.replace(/¦/g,'&brvbar;'); // 166 A6
    texte = texte.replace(/§/g,'&sect;'); // 167 A7
    texte = texte.replace(/¨/g,'&uml;'); // 168 A8
    texte = texte.replace(/©/g,'&copy;'); // 169 A9
    texte = texte.replace(/ª/g,'&ordf;'); // 170 AA
    texte = texte.replace(/«/g,'&laquo;'); // 171 AB
    texte = texte.replace(/¬/g,'&not;'); // 172 AC
    texte = texte.replace(/­/g,'&shy;'); // 173 AD
    texte = texte.replace(/®/g,'&reg;'); // 174 AE
    texte = texte.replace(/¯/g,'&macr;'); // 175 AF
    texte = texte.replace(/°/g,'&deg;'); // 176 B0
    texte = texte.replace(/±/g,'&plusmn;'); // 177 B1
    texte = texte.replace(/²/g,'&sup2;'); // 178 B2
    texte = texte.replace(/³/g,'&sup3;'); // 179 B3
    texte = texte.replace(/´/g,'&acute;'); // 180 B4
    texte = texte.replace(/µ/g,'&micro;'); // 181 B5
    texte = texte.replace(/¶/g,'&para'); // 182 B6
    texte = texte.replace(/·/g,'&middot;'); // 183 B7
    texte = texte.replace(/¸/g,'&cedil;'); // 184 B8
    texte = texte.replace(/¹/g,'&sup1;'); // 185 B9
    texte = texte.replace(/º/g,'&ordm;'); // 186 BA
    texte = texte.replace(/»/g,'&raquo;'); // 187 BB
    texte = texte.replace(/¼/g,'&frac14;'); // 188 BC
    texte = texte.replace(/½/g,'&frac12;'); // 189 BD
    texte = texte.replace(/¾/g,'&frac34;'); // 190 BE
    texte = texte.replace(/¿/g,'&iquest;'); // 191 BF
    texte = texte.replace(/À/g,'&Agrave;'); // 192 C0
    texte = texte.replace(/Á/g,'&Aacute;'); // 193 C1
    texte = texte.replace(/Â/g,'&Acirc;'); // 194 C2
    texte = texte.replace(/Ã/g,'&Atilde;'); // 195 C3
    texte = texte.replace(/Ä/g,'&Auml;'); // 196 C4
    texte = texte.replace(/Å/g,'&Aring;'); // 197 C5
    texte = texte.replace(/Æ/g,'&AElig;'); // 198 C6
    texte = texte.replace(/Ç/g,'&Ccedil;'); // 199 C7
    texte = texte.replace(/È/g,'&Egrave;'); // 200 C8
    texte = texte.replace(/É/g,'&Eacute;'); // 201 C9
    texte = texte.replace(/Ê/g,'&Ecirc;'); // 202 CA
    texte = texte.replace(/Ë/g,'&Euml;'); // 203 CB
    texte = texte.replace(/Ì/g,'&Igrave;'); // 204 CC
    texte = texte.replace(/Í/g,'&Iacute;'); // 205 CD
    texte = texte.replace(/Î/g,'&Icirc;'); // 206 CE
    texte = texte.replace(/Ï/g,'&Iuml;'); // 207 CF
    texte = texte.replace(/Ð/g,'&ETH;'); // 208 D0
    texte = texte.replace(/Ñ/g,'&Ntilde;'); // 209 D1
    texte = texte.replace(/Ò/g,'&Ograve;'); // 210 D2
    texte = texte.replace(/Ó/g,'&Oacute;'); // 211 D3
    texte = texte.replace(/Ô/g,'&Ocirc;'); // 212 D4
    texte = texte.replace(/Õ/g,'&Otilde;'); // 213 D5
    texte = texte.replace(/Ö/g,'&Ouml;'); // 214 D6
    texte = texte.replace(/×/g,'&times;'); // 215 D7
    texte = texte.replace(/Ø/g,'&Oslash;'); // 216 D8
    texte = texte.replace(/Ù/g,'&Ugrave;'); // 217 D9
    texte = texte.replace(/Ú/g,'&Uacute;'); // 218 DA
    texte = texte.replace(/Û/g,'&Ucirc;'); // 219 DB
    texte = texte.replace(/Ü/g,'&Uuml;'); // 220 DC
    texte = texte.replace(/Ý/g,'&Yacute;'); // 221 DD
    texte = texte.replace(/Þ/g,'&THORN;'); // 222 DE
    texte = texte.replace(/ß/g,'&szlig;'); // 223 DF
    texte = texte.replace(/à/g,'&agrave;'); // 224 E0
    texte = texte.replace(/á/g,'&aacute;'); // 225 E1
    texte = texte.replace(/â/g,'&acirc;'); // 226 E2
    texte = texte.replace(/ã/g,'&atilde;'); // 227 E3
    texte = texte.replace(/ä/g,'&auml;'); // 228 E4
    texte = texte.replace(/å/g,'&aring;'); // 229 E5
    texte = texte.replace(/æ/g,'&aelig;'); // 230 E6
    texte = texte.replace(/ç/g,'&ccedil;'); // 231 E7
    texte = texte.replace(/è/g,'&egrave;'); // 232 E8
    texte = texte.replace(/é/g,'&eacute;'); // 233 E9
    texte = texte.replace(/ê/g,'&ecirc;'); // 234 EA
    texte = texte.replace(/ë/g,'&euml;'); // 235 EB
    texte = texte.replace(/ì/g,'&igrave;'); // 236 EC
    texte = texte.replace(/í/g,'&iacute;'); // 237 ED
    texte = texte.replace(/î/g,'&icirc;'); // 238 EE
    texte = texte.replace(/ï/g,'&iuml;'); // 239 EF
    texte = texte.replace(/ð/g,'&eth;'); // 240 F0
    texte = texte.replace(/ñ/g,'&ntilde;'); // 241 F1
    texte = texte.replace(/ò/g,'&ograve;'); // 242 F2
    texte = texte.replace(/ó/g,'&oacute;'); // 243 F3
    texte = texte.replace(/ô/g,'&ocirc;'); // 244 F4
    texte = texte.replace(/õ/g,'&otilde;'); // 245 F5
    texte = texte.replace(/ö/g,'&ouml;'); // 246 F6
    texte = texte.replace(/÷/g,'&divide;'); // 247 F7
    texte = texte.replace(/ø/g,'&oslash;'); // 248 F8
    texte = texte.replace(/ù/g,'&ugrave;'); // 249 F9
    texte = texte.replace(/ú/g,'&uacute;'); // 250 FA
    texte = texte.replace(/û/g,'&ucirc;'); // 251 FB
    texte = texte.replace(/ü/g,'&uuml;'); // 252 FC
    texte = texte.replace(/ý/g,'&yacute;'); // 253 FD
    texte = texte.replace(/þ/g,'&thorn;'); // 254 FE
    texte = texte.replace(/ÿ/g,'&yuml;'); // 255 FF
    return texte;
}