var HeaderSort = Class.create();

HeaderSort.prototype = {
  _currentUrl: '',
  _currentSort: '',
  _hasParams : false,
  options: {},

  initialize: function(table, remove, options)
  {
    this.options = Object.extend(this.options, options);

    var heads = $A($(table).getElementsByTagName('th')).select(function(e){ return (e.id && e.id.match(/^sort_.+/));});

    var params = $H();
    if(document.location.href.indexOf('?') >= 0)
    {
      this._hasParams = true;
      params = $H(document.location.href.parseQuery());
    }
    params.unset(remove);
    this._currentSort = params.get('sort');
    params.unset('sort');
    this._currentUrl = document.location.href.sub(/\?.*/, '') + '?' + params.toQueryString();

    heads.map(this.initSortHeader.bind(this));
  },

  initSortHeader: function(header)
  {
    var header = $(header);
    var sort = header.id.sub(/sort_/, '');
    var csort = null;
    if(this._currentSort)
      csort = this._currentSort.split('|');
    var order = 'asc';
    var corder = 'asc';
    if(this.options.ascCssClassName)
        header.removeClassName(this.options.ascCssClassName);
    if(this.options.descCssClassName)
      header.removeClassName(this.options.descCssClassName);
    if(csort && sort == csort[0])
    {
      order = (csort.length > 1 && csort[1] == 'asc')?'desc':'asc';
      corder = (csort.length > 1 && csort[1] == 'desc')?'desc':'asc';
      if(this.options[corder + 'CssClassName'])
        header.addClassName(this.options[corder + 'CssClassName']);
    }
    var url = this._currentUrl + ((this._hasParams)?'&':'') + 'sort=' + sort + '|' + order;
    Event.observe(header, 'click', function(){document.location = url; });
  }
}
