/* Minification failed. Returning unminified contents.
(7219,515-516): run-time error JS1013: Syntax error in regular expression: )
 */
$(function () {
    var preloads = [
        '//cache.kreezee.com/images/ajax-loader.gif'
    ];

    $(preloads).each(function () {
        $('<img />')[0].src = this;
    });

    $.ajaxSetup({
        error: function (error) {
            if (error.status == 401) {
                window.location.href = '/';
            }
        }
    })
});

window.onhashchange = function () {
    core.hashChange();
};

var logger = function () {
    var oldConsoleLog = null;
    var pub = {};

    pub.enableLogger = function enableLogger() {
        if (oldConsoleLog == null)
            return;

        window['console']['log'] = oldConsoleLog;
    };

    pub.disableLogger = function disableLogger() {
        oldConsoleLog = console.log;
        window['console']['log'] = function () { };
    };

    return pub;
}();

function checkIfAdobeFlashIsInstalled() {
    if (!$.browser.flash)
        $('#adobe-flash-is-staff').toggle();
}

// Check if a user email already exist.
function checkUserEmail(email) {
    var jData = {};
    var result;
    jData._email = email;

    // Remove CSS styles.
    $('#checkUserEmail').removeClass('validationSuccess validationError');
    $('#checkUserEmail').html('');

    if (isValidEmailAddress(email.value)) {
        result = Utilities.postJSON(config.webService.wsUser + 'CheckUserEmail', jData);
        if (result != null) {
            $('#checkUserEmail').addClass('validationError');
            $('#checkUserEmail').html('Erreur');

        } else {
            $('#checkUserEmail').addClass('validationSuccess');
        }
    }
}

// Call Search service.
function searchTextProfil(obj) {
    var jData = {};
    var result;

    var searchbox = $(obj).val();
    if (searchbox == '') {
        $('#display-search-results').hide();
    }
    else {
        jData._searchValue = $(obj).val();
        result = Utilities.postJSON(config.webService.wsSearch + 'GetSearchResults', jData);
        if (result != null) {
            $('#display-search-results').html(result.d).show();
        }
    }
}

var tabs = {
    season: {
        informations: 0,
        divisions: 1,
        periods: 2,
        standings: 3,
        matchs: 4,
        stats: 5,
        tree: 7
    },
    team: {
        informations: 0,
        //admin: 1,
        calendar: 1,
        player: 2,
        staff: 3,
        //media: 5,
        suspension: 4,
        management: 5,
        startingPitchers: 7
    },
    match: {
        informations: 0,
    },
    matchScoreboard: {
        lineups: 0,
        staffs: 1,
        stats: 2,
        stars: 3
    },
    connection: {
        connections: 0,
        groups: 1,
        fans: 2,
        requests: 3,
        find: 4
    },
    connectionGroup: {
        informations: 0,
        connections: 1
    }
};

var images = {
    url: '//cache.kreezee.com/',
    hockeyTeamDefault: 'images/teams/hockey-team-default.png',
    hockeyPlayerDefault: 'images/players/hockey-player-default.png',
    newsDefault: 'images/news/News-default.png'
};

/************************************************/
/*************** Administration *****************/
/************************************************/
var admin = {
    sendContactUs: function (firstName, lastName, email, phoneNumber, organizationName, comments, culture) {
        var jData = {};
        jData.firstName = firstName;
        jData.lastName = lastName
        jData.email = email;
        jData.phoneNumber = phoneNumber;
        jData.organizationName = organizationName;
        jData.comments = comments;
        jData.culture = culture;

        return data.post(config.webService.wsUserSuscribe + 'SendContactUs', jData);
    },

    contactUs: function (name, email, message, culture) {
        var jContactUs = {};
        jContactUs.name = name;
        jContactUs.email = email
        jContactUs.message = message;
        jContactUs.culture = culture;

        var jData = {};
        jData.contactUs = jContactUs;

        return data.post(config.webService.wsUserSuscribe + 'ContactUs', jData);
    },

    sendSales: function (firstName, lastName, email, phoneNumber, organizationName, comments, culture) {
        var jData = {};
        jData.firstName = firstName;
        jData.lastName = lastName
        jData.email = email;
        jData.phoneNumber = phoneNumber;
        jData.organizationName = organizationName;
        jData.comments = comments;
        jData.culture = culture;

        return data.post(config.webService.wsUserSuscribe + 'SendSales', jData);
    },


    suscribeUser: function (email, firstName, lastName, sportSelected, culture) {
        var jData = {};
        jData.email = email;
        jData.firstName = firstName;
        jData.lastName = lastName;
        jData.sportSelected = sportSelected;
        jData.culture = culture;

        return Utilities.postJSON(config.webService.wsUserSuscribe + 'SuscribeUser', jData);
    },

    unsuscribeUser: function (email) {
        var jData = {};
        jData.email = email;

        return Utilities.postJSON(config.webService.wsUserSuscribe + 'UnsuscribeUser', jData);
    },

    isSuscribeUser: function (email) {
        var jData = {};
        jData.email = email;

        return Utilities.postJSON(config.webService.wsUserSuscribe + 'IsSuscribeUser', jData);
    },

    getSuscribeUser: function (email) {
        var jData = {};
        jData.email = email;

        return Utilities.postJSON(config.webService.wsUserSuscribe + 'GetUserSuscribe', jData);
    },

    getStates: function (culture, callback) {
        var jData = {};
        jData.culture = culture;

        Utilities.postJSONAsynch(config.webService.wsAdminService + 'GetStates', jData, callback, arguments[2]);
    },

    getCustomPageByUrl: function (url, callback) {
        var jData = {};
        jData.url = url;

        Utilities.postJSONAsynch(config.webService.wsCustomPage + 'GetByUrl', jData, callback, arguments[2]);
    },

    createCustomPage: function (url, title, description, body, keywords, callback) {
        var jData = {};
        jData.url = url;
        jData.title = title;
        jData.description = description;
        jData.body = body;
        jData.keywords = keywords;

        Utilities.postJSONAsynch(config.webService.wsCustomPage + 'Create', jData, callback, arguments[6]);
    },

    updateCustomPage: function (url, title, description, body, keywords, callback) {
        var jData = {};
        jData.url = url;
        jData.title = title;
        jData.description = description;
        jData.body = body;
        jData.keywords = keywords;

        Utilities.postJSONAsynch(config.webService.wsCustomPage + 'Update', jData, callback, arguments[6]);
    },

    deleteCustomPage: function (url, callback) {
        var jData = {};
        jData.url = url;

        Utilities.postJSONAsynch(config.webService.wsCustomPage + 'Delete', jData, callback, arguments[2]);
    },

    importData: function (filePath, solutionId, season, team, seasonTeam, player, sportCenter, match, staff, team_stat, player_stat, callback) {
        var jData = {};
        jData.filePath = filePath;
        jData.solutionId = solutionId;
        jData.season = season;
        jData.team = team;
        jData.seasonTeam = seasonTeam;
        jData.player = player;
        jData.sportCenter = sportCenter;
        jData.match = match;
        jData.staff = staff;
        jData.stat_team = team_stat;
        jData.stat_player = player_stat;

        Utilities.postJSONAsynch(config.webService.wsImportData + 'Import', jData, callback);
    },

    importSeasons: function (filePath, match, team_stat, player_stat, callback) {
        var jData = {};
        jData.filePath = filePath;
        jData.match = match;
        jData.stat_team = team_stat;
        jData.stat_player = player_stat;

        Utilities.postJSONAsynch(config.webService.wsImportData + 'ImportSeasons', jData, callback);
    },

    getStateList: function (culture) {
        var jData = {};

        if (culture == undefined) {
            culture = core.getLanguage();
        }

        if (window.sessionStorage.states == undefined) {
            jData.culture = culture;

            var states = Utilities.postJSON(config.webService.wsAdminService + 'GetStates', jData);
            window.sessionStorage.states = JSON.stringify(states);
            return JSON.parse(window.sessionStorage.states);
        }
        else {
            return JSON.parse(window.sessionStorage.states);
        }
    },

    getJersey: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;

        return data.post(config.webService.wsAdminService + 'GetJerseyBySolution', jData);
    },

    getUserInformation: function (accountId) {
        var jData = {};
        jData.accountId = accountId;

        return data.post(config.webService.wsAdminService + 'GetUserInformation', jData);
    },

    getStatesByCountry: function (countryId, culture, callback) {
        var jData = {};
        jData.countryId = countryId;
        jData.culture = culture;

        Utilities.postJSONAsynch(config.webService.wsAdminService + 'GetStatesByCountry', jData, callback, arguments[3]);
    },

    getSolutionPage: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;

        return data.post(config.webService.wsAdminService + 'GetSolutionPage', jData);
    },

    getBackgrounds: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;

        return data.post(config.webService.wsAdminService + 'GetBackgroundsBySolution', jData);
    },

    getDocumentationType: function () {
        var jData = {};

        return data.post(config.webService.wsAdminService + 'GetDocumentationType', jData);
    },

    createItem: function (item) {
        var jData = {};
        jData.item = item;

        return data.post(config.webService.wsAdminService + 'CreateItem', jData);
    },

    updateItem: function (item) {
        var jData = {};
        jData.item = item;

        return data.post(config.webService.wsAdminService + 'UpdateItem', jData);
    },

    deleteItem: function (itemId) {
        var jData = {};
        jData.itemId = itemId;

        return data.post(config.webService.wsAdminService + 'DeleteItem', jData);
    },

    searchItem: function (culture, searchText) {
        var jData = {};
        jData.culture = culture;
        jData.searchText = searchText;

        return data.post(config.webService.wsAdminService + 'SearchItem', jData);
    },

    searchItemByType: function (culture, typeId, searchText) {
        var jData = {};
        jData.culture = culture;
        jData.typeId = typeId;
        jData.searchText = searchText;

        return data.post(config.webService.wsAdminService + 'SearchItemByType', jData);
    },

    getItemByType: function (typeId) {
        var jData = {};
        jData.typeId = typeId;

        return data.post(config.webService.wsAdminService + 'GetItemByTypeId', jData);
    },

    getItemById: function (itemId) {
        var jData = {};
        jData.itemId = itemId;

        return data.post(config.webService.wsAdminService + 'GetItemById', jData);
    }
};

/************************************************/
/*************** Advertisement ******************/
/************************************************/
var ads = {
    getAdvertisers: function (page, pageSize, sort, search) {
        var jData = {};
        jData.page = page;
        jData.pageSize = pageSize;
        jData.sort = sort || "";
        jData.search = search || "";

        return data.post(config.webService.wsAds + 'GetAdvertisers', jData);
    },

    getAdvertiserById: function (advertiserId) {
        var jData = {};

        jData.advertiserId = advertiserId;

        return data.post(config.webService.wsAds + 'GetAdvertiserById', jData);
    },

    getAdvertisersBySolutionId: function (solutionId, page, pageSize, sort, search) {
        var jData = {};

        jData.solutionId = solutionId;
        jData.page = page || 1;
        jData.pageSize = pageSize || 100000;
        jData.sort = sort || "";
        jData.search = search || "";

        return data.post(config.webService.wsAds + 'GetAdvertisersBySolutionId', jData);
    },

    getBannersByAdvertiserId: function (advertiserId) {
        var jData = {};

        jData.advertiserId = advertiserId;

        return data.post(config.webService.wsAds + 'GetBannersByAdvertiserId', jData);
    },

    getBannersBySolutionId: function (solutionId) {
        var jData = {};

        jData.solutionId = solutionId;

        return data.post(config.webService.wsAds + 'GetBannersBySolutionId', jData);
    },

    getBannersByTeamId: function (teamId) {
        var jData = {};

        jData.teamId = teamId;

        return data.post(config.webService.wsAds + 'GetBannersByTeamId', jData);
    },

    createAdvertiser: function (advertiser) {
        var jData = {};

        jData.advertiser = advertiser;

        return data.post(config.webService.wsAds + 'CreateAdvertiser', jData);
    },

    updateAdvertiser: function (advertiser) {
        var jData = {};

        jData.advertiser = advertiser;

        return data.post(config.webService.wsAds + 'UpdateAdvertiser', jData);
    },

    deleteAdvertiser: function (advertiserId) {
        var jData = {};
        jData.advertiserId = advertiserId;

        return data.post(config.webService.wsAds + 'DeleteAdvertiser', jData);
    },

    getBannerById: function (bannerId) {
        var jData = {};

        jData.bannerId = bannerId;

        return data.post(config.webService.wsAds + 'GetBannerById', jData);
    },

    getSolutionByBannerId: function (bannerId) {
        var jData = {};

        jData.bannerId = bannerId;

        return data.post(config.webService.wsAds + 'GetSolutionByBannerId', jData);
    },

    createBanner: function (banner) {
        var jData = {};

        jData.banner = banner;

        return data.post(config.webService.wsAds + 'CreateBanner', jData);
    },

    updateBanner: function (banner) {
        var jData = {};

        jData.banner = banner;

        return data.post(config.webService.wsAds + 'UpdateBanner', jData);
    },

    deleteBanner: function (bannerId) {
        var jData = {};

        jData.bannerId = bannerId;

        return data.post(config.webService.wsAds + 'DeleteBanner', jData);
    },

    deleteBannerSolution: function (bannerId, solutionId) {
        var jData = {};

        jData.bannerId = bannerId;
        jData.solutionId = solutionId;

        return data.post(config.webService.wsAds + 'DeleteBannerSolution', jData);
    },

    createBannerSolution: function (bannerId, solutionIds) {
        var jData = {};

        jData.bannerId = bannerId;
        jData.solutionIds = solutionIds;

        return data.post(config.webService.wsAds + 'CreateBannerSolution', jData);
    },

    getExternalAdvertiser: function (solutionId, isValidateSponsorThisGame) {
        var queryKeyValue = { solutionId: solutionId, isValidateSponsorThisGame: isValidateSponsorThisGame }

        return data.get(String.format('/api/advertiser/externalconfig{0}', Utilities.buildQueryString(queryKeyValue)), {});
    }
}

