﻿function checkForm(loginForm) {
    var ErrMsg = "Informations incorrectes :\n";
    var lenInit = ErrMsg.length;
    if ((isEmpty(loginForm.numSmile) == false) && (isNlength(loginForm.numSmile, 17) == false)) ErrMsg = 'Informations incorrectes :\n - Votre n° de carte (17 chiffres)\n - Votre carte doit commencer par 29090109\n - Votre code secret (entre 4 et 11 caractères)\n';
    if (!checkCarteSmiles(loginForm.numSmile)) ErrMsg = 'Informations incorrectes :\n - Votre n° de carte (17 chiffres)\n - Votre carte doit commencer par 29090109\n - Votre code secret (entre 4 et 11 caractères)\n';
    if ((isEmpty(loginForm.pwd) == true) || loginForm.pwd.value.length < 4 || loginForm.pwd.value.length > 11) ErrMsg = 'Informations incorrectes :\n - Votre n° de carte (17 chiffres)\n - Votre carte doit commencer par 29090109\n - Votre code secret (entre 4 et 11 caractères)\n';

    if (ErrMsg.length > lenInit) alert(ErrMsg);
    else loginForm.submit();
}
function checkCarteSmiles(elm) {
    var strcarte = elm.value + "";
    var re = /^29090109[0-9]{9}/gi;
    if (strcarte.search(re) == 0) {
        return true;
    }
    return false;
}
// Is it a number?
function isfrmNumber(elm) {
    var elmstr = elm.value + "";
    for (var i = 0; i < elmstr.length; i++) {
        if (elmstr.charAt(i) < "0" || elmstr.charAt(i) > "9") return false;
    }
    return true;
}

// Is the variable empty ?
function isEmpty(elm) {
    var elmstr = elm.value + "";
    if (elmstr.length == 0) return true;
    return false;
}

// Is the number's length exactly N ?
function isNlength(elm, N) {
    var elmstr = elm.value + "";
    if (elmstr.length != N) return false;
    for (var i = 0; i < elmstr.length; i++) {
        if (elmstr.charAt(i) < "0" || elmstr.charAt(i) > "9") return false;
    }
    return true;
}

var $n = {
    /* 	$n.hasAttr : retourne true si l'element passe en parametre correspond a tous les attributs passes, on peut aussi donner des attributs que l'on ne veut pas, afin de filtrer tous les elements
    ex : if ($n.hasAttr(div, {nodeName:"div", className:"foobar"), {className:"idontwant"} ) doStuff();
    ici on recherche tous les DIV qui on la classe "foobar", mais on ne prend pas ceux qui ont la classe "idontwant" ex : <div class="foobar idontwant"> ne sera pas recupere.
    */
    hasAttr: function(n, a, not) {
        if (n.nodeType != 1 && not && this.check(n, not)) return false;
        if (this.check(n, a)) return true;
        return false;
    },
    check: function(n, attr) {
        for (var i in attr) {
            if (!attr[i].test(n[i]))
                return false;
        }
        return true;
    },
    setAttr: function(attr) {
        for (var i in attr) {
            attr[i] = (typeof (attr[i]) == 'string') ? new RegExp("\\b" + attr[i] + "\\b") : attr[i];
        }
        return attr;
    },
    /* getByTagName : equivalent a element.getElementsByTagName, mais compatible avec IE5 et IE5.5 pour l'histoire du "*" */
    getByTagName: function(n, tag) {
        return (tag == "*" && n.all) ? n.all : n.getElementsByTagName(tag);
    },
    /* fonction qui retourne le premier element correspondant aux attributs donnes */
    node: function(n, a, not) {
        return this.nodes(n, a, not, true);
    },
    /* fonction qui retourne tous les elements correspondant selon "a" */
    nodes: function(n, a, not, oneNode, arrElms) {
        var aRetElms = [];
        if (!a) a = {};
        if (typeof a == "string") a = { nodeName: a }; //si une chaine de caracteres passee en parametre, cela signifie qu'on ne veut que recuperer des tags
        if (a.nodeName && a.nodeName == "*") delete a.nodeName;
        if (a.nodeName instanceof RegExp) {
            var elms = this.getByTagName(n, "*");
        } else {
            var elms = arrElms || this.getByTagName(n, (a.nodeName || "*"));
        }
        if (elms.length > 0) delete a.nodeName;
        a = this.setAttr(a); not = this.setAttr(not);
        for (var i = 0; i < elms.length; i++) {
            var x = elms[i];
            if (this.hasAttr(x, a, not)) {
                if (oneNode) return x;
                else aRetElms.push(x);
            }
        }
        if (oneNode) return null;
        return aRetElms;
    },
    /* childs : retourne tous les noeuds enfants de l'element  */
    childs: function(n, a, not) {
        return this.nodes(n, a, not, false, n.childNodes);
    },
    firstChild: function(n, a, not) {
        return this.nodes(n, a, not, true, n.childNodes);
    },
    lastChild: function(n, a, not) {
        var node = this.nodes(n, a, not, false, n.childNodes);
        return node[node.length - 1];
    },
    move: function(n, a, not, action) {
        a = this.setAttr(a); not = this.setAttr(not);
        do {
            n = n[action];
        } while (!this.hasAttr(n, a, not));
        return n;
    },
    previous: function(n, a, not) {
        return this.move(n, a, not, "previousSibling");
    },
    next: function(n, a, not) {
        return this.move(n, a, not, "nextSibling");
    },
    parent: function(n, a, not) {
        return this.move(n, a, not, "parentNode");
    }

}

