var _searchFormLocales = {};
_searchFormLocales.it = {
  inputDefaultText: "Cerca...",
  queryTooShort:    "La query di ricerca è troppo corta (minimo %d caratteri)", 
  loadingResults:   "Ricerca in corso...",
  error:            "Si è verificato un errore durante l'operazione di ricerca."
};

$(function(){
  var _searchForm = function(opts){
    var obj = this;
    var defaults = {};
    defaults.lang = "it";
    defaults.inputSelector = "#searchInput";
    defaults.buttonSelector = "#searchButton";
    defaults.resultSelector = "#searchResultWrapper";
    defaults.paginationSelector = ".searchPaginationLink";
    defaults.searchEngineUrl = null;
    defaults.searchUrl = null;
    defaults.searchQueryName = "q";
    defaults.beforeSend = function(data){ return data; };
    defaults.afterSuccess = function(){};
    
    obj.opts = $.extend({}, defaults, opts);
    obj.lang = _searchFormLocales[obj.opts.lang];

    var $input = $(obj.opts.inputSelector);
    var $button = $(obj.opts.buttonSelector);
    var $result = $(obj.opts.resultSelector);

    // focus substitutions
    $input.focusin(function(){
       if($(this).val() == obj.lang.inputDefaultText) $(this).val("");
    });    
    $input.focusout(function(){
       if($(this).val().length == 0) $(this).val(obj.lang.inputDefaultText);
    });  

    // fixes asp.net single form architecture mess
    $input.keydown(function(e){
      if(e.keyCode == 13 && $input.val() != null && $input.val().length > 0 && $input.val() != obj.lang.inputDefaultText){
        $button.click();
        return false;
      }
    });
    
    if(obj.opts.searchUrl != null){
      $button.click(function(){
        var searchString = $input.val();
        if(searchString != null){
          searchString = searchString.trim();
            if(searchString.length > 0 && searchString != obj.lang.inputDefaultText){
              window.location.href = obj.opts.searchUrl + "?" + obj.opts.searchQueryName + "=" + escape(searchString);   
            }               
        }

        return false;
      });      
    }else{
      var sendData = function(data){  
        $button.data('oldLabel', $button.html());
        $button.html("<img src='/images/ajaxloading.gif' alt='" + obj.lang.loadingResults + "' border='0'/>");
        
        var searchData = {};
        searchData[obj.opts.searchQueryName] = $input.val();     
        searchData = obj.opts.beforeSend(searchData);
        searchData = $.extend({}, data, searchData);
        
        $.ajax({
          async: true,
          cache: false,
          data: searchData,
          dataType: "html",
          context: document.body,
          type: "post",
          url: obj.opts.searchEngineUrl,
          success:  sendSuccess,
          error: function(XMLHttpRequest, textStatus, errorThrown){
            $result.html(obj.lang.error);  
            $result.slideDown(500);
          }
        });
        
        return false;
      };
                    
      var sendSuccess = function(data, textStatus, XMLHttpRequest){
        $button.html($button.data('oldLabel'));
        $result.html(data);
        obj.opts.afterSuccess();
        
        // add events for paginator
        $(obj.opts.paginationSelector).click(function(){
            var page = parseInt($(this).attr('rel'));          
            if(page == 'NaN') page = 0;   
            
            sendData({ "page": page });
        });
        
        
        $result.slideDown(500);          
      };
      
      $button.click(function(){
          sendData({}); 
      });            
    }


    // auto submit if search query has been passed by global search form
    if($input.val() != null && $input.val().length > 0 && $input.val() != obj.lang.inputDefaultText){
      $button.click();
    }      
  };

  // extends jquery
  $.extend({
    searchForm: function(opts){
      var toggler = new _searchForm(opts);
    }
  });    
  // -- search
});

