﻿/*global loader, YAHOO, document, window, catalog, getHeader, getFooter, ActiveXObject, XMLHttpRequest, alert */

(function () {
    var header = document.getElementById('subheader');
    var current_size = 1.65;
    while (header.clientHeight > 45) {
        current_size = current_size - 0.05;
        header.style.fontSize = current_size + 'em';
    }
})();

catalog.base_url = "/" + catalog.campus;

catalog.Identifier = {
    "Pullman": "http://images.wsu.edu/javascripts/wsuidentifierV2.js",
    "Vancouver": "http://www.catalog.wsu.edu/Catalog/js/wsuvaidentifierV2.js",
    "Spokane": "http://images.wsu.edu/javascripts/wsusidentifierV2.js",
    "Tri-Cities": "http://images.wsu.edu/javascripts/wsutcidentifierV2.js",
    "DDP": "http://images.wsu.edu/javascripts/wsuidentifierV2.js",
    "General": "http://images.wsu.edu/javascripts/wsuidentifierV2.js"
};

catalog.ScriptGets = [];

if (catalog.Identifier[catalog.campus]) { catalog.ScriptGets.push(catalog.Identifier[catalog.campus]); }

YAHOO.util.Get.script(catalog.ScriptGets,
    {
        onSuccess: function(o) {
            var wsuheader = document.getElementById('wsuheader-wrapper');
            var wsufooter = document.getElementById('wsufooter-wrapper');
            if (typeof getHeader === "function") { wsuheader.innerHTML = getHeader(); }
            if (typeof getFooter === "function") { wsufooter.innerHTML = getFooter(); }
        }
    });