if (!window.$extend) {
    function $extend(original, extended) {
        for (var key in (extended || {})) original[key] = extended[key];
        return original;
    };
}

function $protoTypeExtend(original, extended) {
    for (var key in (extended || {})) {
        if (!original[key]) original[key] = extended[key];
    }
    return original;
};

/* Array extend */
$protoTypeExtend(Array.prototype, {
    forEach: function(fun) {
        var len = this.length;
        if (typeof fun != "function") throw new TypeError();
        var thisp = arguments[1];
        for (var i = 0; i < len; i++) {
            if (i in this)
                fun.call(thisp, this[i], i, this);
        }
    },
    each: function(fun) {
        this.forEach.call(this, fun);
    }
});

/* String Extends */
$protoTypeExtend(String.prototype, {
    trim: function() { return this.replace(/^\s+|\s+$/g, '') }
});
var FW = {};


/* browser : objet browser contenant des booleens propres aux navigateurs, tous ne sont pas integres car pas utiles en temps normal
@use: if (FW.browser.ie) // msie
*/
FW.browser = {
    ie: (document.all && window.print && !window.opera) || false,
    opera: window.opera || false
};
FW.browser.ie6 = (FW.browser.ie && /MSIE [56]/.test(navigator.userAgent)) || false;
FW.browser.ieQuirks = (FW.browser.ie6 && document.compatMode && document.compatMode == "BackCompat") || false;
FW.$ = function() {
    var aArgs = arguments;
    if (aArgs.length > 1 && typeof aArgs[1] == 'string') {
        return new FW.Wrap(typeof aArgs[0] == 'string' ?
					document.getElementById(aArgs[0]).getElementsByTagName(aArgs[1]) :
					aArgs[0].getElementsByTagName(aArgs[1])
				);
    }
    else switch (typeof aArgs[0]) {
        case 'string':
            return new FW.Wrap(document.getElementById(aArgs[0]));
        case 'object':
            return new FW.Wrap(aArgs[0]);
    }
    return false;
}