/************************************************/
/****************** Account *********************/
/************************************************/
var core = {
    createAccount: function (email, password, lastName, firstname, accountType, culture, token, callback) {
        var jData = {};
        jData.email = email;
        jData.password = password;
        jData.lastName = lastName;
        jData.firstname = firstname;
        jData.accountType = accountType;
        jData.culture = culture;
        jData.token = token;

        Utilities.postJSONAsynch(config.webService.wsUser + 'Create', jData, callback, arguments[8]);
    },

    isEmailExist: function (email) {
        var jData = {};
        jData.email = email;

        return Utilities.postJSON(config.webService.wsAuthentication + 'IsEmailExist', jData);
    },

    searchUser: function (searchTerm, sourceArray) {
        var jData = {};
        jData.text = searchTerm;

        return sourceArray(Utilities.postJSON(config.webService.wsUser + 'SearchByName', jData));
    },

    searchUserWithoutConnection: function (searchTerm, sourceArray) {
        var jData = {};
        jData.text = searchTerm;

        return sourceArray(Utilities.postJSON(config.webService.wsUser + 'SearchWithoutConnection', jData));
    },

    signIn: function (username, password, stayConnected, callback) {
        var jData = {};
        jData.username = username;
        jData.password = password;
        jData.stayConnected = stayConnected;

        Utilities.postJSONAsynch(config.webService.wsAuthentication + 'SignIn', jData, callback, arguments[4]);
    },

    isAccountFromToken: function (token) {
        var jData = {};
        jData.token = token;

        return data.post(config.webService.wsAuthentication + 'IsAccountFromToken', jData);
    },

    getTokenType: function (token) {
        var jData = {};
        jData.token = token;

        return data.post(config.webService.wsAuthentication + 'GetTokenType', jData);
    },

    updateTokenType: function (token, type) {
        var jData = {};
        jData.token = token;
        jData.type = type;

        return data.post(config.webService.wsAuthentication + 'UpdateTokenType', jData);
    },

    getAdminsBySolution: function (solutionId, callback) {
        var jData = {};
        jData.solutionId = solutionId;

        Utilities.postJSONAsynch(config.webService.wsAccounAdministrator + 'GetBySolution', jData, callback, arguments[2]);
    },

    updateAdministratorRole: function (solutionId, accountId, roleId) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.accountId = accountId;
        jData.roleId = roleId;

        return data.post(config.webService.wsAccounAdministrator + 'UpdateRole', jData);
    },

    addSolutionAdministratorByEmail: function (solutionId, email, roleId, culture, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.email = email;
        jData.roleId = roleId;
        jData.culture = culture;

        Utilities.postJSONAsynch(config.webService.wsAccounAdministrator + 'AddSolutionAdministratorByEmail', jData, callback, arguments[5]);
    },

    addSolutionAdministratorByConnection: function (solutionId, connectionId, roleId, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.connectionId = connectionId;
        jData.roleId = roleId;

        Utilities.postJSONAsynch(config.webService.wsAccounAdministrator + 'AddSolutionAdministratorByConnection', jData, callback, arguments[4]);
    },

    saveTeamManager: function (solutionId, teamId, email, sectionsRight) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.teamId = teamId;
        jData.email = email;
        jData.sectionsRight = sectionsRight;

        return data.post(config.webService.wsAccounAdministrator + 'SaveTeamManager', jData);
    },

    resendTeamManagerInvitation: function (solutionId, teamId, email) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.teamId = teamId;
        jData.email = email;

        return data.post(config.webService.wsAccounAdministrator + 'ResendTeamManagerInvitation', jData);
    },

    getTeamManager: function (solutionId, teamId) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.teamId = teamId;

        return data.post(config.webService.wsAccounAdministrator + 'GetTeamManager', jData);
    },

    deleteAdministrator: function (accountId, solutionId, callback) {
        var jData = {};
        jData.accountId = accountId;
        jData.solutionId = solutionId;

        Utilities.postJSONAsynch(config.webService.wsAccounAdministrator + 'Delete', jData, callback, arguments[3]);
    },

    acceptRequestAdminSolution: function (solutionId, callback) {
        var jData = {};
        jData.solutionId = solutionId;

        Utilities.postJSONAsynch(config.webService.wsAccounAdministrator + 'AcceptRequestAdminSolution', jData, callback, arguments[2]);
    },

    acceptRequestAdminTeamManager: function (guid, callback) {
        var jData = {};
        jData.actionGuid = guid;

        Utilities.postJSONAsynch(config.webService.wsAccounAdministrator + 'AcceptRequestAdminTeamManager', jData, callback, arguments[2]);
    },

    refuseRequestAdminSolution: function (solutionId, callback) {
        var jData = {};
        jData.solutionId = solutionId;

        Utilities.postJSONAsynch(config.webService.wsAccounAdministrator + 'RefuseRequestAdminSolution', jData, callback, arguments[2]);
    },

    acceptRequestAction: function (guid, type) {
        var jData = {};
        jData.guid = guid;
        jData.type = type;

        return data.post(config.webService.wsRequest + 'AcceptAction', jData);
    },

    deleteAdminInvitation: function (invitationId, callback) {
        var jData = {};
        jData.invitationId = invitationId;

        return data.post(config.webService.wsAccounAdministrator + 'DeleteInvitation', jData);
    },

    changeLanguage: function (accountId, newculture) {
        var jData = {};
        jData.accountId = accountId;
        jData.culture = newculture;

        return Utilities.postJSON(config.webService.wsUser + 'ChangeLanguage', jData);
    },

    sendEmail: function (emailFrom, displayName, emailTo, subject, message) {
        var jData = {};
        jData.emailFrom = emailFrom;
        jData.displayName = displayName;
        jData.emailTo = emailTo;
        jData.subject = subject;
        jData.message = message;

        return Utilities.postJSON(config.webService.wsFeedback + 'SendEmail', jData);
    },

    getRequestAccount: function (callback) {
        var jData = {};

        Utilities.postJSONAsynch(config.webService.wsAccountRequest + 'GetByAccount', jData, callback, arguments[1]);
    },

    getRequestCountByAccount: function (status) {
        var jData = {};
        jData.status = status;

        return Utilities.postJSON(config.webService.wsAccountRequest + 'GetCountByAccount', jData);
    },

    getRequestCountByAccountAsynch: function (status, callback) {
        var jData = {};
        jData.status = status;

        Utilities.postJSONAsynch(config.webService.wsAccountRequest + 'GetCountByAccount', jData, callback, arguments[2]);
    },

    getRequestAccountStatus: function (status, callback) {
        var jData = {};
        jData.status = status;

        Utilities.postJSONAsynch(config.webService.wsAccountRequest + 'GetByAccountStatus', jData, callback, arguments[2]);
    },

    getFeatureAccount: function (pageName, culture) {
        var jData = {};
        jData.pageName = pageName;
        jData.culture = culture;

        return Utilities.postJSON(config.webService.wsFeature + 'Gets', jData);
    },

    getUserStatus: function (accountId) {
        var jData = {};
        jData.accountId = accountId;

        return Utilities.postJSON(config.webService.wsUser + 'GetUserStatus', jData);
    },

    setUserStatus: function (status) {
        var jData = {};
        jData.status = status;

        return Utilities.postJSON(config.webService.wsUser + 'SetUserStatus', jData);
    },

    setFeatureAccount: function (featureId) {
        var jData = {};
        jData.featureId = featureId;

        return Utilities.postJSON(config.webService.wsFeature + 'SetFeature', jData);
    },

    logoutUser: function () {
        window.sessionStorage.clear();
        var backlen = history.length; // Clean history
        history.go(-backlen);
        window.location.href = language.global.pageDefaultUrl;
    },

    getUsername: function () {
        var currentUser;
        currentUser = Utilities.getSession('CurrentUser');
        return currentUser.FirstName + ' ' + currentUser.LastName;
    },

    getLanguage: function () {
        var currentUser;
        currentUser = Utilities.getSession('CurrentUser');
        var language = Utilities.getCookie('Language');
        if (currentUser) {
            return currentUser.Culture;
        }
        else if (language) {
            return language;
        }
        else {
            return 'fr';
        }

    },

    getUserAvatar: function () {
        var currentUser;
        currentUser = Utilities.getSession('CurrentUser');
        return currentUser.Avatar;
    },

    getUserLanguage: function () {
        var currentUser;
        currentUser = Utilities.getSession('CurrentUser');
        return currentUser.Culture;
    },

    changeUserLanguage: function (language) {
        var currentUser;
        currentUser = Utilities.getSession();
        console.log(currentUser);
    },

    getUserUrl: function (isPhoneGapApplication) {
        var url = Utilities.postJSON(config.webService.wsUser + 'GetUserUrl', { isPhoneGapApplication: isPhoneGapApplication });

        return url;
    },

    getAccountId: function () {
        var currentUser;
        currentUser = Utilities.getSession('CurrentUser');
        if (currentUser != null) {
            return currentUser.Id;
        } else {
            window.location.href = language.global.pageDefaultUrl;
        }
    },

    hashChange: function () {
        if (language.urlRewrite === undefined) return;

        if (document.location.pathname.indexOf(language.urlRewrite.prefixUser) == 1) {
            switch (document.location.hash.split('/?')[0]) {
                case '#' + language.userDashboardMenu.hashtags.confidentiality:
                    $('#user-section').load('/App_Ctrl/User/Settings/privacy.html', function () {
                        $('#user-section').show();
                    });
                    break;
                case '#' + language.userDashboardMenu.hashtags.notifications:
                    $('#user-section').load('/App_Ctrl/User/Settings/notifications.html', function () {
                        $('#user-section').show();
                    });
                    break;
                case '#' + language.userDashboardMenu.hashtags.display:
                    $('#user-section').load('/App_Ctrl/User/Settings/display.html', function () {
                        $('#user-section').show();
                    });
                    break;
                case '#' + language.userDashboardMenu.hashtags.password:
                    $('#user-section').load('/App_Ctrl/User/Security/password.html', function () {
                        $('#user-section').show();
                    });
                    break;
                case '#' + language.userDashboardMenu.hashtags.solutions:
                    $('#user-section').load('/App_Ctrl/User/Account/solutions.html', function () {
                        $('#user-section').show();
                    });
                    break;
                case '#' + language.userDashboardMenu.hashtags.informations:
                default:
                    $('#user-section').load('/App_Ctrl/User/Profile/user-account.html', function () {
                        $('#user-section').show();
                    });
            }
        }
        else if (document.location.pathname.indexOf(language.urlRewrite.prefixLeague) == 1) {
            switch (document.location.hash.split('/?')[0]) {
                case '#' + language.dashboardMenu.hashtags.divisions:
                    $('#league-section').load('/App_Ctrl/Division/divisions.html', function () {
                        $('#league-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.players:
                    $('#league-section').load('/App_Ctrl/Player/players.html', function () {
                        $('#league-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.teams:
                    $('#league-section').load('/App_Ctrl/Team/teams.html', function () {
                        $('#league-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.staff:
                    $('#league-section').load('/App_Ctrl/Staff/staff.html', function () {
                        $('#league-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.leagueAccount:
                    $('#league-section').load('/App_Ctrl/League/league-account.html', function () {
                        $('#league-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.seasons:
                    $('#league-section').load('/App_Ctrl/Season/seasons.html', function () {
                        $('#league-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.games:
                    $('#league-section').load('/App_Ctrl/Season/games.html', function () {
                        $('#league-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.sportsCenters:
                    $('#league-section').load('/App_Ctrl/SportCenter/sportsCenters.html', function () {
                        $('#league-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.news:
                    $('#league-section').load('/App_Ctrl/Medias/news.html', function () {
                        $('#league-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.videos:
                    $('#league-section').load('/App_Ctrl/Medias/videos.html', function () {
                        $('#league-dashboard').hide();
                    });
                    break;

                case '#photos':
                    $('#league-section').load('/App_Ctrl/Medias/photos.html', function () {
                        $('#league-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.suspensions:
                    $('#league-section').load('/App_Ctrl/Suspension/suspensions.html', function () {
                        $('#league-dashboard').hide();
                    });
                    break;
                default:
                    $('#league-section').load('/App_Ctrl/Season/calendar.html', function () {
                        $('#league-dashboard').hide();
                    });
            }
        }
        else if (document.location.pathname.indexOf(language.urlRewrite.prefixPortal) == 1) {
            switch (document.location.hash.split('/?')[0]) {

                case '#' + language.dashboardMenu.hashtags.players:
                    $('#portal-section').load('/App_Ctrl/Player/players.html', function () {
                        $('#portal-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.teams:
                    $('#portal-section').load('/App_Ctrl/Team/teams.html', function () {
                        $('#portal-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.staff:
                    $('#portal-section').load('/App_Ctrl/Staff/staff.html', function () {
                        $('#portal-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.leagueAccount:
                    $('#portal-section').load('/App_Ctrl/League/league-account.html', function () {
                        $('#portal-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.games:
                    $('#portal-section').load('/App_Ctrl/Season/games.html', function () {
                        $('#portal-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.sportsCenters:
                    $('#portal-section').load('/App_Ctrl/SportCenter/sportsCenters.html', function () {
                        $('#portal-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.news:
                    $('#portal-section').load('/App_Ctrl/Medias/news.html', function () {
                        $('#portal-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.videos:
                    $('#portal-section').load('/App_Ctrl/Medias/videos.html', function () {
                        $('#portal-dashboard').hide();
                    });
                    break;

                case '#' + language.dashboardMenu.hashtags.photos:
                    $('#portal-section').load('/App_Ctrl/Medias/photos.html', function () {
                        $('#portal-dashboard').hide();
                    });
                    break;

                default:
                    $('#portal-section').load('/App_Ctrl_Portal/Solutions/solutions.html', function () {
                        $('#portal-dashboard').hide();
                    });
            }
        }
    },

    initializeListPager: function () {
        $('#button-first-page').button({ icons: { primary: "ui-icon-seek-first" }, text: false });
        $('#button-previous-page').button({ icons: { primary: "ui-icon-seek-prev" }, text: false });
        $('#button-next-page').button({ icons: { primary: "ui-icon-seek-next" }, text: false });
        $('#button-last-page').button({ icons: { primary: "ui-icon-seek-end" }, text: false });
    },

    modifyPassword: function (oldPassword, newPassword, callback) {
        var jData = {};
        jData.oldPassword = oldPassword;
        jData.newPassword = newPassword;

        Utilities.postJSONAsynch(config.webService.wsUser + 'ModifyPassword', jData, callback, arguments[3]);
    },

    resetPassword: function (email) {
        var jData = {};
        jData.email = email;

        return Utilities.postJSON(config.webService.wsUser + 'ResetPassword', jData);
    },

    modifyTemporaryPassword: function (email, currentPassword, newPassword, callback) {
        var jData = {};
        jData.email = email;
        jData.temporaryPassword = currentPassword;
        jData.newPassword = newPassword;
        debugger;
        console.log(arguments[4]);
        Utilities.postJSONAsynch(config.webService.wsUser + 'ModifyTemporaryPassword', jData, callback, arguments[4]);
    },

    activateAccount: function (activationKey, culture, callback) {
        var jData = {};
        jData.activationKey = activationKey;
        jData.culture = culture;

        Utilities.postJSONAsynch(config.webService.wsUser + 'AccountActivation', jData, callback, arguments[3]);
    }
};

/************************************************/
/******************** User **********************/
/************************************************/
var user = {
    get: function () {
        var jData = {};

        return data.post(config.webService.wsUser + 'Get', jData);
    },

    update: function (user) {
        var jData = {};
        jData.user = user;

        return data.post(config.webService.wsUser + 'Update', jData);
    },

    updateAttendance: function (contactId, calendarId, attendanceType) {
        var jData = {};
        jData.contactId = contactId;
        jData.calendarId = calendarId;
        jData.attendanceType = attendanceType;

        return data.post(config.webService.wsUser + 'UpdateAttendance', jData);
    },

    refreshUserSecurity: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;

        return data.post(config.webService.wsUser + 'RefreshUserSecurity', jData);
    },

    getSolutionSecurity: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;

        return data.post(config.webService.wsUser + 'GetSolutionSecurity', jData);
    },

    payPremiumAccount: function (securityToken, creditCardToken) {
        var jData = {};
        jData.securityToken = securityToken;
        jData.creditCardToken = creditCardToken;

        return data.post(config.webService.wsUser + 'PayPremiumAccount', jData);
    },

    search: function (searchTerm) {
        var jData = {};
        jData.text = searchTerm;

        return data.post(config.webService.wsUser + 'Search', jData);
    },
};

/************************************************/
/****************** Leagues *********************/
/************************************************/
var league = {
    get: function (leagueId, callback) {
        var jData = {};
        jData.league = leagueId;

        Utilities.postJSONAsynch(config.webService.wsLeague + 'Get', jData, callback, arguments[2]);
    },

    getBySolutionId: function (solutionId, callback) {
        var jData = {};
        jData.solutionId = solutionId;

        Utilities.postJSONAsynch(config.webService.wsLeague + 'GetBySolutionId', jData, callback, arguments[2]);
    },

    getBySolutionIdWithDeferred: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;

        return data.post(config.webService.wsLeague + 'GetBySolutionId', jData);
    },

    getListBySolutionId: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;

        return data.post(config.webService.wsLeague + 'GetListBySolutionId', jData);
    },

    deleteLeague: function (leagueId) {
        var jData = {};
        jData.league = leagueId;

        return Utilities.postJSON(config.webService.wsLeague + 'Delete', jData);
    },

    create: function (sportId, typeId, name, abbreviation, handle, logo) {
        var jData = {};
        jData.sportId = sportId;
        jData.typeId = encodeURI(typeId);
        jData.name = encodeURI(name);
        jData.abbreviation = encodeURI(abbreviation);
        jData.website = encodeURI(handle);
        jData.logo = encodeURI(logo);

        return Utilities.postJSON(config.webService.wsLeague + 'Create', jData);
    },

    createWithDeferred: function (sportId, typeId, name, abbreviation, webSite, logo) {
        var jData = {};
        jData.sportId = sportId;
        jData.typeId = typeId;
        jData.name = name;
        jData.abbreviation = abbreviation;
        jData.website = webSite
        jData.logo = logo;

        return data.post(config.webService.wsLeague + 'Create', jData);
    },

    update: function (league, callback) {
        var jData = {};
        jData.league = league;

        Utilities.postJSONAsynch(config.webService.wsLeague + 'Update', jData, callback, arguments[2]);
    },

    getDivisionListBySolution: function (solutionId, withTeam, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.withTeam = withTeam;

        Utilities.postJSONAsynch(config.webService.wsDivision + 'GetBySolutionId', jData, callback, arguments[3]);
    }
};

/************************************************/
/****************** Season **********************/
/************************************************/
var season = {
    getById: function (seasonId, callback) {
        var jData = {};
        jData.seasonId = seasonId;

        Utilities.postJSONAsynch(config.webService.wsSeason + 'GetSeason', jData, callback, arguments[2]);
    },

    getPlayoffById: function (playoffId) {
        var jData = {};
        jData.playoffId = playoffId;

        return data.post(config.webService.wsSeason + 'GetPlayoff', jData);
    },

    updatePlayoff: function (playoff) {
        var jData = {};
        jData.playoff = playoff;

        return data.post(config.webService.wsSeason + 'UpdatePlayoff', jData);
    },

    getDivisionTeam: function (seasonId) {
        var jData = {};
        jData.seasonId = seasonId;

        return data.post(config.webService.wsSeason + 'GetSeasonDivisionTeam', jData);
    },

    getListByEventId: function (eventId) {
        var jData = {};
        jData.eventId = eventId;

        return data.post(config.webService.wsSeason + 'GetListByEventId', jData);
    },

    getByMatchId: function (matchId) {
        var jData = {};
        jData.matchId = matchId;

        return data.post(config.webService.wsSeason + 'GetByMatchId', jData);
    },

    getBySolutionId: function (solutionId, callback) {
        var jData = {};
        jData.solutionId = solutionId;

        Utilities.postJSONAsynch(config.webService.wsSeason + 'GetBySolutionId', jData, callback, arguments[2]);
    },

    getBySolutionIdWithDeferred: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;

        return data.post(config.webService.wsSeason + 'GetBySolutionId', jData);
    },

    getType: function (callback) {
        var jData = {};

        Utilities.postJSONAsynch(config.webService.wsSeason + 'GetSeasonType', jData, callback, arguments[1]);
    },

    create: function (solutionId, typeId, name, description, startDate, endDate, active, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.typeId = typeId;
        jData.name = name;
        jData.description = description;
        jData.startingDate = startDate;
        jData.endingDate = endDate;
        jData.active = active;

        Utilities.postJSONAsynch(config.webService.wsSeason + 'Create', jData, callback, arguments[8]);
    },

    update: function (seasonId, name, typeId, description, startDate, endDate, active, callback) {
        var jData = {};
        jData.seasonId = seasonId;
        jData.name = name;
        jData.typeId = typeId;
        jData.description = description;
        jData.startingDate = startDate;
        jData.endingDate = endDate;
        jData.active = active;

        Utilities.postJSONAsynch(config.webService.wsSeason + 'Update', jData, callback, arguments[8]);
    },

    updateSeason: function (season) {
        var jData = {};
        jData.season = season;

        return data.post(config.webService.wsSeason + 'UpdateSeason', jData);
    },

    getDivisionList: function (seasonId, callback) {
        var jData = {};
        jData.seasonId = seasonId;

        Utilities.postJSONAsynch(config.webService.wsDivision + 'GetBySeason', jData, callback, arguments[2]);
    },

    updateDivisionTeam: function (seasonId, divisionList, teamList) {
        var jData = {};
        jData.seasonId = seasonId;
        jData.divisionList = divisionList;
        jData.teamList = teamList;

        return data.post(config.webService.wsSeason + 'UpdateDivisionsTeams', jData);
    },

    deleteSeason: function (seasonId, callback) {
        var jData = {};
        jData.seasonId = seasonId;

        Utilities.postJSONAsynch(config.webService.wsSeason + 'Delete', jData, callback, arguments[2]);
    },

    getParametersByGame: function (gameId) {
        var jData = {};
        jData.gameId = gameId;

        return data.post(config.webService.wsSeason + 'GetParametersByGame', jData);
    },

    getParameter: function (seasonId, code, callback) {
        var jData = {};
        jData.seasonId = seasonId;
        jData.code = code;

        Utilities.postJSONAsynch(config.webService.wsSeason + 'GetParameter', jData, callback, arguments[3]);
    },

    getParameters: function (seasonId, callback) {
        var jData = {};
        jData.seasonId = seasonId;

        return Utilities.postJSONAsynch(config.webService.wsSeason + 'GetParameters', jData, callback, arguments[2]);
    },

    updateParameter: function (seasonId, code, value, callback) {
        var jData = {};
        jData.seasonId = seasonId;
        jData.code = code;
        jData.value = value;

        Utilities.postJSONAsynch(config.webService.wsSeason + 'UpdateParameter', jData, callback, arguments[4]);
    },

    updateParameters: function (seasonId, seasonParms, callback) {
        var jData = {};
        jData.seasonId = seasonId;
        jData.seasonParms = seasonParms;

        return Utilities.postJSONAsynch(config.webService.wsSeason + 'UpdateParameters', jData, callback, arguments[3]);
    },

    createParameter: function (seasonId, code, value, callback) {
        var jData = {};
        jData.seasonId = seasonId;
        jData.code = code;
        jData.value = value;

        Utilities.postJSONAsynch(config.webService.wsSeason + 'CreateParameter', jData, callback, arguments[4]);
    },

    getEvents: function (seasonId, callback) {
        var jData = {};
        jData.seasonId = seasonId;

        Utilities.postJSONAsynch(config.webService.wsSeason + 'GetEvents', jData, callback, arguments[2]);
    },

    updateEvents: function (seasonId, seasonEvents, callback) {
        var jData = {};
        jData.seasonId = seasonId;
        jData.seasonEvents = seasonEvents;

        Utilities.postJSONAsynch(config.webService.wsSeason + 'UpdateEvents', jData, callback, arguments[3]);
    },

    getActive: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;

        if (viewstate.get('activeSeasonId-' + solutionId) == undefined) {
            return $.when(data.post(config.webService.wsSolution + 'GetActiveSeason', jData)).then(function (a) {
                viewstate.save('activeSeasonId-' + a, { expires: 600000 });
                return a;
            });
        }
        else {
            return viewstate.get('activeSeasonId-' + solutionId);
        }
    }

};

var checklist = {
    get: function (checkListId) {
        var jData = {};
        jData.checkListId = checkListId;

        return data.post(config.webService.wsSolution + 'GetCheckListById', jData);
    },

    getBySolutionId: function (solutionId, page, pageSize, searchText, teamId, statusId) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.page = page || 1;
        jData.pageSize = pageSize || 30000;
        jData.searchText = searchText || '';
        jData.statusId = statusId || null;
        jData.teamId = teamId || null;

        return data.post(config.webService.wsSolution + 'GetCheckListBySolutionId', jData);
    },

    getByMatchId: function (solutionId, matchId) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.matchId = matchId;

        return data.post(config.webService.wsSolution + 'GetCheckListByMatchId', jData);
    },

    create: function (solutionId, checkList) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.checkList = checkList;

        return data.post(config.webService.wsSolution + 'CreateCheckList', jData);
    },

    updateChecklists: function (solutionId, checkList) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.checkList = checkList;

        return data.post(config.webService.wsSolution + 'UpdateCheckList', jData);
    },

    update: function (solutionId, checkList) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.checkList = checkList;

        return data.post(config.webService.wsSolution + 'UpdateCheckListControl', jData);
    },

    delete: function (checkListId) {
        var jData = {};
        jData.checkListId = checkListId;

        return data.post(config.webService.wsSolution + 'DeleteCheckList', jData);
    }
}

/************************************************/
/**************** Post **********************/
/************************************************/
var post = {
    getById: function (postId, callback) {
        var jData = {};
        jData.postId = postId;

        Utilities.postJSONAsynch(config.webService.wsPost + 'Get', jData, callback, arguments[2]);
    },

    getByAccountId: function (timestamp, culture, callback) {
        var jData = {};
        jData.timestamp = timestamp.toUTCString();
        jData.culture = culture;

        Utilities.postJSONAsynch(config.webService.wsPost + 'GetByAccount', jData, callback, arguments[3]);
    },

    getLatestByAccountId: function (timestamp, callback) {
        var jData = {};
        jData.timestamp = timestamp.toUTCString();

        Utilities.postJSONAsynch(config.webService.wsPost + 'GetLatestByAccount', jData, callback, arguments[2]);
    },

    create: function (content, callback) {
        var jData = {};
        jData.content = content;

        Utilities.postJSONAsynch(config.webService.wsPost + 'CreatePost', jData, callback, arguments[2]);
    },

    delete: function (postId, callback) {
        var jData = {};
        jData.postId = postId;

        Utilities.postJSONAsynch(config.webService.wsPost + 'Delete', jData, callback, arguments[2]);
    }
};

/************************************************/
/**************** Post **********************/
/************************************************/
var comment = {
    getByPostId: function (postId, callback) {
        var jData = {};
        jData.postId = postId;

        Utilities.postJSONAsynch(config.webService.wsComment + 'GetByPostId', jData, callback, arguments[2]);
    },

    getCountByPostId: function (postId, callback) {
        var jData = {};
        jData.postId = postId;

        Utilities.postJSONAsynch(config.webService.wsComment + 'GetCountByPostId', jData, callback, arguments[2]);
    },

    deleteComment: function (commentId, callback) {
        var jData = {};
        jData.commentId = commentId;

        Utilities.postJSONAsynch(config.webService.wsComment + 'Delete', jData, callback, arguments[2]);
    }
};

/************************************************/
/**************** Post **********************/
/************************************************/
var like = {
    getCountByPostId: function (postId, callback) {
        var jData = {};
        jData.postId = postId;

        Utilities.postJSONAsynch(config.webService.wsLike + 'GetCountByPostId', jData, callback, arguments[2]);
    },

    getCountByCommentId: function (commentId, callback) {
        var jData = {};
        jData.commentId = commentId;

        Utilities.postJSONAsynch(config.webService.wsLike + 'GetCountByCommentId', jData, callback, arguments[2]);
    },

    createPostLike: function (postId, callback) {
        var jData = {};
        jData.postId = postId;

        Utilities.postJSONAsynch(config.webService.wsLike + 'CreatePostLike', jData, callback, arguments[2]);
    },

    createCommentLike: function (commentId, callback) {
        var jData = {};
        jData.commentId = commentId;

        Utilities.postJSONAsynch(config.webService.wsLike + 'CreateCommentLike', jData, callback, arguments[2]);
    }
};

/************************************************/
/**************** Division **********************/
/************************************************/
var division = {
    get: function (divisionId) {
        var jData = {};
        jData.divisionId = divisionId;

        return data.post(config.webService.wsDivision + 'Get', jData);
    },

    getStandingsBySeason: function (solutionId, seasonId) {
        return data.get(String.format('/api/solution/{0}/standings/{1}', solutionId, seasonId), {})
    },

    create: function (division) {
        var jData = {};
        jData.division = division;

        return data.post(config.webService.wsDivision + 'Create', jData);
    },

    update: function (division) {
        var jData = {};
        jData.division = division;

        return data.post(config.webService.wsDivision + 'Update', jData);
    },

    updateActive: function (divisionId, active) {
        var jData = {};
        jData.divisionId = divisionId;
        jData.active = active;

        return data.post(config.webService.wsDivision + 'UpdateActive', jData);
    },

    getLevelBySolution: function (solutionId, callback) {
        var jData = {};
        jData.solutionId = solutionId;

        Utilities.postJSONAsynch(config.webService.wsDivision + 'GetLevelBySolution', jData, callback, arguments[2]);
    },

    getBySolutionId: function (solutionId, withTeams) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.withTeam = withTeams;

        return data.post(config.webService.wsDivision + 'GetBySolutionId', jData);
    },

    getBySeasonId: function (seasonId) {
        var jData = {};
        jData.seasonId = seasonId;

        return data.post(config.webService.wsDivision + 'GetBySeasonId', jData);
    },

    delete: function (divisionId) {
        var jData = {};
        jData.divisionId = divisionId;

        return data.post(config.webService.wsDivision + 'Delete', jData);
    }

};

/************************************************/
/****************** Team ************************/
/************************************************/
var team = {
    get: function (teamId, solutionId, callback) {
        var jData = {};
        jData.teamId = teamId;
        jData.solutionId = solutionId || null;

        Utilities.postJSONAsynch(config.webService.wsTeam + 'Get', jData, callback, arguments[3]);
    },

    getWithPromise: function (teamId, solutionId) {
        var jData = {};
        jData.teamId = teamId;
        jData.solutionId = solutionId || null;

        return data.post(config.webService.wsTeam + 'Get', jData);
    },

    getJersey: function (teamId) {
        var jData = {};
        jData.teamId = teamId;

        return data.post(config.webService.wsTeam + 'GetJersey', jData);
    },

    getTeamPlayerStaff: function (teamId) {
        var jData = {};
        jData.teamId = teamId;

        return data.post(config.webService.wsTeam + 'GetTeamPlayerStaff', jData);
    },

    getDuplicateTeam: function (solutionId, teamList) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.teamList = teamList;

        return data.post(config.webService.wsTeam + 'GetDuplicateTeam', jData);
    },

    getBySolutionId: function (solutionId, callback) {
        var jData = {};
        jData.solutionId = solutionId;

        Utilities.postJSONAsynch(config.webService.wsTeam + 'GetBySolutionId', jData, callback, arguments[2]);
    },

    getActiveBySolutionId: function (solutionId, callback) {
        var jData = {};
        jData.solutionId = solutionId;

        Utilities.blockObject(arguments[2]);
        var deferred = data.post(config.webService.wsTeam + 'GetActiveBySolutionId', jData).always(function () { Utilities.unblockObject(arguments[2]) });

        if (callback)
            deferred.done(callback);

        return deferred;
    },

    getBySolutionIdWithDeferred: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;

        return data.post(config.webService.wsTeam + 'GetBySolutionId', jData);
    },

    getBySolutionIdV2: function (solutionId, seasonId, divisionId, page, pageSize, sortColumn, sortOrder, searchText) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.seasonId = seasonId;
        jData.divisionId = divisionId;
        jData.page = page;
        jData.pageSize = pageSize;
        jData.sortColumn = sortColumn;
        jData.sortOrder = sortOrder;
        jData.searchText = searchText;

        return data.post(config.webService.wsTeam + 'GetBySolutionIdV2', jData);
    },

    getBySeasonIdDeferred: function (seasonId) {
        var jData = {};
        jData.seasonId = seasonId;

        return data.post(config.webService.wsTeam + 'GetBySeasonId', jData);
    },

    getBySeasonId: function (seasonId, callback) {
        var jData = {};
        jData.seasonId = seasonId;

        Utilities.postJSONAsynch(config.webService.wsTeam + 'GetBySeasonId', jData, callback, arguments[2]);
    },

    getStandingsBySeason: function (solutionId, seasonId, statsId, divisionId) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.seasonId = seasonId;
        jData.statsId = statsId;
        jData.divisionId = divisionId;

        return data.post(config.webService.wsTeam + 'GetStandingsBySeason', jData);
    },

    getTeamsStatsBySolutionId: function (solutionId, page, pageSize, sortStatId, sortColumn, sortOrder, seasonTypeId, seasonId, divisionId) {
        var queryKeyValue = {
            page: page, pageSize: pageSize, sortStatId: sortStatId, sortColumn: sortColumn,
            sortOrder: sortOrder, seasonTypeId: seasonTypeId, seasonId: seasonId, divisionId: divisionId
        }

        return data.get(String.format('/api/leagues/{0}/teams/stats{1}', solutionId, Utilities.buildQueryString(queryKeyValue)), {});
    },

    getTeamManagerBySolutionId: function (solutionId, seasonId, divisionId, page, pageSize, sortColumn, sortOrder, searchText) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.seasonId = seasonId;
        jData.divisionId = divisionId;
        jData.page = page;
        jData.pageSize = pageSize;
        jData.sortColumn = sortColumn;
        jData.sortOrder = sortOrder;
        jData.searchText = searchText;

        return data.post(config.webService.wsTeam + 'GetTeamManagerBySolutionId', jData);
    },

    getManagerRights: function (solutionId, accountAdministrator) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.accountAdministrator = accountAdministrator;

        return data.post(config.webService.wsTeam + 'GetManagerRights', jData);
    },

    updateManagerRights: function (solutionId, accountAdministrator, rights) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.accountAdministrator = accountAdministrator;
        jData.rights = rights;

        return data.post(config.webService.wsTeam + 'UpdateManagerRights', jData);
    },

    deleteManager: function (solutionId, accountAdministrator) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.accountAdministrator = accountAdministrator;

        return data.post(config.webService.wsTeam + 'DeleteManager', jData);
    },

    create: function (solutionId, fullName, name, abbreviation, website, avatar, note, active, isInternal, jerseys, seasonId, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.fullName = fullName;
        jData.name = name;
        jData.abbreviation = abbreviation;
        jData.website = website;
        jData.avatar = avatar;
        jData.note = note;
        jData.jerseys = jerseys;
        jData.active = active;
        jData.isInternal = isInternal;
        jData.seasonId = seasonId;

        Utilities.postJSONAsynch(config.webService.wsTeam + 'Create', jData, callback, arguments[12]);
    },

    createList: function (solutionId, teamList, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.teamList = teamList;

        Utilities.postJSONAsynch(config.webService.wsTeam + 'CreateTeamList', jData, callback, arguments[3]);
    },

    createManager: function (solutionId, teamId, email, sectionsRight) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.teamId = teamId;
        jData.email = email;
        jData.sectionsRight = sectionsRight;

        return data.post(config.webService.wsTeam + 'CreateManager', jData);
    },

    update: function (teamId, fullName, name, abbreviation, website, avatar, note, isInternal, jerseys, callback) {
        var jData = {};
        jData.teamId = teamId;
        jData.fullName = fullName;
        jData.name = name;
        jData.abbreviation = abbreviation;
        jData.website = website;
        jData.avatar = avatar;
        jData.note = note;
        jData.isInternal = isInternal;
        jData.jerseys = jerseys;

        Utilities.postJSONAsynch(config.webService.wsTeam + 'Update', jData, callback, arguments[10]);
    },

    createInContainer: function (solutionId, fullName, name, abbreviation, website, avatar, note, active, isInternal, jerseys, seasonId, solutionList, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.fullName = fullName;
        jData.name = name;
        jData.abbreviation = abbreviation;
        jData.website = website;
        jData.avatar = avatar;
        jData.note = note;
        jData.jerseys = jerseys;
        jData.active = active;
        jData.isInternal = isInternal;
        jData.seasonId = seasonId;
        jData.solutionList = solutionList;

        Utilities.postJSONAsynch(config.webService.wsTeam + 'CreateInContainer', jData, callback, arguments[13]);
    },

    updateInContainer: function (teamId, fullName, name, abbreviation, website, avatar, note, isInternal, solutionList, jerseys, callback) {
        var jData = {};
        jData.teamId = teamId;
        jData.fullName = fullName;
        jData.name = name;
        jData.abbreviation = abbreviation;
        jData.website = website;
        jData.avatar = avatar;
        jData.note = note;
        jData.isInternal = isInternal;
        jData.jerseys = jerseys;
        jData.solutionList = solutionList;

        Utilities.postJSONAsynch(config.webService.wsTeam + 'UpdateInContainer', jData, callback, arguments[11]);
    },

    insertSolution: function (teamId, solutionId) {
        var jData = {};
        jData.teamId = teamId;
        jData.solutionId = solutionId;

        return data.post(config.webService.wsTeam + 'InsertSolution', jData);
    },

    updateActive: function (teamId, active) {
        var jData = {};
        jData.teamId = teamId;
        jData.active = active;

        return data.post(config.webService.wsTeam + 'UpdateActive', jData);
    },

    updateInternal: function (teamId, isInternal) {
        var jData = {};
        jData.teamId = teamId;
        jData.isInternal = isInternal;

        return data.post(config.webService.wsTeam + 'UpdateInternal', jData);
    },

    updateAvatar: function (teamId, avatar) {
        var jData = {};
        jData.teamId = teamId;
        jData.avatar = avatar;

        return data.post(config.webService.wsTeam + 'UpdateAvatar', jData);
    },

    updates: function (seasonId, teams, callback) {
        var jData = {};
        jData.seasonId = seasonId;
        jData.teams = teams;

        Utilities.postJSONAsynch(config.webService.wsTeam + 'Updates', jData, callback, arguments[3]);
    },

    delete: function (teamId, solutionId, callback) {
        var jData = {};
        jData.teamId = teamId;
        jData.solutionId = solutionId;

        Utilities.postJSONAsynch(config.webService.wsTeam + 'Delete', jData, callback, arguments[3]);
    },

    manualStandingsBySeason: function (seasonId, statId, teamStats) {
        var jData = {};
        jData.seasonId = seasonId;
        jData.statId = statId;
        jData.teamStats = teamStats;

        return data.post(config.webService.wsStats + 'ManualStandingsBySeason', jData);
    },

    payKreezeeTeam: function (securityToken, creditCardToken) {
        var jData = {};
        jData.securityToken = securityToken;
        jData.creditCardToken = creditCardToken;

        return data.post(config.webService.wsTeam + 'PayKreezeeTeam', jData);
    }
};

/************************************************/
/****************** Contact**********************/
/************************************************/
var contact = {

    getBySolutionId: function (solutionId, page, pageSize, sort, search) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.page = page;
        jData.pageSize = pageSize;
        jData.sort = sort;
        jData.search = search;

        return data.post(config.webService.wsContact + 'GetBySolutionId', jData);
    },

    createTab: function (tab) {
        var jData = {};
        jData.tab = tab;

        return data.post(config.webService.wsContact + 'CreateContactTab', jData);
    },
    updateTab: function (tab) {
        var jData = {};
        jData.tab = tab;

        return data.post(config.webService.wsContact + 'UpdateContactTab', jData);
    },
    getContactTab: function (id) {
        jData = {};
        jData.id = id;

        return data.post(config.webService.wsContact + 'GetContactTab', jData);
    },
    deleteTab: function (id) {
        jData = {};
        jData.id = id;

        return data.post(config.webService.wsContact + 'DeleteContactTab', jData);
    },
    getContactTabs: function (contactId) {
        var jData = {};
        jData.contactId = contactId;

        return data.post(config.webService.wsContact + 'GetContactTabs', jData);
    },
    updateDefaultTab: function (contactId, tabId, isDefault) {
        var jData = {};
        jData.contactId = contactId;
        jData.tabId = tabId;
        jData.isDefault = isDefault;

        return data.post(config.webService.wsContact + 'UpdateDefaultTab', jData);
    }
};

/************************************************/
/****************** Connection ******************/
/************************************************/
var connection = {
    getByAccount: function (callback) {
        var jData = {};

        Utilities.postJSONAsynch(config.webService.wsConnection + 'GetByAccount', jData, callback, arguments[1]);
    },

    getPending: function (callback) {
        var jData = {};

        Utilities.postJSONAsynch(config.webService.wsConnection + 'GetPending', jData, callback, arguments[1]);
    },

    getByEmail: function (email, callback) {
        var jData = {};
        jData.email = email;

        Utilities.postJSONAsynch(config.webService.wsConnection + 'GetByEmail', jData, callback, arguments[2]);
    },

    getByGroup: function (groupId, callback) {
        var jData = {};
        jData.groupId = groupId;

        Utilities.postJSONAsynch(config.webService.wsConnection + 'GetByGroup', jData, callback, arguments[2]);
    },

    create: function (accountId, callback) {
        var jData = {};
        jData.accountId = accountId;

        Utilities.postJSONAsynch(config.webService.wsConnection + 'Create', jData, callback, arguments[2]);
    },

    updateReading: function (callback) {
        var jData = {};

        Utilities.postJSONAsynch(config.webService.wsConnection + 'UpdateReading', jData, callback, arguments[1]);
    },

    getCountNew: function (callback) {
        var jData = {};

        return Utilities.postJSONAsynch(config.webService.wsConnection + 'GetCountNew', jData, callback);
    },

    accept: function (contactId, callback) {
        var jData = {};
        jData.contactId = contactId;

        Utilities.postJSONAsynch(config.webService.wsConnection + 'Accept', jData, callback, arguments[2]);
    },

    refuse: function (contactId, callback) {
        var jData = {};
        jData.contactId = contactId;

        Utilities.postJSONAsynch(config.webService.wsConnection + 'Refuse', jData, callback, arguments[2]);
    },

    cancel: function (contactId, callback) {
        var jData = {};
        jData.contactId = contactId;

        Utilities.postJSONAsynch(config.webService.wsConnection + 'Cancel', jData, callback, arguments[2]);
    },

    deleteConnection: function (contactId, callback) {
        var jData = {};
        jData.contactId = contactId;

        Utilities.postJSONAsynch(config.webService.wsConnection + 'Delete', jData, callback, arguments[2]);
    }
};

/************************************************/
/****************** Contact group**********************/
/************************************************/
var group = {
    get: function (groupId, callback) {
        var jData = {};
        jData.groupId = groupId;

        Utilities.postJSONAsynch(config.webService.wsGroup + 'Get', jData, callback, arguments[2]);
    },

    getByAccount: function (callback) {
        var jData = {};

        Utilities.postJSONAsynch(config.webService.wsGroup + 'GetByAccount', jData, callback, arguments[1]);
    },

    create: function (groupName, groupDescription, groupConnections, callback) {
        var jData = {};
        jData.groupName = groupName;
        jData.groupDescription = groupDescription;
        jData.groupConnections = groupConnections;

        Utilities.postJSONAsynch(config.webService.wsGroup + 'Create', jData, callback, arguments[4]);
    },

    updateGroup: function (groupId, groupName, groupDescription, groupConnections, callback) {
        var jData = {};
        jData.groupId = groupId;
        jData.groupName = groupName;
        jData.groupDescription = groupDescription;
        jData.groupConnections = groupConnections;

        Utilities.postJSONAsynch(config.webService.wsGroup + 'Update', jData, callback, arguments[5]);
    },

    deleteGroup: function (groupId, callback) {
        var jData = {};

        jData.groupId = groupId;

        Utilities.postJSONAsynch(config.webService.wsGroup + 'Delete', jData, callback, arguments[2]);
    }

    // removeConnection: function(gro)
};

/************************************************/
/****************** Player **********************/
/************************************************/
var player = {
    get: function (playerId, solutionId, callback) {
        var jData = {};
        jData.playerId = playerId;
        jData.solutionId = solutionId;

        function mockPages(player) {

            player.Pages = [
                { "__type": "Kreezee.DAL.Entities.Account.CustomPage", "details": [{ "Id": 49, "Culture": "en", "Visibility": 4, "Url": "test-12", "Title": "Test12", "Description": "Test12", "Content": "<p>My form to pay inscription&nbsp;of the run</p>\n\n<p><u><strong>Noroits 1 - Coach Marquis</strong></u></p>\n\n<table border=\"1\" cellpadding=\"100\" cellspacing=\"3\" style=\"border-collapse:collapse; border-spacing:0px; box-sizing:border-box; font-family:open sans,sans-serif; font-size:14px; max-width:100%; width:376px\">\n\t<tbody>\n\t\t<tr>\n\t\t\t<td style=\"height:20px; width:126px\"><strong>BOUCHARD</strong></td>\n\t\t\t<td style=\"width:126px\"><strong>CHRISTOPHE</strong></td>\n\t\t\t<td style=\"width:126px\">Attaquant</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>BUSSI&Egrave;RES</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>F&Eacute;LIX</strong></td>\n\t\t\t<td>Attaquant</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>DAGENAIS</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>ANTOINE</strong></td>\n\t\t\t<td>Attaquant</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>DELAUNI&Egrave;RE</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>ZACHARY</strong></td>\n\t\t\t<td>Attaquant</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>GU&Eacute;NETTE</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>&Eacute;LIOTT</strong></td>\n\t\t\t<td>Attaquant</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>PAR&Eacute;</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>VINCENT</strong></td>\n\t\t\t<td>Attaquant</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>ROCHON</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>SAMUEL</strong></td>\n\t\t\t<td>Attaquant</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>THIBAULT</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>F&Eacute;LIX</strong></td>\n\t\t\t<td>Attaquant</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>BOUCHARD</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>JUSTIN</strong></td>\n\t\t\t<td>D&eacute;fenseur</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>DELISLE</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>CHARLES-&Eacute;DOUARD</strong></td>\n\t\t\t<td>D&eacute;fenseur</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>MARQUIS</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>ANTOINE</strong></td>\n\t\t\t<td>D&eacute;fenseur</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>TREMBLAY</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>SIMON</strong></td>\n\t\t\t<td>D&eacute;fenseur</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>UBARTAS</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>MIKAEL</strong></td>\n\t\t\t<td>D&eacute;fenseur</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>LEVESQUE</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>XAVIER</strong></td>\n\t\t\t<td>Gardien</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td dir=\"LTR\" style=\"height:20px; width:126px\"><strong>MORISSETTE</strong></td>\n\t\t\t<td dir=\"LTR\" style=\"width:126px\"><strong>JUSTIN</strong></td>\n\t\t\t<td>Gardien</td>\n\t\t</tr>\n\t</tbody>\n</table>\n\n<p>&nbsp;</p>\n\n<p><br />\n<!-- ** Ne pas supprimer / Do not delete ** --><img data-form-id=\"c29sdXRpb25JZD0yNjgmZm9ybUlkPTcw\" src=\"https://cache.kreezee.com/files/form.png\" style=\"width:100px\" title=\"Formulaire de feu\" /> <!-- ** Ne pas supprimer / Do not delete ** --><br />\n<!-- ** Ne pas supprimer / Do not delete ** --><br />\n<!-- ** Ne pas supprimer / Do not delete ** --></p>\n\n<div>&nbsp;</div>\n", "Keywords": "" }, { "Id": 49, "Culture": "fr", "Visibility": 4, "Url": "tests", "Title": "Tests", "Description": "Tests", "Content": "<p>Mon formulaire pr&eacute;f&eacute;r&eacute; car paiement en ligne&nbsp;de course</p>\n\n<p><!-- ** Ne pas supprimer / Do not delete ** --><img data-form-id=\"c29sdXRpb25JZD0yNjgmZm9ybUlkPTcx\" src=\"https://cache.kreezee.com/files/form.png\" style=\"width:100px\" title=\"Paiement test\" /> <!-- ** Ne pas supprimer / Do not delete ** --> &nbsp;<!-- ** Ne pas supprimer / Do not delete ** -->&nbsp;<!-- ** Ne pas supprimer / Do not delete ** --><br />\n<!-- ** Ne pas supprimer / Do not delete ** --></p>\n", "Keywords": "" }], "Id": 49, "SolutionId": 268, "Name": "Mon formulaire" }
            ];
            console.log(player);
            callback(player);
        }

        Utilities.postJSONAsynch(config.webService.wsPlayer + 'Get', jData, mockPages, arguments[3]);
    },

    getGamePlayBySeasonId: function (matchId, seasonId) {
        var jData = {};
        jData.matchId = matchId;
        jData.seasonId = seasonId;

        return data.post(config.webService.wsPlayer + 'GetGamePlayBySeasonId', jData);
    },

    getBySolutionId: function (solutionId, page, pageSize, sortColumn, sortOrder, search, positionId, teamId, statusId) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.page = page || 1;
        jData.pageSize = pageSize || 30000;
        jData.sort = (sortOrder ? sortOrder : '+') + (sortColumn || '');
        jData.search = search || '';
        jData.positionId = positionId || null;
        jData.teamId = teamId || null;
        jData.statusId = statusId || null;

        return data.post(config.webService.wsPlayer + 'GetBySolutionId', jData);
    },

    getBySolutionIdWithDeferred: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;

        return data.post(config.webService.wsPlayer + 'GetBySolutionId', jData);
    },

    getStatsBySeasonTeam: function (teamId, statId, seasonId) {
        var jData = {};
        jData.teamId = teamId;
        jData.statId = statId;
        jData.seasonId = seasonId || null;

        return data.post(config.webService.wsPlayer + 'GetStatsBySeasonTeam', jData);
    },

    getDuplicatePlayer: function (solutionId, playerList) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.playerList = playerList;

        return data.post(config.webService.wsPlayer + 'GetDuplicatePlayer', jData);
    },

    getByTeam: function (teamId, callback) {
        var jData = {};
        jData.teamId = teamId;

        Utilities.postJSONAsynch(config.webService.wsPlayer + 'GetByTeam', jData, callback, arguments[2]);
    },

    getStarByMatch: function (matchId, callback) {
        var jData = {};
        jData.matchId = matchId;

        Utilities.postJSONAsynch(config.webService.wsPlayer + 'GetStarByMatch', jData, callback, arguments[2]);
    },

    createList: function (solutionId, playerList, teamId, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.playerList = playerList;
        jData.teamId = teamId || null;

        return Utilities.postJSONAsynch(config.webService.wsPlayer + 'CreatePlayerList', jData, callback, arguments[4]);
    },

    addPlayersToTeam: function (teamId, players) {
        var jData = {};
        jData.teamId = teamId;
        jData.players = players;

        return data.post(config.webService.wsPlayer + 'AddPlayersToTeam', jData);
    },

    createInTeam: function (solutionId, teamId, email, firstName, lastName, number, picture, position, birthday, height, weight, playerStatus, active, note, level, playerTeams, address, phones, emails, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.teamId = teamId;
        jData.email = email;
        jData.firstName = firstName;
        jData.lastName = lastName;
        jData.number = number;
        jData.picture = picture;
        jData.position = position;
        jData.birthday = birthday;
        jData.height = height;
        jData.weight = weight;
        jData.playerStatus = playerStatus;
        jData.active = active;
        jData.note = note;
        jData.level = level;
        jData.playerTeams = playerTeams;
        jData.phones = phones
        jData.emails = emails;
        jData.address = address;

        Utilities.postJSONAsynch(config.webService.wsPlayer + 'CreateInTeam', jData, callback, arguments[20]);
    },

    createInSolution: function (solutionId, email, firstName, lastName, number, picture, position, birthday, height, weight, playerStatus, active, note, level, playerTeams, address, phones, emails, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.email = email;
        jData.firstName = firstName;
        jData.lastName = lastName;
        jData.number = number;
        jData.picture = picture;
        jData.position = position;
        jData.birthday = birthday;
        jData.height = height;
        jData.weight = weight;
        jData.playerStatus = playerStatus;
        jData.active = active;
        jData.note = note;
        jData.level = level;
        jData.playerTeams = playerTeams;
        jData.phones = phones
        jData.emails = emails;
        jData.address = address;

        Utilities.postJSONAsynch(config.webService.wsPlayer + 'CreateInSolution', jData, callback, arguments[19]);
    },

    update: function (playerId, firstName, lastName, picture, position, email, birthday, height, weight, note, level, playerTeams, address, phones, emails, teamId, callback) {
        var jData = {};
        jData.playerId = playerId;
        jData.firstName = firstName;
        jData.lastName = lastName;
        jData.picture = picture;
        jData.position = position;
        jData.email = email;
        jData.birthday = birthday;
        jData.height = height;
        jData.weight = weight;
        jData.note = note;
        jData.level = level;
        jData.playerTeams = playerTeams;
        jData.phones = phones
        jData.emails = emails;
        jData.address = address;
        jData.teamId = teamId || null;

        Utilities.postJSONAsynch(config.webService.wsPlayer + 'Update', jData, callback, arguments[17]);
    },

    updateActive: function (playerId, teamId, active) {
        var jData = {};
        jData.playerId = playerId;
        jData.teamId = teamId;
        jData.active = active;

        return data.post(config.webService.wsPlayer + 'UpdateActive', jData);
    },
    
    updateAvatar: function (playerId, avatar) {
        var jData = {};
        jData.playerId = playerId;
        jData.avatar = avatar;

        return data.post(config.webService.wsPlayer + 'UpdateAvatar', jData);
    },

    updateProperties: function (players) {
        var jData = {};
        jData.players = players;

        return data.post(config.webService.wsPlayer + 'UpdateProperties', jData);
    },

    deletePlayer: function (solutionId, playerId, teamId, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.playerId = playerId;
        jData.teamId = teamId || null;

        Utilities.postJSONAsynch(config.webService.wsPlayer + 'Delete', jData, callback, arguments[4]);
    },

    updateSubstitute: function (solutionId, playerMovementId, substitute) {
        var url = `${config.setting.urlRestApi}/api/solution/${solutionId}/player-movement/${playerMovementId}/substitute`;
        return data.put(url, substitute);
    },

    updateActiveRestApi: function (solutionId, playerMovementId, active) {
        var url = `${config.setting.urlRestApi}/api/solution/${solutionId}/player-movement/${playerMovementId}/active`;
        return data.put(url, active);
    },

    merge: function (solutionId, playerId, playerMergeId) {
        var url = '/api/player/{0}/{1}/merge/{2}';
        return data.post(config.setting.urlRestApi + String.format(url, playerId, solutionId, playerMergeId), {});
    }
};


/************************************************/
/****************** Staff ***********************/
/************************************************/
var staff = {
    get: function (staffId, teamId, callback) {
        var jData = {};
        jData.staffId = staffId;
        jData.teamId = teamId || null;

        Utilities.postJSONAsynch(config.webService.wsStaff + 'Get', jData, callback, arguments[3]);
    },

    getSolutionStaff: function (staffId, callback) {
        var jData = {};
        jData.staffId = staffId;

        Utilities.postJSONAsynch(config.webService.wsStaff + 'GetSolutionStaff', jData, callback, arguments[2]);
    },

    getBySolution: function (solutionId, callback) {
        var jData = {};
        jData.solutionId = solutionId;

        Utilities.postJSONAsynch(config.webService.wsStaff + 'GetBySolutionId', jData, callback, arguments[2]);
    },

    getTeamsBySolution: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;

        return data.post(config.webService.wsStaff + 'GetTeamsBySolutionId', jData);
    },

    getByMatch: function (matchId, callback) {
        var jData = {};
        jData.matchId = matchId;

        Utilities.postJSONAsynch(config.webService.wsStaff + 'GetByMatchId', jData, callback, arguments[2]);
    },

    getByTeam: function (teamId, callback) {
        var jData = {};
        jData.teamId = teamId;

        Utilities.postJSONAsynch(config.webService.wsStaff + 'GetByTeamId', jData, callback, arguments[2]);
    },

    getDuplicateStaff: function (solutionId, staffList) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.staffList = staffList;

        return data.post(config.webService.wsStaff + 'GetDuplicateStaff', jData);

    },

    createInLeague: function (staff) {
        var jData = {};
        jData.staff = staff;

        return data.post(config.webService.wsStaff + 'CreateInLeague', jData);
    },

    create: function (staff, staffTeams, teamId) {
        var jData = {};
        jData.staff = staff;
        jData.staffTeams = staffTeams;
        jData.teamId = teamId || null;

        return data.post(config.webService.wsStaff + 'Create', jData);
    },

    createListInTeam: function (solutionId, teamId, staffList, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.teamId = teamId;
        jData.staffList = staffList;

        Utilities.postJSONAsynch(config.webService.wsStaff + 'CreateListInTeam', jData, callback, arguments[4]);
    },

    createListInSolution: function (solutionId, staffList, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.staffList = staffList;

        Utilities.postJSONAsynch(config.webService.wsStaff + 'CreateListInSolution', jData, callback, arguments[3]);
    },

    update: function (staff, staffMovements, teamId) {
        var jData = {};
        jData.staff = staff;
        jData.staffMovements = staffMovements;
        jData.teamId = teamId || null;

        return data.post(config.webService.wsStaff + 'Update', jData);
    },

    updateActive: function (staffId, teamId, active) {
        var jData = {};
        jData.staffId = staffId;
        jData.teamId = teamId;
        jData.active = active;

        return data.post(config.webService.wsStaff + 'UpdateActive', jData);
    },

    deleteStaff: function (staffId, teamId) {
        var jData = {};
        jData.staffId = staffId;
        jData.teamId = teamId || null;

        return data.post(config.webService.wsStaff + 'Delete', jData);
    }
};

/*****************************************************/
/****************** Suspension ***********************/
/*****************************************************/
var suspension = {
    get: function (suspensionId) {
        var jData = {};
        jData.suspensionId = suspensionId;

        return data.post(config.webService.wsSuspension + 'Get', jData);
    },

    getBySolution: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;

        return data.post(config.webService.wsSuspension + 'GetBySolution', jData);
    },

    getByTeam: function (teamId) {
        var jData = {};
        jData.teamId = teamId;

        return data.post(config.webService.wsSuspension + 'GetByTeam', jData);
    },

    getByPlayer: function (playerId) {
        var jData = {};
        jData.playerId = playerId;

        return data.post(config.webService.wsSuspension + 'GetByPlayer', jData);
    },

    getByStaff: function (staffId) {
        var jData = {};
        jData.staffId = staffId;

        return data.post(config.webService.wsSuspension + 'GetByStaff', jData);
    },

    create: function (suspension) {
        var jData = {};
        jData.suspension = suspension;

        return data.post(config.webService.wsSuspension + 'Create', jData);
    },

    update: function (suspension) {
        var jData = {};
        jData.suspension = suspension;

        return data.post(config.webService.wsSuspension + 'Update', jData);
    },

    delete: function (suspensionId) {
        var jData = {};
        jData.suspensionId = suspensionId;

        return data.post(config.webService.wsSuspension + 'Delete', jData);
    }
}

/************************************************/
/****************** Phone ***********************/
/************************************************/
var phone = {
    getTypes: function (culture) {
        var jData = {};
        jData.culture = culture;

        return [
            { Id: '4', Name: 'Maison' },
            { Id: '8', Name: 'Travail' },
            { Id: '19', Name: 'Cellulaire' }];
    },

    getPhoneByContact: function (contactId, callback) {
        var jData = {};
        jData.contactId = contactId;
        Utilities.postJSONAsynch(config.webService.wsPhone + 'GetPhoneByContact', jData, callback);
    },

    createPhone: function (contactId, typeId, phoneNumber, primary) {
        var jData = {};
        jData.contactId = contactId;
        jData.typeId = typeId;
        jData.phoneNumber = phoneNumber;
        jData.primary = primary;

        return Utilities.postJSON(config.webService.wsPhone + 'CreatePhone', jData);
    },

    updatePhone: function (phoneId, typeId, phoneNumber, primary) {
        var jData = {};
        jData.phoneId = phoneId;
        jData.typeId = typeId;
        jData.phoneNumber = phoneNumber;
        jData.primary = primary;

        return Utilities.postJSON(config.webService.wsPhone + 'UpdatePhone', jData);
    },

    deletePhone: function (phoneId) {
        var jData = {};
        jData.phoneId = phoneId;

        return Utilities.postJSON(config.webService.wsPhone + 'DeletePhone', jData);
    }
};


/************************************************/
/****************** Address *********************/
/************************************************/
var address = {
    createAddress: function (contactId, typeId, addressFirstLine, addressSecondLine, city, state, country, zip, primary) {
        var jData = {};
        jData.contactId = contactId;
        jData.typeId = typeId;
        jData.addressFirstLine = addressFirstLine;
        jData.addressSecondLine = addressSecondLine;
        jData.city = city;
        jData.state = state;
        jData.country = country;
        jData.zip = zip;
        jData.primary = primary;

        return Utilities.postJSON(config.webService.wsAddress + 'CreateAddress', jData);
    },

    getAddress: function (addressId) {
        var jData = {};
        jData.addressId = addressId;

        return Utilities.postJSON(config.webService.wsAddress + 'GetAddress', jData);
    },

    getAddressByContact: function (contactId) {
        var jData = {};
        jData.contactId = contactId;

        return Utilities.postJSON(config.webService.wsAddress + 'GetAddressByContact', jData);
    },

    updateAddress: function (addressId, typeId, addressFirstLine, addressSecondLine, city, state, country, zip, primary) {
        var jData = {};
        jData.addressId = addressId;
        jData.typeId = typeId;
        jData.addressFirstLine = addressFirstLine;
        jData.addressSecondLine = addressSecondLine;
        jData.city = city;
        jData.state = state;
        jData.country = country;
        jData.zip = zip;
        jData.primary = primary;

        return Utilities.postJSON(config.webService.wsAddress + 'UpdateAddress', jData);
    },

    deleteAddress: function (addressId) {
        var jData = {};
        jData.addressId = addressId;

        return Utilities.postJSON(config.webService.wsAddress + 'DeleteAddress', jData);
    }
};

/************************************************/
/****************** Email ***********************/
/************************************************/
var email = {
    getPhoneByContact: function (contactId) {
        var jData = {};
        jData.contactId = contactId;

        return Utilities.postJSON(config.webService.wsEmail + 'GetEmailByContact', jData);
    },

    verify: function (email) {
        var jData = {};
        jData.email = email;

        return data.post(config.webService.wsMail + 'Verify', jData);
    },

    createEmail: function (contactId, typeId, emailAddress, primary) {
        var jData = {};
        jData.contactId = contactId;
        jData.typeId = typeId;
        jData.emailAddress = emailAddress;
        jData.primary = primary;

        return Utilities.postJSON(config.webService.wsEmail + 'CreateEmail', jData);
    },

    updateEmail: function (emailId, typeId, emailAddress, primary) {
        var jData = {};
        jData.emailId = emailId;
        jData.typeId = typeId;
        jData.emailAddress = emailAddress;
        jData.primary = primary;

        return Utilities.postJSON(config.webService.wsEmail + 'UpdateEmail', jData);
    },

    deleteEmail: function (emailId) {
        var jData = {};
        jData.emailId = emailId;

        return Utilities.postJSON(config.webService.wsEmail + 'DeleteEmail', jData);
    }
};

/************************************************/
/****************** Sport Center ****************/
/************************************************/
var sportCenter = {
    getById: function (sportCenterId, callback) {
        var jData = {};
        jData.sportCenterId = sportCenterId;

        Utilities.postJSONAsynch(config.webService.wsSportCenter + 'GetById', jData, callback, arguments[2]);
    },

    getByAccount: function (accountId, callback) {
        var jData = {};
        jData.accountId = accountId;

        Utilities.postJSONAsynch(config.webService.wsSportCenter + 'GetByAccount', jData, callback);
    },

    getBySolutionId: function (solutionId, callback) {
        var jData = {};
        jData.solutionId = solutionId;

        return Utilities.postJSONAsynch(config.webService.wsSportCenter + 'GetBySolutionId', jData, callback, arguments[2]);
    },

    getDetailBySolutionId: function (solutionId, callback) {
        var jData = {};
        jData.solutionId = solutionId;

        Utilities.postJSONAsynch(config.webService.wsSportCenter + 'GetDetailBySolutionId', jData, callback, arguments[2]);
    },

    getByLeagueId: function (leagueId, callback) {
        var jData = {};
        jData.leagueId = leagueId;

        Utilities.postJSONAsynch(config.webService.wsSportCenter + 'GetByLeagueId', jData, callback, arguments[2]);
    },

    getDuplicateSportCenter: function (solutionId, sportCenterList) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.sportCenterList = sportCenterList;

        return data.post(config.webService.wsSportCenter + 'GetDuplicateSportCenter', jData);
    },

    insertSolution: function (sportCenterId, solutionId) {
        var jData = {};
        jData.sportCenterId = sportCenterId;
        jData.solutionId = solutionId;

        return data.post(config.webService.wsSportCenter + 'InsertSolution', jData);
    },

    create: function (sportCenter, callback) {
        var jData = {};
        jData.sportCenter = sportCenter;

        Utilities.postJSONAsynch(config.webService.wsSportCenter + 'Create', jData, callback);
    },

    update: function (sportCenter, callback) {
        var jData = {};
        jData.sportCenter = sportCenter;

        Utilities.postJSONAsynch(config.webService.wsSportCenter + 'Update', jData, callback);
    },

    delete: function (sportCenterId, solutionId) {
        var jData = {};
        jData.sportCenterId = sportCenterId;
        jData.solutionId = solutionId;

        return data.post(config.webService.wsSportCenter + 'Delete', jData);
    },

    updateState: function (sportCenterId, state, stateNote, updateDate) {
        var jData = {};
        jData.sportCenterId = sportCenterId;
        jData.state = state;
        jData.stateNote = stateNote;
        jData.updateDate = updateDate;

        return data.post(config.webService.wsSportCenter + 'UpdateState', jData);
    }
};

/************************************************/
/***************** Account News *****************/
/************************************************/
function getNewsByAccount(accountId) {
    var jData = {};
    jData.accountId = accountId;

    return Utilities.postJSON(config.webService.wsAccountNews + 'GetByAccount', jData);
}

/************************************************/
/****************** Schedule ********************/
/************************************************/
var schedule = {
    getBySolutionId: function (solutionId, startDate, endDate, page, pageSize, teamId, sportCenterId, opponentTeamId, inSolutionId, typeId, searchText, seasonId) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.startDate = startDate || null;
        jData.endDate = endDate || null;
        jData.page = page || 1;
        jData.pageSize = pageSize || 10;
        jData.teamId = teamId || null;
        jData.sportCenterId = sportCenterId || null;
        jData.opponentTeamId = opponentTeamId || null;
        jData.inSolutionId = inSolutionId || null;
        jData.typeId = typeId || null;
        jData.searchText = searchText || "";
        jData.seasonId = seasonId || null;

        return data.post(config.webService.wsSolution + 'GetScheduleBySolutionId', jData);
    },

    getMultieditGameBySolutionId: function (solutionId, startDate, endDate, page, pageSize, teamId, sportCenterId, opponentTeamId, inSolutionId, searchText) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.startDate = startDate || null;
        jData.endDate = endDate || null;
        jData.page = page || 1;
        jData.pageSize = pageSize || 10;
        jData.teamId = teamId || null;
        jData.sportCenterId = sportCenterId || null;
        jData.searchText = searchText || "";
        jData.opponentTeamId = opponentTeamId || null;
        jData.inSolutionId = inSolutionId || null;

        return data.post(config.webService.wsSolution + 'GetMultiEditGameBySolutionId', jData);
    },

    getStartingPitchers: function (solutionId, teamId, startDate, endDate, page, pageSize) {
        var url = '/api/solution/{0}/teammanager/{1}/game/startingpitcher{2}';
        var queryString = Utilities.buildQueryString({ startdate: startDate, enddate: endDate, page: page, pagesize: pageSize })
        return data.get(config.setting.urlRestApi + String.format(url, solutionId, teamId, queryString));
    },

    updateStartingPitcher: function (solutionId, teamId, gameId, playerId) {
        var url = '/api/solution/{0}/teammanager/{1}/game/{2}/startingpitcher/{3}'
        return data.put(config.setting.urlRestApi + String.format(url, solutionId, teamId, gameId, playerId));
    }
};

/************************************************/
/****************** Match ********************/
/************************************************/
var match = {
    getById: function (matchId, callback) {
        var jData = {};
        jData.matchId = matchId;

        Utilities.postJSONAsynch(config.webService.wsMatch + 'GetAdmin', jData, callback, arguments[2]);
    },

    getDetailsById: function (matchId) {
        var jData = {};
        jData.matchId = matchId;

        return data.post(config.webService.wsMatch + 'GetAdmin', jData);
    },

    getScoreboardLineup: function (matchId) {
        var jData = {};
        jData.matchId = matchId;

        return data.post(config.webService.wsMatch + 'GetScoreboardLineUp', jData);
    },

    saveScoreboardLineup: function (match) {
        var jData = {};
        jData.match = match;

        return data.post(config.webService.wsMatch + 'SaveScoreboardLineup', jData);
    },

    getDuplicateMatch: function (seasonId, matchList) {
        var jData = {};
        jData.seasonId = seasonId;
        jData.matchList = matchList;

        return data.post(config.webService.wsMatch + 'GetDuplicateMatch', jData);
    },

    updateScoreBoard: function (match, playerStarList, teamId) {
        var jData = {};
        jData.match = match;
        jData.playerStarList = playerStarList;
        jData.teamId = teamId || null;

        return data.post(config.webService.wsMatch + 'UpdateScoreboard', jData);
    },

    getBySeason: function (seasonId, callback) {
        var jData = {};
        jData.seasonId = seasonId;

        Utilities.postJSONAsynch(config.webService.wsMatch + 'GetBySeason', jData, callback, arguments[2]);
    },

    getBySolution: function (solutionId, callback) {
        var jData = {};
        jData.solutionId = solutionId;

        Utilities.postJSONAsynch(config.webService.wsMatch + 'GetBySolution', jData, callback, arguments[2]);
    },

    getBySolutionWithDeferred: function (solutionId, startDate, endDate, page, pageSize, teamId, sportCenterId, inSolutionId, searchText) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.startDate = startDate || null;
        jData.endDate = endDate || null;
        jData.page = page || 1;
        jData.pageSize = pageSize || 10;
        jData.teamId = teamId || null;
        jData.sportCenterId = sportCenterId || null;
        jData.inSolutionId = inSolutionId || null;
        jData.searchText = searchText || '';

        return data.post(config.webService.wsMatch + 'GetBySolution', jData);
    },

    getByTeam: function (teamId, startDate, endDate, page, pageSize, opponentTeamId, sportCenterId, searchText) {
        var jData = {};
        jData.teamId = teamId;
        jData.startDate = startDate || null;
        jData.endDate = endDate || null;
        jData.page = page || 1;
        jData.pageSize = pageSize || 10;
        jData.opponentTeamId = opponentTeamId || null;
        jData.sportCenterId = sportCenterId || null;
        jData.searchText = searchText || '';

        return data.post(config.webService.wsMatch + 'GetByTeam', jData);
    },

    getByTeamDate: function (solutionId, teamId, startDate, matchId) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.teamId = teamId;
        jData.startDate = startDate;
        jData.matchId = matchId;

        return data.post(config.webService.wsMatch + 'GetByTeamDate', jData);
    },

    getStats: function (matchId, callback) {
        var jData = {};
        jData.matchId = matchId;

        Utilities.postJSONAsynch(config.webService.wsMatch + 'GetStats', jData, callback, arguments[2]);
    },

    create: function (solutionId, seasonId, typeId, localTeamId, visitorTeamId, date, startTime, duration, sportCenterId, surface, localLockerRoom, visitorLockerRoom, statusId, periodId, noteTypeId, note, number, teamId, divisionId, callback) {
        var jData = {}
        jData.solutionId = solutionId;
        jData.seasonId = seasonId;
        jData.typeId = typeId;
        jData.localTeamId = localTeamId;
        jData.visitorTeamId = visitorTeamId;
        jData.date = date;
        jData.startTime = startTime;
        jData.duration = duration;
        jData.sportCenterId = sportCenterId;
        jData.surface = surface;
        jData.localLockerRoom = localLockerRoom;
        jData.visitorLockerRoom = visitorLockerRoom;
        jData.statusId = statusId;
        jData.periodId = periodId;
        jData.noteTypeId = noteTypeId;
        jData.note = note;
        jData.number = number;
        jData.teamId = teamId || null;
        jData.divisionId = divisionId || null;

        Utilities.postJSONAsynch(config.webService.wsMatch + 'Create', jData, callback, arguments[20]);

    },

    update: function (matchId, solutionId, seasonId, typeId, localTeamId, visitorTeamId, date, startTime, duration, sportCenterId, surface, localLockerRoom, visitorLockerRoom, statusId, periodId, noteTypeId, note, number, teamId, divisionId, callback) {
        var jData = {}
        jData.matchId = matchId;
        jData.solutionId = solutionId;
        jData.seasonId = seasonId;
        jData.typeId = typeId;
        jData.localTeamId = localTeamId;
        jData.visitorTeamId = visitorTeamId;
        jData.date = date;
        jData.startTime = startTime;
        jData.duration = duration;
        jData.sportCenterId = sportCenterId;
        jData.surface = surface;
        jData.localLockerRoom = localLockerRoom;
        jData.visitorLockerRoom = visitorLockerRoom;
        jData.statusId = statusId;
        jData.periodId = periodId;
        jData.noteTypeId = noteTypeId;
        jData.note = note;
        jData.number = number;
        jData.teamId = teamId || null;
        jData.divisionId = divisionId || null;

        Utilities.postJSONAsynch(config.webService.wsMatch + 'Update', jData, callback, arguments[21]);
    },

    createList: function (solutionId, matchList, teamId, callback) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.matchList = matchList;
        jData.teamId = teamId || null;

        Utilities.postJSONAsynch(config.webService.wsMatch + 'CreateList', jData, callback, arguments[4]);
    },

    updateStaffList: function (gameId, staffList, callback) {
        var jData = {};
        jData.gameId = gameId;
        jData.staffList = staffList;

        Utilities.postJSONAsynch(config.webService.wsMatch + 'UpdateStaffList', jData, callback, arguments[3]);
    },

    updateLineup: function (gameId, playerList, staffList, callback) {
        var jData = {};
        jData.gameId = gameId;
        jData.playerList = playerList;
        jData.staffList = staffList;

        Utilities.postJSONAsynch(config.webService.wsMatch + 'UpdateLineup', jData, callback, arguments[4]);
    },

    updateStar: function (gameId, playerList, callback) {
        var jData = {};
        jData.gameId = gameId;
        jData.playerList = playerList;

        Utilities.postJSONAsynch(config.webService.wsMatch + 'UpdateStar', jData, callback, arguments[3]);
    },

    updateStats: function (match, eventList, statsList, statsTeamList, callback) {
        var jData = {};
        jData.match = match;
        jData.eventList = eventList;
        jData.statsList = statsList;
        jData.statsTeamList = statsTeamList;

        Utilities.postJSONAsynch(config.webService.wsMatch + 'UpdateStats', jData, callback, arguments[5]);
    },

    updateStatus: function (gameId, statusId, periodId) {
        var jData = {};
        jData.gameId = gameId;
        jData.statusId = statusId;
        jData.periodId = periodId;

        return data.post(config.webService.wsMatch + 'UpdateStatus', jData);
    },

    deleteMatch: function (matchId, teamId) {
        var jData = {};
        jData.matchId = matchId;
        jData.teamId = teamId || null;

        return data.post(config.webService.wsMatch + 'Delete', jData);
    },

    updateGameList: function (matchList, teamId) {
        var jData = {};
        jData.matchList = matchList;
        jData.teamId = teamId || null;

        return data.post(config.webService.wsMatch + 'UpdateGameList', jData);
    },

    updateList: function (seasonId, matchList, callback) {
        var jData = {};
        jData.seasonId = seasonId;
        jData.matchList = matchList;

        return Utilities.postJSONAsynch(config.webService.wsMatch + 'UpdateList', jData, callback, arguments[3]);
    },

    updateBroadcast: function (solutionId, broadcasts) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.broadcasts = broadcasts;

        return data.post(config.webService.wsEvent + 'UpdateBroadcast', jData);
    }
};

var scoreboard = {
    get: function (solutionId, gameId) {
        var url = '/api/solution/{0}/scoreboard/baseball/{1}';
        return data.get(config.setting.urlRestApi + String.format(url, solutionId, gameId));
    },
    startGame: function (gameId) {
        var url = '/api/scoreboard/baseball/start/{0}';
        return data.post(config.setting.urlRestApi + String.format(url, gameId), {});
    },
    field: {
        get: function (gameId) {
            var url = '/api/field/baseball/{0}';
            return data.get(config.setting.urlRestApi + String.format(url, gameId));
        }
    },
    event: {
        get: function (gameId) {
            var url = '/api/event/game/baseball/{0}';
            return data.get(config.setting.urlRestApi + String.format(url, gameId));
        },
        create: function (gameId, sequence) {
            var url = '/api/event/baseball/{0}';
            return data.post(config.setting.urlRestApi + String.format(url, gameId), sequence);
        },
        update: function (sequence) {
            var url = '/api/event/baseball';
            return data.put(config.setting.urlRestApi + url, sequence)
        },
    },
    lineup: {
        updateStarting: function (solutionId, gameId, lineup) {
            var url = '/api/solution/{0}/lineup/baseball/starting/{1}';
            return data.put(config.setting.urlRestApi + String.format(url, solutionId, gameId), lineup)
        },
        addSubstitution: function (gameId, substitution) {
            var url = '/api/lineup/baseball/{0}/substitution';
            return data.put(config.setting.urlRestApi + String.format(url, gameId), substitution);
        }
    }
}

/************************************************/
/******************* Event **********************/
/************************************************/
var calendarEvent = {
    getById: function (eventId) {
        var jData = {};
        jData.eventId = eventId;

        return data.post(config.webService.wsEvent + 'Get', jData);
    },

    getBySolution: function (solutionId) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.startDate = null;
        jData.endDate = null;

        return data.post(config.webService.wsEvent + 'GetBySolution', jData);
    },

    create: function (solutionId, eventObject, teamId) {
        var jData = {}
        jData.solutionId = solutionId;
        jData.eventObject = eventObject;
        jData.teamId = teamId || null;

        return data.post(config.webService.wsEvent + 'Create', jData);
    },

    createList: function (solutionId, eventList, teamId) {
        var jData = {};
        jData.solutionId = solutionId;
        jData.eventList = eventList;
        jData.teamId = teamId || null;

        return data.post(config.webService.wsEvent + 'CreateList', jData);
    },

    update: function (solutionId, eventObject, teamId) {
        var jData = {}
        jData.solutionId = solutionId;
        jData.eventObject = eventObject;
        jData.teamId = teamId || null;

        return data.post(config.webService.wsEvent + 'Update', jData);
    },


    deleteEvent: function (eventId, teamId) {
        var jData = {};
        jData.eventId = eventId;
        jData.teamId = teamId || null;

        return data.post(config.webService.wsEvent + 'Delete', jData);
    }
}

/************************************************/
/******************* Medias *********************/
/************************************************/
var medias = {
    document: {
        getBySolutionId: function (solutionId) {
            var jData = {};
            jData.solutionId = solutionId;

            return data.post(config.webService.wsDocument + 'GetBySolutionId', jData);
        },

        getById: function (documentId) {
            var jData = {};
            jData.documentId = documentId;

            return data.post(config.webService.wsDocument + 'GetById', jData);
        },

        create: function (solutionId, title, description, url, fileFormat, fileSize, visibility) {
            var jData = {};
            jData.solutionId = solutionId;
            jData.title = title;
            jData.description = description;
            jData.url = url;
            jData.fileFormat = fileFormat;
            jData.fileSize = fileSize;
            jData.visibility = visibility;

            return data.post(config.webService.wsDocument + 'Create', jData);
        },

        update: function (documentId, solutionId, title, description, url, fileFormat, fileSize, visibility) {
            var jData = {};
            jData.documentId = documentId;
            jData.solutionId = solutionId;
            jData.title = title;
            jData.description = description;
            jData.url = url;
            jData.fileFormat = fileFormat;
            jData.fileSize = fileSize;
            jData.visibility = visibility;

            return data.post(config.webService.wsDocument + 'Update', jData);
        },

        delete: function (documentId) {
            var jData = {};
            jData.documentId = documentId;

            return data.post(config.webService.wsDocument + 'Delete', jData);
        }
    },
    news: {
        getBySolutionId: function (solutionId, page, pageSize, searchText, sortOrder, sortColumn) {
            var jData = {};
            jData.solutionId = solutionId;
            jData.searchText = searchText;
            jData.sortOrder = sortOrder;
            jData.sortColumn = sortColumn;
            jData.page = page;
            jData.pageSize = pageSize;

            return data.post(config.webService.wsNews + 'GetBySolutionId', jData);
        },

        getByLeagueId: function (leagueId, callback) {
            var jData = {};
            jData.leagueId = leagueId;

            Utilities.postJSONAsynch(config.webService.wsNews + 'GetByLeagueId', jData, callback, arguments[2]);
        },

        getSpecificByLeagueId: function (leagueId, number, callback) {
            var jData = {};
            jData.leagueId = leagueId;
            jData.number = number;

            Utilities.postJSONAsynch(config.webService.wsNews + 'GetByLeagueId', jData, callback, arguments[3]);
        },

        get: function (newsId, callback) {
            var jData = {};
            jData.newsId = newsId;

            return Utilities.postJSONAsynch(config.webService.wsNews + 'Get', jData, callback, arguments[2]);
        },

        create: function (news, callback) {
            var jData = {};
            jData.news = news;

            Utilities.postJSONAsynch(config.webService.wsNews + 'Create', jData, callback, arguments[7]);
        },

        update: function (news, callback) {
            var jData = {};
            jData.news = news;

            Utilities.postJSONAsynch(config.webService.wsNews + 'Update', jData, callback, arguments[7]);
        },

        deleteByNewsId: function (newsId, callback) {
            var jData = {};
            jData.newsId = newsId;

            Utilities.postJSONAsynch(config.webService.wsNews + 'Delete', jData, callback, arguments[2]);
        }
    },

    video: {
        get: function (videoId, callback) {
            var jData = {};
            jData.videoId = videoId;

            Utilities.postJSONAsynch(config.webService.wsVideo + 'Get', jData, callback, arguments[2]);
        },

        getBySolutionId: function (solutionId, callback) {
            var jData = {};
            jData.solutionId = solutionId;

            Utilities.postJSONAsynch(config.webService.wsVideo + 'GetBySolutionId', jData, callback, arguments[2]);
        },

        createBySolutionId: function (solutionId, title, description, url, thumbnail, tags, category, duration, status, visibilityId, callback) {
            var jData = {};
            jData.solutionId = solutionId;
            jData.title = title;
            jData.description = description;
            jData.url = url;
            jData.thumbnail = thumbnail;
            jData.tags = tags;
            jData.category = category;
            jData.duration = duration;
            jData.status = status;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsVideo + 'CreateBySolutionId', jData, callback, arguments[11]);
        },

        update: function (videoId, title, description, url, thumbnail, tags, category, duration, status, visibilityId, callback) {
            var jData = {};
            jData.videoId = videoId;
            jData.title = title;
            jData.description = description;
            jData.url = url;
            jData.thumbnail = thumbnail;
            jData.tags = tags;
            jData.category = category;
            jData.duration = duration;
            jData.status = status;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsVideo + 'Update', jData, callback, arguments[11]);
        },

        delete: function (videoId, callback) {
            var jData = {};
            jData.videoId = videoId;

            Utilities.postJSONAsynch(config.webService.wsVideo + 'Delete', jData, callback, arguments[2]);
        },

        getVideoInformation: function (url, callback) {
            var provider = '';

            if ((url.toLowerCase().indexOf('youtube') != -1)
                || (url.toLowerCase().indexOf('youtu.be') != -1)) {
                provider = 'youtube';
            } else if (url.toLowerCase().indexOf('vimeo') != -1) {
                provider = 'vimeo';
            } else if (url.toLowerCase().indexOf('dailymotion') != -1) {
                provider = 'dailymotion';
            }

            $.ajax({
                type: 'GET',
                url: 'handlers/video.ashx?provider=' + escape(provider) + '&videoId=' + escape(Utilities.parseVideoUrl(url)),
                data: {},
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                cache: false,
                async: false
            })
                .done(function (data) {
                    var video = {};

                    switch (provider) {
                        case 'dailymotion':
                            video.Title = data.title;
                            video.Description = data.description;
                            video.From = data["owner.screenname"];
                            video.Category = data.strongtags;
                            video.Tags = '';
                            video.Thumbnail = data.thumbnail_180_url;
                            video.Duration = '';
                            break;

                        case 'vimeo':
                            video.Title = data[0].title;
                            video.Description = data[0].description;
                            video.From = data[0].user_name;
                            video.Category = '';
                            video.Tags = data[0].Tags;
                            video.Thumbnail = data[0].thumbnail_medium;
                            video.Duration = '';
                            break;

                        case 'youtube':
                            video.Title = data.items[0].snippet.title;
                            video.Description = data.items[0].snippet.description;
                            video.From = data.items[0].snippet.channelTitle;
                            video.Category = '';
                            video.Tags = '';
                            video.Thumbnail = data.items[0].snippet.thumbnails.high.url;
                            video.Duration = '';
                            break;
                    }
                    callback(video);
                })
                .fail(function (jqxhr, textStatus, error) {
                    //debugger;
                    if (error.length > 0)
                        alert(error);
                    //            var err = eval("(" + jqxhr.responseText + ")");
                    // Utilities.displayMessage('error', language.errorMessage.title, language.errorMessage.message + err.Message);
                })
                .always(function () {
                    //if (idObject != undefined) {
                    //$(idObject).unblock({ fadeOut: 0 });
                    //}
                });
        }
    },

    photo: {
        get: function (photoId, callback) {
            var jData = {};
            jData.photoId = photoId;

            Utilities.postJSONAsynch(config.webService.wsPhoto + 'Get', jData, callback, arguments[2]);
        },

        getBySolutionId: function (solutionId, callback) {
            var jData = {};
            jData.solutionId = solutionId;

            Utilities.postJSONAsynch(config.webService.wsPhoto + 'GetBySolutionId', jData, callback, arguments[2]);
        },

        getByTeamId: function (teamId, callback) {
            var jData = {};
            jData.teamId = teamId;

            Utilities.postJSONAsynch(config.webService.wsPhoto + 'GetByTeamId', jData, callback, arguments[2]);
        },

        getByPlayerId: function (playerId, callback) {
            var jData = {};
            jData.playerId = playerId;

            Utilities.postJSONAsynch(config.webService.wsPhoto + 'GetByPlayerId', jData, callback, arguments[2]);
        },

        getByStaffId: function (staffId, callback) {
            var jData = {};
            jData.staffId = staffId;

            Utilities.postJSONAsynch(config.webService.wsPhoto + 'GetByStaffId', jData, callback, arguments[2]);
        },

        getByMatchId: function (matchId, callback) {
            var jData = {};
            jData.matchId = matchId;

            Utilities.postJSONAsynch(config.webService.wsPhoto + 'GetByMatchId', jData, callback, arguments[2]);
        },

        createBySolutionId: function (solutionId, title, description, url, visibilityId, callback) {
            var jData = {};
            jData.solutionId = solutionId;
            jData.title = title;
            jData.description = description;
            jData.url = url;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsPhoto + 'CreateBySolutionId', jData, callback, arguments[6]);
        },

        createByTeamId: function (teamId, title, description, url, visibilityId, callback) {
            var jData = {};
            jData.teamId = teamId;
            jData.title = title;
            jData.description = description;
            jData.url = url;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsPhoto + 'CreateByTeamId', jData, callback, arguments[6]);
        },

        createByPlayerId: function (playerId, title, description, url, visibilityId, callback) {
            var jData = {};
            jData.playerId = playerId;
            jData.title = title;
            jData.description = description;
            jData.url = url;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsPhoto + 'CreateByPlayerId', jData, callback, arguments[6]);
        },

        createByStaffId: function (staffId, title, description, url, visibilityId, callback) {
            var jData = {};
            jData.staffId = staffId;
            jData.title = title;
            jData.description = description;
            jData.url = url;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsPhoto + 'CreateByStaffId', jData, callback, arguments[6]);
        },

        createByMatchId: function (matchId, title, description, url, visibilityId, callback) {
            var jData = {};
            jData.matchId = matchId;
            jData.title = title;
            jData.description = description;
            jData.url = url;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsPhoto + 'CreateByMatchId', jData, callback, arguments[6]);
        },

        update: function (photoId, title, description, url, visibilityId, callback) {
            var jData = {};
            jData.photoId = photoId;
            jData.title = title;
            jData.description = description;
            jData.url = url;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsPhoto + 'Update', jData, callback, arguments[6]);
        },

        delete: function (photoId, callback) {
            var jData = {};
            jData.photoId = photoId;

            Utilities.postJSONAsynch(config.webService.wsPhoto + 'Delete', jData, callback, arguments[2]);
        }
    },

    album: {
        get: function (albumId, callback) {
            var jData = {};
            jData.albumId = albumId;

            Utilities.postJSONAsynch(config.webService.wsAlbum + 'Get', jData, callback, arguments[2]);
        },

        getBySolutionId: function (solutionId, callback) {
            var jData = {};
            jData.solutionId = solutionId;

            Utilities.postJSONAsynch(config.webService.wsAlbum + 'GetBySolutionId', jData, callback, arguments[2]);
        },

        getByTeamId: function (teamId, callback) {
            var jData = {};
            jData.teamId = teamId;

            Utilities.postJSONAsynch(config.webService.wsAlbum + 'GetByTeamId', jData, callback, arguments[2]);
        },

        getByPlayerId: function (playerId, callback) {
            var jData = {};
            jData.playerId = playerId;

            Utilities.postJSONAsynch(config.webService.wsAlbum + 'GetByPlayerId', jData, callback, arguments[2]);
        },

        getByStaffId: function (staffId, callback) {
            var jData = {};
            jData.staffId = staffId;

            Utilities.postJSONAsynch(config.webService.wsAlbum + 'GetByStaffId', jData, callback, arguments[2]);
        },

        getByMatchId: function (matchId, callback) {
            var jData = {};
            jData.matchId = matchId;

            Utilities.postJSONAsynch(config.webService.wsAlbum + 'GetByMatchId', jData, callback, arguments[2]);
        },

        createBySolutionId: function (solutionId, title, description, photos, visibilityId, callback) {
            var jData = {};
            jData.solutionId = solutionId;
            jData.title = title;
            jData.description = description;
            jData.photos = photos;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsAlbum + 'CreateBySolutionId', jData, callback, arguments[6]);
        },

        createByTeamId: function (teamId, title, description, photos, visibilityId, callback) {
            var jData = {};
            jData.teamId = teamId;
            jData.title = title;
            jData.description = description;
            jData.photos = photos;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsAlbum + 'CreateByTeamId', jData, callback, arguments[6]);
        },

        createByPlayerId: function (playerId, title, description, photos, visibilityId, callback) {
            var jData = {};
            jData.playerId = playerId;
            jData.title = title;
            jData.description = description;
            jData.photos = photos;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsAlbum + 'CreateByPlayerId', jData, callback, arguments[6]);
        },

        createByStaffId: function (staffId, title, description, photos, visibilityId, callback) {
            var jData = {};
            jData.staffId = staffId;
            jData.title = title;
            jData.description = description;
            jData.photos = photos;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsAlbum + 'CreateByStaffId', jData, callback, arguments[6]);
        },

        createByMatchId: function (matchId, title, description, photos, visibilityId, callback) {
            var jData = {};
            jData.matchId = matchId;
            jData.title = title;
            jData.description = description;
            jData.photos = photos;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsAlbum + 'CreateByMatchId', jData, callback, arguments[6]);
        },

        update: function (albumId, title, description, photos, visibilityId, callback) {
            var jData = {};
            jData.albumId = albumId;
            jData.title = title;
            jData.description = description;
            jData.photos = photos;
            jData.visibilityId = visibilityId;

            Utilities.postJSONAsynch(config.webService.wsAlbum + 'Update', jData, callback, arguments[6]);
        },

        delete: function (albumId, callback) {
            var jData = {};
            jData.albumId = albumId;

            Utilities.postJSONAsynch(config.webService.wsAlbum + 'Delete', jData, callback, arguments[2]);
        }
    }
};

/************************************************/
/****************** Calendar ********************/
/************************************************/
var calendar = {
    getByAccount: function (accountId, callback) {
        var jData = {};
        jData.accountId = accountId;

        Utilities.postJSONAsynch(config.webService.wsCalendar + 'GetByAccount', jData, callback);
    },

    getByLeague: function (leagueId, callback) {
        var jData = {};
        jData.leagueId = leagueId;

        Utilities.postJSONAsynch(config.webService.wsCalendar + 'GetByLeague', jData, callback);
    },

    getBySeason: function (seasonId) {
        var jData = {};
        jData.seasonId = seasonId;

        return Utilities.postJSON(config.webService.wsMatch + 'GetBySeason', jData);
    },

    updateMatchDate: function (matchId, startDate, endDate) {
        var jData = {};
        jData.matchId = matchId;
        jData.startDate = startDate;
        jData.endDate = endDate;

        // Service non approprié car on utilise plus FullCalendat
        return 1;
        //return Utilities.postJSON(config.webService.wsMatch + 'UpdateMatchDate', jData);
    },

    sync: function (solutionId, teamId, format) {
        var queryKeyValue = { solutionId: solutionId || null, teamId: teamId || null, tz: moment.tz.guess() };
        var url = String.format('webcal://' + location.hostname + (location.port ? ':' + location.port : '') + '/handlers/Calendar.ashx{0}', Utilities.buildQueryString(queryKeyValue));

        if (format == 'google_calendar') {
            url = 'https://calendar.google.com/calendar/render?cid=' + encodeURIComponent(url);
        }

        window.open(url);
    }
};

/************************************************/
/******************** Bottin ********************/
/************************************************/
var bottin = {
    gets: function (callback) {
        var jData = {};

        Utilities.postJSONAsynch(config.webService.wsSearch + 'GetsBottin', jData, callback);
    },

    search: function (searchTerm, callback) {
        var jData = {};
        jData.searchTerm = searchTerm;

        Utilities.postJSONAsynch(config.webService.wsSearch + 'SearchBottin', jData, callback);
    },

    searchTest: function (searchTerm, sourceArray) {
        var jData = {};
        jData.searchTerm = searchTerm;

        return sourceArray(Utilities.postJSON(config.webService.wsSearch + 'SearchBottin', jData));
    },

    getByCountry: function (countryId, callback) {
        var jData = {};
        jData.countryId = countryId;

        Utilities.postJSONAsynch(config.webService.wsSearch + 'GetBottinByCountry', jData, callback);
    },

    getByState: function (stateId, callback) {
        var jData = {};
        jData.stateId = stateId;

        Utilities.postJSONAsynch(config.webService.wsSearch + 'GetBottinByState', jData, callback);
    },

    getByType: function (typeId, callback) {
        var jData = {};
        jData.typeId = typeId;

        Utilities.postJSONAsynch(config.webService.wsSearch + 'GetBottinByType', jData, callback);
    },

    getStateByCountry: function (countryId, callback) {
        var jData = {};
        jData.countryId = countryId;

        Utilities.postJSONAsynch(config.webService.wsSearch + 'GetStateByCountry', jData, callback);
    }
};

// *** Public Website ***
var publicWebsite = {
    formatNewsUrl: function () {
        return String.format('pub/{0}/{1}/{2}', leagueId, Utilities.textToUrl(leagueName), language.global.publicWebSite.urls.news);
    },

    formatNewsByIdUrl: function (leagueId, leagueName, newsId, newsTitle) {
        return String.format('pub/{0}/{1}/{2}/{3}-{4}', leagueId, Utilities.textToUrl(leagueName), language.global.publicWebSite.urls.news, Utilities.textToUrl(newsTitle), newsId);
    }
};

/************************************************/
/****************** Solution ********************/
/************************************************/
var solution = (function () {
    var sportPromises = {};
    return {
        getById: function (solutionId, callback) {
            var jData = {};
            jData.solutionId = solutionId;

            Utilities.postJSONAsynch(config.webService.wsSolution + 'Get', jData, callback, arguments[2]);
        },

        getByIdWithDeferred: function (solutionId, refreshSolution) {
            var jData = {};
            jData.solutionId = solutionId;

            if (viewstate.get('solutionAdmin-' + solutionId) == undefined || refreshSolution) {
                return $.when(data.post(config.webService.wsSolution + 'Get', jData)).then(function (a) {
                    viewstate.save('solutionAdmin-' + solutionId, a, { expires: 180000 });
                    return a;
                });
            }
            else {
                var solution = viewstate.get('solutionAdmin-' + solutionId);
                return solution;
            }
        },

        getFeature: function (solutionId, name) {
            var jData = {};
            var solution = null;
            jData.solutionId = solutionId;

            if (viewstate.get('solutionAdmin-' + solutionId) == undefined) {
                solution = $.when(data.post(config.webService.wsSolution + 'Get', jData)).then(function (a) {
                    viewstate.save('solutionAdmin-' + solutionId, a, { expires: 180000 });
                    return a;
                });
            }
            else {
                var solution = viewstate.get('solutionAdmin-' + solutionId);
                solution = solution;
            }

            return $.when(solution).then(function (solution) {
                return _.find(solution.features, { Name: name });
            });
        },

        getSport: function (solutionId) {
            if (viewstate.get('solutionAdmin-' + solutionId) == undefined) {
                var jData = {};
                jData.solutionId = solutionId;
                var solution = Utilities.postJSON(config.webService.wsSolution + 'Get', jData);
                viewstate.save('solutionAdmin-' + solutionId, solution, { expires: 180000 });
                return solution.SportId;
            }
            else {
                var solution = viewstate.get('solutionAdmin-' + solutionId);
                return solution.SportId;
            }
        },

        getSolutionMenuById: function (solutionId) {
            var jData = {};
            jData.solutionId = solutionId;

            return data.post(config.webService.wsSolution + 'GetSolutionMenuById', jData);
        },

        getListBySolutionId: function (solutionId) {
            var jData = {};
            jData.solutionId = solutionId;

            return data.post(config.webService.wsSolution + 'GetListBySolutionId', jData);
        },

        getLeagueBySolutionId: function (solutionId) {
            var jData = {};
            jData.solutionId = solutionId;

            return data.post(config.webService.wsSolution + 'GetLeagueBySolutionId', jData);
        },

        getListById: function (solutionId) {
            var jData = {};

            jData.solutionId = solutionId;

            return data.post(config.webService.wsSolution + 'Get', jData);
        },

        getByAccount: function (callback) {
            var jData = {};
            jData.solutionTypeId = null;

            Utilities.postJSONAsynch(config.webService.wsSolution + 'Gets', jData, callback, arguments[1]);
        },

        getByAccountWithDeferred: function () {
            var jData = {};

            return data.post(config.webService.wsSolution + 'Gets', jData);
        },

        gets: function () {
            var jData = {};

            return data.post(config.webService.wsSolution + 'GetSolutions', jData);
        },

        getDashboard: function (solutionId) {
            var jData = {};
            jData.solutionId = solutionId;

            return data.post(config.webService.wsSolution + 'GetDashboard', jData);
        },

        getFormTemplate: function (templateId) {
            var jData = {};
            jData.templateId = templateId;

            return data.post(config.webService.wsSolution + 'GetFormTemplate', jData);
        },

        getSolutionPlan: function (solutionId) {
            var jData = {};
            jData.solutionId = solutionId;

            return data.post(config.webService.wsSolution + 'GetSolutionPlan', jData);
        },

        create: function (typeId, name, description, abreviation, webSite, logo, callback) {
            var jData = {};
            jData.typeId = typeId;
            jData.name = name;
            jData.description = description;
            jData.abreviation = abreviation;
            jData.webSite = webSite;
            jData.logo = logo;

            Utilities.postJSONAsynch(config.webService.wsSolution + 'Create', jData, callback, arguments[8]);
        },

        createTeam: function (name, description, abreviation, webSite, logo, sportId) {
            var jData = {};
            jData.name = name;
            jData.description = description;
            jData.abreviation = abreviation;
            jData.webSite = webSite;
            jData.logo = logo;
            jData.sportId = sportId;

            return data.post(config.webService.wsSolution + 'CreateTeamSolution', jData);
        },

        createWithDeferred: function (typeId, name, description, abreviation, webSite, logo, sportId) {
            var jData = {};
            jData.typeId = typeId;
            jData.name = name;
            jData.description = description;
            jData.abreviation = abreviation;
            jData.webSite = webSite;
            jData.logo = logo;
            jData.sportId = sportId;

            return data.post(config.webService.wsSolution + 'Create', jData);
        },

        addSolutions: function (portalId, solutionList) {
            var jData = {};
            jData.portalId = portalId;
            jData.solutionList = solutionList;

            return data.post(config.webService.wsSolution + 'AddSolutions', jData);
        },

        validate: function (solution) {
            var jData = {};
            jData.solution = solution;

            return data.post(config.webService.wsSolution + 'ValidateSolution', jData);
        },

        update: function (solution, callback) {
            // remove features from solution (problem with feature dates)
            if (solution.features) {
                solution.features = null;
            }

            var jData = {};
            jData.solution = solution;

            Utilities.postJSONAsynch(config.webService.wsSolution + 'Update', jData, callback, arguments[2]);
        },

        updateBackground: function (solutionId, backgroundId) {
            var jData = {};
            jData.solutionId = solutionId;
            jData.backgroundId = backgroundId;

            data.post(config.webService.wsSolution + 'UpdateBackground', jData);
        },

        updateConfig: function (solutionId, configList) {
            var jData = {};
            jData.solutionId = solutionId;
            jData.configList = configList;

            return data.post(config.webService.wsSolution + 'UpdateSolutionConfig', jData);
        },

        updateMenu: function (solution, menuList) {
            var jData = {};
            jData.solutionId = solutionId;
            jData.menuList = menuList;

            return data.post(config.webService.wsSolution + 'UpdateMenu', jData);
        },

        updateSolutionPlan: function (planId, solutionId) {
            var jData = {};
            jData.solutionId = solutionId;
            jData.planId = planId;

            return data.post(config.webService.wsSolution + 'UpdateSolutionPlan', jData);
        },

        getCustomPagesBySolutionId: function (solutionId) {
            var jData = {};
            jData.solutionId = solutionId;

            return data.post(config.webService.wsSolution + 'GetCustomPagesBySolutionId', jData);
        },

        getCustomPagesDetailBySolutionId: function (solutionId) {
            var jData = {};
            jData.solutionId = solutionId;

            return data.post(config.webService.wsSolution + 'GetCustomPagesDetailBySolutionId', jData);
        },

        getCustomPageById: function (id) {
            var jData = {};
            jData.id = id;

            return data.post(config.webService.wsSolution + 'GetCustomPageById', jData);
        },

        getFormBySolutionId: function (solutionId, active) {
            var jData = {};
            jData.solutionId = solutionId;
            jData.active = active;

            return data.post(config.webService.wsSolution + 'GetFormBySolution', jData);
        },

        getFormById: function (formId) {
            var jData = {};
            jData.formId = formId;

            return data.post(config.webService.wsSolution + 'GetFormById', jData);
        },

        createForm: function (form) {
            var jData = {};
            jData.form = form;

            return data.post(config.webService.wsSolution + 'CreateForm', jData);
        },

        updateForm: function (form) {
            var jData = {};
            jData.form = form;

            return data.post(config.webService.wsSolution + 'UpdateForm', jData);
        },

        cloneForm: function (solutionId, formId, name) {
            var jData = {};
            jData.solutionId = solutionId;
            jData.formId = formId;
            jData.name = name;

            return data.post(config.webService.wsSolution + 'CloneForm', jData);
        },

        deleteForm: function (formId) {
            var jData = {};
            jData.formId = formId;

            return data.post(config.webService.wsSolution + 'DeleteForm', jData);
        },

        createCustomPage: function (page) {
            var url = '/api/custompage/{0}';
            return data.post(config.setting.urlRestApi + String.format(url, page.SolutionId), page);
        },

        updateCustomPage: function (page) {
            var url = '/api/custompage/{0}';
            return data.put(config.setting.urlRestApi + String.format(url, page.SolutionId), page);
        },

        deleteCustomPage: function (pageId, solutionId) {
            var url = '/api/custompage/{0}/page/{1}';
            return data.delete(config.setting.urlRestApi + String.format(url, solutionId, pageId), {});
        },

        isAdministrator: function (accountId, solutionId) {
            var jData = {};
            jData.accountId = accountId;
            jData.solutionId = solutionId;

            //return Utilities.postJSON(config.webService.wsSolution + 'GetSolution', jData);
            return true;
        },

        deleteSolution: function (solutionId, callback) {
            callback;
        }
    };
})();

var stripe = {
    connect: {
        getBySolutionId: function (solutionId, callback) {
            var jData = {};
            jData.solutionId = solutionId;

            Utilities.postJSONAsynch(config.webService.wsStripeConnect + 'GetBySolutionId', jData, callback, arguments[2]);
        },

        disconnect: function (solutionId) {
            var jData = {};
            jData.solutionId = solutionId;

            return data.post(config.webService.wsStripeConnect + 'Disconnect', jData);
        }
    }
}

var queue = {
    userSession: {
        add: function (type, url) {
            var queryKeyValue = { type: type, url: url };

            data.put(String.format('/api/queue/usersession/data{0}', Utilities.buildQueryString(queryKeyValue)));
        }
    }
}

/************************************************/
/****************** Favorite ********************/
/************************************************/
function getFavoriteByAccount(accountId) {
    var jData = {};
    jData.accountId = accountId;

    return [
        { id: '1', name: 'Favorite 1', abbreviation: 'S1', url: 'favorite1.aspx', description: 'Mon Favoris 1' },
        { id: '2', name: 'Favorite 2', abbreviation: 'S2', url: 'favorite2.aspx', description: 'Mon Favoris 2' },
        { id: '3', name: 'Favorite 3', abbreviation: 'S3', url: 'favorite3.aspx', description: 'Mon Favoris 3' }];
}

function getSeasonType(sportId) {
    var jData = {};
    jData.accountId = sportId;

    return [
        { id: '1', name: 'Saison régulière' },
        { id: '2', name: 'Série éliminatoire' },
        { id: '3', name: 'Hors Concours' }];
}
;
var data = {
    get: function(service, params) {
        var deferred = new $.Deferred();

        $.getJSON(service, params)
            .done(function (data, status, xhr) {         
                if (xhr.getResponseHeader('X-Pagination')) {
                    var response = JSON.parse(xhr.getResponseHeader('X-Pagination'));
                    response['results'] = data;
                    deferred.resolve(response);
                } else {
                    deferred.resolve(data);
                }            
            })
            .fail(function (jqxhr, textStatus, error) {
                deferred.reject();
            });

        return deferred.promise();
    },

    post: function(service, json) {
        var deferred = new $.Deferred();

        $.ajax({
            type: 'POST',
            headers: { '__KreezeeSession__': amplify.store('__KreezeeSession__')},
            url: service,
            data: JSON.stringify(json),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        })
        .done(function (data) {
            if (data && data.d !== undefined) {
                deferred.resolve(data.d);
            }
            else {
                deferred.resolve(data);
            }
            
        })
        .fail(function () {
            deferred.reject(arguments);
            //var err = eval("(" + jqxhr.responseText + ")");
            //Utilities.displayMessage('error', language.errorMessage.title, message);
        });        

        return deferred.promise();
                   
    },

    put: function (service, json) {
        var deferred = new $.Deferred();

        $.ajax({
            type: 'PUT',
            headers: { '__KreezeeSession__': amplify.store('__KreezeeSession__') },
            url: service,
            data: JSON.stringify(json),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        })
        .done(function (data) {                
            deferred.resolve((data || {}).d || data);
        })
        .fail(function () {
            deferred.reject(arguments);
            //var err = eval("(" + jqxhr.responseText + ")");
            //Utilities.displayMessage('error', language.errorMessage.title, message);
        });

        return deferred.promise();
    },

    delete: function (service) {
        var deferred = new $.Deferred();

        $.ajax({
            type: 'DELETE',
            headers: { '__KreezeeSession__': amplify.store('__KreezeeSession__') },
            url: service,            
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        })
        .done(function (data) {
            deferred.resolve((data || {}).d);
        })
        .fail(function () {
            deferred.reject(arguments);            
        });

        return deferred.promise();
    }
}
;
/// <reference path="kreezee.utilities.js" />
var session = null;
var queryStrings = {};
(function () {
    var e,
        a = /\+/g,  // Regex for replacing addition symbol with a space
        r = /([^&=]+)=?([^&]*)/g,
        d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
        q = window.location.search.substring(1);

    while (e = r.exec(q))
        queryStrings[d(e[1])] = d(e[2]);
})();

String.format = function () {
    var s = arguments[0];
    for (var i = 0; i < arguments.length - 1; i++) {
        var reg = new RegExp("\\{" + i + "\\}", "gm");
        s = s.replace(reg, arguments[i + 1]);
    }
    return s;
};

function getQueryStringData(name) {
    var result = null;
    var regexS = "[\\?&#]" + name + "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec('?' + window.location.href.split('?')[1]);
    var test = document.location.search;
    if (results != null) {
        result = decodeURIComponent(results[1].replace(/\+/g, " "));
    }
    return result;
};

function isValidEmailAddress(email) {
    var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i);
    return pattern.test(email);
};

