
/*
*		Search
*/
Miso.search = {};
					
Miso.search.fadeSpeed = 150;
Miso.search.focusBroken = false;
Miso.search.currentSelection = null;
Miso.search.hoverSelection = null;
Miso.search.maxLiveSearchItems = 6;
Miso.search.numLiveSearchItems = 0;
Miso.search.searchDelay = 300;
Miso.search.searchPrompt = "What are you watching?";
Miso.search.searchPromptColor = "#999";
Miso.search.messageHandler = {};
Miso.search.resutsHovering = false;
	

Miso.search.init = function() {
	
    //don't load if there isn't a search box on the page
    if( $(".searchTextBox").length < 1 ) return;
    
	
    //search disabled for IE7
    if ( !($.browser.msie && $.browser.version.substr(0,1)<8) && Miso.search.liveSearchEnabled() ) {
        //search event
        
        // Register keypress events on the whole document
        $("#searchArea").keyup( function(e) {
          switch(e.which) { 
             // User pressed "up" arrow
             case 38:
                Miso.search.navigateUp(e);
                break;
             // User pressed "down" arrow
             case 40:
                Miso.search.navigateDown(e);
                break;
             // User pressed "enter"
             case 13:
                Miso.search.clickSelected(e);
                break;
             //escape key
             case 27:
             	Miso.search.clearResults(e);
               	break;
             default:
                Miso.search.queryChanged(e);
          }
    	});
    
    }
	
	
    //start out with an invisible results list
    Miso.search.clearResults(true);
	
    Miso.search.messageHandler = new Miso.message(Miso.search.searchPrompt,  $(".liveSearchbox"), Miso.search.searchPromptColor);
    Miso.search.messageHandler.init();
    
    //handle blur
	$(".liveSearchbox").blur( Miso.search.onBlur );

    //bind the submit function to the form
    $("#searchForm").bind('submit', Miso.search.checkSubmit );
       
}

Miso.search.onBlur = function(e) {
	
	//check to see if the mouse is over the search results
	// if it is, the user is probably selecting an item and we shouldn't clear
	
	
	if( !Miso.search.resutsHovering  )
	Miso.search.clearResults(e);
	
}


//see if there is a livesearch text field on the page
Miso.search.liveSearchEnabled = function() {
	//return false;
	return(  $(".liveSearchbox").length > 0 );
}


Miso.search.searchField = {

	isEmpty: function() {
		return (Miso.search.getQueryField() == "");
	},
	notEmpty: function() {
		return (Miso.search.getQueryField() != "");
	},
	isPrompt: function() {
		return (Miso.search.getQueryField() == Miso.search.searchPrompt);
	}, 
	setValue: function( value ) {
		$(".searchTextBox").val( value );
	}
	
}


Miso.search.navigateUp = function() {
    if( Miso.search.numLiveSearchItems < 1 ) return;
    else if( Miso.search.currentSelection == null ) { Miso.search.currentSelection = $("#searchresults").find(".searchResultContainer").last(); }
    else {
		var prev = Miso.search.currentSelection.prev(".searchResultContainer");
		if( prev.length > 0 ) Miso.search.currentSelection = prev;
		else { Miso.search.currentSelection = $("#searchresults").find(".searchResultContainer").last(); }
	}
    
    Miso.search.setSelected();
}


Miso.search.navigateDown = function() {
    if ( Miso.search.numLiveSearchItems < 1 ) return;
    else if( Miso.search.currentSelection == null ) { Miso.search.currentSelection = $("#searchresults").find(".searchResultContainer").first(); }
    else {
	    var next = Miso.search.currentSelection.next(".searchResultContainer");
	    if( next.length > 0 ) Miso.search.currentSelection = next;
	    else { Miso.search.currentSelection = $("#searchresults").find(".searchResultContainer").first(); }
        }
        
    Miso.search.setSelected();
}


Miso.search.clickSelected = function(e) {
  var currentSel = Miso.search.currentSelection;
	if(currentSel  == null || currentSel.hasClass('newMedia')) return;
	var linkHref = currentSel.find("a").attr("href");
	window.location =  linkHref;
}


