(function($) {
    
    var W = this, D = this.document;
    
    var isHostMethod = function(o, p) {
        var t = typeof o[p];
        return t == 'function' || !!(t == 'object' && o[p]) || t == 'unknown';
    };
    
    var EZFaceStats = {
        saveLook: 'type=tagPageView;category=Look_Ez_Face;tag=Save_Look_Ez_Face',
        saveConfirmLook: 'type=tagPageView;category=Look_Ez_Face;tag=Save_Confirm_Look_Ez_Face',
        sendLook: 'type=tagPageView;category=Look_Ez_Face;tag=Send_To_A_Friend_Look_Ez_Face',
        sendConfirmLook: 'type=tagPageView;category=Look_Ez_Face;tag=Send_To_A_Friend_Confirm_Look_Ez_Face',
        
        signInEZFace: 'type=tagPageView;category=Subscription_Ez_Face;tag=Login_Subscription_Ez_Face',        
        forgottenPassword: 'type=tagPageView;category=Subscription_Ez_Face;tag=Forgotten_Password_Subscription_Ez_Face',
        forgottenPasswordConfirm: 'type=tagPageView;category=Subscription_Ez_Face;tag=Forgotten_Password_Confirm_Subscription_Ez_Face',
        forgottenPasswordError: 'type=tagPageView;category=Subscription_Ez_Face;tag=Forgotten_Password_Error_Subscription_Ez_Face'
        
    };
    
    LOP.openEZFacePopin = function(url, id) {
        LOP.popinMaskType = 'coreMaskEZFacePopin';
        LOP.popinProcessHTML = false;
        
        LOP.popins.add({
            url: url,
            id: id,
            refresh: true
        });
    };
    
    LOP.openEZFacePage = function(url) {
        var isIframe = (W.parent.frames.length > 0) ? true : false;
        if(isIframe == true) {
            W.open(url, 'minisiteEZFacePopup');
        } else {
            W.location.href =  url;
        }
    };
    
    var urlWithoutMakeup, urlWithMakeup;
    LOP.setEmailPhotos = function(withoutMakeup, withMakeup) {
        urlWithoutMakeup = withoutMakeup;
        urlWithMakeup = withMakeup;
    };
    
    LOP.addProductToFavorite = function(sku) {
        $.get('/_fr/_fr/tools/add-to-favorites.aspx?type=product&code=' + sku);
    };
    
    var swf;
    var setFlashElm = function() {
        swf = swf || D.getElementById('swfEZFace');
    };
    
    var setBodyIdForPopin = function(rm) {
        D.body.id = rm ? '' : 'popinEZFace';
    };
    
    var validateEmail = function(field) {
        if (field.isEmpty()) {
            return l10n.errorMsg.required.email;
        } else if (!field.isMatching('email')) {
            return l10n.errorMsg.invalid.email;
        }
    };
    
    var updateMySignIn = function(logged) {
        if(logged) {
            $('#mySignIn')
                .html(l10n.html.headerLoggedIn)
                .attr('id', 'mySignedIn')
                .find('a')
                    .click(LOP.logoutEZFace);
        } else {
            $('#mySignedIn')
                .html(l10n.html.headerLoggedOut)
                .attr('id', 'mySignIn')
                .find('#signIn')
                    .click(function(e) {
                        e.preventDefault();
                        LOP.openExpandVIP();
                    });
        }
    };
    
    // Login
    var updateExpandVIP = function() {
        $.get(l10n.url.popinExpandVIP + '?_=' + (new Date()).getTime(), function(response) {
            if(BOX.form('signInForm')) {
                BOX.form('signInForm', true);
                LOP.tooltips.remove('#accessVIP', 'formError');
            }
            
            $('#expandVIPContent').html(response);
            
            if(response.indexOf('signInForm') > -1) {
                BOX.form('signInForm').text('login').setValue('');
                
                BOX.form('signInForm').addValidation(function(form) {
                    form.text('login').mustValidate(function(field) {
                        if (field.isEmpty()) {
                            return l10n.errorMsg.required.email;
                        } else if (!field.isMatching('email')) {
                            return l10n.errorMsg.invalid.email;
                        }
                    });
                        
                    form.text('password').mustValidate(function(field) {
                        if (field.isEmpty()) {
                            return l10n.errorMsg.required.pwd;
                        } else if (!field.isMatching('password')) {
                            return l10n.errorMsg.invalid.pwd;
                        }
                    });
                    
                    return l10n.errorMsg.form.plural;
                }, 'p.save').addListeners({
                    'formError': {
                        fn: LOP.addFormError
                    },
                    'formValid': {
                        'fn': function(e, originalEvent) {
                            originalEvent.preventDefault();
                            LOP.removeFormError.call(e.owner, e, originalEvent);
                            $('#signInForm p.loading').css('display','block');
                            LOP.wsUserLogin({
                                'login':BOX.form('signInForm').text('login').getValue(),
                                'password':BOX.form('signInForm').text('password').getValue(),
                                'onSuccess': function() {
                                    $.ajax({
                                        type:"POST",
                                        url:"/_fr/_fr/club-vip/registrationPersonalInfos.aspx",
                                        success:function(data){
                                            LOP.execStatCM(data);
                                            updateExpandVIP();
                                        },
                                        error:function(data){
                                            $('#signInForm p.loading').css('display','none');
                                            $('#signInFormError').html(l10n.errorMsg.invalid.login).css('display', 'block');
                                        }
                                    });
                                },
                                'onError': function() {
                                    $('#signInForm p.loading').css('display','none')
                                    $('#signInFormError').html(l10n.errorMsg.invalid.login).css('display', 'block');
                                }
                            });
                        }
                    },
                    'fieldError': {
                        'fn': LOP.manageFieldError
                    },
                    'fieldValid': {
                        'fn': LOP.manageFieldError
                    }
                });
                
                LOP.tooltips.add({
                    selector: '#accessVIP:hover',
                    ruleNamespace: 'formError',
                    rule: function(el) {
                        if (el.nodeName.toLowerCase() == 'img') {
                            this.setHTML(el.alt).setAttributeCache(el, 'alt').setId('toolTipError');
                        } 
                    }
                });
            }
        });
    };
    
    LOP.logoutEZFace = function(e) {
        if(e) {
            e.preventDefault();
        }
        LOP.wsUserLogout({
            onSuccess: function() {
                updateMySignIn(false);
                updateExpandVIP();
                setFlashElm();
                $.cookie('logout', 'true', {expires: 0.1});
                if(swf && isHostMethod(swf, 'onLogoutComplete')) {
                    swf.onLogoutComplete();
                }
            }
        });
    };
    
    var loginEZFace = function() {
        LOP.iconErrorSrc = l10n.url.errorIconEZFace;
        setBodyIdForPopin();
        
        LOP.execStatCM(EZFaceStats.signInEZFace);
        
        BOX.form('loginEZFaceForm').addValidation(function(form) {
            form.text('emailEZFace').mustValidate(validateEmail);
            
            form.text('pwdEZFace').mustValidate(function(field) {
                if (field.isEmpty()) {
                    return l10n.errorMsg.required.pwd;
                } else if (!field.isMatching('password')) {
                    return l10n.errorMsg.invalid.pwd;
                }
            });
            
            return l10n.errorMsg.form.plural;
        }, 'li.save').addListeners({
            'formError': {
                'fn': LOP.addFormError
            },
            'formValid': {
                'fn': function(e, domEvt) {
                    domEvt.preventDefault();
                    LOP.removeFormError.call(e.owner, e, domEvt);
                    var loader = $(l10n.html.loader).insertBefore('#loginEZFaceForm li.register a');
                    LOP.wsUserLogin({
                        login: BOX.form('loginEZFaceForm').text('emailEZFace').getValue(),
                        password: BOX.form('loginEZFaceForm').text('pwdEZFace').getValue(),
                        onSuccess: function() {
                            $.ajax({
                                type:"POST",
                                url:"/_fr/_fr/minisites/ezface/registrationPersonalInfos.aspx",
                                success:function(data){
                                    LOP.execStatCM(data);
                                }
                            });
                            updateMySignIn(true);
                            updateExpandVIP();
                            loader.remove();
                            LOP.popins.close();
                            setFlashElm();
                            $.cookie('logout', 'false', {expires: 0.1});
                            if(swf && isHostMethod(swf, 'onLoginComplete')) {
                                swf.onLoginComplete();
                            }
                        },
                        onError: function() {
                            loader.remove();
                            $('#loginEZFaceFormError').html(l10n.errorMsg.invalid.unexistantLogin).css('display', 'block');
                        }
                    });
                }
            },
            'fieldError': {
                'fn': LOP.manageFieldError
            },
            'fieldValid': {
                'fn': LOP.manageFieldError
            }
        });
    };
    
    LOP.popinOpeningActions.loginEZFace = loginEZFace;
    LOP.popinOpeningActions.loginUploadEZFace = loginEZFace;
    LOP.popinOpeningActions.loginSaveLookEZFace = loginEZFace;
    LOP.popinOpeningActions.loginFavoritesEZFace = loginEZFace;
    
    var closeLoginEZFace = function() {
        BOX.form('loginEZFaceForm', true);
        LOP.iconErrorSrc = null;
        setBodyIdForPopin(true);
    };
    
    LOP.popinClosingActions.loginEZFace = closeLoginEZFace;
    LOP.popinClosingActions.loginUploadEZFace = closeLoginEZFace;
    LOP.popinClosingActions.loginSaveLookEZFace = closeLoginEZFace;
    LOP.popinClosingActions.loginFavoritesEZFace = closeLoginEZFace;
    
    // Lost password
    LOP.popinOpeningActions.lostPwdEZFace = function() {
        LOP.iconErrorSrc = l10n.url.errorIconEZFace;
        setBodyIdForPopin();
        
        LOP.execStatCM(EZFaceStats.forgottenPassword);
        
        BOX.form('lostPwdEZFaceForm').text('login').setValue();
        BOX.form('lostPwdEZFaceForm').addValidation(function(form) {
            form.text('login').mustValidate(validateEmail);
            
            return l10n.errorMsg.form.singular;
        }, 'p.save').addListeners({
            'formError': {
                'fn': LOP.addFormError
            },
            'formValid': {
                'fn': function(e, domEvt) {
                    var form = this;
                    domEvt.preventDefault();
                    LOP.removeFormError.call(e.owner, e, domEvt);
                    if (D.getElementById('mySignedIn')) {
                        if (W.__doPostBack && form.submitName) {
                            LOP.execStatCM(EZFaceStats.forgottenPasswordConfirm);
                            W.__doPostBack(form.submitName, '');
                        }
                    } else {
                        $.get(l10n.url.customerSearch + '?email=' + form.text('login').getValue(), function(datas) {
                            if (!(Number(datas))) {
                                LOP.execStatCM(EZFaceStats.forgottenPasswordError);
                                $('#lostPwdEZFaceFormError').html(l10n.errorMsg.invalid.unexistantEmail).css('display', 'block');
                            } else if (W.__doPostBack && form.submitName) {
                                LOP.execStatCM(EZFaceStats.forgottenPasswordConfirm);
                                W.__doPostBack(form.submitName, '');
                            }
                        });
                    }
                }
            },
            'fieldError': {
                'fn': LOP.manageFieldError
            },
            'fieldValid': {
                'fn': LOP.manageFieldError
            }
        });
    };
    
    LOP.popinClosingActions.lostPwdEZFace = function() {
        BOX.form('lostPwdEZFaceForm', true);
        LOP.iconErrorSrc = null;
        setBodyIdForPopin(true);
    };
    
    // Send to friend
    LOP.popinOpeningActions.stfEZFace = function() {
        LOP.iconErrorSrc = l10n.url.errorIconEZFace;
        setBodyIdForPopin();
        
        BOX.form('STFEZFaceForm').text('photoWithoutMakeupEZFace').setValue(urlWithoutMakeup);
        BOX.form('STFEZFaceForm').text('photoWithMakeupEZFace').setValue(urlWithMakeup);
        
        LOP.execStatCM(EZFaceStats.sendLook);
        
        BOX.form('STFEZFaceForm').addValidation(function(form) {
            form.text('fnameEZFace').mustValidate(function(field) {
                if(field.isEmpty()) {
                    return l10n.errorMsg.required.fname;
                }
            });
            
            form.text('emailEZFace').mustValidate(validateEmail);
            
            form.text('fnameFriendEZFace').mustValidate(function(field) {
                if(field.isEmpty()) {
                    return l10n.errorMsg.required.fname;
                }
            });
            
            form.text('emailFriendEZFace').mustValidate(validateEmail);
            
            return l10n.errorMsg.form.plural;
        }, 'p.save').addListeners({
            'formError': {
                'fn': LOP.addFormError
            },
            'formValid': {
                'fn': function(e, domEvt) {
                    domEvt.preventDefault();
                    LOP.removeFormError.call(e.owner, e, domEvt);
                    var loader = $(l10n.html.loader).insertBefore('#STFEZFaceForm p.save a');
                    LOP.wsUserTellAFriend({
                        user: {
                            fname: e.owner.text('fnameEZFace').getValue(),
                            mail: e.owner.text('emailEZFace').getValue()
                        },
                        friend: {
                            fname: e.owner.text('fnameFriendEZFace').getValue(),
                            mail: e.owner.text('emailFriendEZFace').getValue()
                        },
                        customs: {
                            Msg: (e.owner.text('msgEZFace').getValue()) ? e.owner.text('msgEZFace').getValue() : '',
                            PhotoWithoutMakeup: e.owner.text('photoWithoutMakeupEZFace').getValue(),
                            PhotoWithMakeup: e.owner.text('photoWithMakeupEZFace').getValue(),
                            Path: 'http://'+W.location.hostname+'/'
                        },
                        XMLtemplate: 'tellafriend-ezface.xsl',
                        onSuccess: function(response) {
                            loader.remove();
                            LOP.openEZFacePopin(l10n.url.stfConfirmEZFace, 'stfConfirmEZFace');
                        },
                        onError: function(response) {
                            loader.remove();
                            $('#STFEZFaceFormError').html(l10n.errorMsg.invalid.unexpectedSTF).css('display', 'block');
                        }
                    });
                }
            },
            'fieldError': {
                'fn': LOP.manageFieldError
            },
            'fieldValid': {
                'fn': LOP.manageFieldError
            }
        });
    };
    
    LOP.popinOpeningActions.stfConfirmEZFace = function() {
        LOP.execStatCM(EZFaceStats.sendConfirmLook);
    };
    
    LOP.popinClosingActions.stfEZFace = function() {
        BOX.form('STFEZFaceForm', true);
        LOP.iconErrorSrc = null;
        setBodyIdForPopin(true);
    };
    
    // Save a look
    LOP.popinOpeningActions.saveLookEZFace = function() {
        LOP.iconErrorSrc = l10n.url.errorIconEZFace;
        setBodyIdForPopin();
        
        LOP.execStatCM(EZFaceStats.saveLook);
        
        BOX.form('saveLookEZFaceForm').addValidation(function(form) {
            form.text('lookEZFace').mustValidate(function(field) {
                if(field.isEmpty()) {
                    return l10n.errorMsg.required.lookEZFace;
                }
            });
            
            return l10n.errorMsg.form.singular;
        }, 'p.save').addListeners({
            'formError': {
                'fn': LOP.addFormError
            },
            'formValid': {
                'fn': function(e, domEvt) {
                    domEvt.preventDefault();
                    LOP.removeFormError.call(e.owner, e, domEvt);
                    LOP.popins.close();
                    setFlashElm();
                    if(swf && isHostMethod(swf, 'onLookSave')) {
                        swf.onLookSave(e.owner.text('lookEZFace').getValue());
                    }
                }
            },
            'fieldError': {
                'fn': LOP.manageFieldError
            },
            'fieldValid': {
                'fn': LOP.manageFieldError
            }
        });
    };
    
    LOP.popinClosingActions.saveLookEZFace = function() {
        BOX.form('saveLookEZFaceForm', true);
        LOP.iconErrorSrc = null;
        setBodyIdForPopin(true);
    };
    
    LOP.popinOpeningActions.yourLookEZFace = function() {
        LOP.execStatCM(EZFaceStats.saveConfirmLook);
        $('#currentLook a').click(function(e) {
            e.preventDefault();
            LOP.popins.close();
        });
        $('#startNewLook a').click(function(e) {
            e.preventDefault();
            LOP.popins.close();
            setFlashElm();
            if(swf && isHostMethod(swf, 'onNewLookBegin')) {
                swf.onNewLookBegin();
            }
        });
    };
    
    LOP.popinClosingActions.yourLookEZFace = function() {
        $('#currentLook a').unbind('click');
        $('#startNewLook a').unbind('click');
    };
    
    // domReady initializations
    $(D).ready(function() {
        LOP.popins.prepare('#popinsEZFace', 'div.popinEZFace', l10n.url, false);
        $('#mySignedIn a').click(LOP.logoutEZFace);
        if($.cookie('logout') == 'true') {
            updateMySignIn(false);
            updateExpandVIP();
        }
    });
    
    /* start looks storage's functions */
    LOP.storeLook = function(datas) {
        LOP.wsForumAddPost({
            'forumId': $('#ezfaceLooks').val(),
            'subject': datas.lookName,
            'approved': '1',
            'valid': '1',
            'properties': {
                'EZF_Visual_Before': datas.visualBefore,
                'EZF_Visual_After': datas.visualAfter,
                'EZF_Visual_Thumb': datas.visualThumb,
                'EZF_ID_Variants': datas.variantsList
            },
            'onSuccess': function(response) {
                setFlashElm();
                swf.sendIdPost(response.getElementsByTagName('ForumAdvPostId')[0].firstChild.data);
            },
            'onError': function() {}
        });
    };
    /* end looks storage's functions */
    
})(jQuery);