function toLowerCase(input) {
    input.value = input.value.toLowerCase();
}

function toggleSectionMenu(objId) {
    $(objId).slideToggle('fast');
}

function showSection(objId) {
    $(objId).css('display', 'block');
}

function getFileExtention(filename) {
    return filename.split('.').pop();
}

function getTicks() {    
    var now = new Date();
    return now.getTime();
}

function convertIsoToUtc(dateIso) {
    var dt = new Date(dateIso.match(/\d+/) * 1);
    return dt.getFullYear() + '-' + ("0" + (dt.getMonth() + 1)).slice(-2) + '-' + ("0" + dt.getDate()).slice(-2);
}

var Utilities = {
    isShowControlPage: function (config, section, control) {
        var returnValue = true;
        if (config && config.sections !== undefined)
            config.sections.forEach(function (s) {
                if (s.name === section) {
                    if (s.filters !== null) {
                        s.filters.forEach(function (f) {
                            if (f.name === control) {
                                returnValue = f.visible;
                                return;
                            }
                        });  
                    } else {
                        return;
                    }
                }
            });

        return returnValue;
    },

    isFollowTeamActivate: function (config) {
        if (config.team && config.team === true) {
            if (config.mobileonly && config.mobileonly === true) {
                if (Utilities.mobileCheck()) {
                    return true;
                }
            }
            else {
                return true;
            }
        }

        return false;
    },

    isFollowSolutionActivate: function (config) {
        if (config.solution && config.solution === true) {
            if (config.mobileonly && config.mobileonly === true) {
                if (Utilities.mobileCheck()) {
                    return true;
                }
            }
            else {
                return true;
            }
        }

        return false;
    },

    isFollowTeamScheduleActivate: function (config) {
        if (config.teamschedule && config.teamschedule === true) {
            if (config.mobileonly && config.mobileonly === true) {
                if (Utilities.mobileCheck()) {
                    return true;
                }
            }
            else {
                return true;
            }
        }

        return false;
    },

    isSynchScheduleActivate: function (config) {
        if (config.synchschedule && config.synchschedule === true) {
            if (config.mobileonly && config.mobileonly === true) {
                if (Utilities.mobileCheck()) {
                    return true;
                }
            }
            else {
                return true;
            }
        }

        return false;
    },

    mobileCheck: function () {
        var check = false;
        (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true })(navigator.userAgent || navigator.vendor || window.opera);
        return check;
    },

    mobileAndTabletcheck: function () {
        var check = false;
        (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true })(navigator.userAgent || navigator.vendor || window.opera);
        return check;
    },

    deleteTemporaryFile: function (filetype, filename) {
        $.get(String.format('/handlers/DeleteTempFile.ashx?filetype={0}&filename={1}', filetype, encodeURI(filename)), function (data) {
            console.log(data);
        });            
    },    

    deleteBlobFile: function (filename) {
        $.get(String.format('/handlers/DeleteTemporayBlobFile.ashx?filename={0}', encodeURI(filename)), function (data) {
            console.log(data);
        });
    },    

    splitLines: function (textToSplit) {
        // To support all OS (MAC)
        var linesFiles = textToSplit.replace(/\r\n/g, '\n').replace(/\r/g, '\n').replace(/\n/g, '\r\n');

        return linesFiles.split('\r\n');
    },

    displayPenaltyMinute: function (value) {
        var calculateValue = value / 10;
        var penaltyMinute = calculateValue.toFixed(1);

        if (penaltyMinute.length > 2) {
            if (penaltyMinute.slice(-2) == ".0") {
                penaltyMinute = penaltyMinute.substr(0, penaltyMinute.length - 2);
            }
        }

        return penaltyMinute;
    },

    displayDifferential: function (value, precision) {
        var calculateValue = value / 100;
        precision = precision || 2;
        if (calculateValue >= 1) {
            return calculateValue.toFixed(precision);
        }
        else {
            return (calculateValue.toFixed(precision)).slice(1);
        }
    },

    displaySportPercentage: function (value, precision) {
        var calculateValue = value / 1000;
        precision = precision || 3;
        if (calculateValue >= 1) {
            return calculateValue.toFixed(precision);
        }
        else {
            return (calculateValue.toFixed(precision)).slice(1);
        }
    },

    displayInningPitched: function (value) {
        var newValue = value.toString();
        var inningPitched = newValue.slice(0, -1) == '' ? 0 : newValue.slice(0, -1);
        switch (newValue.slice(-1)) {
            case '3':
                inningPitched = inningPitched + ' ⅓'
                break;
            case '6':
                inningPitched = inningPitched + ' ⅔'
                break;
        }
        return inningPitched;
    },

    saveFile: function (file, fileType, section, solutionId, ratio, maxWidth) {
    //saveImage: function (image, section) {
        $.ajax({
            type: 'POST',
            url: '/handlers/AmazonS3.ashx?filetype=' + fileType + '&filename=' + escape(file) + '&section=' + escape(section) + '&solutionId=' + solutionId + '&ratio=' + ratio + '&maxWidth=' + maxWidth,
            //url: 'handlers/AzureStorageService.ashx?filename=' + escape(image) + '&section=' + escape(section),
            data: {},
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            cache: false,
            async: false
        })
        .done(function (data) {
            //debugger;
            //leagueAccountViewState.league.Logo = 'images/leagues/' + self.filename();
            //callback(data.d);
        })
        .fail(function (jqxhr, textStatus, error) {
            //debugger;
            if (error.length > 0)
                alert(error);
            //            var err = eval("(" + jqxhr.responseText + ")");
            // Utilities.displayMessage('error', language.errorMessage.title, language.errorMessage.message + err.Message);
        })
        .always(function () {
            //if (idObject != undefined) {
            //$(idObject).unblock({ fadeOut: 0 });
            //}
        });
    },

    documentTitle: function (title) {
        document.title = title + ' | Kreezee.com';
    },

    getDateTimeNow: function(){
        var dat = new Date();
        return dat.toUTCString();
    },

    extractCookie: function (cookies, name) {
        for (i = 0; i < cookies.length; i++) {
            x = cookies[i].substr(0, cookies[i].indexOf('='));
            y = cookies[i].substr(cookies[i].indexOf('=') + 1);
            x = x.replace(/^\s+|\s+$/g, '');
            if (x == name) {

                if (name === '__DataCacheUser__') {
                    return unescape(y);
                }
                return unescape(decodeURI(y));
            }
        }
        return '';
    },

    getCookie: function (name) {
        var i, x, y, cookies = document.cookie.split(';');
        return Utilities.extractCookie(cookies, name);
    },

    setCookie: function (name, value, expireDays) {
        var expiresDate = new Date();
        expiresDate.setDate(expiresDate.getDate() + expireDays);
        var cookieValue = escape(value) + ((expireDays == null) ? "" : "; expires=" + expiresDate.toUTCString());
        document.cookie = name + "=" + cookieValue;
    },

    getSession: function (name) {
        if (!session) {
            var jData = { };
            var isAuthenticated = Utilities.postJSON(config.webService.wsAuthentication + "AccountAuthenticated", jData);
            if (isAuthenticated) {
                session = JSON.parse(Utilities.getCookie('__KreezeeSessionCookieV2__'));
            } else {
                Utilities.setCookie('__KreezeeSessionCookieV2__', '', -1)
                return null;
            }
        }
        return session.Session[name];
    },

    setSession: function (name, value) {
        var cookie = document.cookie;
        var regex = new RegExp('"' + name + '":"[a-zA-Z\-]+"', 'ig');
        var regex2 = new RegExp('"' + name+'UI' + '":"[a-zA-Z\-]+"', 'ig');
        cookie = cookie.replace(regex, '"' + name + '":"' + value + '"');
        cookie = cookie.replace(regex2, '"' + name + 'UI' + '":"' + value + '"');
        document.cookie = '';
        document.cookie = cookie;
        return true;        
    },

    postJSONAsynch: function (webService, jsondata, callback) {
        var idObject = arguments[3];
        return $.ajax({
            type: 'POST',
            url: webService,
            data: JSON.stringify(jsondata),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            beforeSend: function () {
                Utilities.blockObject(idObject);
            }
        })
        .done(function (data, status, xhr) {
            if (callback !== undefined) {
                callback(data.d, xhr);
            }            
        })
        .fail(function (jqxhr, textStatus, error) {
            var err = eval("(" + jqxhr.responseText + ")");
            var message = language.errorMessage.message + '<a href="javascript:Utilities.reportError(' + err.Message + ');"><span style="color: white;">' + language.errorMessage.messageLink + '</span></a>'
            Utilities.displayMessage('error', language.errorMessage.title, message);
        })
        .always(function () {
            Utilities.unblockObject(idObject);
        });
    },

    reportError: function (noError){
        var jData = {};
        jData.noError = noError;

        $.ajax({
            type: 'POST',
            url: config.webService.wsMail + 'SendErrorReport',
            data: JSON.stringify(jData),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        });

        $.pnotify_remove_all();
    },

    postJSON: function (webService, jsondata) {
        var jsonResult = null;
        $.ajax({
            type: 'POST',
            url: webService,
            data: JSON.stringify(jsondata),
            async: false,
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        })
        .done(function (data) {
            jsonResult = data.d;
        })
        .fail(function (jqxhr, textStatus, error) {
            var err = eval("(" + jqxhr.responseText + ")");
            var message = language.errorMessage.message + '<a href="javascript:Utilities.reportError(' + err.Message + ');"><span style="color: white;">' + language.errorMessage.messageLink + '</span></a>'
            Utilities.displayMessage('error', language.errorMessage.title, message);
        })
        .always(function () {
        });
        return jsonResult;
    },

    getJSON: function (url, callback) {
        var jqxhr = $.getJSON(url, function (data) {
           // debugger;
            callback(data);
        })
        .done(function () {
            //console.log("second success");
        })
        .fail(function () {
            //console.log("error");
        })
        .always(function () {
            //console.log("complete");
        });

        
        jqxhr.complete(function () {
            //console.log("second complete");
        });

        return jqxhr;
    },

    rewriteUrl: function (value, id) {        
        return String.format('{0}-{1}', Utilities.textToUrl(value), id);
    },

    textToUrl: function (str) {
        var url = _.deburr(str.toLowerCase());
        return _.kebabCase(url);
    },    

    displayMessage: function (type, title, text) {
        //cache.kreezee.com/scripts/jquery.pnotify.1.2.0.min.js'
        var opts = {
            title: title,
            text: text,
            type: type, // error, info, success
            addclass: "stack-bar-top",
            cornerclass: "",
            opacity: .9,
            delay: type == 'success' ? 5000 : 15000,
            stack: false,
            sticker: false,
            width: "100%"
        };

        if ($.pnotify)
        {
            $.pnotify.defaults.history = false;
            $.pnotify.defaults.styling = "jqueryui";
            $.pnotify(opts);
        }
    },

    //addMessage: function (type, title, text) {
    //    var jData = {};
    //    jData.type = type;
    //    jData.title = title;
    //    jData.text = text;
    //    Utilities.setSession('Messages', jData);
    //},

    //deleteMessages: function () {
    //    Utilities.setSession('Messages', null);
    //},

    //getMessages: function () {
    //    return Utilities.getSession('Messages');
    //},

    findObjectById: function (array, id) {
        if (array !== undefined) {
            for (var i = 0, j = array.length; i < j; i++) {
                if (array[i].Id === id) {
                    return array[i];
                }
            }
        }

        return null;
    },
    //array: tableau dans lequel on cherche
    //value: Valeur recherché dans array #[0]
    //searchAttribute: attribut sur lequel faire la recherche
    //returnAttribute: optional attribut retourner, si null, l'objet est retourné
    findObjectByAttribute: function(array, value, searchAttribute, returnAttribute)
    {
        if (array !== undefined)
        {
            for (var i = 0, j = array.length; i < j; i++) {
                if (($.isFunction(searchAttribute) ? searchAttribute(array[i]) : ko.unwrap(array[i][searchAttribute])) === value)
                {
                    if (returnAttribute) {
                        if($.isFunction(returnAttribute)) {
                            return returnAttribute(array[i]);
                        }
                        else {
                            var value = '';
                            var object = array[i];
                            var path = returnAttribute.split('.');

                            for (var j = 0; j < path.length; j++) {
                                if (object[path[j]]) {
                                    object = object[path[j]];
                                }
                                else {
                                    return '';
                                }
                            }

                            return object;
                        }

                        return $.isFunction(returnAttribute) ? returnAttribute(array[i]) : ko.unwrap(array[i][returnAttribute]);
                    }
                    else {
                        return array[i];
                    }                    
                }
            }
        }

        return returnAttribute ? '' : undefined;
    },

    tryParseInt: function(str, defaultValue) {
        if(typeof str == 'number')
        {
            return str;
        }

         var retValue = defaultValue;
         if(str !== null && str !== undefined) {
             if(str.length > 0) {
                 if (!isNaN(str)) {
                     retValue = parseInt(str);
                 }
             }
         }
         return retValue;
    },

    formatJSONDate: function (jsonDate) {
        if ((jsonDate != null) && (jsonDate.length > 0)) {
            var date = new Date(parseInt(jsonDate.substr(6)));
            return date.getFullYear() + '-' + ("0" + (date.getMonth() + 1)).slice(-2) + '-' + ("0" + date.getDate()).slice(-2);
        }

        return '';
    },

    formatJSONDateTime: function (jsonDate) {
        if ((jsonDate != null) && (jsonDate.length > 0)) {
            var date = new Date(parseInt(jsonDate.substr(6)));
            return date.getFullYear() + '-' + ("0" + (date.getMonth() + 1)).slice(-2) + '-' + ("0" + date.getDate()).slice(-2) + 'T' + ("0" + date.getHours()).slice(-2) + ':' + ("0" + date.getMinutes()).slice(-2) + ':00';
        }

        return '';
    },

    formatJSONTime: function (jsonDate) {
        if ((jsonDate != null) && (jsonDate.length > 0)) {
            var date = new Date(parseInt(jsonDate.substr(6)));
            return ("0" + date.getHours()).slice(-2) + ':' + ("0" + date.getMinutes()).slice(-2);
        }

        return '';
    },

    formatJSONDateToTimeStamp: function (jsonDate) {
        if ((jsonDate != null) && (jsonDate.length > 0)) {
            var date = new Date(parseInt(jsonDate.substr(6)));
            return date.toString();
        }
        return '';
    },

    formatDate: function (date, format, timezoneOffset) {
        var offset = timezoneOffset ? new Date(date).getTimezoneOffset() : 0;

        return moment.utc(date).zone(offset).format(format);
    },

    convertDateToJScriptDate: function(date){
        return new Date(moment(date).utc().format('YYYY-MM-DDThh:mm:ss'));
    },

    getMomentDate: function (date, timezoneOffset) {
        var offset = timezoneOffset ? new Date(date).getTimezoneOffset() : 0;

        return moment.utc(date).zone(offset);
    },

    getTimeZone: function () {
        return moment().tz().guess();
    },

    formatTime: function(time, format) {
        if(!time) {
            return '';
        }

        if(typeof time === 'string') {
            var string = time;            
            var splittedTime = string.split(':');
            time = {};

            time.Hours = Utilities.tryParseInt(splittedTime[0], 0);
            time.Minutes = Utilities.tryParseInt(splittedTime[1], 0);
        }

        var result = format;
        var fullHour = ("00" + time.Hours).slice(-2);
        var midHour = ("00" + (time.Hours > 12 ? time.Hours - 12 : time.Hours)).slice(-2);
        var amPm = time.Hours >= 12 ? "PM" : "AM";
        var minutes = ("00" + time.Minutes).slice(-2);

        result = result.replace(/HH/g, fullHour);        
        result = result.replace(/hh/g, midHour);        
        result = result.replace(/A/g, amPm);        
        result = result.replace(/mm/g, minutes);

        return result;
    },

    addIconButton: function (obj, icon, label) {
        obj.button({
            label: label,
            icons: { primary: icon },
            text: true
        });
    },

    removeIconButton: function (obj) {
        var label = obj.find('.ui-button-text');
        obj
            .removeClass('ui-button-text-icon-primary')
            .addClass('ui-button-text-only')
            .html(label);
    },

    addIconTabs: function (obj, icon) {
        obj.html('<span class="ui-icon ' + icon + '"></span> ' + obj.html());
    },

    removeIconTabs: function (obj) {
        obj.children().remove();
    },

    formatTextToHtml: function (text) {
        var html = '';

        // Replace carriage return.
        html = text.replace(/(\r\n|\n|\r)/g, "<br />");

        // Replace url in text with html hyperlink.
        html = this.replaceUrlToHtml(html);

        return html;
    },

    replaceUrlToHtml: function (text) {
        var urlRegex = /((?:https?:|www\.)[^\s]+)/g;
        return text.replace(urlRegex, function (url) {
            return '<a href="' + url + '" target="_blank">' + url + '</a>';
        });
    },

    extractContenFromURL: function (url, callback) {
        $.ajax({
            url: 'handlers/extractContentFromUrl.ashx?url=' + url,
            async: false,
            cache: false
        })
        .done(function (data) {
            callback(JSON.parse(data));
        });
    },

    extractImgSrcFromHtml: function (html) {        
        var regex = /<img.*?src="(.*?)"/;
        return regex.exec(html) != null ? regex.exec(html)[1].replace(/\&amp;/g, '&') : null;
    },

    removerHtmlFromText: function (html, length) {
        var temp = document.createElement("div");
        temp.innerHTML = html;
        var text = temp.textContent || temp.innerText || "";
        if (length !== undefined) {
            return text.length > length ? text.substr(0, length - 1).trim() + '...' : text;
        } 
        return text;
    },

    blockObject: function (idObject, onBlockCallback) {
        if (idObject != undefined) {
            if (typeof idObject == "string") {
                $(idObject).block({
                    css: {
                        border: 'none',
                        padding: '15px',
                        backgroundColor: '#fff',
                        '-webkit-border-radius': '10px',
                        '-moz-border-radius': '10px',
                        opacity: 0.4,
                        color: '#fff',
                        height: '32px',
                        width: '48px'
                    },
                    overlayCSS: {
                        backgroundColor: '#ffffff',
                        opacity: 0.5,
                        cursor: 'wait'
                    },
                    message: '<img src="//cache.kreezee.com/images/ajax-loader.gif" />',
                    fadeIn: 0,
                    theme: false,
                    onBlock: onBlockCallback
                });
            }
            else {
                idObject.block({
                    css: {
                        border: 'none',
                        padding: '15px',
                        backgroundColor: '#fff',
                        '-webkit-border-radius': '10px',
                        '-moz-border-radius': '10px',
                        opacity: 0.4,
                        color: '#fff',
                        height: '32px',
                        width: '48px'
                    },
                    overlayCSS: {
                        backgroundColor: '#ffffff',
                        opacity: 0.5,
                        cursor: 'wait'
                    },
                    message: '<img src="//cache.kreezee.com/images/ajax-loader.gif" />',
                    fadeIn: 0,
                    theme: false,
                    onBlock: onBlockCallback
                });
            }
        }
    },

    unblockObject: function (idObject) {
        if (idObject != undefined) {
            if (typeof idObject == "string") {
                $(idObject).unblock({ fadeOut: 0 });
            }
            else {
                idObject.unblock({ fadeOut: 0 });
            }
        }
    },

    parseVideoUrl: function (url) {        
        var youtubeRegEx = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/;
        var vimeoRegEx = /\/\/(www\.)?vimeo.com\/(\d+)($|\/)/;
        var dailyMotionRegEx = /^.+dailymotion.com\/(video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/;
        var match = null;

        if ((url.toLowerCase().indexOf('youtube') != -1) 
            || (url.toLowerCase().indexOf('youtu.be') != -1)) {
            match = url.match(youtubeRegEx);            
            return match !== null ? match[1] : null;

        } else if (url.toLowerCase().indexOf('vimeo') != -1) {
            match = url.match(vimeoRegEx);
            return match !== null ? match[2] : null;

        } else if (url.toLowerCase().indexOf('dailymotion') != -1) {
            match = url.match(dailyMotionRegEx);
            if (match !== null) {
                if (match[4] !== undefined) {
                    return match[4];
                }
                return match[2];
            }
            return null;        
        } else {
            return null;
        }        
    },

    embedVideo: function (url, videoId, width, height) {
        if ((url.toLowerCase().indexOf('youtube') != -1)
            || (url.toLowerCase().indexOf('youtu.be') != -1)) {
            return String.format('<iframe id="videoPlayer" src="//www.youtube.com/embed/{0}" width="{1}" height="{2}" frameborder="0" allowfullscreen></iframe>', Utilities.parseVideoUrl(url), width, height);

        } else if (url.toLowerCase().indexOf('vimeo') != -1) {
            return String.format('<iframe id="videoPlayer" src="//player.vimeo.com/video/{0}?portrait=0" width="{1}" height="{2}" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>', Utilities.parseVideoUrl(url), width, height);

        } else if (url.toLowerCase().indexOf('dailymotion') != -1) {
            return String.format('<iframe id="videoPlayer" src="//www.dailymotion.com/embed/video/{0}" width="{1}" height="{2}" frameborder="0"></iframe>', Utilities.parseVideoUrl(url), width, height);

        } else if ((url.toLowerCase().indexOf('kreezee') != -1) || 
            (url.toLowerCase().indexOf('localhost') != -1)) {
            return String.format('<iframe id="videoPlayer" src="/embed/{0}" width="{1}" height="{2}" frameborder="0"></iframe>', videoId, width, height);
        } else {
            return '';
        }
    },

    getAgeFromDate: function(date) {
        if (date) {
            var today = moment();
            var birthday = moment(date);
            return today.diff(birthday, 'years');
        }
        return '';
    },

    getScoreUrl: function(solutionName, solutionId, gameId, scoreUrl, gameUrl, destinationUrl)
    {
        var pathUrl = !window.whiteLabel
                        ? String.format('/{0}/{1}/{2}/{3}-{4}', solutionName, solutionId, scoreUrl, gameUrl, gameId)
                        : String.format('/{0}/{1}-{2}', scoreUrl, gameUrl, gameId);

        if (destinationUrl !== undefined) {
            pathUrl = pathUrl + '#' + destinationUrl;
        }

        return pathUrl;
    },

    getPublicAbsolutePath: function (rootUrl, page)
    {
        var pathSegments = document.location.pathname.split('/');
        var path = '';

        if (!window.whiteLabel) {
            if (typeId === language.solutionList.portal.id) {
                path = pathSegments[1] + '/' + pathSegments[2] + '/' + pathSegments[3];
            }
            else {
                path = pathSegments[1] + '/' + pathSegments[2] + '/' + pathSegments[3] + '/' + pathSegments[4];
            }
        }
        
        for (var i = 0; i < arguments.length; i++) {
            path += '/' + arguments[i];
        }

        return window.whiteLabel
            ? path
            : '/' + path;
    },

    encodeVideo: function (videoId) {
        $.get(String.format('/handlers/VideoEncoder.ashx?videoId={0}', videoId), function (data) {
            console.log(data);
        });        
    },

    getNumberHandlerUrl: function (number, color) {
        return String.format('/images/handler/{0}/number.png?color={1}',
            ((number !== null) && (number.toString().length > 0)) ? number : '-',
            color !== null ? encodeURIComponent(color) : encodeURIComponent('#000000'));
    },

    uploadImageToCloud: function (section, filename) {
        $.ajax({
            type: 'POST',
            url: '/handlers/AmazonS3.ashx?filetype=image&filename=' + escape(filename) + '&section=' + escape(section),
            data: {},
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            cache: false,
            async: false,
            success: function(result) {

            },
            error: function(xhr, ajaxOptions, thrownError) {
                if (thrownError.length > 0)
                    alert(thrownError);
            }
        });
    },

    joinText: function(spacer) {
        var textArray = [];
        Array.prototype.slice.call(arguments, 1).forEach(function(argument) {
            if(Array.isArray(argument)) 
                argument = argument.join(spacer);

            if(argument) 
                textArray.push(argument);
        });
        return textArray.join(spacer);
    },

    buildQueryString: function(queryObject) {
        var queryArray = [];

        for(var index in queryObject) {
            if ((typeof queryObject[index] != "undefined") && (queryObject[index] != null)) {
                queryArray.push(String.format(index + '={0}', typeof queryObject[index] == "string" ? encodeURIComponent(queryObject[index]) : queryObject[index]));
            }
        }
        return queryArray.length > 0 ? '?' + queryArray.join('&', queryArray) : '';
    },

    objectToArray: function(object) {
        var array = [];
        for(var index in object) {
            array.push(object[index]);
        }
        return array;
    },

    bytesToSize: function (bytes) {
        var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
        if (bytes == 0) return '0 Byte';
        var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
        return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];
    },

    visitTree: function(array, callback, childrenKey)
    {
        var treeLevel = arguments[3] || 0;
        var parent = arguments[4] || null;
        var parents = arguments[5] || [];

        var childrenKey = childrenKey || 'Children';

        for(var i = 0, shortcut = false; i < array.length && !shortcut; i++)
        {
            shortcut = callback(array[i], parent, treeLevel, parents);
            if(!shortcut && array[i][childrenKey])
            {
                shortcut = Utilities.visitTree(ko.unwrap(array[i][childrenKey]), callback, childrenKey, treeLevel+1, array[i], parents.concat([array[i]]));
            }            
        }

        return shortcut;
    },
    guid: function() {
        var h=['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'];
        var k=['x','x','x','x','x','x','x','x','-','x','x','x','x','-','4','x','x','x','-','y','x','x','x','-','x','x','x','x','x','x','x','x','x','x','x','x'];
        var u='',i=0,rb=Math.random()*0xffffffff|0;
        while(i++<36) {
        var c=k[i-1],r=rb&0xf,v=c=='x'?r:(r&0x3|0x8);
        u+=(c=='-'||c=='4')?c:h[v];rb=i%8==0?Math.random()*0xffffffff|0:rb>>4
        }
        return u
    },
    
    formatCurrency: function (value) {        
        value = parseFloat(value);
        return String.format(language.currencyFormat.format, value.toFixed(2).toString().replace('.', language.currencyFormat.separator));        
    },

    parseQuerystring: function (string) {
        var object = {};
        var vars = string.split('&');
        for (var i = 0; i < vars.length; i++) {
            var pair = vars[i].split('=');
            if (decodeURIComponent(pair[0]) && decodeURIComponent(pair[1])) {
                object[decodeURIComponent(pair[0])] = Utilities.tryParseInt(decodeURIComponent(pair[1]), decodeURIComponent(pair[1]));
            }
        }
        return object;
    }
};

