﻿iyuda.search = {
    _schools: [],
    _schoolsForCreate: [],
    _classes: [],
    _currPage: 1,
    _maxDisplay: 20,
    _isLoaded: false,
    searchClicked: false,
    _schoolClassCreated: null,
    _classJustCreated: false,
    _hoverClassGID: -1,

    init: function() {
        IS._autocompleteLoad();

        //btnSearchUpdate.disabled = true;

        $j(window).history(function(e, hash) { //alert(' ');
            if (hash == '') {
                hash = 'default';
            }
            //alert(hash);
            if (hash.substring(0, 6) == 'school') {
                var school = hash.substring(7, hash.indexOf('-'));
                var omniIndex = hash.indexOf('omni=');
                var omni = null;
                if (omniIndex != -1) {
                    var str = hash.substring(omniIndex);
                    omni = str.substring(5, str.indexOf('-'));
                }
                var page = hash.substring(hash.lastIndexOf('-') + 1, hash.length);
                if ((tbSearchSchool.value != school) && (omniIndex != -1) && (tbSearchOmni.value != omni)) {
                    tbSearchSchool.value = school;
                    tbSearchOmni.value = omni;
                    IS._isLoaded = false;
                    IS.omniSearch();
                }
                else if ((tbSearchSchool.value != school) && (omniIndex == -1)) {
                    tbSearchSchool.value = school;
                    IS._isLoaded = false;
                    IS.omniSearch();
                }
                else if ((tbSearchSchool.value == school) && (omniIndex != -1) && (tbSearchOmni.value != omni)) {
                    tbSearchOmni.value = omni;
                    IS._isLoaded = false;
                    IS.omniSearch();
                }
                else {
                    if (page < IS._currPage) IS.classesBack();
                    else if (page > IS._currPage) IS.classesNext();
                }
            }
            else if (hash.substring(0, 4) == 'omni') {
                var omni = hash.substring(5, hash.indexOf('-'));
                var page = hash.substring(hash.lastIndexOf('-') + 1, hash.length);
                if (tbSearchOmni.value != omni) {
                    tbSearchOmni.value = omni;
                    IS._isLoaded = false;
                    IS.omniSearch();
                }
                else if (tbSearchOmni.value == omni) {
                    if (page < IS._currPage) IS.classesBack();
                    else if (page > IS._currPage) IS.classesNext();
                }
            }
        });

        if (!IS._isLoaded) {
            var url = '' + window.location;
            
            //alert(url);
            var schoolIndex = url.indexOf('#school=');
            var htmlIndex = url.indexOf('.html');
            var school = null;
            if (schoolIndex != -1) {
                if (htmlIndex != -1) { // Adding this so we can handle our linkfreezed URLs
                    school = url.substring(url.indexOf('#school=') + 8, url.indexOf('-page')); // Take into account the extra dashes
                }
                else {
                    school = url.substring(url.indexOf('#school=') + 8, url.indexOf('-')); // Normal aka original method
                    alert(school);
                }
            }
            var omniIndex = url.indexOf('omni=');
            var omni = null;
            if (omniIndex != -1) {
                omni = url.substring(url.indexOf('omni=') + 5);
            }
            if (omni) {
                omni = omni.substring(0, omni.indexOf('-'));
                if (tbSearchOmni.value != omni) {
                    tbSearchOmni.value = omni;
                }
                else {

                }
            }
            if (school) {
                if (tbSearchSchool.value != school) {
                    tbSearchSchool.value = school;
                }
                else {

                }
            }
            if ((school) || (omni)) IS.omniSearch();
        }
    },

    _autocompleteLoad: function() {
        $('searchStatus').style.color = 'red';
        $('searchStatus').innerHTML = 'Loading...';
        tbSearchSchool.disabled = true;
        tbSearchOmni.disabled = true;
        ibCreateClass.disabled = true;
        wsClassRooms.getSchoolsForAutoComplete(IS._getSchoolsSuccess, IS._getSchoolsFailure);
    },

    _getSchoolsSuccess: function(result) {
        if (result) {
            for (var i = 0; i < result.length; i++) {
                IS._schools.push(result[i].schoolName + ' (# of Classes: ' + result[i].numClasses + ')');
                IS._schoolsForCreate.push(result[i].schoolName);
            }

            // Autocomplete 
            $j('#tbSearchSchool').autocomplete(IS._schools);
            $j('#tbSearchSchool').result(function(event, data, formatted) {
                var school = '' + data;
                school = school.substring(0, school.indexOf('(') - 1);
                tbSearchSchool.value = school;
                tbSearchOmni.focus();
                return false;
            });
            $j('#tbCreateSchool').autocomplete(IS._schoolsForCreate);
            $j('#tbCreateSchool').result(function(event, data, formatted) {
                tbCreateCourseName.focus();
                return false;
            });

            $('searchStatus').innerHTML = '';

            if (IS._classJustCreated) {
                tbSearchSchool.value = IS._schoolClassCreated;
                tbSearchOmni.value = '';
                IS._classJustCreated = false;
                IS.omniSearch();
            }

            tbSearchSchool.disabled = false;
            tbSearchOmni.disabled = false;
            ibCreateClass.disabled = false;
            tbSearchSchool.focus();
        }
    },

    tbSearchSchoolChange: function() {
        //if (tbSearchSchool.value != '') {
        //    btnSearchUpdate.disabled = false;
        //}
        //else {
        //    btnSearchUpdate.disabled = true;
        //}
        $('searchStatus').innerHTML = '';
        return false;
    },

    omniSearch: function() {
        if ((tbSearchSchool.value != '') && (tbSearchOmni.value != '')) {
            IS._searching();
            wsClassRooms.getClassesBySchoolAndOmni(tbSearchSchool.value, tbSearchOmni.value, IS._getClassesSuccess, IS._getClassesFailure);
        }
        else if ((tbSearchSchool.value != '') && (tbSearchOmni.value == '')) {
            IS._searching();
            wsClassRooms.getClassesBySchool(tbSearchSchool.value, IS._getClassesSuccess, IS._getClassesFailure);
        }
        else if ((tbSearchSchool.value == '') && (tbSearchOmni.value != '')) {
            IS._searching();
            wsClassRooms.getClassesByOmni(tbSearchOmni.value, IS._getClassesSuccess, IS._getClassesFailure);
        }
        else if ((tbSearchSchool.value == '') && (tbSearchOmni.value == '')) {
            $('searchStatus').style.color = 'red';
            $('searchStatus').innerHTML = 'No search criteria entered.';
        }
        return false;
    },

    _searching: function() {
        btnSearchUpdate.disabled = true;
        $('searchPager').hide();
        $('resultsWrapper').innerHTML = '';
        $('resultsWrapper').hide();
        $('searchStatus').style.color = 'red';
        $('searchStatus').innerHTML = 'Searching...';
    },

    _getClassesSuccess: function(result) {
        if (result) {
            if (result.length > 0) {
                IS._classes = result;
                IS._currPage = 1;

                // Build list of classes
                var lastClass = (result.length > IS._maxDisplay) ? IS._maxDisplay : result.length;
                var tbl = IS._buildClassesTbl(0, lastClass);
                $('resultsWrapper').appendChild(tbl);
                var imgBtns = $('tblClasses').getElementsByTagName('img');
                for (var i = 0; i < imgBtns.length; i++) {
                    $j(imgBtns[i]).bind("mouseenter mouseleave", function(e) { this.className = (this.className == 'opaque') ? 'btnHover' : 'opaque'; }); //$j(this).toggleClass('btnHover'); });
                }
                $j('#tblClasses').columnFilters({ excludeColumns: [2, 3] });

                // Build the pager
                var end = (result.length < IS._maxDisplay) ? result.length : IS._maxDisplay;
                $('pagerBack').hide();
                $('pagerNext').hide();
                if (end < (result.length - 1)) $('pagerNext').show();
                $('pagerDetails').innerHTML = '1 - ' + end + ' of ' + result.length + ' Classes';
                $('pagerBack').hide();
                $('searchPager').show();
            }
            else {
                $('resultsWrapper').innerHTML = 'No classes found.';
            }

            $('searchStatus').style.color = 'green';
            $('searchStatus').innerHTML = 'Search complete.';
            btnSearchUpdate.disabled = false;

            // Manage history for searches
            if (!IS._isLoaded) {
                //alert('first if');
                var url = '' + window.location;
                var page = url.substring(url.lastIndexOf('-') + 1, url.length);
                //alert(page);
                if ((!IS.searchClicked) && (page > IS._currPage)) {
                    for (var i = IS._currPage; i < page; i++) {
                        IS.classesNext();
                    }
                }
                else {
                    //alert('else');
                    if ((tbSearchSchool.value != '') && (tbSearchOmni.value != '')) {
                        $j.history.add('school=' + tbSearchSchool.value + '-omni=' + tbSearchOmni.value + '-page-' + '1');
                        document.title = 'iyuda | Find classes and documents at ' + tbSearchSchool.value;
                    }
                    else if ((tbSearchSchool.value != '') && (tbSearchOmni.value == '')) {
                        $j.history.add('school=' + tbSearchSchool.value + '-page-' + '1');
                        document.title = 'iyuda | Find classes and documents at ' + tbSearchSchool.value;
                    }
                    else if ((tbSearchSchool.value == '') && (tbSearchOmni.value != '')) {
                        $j.history.add('omni=' + tbSearchOmni.value + '-page-' + '1');
                        document.title = 'iyuda | Find your classes and documents by college.';
                    }
                }
            }
            $('resultsWrapper').show();
            IS._isLoaded = true;
            IS.searchClicked = false;
        }
    },

    _getClassesFailure: function(error) {
        $('searchStatus').style.color = 'red';
        $('searchStatus').innerHTML = 'Search failed.  Please try again.';
        btnSearchUpdate.disabled = false;
    },

    classesBack: function() {
        var nextClass = (IS._maxDisplay * --IS._currPage) - IS._maxDisplay;
        var lastClass = nextClass + IS._maxDisplay;
        //if (lastArticle > SN._articles.length) lastArticle = SN._articles.length;

        var tbl = IS._buildClassesTbl(nextClass, lastClass);

        if ($('tblClasses')) $('resultsWrapper').innerHTML = '';
        $('resultsWrapper').appendChild(tbl);
        $j('#tblClasses').columnFilters({ excludeColumns: [2, 3] });

        // Build pager
        if (nextClass > 0) {
            $('pagerBack').style.display = 'inline';
        }
        else {
            $('pagerBack').hide();
        }
        $('pagerDetails').innerHTML = (nextClass + 1) + ' - ' + lastClass + ' of ' + IS._classes.length + ' Classes';
        $('pagerNext').style.display = 'inline';

        // Manage history for searches
        if ((tbSearchSchool.value != '') && (tbSearchOmni.value != '')) {
            $j.history.add('school=' + tbSearchSchool.value + '-omni=' + tbSearchOmni.value + '-page-' + IS._currPage);
            document.title = 'iyuda | Find classes and documents at ' + tbSearchSchool.value;
        }
        else if ((tbSearchSchool.value != '') && (tbSearchOmni.value == '')) {
            $j.history.add('school=' + tbSearchSchool.value + '-page-' + IS._currPage);
            document.title = 'iyuda | Find classes and documents at ' + tbSearchSchool.value;
        }
        else if ((tbSearchSchool.value == '') && (tbSearchOmni.value != '')) {
            $j.history.add('omni=' + tbSearchOmni.value + '-page-' + IS._currPage);
            document.title = 'iyuda | Find your classes and documents by college.';
        }

        return false;
    },


    classesNext: function() {
        var nextClass = (IS._maxDisplay * IS._currPage);
        var lastClass = IS._maxDisplay * ++IS._currPage;
        if (lastClass > IS._classes.length) lastClass = IS._classes.length;

        var tbl = IS._buildClassesTbl(nextClass, lastClass);

        if ($('tblClasses')) $('resultsWrapper').innerHTML = '';
        $('resultsWrapper').appendChild(tbl);
        $j('#tblClasses').columnFilters({ excludeColumns: [2, 3] });

        // Build pager
        if (lastClass < IS._classes.length) {
            $('pagerNext').style.display = 'inline';
        }
        else {
            $('pagerNext').hide();
        }
        $('pagerDetails').innerHTML = (nextClass + 1) + ' - ' + lastClass + ' of ' + IS._classes.length + ' Classes';
        $('pagerBack').style.display = 'inline';

        // Manage history for searches
        if ((tbSearchSchool.value != '') && (tbSearchOmni.value != '')) {
            $j.history.add('school=' + tbSearchSchool.value + '-omni=' + tbSearchOmni.value + '-page-' + IS._currPage);
            document.title = 'iyuda | Find classes and documents at ' + tbSearchSchool.value;
        }
        else if ((tbSearchSchool.value != '') && (tbSearchOmni.value == '')) {
            $j.history.add('school=' + tbSearchSchool.value + '-page-' + IS._currPage);
            document.title = 'iyuda | Find classes and documents at ' + tbSearchSchool.value;
        }
        else if ((tbSearchSchool.value == '') && (tbSearchOmni.value != '')) {
            $j.history.add('omni=' + tbSearchOmni.value + '-page-' + IS._currPage);
            document.title = 'iyuda | Find your classes and documents by college.';
        }

        return false;
    },

    _buildClassesTbl: function(nextClass, lastClass) {
        var tbl = document.createElement('table');
        tbl.id = 'tblClasses';
        tbl.border = 0;
        tbl.cellSpacing = 0;
        tbl.cellPadding = 0;
        var thd = document.createElement('thead');
        tbl.appendChild(thd);
        var tbdy = document.createElement('tbody');
        tbl.appendChild(tbdy);

        // Build header
        var hdrRow = document.createElement('tr');
        var th1 = document.createElement('th');
        th1.appendChild(document.createTextNode('Class'));
        hdrRow.appendChild(th1);
        var th2 = document.createElement('th');
        th2.appendChild(document.createTextNode('Course No.'));
        hdrRow.appendChild(th2);
        var th3 = document.createElement('th');
        th3.appendChild(document.createTextNode('School'));
        hdrRow.appendChild(th3);
        var th4 = document.createElement('th');
        th4.appendChild(document.createTextNode('Actions'));
        th4.style.borderRight = '0';
        th4.style.textAlign = 'center';
        hdrRow.appendChild(th4);
        thd.appendChild(hdrRow)

        // Loop through classes and add them
        for (var i = nextClass; i < lastClass; i++) {
            var tr = document.createElement('tr');
            var td1 = document.createElement('td');
            td1.className = ((i % 2) == 0) ? 'searchResultsRow' : 'searchResultsRowAlt';
            td1.appendChild(document.createTextNode(IS._classes[i].className));
            td1.innerHTML += '<br />';
            td1.appendChild(document.createTextNode('# of documents: ' + IS._classes[i].numDocs));
            td1.innerHTML += '<br />';
            var prof = '<span class="profLink" id=\"class' + IS._classes[i].classGID + '\" onclick=\"return IS.showProfs(' + IS._classes[i].classGID + ');\" style=\"cursor: pointer;\">+ View Professors</span>';
            td1.innerHTML += prof;
            var hover = '<div style=\"position: relative;\"><div class=\"profHover\" style=\"display: none;\" id=\"hover' + IS._classes[i].classGID + '\"></div></div>';
            td1.innerHTML += hover;
            tr.appendChild(td1);
            var td2 = document.createElement('td');
            td2.className = ((i % 2) == 0) ? 'searchResultsRow' : 'searchResultsRowAlt';
            td2.appendChild(document.createTextNode(IS._classes[i].classNumber));
            tr.appendChild(td2);
            var td3 = document.createElement('td');
            td3.className = ((i % 2) == 0) ? 'searchResultsRow' : 'searchResultsRowAlt';
            td3.appendChild(document.createTextNode(IS._classes[i].schoolName));
            tr.appendChild(td3);
            var td4 = document.createElement('td');
            td4.className = ((i % 2) == 0) ? 'searchResultsRow' : 'searchResultsRowAlt';
            td4.style.border = '0';
            td4.style.textAlign = 'center';
            var a = '<a href=\"../class/default.aspx?classID=' + IS._classes[i].classGID + '\"><img src=\"http://iyuda.com/images/button-ViewClass.gif\" class=\"opaque\" alt=\"View Class\" style=\"border: 0;\" /></a>';
            td4.innerHTML = a;
            tr.appendChild(td4);
            tbdy.appendChild(tr);
        }

        return tbl;
    },

    showProfs: function(classGID) {
        if ($('class' + classGID).innerHTML == '+ View Professors') {
            $('class' + classGID).innerHTML = '- Hide Professors';
            IS._hoverClassGID = classGID;
            wsClassRooms.getProfsForClass(classGID, IS._getProfsSuccess, IS._getProfsFailure);
        }
        else {
            $('class' + classGID).innerHTML = '+ View Professors';
            $j('#hover' + IS._hoverClassGID).slideUp();
        }
        return false;
    },

    _getProfsSuccess: function(result) {
        if (result) {
            var spans = $$('.profLink');
            var divs = $$('.profHover.');
            for (var i = 0; i < divs.length; i++) {
                if (divs[i].id != ('hover' + IS._hoverClassGID)) {
                    spans[i].innerHTML = '+ View Professors';
                    divs[i].hide();
                }
            }
            var profs = '';
            for (var i = 0; i < result.length; i++) {
                if (result[i].name) {
                    profs += result[i].name;
                }
                if ((i + 1) != result.length) profs += '<br />';
            }
            $('hover' + IS._hoverClassGID).innerHTML = profs;
            $('hover' + IS._hoverClassGID).style.zIndex = 1000;
            $j('#hover' + IS._hoverClassGID).slideDown();
        }
    },

    _getProfsFailure: function(error) {

    },

    /***** Create Class Functions *****/
    showCreateClass: function() {
        $find('mpeCreateClassBehavior').show();
        $('tbCreateSchool').focus();
        return false;
    },

    createClass: function() {
        if ((isLoggedIn) && (userName) && (Page_ClientValidate('creatClassVG'))) {
            ibCreateClassSubmit.disabled = true;
            ibCancelCreateClass.disabled = true;
            var isValidSchool = false;
            for (var i = 0; i < IS._schoolsForCreate.length; i++) {
                if ($('tbCreateSchool').value == IS._schoolsForCreate[i]) {
                    isValidSchool = true;
                    i = IS._schoolsForCreate;
                }
            }
            if (!isValidSchool) {
                alert('Not a valid school.  Please select one from the list.');
                $('tbCreateSchool').focus();
                ibCreateClassSubmit.disabled = false;
                ibCancelCreateClass.disabled = false;
            }
            else {
                var term = ddlAddTerm.options[ddlAddTerm.selectedIndex].text;
                wsClassRooms.createClass($('tbCreateSchool').value, tbCreateCourseName.value, tbCreateProfName.value, term, tbCreateCourseNum.value, userName, IS._createClassSuccess, IS._createClassFailure);
            }
        }
        return false;
    },

    cancelCreateClass: function() {
        IS._closeCreateClass();
        return false;
    },

    _closeCreateClass: function() {
        $find('mpeCreateClassBehavior').hide();
        $('tbCreateSchool').value = '';
        tbCreateCourseName.value = '';
        tbCreateProfName.value = '';
        tbCreateCourseNum.value = '';
        return false;
    },

    _createClassSuccess: function(result) {
        if (result) {
            alert(tbCreateCourseName.value + ' has been added.');
            IS._schoolClassCreated = $('tbCreateSchool').value;
            IS._classJustCreated = true;
            IS._closeCreateClass();
            IS._autocompleteLoad();
            ibCreateClassSubmit.disabled = false;
            ibCancelCreateClass.disabled = false;
        }
        return false;
    },

    _createClassFailure: function(error) {
        alert(error._get_message());
        ibCreateClassSubmit.disabled = false;
        ibCancelCreateClass.disabled = false;
    }

};