﻿(function () {

    if (window.ilangCookies) return;
    window.ilangCookies = function () { };

    window.ilangCookies.createCookie = function (name, value, days) {
        if (days) {
            var date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            var expires = "; expires=" + date.toGMTString();
        }
        else var expires = "";
        document.cookie = name + "=" + value + expires + "; path=/";
    }

    window.ilangCookies.readCookie = function (name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
        }
        return null;
    }

    window.ilangCookies.eraseCookie = function (name) {
        window.ilangCookies.createCookie(name, "", -1);
    }

} ());

function ClearOrganization() { }

(function () { // initialize/set static methods of ClearOrganization

    var cmanager = window.ilangCookies;

    var idx_cache = 'orgSelector_clear_cache';

    function set_idx_cache(v) {
        if (v) cmanager.createCookie(idx_cache, v);
        else if (cmanager.readCookie(idx_cache)) cmanager.eraseCookie(idx_cache);
    }

    ClearOrganization.ReleaseCookies = function () {
        if (typeof window.ilangCookies === 'function') {
            var org = ['orgSelector_name', 'orgSelector_id', 'orgSelector_type', 'orgSelector_last_id', 'orgSelector_uoid'];
            var clearCookie = function (cname) {
                try {
                    if (cmanager.readCookie(cname)) {
                        cmanager.eraseCookie(cname);
                    }
                    return true;
                }
                catch (_ex) {
                    return false;
                }
            };
            for (var i = 0; i < org.length; i++) {
                if (!clearCookie(org[i])) break;
            }
        }
    };

    ClearOrganization.ReleaseCache = function (clearCookie) {

        if (frames && frames.length) {
            for (var i = 0; i < frames.length; i++) {
                if (frames[i]) {
                    if (frames[i].OrganizationSelectorCache) frames[i].OrganizationSelectorCache = null;
                    if (frames[i].top && frames[i].top.OrganizationSelectorCache) frames[i].top.OrganizationSelectorCache = null;
                }
            }
        }

        if (window.OrganizationSelectorCache) window.OrganizationSelectorCache = null;
        if (window.parent.OrganizationSelectorCache) window.parent.OrganizationSelectorCache = null;

        if (clearCookie) set_idx_cache(false);

    };

    ClearOrganization.ReloadCache = function () {

        return Number(cmanager.readCookie(idx_cache)) === 1;

    };

    ClearOrganization.Release = function () {
        ClearOrganization.ReleaseCookies();
        ClearOrganization.ReleaseCache();
        if (window.ilangCookies) {
            cmanager.createCookie(idx_cache, 1);
        }
    }

    ClearOrganization.ReleaseOnInitialize = function () {
        var callback = (function () { ClearOrganization.Release(); });
        if (window.addEvent) window.addEvent('load', callback);
        else {
            if (window.attachEvent) window.attachEvent('onload', callback);
            else if (window.addEventListener) window.addEventListener('load', callback, false);
        }
    }

} ());