$.fn.settingsMenu = function (options) {
    var defaults = {
        menus: [],
        select: null
    }
    var settings = $.extend(true, {}, defaults, options);

    return this.each(function () {
        var element = $(this);
        var index = 0;

        var toHide = true;

        function show() {
            toHide = true;
            bindEvents();
            element.css("display", "block");
        }

        function hide() {
            if (toHide)
            {
                element.css("display", "none");
                toHide = true;
                unbindEvents();
            }
        }
        
        hide();

        var links = element.find("a");
        element.addClass("settingsMenu");
        element.css("top", element.parent().height() + 2);

        element.parent().on('mouseover', show);
        element.parent().on('mouseout', hide);
        element.parent().on('click', function (e) { show(); e.stopPropagation() });
        $(document).on('click.settingsMenu', function () { toHide = true; hide(); });
        
        function bindEvents() {
            element.on('mouseover.settingsMenu', function (e) { toHide = false; e.stopPropagation();});
            element.on('mouseout.settingsMenu', function (e) { toHide = false; e.stopPropagation(); });
            element.on('click.settingsMenu', function (e) { e.stopPropagation() });
        }

        function unbindEvents() 
        {
            element.off('mouseover.settingsMenu');
            element.off('mouseout.settingsMenu');
            element.off('click.settingsMenu');
        }

    });
}

