var Search = {};
Search.Model = (function(){
  
    var search_value = null;
    var search_results = null;
    var result_count = 0;
    var search_doc_id = null;
    var search_per_page = null;
    var search_sort = null;
    var search_type = null;
    var results_page = 1;
    var search_url = null;
    var show_thumbnails = null;
    var search_term_param_name = "search_term";
    var search_history = [];

    function get_search_results(fn_callback){
        $.get(encodeURI(DataSwitch.addLmParam(search_url)), function(data,textStatus){
            search_results = data;
            search_history.push({
                'search_value':search_value,
                'search_doc_id':search_doc_id,
                'search_sort':search_sort,
                'search_type':search_type,
                'results_page':results_page,
                'search_url':search_url
            });
        });
        
        if(typeof fn_callback == "function"){
            fn_callback.call(this);
        }
    }
    
    function preload_check(){
        var term = jQuery.url.param(search_term_param_name); 
        if(typeof term != "undefined"){
            Search.View.isDefaultValue = false;
            var preloadInterval = setInterval(function(){
                if(Drawer.View.firstTabLoaded == true){
                    clearInterval(preloadInterval);
                    setTimeout(function(){Search.Controller.search(term);},100);
                }
            },300)
        }
    }
  
    return {
        searchContainer: "#searchResults",
        drawerSearch: "#drawer_search", 
        searchForms: "form.search_form", 
        searchBoxes: "input[name='search_box']",
        searchTermSpan: "span.search_term",
        searchSubmits: "div.search_submit",
        searchResultsContainer: "#search_results_container",
        searchResultCount: ".search_result_count",
        advancedOptions: "#advanced_options",
        advancedOptionsLink: "#advanced_options_link a",
        paginationLinks: "a.pagination_link",
        submitButtonNavbar: "#navbar_search_submit",
    
        init: function(){
            setTimeout(function(){preload_check()},500);  
        }, 
        getSearchValue: function(){
            return search_value;
        },
        setSearchValue: function(value){
            if(Search.View.isDefaultValue===false){
                search_value = value;
            }
        },
        setSearchUrl: function(){
            value = this.getSearchValue();
            if(value){
               search_url = location.pathname + "/Search.action?search="+value;
                search_doc_id = $("#doc_id").val();
            if (search_doc_id) search_url = search_url + "&doc_id="+search_doc_id;
                search_per_page = parseInt($("#per_page").val());
                if (!isNaN(search_per_page)) search_url = search_url + "&per_page=" + parseInt(search_per_page);
                searchSort = $("#search_sort").val();
            if (searchSort) search_url = search_url + "&search_sort=" + searchSort;
                searchType = $("#search_type").val();
            if (searchType) search_url = search_url + "&search_type=" + searchType;    
                search_url = ((search_per_page * this.getResultsPage()) < (result_count + search_per_page)) 
                          ? search_url + "&results_page=" + results_page 
                          : search_url + "&results_page=1";

                // davis, marine corps and cerulli using collection_reference to search across collections
                searchCollectionRef = $('input[name=collection_ref]').val();
                if (searchCollectionRef) search_url = search_url + "&collection_ref=" + searchCollectionRef;
                         
                if(search_history.length == 0 || search_url != search_history[search_history.length-1]["search_url"]){
                  search_value = value;
                  return true;
                }
            }
            return false;
        },
        sendSearchRequest: function(fn_callback){
            search_results = get_search_results(fn_callback);
        },
        getResultsPage: function(){
            return results_page;
        },
        setResultsPage: function(value){
            advanced_option_change = true;
            results_page = new Number(value);
        },
        getSearchResults: function(){
            return search_results;
        },
        getSearchResultCount: function(){
            return result_count;
        },
        setSearchResultCount: function(value){
            result_count = parseInt(value);
        },
        getSearchResultsContainer: function(){
            return $(this.searchResultsContainer,this.searchContainer);
        }
    };
})();

