﻿MEDAILLE_CSE_ID = '016945536235769516245:km2qzizc9z0';

KEYS = {
    ARROWS : {
        LEFT : 37,
        UP : 38,
        RIGHT : 39,
        DOWN : 40
    },
    ENTER : 13,
    ESCAPE : 27,
    BACKSPACE : 8,
    DELETE : 46,
    A : 65,
    Z : 90,
    ZERO : 48,
    NINE : 57
};

(function(g, $){

g.load("search", "1");

var GoogleLoadSearch = function(){
    var $container = $("#search"),
        $trigger = $container.find("a"),
        $form = $container.find(".form").hide(),
        $options = $container.find(".options").hide(),
        $input = $form.find(":text"),
        $results = $form.find(".results");
        
    $container.css("visibility", "visible");
        
    var show = function(){
            if (pageTracker) pageTracker._trackEvent("Unified Search", "Opened");
            if ($.browser.msie) $("object").hide();
            $container.addClass("open");
            $form.show();
            focus();
        },
        hide = function(){
            if ($.browser.msie) $("object").show();
            $container.removeClass("open");
            $form.hide();
        },
        toggle = function(){
            if ( $form.is(":visible") ){
                return hide.apply(this, arguments);
            }
            return show.apply(this, arguments);
        },
        focus = function(){
            $input[0].focus();
            $input[0].select();
        },
        blur = function(){
            $input[0].blur();
        };
    
    $(document.body).append( $form.remove() );
    
    $form.css({
        position:"absolute",
        top:$trigger.offset().top + $trigger.height() - 15, 
        left:"50%", marginLeft : 960 / 2 - $form.width() });
    
    $(document.body).bind("click.search", function() { hide(); });
    $form.bind("click.search", function(e){ e.stopPropagation(); });
        
    $trigger.bind("click", function(e) { e.stopPropagation(); toggle(); } );
    
        
        
    var customWebSearch = new g.search.WebSearch();
    var directorySearch = null;
    
    var searchComplete = function() {
        $results.empty();
        
        
        if (customWebSearch.promotions){
            $.each(customWebSearch.promotions, function(i,r){
                $("<div />")
                    .addClass("promotion")
                    .append(
                        $("<a />")
                            .html(r.title)
                            .attr("href", r.url)
                            .click( function() { if (pageTracker) pageTracker._trackEvent("Unified Search", "Clicked", "promotion"); })
                    )
                    .appendTo($results);
            });
        }
        
        if (directorySearch && directorySearch[0] && directorySearch[0].Relevancy > .8) {
        $("<h6>Campus Directory</h6>").appendTo( $results );
            var i = 0;
            while (directorySearch[i] && directorySearch[i].Relevancy > .8 && i < 4){
                $("<div />")
                    .append(
                        $("<a />")
                            .text(directorySearch[i].Name.First + " " + directorySearch[i].Name.Last)
                            .attr("href", "mailto:" + directorySearch[i].EmailAddress)
                            .click( function() { if (pageTracker) pageTracker._trackEvent("Unified Search", "Clicked", "directory"); })
                    )
                    .append(
                        $("<p />")
                            .append( (directorySearch[i].Job || directorySearch[i].Major) + "<br />")
                            .append( (directorySearch[i].Department || directorySearch[i].AcademicProgram) + "<br />")
                            .append( (directorySearch[i].EmailAddress) + "<br />")
                            .append( (directorySearch[i].Phone && directorySearch[i].Phone.Number1) || "")
                    )
                    .appendTo( $results );
                    
                i++;
            }
        }
        
        if (customWebSearch.results && customWebSearch.results.length > 0) {
            $("<h6>Site Search by Google</h6>").appendTo( $results);
            if (customWebSearch.cursor && customWebSearch.cursor.currentPageIndex > 0){
                $("<a />")
                    .addClass("pager")
                    .bind("click", function(){
                        customWebSearch.gotoPage(0);
                        return false;
                    })
                    .text("First results")
                    .attr("href", "#")
                    .appendTo($results);
            }
            if (customWebSearch.cursor && customWebSearch.cursor.currentPageIndex > 1){
                $("<a />")
                    .addClass("pager")
                    .bind("click", function(){
                        customWebSearch.gotoPage(customWebSearch.cursor.currentPageIndex - 1);
                        return false;
                    })
                    .text("Prev. results")
                    .attr("href", "#")
                    .appendTo($results);
            }
            for (var i = 0; i < customWebSearch.results.length; i++){
                var thisResult = customWebSearch.results[i];
                $("<div />")
                    .addClass("google")
                    .append(
                        $("<a />")
                            .html(thisResult.title)
                            .attr("href", thisResult.unescapedUrl)
                            .click( function() { if (pageTracker) pageTracker._trackEvent("Unified Search", "Clicked", "google"); })
                    )
                    .append( $("<p />").html(thisResult.content + "<br />" + thisResult.visibleUrl) )
                    .appendTo($results);
            }
            if (customWebSearch.cursor && customWebSearch.cursor.currentPageIndex < customWebSearch.cursor.pages.length - 1){
                $("<a />")
                    .addClass("pager")
                    .bind("click", function(){
                        customWebSearch.gotoPage(customWebSearch.cursor.currentPageIndex + 1);
                        return false;
                    })
                    .text("Next results")
                    .attr("href", "#")
                    .appendTo($results);
            }
        }
    }
    
    
    var invokeSearch = function(){
        if ($input.val() == "") return;
        
        if (pageTracker) pageTracker._trackEvent("Unified Search", "Searched", $input.val() );
        
        customWebSearch.execute( $input.val() );
        var doneLoading = $.loadingWait();
        $.ajax({
            url:"/CampusDirectoryService.asmx/SearchDirectoryWithType",
            data:$.jsonSerialize({text:$input.val(), personType:(($form.find("#showStudentsInDirectory")[0].checked) ? 7 : 6) }),
            success:function(r){
                doneLoading();
                directorySearch = r.d;
                searchComplete();
            },
            error : function(){
                doneLoading();
                directorySearch = null;
            }    
        });

    }
    
    var searchTimeout;
    
    $input.bind("keyup", function(e){
        if ($results.is(":has(div.selected)") && e.keyCode == KEYS.ENTER) //enter
        {
            window.location = $results.find("> div.selected > a:first").attr("href");
            return;
        } 
        if ( (e.keyCode || e.which) == KEYS.ESCAPE ) //esc
        {
            hide();
            return;
        }
        if (e.keyCode == KEYS.ARROWS.UP || e.keyCode == KEYS.ARROWS.DOWN) {
            var results = $results.find("> div"),
                selected = $results.find("> div.selected");
            
            var change = 0;
            switch (e.keyCode) {
                case KEYS.ARROWS.UP:
                    change = -1;
                    break;
                case KEYS.ARROWS.DOWN:
                    change = 1;
                    break;
            }
            if ( !(results.index(selected) == 0 && change == -1) ) {
                // add results.length since -1 % results.length == -1 instead of  == results.length - 1
                $( results[ (results.index(selected) + results.length + change) % results.length ] ).addClass("selected")
            }
            selected.removeClass("selected");
            return;
        }
        
        if ((e.keyCode >= KEYS.A && e.keyCode <= KEYS.Z) || (e.keyCode >= KEYS.ZERO && e.keyCode <= KEYS.NINE)  || e.keyCode == KEYS.BACKSPACE || e.keyCode == KEYS.DELETE ) {
            if (searchTimeout) window.clearTimeout(searchTimeout);
            searchTimeout = setTimeout(invokeSearch, 500);
        }
    });
    
    
    customWebSearch.setSiteRestriction(MEDAILLE_CSE_ID);
    customWebSearch.setSearchCompleteCallback(customWebSearch, searchComplete);
    $form.find("input").bind("change", invokeSearch);
};

g.setOnLoadCallback(GoogleLoadSearch);
})(google, jQuery)