/* FW.Wrap : objet associe a un DOM Element, surlequel toutes les methodes s'appliquement sur l'element associe et retourneront ce wrapper
ex : FW.$(elm).addClass('pouet').addEvent('click', function() {}).removeClass('pouet');
*/
FW.Wrap = function(el) {
    this.el = el;
}
FW.Wrap.prototype = {
    /* === className functions ===  */
    removeClass: function(sClass) {
        var rep = this.el.className.match(' ' + sClass) ? ' ' + sClass : sClass;
        this.el.className = this.el.className.replace(rep, '');
        return this;
    },
    addClass: function(sClass) {
        if (!this.hasClass(sClass))
            this.el.className += this.el.className ? ' ' + sClass : sClass;
        return this;
    },
    swapClass: function(sClass1, sClass2) {
        this.el.className = this.hasClass(sClass1) ?
					this.el.className.replace(sClass1, sClass2) :
					this.el.className.replace(sClass2, sClass1);
        return this;
    },
    toggleClass: function(sClass) {
        this.hasClass(sClass) ? this.removeClass(sClass) : this.addClass(sClass);
        return this;
    },
    hasClass: function(sClass) {
        return typeof sClass == 'string' ?
					new RegExp('\\b' + sClass + '\\b').test(this.el.className) :
					sClass.test(this.el.className);
    },

    /* === events Functions ===  */
    addEvent: function(evType, func, bCapture) {
        if (evType == 'domready' && this.el == window)
            FW.event.domready(func);
        document.addEventListener ?
					this.el.addEventListener(evType, func, bCapture || false) :
					this.el.attachEvent ?
						this.el.attachEvent('on' + evType, func) :
						false;
        return this;
    },
    // Suppression d'un gestionnaire d'evenement sur un element pour un evenement donne
    removeEvent: function(sEvType, fn, bCapture) {
        document.addEventListener ?
					this.el.removeEventListener(sEvType, fn, bCapture || false) :
					this.el.detachEvent ?
						this.el.detachEvent('on' + sEvType, fn) :
						false;
        return this;
    },

    /* === dom functions ===  */
    getElement: function(attr, not) {
        var el = $n.node(this.el, attr, not);
        return el ? new FW.Wrap(el) : null;
    },
    getElements: function(attr, not) {
        var els = $n.nodes(this.el, attr, not);
        return els;
    },
    getParent: function(attr, not) {
        var el = $n.parent(this.el, attr, not);
        return el ? new FW.Wrap(el) : null;
    },
    getNext: function(attr, not) {
        var el = $n.next(this.el, attr, not);
        return el ? new FW.Wrap(el) : null;
    },

    /* styles CSS functions */
    getStyle: function(strCssRule) {
        var oElm = this.el;
        var strValue = "";
        if (document.defaultView && document.defaultView.getComputedStyle) {
            try {
                strValue = document.defaultView.getComputedStyle(oElm, null).getPropertyValue(strCssRule);
            }
            catch (e) { strValue = ""; }
        }
        else if (oElm.currentStyle) {
            try {
                strCssRule = strCssRule.replace(/\-(\w)/g, function(strMatch, p1) {
                    return p1.toUpperCase();
                });
                strValue = oElm.currentStyle[strCssRule];
            } catch (e) {
                strValue = "";
            }
        }
        return strValue;
    },

    getIntStyle: function(strCSSRule) {
        var val = parseInt(this.getStyle(strCSSRule));
        if (isNaN(val)) val = 0;
        return val;
    },
    getVStyle: function(elm) {
        return FW.browser.ieQuirks ?
					0 :
					this.getIntStyle("padding-top") + this.getIntStyle("padding-bottom") +
					this.getIntStyle("border-top-width") + this.getIntStyle("border-bottom-width");
    },
    // Retourne la somme de tous les styles horizontaux appliques (border-width+padding)
    getHStyle: function(elm) {
        return FW.browser.ieQuirks ?
					0 :
					this.getIntStyle("padding-left") + this.getIntStyle("padding-right") +
					this.getIntStyle("border-left-width") + this.getIntStyle("border-right-width");
    },

    getPosition: function(overflown) {
        var obj = this.el;
        var curleft = 0,
					 curtop = 0;
        if (obj.offsetParent) {
            do {
                curleft += obj.offsetLeft + (overflown ? -obj.scrollLeft : 0);
                curtop += obj.offsetTop + (overflown ? -obj.scrollTop : 0);
            } while (obj = obj.offsetParent);
            return { x: curleft, y: curtop };
        }
    }
}