Search.View = (function(){
    var m = Search.Model;
    var dm = Drawer.Model;
    
    function enable_search(){
        $(m.searchBoxes).unbind('focus').bind('focus',function(){
            if(m.getSearchValue() == "" || Search.View.isDefaultValue === true){
              $(this).val("");
            }
        }).unbind('blur').bind('blur',function(){
            val = $(this).val();
            if(Search.View.isDefaultValue===false && val != ""){
                m.setSearchValue(val);
            }else{
                var current_search_value = m.getSearchValue();
                if(current_search_value){
                    $(this).val(current_search_value);
                }else{
                    $(this).val("search");
                }
                Search.View.isDefaultValue = true;
            }
        }).unbind('keydown').bind('keydown',function(){
          if(Search.View.isDefaultValue===true){
            Search.View.isDefaultValue = false;
          }
        });
        $(m.searchForms).unbind('submit').submit(function(event){
            event.preventDefault();
            event.stopPropagation();
            Search.View.submitBehavior($(this)); 
        });
        $(m.searchSubmits).unbind('click').bind('click',function(){
            var parent_form = $(this).parents("form.search_form",m.searchContainer);
            Search.View.submitBehavior(parent_form); 
        });
        $(m.submitButtonNavbar).hover(
            function(){
               var src = $(this).attr("src");
               if(src.lastIndexOf("_on")==-1){ 
                   $(this).attr("src",src.replace("_off.gif","_on.gif")); 
               } 
            },
            function(){
               var src = $(this).attr("src");
               if(src.lastIndexOf("_on")!=-1){ 
                   $(this).attr("src",src.replace("_on.gif","_off.gif")); 
               } 
            }
        );
    }
    
    function init_pagination_links(){
        $(m.paginationLinks,m.searchContainer).unbind('click').click(function(event){
            event.preventDefault();
            Search.Model.setResultsPage($(this).attr("id").replace("resultsPage",""));
            Search.Controller.search(m.getSearchValue());
        });
    }
  
    function init_thumbnails_option(){
        if($("#toggle_thumbnails",m.searchContainer).attr("checked")){
            $(m.searchResultsContainer).addClass('hidden_thumbnails');
        }
        $("#toggle_thumbnails",m.searchContainer).unbind('click').click(function(event) {
            $("#toggle_thumbnails",m.searchContainer).attr("disabled","true");
            $(m.searchResultsContainer).toggleClass('hidden_thumbnails');
            $("#toggle_thumbnails",m.searchContainer).removeAttr("disabled");
            //Search.View.removeScrolling();
            //Search.View.initScrolling();
        });
    }
    
    function init_advanced_options(){
        $(m.advancedOptionsLink,m.searchContainer).unbind('click').bind('click',function(event){
          event.preventDefault(); 
          $(this).toggleClass("selected");
          $(m.advancedOptions,m.searchContainer).slideToggle(function(){
              Search.View.removeScrolling();
              Search.View.initScrolling();
          });
        });
    }
    function init_result_links(){
        $("a",$("#search_data_scroll")).unbind("click").click(function(){
            var href = $(this).attr("href");
            if(typeof href != "undefined" && href != ""){
                if(href.lastIndexOf(location.pathname)!=-1){
                	PageController.addChangePageCallback('Drawer.View.adjustWidth(Constants.closedDrawer);');
                    var page;
                    var pageKey = "pg=";
                    if(Offline.isOffline()){
                        pageKey = "#pg";
                    }
                    page = href.substr(href.lastIndexOf(pageKey)+3);
                    PageController.handleGoToPage(page);
                }else if (Offline.isOffline()){
                    return true;
                }else{
                    document.location.href = href + "&search_term="+m.getSearchValue(); 
                }                
            }
            return false; 
        });
    }
  
    return {
      isDefaultValue: true,
      
      init: function(){
	     $("div.scrollable").scrollable(); 
          enable_search();
          init_thumbnails_option();     
          init_pagination_links(); 
          init_advanced_options();
          init_result_links(); 
      },
      populateSearchResults: function(){
          var myinterval = setInterval(function(){
            if(typeof m.getSearchResults() != "undefined"){
                clearInterval(myinterval);
                m.getSearchResultsContainer().html(m.getSearchResults());
                m.getSearchResultsContainer().removeClass("has_scroller");   
                Search.View.updateSearchMeta();
                         
                var initInterval = setInterval(function(){
                    if($("ol",$("#searchResults")).length){
                        clearInterval(initInterval);
                        Search.View.initScrolling(); 
                        Search.View.init();
                    } 
                },49) 
                // overlay search highlights on page
                if(PageModel.documentContainerDiv.is('.zoomed')){
                  PageModel.getSearchHighlights(Search.Model.getSearchValue(), PageModel.getZoomInLevel());
                }else{
                  PageModel.getSearchHighlights(Search.Model.getSearchValue(), PageModel.getZoomLevel());
                }
            }
          },100);
        
      },
      activateSearchPanel: function(){
          PageElements.tabs[0].tabs('select',"searchResults");
      },
      updateSearchMeta: function(){
          $(m.searchBoxes).val(m.getSearchValue());
      },
      submitBehavior: function(form){
          Search.Controller.search($(m.searchBoxes,form).val());
          $("#jqContextMenu").next().hide().end().hide();
          return false;
      },
      startSearch: function(){
          $(m.getSearchResultsContainer()).html("").removeClass("has_scroller"); 
          $("#busy").show(); 
      },
      endSearch: function(){
          $("#busy").hide(); 
          setTimeout(function(){
        	  Tracker.trackPage({"category":"search","search_term":Search.Model.getSearchValue(),"pageName": document.location.protocol + "//" + document.location.host + location.pathname + "?t=Search&search="+Search.Model.getSearchValue(),"lochref":document.location.href});
          },0);
      },
      removeScrolling: function(){
          if(typeof Scroller.scrollers['search_data_scroll'] != 'undefined'){
              Scroller.scrollers['search_data_scroll'].destroy();
          }else if(typeof Scroller.scrollers['searchResults'] != 'undefined'){
              Scroller.scrollers['searchResults'].destroy();
          }
      },
      getHighlightHtml: function(pg, highlights){
        var html = '<div class="highlights" pg="' + pg + '">';
        $.each(highlights, function() {
            html += '<div align="left" class="pageHighlight" style="width: ' + this.w + 'px;';
            html += 'height:' + this.h + 'px;';
            html += 'left:' + this.x + 'px;';
            html += 'top:' + this.y + 'px;"></div>';
        });
        html += '</div>';
        return html;
      },
  
      initScrolling: function(){
        if(Drawer.View.resize_in_progress==true){
          var myinterval = setInterval(function(){
                  if(Drawer.View.resize_in_progress == false){
                      clearInterval(myinterval);
                      this.removeScrolling();
                      setTimeout(function(){ViewHelper.makeScrollable($("#search_data_scroll"))},0);
                  }
              },50);
          }else{
              this.removeScrolling();
            setTimeout(function(){ViewHelper.makeScrollable($("#search_data_scroll"))},0);
          }
      }
    }
})();