window.OrganizationSelector = function () {

    var pos = { up: 38, down: 40, enter: 13 };

    var checkType = { Admin: 0, Student: 1 };

    var addEvent = function (item, eventName, func) {
        if (item.attachEvent) { item.attachEvent('on' + eventName, func); return true; }
        if (item.addEventListener) { item.addEventListener(eventName, func, false); return true; }
        if (item.addEvent) { item.addEvent(eventName, func); return true; }
        return false;
    }

    var getItemByContextID = function (id) {
        return document.getElementById('OrganizationSelector.' + id);
    }

    var getOrgSelector = function () {
        if (!getOrgSelector.orgSelector) getOrgSelector.orgSelector = getItemByContextID('main');
        return getOrgSelector.orgSelector;
    }

    var getFirstValidChild = function (node) {
        var fc = node.firstChild;
        if (fc && fc.nodeType == 1) return fc;
        else {
            var getNextValidNode = function (n) {
                if (n.nodeType == 1) return n;
                else {
                    if (n.nextSibling) return getNextValidNode(n.nextSibling);
                    else return null;
                }
            }
            return getNextValidNode(fc);
        }
    }

    var getItemByServerID = function (id, type) {
        var orgSelector = getOrgSelector();
        var type = type || '*';
        if (orgSelector) {
            var arrElements = orgSelector.getElementsByTagName(type);
            if (arrElements && arrElements.length) {
                for (var i = 0; i < arrElements.length; i++) {
                    if (arrElements[i].id && arrElements[i].id.indexOf('_' + id) > -1) return arrElements[i];
                }
            }
        }
        return null;
    }

    var lockText = function () {
        var text = getItemByContextID('text');
        if (text && text.parentNode) {
            text.parentNode.className = 'search_TopFilter_loading';
            return true;
        }
        return false;
    }

    var unLockText = function () {

        var text = getItemByContextID('text');
        if (text && text.parentNode) {
            if (text.disabled) text.disabled = false;
            text.parentNode.className = 'search_TopFilter';
            try {
                text.focus();
            }
            catch (_ex) {
                return false;
            }
            return true;
        }
        return false;
    }

    var doSearch = function (input, forceSearch) {

        if (!forceSearch) if (!input.canSearch) return;

        try {

            input.canSearch = false;
            doSearch._term = input.value;

            OrganizationSelector._Instance.VisibleItems = [];
            OrganizationSelector._Instance.LastIndex = -1;
            OrganizationSelector._Instance.LastNode = null;

            var selectLink = function (link, term) {
                var clearLink = function (link) {
                    var er = /<b>/gi;
                    if (er.test(link.innerHTML)) {
                        link.innerHTML = link.innerHTML.replace(er, '').replace(/<\/b>/gi, '');
                    }
                    link.parentNode.style.display = '';
                    link.className = 'default';
                }

                clearLink(link);
                term = term.replace('(', '\\(').replace(')', '\\)');
                var validTerm = term.replace(/\s/g, '');
                var er = new RegExp(term, 'gi');
                if (validTerm && er.test(link.innerHTML)) {
                    var getBoldText = function (text, term) {
                        var er = new RegExp('(' + term + ')', 'gi');
                        return text.replace(er, '<b>\$1</b>');
                    }
                    link.innerHTML = getBoldText(link.innerHTML, term);
                }
                else {
                    link.parentNode.style.display = validTerm ? 'none' : '';
                }
            }

            var term = doSearch._term;
            var list = getItemByContextID('list');
            if (list) {
                list = list.getElementsByTagName('LI');
                if (list && list.length) {
                    for (var i = 0; i < list.length; i++) {
                        selectLink(getFirstValidChild(list[i]), term);

                        if (list[i].style.display != 'none') OrganizationSelector._Instance.VisibleItems.push(list[i]);
                    }
                }
            }
        }
        finally {
            input.canSearch = true;
        }
    }

    var navigateNode = function (target) {
        var nodes = OrganizationSelector._Instance.VisibleItems;
        OrganizationSelector._Instance.LastIndex = (OrganizationSelector._Instance.LastIndex == -1) ? nodes.length - 1 : OrganizationSelector._Instance.LastIndex;
        var node = nodes[OrganizationSelector._Instance.LastIndex];
        var p = OrganizationSelector._Instance.LastIndex;
        if (p != -1) {
            getFirstValidChild(node).className = 'default';
            OrganizationSelector._Instance.LastIndex = (target == pos.down) ? (((p + 1) >= nodes.length) ? 0 : (p + 1)) : (((p - 1) < 0) ? (nodes.length - 1) : (p - 1));
            OrganizationSelector._Instance.LastNode = getFirstValidChild(nodes[OrganizationSelector._Instance.LastIndex]);
            OrganizationSelector._Instance.LastNode.className = 'mouseover';
            OrganizationSelector._Instance.LastNode.focus();
        }
        try {
            getItemByContextID('text').focus();
        }
        catch (_focusEx) {
            return _focusEx;
        }
    }

    var doSearchWithLock = function (forceSearch) {
        lockText();
        setTimeout(function () { doSearch(getItemByContextID('text'), forceSearch); unLockText(); }, 100);
    };

    this.Open = function () {
        getItemByContextID('body').style.display = '';
        getItemByContextID('caption').className = 'active';
        try {
            getItemByContextID('text').focus();
        }
        catch (_ex) {
            return;
        }
        return this;
    }

    this.Hide = function () {
        getItemByContextID('body').style.display = 'none';
        getItemByContextID('caption').className = '';
        return this;
    }

    this.VisibleItems = [];

    this.LastIndex = -1;

    this.LastNode = null;

    this.EvaluateOrganization = function (node) {
        if (node) {
            this.SetOrganization(node);
        }
    };

    this.EvaluateCommand = function (evt) {
        var evt = evt || window.event;
        if (evt) {
            var code = evt.which || evt.keyCode;
            var _continue = false;

            switch (code) {
                case pos.down: case pos.up:
                    window._StopEvent(evt);
                    navigateNode(code);
                    break;

                case pos.enter:
                    window._StopEvent(evt);
                    var node = OrganizationSelector._Instance.LastNode;
                    if (node) this.EvaluateOrganization(node);
                    else {
                        if (window.OrganizationSelector && window.OrganizationSelector._Instance && window.OrganizationSelector._Instance.timer) {
                            getItemByContextID('text').canSearch = true;
                            if (typeof window.OrganizationSelector._Instance.timer.resume === 'function') {
                                window.OrganizationSelector._Instance.timer.resume(); // limpa as chamadas
                                doSearchWithLock(true); //faz a busca
                            }
                        }
                    }
                    break;

                default:
                    _continue = true;
                    break
            }

            getItemByContextID('text').canSearch = _continue;
            return _continue;
        }
    };



    this.EvaluateSearch = function (evt) {

        if (getItemByContextID('text').canSearch) {

            var delay = getItemByContextID('list').childNodes.length > 50;
            var search = (function () { doSearchWithLock() });

            if (!delay) search();
            else {

                if (!this.timer) this.timer = new CustomTimer(search, ILang.Controls.Config.OrganizationSelectorWaiting, 'window.OrganizationSelector._Instance.timer');
                else this.timer.action();
            }
        }

    };

    this.SetRadio = (function (idx) {

        setTimeout((function () {
            if (idx >= 0) {
                var container = getItemByContextID('type');
                var radio = container.getElementsByTagName('INPUT');
                var idx2 = idx === 1 ? 0 : 1;
                radio[idx].checked = true;
                radio[idx2].checked = false;
            }
        }), 100);

    });

    this.SetType = function (typeName) {


        var hdBehavior = getItemByServerID('hdBehavior', 'INPUT');
        if (hdBehavior) {

            var container = getItemByContextID('type');
            var radio = container.getElementsByTagName('INPUT');
            var link = container.getElementsByTagName('A');
            typeName = (typeName == 'auto') ? hdBehavior.value : typeName;

            var orgSelector_type = null;
            switch (typeName) {
                case '':
                    orgSelector_type = 3;
                    break;

                case 'admin':
                    orgSelector_type = 1;
                    setTimeout((function () { window.OrganizationSelector.getInstance().BindOrganizations(1); }), 100);
                    break;

                case 'student':
                    orgSelector_type = 2;
                    setTimeout((function () { window.OrganizationSelector.getInstance().BindOrganizations(2); }), 100);
                    break;

                default:
                    orgSelector_type = null;
                    break;
            }
            if (orgSelector_type) window.ilangCookies.createCookie('orgSelector_type', orgSelector_type);


            if (typeName) {

                hdBehavior.value = typeName;
                var _selected_index = typeName == 'admin' ? 0 : 1;
                var _unselected_index = _selected_index == 0 ? 1 : 0;
                radio[_selected_index].checked = true;
                radio[_unselected_index].checked = false;
                link[_selected_index].className = 'active';
                link[_unselected_index].className = '';
                return true;
            }
            else {
                radio[0].checked = false;
                radio[1].checked = false;
                link[0].className = '';
                link[1].className = '';
                return false;
            }

        }

        return false;
    }

    this.SetOrganization = function (caller, setAll) {

        var setOrganization = function (caller, setAll) {

            var setOrg = getItemByContextID('setOrg');
            if (setOrg) {

                var val = caller.getAttribute('orgValues');
                setOrg.getElementsByTagName('INPUT')[0].value = val;
                if (!setAll) {
                    var _info = val.split('@!');
                    var orgId = _info[0];
                    var orgName = _info[1];
                    window.ilangCookies.createCookie('orgSelector_name', encodeURIComponent(orgName));
                    window.ilangCookies.createCookie('orgSelector_id', orgId);
                    window.ilangCookies.createCookie('oslorg', orgId + '_' + encodeURIComponent(orgName));
                }
                else {
                    window.ilangCookies.createCookie('orgSelector_name', 'All');
                    window.ilangCookies.createCookie('orgSelector_id', '');
                    window.ilangCookies.createCookie('oslorg', '_' + encodeURIComponent(ILang.Resources.Captions.All));
                }

                __doPostBack(setOrg.getElementsByTagName('A')[setAll ? 1 : 0].id.replace(/_/g, '$'));
            }
        }

        lockText();
        setTimeout((function () { setOrganization(caller, setAll); }), 250);

    };

    this.BindOrganizations = (function (typeId) {
        try {
            lockText();
            var list = getItemByContextID('list');
            if (ClearOrganization.ReloadCache() || typeId && list.currentType != typeId) {

                var types = { NotSet: 0, Admin: 1, Student: 2, Hybrid: 3 };
                function getTypeName(t) {
                    var r = '';
                    switch (t) {
                        case types.Admin: r = 'admin'; break;
                        case types.Student: r = 'student'; break;
                        case types.Hybrid: r = 'hybrid'; break;
                    }
                    return r;
                }

                var type = getTypeName(typeId);


                if (ClearOrganization.ReloadCache()) {
                    list.innerHTML = '';
                    if (window.parent.OrganizationSelectorCache) {
                        for (var i in window.parent.OrganizationSelectorCache) {
                            if (window.parent.OrganizationSelectorCache[i]) {
                                try {
                                    window.parent.OrganizationSelectorCache[i] = null;
                                    delete window.parent.OrganizationSelectorCache[i];
                                }
                                catch (_e01) {
                                    window.parent.OrganizationSelectorCache[i] = null;
                                }
                            }
                        }
                        try {
                            window.parent.OrganizationSelectorCache = null;
                            delete window.parent.OrganizationSelectorCache;
                        }
                        catch (_e02) {
                            window.parent.OrganizationSelectorCache = null;
                        }
                    }
                    window.ilangCookies.eraseCookie('orgSelector_clear_cache');
                }

                if (!window.parent.OrganizationSelectorCache) window.parent.OrganizationSelectorCache = {};
                if (!window.parent.OrganizationSelectorCache[type]) {
                    httpHandler = new HttpChannelHandler('/Controls/OrganizationSelector.ashx?bti=' + typeId + '&t0=' + (new Date().getTime().toString(10)), false, true);
                    window.parent.OrganizationSelectorCache[type] = httpHandler.GetResult();

                }

                function createItem(org) {
                    var li = document.createElement("LI");
                    var ach = document.createElement("A");
                    with (ach) {
                        href = "javascript:void(0);";
                        setAttribute('orgvalues', org.id + '@!' + org.name);
                        onclick = function () {
                            window.OrganizationSelector._Instance.SetOrganization(ach);
                            return false;
                        };
                    }
                    ach.innerHTML = org.name;
                    li.appendChild(ach);
                    return li;
                }

                var source = window.parent.OrganizationSelectorCache[type];

                var listParent = list.parentNode;
                if (listParent) {

                    var newList = document.createElement('UL');
                    newList.id = list.id;
                    listParent.replaceChild(newList, list);
                    list = newList;

                    if (source.length) {
                        for (var i = 0; i < source.length; i++) {
                            list.appendChild(createItem(source[i]));
                        }
                    }
                    list.currentType = typeId;
                }

            }
        } finally {
            unLockText();
        }
    });

    this.GetPageType = (function () {

        var typeContainer = getItemByContextID('type');
        if (typeContainer) {
            var arrCheck = typeContainer.getElementsByTagName('INPUT');
            if (arrCheck[checkType.Admin].checked) return 1;
            if (arrCheck[checkType.Student].checked) return 2;
            return 0;
        }
        return 0;
    });

    (function () {


        //redefine a funcao de focus do text de busca para evoca-lo apenas se o controle estiver aberto
        (function () {
            var _text = getItemByContextID('text');
            _text._rfocus = _text.focus;
            _text.focus = (function () {
                if (getItemByContextID('body').style.display == '') _text._rfocus();
                //alert('focus no search');
            });
        } ());


        var list = getItemByContextID('list').getElementsByTagName('LI');
        for (var i = 0; i < list.length; i++) list[i].style.display = '';
        arguments[0].VisibleItems = list;

        addEvent(getItemByContextID('caption'), 'click', (function () {
            var body = getItemByContextID('body');
            var func = (body.style.display == '') ? window.OrganizationSelector.getInstance().Hide : window.OrganizationSelector.getInstance().Open;
            func();
        }));

        OrganizationSelector._Instance = arguments[0];

        OrganizationSelector._Instance.SetType('auto');

        getItemByContextID('main').style.visibility = 'visible';

        addEvent(window.document.body, 'click', (function () {
            try {
                window.OrganizationSelector.getInstance().Hide();
            }
            catch (_ex) {
                return;
            }
        }));


        var currentType = getItemByServerID('hdBehavior', 'INPUT');
        if (currentType && currentType.value) {
            var currentType = currentType.value;
            var arrCheck = getItemByContextID('type').getElementsByTagName('INPUT');
            arrCheck[checkType.Admin].checked = currentType === 'admin';
            arrCheck[checkType.Student].checked = !arrCheck[checkType.Admin].checked;

            if (typeof window['__showAdmin'] === 'boolean') {
                var arrCheckContainer = getItemByContextID('type').getElementsByTagName('LI');
                arrCheckContainer[0].style.display = __showAdmin ? '' : 'none';
                arrCheckContainer[1].style.display = __showStudent ? '' : 'none';
            }
        }



    } (this));
}