/* FW.event : extendeur de l'objet event. Dans un premier temps ce ne seront que des fonctions liées aux events */
FW.event = {
    domready: function(fn) {
        // Internet Explorer 
        if (window.attachEvent) {
            document.write('<script id="ieScriptLoad" defer src="//:"><\/script>');
            document.getElementById('ieScriptLoad').onreadystatechange = function() {
                if (this.readyState == 'complete')
                    FW.event.init(fn);
            };
        }
        // Mozilla/Opera 9 
        if (document.addEventListener)
            document.addEventListener('DOMContentLoaded', function() { FW.event.init(fn); }, false);
        // Safari 
        if (navigator.userAgent.search(/WebKit/i) != -1) {
            FW.event.loadTimer = setInterval(function() {
                if (document.readyState.search(/loaded|complete/i) != -1)
                    FW.event.init(fn);
            }, 10);
        }
        // Other web browsers
        FW.$(window).addEvent('load', function() { FW.event.init(fn); });
    },

    // Initialise le script
    init: function(fn) {
        if (arguments.callee.done) return;
        arguments.callee.done = true;
        if (FW.event.loadTimer) clearInterval(FW.event.loadTimer);
        fn();
    },

    // Annulation de la propagation d'un evenement et de l'action par defaut d'un element
    stop: function(e) {
        if (e && e.stopPropagation && e.preventDefault) {
            e.stopPropagation();
            e.preventDefault();
        }
        else if (e && window.event) {
            window.event.cancelBubble = true;
            window.event.returnValue = false;
        }
        return false; // Indispensable pour Safari
    },
    // Retourne la source de l'evenement
    getSrc: function(e) {
        return e.target || e.srcElement;
    },
    relSrc: function(e) {
        switch (e.type) {
            case 'mouseover': // Retourne l'element survole precedent l'element source de l'evenement
                return e.relatedTarget || e.fromElement;
            case 'mouseout': // Retourne l'element survole suivant l'element source de l'evenement
                return e.relatedTarget || e.toElement;
        }
    }
}


