function configureCRM() {
    var config = {
        project_id: "http://ad.agava.net/registry/project/maillist"
    };

    AgavaAPI.CRM.setup(config);
    AgavaAPI.load("CRM");
};

if (typeof AgavaAPI === "undefined") {
    var DEFAULT_BASE = "http://auth.tbn.ru:8080/jdb/crm";

    var waitingFor = function (f_cond, f_call) {
        var x = function () { f_cond() ? f_call() : setTimeout(x, 100); };
        return x;
    };

    var waitCrm = function (f_call) {
        waitingFor(function () { return !!window.AgavaAPI; }, f_call)();
    };

    window.loadAgavaCrm = function (callback, base) {
        var s = document.createElement("script");
        s.setAttribute("src", (base || DEFAULT_BASE) + "/scripts/path.settings.no-cache.js");
        s.setAttribute("type", "text/javascript");
        document.getElementsByTagName("head")[0].appendChild(s);
        waitCrm(callback);
    };

    loadAgavaCrm(configureCRM);
} else {
    configureCRM();
}

var localReturnUrl;
var localAuthNeeded;
var authEventSubscription = new Array();
var exitEventSubscription = new Array();
var onLocalAuthError = new Array();
var onBeforLocalAuth = new Array();

function DoRegistry() {
    AgavaAPI.CRM.DoRegistry();
}

function localAuth() {
    var exitFlag;

    try {
        localReturnUrl = url;
    } catch (ex) {
        localReturnUrl = getArgumentFromQuery('url');
    }

    if (!localReturnUrl) {
        localReturnUrl = 'http://www.maillist.ru/cgi/console.cgi';
    }

    exitFlag = getArgumentFromQuery('sid');

    if (exitFlag && exitFlag == '_') {
        exitFromProject();
    } else {
        localAuthNeeded = 1;
        AgavaAPI.CRM.DoAuth(authCallback);
    }
}

function localAuth_devel() {
    var exitFlag;

    try {
        localReturnUrl = url;
    } catch (ex) {
        localReturnUrl = getArgumentFromQuery('url');
    }

    if (!localReturnUrl) {
        localReturnUrl = 'http://www.maillist.ru/cgi/console.cgi';
    }

    exitFlag = getArgumentFromQuery('sid');

    if (exitFlag && exitFlag == '_') {
        exitFromProject();
    } else {
        AgavaAPI.CRM.DoAuth(authCallback);
    }
}

function authCallback(ClientContext) {
    if (ClientContext && ClientContext.isAuth() == true
        && ClientContext.isAnonymous() == false) {
        var _redirOnly = '';

        try {
            _redirOnly = redirOnly;
        } catch (ex) {};

        if ((!_getCookie('.maillist.ru_sid')) && _getCookie('lpa') == 2) {
            localAuthNeeded = 1;
        };

        if (_redirOnly) {
            window.location.href = unescape(url);
        } else if (localAuthNeeded){
            for (var action in onBeforLocalAuth) {
                try {
                    eval(onBeforLocalAuth[action]);
                }
                catch (ex) {};
            }

            authByEcid(['ecid__'+ClientContext.getEcid(), 'NO_CACHE'], [projectAuthCallback]);
        }
    }
}

function projectAuthCallback(sid, supurl) {
    if (sid && sid != '0' && sid.match('^[0-9a-f]+$')) {

        if (_getCookie('isguest')!=null && _getCookie('isguest')==1) {
            _setCookie('.maillist.ru_sid', sid,0, '/', '.maillist.ru');
            _setCookie('support_url', supurl,0, '/', '.maillist.ru');
        } else {
            _setCookie('.maillist.ru_sid', sid, 0, '/', '.maillist.ru');
            _setCookie('support_url', supurl, 5*3600*1000, '/', '.maillist.ru');
        };

        localReturnUrl = window.location;

        if (!localReturnUrl) {
            try { localReturnUrl = url; } catch (ex) {};
        }

        if (localReturnUrl) {
            window.location.href = unescape(localReturnUrl);
        } else {
            try { onAuth(); } catch (ex) {};
        }
    } else {
        for (var action in onLocalAuthError) {
            try {
                eval(onLocalAuthError[action]);
            } catch (ex) {};
        }

        sid = sid.substr(30)+'...';
        alert("Ошибка авторизации. Пожалуйста обратитесь в службу тех. поддержки: http://support.maillist.ru\n\n"+sid);
        exitFromProject();
    }
}

function exitFromProject(urlToExit) {
    _deleteCookie('.maillist.ru_sid', '/', '.maillist.ru');
    _deleteCookie('support_url', '/', '.maillist.ru');

    for (var action in exitEventSubscription) {
        try {
            eval(exitEventSubscription[action]);
        } catch (ex) {};
    }

    if (!urlToExit || urlToExit == '') {
        urlToExit = 'http://www.maillist.ru/';
    }

    AgavaAPI.CRM.DoLogout(function () { exitFromAuthCallBack(urlToExit); });
}