function HttpChannelHandler(url, isAsync, parseResult, callback) {

    function getHttpChannelHandler() {
        var xmlHttpRequest = null;
        if (typeof window.XMLHttpRequest == 'function') {
            xmlHttpRequest = new window.XMLHttpRequest();
        }
        else {
            var components = ['MSXML2.XMLHTTP.3.0', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP'];
            for (var i = 0; i < components.length; i++) {
                try { xmlHttpRequest = new ActiveXObject(components[i]); break; }
                catch (ex) { continue; }
            }
        }
        return xmlHttpRequest;
    }

    function evaluateResult(jasonString) {

        function prepare4Jason(jstring) {
            var jstring = String(jstring);
            while (jstring.charAt(0) == '"' || jstring.charAt(0) == '\'') {
                jstring = jstring.substring(1);
            }
            while (jstring.charAt(jstring.length - 1) == '"' || jstring.charAt(jstring.length - 1) == '\'') {
                jstring = jstring.substring(0, jstring.length - 1);
            }
            return jstring;
        }

        return eval('(' + prepare4Jason(jasonString) + ')');
    }

    this.XmlHttpRequest = null;

    this.GetResult = function () {

        var getResult = (function (jstring) {
            if (jstring) return evaluateResult(jstring);
            else return null;
        });

        var xmlHttpRequest = getHttpChannelHandler();
        var callBackBody = function () {
            if (xmlHttpRequest.readyState < 4) return;
            else {
                if (typeof callback === 'function') callback();
            }
        }
        with (xmlHttpRequest) {
            onreadystatechange = (function () { callBackBody(); });
            open('GET', url, isAsync);
            send('');
        }
        this.XmlHttpRequest = xmlHttpRequest;
        return (!isAsync && parseResult) ? getResult(xmlHttpRequest.responseText) : xmlHttpRequest.responseText || null;
    }

}
