var p
try {
    p = parent.Profile
}
catch(e) { }

var Profile = p || new function() {
    var _self = this;
    var jQueryIsInit = typeof jQuery == 'function';

    var _sessionID = 0;

    var _params = {
        'ajaxUrl': '',
        'apiServerUrl': '',
        'apiSessionToken': '',
        'apiCheckGlobalSessionUrl': "/api/auth/check-global-session/token/",
        'apiLogOutUrl': "/api/auth/logout/token/",
        'apiLogInUrl': "/api/auth/login/token/",
        'apiNoContent': "/no-content/clear/",
        'cookieSip': '',
        'lastUserName': '',
        'lastProfileUpdate': '',
        'cookieLastProfileUpdate': '',
        'intervalSession': null,
        'domain': ''
    };

    var _selector = {
        'connectorGlobal': '#global_connector',
        'loginButton': '#login_form .main_button',
        'logoutButton': '.profile_logout',
        'profile': '#profile_params'
    };

    this.getApiNoContent = function() {
        return _params.apiServerUrl + _params.apiNoContent;
    };

    this.game = [];
    this.logined = false;

    (function constructor() {
        if (!jQueryIsInit) {
            throw 'jQuery is not defined';
        }
        $(_selector.loginButton).live('click', function() {
            _self.loggedIn();
            return false;
        });
        $(_selector.logoutButton).live('click', function() {
            _self.loggedOut();
            return false;
        });
        $(function() {
            _sessionID = _self.getSipFromCookie();
            if (_sessionID == "-1")
            {
              _self.checkGlobalSession();
            }
            //_self.updateProfileForAllWindows();
            
            _params.lastProfileUpdate = _self.getLastProfileUpdateFromCookie();
            _self.logined = _sessionID == "-1" ? false : true;

            _self.setSessionInterval();
        });
    })();

    this.setSessionInterval = function() {
        _self.clearSessionInterval();
        _params.intervalSession = setInterval(_self.checkSessionID, 1000);
    };

    this.clearSessionInterval = function() {
        clearInterval(_params.intervalSession);
    };

    this.setApiSessionToken = function(token) {
        _params.apiSessionToken = token;
    };

    this.setDomainName = function(domain) {
        _params.domain = domain;
    };

    this.getDomainName = function() {
        return _params.domain;
    };

    this.setApiServerUrl = function(url) {
        _params.apiServerUrl = url;
    };

    this.getApiServerUrl = function() {
        return _params.apiServerUrl;
    };

    this.setCookieSip = function(cookieName) {
        _params.cookieSip = cookieName;
    };

    this.setLastUserName = function(name) {
        _params.lastUserName = name;
    };

    this.setCookieLastProfileUpdate = function(name) {
        _params.cookieLastProfileUpdate = name;
    };

    this.loggedIn = function() {
        _self.clearSessionInterval();
        sendRequest('user_login', {});
    };

    this.logInResponse = function(callback) {
        var callback = callback || function(){};
        $(_selector.connectorGlobal).attr("src", _params.apiServerUrl + _params.apiLogInUrl + _params.apiSessionToken);
        $(_selector.connectorGlobal).load(function() {
            _self.setSessionInterval();
            callback();
        });
    };

    this.loggedOut = function() {
        _self.clearSessionInterval();
        sendRequest('user_logout', {});
    };

    this.logOutResponse = function() {
        $(_selector.connectorGlobal).attr("src", _params.apiServerUrl + _params.apiLogOutUrl + _params.apiSessionToken);
        $(_selector.connectorGlobal).load(function() {
            _self.setSessionInterval();
        });
    };

    this.updateProfile = function() {
        _self.clearSessionInterval();
        sendRequest('update_profile', {});
    };

    this.updateResponse = function() {
        _self.setSessionInterval();
    };

    this.checkGlobalSession = function() {
        $(_selector.connectorGlobal).attr("src", _params.apiServerUrl + _params.apiCheckGlobalSessionUrl + _params.apiSessionToken);
    };

    this.getSipFromCookie = function() {
        return _self.getCookie(_params.cookieSip);
    };

    this.getSessionFromCookie = function() {
        return _self.getCookie(_params.cookieSip);
    };

    this.getCookie = function(name) {
        var cookieValue = jQuery.cookie(name);
        return cookieValue == null ? "-1" : cookieValue;
    };

    this.setCookie = function(name, value) {
        var exdate = new Date();
        exdate.setDate(exdate.getDate() + 365);
        var domain = _self.getDomainName();
        if (domain.substring(0, 1) != '.') {
            domain = '.' + domain;
        }
        var options = {
            expires: exdate.toGMTString(),
            path: '/',
            domain: domain
        };
        $.cookie(name, value, options);
    };

    this.iniGame = function(game) {
        this.game.push(game);
    };

    this.iniApp = function(app) {
        this.game.push(app);
    };

    this.getSessionID = function() {
        return _sessionID;
    };

    this.getProfile = function() {
        return this;
    };

    this.updateProfileForAllWindows = function() {
          var time = (new Date()).getTime();
          Profile.lastProfileUpdate = time;
          this.setCookie(_params.cookieLastProfileUpdate, time);
    };

    this.getUserNameFromCookie = function() {
        return String(_self.getCookie(_params.lastUserName)).toLowerCase();
    };

    this.checkSessionID = function() {
        var session = _self.getSipFromCookie();
        if (_sessionID != session) {
            _sessionID = session;
            if (_self.reloadOwnProfile() === false) {
                _self.updateProfile();
                if (_self.game != null) {
                    for(var i = 0; i < _self.game.length; i++) {
                        try {
                            _self.game[i].CallFunction('<invoke name="changeSessionID">'
                                + '<arguments><string>' + _sessionID + '</string></arguments>'
                                + '</invoke>');
                        } catch(e) { }
                    }
                }
                updateCurrentTab();
            }
        } else {
            var lastUpdate = _self.getLastProfileUpdateFromCookie();
            if (_params.lastProfileUpdate != lastUpdate) {
                _params.lastProfileUpdate = lastUpdate;
                _self.updateProfile();
            }
        }
    };

    this.reloadOwnProfile = function() {
        if (_self.getUserNameFromUrl() == _self.getUserNameFromCookie()) {
            reloadCurrentPage();
            return true;
        }
        return false;
    };

    this.getUserNameFromUrl = function() {
        var url = document.location.host;
        var arr = url.split('.');
        if (arr.length > 2) {
             return String(arr[0]).toLowerCase();
        }
        return '';
    };
    this.getLastProfileUpdateFromCookie = function() {
        return _self.getCookie(_params.cookieLastProfileUpdate);
    };
    
    this.getLastProfileUpdateFromCookie = function() {
        return _self.getCookie(_params.cookieLastProfileUpdate);
    };
    this.selectLink = function(param) {
        switch (param)
        {
            case "game":
                param = "info";
            break
            case "game-share":
                param = "share-game";
            break
            case "game-score":
                param = "top-score";
            break
            case "game-walkthrough":
                param = "walkthrough";
            break
            case "game-image_gallery":
                param = "info";
            break
            case "game-custom_levels":
                param = "info";
            break
            case "game-achivments":
                param = "medals";
            break
        }
        try
        {
            return(selectActionLink(param))
        }
        catch(e) {}
        return(0)
    };

    this.selectLink = function(param) {
        switch (param)
        {
            case "game":
                param = "info";
                break
            case "game-share":
                param = "share-game";
                break
            case "game-score":
                param = "top-score";
                break
            case "game-walkthrough":
                param = "walkthrough";
                break
            case "game-image_gallery":
                param = "info";
                break
            case "game-levels":
                param = "levels";
                break
            case "game-achivments":
                param = "medals";
            break
        }
        try
        {
            return(selectActionLink(param))
        }
        catch(e) {}
        return(0)
    };
};

