(function($) {
    
    if(!LOP.supported) {
        return;
    }
	
    var W = this.window, D = W.document;
    var PW = window.parent, PD = PW.document ;
    
    /**
     * ----------------------------------------------------------------
     * Implementation: setup BOX components
     * ----------------------------------------------------------------
     */
    BOX.setConfig('scroll', {
        container: '<div class="scrollContent">%content%</div>',
        simpleBar: '<div class="scrollBar" style="visibility:hidden;"><span class="face"></span></div>',
        fullBar: '<div class="scrollBar" style="visibility:hidden;"><span class="up"></span><span class="face"></span><span class="down"></span></div>'
    }).setConfig('slide', {
        prev: '<a href="#" class="prev">' + l10n.simpleSlide.prev + '</a>',
        next: '<a href="#" class="next">' + l10n.simpleSlide.next + '</a>'
    }).setConfig('toolTip', {
        container: '<div class="toolTip" style="left:-10000px;"><div id="toolTipInner"></div></div>'
    }).setConfig('popin', {}).setConfig('fauxFields', {
        checked: 'checked',
        focus: 'focus',
        checkedFocus: 'checkedFocus',
        selected: 'selected',
        hover: 'hover'
    }).setConfig('fauxSelect', {
        container: '<div id="fauxSelect" style="left:-10000px;"></div>',
        mask: '<div id="fauxSelectMask" style="display:none;"></div>'
    });
    
    
    /**
     * ----------------------------------------------------------------
     * Implementation: send to friend
     * ----------------------------------------------------------------
     */
    LOP.stfDatasActions = {
        page: function() {
            return ([
                '<ul style="margin:10px 30px; color:#c49f59; list-style:square;">',
                    '<li>',
                        '<a href="' + W.location.href + '" target="_blank"><font color="#c49f59" style="color:#c49f59;">',
                            $('#core h1').text(),
                        '</font></a>',
                    '</li>',
                '</ul>'
            ]).join('');
        },
        product: function() {
            return ([
                '<ul style="margin:10px 30px; color:#c49f59; list-style:square;">',
                    '<li>',
                        '<a href="' + W.location.href + '" target="_blank"><font color="#c49f59" style="color:#c49f59;">',
                            $('#productReview h1').text(),
                        '</font></a>',
                    '</li>',
                '</ul>'
            ]).join('');
        },
        newsletter: function() {
            return ([
                '<ul style="margin:10px 30px; color:#c49f59; list-style:square;">',
                    '<li>',
                        '<a href="' + location.protocol + '//' + location.host + l10n.url.homePage + '#popin:newsletter" target="_blank"><font color="#c49f59" style="color:#c49f59;">',
                            l10n.generic.register,
                        '</font></a>',
                    '</li>',
                '</ul>'
            ]).join('');
        }
    };
    
    
    /**
     * ----------------------------------------------------------------
     * Implementation: popins
     * ----------------------------------------------------------------
     */
    var closeLinkPopins = '<a href="#" class="close box:id:closePopin" title="' + l10n.generic.close + '"><img alt="" src="/img/common/btn/close.gif" /></a>';
    var baseFormEvents = {
        formError: {fn: LOP.addFormError},
        formValid: {fn: LOP.removeFormError},
        fieldError: {fn: LOP.manageFieldError},
        fieldValid: {fn: LOP.manageFieldError}
    };
    
    LOP.processHTMLPopins = function(html) {
        if(html && html.indexOf('popinInner') > -1) {
            return html.replace(/("?popinInner"?[^>]*>)/, '$1' + closeLinkPopins);
        }
        return html;
    };
    
    var popinOpenEvt = function(e, id) {
		if(LOP.BVopened){
			LOP.closeBvPopin();
		}
		if(LOP.hideBVselector){
			LOP.hideBVselector();
		}
		LOP.getCoreDimensions();
        LOP.coreMask.show(LOP.popins.maskType || 'coreMaskPopin', {top: LOP.maskTop + 'px', height: LOP.maskHeight + 'px'});
        LOP.popins.maskType = null;
        LOP.popinContainer.css({top: LOP.maskTop + 'px', height: LOP.maskHeight + 'px'});
        if(LOP.popinOpeningActions[id]) {
            LOP.popinOpeningActions[id]();
        }
    };
    
    var popinCloseEvt = function(e, id) {
		if(LOP.showBVselector){
			LOP.showBVselector();
		}
        if(LOP.popinClosingActions[id]) {
            LOP.popinClosingActions[id]();
        }
        LOP.tooltips.close();
        LOP.coreMask.hide();
    };
    
    BOX.addFormRule('zip', /^[0-9]{6}$/);
    //BOX.addFormRule('mobile', /^[0-9]{11}$/);
	BOX.addFormRule('mobile', /^0?1((3\d{9})|(5[012356789]\d{8})|(8[056789]\d{8}))$/);
    BOX.addFormRule('day', /^(([123][01])|([012]?[1-9]))$/);
    BOX.addFormRule('month', /^((1[012])|(0?[1-9]))$/);
    BOX.addFormRule('year', /^((19[0-9]{2})|(20[0-9]{2}))$/);
	
	var verifyDate = function() {
		var day = Number(BOX.form('popinRegisterForm').text('birthday').getValue());
		var month = Number(BOX.form('popinRegisterForm').text('birthmonth').getValue()) - 1;
		if (month < 0) {
			month = 11;
		}
		var year = Number(BOX.form('popinRegisterForm').text('birthyear').getValue());
		var date = new Date();
		var minAge = 15;
		if (!isNaN(day) && !isNaN(month) && !isNaN(year)) {
			if (year >= 1900 && year <= date.getFullYear() - minAge) {
				var original = year + '.' + month + '.' + day;
				var compute = new Date(year, month, day);
				var compare = compute.getFullYear() + '.' + compute.getMonth() + '.' + compute.getDate();
				return original == compare;
			}
			return false;
		} 
		return true;
	};

   
    LOP.popinOpeningActions = {
        signIn: function() {
            BOX.form('popinUserLogin').text('login').setValue();
            BOX.form('popinUserLogin').addValidation(function(form) {
                form.text('login').mustValidate(LOP.validateEmail);
                
                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(baseFormEvents);
            
            BOX.form('popinRegisterForm').addValidation(function(form) {
				
				form.radio('title_list').mustValidate(function(field) {
					//Fix the value of the title list
					if($('#productSheet')[0]){
						var originalValue = field.getValue();
						var titleToBeReplaced = {
							'女士#1':'Madame#0',
							'小姐#1':'Mademoiselle#1',
							'先生#2':'Monsieur#2'
						}
						for (var p in titleToBeReplaced ) {
							if(field.getValue().indexOf(p)!=-1){
								field.setValue(field.getValue().replace(p ,titleToBeReplaced[p]));	
							} 	
						}
					}
					if (!field.isChecked()) {
						return l10n.errorMsg.required.civility;
					}
				});
            
                form.text('fname').mustValidate(function(field) {
                    if(field.isEmpty()) {
                        return l10n.errorMsg.required.lname;
                    }
                });
				
				form.text('ep1itNickname').mustValidate(function(field) {
                    if(field.isEmpty()) {
                        return l10n.errorMsg.required.nickName;
                    }
                });
				
				form.text('birthday').mustValidate(function(field) {
					if (field.isEmpty()) {
						return l10n.errorMsg.required.birthday;
					} else if (!field.isMatching('day')) {
						return l10n.errorMsg.invalid.birthday;
					} else if ((!form.text('birthmonth').isEmpty() && !form.text('birthmonth').isMatching('month')) || (!form.text('birthyear').isEmpty() && !form.text('birthyear').isMatching('year'))) {
						return l10n.errorMsg.invalid.birthday;
					} else {
						if (!verifyDate()) {
							return l10n.errorMsg.invalid.birthday;
						}
					}
				});
				
				form.text('birthmonth').mustValidate(function(field) {
					if (field.isEmpty()) {
						return l10n.errorMsg.required.birthday;
					} else if (!field.isMatching('month')) {
						return l10n.errorMsg.invalid.birthday;
					} else if ((!form.text('birthday').isEmpty() && !form.text('birthday').isMatching('day')) || (!form.text('birthyear').isEmpty() && !form.text('birthyear').isMatching('year'))) {
						return l10n.errorMsg.invalid.birthday;
					} else {
						if (!verifyDate()) {
							return l10n.errorMsg.invalid.birthday;
						}
					}
				});
				
				form.text('birthyear').mustValidate(function(field) {
					if (field.isEmpty()) {
						return l10n.errorMsg.required.birthday;
					} else if (!field.isMatching('year')) {
						return l10n.errorMsg.invalid.birthday;
					} else if ((!form.text('birthday').isEmpty() && !form.text('birthday').isMatching('day')) || (!form.text('birthmonth').isEmpty() && !form.text('birthmonth').isMatching('month'))) {
						return l10n.errorMsg.invalid.birthday;
					} else {
						if (!verifyDate()) {
							return l10n.errorMsg.invalid.birthday;
						}
					}
				});
            
				form.text('login').mustValidate(function(field) {
					form.text('email').setValue(form.text('login').getValue());
					if (field.isEmpty()) {
						return l10n.errorMsg.required.email;
					} else if (!field.isMatching('email')) {
						return l10n.errorMsg.invalid.email;
					}
				});
				
				form.text('login_conf').mustValidate(function(field) {
					if (form.text('login').isValid(true)) {
						var value = form.text('login').getValue();
						if (!field.isEqualTo(value)) {
							return l10n.errorMsg.confirm.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;
					}
				});
				
				form.text('password_conf').mustValidate(function(field) {
					if (form.text('password').isValid(true) && !field.isEqualTo(form.text('password').getValue())) {
						return l10n.errorMsg.confirm.pwd;
					}
				});
			
                form.text('Phone').mustValidate(function(field) {
                    if(field.isEmpty()) {
                        return l10n.errorMsg.required.mobile;
                    } else if(!field.isMatching('mobile')) {
                        return l10n.errorMsg.invalid.mobile;
                    }
                });
				
				/*
				form.text('address_line1').mustValidate(function(field) {
					if(field.isEmpty()) {
						return l10n.errorMsg.required.street;
					}
				});
				
				form.select('address_state_choice').mustValidate(function(field) {
					if((field.getIndex() == 0)) {
						return l10n.errorMsg.required.state;
					}
				});
				
				form.text('address_city').mustValidate(function(field) {
					if(field.isEmpty()) {
						return l10n.errorMsg.required.city;
					}
				});	
			   
				form.text('address_zip').mustValidate(function(field) {
					if(field.isEmpty()) {
						return l10n.errorMsg.required.zip;
					} else if(!field.isMatching('zip')) {
						return l10n.errorMsg.invalid.zip;
					}
				});*/
				
                return l10n.errorMsg.form.plural;
            }, 'p.save').addListeners(baseFormEvents).addReplacement({'maxHeight': 150});
        },
        addComments: function() {
            LOP.centerPopinVertically(LOP.popinContainer);
        },
        copyright: function() {
            LOP.centerPopinVertically(LOP.popinContainer);
        },
        signOutClubVIP: function() {
            LOP.centerPopinVertically(LOP.popinContainer);
        },
        password: function() {
            BOX.form('passwordForm').text('login').setValue();
            BOX.form('passwordForm').addValidation(function(form) {
                form.text('login').mustValidate(LOP.validateEmail);
                
                return l10n.errorMsg.form.singular;
            }, 'p.save').addListeners(baseFormEvents);
        },
        addToBlog: function() {
            $('#pageURL').bind('focus.addToBlog', function() {
                $(this).select();
            });
        },
        sendToFriend: function() {
            BOX.form('sendToFriendForm').text('fname').setValue();
            BOX.form('sendToFriendForm').text('email').setValue();
            BOX.form('sendToFriendForm').text('stfdatas').setValue(LOP.stfDatas);
            BOX.form('sendToFriendForm').addValidation(function(form) {
                form.text('fname').mustValidate(function(field) {
                    if(field.isEmpty()) {
                        return l10n.errorMsg.required.lname;
                    }
                });
                
                form.text('email').mustValidate(LOP.validateEmail);
                
                form.text('FriendLastName').mustValidate(function(field) {
                    if(field.isEmpty()) {
                        return l10n.errorMsg.required.lname;
                    }
                });
                
                form.text('FriendEmail').mustValidate(LOP.validateEmail);
                	
                return l10n.errorMsg.form.plural;
				
            }, 'p.save').addListeners(baseFormEvents).addReplacement();
        },
        otherBrands: function() {
            LOP.centerPopinVertically(LOP.popinContainer);
        },
        otherBenefits: function() {
            LOP.centerPopinVertically(LOP.popinContainer);
        },
        newsletter: function() {
            BOX.form('signNewsletterForm').addValidation(function(form) {
                form.text('email').mustValidate(LOP.validateEmail);
                
                form.text('email_conf').mustValidate(function(field) {
                    if(form.text('email').isValid(true)) {
                        var value = form.text('email').getValue();
                        if(!field.isEqualTo(value)) {
                            return l10n.errorMsg.confirm.email;
                        }
                    }
                });
                
                return l10n.errorMsg.form.plural;
            }, 'p.save').addListeners({
                'formError': {
                    'fn': addFormError
                },
                'formValid': {
                    'fn': function(e, formEvent) {
                        // formEvent.preventDefault();
                        // customerSearch(this, 'email');
                    }
                },
                'fieldError': {
                    'fn': manageFieldError
                },
                'fieldValid': {
                    'fn': manageFieldError
                }
            });
        },
        addToBasketLoader: function() {
            LOP.centerPopinVertically(LOP.popinContainer);
        },
		beautyAdvisor:function(){
			LOP.coreMask.dom.attr('id', 'coreMaskMenu');	
		}
    };
    
    LOP.popinClosingActions = {
        signIn: function() {
            // LOP.popins.currentDOM.css('top', '-10000px');
            BOX.form('popinUserLogin', true);
			BOX.form('popinRegisterForm', true);
        },
        signOut: function() {
            BOX.form('signOutNewsletterForm', true);
        },
        addComments: function() {
             $('#popinAddComments').html();
        },
        password: function() {
            BOX.form('passwordForm', true);
        },
        addToBlog: function() {
            $('#pageURL').unbind('focus.addToBlog');
        },
        sendToFriend: function() {
            BOX.form('sendToFriendForm', true);
        },
        newsletter: function() {
            BOX.form('signNewsletterForm', true);
        },
        addToBasketLoader: function() {
            $('#popinAddToBasketLoader .loading').html('');
        },
		beautyAdvisor:function(){
			LOP.coreMask.dom.attr('id', 'coreMaskPopin');	
		}
    };
	
	
	/**
     * ----------------------------------------------------------------
     * get baket prd
     * ----------------------------------------------------------------
     */
	var getrelatedProductsBag = function() {
		var sIds = '', aIds = ($('#relatedProductsBagId').text()).split(';');
		
		var l = aIds.length - 1;
		
		for(i = 0; i < l; i++) {
			var id = aIds[i] + ';';
			if((sIds).indexOf(id) <= -1) {
				sIds += id;
			}
		}
		sIds = sIds.substr(0, (sIds.length - 1));
		$.get(l10n.url.checkoutGetRelatedProducts + '?code=' + sIds, 
			function(response) {
				response = $(response).find('li:lt(2)');
				var tempUL = document.createElement('ul');
				$('#relatedProductsBagListing').empty().append(tempUL);
				$('#relatedProductsBagListing ul').append(response);
				if(LOP.ieOld){
					LOP.iePNG('#popinMiniShoppingBag');
				}
			}
		);
	}
		
	$('#productsList select').each(function() {
		var sValue = $(this).attr('name') + sIndex;
		$(this).attr('name', sValue);
		sIndex++;
	});

    
    /**
     * ----------------------------------------------------------------
     * Implementation: mini shoppingbag
     * ----------------------------------------------------------------
     */
	 
    LOP.openShoppingBag = function(datas) {
		
        datas.url = datas.url || l10n.url.getMiniBasket;
        LOP.openShoppingBag.insertPoint = datas.insertPoint;
        LOP.openShoppingBag.removable = datas.removable;
        
        if(!(datas.lastproduct === undefined)) {
            datas.url = datas.url + '?code=' + datas.lastproduct;
        }
        
        $.get(datas.url, function(response) {
            if(response) {
                if(LOP.openShoppingBag.removable == 'true') {
                    $('#coreMaskShoppingBag').click(function(e) {
                        LOP.closeShoppingBag();
                    });
                }
                
				PW.LOP.popins.close();
                $(LOP.openShoppingBag.insertPoint).html(response);
				
				var popinMiniBagAnimate = $('#popinMiniShoppingBag').parent().attr("id");
				if (popinMiniBagAnimate == 'shoppingBagContainer') {
                $('#popinMiniShoppingBag').animate({
                    top: '12px'
                }, 1000);
				if($('.lastPrdList .item').size()>3){
					 $('.lastPrdList .scroll').css("height",280);
					 $('.lastPrdList .scroll').each(function() {
						var id = BOX.getStoreId(this);
						LOP.addVerticalScroll(this, id);
					 });
				}
				}else{
                $('#popinMiniShoppingBag').show();
				}
				
				
				//get the last item and show
				
				if (D.getElementById('lastPrdItem')) {
					//$('#lastPrdItem .item').hide()
					//$('#lastPrdItem .item:last').show();
				}
                
                if(LOP.openShoppingBag.removable == 'true') {
                    $('#popinMiniShoppingBag .close').click(function(e) {
                        e.preventDefault();
                        LOP.closeShoppingBag();
                    });
                }
				
				if(D.getElementById('relatedProductsBagId') && $('#relatedProductsBagId').text()) {
					getrelatedProductsBag();
				}
				
				if(LOP.ieOld){
					LOP.iePNG('#popinMiniShoppingBag');
				}
				
            }
        });
    };
    
    LOP.closeShoppingBag = function() {
        $('#popinMiniShoppingBag').animate({
            top: '-500px'
        }, 1000, function() {
            $('#popinMiniShoppingBag').remove();
        });
    };
	
    
    /**
     * ----------------------------------------------------------------
     * Implementation: mailbox send messages
     * ----------------------------------------------------------------
     */
    LOP.sendToMailBox = function(datas) {
        var eval1 = $(datas.eval1).text();
        var eval2 = $(datas.eval2).val();
        if((eval1).indexOf(eval2) == -1) {
            $('#mailBoxSender .type').val($(datas.element).find('.type').val());
            $('#mailBoxSender .subject').val($(datas.element).find('.subject').val());
            $('#mailBoxSender .message').val($(datas.element).find('.message').val());
            $('#mailBoxSender .visual').val($(datas.element).find('.visual').val());
            $('#mailBoxSender .link').val($(datas.element).find('.link').val());
            $('#mailBoxSender .textLink').val($(datas.element).find('.textLink').val());
            
            var action = $('#mailBoxSender a').attr('href').replace(/.+\('([^']+).*/, '$1');
            __doPostBack(action, '');
        }
    };
    
    
    /**
     * ----------------------------------------------------------------
     * Implementation: scroll actions
     * ----------------------------------------------------------------
     */
    LOP.scrollActions = {
        filteredProductsList: function(elm, id) {
            LOP.addHorizontalScroll(elm, id, {
                'scrollTarget': '#products',
                'itemWidth': 240,
                'totalWidth': 720,
                'scrollMargin': 10,
                'visibleOnLine': 4
            });
        },
        filteredMediasList: function(elm, id) {
            LOP.addHorizontalScroll(elm, id, {
                'scrollTarget': '#medias',
                'itemWidth': 182,
                'totalWidth': 720,
                'scrollMargin': 10
            });
        },
        diagGroup1List: function(elm, id) {
            LOP.addHorizontalScroll(elm, id, {
                'scrollTarget': '#group1',
                'itemWidth': 241,
                'totalWidth': 720,
                'scrollMargin': 10
            });
        },
        diagGroup2List: function(elm, id) {
            LOP.addHorizontalScroll(elm, id, {
                'scrollTarget': '#group2',
                'itemWidth': 241,
                'totalWidth': 720,
                'scrollMargin': 10
            });
        },
        diagMediasList: function(elm, id) {
            LOP.addHorizontalScroll(elm, id, {
                'scrollTarget': '#medias',
                'itemWidth': 182,
                'totalWidth': 720,
                'scrollMargin': 10
            });
        }
    };
    
    
    /**
     * ----------------------------------------------------------------
     * Implementation: define click actions for specific element types
     * ----------------------------------------------------------------
     */
    var fieldsNames = 'input,textarea,select,span', myItemsNumber;
    
    var getMyItemsNumber = function() {
        return parseInt(myItemsNumber.text().replace(/\D+/, ''), 10);
    };
    
    LOP.setMyItemsNumber = function(value) {
        myItemsNumber = myItemsNumber || $('#myItemsNumber');
        var nb = getMyItemsNumber() + value;
        if(nb) {
            myItemsNumber.text('(' + nb + ')');
        }
    };
    
    LOP.clickActions = {
        label: function(e, t) {
            if($(t).attr('for')) {
                return;
            }
            var field = $(t).prev()[0];
            if(!field || fieldsNames.indexOf(field.nodeName.toLowerCase()) == -1) {
                field = $(t).next()[0];
            }
            if(field && field.className == 'AnswerClass') {
                field = $(field).children()[0];
            }
            if(field && field.type) {
                switch(field.type) {
                    case 'password':
                    case 'select-one':
                    case 'text':
                    case 'textarea':
                        field.focus();
                        break;
                    case 'checkbox':
                    case 'radio':
                        field.click();
                        field.focus();
                        break;
                }
            }
        },
        a: function(e, t) {
            LOP.getAndSetCMDatas(t);
            
            var id = BOX.getStoreId(t);
            if(id == 'closePopin') {
                e.preventDefault();
                LOP.getAndDoAnyPopinClosing(t, id);
            } else if(t.rel && t.rel.indexOf('popin') > -1) {
                e.preventDefault();
                LOP.getAndSetSTFDatas(t);
                LOP.openPopin(t);
            } else if(t.rel && t.rel.indexOf('minibasket') > -1) {
                e.preventDefault();
                LOP.openShoppingBag({
                    'insertPoint': BOX.getStoreId(e, 'mbtarget') || '#shoppingBagContainer',
                    'removable': BOX.getStoreId(e, 'mbremovable') || 'true'
                });
            } else if(id == 'addToFavorites') {
                e.preventDefault();
                $.get(t.href, function(datas) {
                    if(datas) {
                        if(datas.indexOf('success') > -1) {
                            LOP.setMyItemsNumber(1);
                        }
                        if(datas.indexOf('callToRegister') > -1) {
                            LOP.openPopin({
                                url: l10n.url.callToRegister,
                                id: 'callToRegister',
                                refresh: false,
                                processHTML: LOP.processHTMLPopins
                            });
                        }
                    }
                });
                $(t.parentNode).html(l10n.addToFavorites.done).addClass('actionDone');
            } else if(id == 'addAllToFavorites') {
                e.preventDefault();
                var url = t.href;
                var allProductsHTML = $('#allProductsID').html() || '';
                var allMediasHTML = $('#allMediasID').html() || '';
                url += '?products=' + allProductsHTML.replace(/[\s\t\n]+/g, '').replace(/;$/, '');
                url += '&medias=' + allMediasHTML.replace(/[\s\t\n]+/g, '').replace(/;$/, '');
                $.get(url, function(datas) {
                    if(datas) {
                        if(datas.indexOf('success') > -1) {
                            datas = datas.replace(/[\s\t\n]+/g, '').replace(/;$/, '');
                            LOP.setMyItemsNumber(datas.split(';').length);
                        }
                        if(datas.indexOf('callToRegister') > -1) {
                            LOP.openPopin({
                                url: l10n.url.callToRegister,
                                id: 'callToRegister',
                                refresh: false,
                                processHTML: LOP.processHTMLPopins
                            });
                        }
                    }
                });
                $(t.parentNode).html(l10n.addToFavorites.done).addClass('actionDone');
            } else if(id == 'addToBasket') {
                e.preventDefault();
                
                if(PW.mainNavOpened && PW.mainNavOpened.length){
					PW.LOP.closeMainNav($("#productsMenu > ul > li", PD));
				}
				
                LOP.openPopin({
                    url: '#popinAddToBasketLoader',
                    id: 'addToBasketLoader',
                    refresh: false,
                    processHTML: false
                });
				
                PW.LOP.wsShoppingCartAddProduct({
                    varcode: BOX.getStoreId(t, 'varcode'),
                    quantity: BOX.getStoreId(t, 'qty') || 1,
                    onSuccess: function() {
                        $.ajax({
                            url: l10n.url.checkoutGetShoppingCartCount,
                            success: function(response) {
                                var displayBag = BOX.getStoreId(t, 'open') || 1;
                                $('#shoppingBag span.counter', PD).html(response);
                                if(displayBag == 1) {
                                    PW.LOP.openShoppingBag({
                                        'insertPoint': '#shoppingBagContainer',
                                        'removable': 'true',
                                        'lastproduct': BOX.getStoreId(t, 'varcode')
                                    });
                                }
                            }
                        });
                    },
                    onError: function(msg) {
                        if(msg) {
                            $('#popinAddToBasketLoader .loading').html(msg);
                            setTimeout(function() {
                                LOP.popins.close();
                            }, 3000);
                        } else {
                            $('#popinAddToBasketLoader .loading').html(l10n.addToBasket.errorLoading);
                            setTimeout(function() {
                                LOP.popins.close();
                            }, 3000);
                        }
                    }
                });
            }
        }
    };
    
    /**
     * ----------------------------------------------------------------
     * Implementation: main menu
     * ----------------------------------------------------------------
     */
    var mainNavTop, mainNavOpened;
	LOP.baIframeDefaultSrc = '/_zh/_cn/beauty-advisor/ba-needs.aspx' ;
	LOP.baIframeContainerId = 'beautyOnline';
    
    LOP.closeMainNav = function(li, t, keepMask) {
		if(LOP.showBVselector){
			LOP.showBVselector();
		}
        if(!t) {
            t = $('div.expand', li);
        }
		if(keepMask){
			li.removeClass('expanded');
			mainNavOpened = null;
		}
        if(!keepMask) {
			t.hide();
			li.removeClass('expanded');
			if(!keepMask) {
				mainNavOpened = null;
			}
            LOP.coreMask.hide();
            var homeFlashSWF = D.getElementById('homeFlashSWF');
            if(homeFlashSWF && LOP.isHostMethod(homeFlashSWF, 'playFlash')) {
                setTimeout(function() {
                    homeFlashSWF.playFlash();
                }, 500);
            }
        }
        $(D).unbind('keydown.productsMenu').unbind('mousedown.productsMenu');
    };
        
    LOP.openMainNav = function(li, t) {
        var homeFlashSWF = D.getElementById('homeFlashSWF');
        if(homeFlashSWF && LOP.isHostMethod(homeFlashSWF, 'pauseFlash')) {
            homeFlashSWF.pauseFlash();
        }
        if(mainNavOpened && mainNavOpened.length) {
            LOP.closeMainNav(mainNavOpened, null, true);
        }
        if(LOP.popins) {
            LOP.popins.close();
        }
		if(LOP.BVopened){
			LOP.closeBvPopin();	
		}
		if(LOP.hideBVselector){
			LOP.hideBVselector();
		}
        mainNavOpened = li;
        LOP.coreMask.show('coreMaskMenu', {top: LOP.maskTop + 'px', height: LOP.coreHeight + 'px'});
		t.css('top', mainNavTop).show();
		if(mainNavOpened){
			mainNavOpened.addClass('expanded');
		}
		$(D).bind('keydown.productsMenu', function(e) {
			if(e.which == 27) {
				LOP.closeMainNav($(li), t);
			}
		}).bind('mousedown.productsMenu', function(e) {
			var tg = e.target;
			while(tg.id != 'productsMenu' && (tg = tg.parentNode));
			if(!tg || tg.id != 'productsMenu') {
				LOP.closeMainNav($(li), t);
			}
		});
    };
     
	LOP.openAndSetBaIframe = function(src) {
		LOP.closeMainNav($("#productsMenu > ul > li", PD));
		if(LOP.popins.currentId == 'beautyAdvisor') {
			LOP.popins.close();
		} else {
			LOP.popins.add({
				url: '#popinBeautyAdvisor',
				id: 'beautyAdvisor',
				processHTML: false,
				refresh: true
			});
			LOP.popinContainer.find('#baIframe').attr('src',src ? src : LOP.baIframeDefaultSrc );
			if(LOP.showBVselector){
				LOP.showBVselector();
			}
		}
	}
    
    /**
     * ----------------------------------------------------------------
     * Implementation: localisation menu
     * ----------------------------------------------------------------
     */
    var l10nNav, l10nNavTitle, l10nNavExpand;
    
    LOP.openL10nNav = function() {
        if(LOP.popins) {
            LOP.popins.close();
        }
        l10nNavExpand.slideDown(600, function() {
            l10nNav.addClass('on');
            $(D).bind('keydown.localisationMenu', function(e) {
                if(e.which == 27) {
                    LOP.closeL10nNav();
                }
            }).bind('mousedown.localisationMenu', function(e) {
                var t = e.target;
                while(t != l10nNav[0] && (t = t.parentNode));
                if(t != l10nNav[0]) {
                    LOP.closeL10nNav();
                }
            });
        });
    };
    
    LOP.closeL10nNav = function() {
        l10nNav.removeClass('on');
        l10nNavExpand.slideUp(300);
        $(D).unbind('keydown.localisationMenu').unbind('mousedown.localisationMenu');
    };
    
    
    /**
     * ----------------------------------------------------------------
     * Implementation: generic form rules
     * ----------------------------------------------------------------
     */
    BOX.addFormRule('password', /^.{6,}$/);
    
    
    $(D).ready(function() {
						
		/*Login Or Register Fail*/
		var needToExpendSignForm = $('#signInFormError').text() || $('#popinRegisterForm .content .error')[0] || LOP.openAltPopinSignIn
		
		// Open the BA iframe 
		$('#guide dt a, #productsMenu .diag dd a').bind(
			'click',
			function(){
				LOP.openAndSetBaIframe('/_zh/_cn/beauty-advisor/ba-diag-home.aspx');
				return false;
			}
		);		
		
        LOP.getCoreDimensions();
		//set the new height after some changes
		setInterval(function(){
			LOP.getCoreDimensions(); 
			LOP.coreMask.dom.css({height: LOP.maskHeight});
		}, 500);
        
        // manage clicks on the document
        var clickedElm = '', clickedElmRe = /label;input;a;$/i, lastClick;
        $(D).click(function(e) {
            var t = e.target;
            clickedElm += t.tagName + ';';
            var time = (new Date()).getTime();
            var diff = time - (lastClick || 0);
            //if(t.parentNode && t.parentNode.tagName.toLowerCase() == 'label' && clickedElmRe.test(clickedElm) && diff < 300) {
			t.parentNode ? tParentNode = document.body : tParentNode = t.parentNode
			if(tParentNode && tParentNode.tagName.toLowerCase() == 'label' && clickedElmRe.test(clickedElm) && diff < 300) {
                // bug IE7 where click on label => click on input => click on contained link
                clickedElm = '';
            } else {
                while(t && t != this) {
                    var tagName = t.tagName.toLowerCase();
                    if(LOP.clickActions[tagName]) {
                        LOP.clickActions[tagName](e, t);
                        break;
                    }
                    t = t.parentNode;
                }
            }
            if(clickedElm.length > 50) {
                clickedElm = '';
            }
            lastClick = time;
        });
        
        // create scrolls
        $('body .scroll').each(function() {
            var id = BOX.getStoreId(this);
            var mode = BOX.getStoreId(this, 'mode');
            if(mode != 'delegate') {
                if(LOP.scrollActions[id]) {
                    LOP.scrollActions[id](this, id);
                } else {
                    LOP.addVerticalScroll(this, id);
                }
            }
        });

		if (document.getElementById('searchForForm')) {
			BOX.clearTextFields('#searchForForm');
			BOX.form('searchForForm').addValidation(function(form) {
				form.text('keywords').mustValidate(function(field) {
					if (field.isEmpty() || field.getValue() == field.element.defaultValue) {
						return 'error';
					}
				});
			}, 'input[type=image]').addListener('formValid', function(e, formEvent) {
				var key, keySample, keyPromotion, url;
				key = this.text("keywords").getValue();
				keySample = ["小样", "试用装", "免费小样", "免费试用装"];
				keyPromotion = ["本月促销", "优惠", "本月优惠", "促销"];
				url = l10n.url.searchPage + '?code=' + this.text('keywords').getValue();
				
				for (var i=0; i<keySample.length; i++)
				{
					if (key.match(new RegExp(keySample[i], "")))
					{
						url = "/sampling.aspx";
						break;
					}
				}
				
				for (var i=0; i<keyPromotion.length; i++)
				{
					if (key.match(new RegExp(keyPromotion[i], "")))
					{
						url = "/new-promotion.aspx";
						break;
					}
				}
				
				W.location.href = url;
				formEvent.preventDefault();
			});
		};
		

        // create tooltips base object
        LOP.tooltips = new BOX.ToolTips();
        LOP.tooltips.addListener('beforeOpen', function(e, trigger, triggerOffset, divToolTip, top, left) {
            var width = divToolTip[0].offsetWidth;
            var maxW = left + width;
            var nleft = left;
            if(maxW > LOP.coreOffsetMax.left) {
                nleft = LOP.coreOffsetMax.left - width;
            } else if(nleft < LOP.coreOffset.left) {
                nleft = LOP.coreOffset.left;
            }
            var backgroundPosition = - (1009 / 2 - (width / 2 + left - nleft));
            divToolTip.css('background-position', backgroundPosition + 'px 100%');
            this.setPosition(top, nleft);
        });
        
        // create a mask for popins and eventually main nav
        LOP.coreMask = new BOX.Mask({
            html: '<div class="mask" style="display:none;"></div>',
            target: '#core'
        });
        
        // create popins base object
        LOP.popinContainer = $('#popin');
        LOP.popins = new BOX.Popins({
            insertPoint: LOP.popinContainer
        });
        LOP.popins.addListeners({
            'open': {fn: popinOpenEvt},
            'close': {fn: popinCloseEvt}
        });
        LOP.popins.prepare('#popin', 'div.popinWrapper');
        LOP.popins.directAccess(l10n.url, LOP.processHTMLPopins);
		
		// Login or register for user access Vip club
		if($('#clubLoginWarning')[0]){
			LOP.popins.add({
				url: '#popinSignIn',
				id: 'signIn',
				processHTML: false,
				refresh: true
			});	
		}
		/* Login Or Register Fail || Bazaar Voice Login */
		if(needToExpendSignForm){
			window.scrollTo(0,95);
			LOP.popins.add({
				url: '#popinSignIn',
				id: 'signIn',
				processHTML: LOP.processHTMLPopins,
				refresh: true
			});
			$('#popin p.error:not(:empty)').show();
		}
        
		/* Bazaar Voice Popin */
		LOP.BVopened = false;
		LOP.showBVselector = function(){
			var BVselector = $('#BVRRDisplayContentSelectBVFrameID');
			if(LOP.ieOld && BVselector[0]){
				BVselector.css({visibility:'inherit'}) ;
			}
		}
		LOP.hideBVselector = function(){
			var BVselector = $('#BVRRDisplayContentSelectBVFrameID');
			if(LOP.ieOld && BVselector[0]){
				BVselector.css({visibility:'hidden'}) ;
			}
		}
		LOP.showBvPopin = function(){
			window.scrollTo(0,95);
			LOP.getCoreDimensions();
			LOP.hideBVselector();
			$('#BVSubmissionContainerPopin').addClass('on');
			LOP.coreMask.show('coreMaskMenu', {top: LOP.maskTop + 'px', height: LOP.maskHeight + 'px'});
			$('#BVSubmissionContainerPopin').find('.closeBV').click(function(e) {
				e.preventDefault();
				LOP.closeBvPopin();
			});
			LOP.BVopened = true;
		}
		LOP.closeBvPopin = function(){
			LOP.showBVselector();
			$('#BVSubmissionContainerPopin').removeClass('on');
			LOP.coreMask.hide();
			LOP.BVopened = false;
		}
		
        // manage basic tooltips on popins (close link and error icons)
        LOP.tooltips.add({
            selector: '#popin:hover',
            ruleNamespace: 'closePopin',
            rule: function(el) {
                if(el.nodeName.toLowerCase() == 'a') {
                    this.setHTML(el.title).setAttributeCache(el, 'title').setId('toolTipAuto');
                }
            }
        }, {
            selector: '#popin:hover',
            ruleNamespace: 'formError',
            rule: function(el) {
                if(el.nodeName.toLowerCase() == 'img') {
                    this.setHTML(el.alt).setAttributeCache(el, 'alt').setId('toolTipError');
                }
            }
        });
        
        // manage main menu
        mainNavTop = $('#productsMenu')[0].offsetHeight + 'px';
		
		$('#beautyOnline').click(function(e) {
			e.preventDefault();
			LOP.openAndSetBaIframe();
   		});
		
		if (W.location.search && W.location.search.substring(1).search(/ba=1/) != -1)
		{
			var iframe = $("#baIframe");
			
			LOP.openAndSetBaIframe();
			if (!iframe.find("body").children().length)
			{
				$('#baIframe').attr("src",LOP.baIframeDefaultSrc);
			}
		}
				
		$('#productsMenu li').hover(
			function(e) {
				var li = $(this);
				var t = $('div.expand', this);
				if(t.length){
					LOP.openMainNav(li, t);
				}
			},
			function(e){
				var li = $(this);
				var t = $('div.expand', this);
				if(t.length){
					LOP.closeMainNav(li, t);
				}
			}
		);

        
        // manage localisation menu
        l10nNav = $('#localisation');
        l10nNavExpand = l10nNav.find('dd');
        l10nNavTitle = l10nNav.find('dt').click(function(e) {
            e.preventDefault();
            if(l10nNav.hasClass('on')) {
                LOP.closeL10nNav();
            } else {
                LOP.openL10nNav();
            }
        });
        l10nNavTitle.html('<a href="#">' + l10nNavTitle.html() + '</a>');
        
        // remove "add to favorites" link
        $('#alreadyInFavorites').prev().remove();
        
        // load any script referenced on <div class="wrapper">
        LOP.loadWrapperScript();
        
        // mailbox creation
        if(((PD.getElementById('checkoutBasket')) || (PD.getElementById('checkoutShipping')) || (PD.getElementById('checkoutSummary')) || (PD.getElementById('checkoutPayment')) || (D.getElementById('checkoutConfirmation')))) {
            // do nothing
        } else {
            if(D.getElementById('mailBoxCreator')) {
                $('#mailBoxCreator .mail').val($('#mbcUEmail').val());
                var action = $('#mailBoxCreator a').attr('href').replace(/.+\('([^']+).*/, '$1');
                __doPostBack(action, '');
            }
            
            // mailbox apply values
            if($('#mailBoxActiveBA .item').length != 0) {
                LOP.sendToMailBox({
                    'element': '#mailBoxActiveBA .item',
                    'eval1': '#mailBoxPastBA',
                    'eval2': '#mailBoxActiveBA .subject'
                });
            }
            if($('#mailBoxActiveBirthday .item').length != 0) {
                LOP.sendToMailBox({
                    'element': '#mailBoxActiveBirthday .item',
                    'eval1': '#mailBoxPastBirthdays',
                    'eval2': '#mailBoxActiveBirthday .subject'
                });
            }
            if($('#mailBoxActiveEvents .item').length != 0) {
                LOP.sendToMailBox({
                    'element': '#mailBoxActiveEvents .item',
                    'eval1': '#mailBoxPastEvents',
                    'eval2': '#mailBoxActiveEvents .subject'
                });
            }
        }
    });
    
    
    $(W).load(function() {
        LOP.getCoreDimensions();
    });
    
    if(D.getElementById('pushsCarousel')) {
        LOP.pushHomeCarousel = new BOX.Carousel({
            element: '#pushsCarousel',
            display: 1,
            duration: 600,
            circular: true
        });
        
        $("#pushsCarousel .next").appendTo("#pushsCarousel");
    };
	
	LOP.loader = $("<span></span>").addClass("loader").text("loading");
	
})(jQuery);