// $Id$

//workaround for IE
var console = console || {};
console.log = console.log || function(){};
console.debug = console.debug || function(){};

(function ($) {

/**
 * Old version of Pager Widget with dropdown list of page links.
 * A pager widget for jQuery. FBC version
 */
FBC.widgets.UserInputPagerWidget = AjaxSolr.AbstractWidget.extend(
  /** @lends AjaxSolr.PagerWidget.prototype */
  {
  /**
   * The current page number.
   *
   * @field
   * @private
   * @type Number
   */
  currentPage: null,

  /**
   * The total number of pages.
   *
   * @field
   * @private
   * @type Number
   */
  totalPages: null,


    clickHandler: function (page) {
        this.manager.store.get('start').val((page - 1) * this.perPage());
        this.doRequest();
        return false;
    },
 /**
   * @param {Number} page A page number.
   * @returns {Function} The click handler for the page link.
   */
  getClickHandler: function (page) {
      var self = this;
      return function () {
        self.manager.store.get('start').val((page - 1) * self.perPage());
        self.doRequest();
        return false;
      };
  },
  
  /**
   * @returns {Number} The page number of the previous page or null if no previous page.
   */
  previousPage: function () {
    return this.currentPage > 1 ? (this.currentPage - 1) : null;
  },

  /**
   * @returns {Number} The page number of the next page or null if no next page.
   */
  nextPage: function () {
    return this.currentPage < this.totalPages ? (this.currentPage + 1) : null;
  },

    renderPrev: function(handler) {
      $('#pager-prev').html(this.prevLabel);
      $('#pager-prev').removeClass("first-page");
      $('#pager-prev').unbind('click').bind('click', handler);
  },
  renderNext: function(handler) {
      $('#pager-next').html(this.nextLabel);
      $('#pager-next').removeClass("last-page");
      $('#pager-next').unbind('click').bind('click', handler);
  },
        
  /**
   * Render the pagination links.
   *
   * @param {Array} links The links for the visible page numbers.
   */
  renderLinks: function () {
    var form = '<form id="pageSelect_form"><input id="pageSelect" type="number" ' +
            ' placeholder="' + this.currentPage +'" min="1" max="' +this.totalPages+ '">', self = this;
    form += '</input></form><span>' + this.fromLabel + " " + this.totalPages + '</span>';

        $("#pagerTop", this.target).empty();
        $("#pagerTop",this.target).append(form);
        $('#pageSelect', this.target).unbind('keydown').bind('keydown', function(e) {
            if (e.keyCode == 13) {

                var inputValue = $('#pageSelect', this.target).val();
                //don't submit if value is not in the allowed range
                if ((inputValue <= self.totalPages) && (inputValue > 0)) {
                    $('#pageSelect_form', this.target).submit(function(e) {
                        self.clickHandler($('#pageSelect', this.target).val());
                    });
                }
            } 
          else {
              if ( ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1) ||
                // Allow: Ctrl+A
                        (e.keyCode == 65 && e.ctrlKey === true) ||
                        // Allow: home, end, left, right
                                (e.keyCode >= 35 && e.keyCode <= 39)) {
                    // let it happen, don't do anything
                    return;
                }
                // Ensure that it is a number and stop the keypress
                if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
                    e.preventDefault();
                } 
          }
      });
  },

  /**
   * @returns {Number} The number of results to display per page.
   */
  perPage: function () {
    return parseInt(this.manager.response.responseHeader && this.manager.response.responseHeader.params && this.manager.response.responseHeader.params.rows || this.manager.store.get('rows').val() || 10);
  },

  /**
   * @returns {Number} The Solr offset parameter's value.
   */
  getOffset: function () {
    return parseInt(this.manager.response.responseHeader && this.manager.response.responseHeader.params && this.manager.response.responseHeader.params.start || this.manager.store.get('start').val() || 0);
  },
  
beforeRequest: function() {
    $("#pagerTop", this.target).empty();
    $('#pager-next', this.target).empty();
    $('#pager-prev', this.target).empty();
},

  afterRequest: function () {
    var perPage = this.perPage();
    var offset  = this.getOffset();
    var total   = parseInt(this.manager.response.response.numFound);

    // Normalize the offset to a multiple of perPage.
    offset = offset - offset % perPage;

    this.currentPage = Math.ceil((offset + 1) / perPage);
    this.totalPages = Math.ceil(total / perPage);
      
    this.renderLinks();
    $('#pager-prev').addClass("first-page");
    $('#pager-next').addClass("last-page");
    if(this.currentPage > 1){
        this.renderPrev(this.getClickHandler(this.previousPage()), this.getClickHandler(1));
    } 
    if(this.currentPage < this.totalPages) {
        this.renderNext(this.getClickHandler(this.nextPage()), this.getClickHandler(this.totalPages));
    } 
  }
});

})(jQuery);