var test2 = 0;
$.fn.pinPoint = function (method) {    
    var element = $(this);
    var pinPoint = $('<div class="pin-container top-right"><div class="pin"></div><div class="pulse"></div></div>');
    var methods = {
        remove: function () {
            $(".pin-container", element).remove();
        }
    }

    if (methods[method]) {
        methods[method]();
    }
    else {        
        element.css('position', 'relative');
        element.append(pinPoint);
    }
    
}

if ($.fn.dataTable)
{
    $.fn.dataTableExt.oApi.fnResetData = function (oSettings, data) {
        this.fnClearTable(false);
        if (data && data.length > 0)
            this.fnAddData(data);
        this.fnDraw();
        return true;
    }

    $.extend(true, $.fn.dataTable.defaults, {
        dom: '<"datatable-responsive"t><"row"<"col-xs-12"p>>',
        lengthChange: false,
        searching: true,
        pageLength: 10,
        info: false,
        column: {
            asSorting: ['desc', 'asc']
        },
        order: [[0, 'desc']]
    });

    function sort_function(x, y) {
        var alpha = " 0123456789AaÀàÂâBbCcÇçDdEeÉéÈèÊêËëFfGgHhIiÏïJjKkLlMmNnOoÔôÖöPpQqRrSsTtUuÙùVvWwXxYyZz"
        var index = 0;
        var returnVal = 0;
        var y = Utilities.removerHtmlFromText(y).replace(/[\.,;:\(\)\[\]\{\}\"\'\?\!]/g, '').replace(/[\-\—\/]/, " ");
        var x = Utilities.removerHtmlFromText(x).replace(/[\.,;:\(\)\[\]\{\}\"\'\?\!]/g, '').replace(/[\-\—\/]/, " ");


        while(index < x.length && index < y.length && x[index] == y[index])
        {
            index++;
        }

        if (x[index] != y[index]) {
            
            returnVal = alpha.indexOf(x[index]) - alpha.indexOf(y[index]);
        }
        else
        {
            if(x.length < y.length)
            {
                returnVal = -1;
            }
            else
            {
                returnVal = 1;
            }
        }
               
        return returnVal;
    }

    $.extend($.fn.dataTableExt.oSort, {
        "html-pre": null,

        "html-asc": function (a, b) {
            return sort_function(a, b);
        },

        "html-desc": function (a, b) {
            return sort_function(a, b) * -1;
        },

        "string-pre": null,

        "string-asc": function (a, b) {
            return sort_function(a, b);
        },

        "string-desc": function (a, b) {
            return sort_function(a, b) * -1;
        },

        "height-pre": function(a)
        {
            var numbers = a.match(/[0-9]+/g)
            return numbers ? (parseFloat(numbers[0] + ("00" + (numbers[1] ? numbers[1] : '0')).slice(-2))) - (numbers[1] ? 0 : 0.5) : 0;
        },

        "weight-pre": function(a)
        {
            var numbers = a.match(/[0-9]+/g);
            return numbers ? parseInt(numbers.join('')) : 0;
        },

        "num-pre": function (a) {
            var number = parseFloat(a);
            return number;
        }
    });

    function customOrder(name, columns) {
        $.fn.dataTable.ext.order[name] = function ( settings, col )
        {
            var rows = settings.aoData;
            var indexArray = this.api().column( col ).nodes();
    
            var sortedArray = rows.sort(function (a, b) {
                return rowTest(a, b, columns, 0);
            });
    
            sortedArray.forEach(function (r, i) { indexArray[i] = i });
            console.log(indexArray);
            return indexArray;
        }

    }

    function rowTest(a, b, columns, i)
    {
        var alpha = " 0123456789AaÀàÂâBbCcÇçDdEeÉéÈèÊêËëFfGgHhIiÏïJjKkLlMmNnOoÔôÖöPpQqRrSsTtUuÙùVvWwXxYyZz"
        var valX = 0;

        if(typeof a._aData[columns[i][0]] == 'string')
        {
            // find the first different letter and compare
            var x = Utilities.removerHtmlFromText(a._aData[columns[i][0]]).replace(/[\.,;:\(\)\[\]\{\}\"\'\?\!]/g, '').replace(/[\-\—\/]/, " ");
            var y = Utilities.removerHtmlFromText(b._aData[columns[i][0]]).replace(/[\.,;:\(\)\[\]\{\}\"\'\?\!]/g, '').replace(/[\-\—\/]/, " ");
            var index = 0;

            while(index < x.length && index < y.length && x[index] == y[index])
            {
                index++;
            }

            if (x[index] != y[index]) {
            
                valX = alpha.indexOf(x[index]) - alpha.indexOf(y[index]);
            }
        }
        else
        {
            // compare numbers
            valX = a._aData[columns[i][0]] - b._aData[columns[i][0]];
        }

        // sort by the other column if equals
        if (valX == 0 && i < columns.length - 1) {
            return rowTest(a, b, columns, i+1);
        }

        // return sort value
        if (columns[i][1] == 'reverse')
        {
            return valX * -1;
        }
        else
        {
            return valX;
        }
    }
}
;
var AppSecurity = (function() {	
    var promise = null;

	function get(solutionId, key) {
        var DEFAULT = { Read: false, Update: false, Delete: false, Create: false, Special: false }
		var security = ko.observable(DEFAULT);
		var solution = getSolution();

		if (!solution || solution.SolutionId != solutionId || !solution.Sections) {
            viewstate.save('ssecurity', null, { expires : 180000 });
		    if (promise == null) {
                promise = user.getSolutionSecurity(solutionId);
            }

            promise.done(function(solution) {
                viewstate.save('ssecurity', solution, { expires: 180000 });
				if (solution && solution.Sections)
				{
				    var section = Utilities.findObjectByAttribute(solution.Sections, key, 'Name');
				    security(section || DEFAULT);
				}

                promise = null;
			});
		}
		else {
			var section = Utilities.findObjectByAttribute(solution.Sections, key, 'Name');
			security(section || DEFAULT);
		}

		return security;
	}

	function getRight(solutionId, key) {
	    var DEFAULT = { Read: false, Update: false, Delete: false, Create: false, Special: false }
	    var solution = getSolution();
	    if (!solution || solution.SolutionId != solutionId) {
	        return DEFAULT;
	    }

	    var section = Utilities.findObjectByAttribute(solution.Sections, key, 'Name');
	    return section || DEFAULT;
	}

	function getSolution() {
	    if (viewstate.get('ssecurity') == undefined) {
	        return null;
	    }

	    return viewstate.get('ssecurity');
	}

    function getPromise(solutionId, code) {        
	    if (promise != null) {
	        return promise;
	    }
	    else {
	        get(solutionId, code);
	        if (promise != null) {
	            return promise;
	        }
	        else {
	            return $.Deferred().resolve().promise()
	        }
	    }
	}

	return {
	    get: get,
	    getPromise: getPromise,
	    getRight: getRight
	}
})();;
/************************************************/
/********* Administration Section ***************/
/************************************************/
function getAdminSection(section) {
    var resultat;
    
    switch (section) {
        case "ADMSPO":
            resultat = getAdminSport();
            break;
        case "ADMPAY":
            resultat = getAdminCountry();
            break;
        case "ADMSTA":
            resultat = getAdminStats();
            break;
        default:
            resultat = null;
    }
    return resultat;
}

function getAdminSport() {
    var jData = {};
    jData.culture = 'fr';

    //return postJSON(wsAdminSport + 'GetAdminSports', jData);
    var value = [
                { Id: "1", Name: "Hockey", Desc: "Hockey" },
                { Id: "2", Name: "Football", Desc: "Desc" },
                { Id: "3", Name: "Baseball", Desc: "Desc" },
                { Id: "4", Name: "Soccer", Desc: "Desc"}];
    return value;
}

function getAdminCountry() {
    var jData = {};
    jData.culture = 'fr';

//    return postJSON(wsAdminCountry + 'GetCountries', jData);
    var value = [
        { Id: "1", Name: "Canada", Desc: "Canada" },
        { Id: "2", Name: "États-Unis", Desc: "US" }];
    return value;
}

function getAdminStats() {
    var jData = {};
    jData.culture = 'fr';

    //return postJSON(wsAdminSport + 'GetAdminSports', jData);
    var value = [
                { Id: "1", Name: "But", Desc: "Hockey" },
                { Id: "2", Name: "Passe", Desc: "Hockey" },
                { Id: "3", Name: "Pénalité", Desc: "Hockey" }];
    return value;
}

function getAdminTraduction(sectionName, id) {
    var jData = {};
    jData.sectionName = sectionName;
    jData.id = id;

    //    return postJSON(wsAdminCountry + 'GetCountries', jData);
    var value = [
        { Id: "1", Name: "Traduction 1", Desc: "Traduction1" },
        { Id: "2", Name: "Traduction 2", Desc: "Traduction2"}];
    return value;    
}

function getPhoneTypeIcon(id)
{
    var url = "";
    switch (parseInt(id)) {
        case 1:
            url = "//cache.kreezee.com/images/icon-phone-26px.png";
            break;
        case 2:
            url = "//cache.kreezee.com/images/icon-phone-office-26px.png";
            break;
        case 3:
            url = "//cache.kreezee.com/images/icon-cellphone-26px.png";
            break;
        case 4:
            url = "//cache.kreezee.com/images/icon-fax-26px.png";
    }

    return url;
}

function getEmailTypeIcon(id)
{
    var url = "";
    switch(parseInt(id))
    {
        case 1:
            url = "//cache.kreezee.com/images/icon-home-26px.png";
            break;
        case 3:
            url = "//cache.kreezee.com/images/icon-suitcase-26px.png";
    }
    return url;
};
ko.bindingHandlers.autoComplete = {
    findSelectedItem: function (dataSource, binding, selectedValue) {
        var unwrap = ko.utils.unwrapObservable;
        //Go through the source and find the id, and use its label to set the autocomplete
        var source = unwrap(dataSource);
        var valueProp = unwrap(binding.optionsValue);

        var selectedItem = ko.utils.arrayFirst(source, function (item) {
            if (unwrap(item[valueProp]) === selectedValue)
                return true;
        }, this);

        return selectedItem;
    },
    buildDataSource: function (dataSource, labelProp, valueProp, iconProp, descProp) {
        var unwrap = ko.utils.unwrapObservable;
        var source = unwrap(dataSource);
        var mapped = ko.utils.arrayMap(source, function (item) {
            var result = {};
            if (typeof labelProp == 'function')
            {
                result.label = labelProp(item);  //show in pop-up choices
            }
            else
            {
                result.label = labelProp ? unwrap(item[labelProp]) : unwrap(item).toString();  //show in pop-up choices
            }
            
            if (descProp) { 
                if (typeof descProp == 'function') {
                    result.desc = descProp(item);  //show in pop-up choices
                }
                else {
                    result.desc = descProp ? unwrap(item[descProp]) : unwrap(item).toString();  //show in pop-up choices
                }
            }

            result.value = valueProp ? unwrap(item[valueProp]) : unwrap(item).toString();  //value 
            result.icon = iconProp ? unwrap(item[iconProp]) : unwrap(item).toString();  //value 
            return result;
        });
        return mapped;
    },
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var unwrap = ko.utils.unwrapObservable;
        var dataSource = valueAccessor();
        var binding = allBindingsAccessor();
        var bindingMode = unwrap(binding.optionsMode); // Mode to display the autocomplete value in a listbox
        var valueProp = unwrap(binding.optionsValue);
        var labelProp = unwrap(binding.optionsText) || valueProp;
        var iconProp = unwrap(binding.optionsIcon);
        var descProp = unwrap(binding.optionsDesc);
        var classProp = unwrap(binding.optionsClass);
        var styleProp = unwrap(binding.optionsStyle);
        var itemClassProp = unwrap(binding.optionsItemClass);
        var noWrite = unwrap(binding.optionsNoWrite);
        var query = unwrap(binding.optionsQuery);
        var textValue = binding.textValue;
        var acceptText = unwrap(binding.optionsAcceptText);

        var displayId = $(element).attr('id') + '-display';
        var displayElement;
        var options = {};
        var objectValue = binding.object;

        //function that is shared by both select and change event handlers
        function writeValueToModel(valueToWrite) {
            if (ko.isWriteableObservable(objectValue)) {
                objectValue(valueToWrite);
            } else {  //write to non-observable
                if (binding['_ko_property_writers'] && binding['_ko_property_writers']['object'])
                    binding['_ko_property_writers']['object'](valueToWrite);
            }
        }

        if (binding.autoCompleteOptions) {
            options = $.extend(options, binding.autoCompleteOptions);
        }

        //Create a new input to be the autocomplete so that the label shows
        // also hide the original control since it will be used for the value binding
        displayElement = $('<input type="text" id="' + displayId + '" class="' + classProp + '" style="' + styleProp + '" />');

        $(element).hide();
        $(element).after(displayElement);

        var modelValue = binding.value;
        if (modelValue) {
            var handleValueChange = function (event, ui) {
                var labelToWrite = ui.item ? ui.item.label : null
                var valueToWrite = ui.item ? ui.item.value : null;
                var selectedItem = ko.bindingHandlers.autoComplete.findSelectedItem(dataSource, binding, valueToWrite);
                writeValueToModel(selectedItem);
                if (labelToWrite && valueToWrite) {
                    if (ko.isWriteableObservable(modelValue)) {
                        //Since this is an observable, the update part will fire and select the 
                        //  appropriate display values in the controls
                        modelValue(valueToWrite);
                    } else {  //write to non-observable
                        if (binding['_ko_property_writers'] && binding['_ko_property_writers']['value']) {
                            binding['_ko_property_writers']['value'](valueToWrite);
                            displayElement.val(labelToWrite);
                            $(element).val(valueToWrite);
                        }
                    }
                }
                else {
                    var currentModelValue = unwrap(modelValue);
                    if (!currentModelValue)
                        displayElement.val('');
                    else {
                        var selectedItem = ko.bindingHandlers.autoComplete.findSelectedItem(dataSource, binding, currentModelValue);

                        if (selectedItem) {
                            var displayText = labelProp ? unwrap(selectedItem[labelProp]) : unwrap(selectedItem).toString();
                            displayElement.val(displayText);
                        }
                        else {
                            displayElement.val('');
                        }
                    }
                }

                return false;
            };

            var handleFocus = function (event, ui) {
                return false;
            };

            var handleChange = function (event, ui) {
                if (ui.item == null) {
                    if (acceptText) {
                        textValue(displayElement.val());
                    } else {
                        displayElement.val('');
                    }
                    objectValue(null);
                    modelValue(null);
                }
                return false;
            };

            options.change = handleChange;
            options.select = handleValueChange;
            options.focus = handleFocus;
        }
        else if (objectValue) {
            var handleValueChange = function (event, ui) {

                var labelToWrite = ui.item ? ui.item.label : null
                var valueToWrite = ui.item ? ui.item.value : null;
                var selectedItem = ko.bindingHandlers.autoComplete.findSelectedItem(dataSource, binding, valueToWrite);
                writeValueToModel(selectedItem);

                if (unwrap(noWrite))
                {
                    displayElement.val('');
                    return false;
                }

                if (labelToWrite && valueToWrite) {
                    displayElement.val(labelToWrite);
                    $(element).val(valueToWrite);
                }
                else {
                    var currentModelValue = unwrap(objectValue);
                    if (!currentModelValue) {
                        displayElement.val('');
                    }
                    else {
                        if (selectedItem) {
                            
                            var displayText = labelProp ? unwrap(selectedItem[labelProp]) : unwrap(selectedItem).toString();
                            displayElement.val(displayText);
                        }
                        else {
                            displayElement.val('');
                        }
                    }
                }
                return false;
            };

            var handleFocus = function (event, ui) {
                return false;
            };

            var handleChange = function (event, ui) {
                if (ui.item == null || !unwrap(objectValue)) {
                    if (acceptText) {
                        textValue(displayElement.val());
                    } else {
                        displayElement.val('');
                    }
                    objectValue(null);
                }
                return false;
            };

            options.change = handleChange;
            options.select = handleValueChange;
            options.focus = handleFocus;
        }

        var currentResponse = null;

        //handle the choices being updated in a Dependant Observable (DO), so the update function doesn't 
        // have to do it each time the value is updated. Since we are passing the dataSource in DO, if it is
        // an observable, when you change the dataSource, the dependentObservable will be re-evaluated
        // and its subscribe event will fire allowing us to update the autocomplete datasource
        var mappedSource = ko.dependentObservable({
            read: function () {
                return ko.bindingHandlers.autoComplete.buildDataSource(dataSource, labelProp, valueProp, iconProp, descProp);
            },
            write: function (newValue) {
                dataSource(newValue);
                if (currentResponse) {
                    currentResponse(mappedSource());
                }
            }
        });

        //hold the autocomplete current response
        if (query) {
            options.source = function (request, response) {
                currentResponse = response;
                query.call(this, request.term, mappedSource);
            };
        } else {
            //whenever the items that make up the source are updated, make sure that autocomplete knows it            
            mappedSource.subscribe(function (newValue) {
                if (displayElement.data('ui-autocomplete')) {
                    displayElement.autocomplete("option", "source", newValue);
                }
            });

            options.source = mappedSource();
        }

        // Modify the render html list of jquery.autocomplete
        // Three modes is available : normal, description, image, image-description
        // normal : display only the label (by default this mode is displayed)
        // description : display label and a description in a second line.
        // image : display a image following by the label.
        // image-description : display a image following by the label and a description in second line.
        displayElement.autocomplete(options).data("ui-autocomplete")._renderItem = function (ul, item) {
            switch (bindingMode) {
                case 'normal':
                    {
                        return $("<li class='" + itemClassProp + "'>")
                            .data("ui-autocomplete-item", item)
                            .append("<a>" + item.label + "</a>")
                            .appendTo(ul);
                    }
                case 'description':
                    {
                        return $("<li class='" + itemClassProp + "'>")
                                .data("ui-autocomplete-item", item)
                                .append("<a>" + item.label + "<br>" + item.desc + "</a>")
                                .appendTo(ul);
                    }
                case 'image':
                    {
                        return $("<li class='" + itemClassProp + "'>")
                                .data("ui-autocomplete-item", item)
                                .append("<a>" + "<img src=" + item.icon + "/>" + item.label + "</a>")
                                .appendTo(ul);
                    }
                case 'image-description':
                    {
                        return $("<li class='" + itemClassProp + "'>")
                                .data("ui-autocomplete-item", item)
                                .append("<a>" + "<img src=" + item.icon + "/>" + item.label + "<br>" + item.desc + "</a>")
                                .appendTo(ul);
                    }
                case 'search-contact':
                    {
                        return $("<li class='" + itemClassProp + "'>")
                                .data("ui-autocomplete-item", item)
                                .append(String.format('<a style="float:none;padding:5px;height:34px;"><span style="float:left;display:block;width:32px;height:32px;background:url(\'{0}\') no-repeat;background-size:32px 32px;"></span><span style="margin-left:8px;">{1}</span><br /><span style="margin-left:8px;">{2}</span></a>', item.icon, item.label, item.desc))
                                .appendTo(ul);
                    }
                case 'search-team':
                    {
                        return $("<li class='" + itemClassProp + "'>")
                                .data("ui-autocomplete-item", item)
                                .append(String.format('<a style="float:none;padding:5px;height:34px;"><span style="float:left;display:block;width:32px;height:32px;background:url(\'{0}\') no-repeat;background-size:32px 32px;"></span><span style="margin-left:8px;">{1}</span><br /><span style="margin-left:8px;">{2}</span></a>', item.icon, item.label, item.desc))
                                .appendTo(ul);
                    }
                default:
                    {
                        return $("<li class='" + itemClassProp + "'>")
                            .data("ui-autocomplete-item", item)
                            .append("<a>" + item.label + "</a>")
                            .appendTo(ul);
                    }
            }
        };
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        //update value based on a model change
        var unwrap = ko.utils.unwrapObservable;
        var dataSource = valueAccessor();
        var binding = allBindingsAccessor();
        var valueProp = unwrap(binding.optionsValue);
        var labelProp = unwrap(binding.optionsText) || valueProp;
        var iconProp = unwrap(binding.optionsIcon) || iconProp;
        var displayId = $(element).attr('id') + '-display';
        var displayElement = $(element).siblings('#' + displayId);
        var modelValue = binding.value;
        var objectValue = binding.object;
        var required = binding.required;
        
        if (modelValue) {
            var currentModelValue = unwrap(modelValue);
            //Set the hidden box to be the same as the viewModels Bound property
            $(element).val(currentModelValue);
            //Go through the source and find the id, and use its label to set the autocomplete
            var selectedItem = ko.bindingHandlers.autoComplete.findSelectedItem(dataSource, binding, currentModelValue);
            if (selectedItem) {
                var displayText = labelProp ? unwrap(selectedItem[labelProp]) : unwrap(selectedItem).toString();
                displayElement.val(displayText);
            }
            else {
                displayElement.val('');
            }
        }
        else if (objectValue) {
            var currentObjectValue = unwrap(objectValue);
            //console.log(currentObjectValue);
            if (currentObjectValue) {
                $(element).val(currentObjectValue[valueProp]);
                var displayText = labelProp ? currentObjectValue[labelProp] : currentObjectValue.toString();
                displayElement.val(displayText);
            }
            else {
                if (required) {                
                    displayElement.val("");
                }
            }
        }
    }
};

ko.bindingHandlers.inlineSelect = {
    init: function(element, valueAccessor, allBindingsAccessor) {
        var span = $(element);
        var select = $('<select></select>', { 'style': 'display: none' });
        span.after(select);
        ko.applyBindingsToNode(select.get(0), { value: valueAccessor(), options: allBindingsAccessor().inlineOptions });
        ko.applyBindingsToNode(span.get(0), { text: valueAccessor() });
        span.click(function() {
            span.hide();
            select.show();
            select.focus();
        });
        select.change(function() {
            span.show();
            select.hide();
        });
    }
};

ko.bindingHandlers.inlineToggle = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        var displayType = allBindingsAccessor().type || "bool";
        var displayArray = [];
        if (displayType == "bool") {
            displayArray = ["True", "False"];
        } else if (displayType == "on") {
            displayArray = ["On", "Off"];
        } else {
            displayArray = displayType.split("/");
        }
        var target = valueAccessor();
        var observable = valueAccessor();
        var interceptor = ko.computed(function () { return observable() ? displayArray[0] : displayArray[1]; });
        ko.applyBindingsToNode(element, { text: interceptor });
        ko.applyBindingsToNode(element, { click: function () { target(!target()); } });
    }
};


ko.bindingHandlers.inlineSelectedOptions = {
    init: function(element, valueAccessor, allBindingsAccessor) {
        var span = $(element);
        var select = $('<select></select>', { 'style': 'display: none', 'multiple': 'true' });
        span.after(select);
        ko.applyBindingsToNode(select.get(0), { selectedOptions: valueAccessor(), options: allBindingsAccessor().inlineOptions });
        ko.applyBindingsToNode(span.get(0), { text: valueAccessor() });
        span.click(function() {
            span.hide();
            select.show();
            select.focus();
        });
        select.change(function() {
            span.show();
            select.hide();
        });
    }
};

ko.bindingHandlers.enterKey = {
    init: function(element, valueAccessor, allBindings, data) {
        var handler = function(data, event) {
            if (event.keyCode === 13) {
                valueAccessor().call(data, data, event);
            }
            ;
        };
        var newValueAccessor = function() { return { keyup: handler }; };
        ko.bindingHandlers.event.init(element, newValueAccessor, allBindings, data);
    }
};

ko.observableArray.fn.moveUp = function (item) {
    var index = this.indexOf(item);
    if (index == -1 || index == 0)
        return;
    this.remove(item);
    this.splice(index - 1, 0, item);
};

ko.observableArray.fn.moveDown = function (item) {
    var index = this.indexOf(item);
    if (index == -1 || index + 1 == this().length)
        return;
    this.remove(item);
    this.splice(index + 1, 0, item);
};

ko.bindingHandlers.slideVisible = {
    init: function (element, valueAccessor, allBindingsAccessor) {        
        var value = ko.utils.unwrapObservable(valueAccessor());
            // Get the current value of the current property we're bound to        
            $(element).toggle(value); // jQuery will hide/show the element depending on whether "value" or true or false    
        },
    update: function (element, valueAccessor, allBindingsAccessor) {
        var afterShow = allBindingsAccessor().afterShow || $.noop;

        // First get the latest data that we're bound to
        var value = valueAccessor(), allBindings = allBindingsAccessor();

        // Next, whether or not the supplied model property is observable, get its current value        
        var valueUnwrapped = ko.utils.unwrapObservable(value);

        // Grab some more data from another binding property        
        var duration = allBindings.slideDuration || 400; // 400ms is default duration unless otherwise specified

        // Now manipulate the DOM element        
        if (valueUnwrapped == true)
            $(element).slideDown(duration, afterShow);
        else
            $(element).slideUp(duration);
    }
};

if (ko && ko.bindingHandlers) {
    ko.bindingHandlers['buttonEnable'] = {
        'update': function (element, valueAccessor) {
            var value = ko.utils.unwrapObservable(valueAccessor());
            var $button = $(element);
            $button.prop("disabled", !value);
            if ($button.hasClass("ui-button")) {
                $button.button("option", "disabled", !value);
            }
        }
    };
}

ko.bindingHandlers.datepicker = (function() {
    var idIndex = 1;
    return { init: function (element, valueAccessor, allBindingsAccessor) {
                //initialize datepicker with some optional options
                var id = $(element).attr("id") || "datePicker";
                $(element).attr("id", id + idIndex++);

                var options = allBindingsAccessor().datepickerOptions || {};
                var datepickerFormat = allBindingsAccessor().datepickerFormat || 'DD/MM/YYYY';
                var openObservable = allBindingsAccessor().datepickerOpen || undefined;
        
                $(element).datepicker(options);
        
                if(openObservable !== undefined) {
                    if(ko.isSubscribable(openObservable)) {
                        openObservable.subscribe(function(value) {
                            if(value) {
                                $(element).datepicker('show');
                            }
                            else {
                                $(element).datepicker('hide');
                            }
                        });
                        
                        $(element).datepicker('option', 'onClose', function() {
                            openObservable(false);
                        });
                    }
                }

                //handle the field changing
                ko.utils.registerEventHandler(element, "change", function () {
                    var observable = valueAccessor();
                    observable($(element).datepicker("getDate"));
                    $(element).datepicker("setDate", $(element).datepicker("getDate"));
                });

                //handle disposal (if KO removes by the template binding)
                ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
                    $(element).datepicker("destroy");
                });


            },
            update: function (element, valueAccessor) {
                var value = ko.utils.unwrapObservable(valueAccessor());

                //handle date data coming via json from Microsoft
                if (String(value).indexOf('/Date(') == 0) {
                    value = new Date(parseInt(value.replace(/\/Date\((.*?)\)\//gi, "$1")));
                }

                current = $(element).datepicker("getDate");

                if (value - current !== 0) {
                    $(element).datepicker("setDate", value);
                }
            }
        }

    })();

ko.bindingHandlers.button = {
    initIcon: function (options) {
        if (options.icon) {
            options.icons = { primary: options.icon };
        }

        if (options.faIcon)
        {
            options.iconClass = 'fa ' + options.faIcon;
        }

        if (options.text) {
            options.text = options.text;
        }
    },
    init: function (element, valueAccessor) {
        var options = ko.utils.unwrapObservable(ko.toJS(valueAccessor())) || {};
        ko.bindingHandlers.button.initIcon(options);
        ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
            $(element).button("destroy");
        });

        $(element).button(options);

        if(options.faIcon)
        {
            var iconHtml = '<i class="fa ' + options.faIcon + '"></i>';
            if(options.label) {
                iconHtml = '<span style="vertical-align:middle; margin-right:5px">' + options.label + '</span>' + iconHtml;
            }

            $(element).html(iconHtml);
            
            if(options.faSize)
            {
                $('i', $(element)).css('font-size', options.faSize);
            }
        }
    },
    update: function (element, valueAccessor) {
        var options = ko.toJS(valueAccessor());
        ko.bindingHandlers.button.initIcon(options);


        if (options) {
            $(element).button(options);
        }
        // Fix span problem.
        if (!options.faIcon)
        {
            $(element).html('<span class="ui-button-text">' + $(element).html() + '</span>');
        }
        else
        {
            var iconHtml = '<i class="fa ' + options.faIcon + '"></i>';
            if(options.label) {
                iconHtml = '<span style="margin-right:10px">' + options.label + '</span>' + iconHtml;
            }

            $(element).html(iconHtml);
            

            if (options.faSize) {
                $('i', $(element)).css('font-size', options.faSize);
                $('span', $(element)).css('line-height', options.faSize);
            }
        }
    }
};

ko.unapplyBindings = function ($node, remove) {
    // unbind events
    $node.find("*").each(function () {
        $(this).unbind();
    });

    // Remove KO subscriptions and references
    if (remove) {
        ko.removeNode($node[0]);
    } else {
        ko.cleanNode($node[0]);
    }
};

ko.bindingHandlers.spinner = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        //initialize datepicker with some optional options
        var options = allBindingsAccessor().spinnerOptions || {};
        $(element).spinner(options);

        //handle the field changing
        ko.utils.registerEventHandler(element, "spinchange", function () {
            var observable = valueAccessor();
            observable($(element).spinner("value"));
        });

        //handle disposal (if KO removes by the template binding)
        ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
            $(element).spinner("destroy");
        });

    },
    update: function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());

        current = $(element).spinner("value");
        if (value !== current) {
            $(element).spinner("value", value);
        }
    }
};

