/*http://static.hsaa.ca/portal_javascripts/skin/viewSiteAs.js?original=1*/
/*jslint browser: true, sloppy: true, maxlen: 80, indent: 4 */

/*globals YAHOO */

YAHOO.util.Event.onContentReady('view_site_as', function () {
    var standard_width = 128,
        isOpen = false,
        disc = document.getElementById('view_as_discipline'),
        emp = document.getElementById('view_as_employer'),
        work = document.getElementById('view_as_worksite'),
        all_disciplines,
        all_employers,
        all_worksites,
        i,
        ilen;

    if (YAHOO.env.ua.ie || YAHOO.env.ua.webkit) {
        // worst browsers ever
        // can't display none a option in a select
        all_disciplines = disc && disc.innerHTML;
        all_employers = emp  && emp.innerHTML;
        if (work) {
            all_worksites = [];
            for (i = 0, ilen = work.options.length; i < ilen; i += 1) {
                all_worksites.push(work.options[i]);
            }
        }
    }

    function expand(select) {
        var currentWidth = select.offsetWidth;
        YAHOO.util.Dom.setStyle(
            select.parentNode,
            'height',
            select.parentNode.offsetHeight + 'px'
        );
        YAHOO.util.Dom.setStyle(select, 'width', 'auto');
        if (select.offsetWidth < currentWidth) {
            YAHOO.util.Dom.setStyle(select, 'width', standard_width + 'px');
        }
        YAHOO.util.Dom.setStyle(select, 'position', 'absolute');
        YAHOO.util.Dom.setStyle(select, 'z-index', '10');
        if (YAHOO.env.ua.ie && YAHOO.env.ua.ie < 8) {
            YAHOO.util.Dom.setStyle(select, 'right', '2');
        } else {
            YAHOO.util.Dom.setStyle(select, 'right', '0');
        }
        YAHOO.util.Dom.setStyle(select, 'bottom', '0');
    }

    function collapse(select) {
        YAHOO.util.Dom.setStyle(select, 'position', 'static');
        YAHOO.util.Dom.setStyle(select, 'width', standard_width + 'px');
        YAHOO.util.Dom.setStyle(select, 'right', '');
        YAHOO.util.Dom.setStyle(select, 'z-index', '');
        YAHOO.util.Dom.setStyle(select, 'bottom', '');
    }

    function mouseOverHandle(e) {
        var el = YAHOO.util.Event.getTarget(e);
        if (!isOpen) {
            el = el.nodeName.toLowerCase() === 'select' ?
                el :
                YAHOO.util.Dom.getAncestorByTagName(el, 'select');
            expand(el);
        }
    }

    function mouseOutHandle(e) {
        var el = YAHOO.util.Event.getTarget(e);
        if (!isOpen) {
            el = el.nodeName.toLowerCase() === 'select' ?
                el :
                YAHOO.util.Dom.getAncestorByTagName(el, 'select');
            collapse(el);
        }

    }

    function clickHandle(e) {
        var el = YAHOO.util.Event.getTarget(e);
        if (!isOpen) {
            isOpen = el.nodeName.toLowerCase() === 'select' ?
                el :
                YAHOO.util.Dom.getAncestorByTagName(el, 'select');
        } else {
            isOpen = false;
        }
        YAHOO.util.Event.stopPropagation(e);
    }

    function blurHandle() {
        if (isOpen) {
            collapse(isOpen);
            isOpen = false;
        }
    }

    function documentClickHandle() {
        if (isOpen) {
            collapse(isOpen);
            isOpen = false;
        }
    }

    function gotWorksites(o) {
        if (o.responseText) {
            var worksites = JSON.parse(o.responseText), opts, i, ilen,
                first = true,
                removeChild = [];
            if (worksites) {
                opts = work.getElementsByTagName('option');
                for (i = 0, ilen = opts.length; i < ilen; i += 1) {
                    if (opts[i].value === "" ||
                            worksites.indexOf(
                                parseInt(opts[i].value, 10)
                            ) !== -1 ||
                            emp.value === opts[i].value) {
                        YAHOO.util.Dom.setStyle(opts[i], 'display', '');
                        if (first) {
                            opts[i].selected = true;
                            first = false;
                        }
                    } else {
                        YAHOO.util.Dom.setStyle(opts[i], 'display', 'none');
                        if (opts[i].selected) {
                            YAHOO.util.Dom.getAncestorByTagName(
                                opts[i],
                                'select'
                            ).value = '';
                        }
                        if (YAHOO.env.ua.ie || YAHOO.env.ua.webkit) {
                            // worst browsers ever
                            removeChild.push(opts[i]);
                        }
                    }
                }
                if (YAHOO.env.ua.ie || YAHOO.env.ua.webkit) {
                    // worst browsers ever
                    for (i = 0, ilen = removeChild.length; i < ilen; i += 1) {
                        removeChild[i].parentNode.removeChild(removeChild[i]);
                    }
                }

            }
        }
    }

    function gotEmployerCode(o) {
        var opts, i, ilen, first = true;
        if (o.status === 200 && o.responseText) {
            if (o.responseText) {
                YAHOO.util.Connect.asyncRequest(
                    'GET',
                    '/getWorksitesByEmployerCode?emp_code=' + o.responseText,
                    {
                        'success': gotWorksites,
                        'failure': gotWorksites
                    }
                );
            }
        } else {
            opts = work.getElementsByTagName('option');
            for (i = 0, ilen = opts.length; i < ilen; i += 1) {
                YAHOO.util.Dom.setStyle(opts[i], 'display', '');
                if (first) {
                    opts[i].selected = true;
                    first = false;
                }
            }
        }
    }

    function updateWorksites(e) {
        var el = YAHOO.util.Event.getTarget(e), i, ilen;
        if (isOpen) {
            el = el.nodeName.toLowerCase() === 'select' ?
                el :
                YAHOO.util.Dom.getAncestorByTagName(el, 'select');
            YAHOO.util.Connect.asyncRequest(
                'GET',
                '/getEmployerCodeByCmfUid?cmf_uid=' + el.value,
                {
                    'success': gotEmployerCode,
                    'failure': gotEmployerCode
                }
            );
            if (YAHOO.env.ua.ie) {
                // worst browser ever
                if (all_worksites) {
                    while (work.options.length) {
                        work.removeChild(work.options[0]);
                    }
                    for (i = 0, ilen = all_worksites.length; i < ilen; i += 1) {
                        work.appendChild(all_worksites[i]);
                    }
                }
            }
        }
        clickHandle(e);
    }

    if (disc) {
        YAHOO.util.Event.on(disc, 'mouseover', mouseOverHandle);
        YAHOO.util.Event.on(disc, 'mouseout', mouseOutHandle);
        YAHOO.util.Event.on(disc, 'click', clickHandle);
        YAHOO.util.Event.on(disc, 'blur', blurHandle);
    }

    if (emp) {
        YAHOO.util.Event.on(emp, 'mouseover', mouseOverHandle);
        YAHOO.util.Event.on(emp, 'mouseout', mouseOutHandle);
        YAHOO.util.Event.on(emp, 'click', updateWorksites);
        YAHOO.util.Event.on(emp, 'blur', blurHandle);
    }

    if (work) {
        YAHOO.util.Event.on(work, 'mouseover', mouseOverHandle);
        YAHOO.util.Event.on(work, 'mouseout', mouseOutHandle);
        YAHOO.util.Event.on(work, 'click', clickHandle);
        YAHOO.util.Event.on(work, 'blur', blurHandle);
    }

    YAHOO.util.Event.on(document, 'click', documentClickHandle);
});