Miso.search.setSelected = function() {
    var results = $("#searchresults").find(".searchResultContainer");
    
    results.removeClass("hover");
    Miso.search.currentSelection.addClass("hover");
}



Miso.search.checkSubmit = function(e) {
  var currentSel = Miso.search.currentSelection;
	if( currentSel != null && !currentSel.hasClass('newMedia')) 	{
		//if there is an item selected, stop the form submit event.
		e.preventDefault();
		return;
	} else if( Miso.search.searchField.isPrompt() || Miso.search.searchField.isEmpty() )  {
    	//if the search field is the prompt or the search field is empty, search for nothing.
    	
    	Miso.search.searchField.setValue("");
    	
    	//e.preventDefault();
		//return;
	}
	
	$("#searchForm").trigger('submit');
}





Miso.search.clearResults = function( anim ) {
    var speed = anim ? Miso.search.fadeSpeed : 0;
    
    $("#searchresults").empty();
	$("#searchresults").fadeTo(speed, 0.0);
    Miso.search.numLiveSearchItems = 0;
    Miso.search.currentSelection = null;
}


Miso.search.getQueryField = function() {
	return $.trim( $(".searchTextBox").val() );
}


Miso.search.queryChanged = function( e ) {
	
	var query = Miso.search.getQueryField();
	
	if( query == null || query.length < 1 ) {
		Miso.search.clearResults(true);
		return;
	}
	
	//clear the last search and start a new timeout
	clearTimeout(Miso.search.currentSearch);
	
	Miso.search.currentSearch = setTimeout( 'Miso.search.sendSearch();', Miso.search.searchDelay );
	
}



Miso.search.sendSearch = function( ) { 

	var query = Miso.search.getQueryField();
	
	if( query == null || query.length < 1 ) {
		Miso.search.clearResults(true);
		return;
	}

	//search
	$.ajax({
	  type: "GET",
	  async: "false",
	  url: $("#searchForm").attr("action"),
	  data: String("count=" + (Miso.search.maxLiveSearchItems-1) + "&q=" + query),
	  success: Miso.search.results,
	  error: Miso.search.error,
	  dataType: "html"
	});
		
		
}



Miso.search.results = function(data, text, request) {  
    
    //get out if there is no data
	if( data == null || data.length < 1 ) {
        Miso.search.clearResults(false);
        return; 
    }

    // clear results and leave if the query field is empty
    if( Miso.search.getQueryField() == "" ) { Miso.search.clearResults(false); return; }

	var results = $("#searchresults");
		
	data = jQuery(data).find(".searchResultContainer");
	 
	data = data.slice(0, Miso.search.maxLiveSearchItems);
    
	//do something special if there are no results
	if( data.length < 1 ) {
        //TODO: show no results message
        Miso.search.clearResults(false);
        return; 
    } else if( data.length > Miso.search.maxLiveSearchItems ) {
        //TODO: show message saying there are more
    }
    
    //show because we know we got something
    results.fadeTo(Miso.search.fadeSpeed, 1.0);
    
    Miso.search.numLiveSearchItems = data.length;

	results.html(data);
	
        
	results.find(".searchResultContainer").mouseenter(
                        function(e){ 
							$("#searchresults").find(".searchResultContainer").removeClass("hover");
                            $(this).addClass("hover");
							Miso.search.hoverSelection = $(this);
							Miso.search.currentSelection = $(this);
                         });    
                                                 
     //make this aware if the mouse is over the search results area
    results.find("li").mouseenter( function(e){ Miso.search.resutsHovering = true; } );
    results.find("li").mouseleave( function(e){ Miso.search.resutsHovering = false; } );
                    
                    
}



Miso.search.error = function( res, status, err ) {
	//what to do?
	var query = Miso.search.getQueryField();
	
	if( query == null || query.length < 1 ) {
		Miso.search.clearResults(true);
		return;
	}
}


		
$(document).ready( Miso.search.init );