ko.bindingHandlers.select2 = {
    init: function(element, valueAccessor) {
        $(element).select2(valueAccessor());       
        

        if (valueAccessor().focus)
        {
            var focusUnwrapped = ko.unwrap(valueAccessor().focus);
            if(focusUnwrapped) $(element).select2('focus');
        }

        ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
            $(element).select2('destroy');
        });
    },
    update: function (element, valueAccessor, allAccessors) {
        var optionsValue = ko.unwrap(allAccessors().optionsValue);
        var options = ko.unwrap(allAccessors().options);
        var value = ko.unwrap(allAccessors().value);        
        var optionsColor = ko.unwrap(allAccessors().optionsColor);
        var optionsTextColor = ko.unwrap(allAccessors().optionsTextColor);
        var select2Element = $(element).prev('.select2-container'); 
                
        $(element).select2("val", value);

        if(optionsColor) {            
            var color = Utilities.findObjectByAttribute(options, value, optionsValue, optionsColor);
            $('a.select2-choice', select2Element).css({'background-color': color, 'background-image': 'none', 'box-shadow': 'none'});
        }  

        if(optionsTextColor) {            
            var textColor = Utilities.findObjectByAttribute(options, value, optionsValue, optionsTextColor);
            $('a.select2-choice', select2Element).css('color', textColor);
        }  


        if (valueAccessor().focus) {
            var focusUnwrapped = ko.unwrap(valueAccessor().focus);
            if (focusUnwrapped) $(element).select2('focus');
        }
    }
};