var $layer = {
    options: {
        id: 'insidePopup',
        templateHTML: [
					'<div class="layerDeco">',
						'<div class="insidePopupContent">',
							'<a href="#" class="close popupCloseButton">__CLOSINGWORDING__</a>',
							'<div style="zoom:1; position:relative">',
								'__CONTENT__',
							'</div>',
						'</div>',
					'</div>'
				].join(''),
        styles: {
            width: '400px'
        },
        position: 'center', // pour l'instant il ne prend que center et sera developpé plus tard pour prendre les valeurs left/right/center et top/bottom/center avec les combo 'left top', 'right top' etc, etc 
        mask: false, //mask sous le  layer
        maskPosition: null, // element HTML sur lequel le mask s'appliquera, si null, le parent le plus haut sera pris (<body>)
        maskClickClose: false, // click sur le mask ferme le layer
        content: '', //code HTML pour remplir le layer,
        contentFrom: null, //element contenant du code HTML pour l'afficher dedans
        parent: null, //le parent du layer, par defaut c'est document.body
        fixLayerOnParent: false, // si on veut placer le layer au dessus d'un élément, on peut spécifier si on met le position:relative ou pas
        className: "loginPopin", //une classe CSS posée sur la popup afin de customiser la popup si nécessaire
        timerInterval: 100,
        offsetTop: 10,
        offsetLeft: 10,
        closingWording: ''

    },
    currentOptions: {},
    resetOptions: function() { this.currentOptions = {}; $extend(this.currentOptions, this.options); },
    lastPositions: {},
    open: function(options) {
        var _self = this;
        this.close();
        this.resetOptions();
        if (options.styles && options.styles.opacity != null) options.styles.filter = 'alpha(opacity=' + options.styles.opacity * 100 + ')'; // compatible IE
        if (options.contentFrom != null) {
            options.contentFrom = this.z.$(options.contentFrom).el;
            options.content = options.contentFrom.innerHTML
        }

        for (var i in options) {
            if (i != 'styles') this.currentOptions[i] = options[i];
        }
        if (options.styles)
            for (var i in options.styles) {
            this.currentOptions.styles[i] = options.styles[i];
        }

        this.options.lastScrollTop = this.options.offsetTop;
        this.options.lastScrollLeft = this.options.offsetLeft;

        if (!FW.$(this.currentOptions.id).el) this.createLayer();
        if (this.currentOptions.mask) this.createMask();
        this.layer.innerHTML = this.layer.innerHTML.replace(/__CONTENT__/g, this.currentOptions.content).replace(/__CLOSINGWORDING__/, this.currentOptions.closingWording);
        this.correctIE(this.layer);
        this.initActionsButtonsOnLayer();

        this.layer.style.width = this.layer.clientWidth - FW.$(this.layer).getHStyle() + 'px';
        this.setSize();
        this.setPosition();
        this.timerRefresh = setInterval(function() {
            _self.refreshSizeAndPosition()
        }, this.options.timerInterval)
        this.lastPositions = {
            scrollLeft: document.documentElement.scrollLeft,
            scrollTop: document.documentElement.scrollTop
        }
        this.refreshSizeAndPosition();
        this.layer.style.visibility = 'visible';


    },
    close: function() {
        if (this.timerRefresh) clearInterval(this.timerRefresh);
        var elmW = FW.$(this.currentOptions.id);
        if (elmW.el) {
            elmW.el.parentNode.removeChild(elmW.el);
        }
        if (this.currentOptions.parent)
            this.currentOptions.parent.style.height = '';
        if (this.mask) {
            if (this.mask.$layerIframe)
                this.mask.$layerIframe.parentNode.removeChild(this.mask.$layerIframe);
            this.mask.parentNode.removeChild(this.mask);
        }
        try {
            delete this.layer;
            delete this.content;
            delete this.mask;
        } catch (e) { }
        if (typeof window.CollectGarbage == 'function') {
            CollectGarbage();
        }
    },
    createLayer: function() {
        var layer = document.createElement('div');
        layer.className += ' ' + this.currentOptions.className || "";
        layer.id = this.currentOptions.id;
        $extend(layer.style, this.currentOptions.styles);
        $extend(layer.style, { left: 0, top: 0, display: 'block', visibility: 'hidden' });
        layer.innerHTML = this.currentOptions.templateHTML;
        if (this.currentOptions.over) {
            this.currentOptions.parent.appendChild(layer);
            if (this.currentOptions.fixLayerOnParent) {
                this.currentOptions.parent.style.position = 'relative';
            } else
                this.currentOptions.position = 'byElement';
        } else
            document.body.appendChild(layer);
        this.layer = layer;
        //FW.$(this.layer).addEvent('click', function(e) {FW.event.stop(e);});
        this.layerContent = FW.$(layer).getElement({ nodeName: 'div', className: 'insidePopupContent' }).el;
        return this.layer;
    },
    createMask: function() {
        var mask = document.createElement('div');
        this.mask = mask;
        mask.id = 'insidePopupMask';
        this.correctIE(mask);

        document.body.appendChild(mask);
        if (this.options.maskClickClose) {
            FW.$(mask).addEvent('click', function(e) {
                FW.event.stop(e);
                $layer.close();
            })
        }
    },
    setPosition: function() {
        var styles = {};
        var currStyles = this.currentOptions.styles;
        switch (this.currentOptions.position) {
            case 'center':
                var parentToUse = window.opera ? document.body : document.documentElement;
                var top = (parentToUse.clientHeight - this.layer.offsetHeight) / 2 + document.documentElement.scrollTop;
                var left = (parentToUse.clientWidth - this.layer.offsetWidth) / 2 + document.documentElement.scrollLeft;
                //opera.postError(top+','+left);
                if (this.layer.offsetHeight > parentToUse.clientHeight)
                    top = (this.lastPositions.scrollTop || 0) + this.options.offsetTop;
                else
                    this.lastPositions.scrollTop = document.documentElement.scrollTop;
                if (this.layer.offsetWidth > parentToUse.clientWidth)
                    left = (this.lastPositions.scrollLeft || 0) + this.options.offsetLeft;
                else
                    this.lastPositions.scrollLeft = document.documentElement.scrollLeft
                styles = {
                    left: left + 'px',
                    top: top + 'px'
                };
                break;
            case 'user':
                styles = {
                    left: currStyles.left,
                    top: currStyles.top
                }
                break;
            case 'byElement':
                styles = {
                    left: this.currentOptions.over.offsetLeft + 'px',
                    top: this.currentOptions.over.offsetTop + 'px'
                };
                break;
            default:
                break;
        }
        $extend(this.layer.style, styles);
    },
    setSize: function() {
        if (!isNaN(parseInt(this.currentOptions.styles.height))) {
            this.layer.style.height = 'auto';
            var inside = FW.$(this.layer).getElement({ nodeName: 'div', className: 'insidePopupContent' }).el;
            if (this.currentOptions.parent && inside && FW.$(inside).getStyle('position') != 'absolute' && inside.offsetHeight > this.currentOptions.parent.offsetHeight) {
                this.currentOptions.parent.style.height = this.layer.offsetHeight + 'px';
            }
            if (this.layer.offsetHeight < parseInt(this.currentOptions.styles.height))
                this.layer.style.height = parseInt(this.currentOptions.styles.height) - FW.$(this.layer).getVStyle(this.layer) + 'px';
        }
    },
    refreshSizeAndPosition: function() {
        var parentToUse = window.opera ? document.body : document.documentElement;
        if (
					(this.mask && this.mask.offsetHeight < this.layer.offsetHeight) ||
					this.lastPositions.layerHeight != this.layer.offsetHeight ||
					this.lastPositions.width != parentToUse.clientWidth ||
					this.lastPositions.height != parentToUse.clientHeight ||
					this.lastPositions.scrollLeft != document.documentElement.scrollLeft ||
					this.lastPositions.scrollTop != document.documentElement.scrollTop
				) {
            this.setPosition();
            if (this.mask && (this.lastPositions.width != document.documentElement.clientWidth || this.lastPositions.height != document.documentElement.clientHeight)) {
                var height = (document.body.clientHeight < document.documentElement.clientHeight ?
										document.documentElement.clientHeight :
											(document.body.scrollHeight > document.documentElement.scrollHeight ?
												document.body.scrollHeight : document.documentElement.scrollHeight
											)
									)
                if (!height) height = document.documentElement.scrollHeight;
                $extend(this.mask.style, {
                    height: height + 'px',
                    width: document.documentElement.scrollWidth > document.documentElement.clientWidth ? document.documentElement.scrollWidth + 'px' : "100%"
                });
            }
            this.lastPositions.layerHeight = this.layer.offsetHeight;
            this.lastPositions.width = parentToUse.clientWidth;
            this.lastPositions.height = parentToUse.clientHeight;

            this.correctIE(this.layer);
            this.correctIE(this.mask);

        }
    },
    initActionsButtonsOnLayer: function() {
        var closeButtons = FW.$(this.layer).getElements({ className: '(close|insidePopupCloseButton)' });
        closeButtons.each(function(btn) {
            btn.onclick = function() {
                $layer.close();
                return false;
            }
        })
    },
    correctIE: function(element) {
        if (!element) return;
        if (!element.$layerIframe && FW.browser.ie6) {
            var ifr = document.createElement('<iframe style="filter:alpha(opacity=0);width:100%;height:100%;position:absolute;top:0;left:0;z-index:-1;">');
            element.$layerIframe = (this.options.maskClickClose && element == this.mask ? document.body : element).appendChild(ifr);
            if (element == this.mask)
                element.$layerIframe.style.zIndex = 1;
        }
        if (element.$layerIframe)
            element.$layerIframe.style.height = element.offsetHeight + 'px';
    },

    z: {
        $: function(id) {
            return typeof (id) == 'string' ? document.getElementById(id) : id;
        },
        //simule le each/forEach sur array
        each: function(array, fun) {
            var len = array.length;
            for (var i = 0; i < len; i++) {
                if (i in array) {
                    fun.call(array, array[i], i, array);
                }
            }
            return array;
        },
        addEvent: function(obj, type, fn, useCapture) {
            if (obj.addEventListener) {
                obj.addEventListener(type, fn, useCapture || false);
            } 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]);
            }
        },
        stopEvent: function(e) {
            if (e && e.stopPropagation && e.preventDefault) {
                e.stopPropagation();
                e.preventDefault();
            }
            else if (e && window.event) {
                window.event.cancelBubble = true;
                window.event.returnValue = false;
            }
            return false; // Indispensable pour Safari
        },
        getElement: function(elm, selector) {
            var elms = this.getElements(elm, selector);
            return elms.length > 0 ? elms[0] : null;
        },
        getElements: function(elm, selector) {
            var sel = selector.split('.');
            var className = '';
            var classNameRe = null
            if (sel.length == 1) {
                var tagName = sel[0];
            } else {
                var tagName = sel[0] == '' ? '*' : sel[0];
                className = sel[1];
                classNameRe = new RegExp('\\b' + className + '\\b');
            }
            var nodes = elm.getElementsByTagName(tagName);
            var aElms = [];
            for (var i = 0; i < nodes.length; i++) {
                if (!classNameRe) {
                    aElms.push(nodes[i]);
                } else {
                    if (classNameRe.test(nodes[i].className))
                        aElms.push(nodes[i]);
                }
            }
            return aElms;
        }
    }
}