if (catalog.use_ajax) {
    loader = new YAHOO.util.YUILoader({
        require: ["event", "yahoo", "menu", "element", "dom", "get", "connection", "json"],
        // The following two options are for debugging purposes only.
        //filter: 'debug',
        //allowRollup: false,
        combine: true,
        onProgress: function(o) {
            if (o.name === 'dom') {
                YAHOO.util.Dom.batch = function(el, method, o, override) {
                    el = (el && (el.tagName || el.item || el.DOM_EVENTS)) ? el : YAHOO.util.Dom.get(el); // skip get() when possible

                    if (!el || !method) {
                        YAHOO.log('batch failed: invalid arguments', 'error', 'Dom');
                        return false;
                    }
                    var scope = (override) ? o : window;

                    if (el.length === undefined) { // Not array like
                        if (el.tagName) { // element
                            return method.call(scope, el, o);
                        }

                        if (el.DOM_EVENTS) { // YUI Element
                            return method.call(scope, el.get('element'), o);
                        }
                    }

                    var collection = [];

                    for (var i = 0, len = el.length; i < len; i += 1) {
                        collection[collection.length] = method.call(scope, el[i], o);
                    }

                    return collection;
                };
            } else if (o.name === 'connection') {
                YAHOO.util.Connect.canConnect = function() {
                    var http;
                    var r = false;
                    try {
                        http = new XMLHttpRequest();
                        r = true;
                    } catch (e) {
                        for (var i = 0; i < this._msxml_progid.length; ++i) {
                            try {
                                http = new ActiveXObject(this._msxml_progid[i]);
                                r = true;
                                break;
                            } catch (ex) { }
                        }
                    }
                    this.canConnect = function() { return r; };
                    return r;
                };
                // Trigger Autobuild of Cached Fields
                YAHOO.util.Connect.asyncRequest('GET', catalog.base_url + "/AJAX/LongTasks/");
            }
        },
        onSuccess: function() {
            var catalog = YAHOO.ROWWW.Catalog;
            var event = YAHOO.util.Event;
            var dom = YAHOO.util.Dom;
            var Element = YAHOO.util.Element;
            var connect = YAHOO.util.Connect;

            //if (connect.canConnect()) {
            (function() {
                var list = document.getElementById('chCampus').parentNode.parentNode;
                var li = document.createElement('li');
                catalog.permalink = document.createElement('a');
                catalog.permalink.setAttribute('title', "Permalink to this Page");
                catalog.permalink.setAttribute('href', window.location);
                var text = document.createTextNode("Permalink");
                catalog.permalink.appendChild(text);
                li.appendChild(catalog.permalink);
                list.insertBefore(li, list.firstChild);
            })();
            //}
            // This code works around a rendering issue in IE7 that we're working on solving.
            if (YAHOO.env.ua.ie == 7) {
                var nav = document.getElementById('unit-nav');
                if (nav) {
                    var anchors = document.getElementsByTagName('a');
                    for (i = 0; i < anchors.length; i += 1) {
                        anchors[i].href = anchors[i].href.replace(/Academics\/Courses/, "Courses/ByPrefix");
                    }
                }
            }

            catalog.AcadUnitSelector_Handler = function(form) {
                var unit_info = document.getElementById('unit-info');
                var OnAU_ID_Change = function() {
                    if (!isNaN(form.AU_ID.value)) {
                        form.AU_ID.disabled = true;
                        window.location = catalog.base_url + "/Academics/Info/" + form.AU_ID.value;
                        var content = document.createElement('img');
                        content.setAttribute('src', '/Content/ajax-loader.gif');
                        content.setAttribute('alt', 'Loading...');
                        unit_info.innerHTML = '';
                        unit_info.appendChild(content);
                    }
                };
                var OnFormLoad = function() {
                    if (form.AU_Select) {
                        form.removeChild(form.AU_Select);
                        form.AU_Select = null;
                        var no_select = document.createElement('Option');
                        no_select.appendChild(document.createTextNode("** Select an Academic Unit **"));
                        form.AU_ID.insertBefore(no_select, form.AU_ID.firstChild);
                        // IE does not consider textContent of empty div's to be blank string
                        if (!unit_info.textContent) {
                            form.AU_ID.selectedIndex = 0;
                        }
                    }
                };

                event.addListener(form.AU_ID, "change", OnAU_ID_Change, document.getElementById("AU_ID"), "Option Selected.  Redirecting.");
                event.onContentReady(form, OnFormLoad, "JavaScript Enabled.  Removing Submit Buttons.");
            };

            var _renderDate = function(date_str) {
                var d = new Date(date_str);
                var months = ["Janurary", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
                      days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];

                return days[d.getDay()] + ", " + months[d.getMonth()] + " " + d.getDate() + ", " + d.getFullYear();
            };

            catalog.AcadCal_Handler = function(form) {
                var yts = form.YearTermSelector;
                var tBody = new Element(document.getElementById('Academic_Calendar').tBodies[0]);

                var YTS_Change_AJAX_Handler = function(o) {
                    var build_string, split_array;
                    try {
                        var calendar_data = YAHOO.lang.JSON.parse(o.responseText);
                    } catch (e) {
                        window.location = catalog.permalink.getAttribute('href');
                        return;
                    }
                    var header = document.getElementById('subheader');
                    build_string = 'Academic Calendar for ';
                    switch (calendar_data.term) {
                        case 1:
                            build_string += 'Spring ';
                            break;
                        case 2:
                            build_string += 'Summer ';
                            break;
                        case 3:
                            build_string += 'Fall ';
                            break;
                    }
                    build_string += calendar_data.year;

                    header.innerHTML = build_string;
                    var tr, td, content;
                    for (var index = 0; index < calendar_data.events.length; index += 1) {
                        tr = new Element(document.createElement('tr'));
                        td = new Element(document.createElement('td'));
                        td.addClass('AcadCal_Description');
                        content = document.createTextNode(calendar_data.events[index].Description.toString()); //+ " " + calendar_data.events[index].AdditionalDescription);
                        td.appendChild(content);
                        tr.appendChild(td);
                        td = new Element(document.createElement('td'));
                        td.addClass('AcadCal_Date');
                        td.setAttributes({ 'nowrap': '' });
                        split_array = calendar_data.events[index].DateTime.split(/ /);
                        content = document.createTextNode(_renderDate(split_array.shift()));
                        td.appendChild(content);
                        if (calendar_data.events[index].TimeIsUsed) {
                            content = document.createElement('br');
                            td.appendChild(content);
                            content = document.createTextNode(split_array.join(' '));
                            td.appendChild(content);
                        }
                        tr.appendChild(td);
                        tBody.appendChild(tr);
                    }
                    tBody.get('element').deleteRow(0);
                    yts.disabled = false;
                };

                var OnYearTermSelector_Change = function() {
                    yts.disabled = true;
                    var year = yts.value.substring(0, 4);
                    var term = yts.value.substring(4, 5);

                    catalog.permalink.setAttribute('href', catalog.base_url + "/AcademicCalendar/" + year + "/" + term);

                    while (tBody.get('rows').length > 0) {
                        tBody.get('element').deleteRow(0);
                    }
                    var tr = document.createElement('tr');
                    tr.setAttribute("style", "text-align: center;");
                    var td = document.createElement('td');
                    td.setAttribute('colspan', '2');
                    var content = document.createElement('img');
                    content.setAttribute('src', '/Content/ajax-loader.gif');
                    content.setAttribute('alt', 'Loading...');
                    td.appendChild(content);
                    tr.appendChild(td);
                    tBody.appendChild(tr);
                    var base_url = catalog.base_url;
                    if (form.CampusSelect && form.CampusSelect.value !== "All") {
                        base_url = base_url.replace("General", form.CampusSelect.value);
                    }
                    connect.asyncRequest('GET', base_url + "/AJAX/CalendarEvents/" + year + "-" + term,
                    { success: YTS_Change_AJAX_Handler, failure: function(o) { window.location = catalog.permalink.getAttribute('href'); }, argument: [year, term] }, null);
                };
                // This variable is a fix for IE, since IE doesn't add new Elements to the document.forms[x] collection
                var OnFormLoad_ranOnce = false;
                var OnFormLoad = function() {
                    if (!OnFormLoad_ranOnce) {
                        form.removeChild(form.AC_Select);
                        form.AC_Select = null;
                        if (catalog.campus === "General") {
                            var cs = document.createElement('select');
                            cs.setAttribute('name', "CampusSelect");
                            form.insertBefore(cs, form.YearTermSelector);
                            connect.asyncRequest('GET', catalog.base_url + "/AJAX/ValidCalendarCampuses",
                            { success: function(o) {
                                try {
                                    var campuses = YAHOO.lang.JSON.parse(o.responseText);
                                } catch (e) {
                                    form.removeChild(cs);
                                    return;
                                }
                                var option;
                                for (var i = 0; i < campuses.length; ++i) {
                                    option = document.createElement('option');
                                    option.appendChild(document.createTextNode(campuses[i]));
                                    option.setAttribute('value', campuses[i]);
                                    cs.appendChild(option);
                                }
                                event.addListener(cs, "change", OnYearTermSelector_Change);
                            },
                                failure: function(o) {
                                    form.removeChild(cs);
                                }
                            }, null);
                        }
                    }
                    OnFormLoad_ranOnce = true;
                };

                event.addListener(yts, "change", OnYearTermSelector_Change);
                event.onAvailable(form, OnFormLoad);
            };

            catalog.Courses_Handler = function(form) {
                var keywords_textbox = form.keywords;
                var numbers_textbox = form.numbers;
                var ger_select = form.gercodes;
                var prefix_list_select = form.prefixes_list;
                var prefix_challenge_select = form.prefixes_challenge;

                var mousedown_time = 0;
                var mousedown_limit = 75;

                event.on(form, 'submit', function(e) { event.stopEvent(e); });

                var disableForm = function() {
                    keywords_textbox.disabled = true;
                    numbers_textbox.disabled = true;
                    ger_select.disabled = true;
                    prefix_list_select.disabled = true;
                    prefix_challenge_select.disabled = true;
                    form.prefixes_search.disabled = true;
                };

                var enableForm = function() {
                    keywords_textbox.disabled = false;
                    numbers_textbox.disabled = false;
                    ger_select.disabled = false;
                    prefix_list_select.disabled = false;
                    prefix_challenge_select.disabled = false;
                    form.prefixes_search.disabled = false;
                };

                var validateOnListEntry = function() {
                    if (numbers_textbox.value === '') { return true; }
                    var values = numbers_textbox.value.split('-');
                    if (values.length === 0) {
                        alert("Please enter at least one value for the Course Number");
                        return false;
                    } else if (values.length > 2) {
                        alert("You can only supply two values in the range.");
                        return false;
                    }

                    for (var i = 0; i < values.length; i += 1) {
                        var val = values[i];
                        if (isNaN(parseInt(val, 10))) {
                            alert("'" + val + "' is not a number.");
                            return false;
                        }
                        val = parseInt(val, 10);
                        if (val < 1 || val > 999) {
                            alert("Values must be between 1 and 999");
                            return false;
                        }
                        values[i] = val;
                    }
                    if (values.length === 2) {
                        numbers_textbox.value = values[0].toString() + "-" + values[1].toString();
                    } else {
                        numbers_textbox.value = values[0].toString();
                    }
                    return true;
                };

                var onChallegeSelected = function(e) {
                    disableForm();
                    var data = prefix_challenge_select.options[prefix_challenge_select.selectedIndex].text;
                    if (data !== '') {
                        window.location = catalog.base_url + "/Courses/ByChallengable/" +
                            data.replace(/ /, '_');
                    }
                };
                var onPrefixSelected = function(e) {
                    disableForm();
                    var data = prefix_list_select.options[prefix_list_select.selectedIndex].text;
                    if (data !== '') {
                        window.location = catalog.base_url + "/Courses/ByPrefix/" +
                            data.replace(/ /, '_').replace(/\//, '-').replace(/&/, '^');
                    }
                };
                var onGerSelected = function(e) {
                    disableForm();
                    var data = ger_select.options[ger_select.selectedIndex].text;
                    if (data !== '') {
                        window.location = catalog.base_url + "/Courses/ByGER/" + data;
                    }
                };

                var onKeywordsKeypress = function(e) {
                    var key;
                    if (e.which) {
                        key = e.which;
                    } else {
                        key = e.keyCode;
                    }

                    if (key === 13) {
                        disableForm();
                        window.location = catalog.base_url + "/Courses/BySearch/" +
                        keywords_textbox.value.replace(/ /g, '_');
                    }
                };

                var onListKeypress = function(e) {
                    var key;
                    if (e.which) {
                        key = e.which;
                    } else {
                        key = e.keyCode;
                    }
                    var prefix = form.prefixes_search;
                    if (key === 13) {
                        disableForm();
                        if (validateOnListEntry()) {
                            window.location = catalog.base_url + "/Courses/ByList/" +
                            prefix.value.replace(/ /, '_') + "/" +
                            numbers_textbox.value.replace(/ /, '_');
                        } else {
                            enableForm();
                        }
                    }
                    event.stopEvent(e);
                };

                var fixForm = function(e) {
                    var newOpt = document.createElement('option');
                    try {
                        prefix_list_select.add(newOpt, prefix_list_select.options[0]);
                    } catch (pls_e) {
                        prefix_list_select.add(newOpt, 0); // IE Workaround
                    }
                    prefix_list_select.selectedIndex = 0;
                    event.addListener(prefix_list_select, "change", onPrefixSelected);
                    prefix_list_select.parentNode.parentNode.removeChild(
                    prefix_list_select.parentNode.parentNode.cells[2]);

                    newOpt = document.createElement('option');
                    try {
                        prefix_challenge_select.add(newOpt, prefix_challenge_select.options[0]);
                    } catch (pcs_e) {
                        prefix_challenge_select.add(newOpt, 0); // IE Workaround
                    }
                    prefix_challenge_select.selectedIndex = 0;
                    event.addListener(prefix_challenge_select, "change", onChallegeSelected);
                    prefix_challenge_select.parentNode.parentNode.removeChild(
                    prefix_challenge_select.parentNode.parentNode.cells[2]);

                    newOpt = document.createElement('option');
                    try {
                        ger_select.add(newOpt, ger_select.options[0]);
                    } catch (gs_e) {
                        ger_select.add(newOpt, 0); // IE Workaround
                    }
                    ger_select.selectedIndex = 0;
                    ger_select.parentNode.parentNode.removeChild(
                    ger_select.parentNode.parentNode.cells[2]);
                    event.addListener(ger_select, "change", onGerSelected);

                    event.addListener(keywords_textbox, "keyup", onKeywordsKeypress);
                    keywords_textbox.parentNode.parentNode.removeChild(
                    keywords_textbox.parentNode.parentNode.cells[2]);
                    event.addListener(numbers_textbox, "keyup", onListKeypress);
                    numbers_textbox.parentNode.parentNode.removeChild(
                    numbers_textbox.parentNode.parentNode.cells[2]);

                    enableForm();
                };

                event.onDOMReady(fixForm);
            };

            for (var i = 0; i < document.forms.length; i = i + 1) {
                switch (document.forms[i].id) {
                    case "au_selector_form":
                        catalog.AcadUnitSelector_Handler(document.forms[i]);
                        break;
                    case "acad_cal_form":
                        catalog.AcadCal_Handler(document.forms[i]);
                        break;
                    case "courses_form":
                        catalog.Courses_Handler(document.forms[i]);
                        break;
                }
            }

            connect.asyncRequest('GET', catalog.base_url + "/AJAX/ValidCampuses", {
                success: function(o) {
                    try {
                        var campuses = YAHOO.lang.JSON.parse(o.responseText);
                    } catch (e) {
                        YAHOO.log("Error Parsing returned Campus Array.");
                        return;
                    }
                    var campus_link = new Element('chCampus');
                    var campus_xy = dom.getXY(campus_link.get('element'));
                    var toolbar = new Element('toolbar');

                    var oMenu = new YAHOO.widget.Menu("campus_menu", { position: 'dynamic', x: campus_xy[0], y: campus_xy[1] + campus_link.get('offsetHeight') + 2 });

                    var controller = window.location.pathname.replace(catalog.campus, '').replace(/^\/*/, '').split('/')[0] || "Home"; //*/
                    for (var index in campuses) {
                        if (campuses.hasOwnProperty(index)) {
                            oMenu.addItem({ text: campuses[index], url: "/" + campuses[index] + "/" + controller });
                        }
                    }

                    oMenu.render(toolbar);

                    oMenu.subscribe("show", oMenu.focus);

                    campus_link.on("click", function(e) {
                        oMenu.show();
                        event.stopEvent(e);
                    }, null, oMenu);
                    campus_link.set('href', '#');
                }
            }, null);
        }
    });

    loader.insert();
}