function exitFromAuthCallBack(urlis) {
    if (!urlis || urlis == '') {
        urlis = 'http://www.maillist.ru/';
    }

    window.location.href = urlis;
}

function processAuth() {
    if (document.getElementById('supportMode').value == 1) {
        window.location.href = url;
    } else if (document.getElementById('autoTry').value == 1) {
        // pass
    } else {
        AgavaAPI.CRM.DoAuth(authCallback);
    }
}

function ml_anonAuthCallback() {
    // callback after anonymauth
}

function tryCookie() {
    AgavaAPI.CRM.IsAuth(
        function (context) {
            if (context.isAuth()) {
                if (!_getCookie('.maillist.ru_sid')) {
                    authByEcid(['ecid__'+context.getEcid(), 'NO_CACHE'], [projectAuthCallback]);
                } else {
                    onAuth();
                }
            } else{
                if (_getCookie('.maillist.ru_sid')) {
                    onAuth();
                } else {
                    document.getElementById('login_form').style.display = 'block';
                    document.getElementById('authProgr').style.display = 'none';
                }
            }
        }
    );
}

function onAuth() {
    for (var action in authEventSubscription) {
        try {
            eval(authEventSubscription[action]);
        } catch (ex) {};
    }
}

function setEcidValue(field) {
    var fl;

    try {
        fl = document.getElementById(field);
    } catch(ex) {};

    if (!fl) {
        return;
    }

    try {
        fl.value = AgavaAuth.getClientContext().getEcid();
    } catch(ex) {};
}

/** Misc query param getter */
function getArgumentFromQuery(paramName) {
    var mainURL = window.location + "";
    var URLparts = mainURL.split('?');

    if (URLparts.length < 2) {
        return null;
    }

    var arguments = URLparts[1].split('&');
    for (i = 0; i < arguments.length; i++) {
        var pair = arguments[i].split('=');

        if(pair[0] == paramName){
            return arguments[i].substring(arguments[i].indexOf(pair[1]));
        }
    }
}

/** Get cookie */
function _getCookie(name) {
    var prefix = name + "=";
    var cookieStartIndex = document.cookie.indexOf(prefix);

    if (cookieStartIndex == -1)
        return null;

    var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length);

    if (cookieEndIndex == -1)
        cookieEndIndex = document.cookie.length;

    return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex));
}

/** Set cookies */
function _setCookie(name, value, expires, path, domain, secure) {
    var today = new Date();
    var expires_date;

    today.setTime(today.getTime());

    if (expires) {
        expires_date = new Date(today.getTime() + (expires));
    }

    document.cookie = name + '=' + escape(value) +
        ((expires) ? ';expires=' + expires_date.toGMTString() : '') +
        ((path)    ? ';path='    + path                       : '') +
        ((domain)  ? ';domain='  + domain                     : '') +
        ((secure)  ? ';secure'                                : '');
}


/** Delete cookies */
function _deleteCookie (name, path, domain) {
    var value = _getCookie(name);

    if (value != null) {
        document.cookie = name + '=' +
            ((path)   ? '; path='   + path   : '') +
            ((domain) ? '; domain=' + domain : '') +
            '; expires=' + new Date(0).toGMTString();
    }
}

/** Local project ajax authrorization code */
//<![CDATA[
var ajax = [];

function pjx(args, fname, method) {
    this.target = args[1];
    this.args = args[0];
    method = (method) ? method : 'GET';

    if (method == 'post') {
        method = 'POST';
    }

    this.method = method;
    this.r = ghr();
    this.url = this.getURL(fname);
}

function formDump() {
    var all = [];
    var fL = document.forms.length;

    for (var f = 0; f < fL; f++) {
        var els = document.forms[f].elements;
        for (var e in els) {
            var tmp = (els[e].id != undefined) ? els[e].id : els[e].name;
            if (typeof tmp != 'string') {
                continue;
            }

            if (tmp) {
                all[all.length]=tmp;
            }
        }
    }

    return all;
}

