(function($) {
    
    var path = '/';
    if(this.window.location.pathname.toLowerCase().indexOf('/contentmanagerdata/sites/aspnet/') > -1) {
        path = '/ContentManagerData/Sites/aspnet/';
    }
    
    var urlDiagGroupGetAnswer = path + 'ws/forumAdv.asmx/CheckAndGetNextDiagGroup',
        urlUserGetSessionId = path + 'ws/Customer.asmx/InitSession',
        urlUserGetInfos = path + 'ws/Customer.asmx/GetUserInfo',
        urlUserLogin = path + 'ws/Customer.asmx/CustomerLogin',
        urlUserLogout = path + '_zh/_cn/tools/logout.aspx',
        urlUserUpdateExtProp = path + '_zh/_cn/tools/user-update-ext-prop.aspx',
        urlUserTellAFriend = path + 'ws/Customer.asmx/TellAFriend',
        urlForumAddPost = path + 'ws/forumAdv.asmx/SaveForumAdvPostInfo',
        urlForumRemovePost = path + 'ws/forumAdv.asmx/DeleteForumAdvInfo',
        urlShoppingCartAddProduct = path + '_zh/_cn/tools/add-to-basket.aspx';

    var sessionId;
    
    var wrapSuccess = function(fnSuccess, fnError, tag) {
        return function(response) {
            if(fnError && response.getElementsByTagName(tag).length) {
                var msg = response.getElementsByTagName('Message')[0];
                if(msg && msg.firstChild) {
                    fnError(response, (msg && msg.firstChild && msg.firstChild.nodeValue));
                } else {
                    fnError(response);
                }
            } else if(fnSuccess) {
                var sID = response.getElementsByTagName('SessionID')[0];
                if(sID && sID.firstChild) {
                    sessionId = sID.firstChild.nodeValue;
                } else {
                    sessionId = null;
                }
                fnSuccess(response, sessionId);
            }
        };
    };
    
    var wrapError = function(fnError) {
        return function(response) {
            if(fnError) {
                fnError(response);
            }
        };
    };
    
    LOP.wsUserGetSessionId = function(datas) {
        var XMLws = '<?xml version="1.0" encoding="utf-8"?>';
        XMLws += '<Loreal_Reference_IN_InitSession>';
        XMLws += '</Loreal_Reference_IN_InitSession>';
        $.ajax({
            type: 'POST',
            url: urlUserGetSessionId,
            data: 'inputData=' + XMLws,
            success: wrapSuccess(datas.onSuccess, datas.onError, 'Loreal_Reference_OUT_Error'),
            error: wrapSuccess(datas.onError)
        });
    };
    
    LOP.wsUserGetInfos = function(datas) {
        LOP.wsUserGetSessionId({onSuccess: function() {
            if(datas.urlWS) {
                $.ajax({
                    type: 'GET',
                    url: datas.urlWS,
                    data: 'uid=' + sessionId,
                    cache: false,
                    success: function(response) {
                        if(datas.onSuccess) {
                            datas.onSuccess(response);
                        }
                    },
                    error: function(response) {
                        if(datas.onError) {
                            datas.onError(response);
                        }
                    }
                });
            } else {
                var XMLws = '<?xml version="1.0" encoding="utf-8"?>';
                XMLws += '<GetCustomerInfo>';
                XMLws += '<SessionID>' + sessionId + '</SessionID>';
                XMLws += '</GetCustomerInfo>';
                
                $.ajax({
                    type: 'POST',
                    url: urlUserGetInfos,
                    data: 'inputData=' + XMLws,
                    success: wrapSuccess(datas.onSuccess, datas.onError, 'Loreal_Reference_OUT_Error'),
                    error: wrapSuccess(datas.onError)
                });
            }
        }});
    };
    
    LOP.wsUserLogin = function(datas) {
        datas.login = datas.login || '';
        datas.password = datas.password || '';
        
        var XMLws = '<?xml version="1.0" encoding="utf-8"?>';
        XMLws += '<Loreal_Reference_IN_CustomerLogin>';
        XMLws += '<SessionID></SessionID>';
        XMLws += '<Login>' + datas.login + '</Login>';
        XMLws += '<Password>' + datas.password + '</Password>';
        XMLws += '</Loreal_Reference_IN_CustomerLogin>';
        
        $.ajax({
            type: 'POST',
            url: urlUserLogin,
            data: 'inputData=' + XMLws,
            success: wrapSuccess(datas.onSuccess, datas.onError, 'Loreal_Reference_OUT_Error'),
            error: wrapSuccess(datas.onError)
        });
    };
    
    LOP.wsUserLogout = function(datas) {
        $.ajax({
            type: 'GET',
            url: urlUserLogout,
            cache: false,
            success: function(response) {
                if(response.indexOf('success') > -1) {
                    if(datas.onSuccess) {
                        datas.onSuccess();
                    }
                } else {
                    if(datas.onError) {
                        datas.onError();
                    }
                }
            },
            error: function() {
                if(datas.onError) {
                    datas.onError();
                }
            }
        });
    };
    
    LOP.wsUserUpdateExtProp = function(datas) {
        $.ajax({
            type: 'GET',
            url: urlUserUpdateExtProp,
            data: 'name=' + datas.name + '&type=' + datas.type + '&value=' + datas.value,
            success: function(response) {
                if(response.indexOf('success') > -1) {
                    if(datas.onSuccess) {
                        datas.onSuccess();
                    }
                } else {
                    if(datas.onError) {
                        datas.onError();
                    }
                }
            },
            error: function() {
                if(datas.onError) {
                    datas.onError();
                }
            }
        })
    };
    
    LOP.wsForumAddPost = function(datas) {
        LOP.wsUserGetSessionId({onSuccess: function() {
            datas.forumId = datas.forumId || '';
            datas.postId = datas.postId || '';
            datas.replyTo = datas.replyTo || '';
            datas.subject = datas.subject || '';
            datas.message = datas.message || '';
            datas.approved = datas.approved || '0';
            datas.valid = datas.valid || '0';
            datas.properties = datas.properties || {};
            
            var XMLws = '<?xml version="1.0" encoding="utf-8"?>';
            XMLws += '<Loreal_Reference_IN_SaveForumAdvPostInfo>';
            XMLws += '<SessionID>' + sessionId + '</SessionID>';
            XMLws += '<ForumAdvId>' + datas.forumId + '</ForumAdvId>';
            XMLws += '<ForumAdvPostId>' + (datas.postId || '') + '</ForumAdvPostId>';
            XMLws += '<FpParentId>' + (datas.replyTo || '') + '</FpParentId>';
            XMLws += '<FpSubject><![CDATA[' + datas.subject + ']]></FpSubject>';
            XMLws += '<FpText><![CDATA[' + datas.message + ']]></FpText>';
            XMLws += '<FpApproved>' + (datas.approved || '') + '</FpApproved>';
            XMLws += '<FpValid>' + (datas.valid || '') + '</FpValid>';
            XMLws += '<FpPrdCode></FpPrdCode>';
            XMLws += '<FpExtendedProperties>';
            for (var p in datas.properties) {
                if (BOX.isOwnProperty(datas.properties, p)) {
                    XMLws += '<' + p + '>' + datas.properties[p] + '</' + p + '>';
                }
            }
            XMLws += '</FpExtendedProperties>';
            XMLws += '</Loreal_Reference_IN_SaveForumAdvPostInfo>';
            
            $.ajax({
                type: 'POST',
                url: urlForumAddPost,
                data: 'inputData=' + XMLws,
                success: wrapSuccess(datas.onSuccess, datas.onError, 'Loreal_Reference_OUT_Error'),
                error: wrapSuccess(datas.onError)
            });
        }});
    };
    
    LOP.wsForumUpdatePost = function(datas) {
        LOP.wsForumAddPost(datas);
    };
    
    LOP.wsForumRemovePost = function(datas) {
        LOP.wsUserGetSessionId({onSuccess: function() {
            datas.forumId = datas.forumId || '';
            datas.postId = datas.postId || '';
            datas.onSuccess = datas.onSuccess || '';
            datas.onError = datas.onError || '';
            
            var XMLws = '<?xml version="1.0" encoding="utf-8"?>';
            XMLws += '<Loreal_Reference_IN_DeleteForumAdvPostInfo>';
            XMLws += '<SessionID>' + sessionId + '</SessionID>';
            XMLws += '<ForumAdvId>' + datas.forumId + '</ForumAdvId>';
            XMLws += '<ForumAdvPostId>' + datas.postId + '</ForumAdvPostId>';
            XMLws += '</Loreal_Reference_IN_DeleteForumAdvPostInfo>';
            
            $.ajax({
                type: 'POST',
                url: urlForumRemovePost,
                data: 'inputData=' + XMLws,
                success: wrapSuccess(datas.onSuccess, datas.onError, 'Loreal_Reference_OUT_Error'),
                error: wrapSuccess(datas.onError)
            });
        }});
    };
    
    LOP.wsUserTellAFriend = function(datas) {
        LOP.wsUserGetSessionId({onSuccess: function() {
            datas.user.lname = datas.user.lname || '';
            datas.user.fname = datas.user.fname || '';
            datas.user.mail = datas.user.mail || '';
            datas.friend.lname = datas.friend.lname || '';
            datas.friend.fname = datas.friend.fname || '';
            datas.friend.mail = datas.friend.mail || '';
            datas.XMLtemplate = datas.XMLtemplate || '';
            datas.customs = datas.customs || {};
            
            var XMLws = '<?xml version="1.0" encoding="utf-8"?>';
            XMLws += '<Loreal_Reference_IN_TellAFriend>';
            XMLws += '<SessionID>' + sessionId + '</SessionID>';
            XMLws += '<Customer>';
            XMLws += '<FirstName><![CDATA[' + datas.user.fname + ']]></FirstName>';
            XMLws += '<LastName><![CDATA[' + datas.user.lname + ']]></LastName>';
            XMLws += '<Email><![CDATA[' + datas.user.mail + ']]></Email>';
            XMLws += '</Customer>';
            XMLws += '<Friend>';
            XMLws += '<FirstName><![CDATA[' + datas.friend.fname + ']]></FirstName>';
            XMLws += '<LastName><![CDATA[' + datas.friend.lname + ']]></LastName>';
            XMLws += '<Email><![CDATA[' + datas.friend.mail + ']]></Email>';
            XMLws += '</Friend>';
            XMLws += '<TemplateName><![CDATA[' + datas.XMLtemplate + ']]></TemplateName>';
            XMLws += '<Customs>';
            for (var p in datas.customs) {
                if (BOX.isOwnProperty(datas.customs, p)) {
                    XMLws += '<' + p + '><![CDATA[' + datas.customs[p] + ']]></' + p + '>';
                }
            }
            XMLws += '</Customs>';
            XMLws += '</Loreal_Reference_IN_TellAFriend>';
            
            $.ajax({
                type: 'POST',
                url: urlUserTellAFriend,
                data: 'inputData=' + XMLws,
                success: wrapSuccess(datas.onSuccess, datas.onError, 'Loreal_Reference_OUT_Error'),
                error: wrapSuccess(datas.onError)
            });
        }});
    };
    
    LOP.wsShoppingCartAddProduct = function(datas) {
        $.ajax({
            url: urlShoppingCartAddProduct,
            data: {varcode: datas.varcode, qty: datas.quantity || 1},
            success: function(response) {
                if(response.indexOf('addtocartsuccess') > -1) {
                    if(datas.onSuccess) {
                        datas.onSuccess();
                    }
                } else if(datas.onError) {
                    datas.onError(response);
                }
            },
            error: function() {
                if(datas.onError) {
                    datas.onError();
                }
            }
        });
    };

})(jQuery);