ko.bindingHandlers.watermark = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var allBindings = allBindingsAccessor();
        var text, options;
        var watermark = allBindings.watermark;

        if (typeof watermark == "string")
        { text = watermark; }
        else {
            text = watermark.text;
            options = watermark.options;
        }
        $(element).watermark(text, options);
    }
};

ko.bindingHandlers.timeAgo = {
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        $(element).text($.timeago(ko.unwrap(valueAccessor())));
    }
};

ko.bindingHandlers.tipsy = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {        
        // tipsy options 
        // delayIn: 0,      // delay before showing tooltip (ms)
        // delayOut: 0,     // delay before hiding tooltip (ms)
        // fade: false,     // fade tooltips in/out?
        // fallback: '',    // fallback text to use when no tooltip text
        // gravity: 'n',    // gravity
        // html: false,     // is tooltip content HTML?
        // live: false,     // use live event support?
        // offset: 0,       // pixel offset of tooltip from element
        // opacity: 0.8,    // opacity of tooltip
        // title: 'title',  // attribute/callback containing tooltip text
        // trigger: 'hover' // how tooltip is triggered - hover | focus | manual
        $(element).tipsy(allBindingsAccessor().tipsy);
    }
};

ko.bindingHandlers.menu = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var value = valueAccessor();
        var menu = ko.unwrap(value);
        var select = ko.unwrap(select);

        //console.log(menu.menus);
        var html = "<li class='actions'><ul>";
        menu.menus.forEach(
            function (element) {                
                var visible = ko.unwrap(element.visible != undefined ? element.visible : true);
                if (element.divider)
                {
                    html += "<li height:5px;><div style='margin:0 5px; border-bottom:1px solid #b1b0b0'></div></li>";
                }
                else if(visible)
                {     
                    if (element.type == "link") {
                        if (element.target) {
                            html += "<li><a data-bind=\"html: '" + element.text + "'\" href=\"" + element.url + "\" target=\"" + element.target + "\"></a></li>";
                        }
                        else {
                            html += "<li><a data-bind=\"html: '" + element.text + "'\" href=\"" + element.url + "\"></a></li>";
                        }
                    }
                    else {
                        html += "<li><a data-bind=\"html: '" + element.text + "', click:" + element.method + "\"></a></li>";
                    }
                }
            });

        html += "</ul></li>";

        $(element).html(html);
        $(element).menu({ position: { my: menu.position.my, at: menu.position.at } });
    }
};

ko.bindingHandlers.settingsMenu = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        $(element).settingsMenu();
    }
}

ko.bindingHandlers.fallback = {
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        $(element).css('visibility', 'visible');
    },
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var fallback = ko.unwrap(valueAccessor());

        $(element).on('error',function () {
            if (fallback == 'hide') {
                $(this).css('visibility', 'hidden');
            }
            else if(fallback == 'remove')
            {
                $(this).css('display', 'none');
            }
            else
            {
                $(this).attr('src', fallback);
            }
        });
    }
}

ko.bindingHandlers.numeric = {
    init: function (element) {
        $(element).on("keydown", function (event) {
            // Allow: backspace, delete, tab, escape, and enter
            if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
                // Allow: Ctrl+A
                (event.keyCode == 65 && event.ctrlKey === true) ||
                // Allow: . , et -
                (event.keyCode == 188 || event.keyCode == 190 || event.keyCode == 110 || event.keyCode == 109 || event.keyCode == 189) ||
                // Allow: home, end, left, right
                (event.keyCode >= 35 && event.keyCode <= 39)) {
                // let it happen, don't do anything
                return;
            }
            else {
                // Ensure that it is a number and stop the keypress
                if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                    event.preventDefault();
                }
            }
        });
    }    
};

ko.bindingHandlers.integer = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var allowNegative = allBindingsAccessor().allowNegative || false;

        $(element).on("keydown", function (event) {
            // Allow: backspace, delete, tab, escape, and enter
            if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
                // Allow: Ctrl+A
                (event.keyCode == 65 && event.ctrlKey === true) ||
                // Allow: - if negatives are allowed
                ((event.keyCode == 109 || event.keyCode == 189) && allowNegative) ||
                // Allow: home, end, left, right
                (event.keyCode >= 35 && event.keyCode <= 39)) {
                // let it happen, don't do anything
                return;
            }
            else {
                // Ensure that it is a number and stop the keypress
                if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                    event.preventDefault();
                }
            }
        });
    }
};
    
ko.bindingHandlers.integerMinMaxValue = {
    init: function (element) {
        $(element).on("keydown", function (event) {
            // Allow: backspace, delete, tab, escape, and enter
            if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
                // Allow: Ctrl+A
                (event.keyCode == 65 && event.ctrlKey === true) ||
                // Allow: home, end, left, right
                (event.keyCode >= 35 && event.keyCode <= 39)) {
                // let it happen, don't do anything
                return;
            }
            else {
                // Ensure that it is a number and stop the keypress
                if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                    event.preventDefault();
                }
            }
        });
    },
    update: function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        var maxValue = element.getAttribute("maxvalue");
        var minValue = element.getAttribute("minvalue");
        if (isNaN(value)) value = minValue;
        if (Number(value) > Number(maxValue)) value = maxValue;
        $(element).val(value);
    }
};

//!!!!! Put no id on dataTables in html when this handler is used with a data-bind="forEach:...  Or you'll get display problems !!!!!!
ko.bindingHandlers.datatable = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
        var allBindings = allBindingsAccessor();
        var options = ko.unwrap(allBindings.datatableOptions);

        $(element).dataTable(options);

        if (ko.isSubscribable(allBindings.datatableOptions)) {
            allBindings.datatableOptions.subscribe(function(value) {
                var data = $(element).dataTable().fnGetData();
                $(element).dataTable().fnDestroy();
                $(element).dataTable(value);
                $(element).dataTable().fnResetData(data);
            });
        }

    },

    update: function(element, valueAccessor, allBindingsAccessor, viewModel, context) {
        var data = ko.unwrap(valueAccessor());
        var allBindings = allBindingsAccessor();
        var options = ko.unwrap(allBindings.datatableOptions);

        var object = $(element).dataTable();
        object.fnResetData(data);
    }
};

ko.bindingHandlers.clockpicker = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel)
    {
        var defaults = { autoclose: true }
        var options = ko.utils.unwrapObservable(ko.toJS(valueAccessor())) || {};
        options = $.extend({}, defaults, options);

        $(element).clockpicker(options);
    }
}

ko.bindingHandlers.stopBinding = {
    init: function () {
        return { controlsDescendantBindings: true };
    }
};

//wrapper for a computed observable that can pause its subscriptions
ko.pauseableComputed = function (evaluatorFunction, evaluatorFunctionTarget) {
    var _cachedValue = "";
    var _isPaused = ko.observable(false);

    //the computed observable that we will return
    var result = ko.computed(function () {
        if (!_isPaused()) {
            //call the actual function that was passed in
            return evaluatorFunction.call(evaluatorFunctionTarget);
        }
        return _cachedValue;
    }, evaluatorFunctionTarget);

    //keep track of our current value and set the pause flag to release our actual subscriptions
    result.pause = function () {
        _cachedValue = this();
        _isPaused(true);
    }.bind(result);

    //clear the cached value and allow our computed observable to be re-evaluated
    result.resume = function () {
        _cachedValue = "";
        _isPaused(false);
    }

    return result;
};

ko.bindingHandlers.consoleLog = {
    update: function(element, valueAccessor, allBindingsAccessor, viewModel) {
        console.log(ko.unwrap(valueAccessor()));
    }
}

ko.bindingHandlers.ifvisible = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, context) {
        
        return ko.bindingHandlers.if.init(element, valueAccessor, allBindingsAccessor, viewModel, context);
    },
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, context){
        var show = ko.unwrap(valueAccessor());
        if(!show) {
            $(element).addClass('hidden');
        }
        else {
            $(element).removeClass('hidden');
        }

        ko.bindingHandlers.if.update(element, valueAccessor, allBindingsAccessor, viewModel, context);
    }
}

ko.bindingHandlers.dialog = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, context) 
    {
        var isOpen = allBindingsAccessor().isOpen;

        $(element).dialog(ko.unwrap(valueAccessor()));
        $(element).on( "dialogclose", function( event, ui ) {
            if(ko.isObservable(isOpen))
            {
                isOpen(false);       
            }
        });
        
        if(isOpen) 
        {
            $(element).dialog(ko.unwrap(isOpen) ? "open" : "close")
            if(ko.isSubscribable(isOpen)) 
            {
                isOpen.subscribe(function(value) 
                {
                    $(element).dialog(ko.unwrap(isOpen) ? "open" : "close");
                });
            }
        }
    }
}

ko.bindingHandlers.nestedSortable = (function() {
    var defaultOptions = {
                listType: 'ul',
                maxLevels: 7,
                placeholder: 'sortable-placeholder',
                errorClass: 'sortable-error',
                forcePlaceholderSize: true,
			    tolerance: 'intersect',
                items: 'li',
                excludeRoot: true,
                connectWith: '.sortable'
    };

    var ITEMKEY = "ko_sortItem",
        INDEXKEY = "ko_sourceIndex",
        LISTKEY = "ko_sortList",
        PARENTKEY = "ko_parentList",
        DRAGKEY = "ko_dragItem",
        unwrap = ko.utils.unwrapObservable,
        dataGet = ko.utils.domData.get,
        dataSet = ko.utils.domData.set;
    
    function prepareTemplateOptions(valueAccessor, items)
    {
        var templateOptions = {},
            options = unwrap(valueAccessor()) || {},
            actualAfterRender;
        
        templateOptions.foreach = options.data || [];
        templateOptions.name = options.template;
        
        ko.utils.arrayForEach(["afterAdd", "afterRender", "as", "beforeRemove", "includeDestroyed", "templateEngine", "templateOptions", "nodes"], 
            function (option) {
                if (options.hasOwnProperty(option)) {
                    templateOptions[option] = options[option];
            }
        });

        if (templateOptions.afterRender) {
            actualAfterRender = templateOptions.afterRender;
            templateOptions.afterRender = function(element, data) {
                addMetaDataAfterRender.call(data, element, data);
                actualAfterRender.call(data, element, data);
            };
        } else {
            templateOptions.afterRender = addMetaData;
        }

        return templateOptions;
    }

    function addMetaData(elements, data) {    
        //console.log(elements);
        ko.utils.arrayForEach(elements, function(element) {
            if (element.nodeType === 1) {
                dataSet(element, ITEMKEY, data);
                dataSet(element, PARENTKEY, dataGet(element.parentNode.parentNode, ITEMKEY));
                if(data.Children().length > 0)
                {                       
                    addMetaDataToChildren($(element).children('ul').children('li'), data.Children, data);
                }
            }
        });
    }

    function addMetaDataToChildren(domChildren, dataChildren, dataParent)
    {
       dataChildren = unwrap(dataChildren);
       domChildren.each(function(i, element) {
            dataSet(element, ITEMKEY, dataChildren[i]);
            dataSet(element, PARENTKEY, dataParent);

            if(dataChildren[i].Children().length > 0)
            {                       
                addMetaDataToChildren($(element).children('ul').children('li'), dataChildren[i].Children, dataChildren[i]);
            }
        });
    }

    return {
        init: function(element, valueAccessor, allBindingsAccessor, viewModel, context)
        {
            var array = valueAccessor().data;            
            var sortableOptions = allBindingsAccessor().sortableOptions || {};
            var options = $.extend(defaultOptions, ko.unwrap(sortableOptions));
            
            var templateOptions = prepareTemplateOptions(valueAccessor);

            ko.bindingHandlers.template.init(element, function() { return templateOptions; }, allBindingsAccessor, data, context);

            var createTimeout = setTimeout(function() {
                options.start = function(event, object) {
                    var el = object.item[0];
                    dataSet(el, INDEXKEY, ko.utils.arrayIndexOf(object.item.parent().children(), el));
                }

                var actualRelocate = options.relocate;
                options.relocate = function(event, object) {
                    setTimeout(function() {                        
                        var sourceArray, targetArray;                   
                        var el = dataGet(object.item[0], ITEMKEY);
                        var sourceParent = dataGet(object.item[0], PARENTKEY);     
                        var sourceIndex = dataGet(object.item[0], INDEXKEY);           
                        var targetParent;
                        var targetIndex = ko.utils.arrayIndexOf(object.item.parent().children(), object.item[0]);
                    
                        if(object.item.parents(options.items).length > 0) {                    
                            targetParent = dataGet(object.item.parents(options.items)[0], ITEMKEY);
                        }
                                                
                        $(element).nestedSortable('cancel');

                        if (targetIndex >= 0) {
                            if (sourceParent) {
                                sourceArray = sourceParent.Children;
                            }
                            else {
                                sourceArray = array;
                            }
                        
                            sourceArray().splice(sourceIndex, 1);

                            if(targetParent) {                        
                                targetArray = targetParent.Children;
                            }
                            else {
                                targetArray = array;
                            }

                            targetArray().splice(targetIndex, 0, el);
                        }

                        dataSet(object.item[0], INDEXKEY, null);
                                                    
                        var arrayCopy = array();
                        $(element).html('');
                        array([]);
                        array(arrayCopy);

                        if(actualRelocate) {
                            var event = {}
                            event.targetParent = targetParent;
                            event.targetIndex = targetIndex;
                            event.element = el;
                            event.sourceParent = sourceParent;
                            event.sourceIndex = sourceIndex;
                            actualRelocate(event);
                        }
                    }, 0);
                }
                
                $(element).nestedSortable(options);
            }, 0);

            return { controlsDescendantBindings: true };
        },
        update: function(element, valueAccessor, allBindingsAccessor, viewModel, context)
        {               
            var templateOptions = prepareTemplateOptions(valueAccessor);
            ko.bindingHandlers.template.update(element, function() { return templateOptions; }, allBindingsAccessor, data, context);
        }
    }
})();