function getVal(id) {
    if (id.constructor == Function ) {
        return id();
    }

    if (typeof(id)!= 'string') {
        return id;
    }

    var element = document.getElementById(id);

    if (!element) {
        for (var i = 0; i < document.forms.length; i++) {
            element = document.forms[i].elements[id];

            if (element)
                break;
        }

        if (element && !element.type)
            element = element[0];
    }

    if (!element) {
        alert('ERROR: Cant find HTML element with id or name: ' +
              id + '. Check that an element with name or id=' +
              id + ' exists');
        return 0;
    }

    if (element.type == 'select-one') {
        if (element.selectedIndex == -1)
            return;

        var item = element[element.selectedIndex];
        return item.value || item.text;
    }

    if (element.type == 'select-multiple') {
        var ans = [];
        var k = 0;
        for (var i = 0; i < element.length; i++) {
            if (element[i].selected || element[i].checked ) {
                ans[k++] = element[i].value || element[i].text;
            }
        }
        
        return ans;
    }

    if (element.type == 'radio' || element.type == 'checkbox') {
        var ans = [];
        var elms = document.getElementsByTagName('input');
        var endk = elms.length;
        var i = 0;

        for(var k = 0; k < endk; k++) {
            if (elms[k].type == element.type && elms[k].checked &&
                (elms[k].id == id || elms[k].name == id)) {
                ans[i++]=elms[k].value;
            }
        }

        return ans;
    }

    if (element.value == undefined) {
        return element.innerHTML;
    } else {
        return element.value;
    }
}

function fnsplit(arg) {
    var url="";

    if (arg == 'NO_CACHE') {
        return '&pjxrand=' + Math.random();
    }

    if ((typeof(arg)).toLowerCase() == 'object') {
        for (var k in arg) {
            url += '&' + k + '=' + arg[k];
        }
    } else if (arg.indexOf('__') != -1) {
        arga = arg.split(/__/);
        url += '&' + arga[0] + '=' + escape(arga[1]);
    } else {
        var res = getVal(arg) || '';
        if(res.constructor != Array) {
            res = [res];
        }

        for(var i = 0; i < res.length; i++) {
            url += '&args=' + escape(res[i]) + '&' + arg + '=' + escape(res[i]);
        }
    }

    return url;
}

pjx.prototype = { 
    send2perl : function(){
        var r = this.r;
        var dt = this.target;
        this.pjxInitialized(dt);
        var url=this.url;
        var postdata;
        if(this.method=="POST"){
            var idx=url.indexOf('?');
            postdata = url.substr(idx+1);
            url = url.substr(0,idx);
        }
        r.open(this.method,url,true);
        if(this.method=="POST"){
            r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            r.send(postdata);
        }
        if(this.method=="GET"){ r.send(null); }
        r.onreadystatechange = handleReturn;
    }, pjxInitialized : function(){}, pjxCompleted : function(){}, readyState4 : function(){ var rsp = unescape(this.r.responseText); /* the response from perl */ var splitval = '__pjx__'; /* to split text */ /* fix IE problems with undef values in an Array getting squashed*/ rsp = rsp.replace(splitval+splitval+'g',splitval+" "+splitval); var data = rsp.split(splitval); dt = this.target; if (dt.constructor != Array) { dt=[dt]; } if (data.constructor != Array) { data=[data]; } if (typeof(dt[0])!='function') { for ( var i=0; i<dt.length; i++ ) { var div = document.getElementById(dt[i]); if (div.type =='text' || div.type=='textarea' || div.type=='hidden' ) { div.value=data[i]; } else{ div.innerHTML = data[i]; } } } else if (typeof(dt[0])=='function') { dt[0].apply(this,data); } this.pjxCompleted(dt); }, getURL : function(fname) { var args = this.args; var url= 'fname=' + fname; for (var i=0;i<args.length;i++) { url=url + args[i]; } return url; }};handleReturn = function() { for( var k=0; k<ajax.length; k++ ) { if (ajax[k].r==null) { ajax.splice(k--,1); continue; } if ( ajax[k].r.readyState== 4) { ajax[k].readyState4(); ajax.splice(k--,1); continue; } }};var ghr=getghr();function getghr(){ if(typeof XMLHttpRequest != "undefined") { return function(){return new XMLHttpRequest();} } var msv= ["Msxml2.XMLHTTP.7.0", "Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]; for(var j=0;j<=msv.length;j++){ try { A = new ActiveXObject(msv[j]); if(A){ return function(){return new ActiveXObject(msv[j]);} } } catch(e) { } } return false;}function jsdebug(){ var tmp = document.getElementById('pjxdebugrequest').innerHTML = "<br><pre>"; for( var i=0; i < ajax.length; i++ ) { tmp += '<a href= '+ ajax[i].url +' target=_blank>' + decodeURI(ajax[i].url) + ' </a><br>'; } document.getElementById('pjxdebugrequest').innerHTML = tmp + "</pre>";}

function authByEcid() {
    var args = authByEcid.arguments;

    for (var i = 0; i < args[0].length; i++) {
        args[0][i] = fnsplit(args[0][i]);
    }

    var l = ajax.length;
    ajax[l] = new pjx(args,"authByEcid",args[2]);
    ajax[l].url = '/cgi/ajax/login_ajax.cgi?' + ajax[l].url;
    ajax[l].send2perl();
}
//]]>

