var LOP = {};

(function($) {
    
	/**
     * ----------------------------------------------------------------
     * Set Domain For Bazzar Voice & all page in iframe
     * ----------------------------------------------------------------
     */
	function getLorealHost(){
		var newhost;
		var domain;
		var ArrDomain = new Array('.com.cn','.net.cn','.org.cn','.gov.cn','.com','.cn','.tel','.mobi','.net','.org','.asia','.hk','.tv','.biz','.me','.cc','.name','.info'); //枚举所有后缀
		var host = document.domain
		for(k in ArrDomain){
			var re = eval('/\\' + ArrDomain[k] + '$/g');
			newhost = host.replace(re, '');
			if(newhost != host){
				domain = ArrDomain[k];
				break;
			}
		}
		var hostar = newhost.split('.');
		var s = hostar[hostar.length-1]+domain;
		return s;
	}
	document.domain = getLorealHost();
	
    var W = this.window, D = W.document;
    
    LOP.isHostMethod = function(o, p) {
        var t = typeof o[p];
        return t == 'function' || !!(t == 'object' && o[p]) || t == 'unknown';
    };
    
    LOP.isHostCollection = function(o, p) {
        var t = typeof o[p];
        return !!(t == 'object' && o[p]) || t == 'function';
    };
    
    LOP.isHostObject = function(o, p) {
        return !!(typeof(o[p]) == 'object' && o[p]);
    };
    
    if(!LOP.isHostObject(D, 'documentElement') ||
       !LOP.isHostMethod(D, 'getElementsByTagName') ||
       !LOP.isHostMethod(D, 'getElementById') ||
       !LOP.isHostMethod(D, 'createElement') ||
       !LOP.isHostMethod(D, 'createTextNode') ||
       !LOP.isHostObject(W, 'navigator')) {
        LOP.supported = false;
        return;
    }
    
    LOP.supported = true;
    
    var DE = D.documentElement, emptyFn = function() {};
    
    DE.id = 'js';
    
    // @todo implement a method to search for a customer (with an email: fake WS?)
    
    
    // redirection for iPhone/iPod users
    var ua = W.navigator.userAgent.toLowerCase();
    if(ua.indexOf('iphone') > -1 || ua.indexOf('ipod') > -1) {
        W.location.href = l10n.url.iphone;
    }
    
    
    /**
     * ----------------------------------------------------------------
     * Helpers: Flash creation
     * ----------------------------------------------------------------
     */
    LOP.swf = {};
    
    LOP.addSWF = function(datas) {
        $(D).ready(function() {
            var id = datas.id;
            datas.background = datas.background || '#FFFFFF';
            datas.version = datas.version || '9';
            datas.params = datas.params || {};
            datas.params.wmode = datas.params.wmode || 'opaque';
            datas.params.quality = datas.params.quality || 'best';
            datas.variables = datas.variables || {};
            LOP.swf[id] = new SWFObject(datas.url, id, datas.width, datas.height, datas.version, datas.background);
            for(var p in datas.params) {
                if(BOX.isOwnProperty(datas.params, p)) {
                    LOP.swf[id].addParam(p, datas.params[p]);
                }
            }
            for(var v in datas.variables) {
                if(BOX.isOwnProperty(datas.variables, v)) {
                    LOP.swf[id].addVariable(v, datas.variables[v]);
                }
            }
            LOP.swf[id].write(datas.target);
            if(!$(datas.target).find('embed, object').length) {
                $(datas.target).find('div.altToSWF').css('visibility', 'visible');
            }
        });
    };
    
    
    /**
     * ----------------------------------------------------------------
     * Helpers: Send To Friend datas management
     * ----------------------------------------------------------------
     */
    LOP.getAndSetSTFDatas = function(elm) {
        var name = BOX.getStoreId(elm, 'action');
        if(name && LOP.stfDatasActions[name]) {
            LOP.stfDatas = LOP.stfDatasActions[name]();
            return true;
        }
        LOP.stfDatas = null;
        return false;
    };
    
    
    /**
     * ----------------------------------------------------------------
     * Helpers: CoreMetrics datas management
     * See also /js/coremetrics/cmtools.js
     * ----------------------------------------------------------------
     */
    LOP.getAndSetCMDatas = function(elm) {
        var val = BOX.getStoreId(elm, 'cm');
        if(val && LOP.execStatCM) {
            LOP.execStatCM(val);
            return true;
        }
        return false;
    };
    
    
    /**
     * ----------------------------------------------------------------
     * Helpers: form validation management
     * ----------------------------------------------------------------
     */
    LOP.addFormError = function(e, domEvt, msg) {
        var id = e.owner.element.id;
        if(msg && D.getElementById(id + 'Error')) {
            $('#' + id + 'Error').text(msg).css('display', 'block');
        }
        if(LOP.submitFormActions && LOP.submitFormActions[id]) {
            LOP.submitFormActions[id](e, domEvt, false);
        }
    };
    
    LOP.removeFormError = function(e, domEvt) {
        var id = e.owner.element.id;
        $('#' + id + 'Error').css('display', 'none').empty();
        if(LOP.submitFormActions && LOP.submitFormActions[id]) {
            LOP.submitFormActions[id](e, domEvt, true);
        }
    };
    
    var reFieldParentCls = /\b(text|radioGroup|select|checkbox)\b/;
    var getFieldParent = function(field) {
        var t = field.parentNode;
        while(t.parentNode) {
            if(reFieldParentCls.test(t.className)) {
                return t;
            }
            t = t.parentNode;
        }
    };
    
    var errorImg = '<img id="%id%" class="error box:id:formError" alt="%msg%" src="%src%" />';
    
    var fieldsTypes = {
        'checkbox': 'single',
        'password': 'single',
        'radio': 'group',
        'select-one': 'single',
        'text': 'single',
        'textarea': 'single'
    };
    
    var addErrorPicto = {
        single: function(p, img) {
            var t = $('label', p);
            if(t.length == 1) {
                t.prepend(img);
            } else {
                $(p).prepend(img);
            }
        },
        group: function(p, img) {
            var t = $('span.legend', p);
            if(t.length == 1) {
                t.prepend(img);
            } else {
                $(p).prepend(img);
            }
        }
    };
    
    var addFieldError = function(form, field, id, msg) {
        var p = getFieldParent(field);
        if(field.name.indexOf('birthday') > -1 || field.name.indexOf('birthmonth') > -1) {
            p = p.parentNode.getElementsByTagName('label')[0];
        }
        $(p).addClass('error');
        id = id + 'Error';
        var img = $('#' + id);
        if(!img.length) {
            var type = BOX.getStoreId(field, 'group') ? 'group' : fieldsTypes[field.type];
            if(type) {
                var src = form.iconErrorSrc || LOP.iconErrorSrc || '/img/common/picto/error.gif';
                addErrorPicto[type](p, errorImg.replace('%src%', src).replace('%id%', id).replace('%msg%', msg));
            }
        } else {
            img.attr('alt', msg);
        }
    };
    
    var removeFieldError = function(form, field, id) {
        $('#' + id + 'Error').remove();
        var p = getFieldParent(field);
        $(p).removeClass('error');
    };
    
    LOP.manageFieldError = function(e, msg) {
        if(e.namespace && e.namespace.length == 2) {
            var type = e.namespace[0], name = e.namespace[1], obj = this[type](name), field;
            if(obj.getElement(0)) {
                if(obj.name.indexOf('birthday') > -1 || obj.name.indexOf('birthmonth') > -1) {
                    field = this.text('birthyear').getElement();
                    name = this.text('birthyear').name;
                } else {
                    field = obj.getElement(0);
                }
                if(msg) {
                    addFieldError(e.owner, field, BOX.getStoreId(field, 'group') || name, msg);
                } else {
                    removeFieldError(e.owner, field, BOX.getStoreId(field, 'group') || name);
                }
            }
            obj = field = null;
        }
    };
    
    LOP.validateEmail = function(field) {
        if(field.isEmpty()) {
            return l10n.errorMsg.required.email;
        } else if(!field.isMatching('email')) {
            return l10n.errorMsg.invalid.email;
        }
    };
    
    
    /**
     * ----------------------------------------------------------------
     * Helpers: popins management
     * ----------------------------------------------------------------
     */
    LOP.getAndDoAnyPopinClosing = function(elm, id) {
        id = id || BOX.getStoreId(elm, 'id');
        if(id == 'closePopin' && LOP.popins) {
            LOP.popins.close();
            return true;
        }
        return false;
    };
    
    LOP.getPopinDatas = function(elm) {
        return {
            url: elm.href,
            id: BOX.getStoreId(elm, 'id'),
            refresh: BOX.getStoreId(elm, 'mode') == 'nocache' ? true : false,
            processHTML: BOX.getStoreId(elm, 'process') != 'false' ? LOP.processHTMLPopins : undefined,
            mask: BOX.getStoreId(elm, 'mask')
        };
    };
    
    LOP.openPopin = function(datas) {
        if(LOP.popins) {
            if(datas.tagName) {
                datas = LOP.getPopinDatas(datas);
            }
            
            if(datas.url && datas.id) {
                LOP.popins.maskType = datas.mask;
                
                LOP.popins.add({
                    url: datas.url,
                    id: datas.id,
                    refresh: datas.refresh,
                    processHTML: datas.processHTML
                });
                return true;
            }
        }
        return false;
    };
    
    LOP.centerPopinVertically = function(container) {
        var top = (container[0].offsetHeight - LOP.popins.currentDOM[0].offsetHeight) / 2;
        LOP.popins.currentDOM.css('top', top + 'px');
    };
    
    
    /**
     * ----------------------------------------------------------------
     * Helpers: scrolls creation
     * ----------------------------------------------------------------
     */
    LOP.scrolls = {};
    
    LOP.addVerticalScroll = function(elm, id) {
        LOP.scrolls[id] = new BOX.SimpleScroll({target: elm});
    };
    
    LOP.addHorizontalScroll = function(elm, id, options) {
        LOP.scrolls[id] = new BOX.SimpleScroll({
            target: elm,
            targetScrollBar: options.scrollTarget,
            from: 'left',
            listeners: {
                'beforeCompute': {
                    fn: function(e) {
                        var li = $('li', this.sContent);
                        if(options.visibleOnLine && li.length >= options.visibleOnLine) {
                            this.sContent.width(Math.ceil(li.length / 2) * options.itemWidth);
                        } else {
                            this.sContent.width(li.length * options.itemWidth);
                        }
                        var left = 0;
                        if(options.scrollOffsetTarget !== null) {
                            left = $(options.scrollTarget + ' ' + (options.scrollOffsetTarget || 'h2')).width();
                        }
                        this.sContainer.css({
                            'left': (left + options.scrollMargin) + 'px',
                            'width': (options.totalWidth - left - options.scrollMargin) + 'px'
                        });
                    }
                }
            }
        });
    };
    
    
    /**
     * ----------------------------------------------------------------
     * Helpers: get <div id="core"> dimensions
     * ----------------------------------------------------------------
     */
    LOP.getCoreDimensions = function() {
        LOP.coreHeight = $('#core')[0].offsetHeight;
        LOP.coreOffset = $('#core').offset();
        LOP.coreOffsetMax = {top: LOP.coreOffset.top + LOP.coreHeight, left: LOP.coreOffset.left + 950};
        LOP.maskTop = $('#header').height();
        LOP.maskHeight = LOP.coreHeight - LOP.maskTop;
    };
    
    
    /**
     * ----------------------------------------------------------------
     * Helpers: script asynchronous loading
     * ----------------------------------------------------------------
     */
    LOP.loadScript = function(datas) {
        $.ajax({
            type: 'GET',
            url: datas.url,
            dataType: 'script',
            cache: datas.cache !== false,
            error: datas.onError || emptyFn,
            success: datas.onSuccess || emptyFn
        });
    };
    
    LOP.loadWrapperScript = function() {
        var url = BOX.getStoreId($('div.wrapper')[0], 'js');
        if(url) {
            url += '.js';
            if(url.indexOf('/') > -1) {
                LOP.loadScript({url: url, cache: false});
            } else {
                LOP.loadScript({url: '/js/dev/pages/' + url, cache: false});
            }
        }
    };
	
	LOP.Now = function()
    {
        return new Date();
    };
    
})(jQuery);