ko.bindingHandlers.spectrum = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, context)
    {
        var color = valueAccessor();
        var options = allBindingsAccessor().spectrumOptions || {};
        var changeColor = function(newColor) {
            if(ko.isObservable(color)) {
                color(newColor)
            }
            else {
                color = newColor;
            }
        }

        options.color = ko.unwrap(valueAccessor());
    
        if(options.valueUpdate != 'onchange') {
            options.move = options.onChange || changeColor;
        }
        
        options.change = options.onChange || changeColor;

        if(ko.isSubscribable(color)) {
            color.subscribe(function(value) {
                $(element).spectrum('set', value);
            });
        }            

        $(element).spectrum(options);
    }
}

ko.bindingHandlers.toggle = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, context) {
        var value = valueAccessor();
        $(element).on('click', function() {
            if(ko.isObservable(value)) {
                value(!value());
            }
            else {
                value = !value;
            }
        });
    }
}

ko.bindingHandlers.truncate = { 
    init: function(element, valueAccessor, allBindingsAccessor) {
        $(window).resize(function() {
            $(element).text($(element).data("fulltext"));
            $(element).truncate({ multiline: true });
        });

        $(element).on("update.trunc", function() {
            $(element).text($(element).data("fulltext"));
            $(element).truncate({ multiline: true });
        });
    },
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, context) {   
        $(element).data('fulltext', ko.unwrap(valueAccessor()));
        $(element).text($(element).data("fulltext"));
        $(element).truncate({ multiline: true })
    }
}

ko.bindingHandlers.draggable = {
    init: function(element, valueAccessor) {
        $(element).draggable(ko.unwrap(valueAccessor()));
    }
}

ko.bindingHandlers.sortable = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, context) {
        var sortableOptions = $.extend({}, ko.unwrap(valueAccessor()));
        var sortableItems = allBindingsAccessor().sortableItems || null;

        if(sortableItems != null)
            ko.bindingHandlers.foreach.init(element, sortableItems, allBindingsAccessor, viewModel, context);
        
        var actualUpdate = null;
        
        if(sortableOptions.update) {
            actualUpdate = sortableOptions.update;
            sortableOptions.update = undefined;
        }

        $(element).sortable(sortableOptions);


        if(sortableItems != null) {
            var startIndex = -1;
            $(element).on('sortstart', function(event, ui) {
                startIndex = ui.item.index();
            });
            $(element).on('sortupdate', function(event, ui) {
                
                var elements = sortableItems();
                var updatedIndex = ui.item.index();

                var item = elements.splice(startIndex, 1);
                elements.splice(updatedIndex, 0, item[0]);
                sortableItems.valueHasMutated();

                if(actualUpdate)
                    actualUpdate.call(context["$data"], item[0], event, ui);
            });
        }        
        
        return { controlsDescendantBindings: true };
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel, context) {
        var sortableItems = allBindingsAccessor().sortableItems || null;

        if(sortableItems != null)
            ko.bindingHandlers.foreach.update(element, sortableItems, allBindingsAccessor, viewModel, context);

        return { controlsDescendantBindings: true };
    }
}

ko.bindingHandlers.resizable = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, context) {
        if(ko.unwrap(valueAccessor())) {
            var resizableOptions = $.extend({}, ko.unwrap(valueAccessor()));
        
            if(resizableOptions.containment) {
                resizableOptions.containment = $(element).closest(resizableOptions.containment);
            }

            if(resizableOptions.resize) {
                var actualResize = resizableOptions.resize;
                resizableOptions.resize = function(event, ui) {
                    actualResize.call(context["$data"], context["$data"], event, ui);
                };
            }

            $(element).resizable(resizableOptions);
        }
    }
}


ko.bindingHandlers.dropzone = {
    init: function (element, valueAccessor) {
        var value = ko.unwrap(valueAccessor());
        if (value.bottom)
            $(element).css("bottom", value.bottom + "px");

        if (value.width)
            $(element).css("width", value.width + "px");

        $(element).dropzone(value);
    }
};

ko.bindingHandlers.popover = {
    init: function (element, valueAccessor) {
        var value = ko.unwrap(valueAccessor());

        $(element).popover({ content: value });
    }
};

var idSuffix = 0;
ko.bindingHandlers.ad = {
    init: function (element, valueAccessor, allBindingAccessor, viewModel, context) {
        var adId = ko.unwrap(valueAccessor()) || null;
        var adType = ko.unwrap(allBindingAccessor().adType) || null;
        var solutionId = ko.unwrap(allBindingAccessor().solutionId) || null;
        var width = ko.unwrap(allBindingAccessor().width) || null;
        var height = ko.unwrap(allBindingAccessor().height) || null;
        var backgroundColor = ko.unwrap(allBindingAccessor().backgroundColor) || null;
        var visible = ko.unwrap(allBindingAccessor().visible) || null;
        var mediaType = ko.unwrap(allBindingAccessor().mediaType) || null;
        var scheduleList = ko.unwrap(allBindingAccessor().scheduleList) || null;
        var culture = ko.unwrap(allBindingAccessor().culture) || null;
        var external = ko.unwrap(allBindingAccessor().external) || false;
        var validateSponsorThisGame = ko.unwrap(allBindingAccessor().validateSponsorThisGame) || false;

        if (window.ads_api) {
            if (external) {             
                ads_api.createExternal(adId, idSuffix, solutionId, width, height, validateSponsorThisGame, culture).then(function (ad) {   
                    if (ad) { 
                        element.appendChild(ad);
                    }
                });

                var suffix = idSuffix;
                ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
                    ads_api.destroyExternal(adId + '-' + suffix);
                });

                idSuffix++;
            }
            else {
                element.appendChild(ads_api.create(adId, adType, solutionId, width, height, backgroundColor, visible, mediaType, scheduleList, culture));
            }
        }        
    }
};

ko.bindingHandlers.timeoutIf = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, context) {
        var delay = ko.unwrap(valueAccessor()) || null;        
        var observable = ko.observable(false);
                
        var timeout = setTimeout(function () {
            observable(true);
        }, delay);

        ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
            clearTimeout(timeout);
        });

        ko.bindingHandlers.if.init(element, observable, allBindingsAccessor, viewModel, context);

        ko.computed({
            read: function () {                
                return ko.bindingHandlers.if.update(element, observable, allBindingsAccessor, viewModel, context);
            }
        });
        
        return { 'controlsDescendantBindings': true };
    }
};

ko.bindingHandlers.blockFeature = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, context) {
        var name = ko.unwrap(valueAccessor());

        $(element).block({ message: '<span>' + language.global.premiumFeature + '<\span>' });

        solution.getFeature(solutionId, name).then(function (feature) {
            if (feature) {
                $(element).unblock();
            }
            else {
                $(element).addClass('blocked-feature');
                $(element).on('click', function () {
                    window.open('https://www.kreezee.com/sport/organization/kreezee-sports-premiums/11966/premiums');
                });
            }
        });
    }
}

ko.bindingHandlers.tags = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, context) {
        $(element).click(function () {
            $('input', $(element)).focus();
        });        
    }
}

ko.bindingHandlers.mask = (function () {
    var maskSet = false; 

    function setMask(element, pattern, uppercase) {
        if (!pattern) {
            $(element).unmask();
            return false;
        }
        else {
            $(element).mask(pattern, {                
                onChange: function (value, event) {
                    if (uppercase)
                        event.currentTarget.value = value.toUpperCase();
                }
            });
            return true;
        }
    }

    return {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel, context) {
            var pattern = ko.unwrap(valueAccessor());
            var value = allBindingsAccessor().value;
            var uppercase = allBindingsAccessor().uppercase || false;

            maskSet = setMask(element, pattern, uppercase);

            if (maskSet && value()) {
                var maskedValue = $(element).masked(value());

                if (uppercase) {
                    maskedValue = maskedValue.toUpperCase();
                }

                value(maskedValue);
            }

        },
        update: function (element, valueAccessor, allBindingsAccessor, viewModel, context) {
            var pattern = ko.unwrap(valueAccessor());
            var value = allBindingsAccessor().value;
            var uppercase = allBindingsAccessor().uppercase || false;     

            maskSet = setMask(element, pattern, uppercase);     

            if (maskSet && value() && uppercase) {
                var maskedValue = $(element).masked(value()).toUpperCase();

                value(maskedValue);
                $(element).val(maskedValue);
            }
        }
    }
})();;
ko.validation.rules['postal_code'] = {
    validator: function (val, countryId) {
        if(val == '' || val == null || val == undefined) {
            return true;
        }

        switch(countryId())//switch sur le id du pays
        {
            case 1://CANADA
                var patt = new RegExp("^([ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJKLMNPRSTVWXYZ])\\ {0,1}(\\d[ABCEGHJKLMNPRSTVWXYZ]\\d)$");
                return patt.test(val);
                break;
            case 2://UNITED-STATES
                var patt = new RegExp("^\\d{5}([\\-]?\\d{4})?$");
                return patt.test(val);
                break;
            default://NONE SELECTED
                return true;
                break;
                //Autre regEx       !!!!Note!!!! (Dans les regEx, pour echaper un caractère, il faut mettre "\\" et non "\" {à changer}) !!!!
                /*"US" => "^\d{5}([\-]?\d{4})?$",
                  "UK" => "^(GIR|[A-Z]\d[A-Z\d]??|[A-Z]{2}\d[A-Z\d]??)[ ]??(\d[A-Z]{2})$"  ,
                  "DE" => "\b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b"  ,
                  "CA" => "^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$"  ,
                  "FR" => "^(F-)?((2[A|B])|[0-9]{2})[0-9]{3}$"  ,
                  "IT" => "^(V-|I-)?[0-9]{5}$"  ,
                  "AU" => "^(0[289][0-9]{2})|([1345689][0-9]{3})|(2[0-8][0-9]{2})|(290[0-9])|(291[0-4])|(7[0-4][0-9]{2})|(7[8-9][0-9]{2})$"  ,
                  "NL" => "^[1-9][0-9]{3}\s?([a-zA-Z]{2})?$"  ,
                  "ES" => "^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$"  ,
                  "DK" => "^([D-d][K-k])?( |-)?[1-9]{1}[0-9]{3}$"  ,
                  "SE" => "^(s-|S-){0,1}[0-9]{3}\s?[0-9]{2}$"  ,
                  "BE" => "^[1-9]{1}[0-9]{3}$"  */
        }
    },
    message: 'CountryId error'
};

// Is valid if the number isNaN or if the number is greater or equal to test variable
ko.validation.rules['is_higher_than'] = {
    validator: function (val, observableMin) {
        var observableVal = ko.unwrap(observableMin);
        if (val != undefined && observableVal != undefined)
        {
            return val >= observableVal;
        }
        return true;
    },
    message: 'Must be higher than min',
};

ko.validation.rules['is_lower_than'] = {
    validator: function (val, observableMax) {
        var observableVal = ko.unwrap(observableMax);
        if (val != undefined && observableVal != undefined)
        {
            return val <= observableVal;
        }
        return true;
    },
    message: 'Must be lower than max'
};

ko.validation.rules['basic_phone'] = {
    validator: function (val) {
        var patt = new RegExp("^[0-9\\(\\)\\-\\#\\ ]*$");
        return patt.test(val);
    },
    message: 'Valide phone number'
};



//Passer un array[3] en params avec {year: month: day:} !!!!!!
ko.validation.rules['validate_group_date'] = {
    validator: function (val, dates) {
        if ((dates.year() && dates.month() && dates.day()) || (!dates.year() && !dates.month() && !dates.day()))
        {
            return true;
        }
        else
        {
            if( !val )
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    },
    message: 'validate groupdate. return true if all selected or non selected'
};

ko.validation.rules['validate_group_date_moment'] = {
    validator: function (val, dates) {
        var momentDate = moment({ y: dates.year(), M: dates.month(), d: dates.day() });
        if (momentDate.isValid()) {
            return true;
        }
        else {
            if (!val) {
                return false;
            }
            else {
                return true;
            }
        }
    },
    message: 'validate groupdate. return true if all selected or non selected'
};

//Passer un array[6] en params avec {year: month: day:} !!!!!!
ko.validation.rules['group_date_is_after'] = {
    validator: function (val, dates) {

        var oldDate = new Date(dates.olderYear(), dates.olderMonth(), dates.olderDay());
        var newerDate = new Date(dates.newerYear(), dates.newerMonth(), dates.newerDay());

        if ( dates.olderYear() && dates.olderMonth() && dates.olderDay() 
            && dates.newerYear() && dates.newerMonth() && dates.newerDay())
        {
            return oldDate.getTime() < newerDate.getTime();
        }

        return true;
    },
    message: 'Return true if newer date is after olderDate'
};

ko.validation.rules['areSame'] = {
    getValue: function (o) {
        return (typeof o === 'function' ? o() : o);
    },
    validator: function (val, otherField) {
        return val === this.getValue(otherField);
    },
    message: 'The fields must have the same value'
};

ko.validation.rules['verifyEmail'] = {
    async: true,
    validator: function (val, params, callback) {
        if (val === '')
        {
            callback(true);
            return;
        }

        email.verify(val).then(function (result) { callback(result.IsValid) });
    },
    message: language.validation.verifyEmail
};

ko.validation.rules['url'] = {
    validator: function (val) {
        if (!val) {
            return true;
        }

        val = val.replace(/^\s+|\s+$/, ''); //Strip whitespace
        //Regex by Diego Perini from: http://mathiasbynens.be/demo/url-regex
        return val.match(/^(?:(?:https?):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.‌​\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[‌​6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1‌​,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00‌​a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u‌​00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/i);
    },
    message: language.validation.invalidUrl
};

ko.validation.registerExtenders();;
var viewstate = {
    get: function (key) {
        return amplify.store.sessionStorage && (amplify.store.sessionStorage(key) !== undefined) ? JSON.parse(amplify.store.sessionStorage(key)) : undefined;
    },
    save: function (key, value, options) {
        if(amplify.store.sessionStorage)
            amplify.store.sessionStorage(key, JSON.stringify(value), options);
    },
    delete: function (key) {
        if(amplify.store.sessionStorage) 
            amplify.store.sessionStorage(key, null);
    }
};;
var dataMapping = {
    hockeyGoalQualifier: {
        event: { id: 161, name: 'Event' },
        advantage: { id: 162, name: 'Advantage' },
        disadvantage: { id: 163, name: 'Disadvantage' },
        emptyNet: { id: 259, name: 'EmptyNet' }
    },

    document: {
        visibility: {
            'private': '1',
            'public': '4'
        }
    },

    video: {
        status: {
            pending: 1,
            processing: 2,
            ready: 3
        },
        visibility: {
            'private': '1',
            'public': '4'
        }
    },

    news: {
        visibility: {
            'private': '1',
            'public': '4'
        }
    },

    getStandingsType: function (value) {
        switch (value) {
            case 1:
                return language.standingsType.points;
            case 2:
                return language.standingsType.pointsPercentage;
            case 3:
                return language.standingsType.winningPercentage;
            case 4:
                return language.standingsType.differential;
            case 5:
                return language.standingsType.noStandings;
            default:
                return undefined;
        }
    },
    getOrdinalSuffix: function(value){
        var format = value.toString();
        format = format.slice(-1);
        switch (format) {
            case '1':
                return language.ordinalSuffix.case1;
            case '2':
                return language.ordinalSuffix.case2;
            case '3':
                return language.ordinalSuffix.case3;
            default:
                return language.ordinalSuffix.caseBase;
        }
    },
    getNumericAdvantageAbbById: function(value){
        switch(value)
        {
            case 1:
                return language.matchScoreboard.tabStats.numericAvantageType[0].Abb;
            case 2:
                return language.matchScoreboard.tabStats.numericAvantageType[1].Abb;
            case 3:
                return language.matchScoreboard.tabStats.numericAvantageType[2].Abb;
        }
    },
    getRuleText: function (value, type) {
        switch (value) {
            case 1:
                return language.season.tabStandings.rules.rule1;
            case 2:
                return language.season.tabStandings.rules.rule2;
            case 3:
                return language.season.tabStandings.rules.rule3;
            case 4:
                switch (type) {
                    case 1:
                        return language.season.tabStandings.rules.rule4.pointsRule;
                    case 2:
                        return language.season.tabStandings.rules.rule4.pointsPercentageRule;
                    case 3:
                        return language.season.tabStandings.rules.rule4.winPercentageRule;
                    case 4:
                        return language.season.tabStandings.rules.rule4.differentialRule;
                    default:
                        return undefined;
                    }; 
            case 5:
                return language.season.tabStandings.rules.rule5;
            case 6:
                return language.season.tabStandings.rules.rule6;
            case 7:
                return language.season.tabStandings.rules.rule7;
            case 8:
                return language.season.tabStandings.rules.rule8;
            case 9:
                return language.season.tabStandings.rules.rule9;
            case 10:
                return language.season.tabStandings.rules.rule10;
            case 11:
                return language.season.tabStandings.rules.rule11;
            case 12:
                return language.season.tabStandings.rules.rule12;
            case 13:
                return language.season.tabStandings.rules.rule13;
            case 14:
                return language.season.tabStandings.rules.rule14;
            case 15:
                return language.season.tabStandings.rules.rule15;
            case 16:
                return language.season.tabStandings.rules.rule16;
            default:
                return undefined;
        }
    },

    getStandingsTitle: function (value) {
        switch (value) {
            case 1:
                return language.season.tabStandings.titles.points;
            case 2:
                return language.season.tabStandings.titles.pointsPercentage;
            case 3:
                return language.season.tabStandings.titles.winPercentage;
            case 4:
                return language.season.tabStandings.titles.differential;
            case 5:
                return language.season.tabStandings.titles.noStandings;
            default:
                return undefined;
        }
    },

    getSport: function (value) {
        switch (value) {
            case language.sportList.hockey.id:
                return language.sportList.hockey;
            case language.sportList.baseball.id:
                return language.sportList.baseball;
            case language.sportList.football.id:
                return language.sportList.football;
            case language.sportList.basketball.id:
                return language.sportList.basketball;
            case language.sportList.badminton.id:
                return language.sportList.badminton;
            case language.sportList.soccer.id:
                return language.sportList.soccer;
            case language.sportList.volleyball.id:
                return language.sportList.volleyball;
            case language.sportList.tennis.id:
                return language.sportList.tennis;
            case language.sportList.golf.id:
                return language.sportList.golf;
            case language.sportList.other.id:
                return language.sportList.other;
            case language.sportList.dekhockey.id:
                return language.sportList.dekhockey;
            case language.sportList.rugby.id:
                return language.sportList.rugby;
            case language.sportList.ultimate.id:
                return language.sportList.ultimate;
            case language.sportList.handball.id:
                return language.sportList.handball;
            case language.sportList.ringette.id:
                return language.sportList.ringette;
            default:
                return undefined;
        }
    },

    getSportConfig: function (value) {
        switch (value) {
            case language.sportConfig.hockey.id:
                return language.sportConfig.hockey;
            case language.sportConfig.baseball.id:
                return language.sportConfig.baseball;
            case language.sportConfig.football.id:
                return language.sportConfig.football;
            case language.sportConfig.basketball.id:
                return language.sportConfig.basketball;
            case language.sportConfig.badminton.id:
                return language.sportConfig.badminton;
            case language.sportConfig.soccer.id:
                return language.sportConfig.soccer;
            case language.sportConfig.volleyball.id:
                return language.sportConfig.volleyball;
            case language.sportConfig.tennis.id:
                return language.sportConfig.tennis;
            case language.sportConfig.golf.id:
                return language.sportConfig.golf;
            case language.sportConfig.other.id:
                return language.sportConfig.other;
            case language.sportConfig.dekhockey.id:
                return language.sportConfig.dekhockey;
            case language.sportConfig.rugby.id:
                return language.sportConfig.rugby;
            case language.sportConfig.ultimate.id:
                return language.sportConfig.ultimate;
            case language.sportConfig.handball.id:
                return language.sportConfig.handball;
            case language.sportConfig.ringette.id:
                return language.sportConfig.ringette;
            default:
                return undefined;
        }
    },

    getSolution: function (value) {
        switch (value) {
            case 1:
                return language.solution.league;
            case 2:
                return language.solution.tournament;
            case 4:
                return language.solution.event;
            case 6:
                return language.solution.team;
            case 7:
                return language.solution.sportcenter;
            case 9:
                return language.solution.organization;
            default:
                return undefined;
        }
    },

    getSeasonType: function (value) {
        switch (value) {
            case 1:
                return language.seasonType.regular;
            case 2:
                return language.seasonType.playoff;
            case 3:
                return language.seasonType.preseason;
            case 6:
                return language.seasonType.singleElimination;
            case 7:
                return language.seasonType.roundRobinSingleElimination;
            case 8:
                return language.seasonType.playoffsRounds;
            default:
                return undefined;
        }
    },  

    getUserStatus: function (value) {
        switch (value) {
            case language.userStatus.online.id:
                return language.userStatus.online.name;
            case language.userStatus.offline.id:
                return language.userStatus.offline.name;
            case language.userStatus.passwordRecovery.id:
                return language.userStatus.passwordRecovery.name;
            case language.userStatus.pending.id:
                return language.userStatus.pending.name;
            case language.userStatus.activate.id:
                return language.userStatus.activate.name;
            default:
                return undefined;
        }
    },

    getPlayerPosition: function (value) {
        var position = null;

        _.forOwn(language.sportUserPosition[sportId], function(_position) {
            if(_position.id == value) 
                position = _position;
        })
        
        if(position)
            return position;
                
        return language.sportUserPosition[sportId].undefined;
    },

    getStarImage: function (value) {
        switch (value) {
            case 1:
                return '//cache.kreezee.com/images/icon-first-star-48px.png';
            case 2:
                return '//cache.kreezee.com/images/icon-second-star-48px.png';
            case 3:
                return '//cache.kreezee.com/images/icon-third-star-48px.png';
        }
    },

    getRequestText: function(value) {
        switch (parseInt(value)) {
            case 1: 
                return language.messages.tabRequests.type.connexion;
                break;
            case 2:
                return language.messages.tabRequests.type.solutionAdmin;
                break;
            case 3:
                return language.messages.tabRequests.type.teamManagerAdmin;
                break;
            case 5:
                return language.messages.tabRequests.type.playerInvited;
                break;
            case 7:
                return language.messages.tabRequests.type.staffInvited;
                break;
            case 9:
                return language.messages.tabRequests.type.supervisorInvited;
                break
            case 11:
                return language.messages.tabRequests.type.teamManagerInvited;
            default:
                return "";
        }
    },

    getRound: function(value, length) {
        switch(parseInt(value))
        {
            case 1: 
                return language.playoffRounds.final.Name;
            case 2:
                return language.playoffRounds.semiFinal.Name;
            case 3:
                return language.playoffRounds.quarter.Name;
            default: 
                return 'Ronde ' + ((length - value) + 1);

        }
    },

    getUrlPrefix: function(solutionType) {
        var prefix
        switch (solutionType) {
            case language.solutionList.portal.id: 
                prefix = language.urlRewrite.prefixPortal;
                break;
            case language.solutionList.league.id:
                prefix = language.urlRewrite.prefixLeague;
                break;
            case language.solutionList.association.id:
                prefix = language.urlRewrite.prefixAssociation;
                break;
            default:
                prefix = language.urlRewrite.prefixLeague;
        }

        return prefix
    },

    getMatchTypeImage: function(typeId) {
        switch(typeId) {
            case 2: 
                return 'icon-strategy';
            case 3: 
                return 'icon-barbell';
            case 4:
                return 'icon-star2';
            case 5: 
                return 'icon-olympic-medal';
            case 6:
                return 'icon-trophy';
            default: 
                return '';
        }
    },

    getEventTypeImage: function(typeId) {
        switch(typeId) {
            case 8:
                return 'icon-strategy';
            case 7:
                return 'icon-barbell';
            case 9:
                return 'icon-user';
            case 10:
                return 'icon-clipboard';
            case 11:
                return 'icon-open-book';
            case 12:
                return 'icon-emoji-happy';
            case 13:
                return 'icon-stopwatch';
            case 14:
                return 'icon-trophy';
            case 15:
                return 'icon-dots-three-horizontal';
            default:
                return '';
        }
    }
}
;
logger.disableLogger();

var config = {
    setting: {
        urlV2: 'http://www.kreezee.com/v2',
        urlMobile: 'https://m.kreezee.com',
        urlCache: 'https://cache.kreezee.com/',
        urlAds: 'https://ads.kreezee.com',
        urlHelp: 'https://help.kreezee.com',
        urlRestApi: 'https://api.kreezee.com',
        twitterWidgetId: '668811104622149636',
        v2Active: false
    },
    webService: {
        wsAccounAdministrator: '/ws/AccountAdministrator.asmx/',
        wsAuthentication: '/ws/Authentication.asmx/',
        wsFeedback: '/ws/Feedback.asmx/',
        wsSearch: '/ws/Search.asmx/',
        wsUserSuscribe: '/ws/UserSuscribe.asmx/',
        wsCustomPage: '/ws/CustomPage.asmx/',
        wsUser: '/ws/User.asmx/',
        wsLeague: '/ws/League.asmx/',
        wsSeason: '/ws/Season.asmx/',
        wsDivision: '/ws/Division.asmx/',
        wsImportData: '/ws/ImportData.asmx/',
        wsTeam: '/ws/Team.asmx/',
        wsPlayer: '/ws/Player.asmx/',
        wsContact: '/ws/Contact.asmx/',
        wsStaff: '/ws/Staff.asmx/',
        wsSuspension: '/ws/Suspension.asmx/',
        wsCalendar: '/ws/Calendar.asmx/',
        wsMatch: '/ws/Match.asmx/',
        wsEvent: '/ws/Event.asmx/',
        wsAddress: '/ws/Address.asmx/',
        wsPhone: '/ws/Phone.asmx/',
        wsEmail: '/ws/Email.asmx/',
        wsMail: '/ws/Mail.asmx/',
        wsSportCenter: '/ws/SportCenter.asmx/',
        wsSolution: '/ws/Solution.asmx/',
        wsAccountNews: '/ws/AccountNews.asmx/',
        wsAccountMessage: '/ws/Message.asmx/',
        wsAccountRequest: '/ws/Request.asmx/',
        wsPost: '/ws/Post.asmx/',
        wsComment: '/ws/Comment.asmx/',
        wsLike: '/ws/Like.asmx/',
        wsFeature: '/ws/Feature.asmx/',
        wsAdminSport: '/ws/AdminSport.asmx/',
        wsAdminCountry: '/ws/AdminCountry.asmx/',
        wsAdminService: '/ws/AdminService.asmx/',
        wsConnection: '/ws/Connection.asmx/',
        wsStats: '/ws/Stats.asmx/',
        wsGroup: '/ws/Group.asmx/',
        wsPhoto: '/ws/Photo.asmx/',
        wsAlbum: '/ws/Album.asmx/',
        wsVideo: '/ws/Video.asmx/',
        wsDocument: '/ws/Medias/Document.asmx/',
        wsNews: '/ws/Medias/News.asmx/',
        wsRequest: '/ws/Request.asmx/',
        wsAds: '/ws/Ads.asmx/',
        wsStripeConnect: '/ws/Payment/Stripe/Connect.asmx/',
    }
};
;