function getParameterByName(name) {
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regexS = "[\\?&]" + name + "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec(window.location.href);
    if (results == null)
        return "";
    else
        return results[1];
}

function getNumSmileField() {
    var numSmile = getParameterByName('numsmile');
    var numSmileStart = numSmile.substr(0, 8);
    if ((null != numSmile) && ('29090109' == numSmileStart))
        return '<span>' + numSmile + '</span><input id="nc" name="numSmile" maxlength="17" type="hidden" value="' + numSmile + '">';
    else
        return '<span><input id="nc" name="' + numSmile + '" maxlength="17" type="text" value="29090109" style="color:black"></span>';
}

function displaySemiLoginForm(rootFormUrl, forgotPasswordUrl, forgotPasswordText) {
    var semiLoginMode = getParameterByName('l')
    if ((null != semiLoginMode) && ('true' == semiLoginMode.toLowerCase())) {
        $layer.open({
            content: [
					'<div id="semiLayerForm" class="layerCtt">',
						'<p class="accroche">Veuillez saisir votre <span class="color">code secret</span> dans le champ ci-dessous, vous serez ensuite automatiquement redirigé vers la page correspondante.</p>',
						'<div class="layerForm">',
							'<form name="semiloginForm" method="post" action="' + rootFormUrl + '">',
								'<p class="numCarte"><label>Numéro de carte :</label>',
								getNumSmileField(),
								'</p><p class="passwd"><label>Code secret : </label>',
								'<span><input maxlength="11" id="pw" name="pwd" type="password"><br/>',
									'<a href="' + forgotPasswordUrl + '" id="lnForgotPasswordLayer" class="forgotCode  souligne ">' + forgotPasswordText + '</a></span></p>',
								'<p class="bouton"><a href="javascript:checkForm(document.semiloginForm);"><span>OK</span></a></p>',
							'</form>',
						'</div>',
					'</div>'
				].join(""),
            mask: true
        });
    }
}

function bindHelpPopup(imgName) {
    $layer.open({
        content: [
					'<div id="" class="layerCtt">',
							'<div class="txtC  helpText">',
						'<p>Pour vous connecter sur le site, saisissez</p>',
						'<p><strong>le numéro indiqué sur votre Carte de Fidélité</strong></p>',
						'<img src="/img/' + imgName + '.png" alt="" />',
						"<p>puis votre code secret. <br />En cas d'oubli, utilisez la fonction Code secret oublié ?</p>",
						'</div>',
					'</div>'
				].join(""),
        mask: true
    });
}