Search.Controller = (function(){
    var m = Search.Model;
    var v = Search.View;
   
    function search_offline(words, searchAny){
        var results = Offline.getSearchResults(words, searchAny); 
        show_search_results(results); 
    };

    function show_search_results(results){
        $("#search_pagination").remove();
        Search.Model.setSearchResultCount(results.length);
        if(results.length == 0){
            $("#search_result_count").text("");
            $("#search_data_scroll").html("");
            var p = document.createElement("p");
            p.setAttribute("id", "default_search_text");
            p.appendChild(document.createTextNode(DocumentProperties.getLanguageText().search.results.no_results));
            $("#search_data_scroll").append(p);
        } else {
            var text;
            if ( results.length == 1){
                text = "1 " + DocumentProperties.getLanguageText().search.results.total_singular;
            } else {
                text = "" + results.length + DocumentProperties.getLanguageText().search.results.total_plural;
            }
            $("#search_result_count").text(text);
            $("#search_data_scroll").html("");
            var ol = document.createElement("ol");
            $("#search_data_scroll").append(ol);
        
            $.each(results, function(i, result){
                var list = document.createElement('li');
                var html = '<a href="' + Offline.getDocumentPageUrl(result.documentUrl,  
                                                        result.pageNumber,
                                                        result.pageMode,
                                                        result.zoomLevel,
                                                        result.u1) 
                                        + '">';
                if(Offline.isOffline()){
                	$("#toggle_thumbnails").hide();
                } else {
                	html += '<img border="0" src="' + DocumentProperties.getStaticDomain() + result.thumbnail + '"/>';
                }
                html += '<span class="search_result_number">' + (i + 1) + ')</span>';
                html += result.title;
                html += '</a><br/>';
                html += 'Terms Matched: ' + result.termMatch + ' Matches: ' + result.matchCount + '<br/>';
                html += result.snippet;
           
                list.innerHTML = html;
                ol.appendChild(list); 
            });   
        }

        Search.View.initScrolling();
        Search.View.init();
        Search.View.updateSearchMeta();
    };

    return {
        init: function(){   
            m.init();
            v.init();
        },
        search: function(search_value){

            // online search 
            m.setSearchValue(search_value);
            //v.removeScrolling(); 

            if(Offline.isOffline()){

                search_offline(search_value, true);
                if($("#searchresults_tab a").hasClass("ui-tabs-selected")===false){
                    v.activateSearchPanel();
                }
                // overlay search highlights on page
                if(PageModel.documentContainerDiv.is('.zoomed')){
                  PageModel.getSearchHighlights(Search.Model.getSearchValue(), PageModel.getZoomInLevel());
                }else{
                  PageModel.getSearchHighlights(Search.Model.getSearchValue(), PageModel.getZoomLevel());
                }
                
                
            } else {
                if(m.setSearchUrl()){
                    v.startSearch(); 
                    m.sendSearchRequest(Search.Controller.updateView);
                }else{
                    if($("#searchresults_tab a").hasClass("ui-tabs-selected")===false){
                        v.activateSearchPanel();
                    }
                }
            }
        },
        updateView: function(){
            if(Drawer.View.open_tab && "#" + $(Drawer.View.open_tab.panel).attr("id") == m.searchContainer && Drawer.View.getCurrentSize() == Constants.fullDrawer){
                v.endSearch(); 
                v.populateSearchResults();
            }else{
                v.activateSearchPanel();
                var myinterval = setInterval(function(){
                    if(Drawer.View.resize_in_progress == false && $(Drawer.View.open_tab.panel).is(":visible")){
                        clearInterval(myinterval);
                        v.endSearch(); 
                        v.populateSearchResults();
                    }
                },100);
            } 
        }
    }
})();


/* */
/* SearchResult for offline search results get from google db */
/* */

function SearchResult(resultSet){

  this.documentUrl = resultSet.field(0);
  this.zoomLevel = resultSet.field(1);
  this.pageMode = resultSet.field(2);
  this.u1 = resultSet.field(8);
  this.pageNumber=resultSet.field(3);
  this.title=resultSet.field(4);
  this.thumbnail = resultSet.field(5);
  this.snippet = resultSet.field(6);
  var offsets = resultSet.field(7).split(' ');
  var terms = [];
  for(var i=1; i < offsets.length; i += 4 ){
       if(jQuery.inArray(offsets[i], terms) == -1){
           terms.push(offsets[i]);
       }
  }
  this.termMatch = terms.length;
  this.matchCount = offsets.length /4;

  this.toString = function(){
    return this.documentUrl + " | " + this.zoomLevel + " | " + this.pageMode
          + " | " + this.pageNumber + " | " + this.title
          + " | " + this.snippet + " | " + this.termMatch + " | " + this.matchCount;
  };
};



