/** Issues FIlter Funcionality **/

var IssuesFilter = {};
var FT_FAST = 1;
var FT_INDEX = 2;
var FT_EXTENDED = 3;
var FEWM_NEW = 1;
var FEWM_EDIT = 2;

// Init with default params
IssuesFilter.init = function()
{
  this.filters = [ 'f_fast', 'f_index', 'f_extended' ];
  this.urls = [ '/infostock/ar/aissues/fast', '/infostock/ar/aissues/index', '/infostock/ar/aissues/extended' ];
  this.filters_container = 'filter_form';

  this.loading = Loading;

  this.data_container = "table_data_holder";
  this.data_url = "/infostock/ar/issues/atable";
  this.average_container = "issues_average_data";
  this.average_url = "/infostock/ar/aissues/average";

  this.extended = Extended_Filter;
  this.extended.init();

  this.table = Filter_Table;
  this.columnhandler = Column_Handler;

  this.current = Current_Filters;
  this.current.filter = FT_FAST;

  this.english = false;
};

IssuesFilter.clearFilters = function()
{
  var el = false;
  for (i = 0; i < this.filters.length; i++)
  {
    el = document.getElementById(this.filters[i]);
    if (!el) {
      continue;
    }
    el.className = "";
    el = document.getElementById(this.filters[i] + '_img');
    if (!el) {
      continue;
    }
    el.src = '/infostock/images/paged-inactive-left.gif';
  }
};

IssuesFilter.setFilter = function(filter)
{
  var menu = document.getElementById(filter);
  url = this.urls[ this.filters.indexOf(filter) ];
  if (typeof( this.filters_container ) == 'string') {
    this.filters_container = document.getElementById(this.filters_container);
  }
    //this.filters_container.innerHTML =  '<img src="/infostock/images/ajax-loader.gif" alt="" align="absmiddle"> Loading ...';
  this.loading.show(this.filters_container);
  p = new Ajax.Request(url,
  {
    method: 'get',
    evalScripts: true,
    onSuccess: function(transport)
    {

      IssuesFilter.filters_container.innerHTML = transport.responseText;
                            // Initiate table data reload

      Scripts.html = transport.responseText;
      IssuesFilter.loading.hide(IssuesFilter.filters_container);
      setTimeout('Scripts.evalScripts()', 100);

      IssuesFilter.clearFilters();
                            // Fix menu
      menu.className = "active";
      if (filter == "f_fast")
        IssuesFilter.current.filter = FT_FAST;
      else if (filter == "f_index")
        IssuesFilter.current.filter = FT_INDEX;
      else if (filter == "f_extended")
        IssuesFilter.current.filter = FT_EXTENDED;

      IssuesFilter.updateTableData();
    }
  });
};

IssuesFilter.setPage = function (new_page)
{
  var el = document.getElementById(this.data_container);
  if (!el)
    return;

  this.loading.show(el); //+ el.innerHTML;
  if (arguments.length > 2 && arguments[2])
    new Ajax.Request(this.data_url, { method: 'get', onSuccess: function(transport) {
      IssuesFilter.response(transport);
    }, parameters: $H({ share_type: 2, page: new_page}) });
  else
    new Ajax.Request(this.data_url, { method: 'get', onSuccess: function(transport) {
      IssuesFilter.response(transport);
    }, parameters: $H({page: new_page}) });
}

IssuesFilter.updateTableData = function ()
{
  var el = document.getElementById(this.data_container);
  if (!el)
    return;

  if (this.current.filter == FT_FAST)
  {
    // Read parameters:
    //el.innerHTML = this.loading + el.innerHTML;
    this.loading.show(el);
    new Ajax.Request(this.data_url, { method: 'get', onSuccess: function(transport) {
      IssuesFilter.response(transport);
    }, parameters: $H({ filter: FT_FAST, criteria: this.current.fast.criteria, index: this.current.fast.index, sector: this.current.fast.sector }) });
  }
  if (this.current.filter == FT_INDEX)
  {
    //el.innerHTML = this.loading + el.innerHTML;
    this.loading.show(el);
    new Ajax.Request(this.data_url, { method: 'get',/* encoding: 'windows-1251', */onSuccess: function(transport) {
      IssuesFilter.response(transport);
    }, parameters: $H({ filter: FT_INDEX, name: this.current.index.cname, ticker: this.current.index.ticker }) });
  }
}

IssuesFilter.response = function (tt)
{
  var el = document.getElementById(this.data_container);
  if (!el)
    return;
  el.innerHTML = tt.responseText;
  IssuesFilter.loading.hide(el);
}

IssuesFilter.updateAverate = function (tt)
{
  var el = document.getElementById(this.average_container);
  if (!el)
    return;
  el.innerHTML = tt.responseText;
}

var Extended_Filter = {
  container: "ef_data_rows",
  hint: "ef_hint",

  init: function()
  {
    this.rules = [];
    this.add_window = Extended_AddWindow;
    this.add_window.init();
  },

  addNew: function()
  {
    // Fill in the data in the Add Window ...
    this.add_window.clear();
    this.add_window.setMode(FEWM_NEW);
    if (this.add_window.open())
      Utils.blockSite(1);
  },
  closeNew: function()
  {
    this.add_window.close();
    Utils.clearSite();
  },
  saveNew: function()
  {
    // Validate Entry form
    var criteria = document.getElementById('ef_criteria');
    var condition = document.getElementById('ef_condition');
    var value = document.getElementById('ef_value');

    if (!criteria || !condition || !value)
    {
      alert(document.msgs['fatalSystemError']);
      return false;
    }

    if (!criteria.lang || criteria.lang == "")
    {
      alert(document.msgs['selectCriteria']);
      return false;
    }

    if (!condition.lang || condition.lang == "")
    {
      alert(document.msgs['selectCondition']);
      return false;
    }

    if (value.value == '' || value.value == document.msgs['constantValue'])
    {
      alert(document.msgs['enterValue']);
      return false;
    }

    IssuesFilter.current.extended.add([ criteria.innerHTML, criteria.lang ], [ condition.innerHTML, condition.lang ], value.value);
    this.updateList(true);
  },

  valueFocus: function(value, focused)
  {
    if (focused)
    {
      if (value.value == document.msgs['constantValue']) {
        value.value = '';
      }
    }
    else
    {
      if (value.value == '') {
        value.value = document.msgs['constantValue'];
      }
    }
  },
  updateLinkText: function()
  {
    var el = document.getElementById(this.hint);
    if (!el)
      return;
    if (IssuesFilter.current.extended.count > 0)
    {
      var summary = document.msgs['filtersSummary'];
      summary = summary.replace("\{0\}", IssuesFilter.current.extended.pos + 1);
      summary = summary.replace("\{1\}", IssuesFilter.current.extended.count > IssuesFilter.current.extended.pos + 3 ? IssuesFilter.current.extended.pos + 3 : IssuesFilter.current.extended.count);
      summary = summary.replace("\{2\}", IssuesFilter.current.extended.count);
      el.innerHTML = summary;
    }
    else
      el.innerHTML = document.msgs['pressAdd'];
  },
  updateList: function(close)
  {
    if (close)
      this.closeNew();
		// Get the container
    var el = document.getElementById(this.container);
    if (!el)
      return;
    el.innerHTML = '';
    for (i = 0; i < IssuesFilter.current.extended.count; i++)
      el.innerHTML += "<div style=\"clear: both;\"><div style=\"float: left; border-right: #fff 1px solid;" + (i % 2 == 0 ? " background-color: #E9F2F8;" : "") + " width: 185px;\">" + IssuesFilter.current.extended.data[i][0][0] + "</div><div style=\"float: left;" + (i % 2 == 0 ? " background-color: #E9F2F8;" : "") + " border-right: #fff 1px solid; text-align: center; width: 60px;\">" + IssuesFilter.current.extended.data[i][1][0] + "</div><div style=\"float: left;" + (i % 2 == 0 ? " background-color: #E9F2F8;" : "") + " text-align: right; width: 320px;\">" + IssuesFilter.current.extended.data[i][2] + "</div><div style=\"float: left;" + (i % 2 == 0 ? " background-color: #E9F2F8;" : "") + " width: 55px; text-align: center;\"><img style=\"float: right; cursor: pointer;\" src=\"/infostock/images/filter-delete.gif\" onclick=\"if( confirm( '" + document.msgs['delFilter'] + "' ) ) IssuesFilter.extended.deleteItem( " + i + " );\" alt=\"\" border=\"\" /><img style=\"float: right; margin-right: 10px; cursor: pointer;\" src=\"/infostock/images/filter-edit.gif\" onclick=\"IssuesFilter.extended.editItem( " + i + " );\" alt=\"\" border=\"0\" /></div></div>";

		// If Data available enable buttons Filter and Clear
    if (IssuesFilter.current.extended.count > 0)
    {
      this.enable('ef_button_filter');
      this.enable('ef_button_clear');
      if (IssuesFilter.current.extended.count > 3)
      {
        this.enable("ef_button_scroll_down");
        if (IssuesFilter.current.extended.pos > 0)
          this.enable("ef_button_scroll_up");
      }

      this.updateLinkText();
    }
    else
      el.innerHTML = "<div style=\"line-height: 40px; text-align: center; color: #DFE7F2\">" + document.msgs['noCriteria'] + "</div>";
  },

  enable: function(button)
  {
    var b = document.getElementById(button);
    if (!b)
      return;
    var old = b.childNodes[0].src;
    var myregexp = /(?:(.+)\/)?([^\/]+)-disabled\.(.+)$/;
    var match = myregexp.exec(old);
    if (match != null) {
      result = match[1] + "/" + match[2] + "." + match[3];
    } else {
      return;
    }
    b.childNodes[0].src = result;
    b.active = true;
		// Update Text Color
    var old = b.childNodes[2];
    if (old)
    {
      old.style.color = "#1f4b8b";
      old.active = true;
    }
  },
  disable: function(button)
  {
    var b = document.getElementById(button);
    if (!b)
      return;
    if (!b.active)
      return;
    var old = b.childNodes[0].src;
    var myregexp = /(?:(.+)\/)?([^\/]+)-disabled\.(.+)$/;
    var match = myregexp.exec(old);
    var myregexp = /(?:(.+)\/)?([^\/]+)\.(.+)$/;
    var match = myregexp.exec(old);
    if (match != null) {
      result = match[1] + "/" + match[2] + "-disabled." + match[3];
    } else {
      return;
    }
    b.childNodes[0].src = result;
    b.active = false;
		// Update Text Color
    var old = b.childNodes[2];
    if (old)
    {
      old.active = false;
      old.style.color = "#858585";
    }
  },

  clear: function(button)
  {
    // Clear data;
    if (!button.childNodes[2].active)
      return false;

    IssuesFilter.current.extended.clear();

    this.submit();

    this.disable("ef_button_filter");
    this.disable("ef_button_clear");
    this.disable("ef_button_scroll_down");
    this.disable("ef_button_scroll_up");
    this.updateList(false);

  },
  submit: function(button)
  {
    if (button && !button.childNodes[2].active)
      return false;

    if (IssuesFilter.current.extended.count < 1)
      return;
		// Build Filter object
    var f = new Object();
    for (i = 0; i < IssuesFilter.current.extended.count; i++)
    {
      eval("f.criteria_" + i + " = '" + IssuesFilter.current.extended.data[ i ][0][1] + "'");
      eval("f.condition_" + i + " = '" + IssuesFilter.current.extended.data[ i ][1][1] + "'");
      eval("f.value_" + i + " = '" + IssuesFilter.current.extended.data[ i ][2] + "'");
    }
    f.filter = IssuesFilter.current.filter;
    var el = document.getElementById(IssuesFilter.data_container);
    if (!el)
      return;

		//el.innerHTML = IssuesFilter.loading + el.innerHTML;
    IssuesFilter.loading.show(el);
    new Ajax.Request(IssuesFilter.data_url, { method: 'post', /*encoding: 'windows-1251',*/ onSuccess: function(transport) {
      IssuesFilter.response(transport);
    }, parameters: f });
  },

  scrollUp: function()
  {
    if (IssuesFilter.current.extended.count < 4)
      return;
    if (IssuesFilter.current.extended.pos <= 0)
      return;

    var el = document.getElementById(this.container);
    if (!el)
      return;

    if (IssuesFilter.current.extended.pos == 1)
      this.disable("ef_button_scroll_up");
    IssuesFilter.current.extended.pos--;
    el.scrollTop = IssuesFilter.current.extended.pos * 13;

    var ms = IssuesFilter.current.extended.count - 3;
    if (IssuesFilter.current.extended.pos < ms)
      this.enable("ef_button_scroll_down");

    this.updateLinkText();
  },
  scrollDown: function()
  {
    if (IssuesFilter.current.extended.count < 4)
      return;

    var ms = IssuesFilter.current.extended.count - 3;
    if (IssuesFilter.current.extended.pos >= ms)
      return;

    var el = document.getElementById(this.container);
    if (!el)
      return;

    if (IssuesFilter.current.extended.pos == 0)
      this.enable("ef_button_scroll_up");
    IssuesFilter.current.extended.pos++;
    el.scrollTop = IssuesFilter.current.extended.pos * 13;

    if (IssuesFilter.current.extended.pos >= ms)
      this.disable("ef_button_scroll_down");

    this.updateLinkText();
  },

  deleteItem: function(id)
  {
    // Delete Element and update list;
    IssuesFilter.current.extended.remove(id);
    this.updateList(false);
		// Buttons
    if (IssuesFilter.current.extended.pos > IssuesFilter.current.extended.count - 5)
    {
      IssuesFilter.current.extended.pos = IssuesFilter.current.extended.count - 5 >= 0 ? IssuesFilter.current.extended.count - 5 : 0;
      var el = document.getElementById(this.container);
      if (el)
        el.scrollTop = IssuesFilter.current.extended.pos * 13;
    }

    if (IssuesFilter.current.extended.count - 3 <= 0)
    {
      this.disable("ef_button_scroll_up");
      this.disable("ef_button_scroll_down");
      if (IssuesFilter.current.extended.count == 0)
      {
        this.disable('ef_button_filter');
        this.disable('ef_button_clear');
      }
    }
  },
  editItem: function(id)
  {
    // Fill in the data in the Add Window ...
    this.edit_item_id = id;
    this.add_window.clear();
    this.add_window.setMode(FEWM_EDIT);
    this.add_window.setDefault(IssuesFilter.current.extended.data[ id ]);
    if (this.add_window.open())
      Utils.blockSite(1);
  },

  changeOld: function()
  {
    // Validate Entry form
    var criteria = document.getElementById('ef_criteria');
    var condition = document.getElementById('ef_condition');
    var value = document.getElementById('ef_value');

    if (!criteria || !condition || !value)
    {
      alert(document.msgs['fatalSystemError']);
      return false;
    }

    if (!criteria.lang || criteria.lang == "")
    {
      alert(document.msgs['selectCriteria']);
      return false;
    }

    if (!condition.lang || condition.lang == "")
    {
      alert(document.msgs['selectCriteria']);
      return false;
    }

    if (value.value == '' || value.value == document.msgs['constantValue'])
    {
      alert(document.msgs['enterValue']);
      return false;
    }

    IssuesFilter.current.extended.edit(this.edit_item_id, [ criteria.innerHTML, criteria.lang ], [ condition.innerHTML, condition.lang ], value.value);
    this.updateList(true);
  }
};

var Extended_AddWindow = {
  opened: false,
  handle: 'add_window',
  mode: FEWM_NEW,
  init: function()
  {
    this.window = document.getElementById(this.handle);
  },
  open: function()
  {
    this.init();

    if (!this.window || this.opened) {
      return;
    }

    this.window.style.display = 'block';
    this.opened = true;

    return true;
  },
  close: function()
  {
    if (!this.window) {
      this.init();
    }

    if (!this.window || !this.opened) {
      return false;
    }

    this.window.style.display = 'none';
    this.opened = false;
  },
  clear: function()
  {
    var criteria = document.getElementById('ef_criteria');
    var condition = document.getElementById('ef_condition');
    var value = document.getElementById('ef_value');

    if (criteria)
    {
      criteria.innerHTML = "критерий";
      criteria.lang = "";
    }

    if (condition)
    {
      condition.innerHTML = document.msgs['constantCondition'];
      condition.lang = "";
    }

    if (value)
    {
      value.value = document.msgs['constantValue'];
    }
  },

  setDefault: function(data)
  {
    var criteria = document.getElementById('ef_criteria');
    var condition = document.getElementById('ef_condition');
    var value = document.getElementById('ef_value');

    if (!criteria || !condition || !value)
      return false;

    criteria.innerHTML = data[0][0];
    criteria.lang = data[0][1];

    condition.innerHTML = data[1][0];
    condition.lang = data[1][1];

    value.value = data[2];

    return true;
  },

  setMode: function(_mode)
  {
    if (this.mode == _mode)
      return false;

    this.mode = _mode;
    var el = document.getElementById('ewf_add_button');
    if (!el)
      return;

    if (this.mode == FEWM_NEW)
    {
      // Set New Icon + Добави label + saveNew handler
      el.onclick = function() {
        IssuesFilter.extended.saveNew();
        return false;
      }
            //el.setAttribute( "onclick", "IssuesFilter.extended.saveNew(); return false;" );
      el.childNodes[0].src = '/infostock/images/add.gif';
      el.childNodes[1].nodeValue = document.msgs['add'];
      var title = document.getElementById('add_window_title');
      if (title)
        title.innerHTML = document.msgs['filtersExtendedAddTitle'];
    }

    if (this.mode == FEWM_EDIT)
    {
      // Set Edit Icon + Промени label + changeItem handler
      el.onclick = function() {
        IssuesFilter.extended.changeOld();
        return false;
      }
            //el.setAttribute( "onclick", "IssuesFilter.extended.changeOld(); return false;" );
      el.childNodes[0].src = '/infostock/images/filter-edit.gif';
      el.childNodes[1].nodeValue = document.msgs['change'];
      var title = document.getElementById('add_window_title');
      if (title)
        title.innerHTML = document.msgs['filtersExtendedChangeTitle'];
    }
  }
};

var Filter_Table = {

  defset:[ '1 ден', '2 дни', '3 дни', '1 седмица', '1 месец', '1 година' ],
  sort_field: "",
//sort_asc: true,

  changeColumns: function()
  {
    var window = document.getElementById('more_columns_window');
    if (!window) {
      return false;
    }

    Utils.blockSite(1);
    window.style.display = 'block';
  },

  closeChangeColumns: function(save_changes)
  {
    var window = document.getElementById('more_columns_window');
    if (!window) {
      return false;
    }

    window.style.display = 'none';
    Utils.clearSite();
    if (!save_changes)
    {
      //this.resetColumns(); TODO: Reset the columns state as they were before the change.
      return false;
    }
    if (IssuesFilter.columnhandler.changed())
      IssuesFilter.columnhandler.sendColumns();
  },

  setColumnParam: function(el, c)
  {
    if (!el)
      return;
        // Send params to Ajax
    var dt = document.getElementById(IssuesFilter.data_container);
    if (!dt)
      return;
    IssuesFilter.loading.show(dt);
    if (arguments.length > 2 && arguments[2])
      new Ajax.Request(IssuesFilter.data_url, { method: 'post', onSuccess: function(transport) {
        IssuesFilter.response(transport);
      }, parameters: { filter: 0, share_type: 2, column: c, value: el.lang } });
    else
      new Ajax.Request(IssuesFilter.data_url, { method: 'post', onSuccess: function(transport) {
        IssuesFilter.response(transport);
      }, parameters: { filter: IssuesFilter.current.filter, column: c, value: el.lang } });
  },

  sortBy: function(el)
  {
    if (!el)
      return;
    if (this.sort_field == el.lang)
    {
      //this.sort_asc = !this.sort_asc;
    }
    else
    {
      this.sort_field = el.lang;
            //this.sort_asc = true;
    }

    var dt = document.getElementById(IssuesFilter.data_container);
    if (!dt)
      return;

		//dt.innerHTML = IssuesFilter.loading + dt.innerHTML;
    IssuesFilter.loading.show(dt);
    if (document.getElementById(IssuesFilter.average_container))
    {
      new Ajax.Request(IssuesFilter.data_url, { method: 'post', onSuccess: function(transport) {
        IssuesFilter.response(transport);
      }, parameters: { sort_by: this.sort_field } });
      new Ajax.Request(IssuesFilter.average_url, { method: 'get', onSuccess: function(transport) {
        IssuesFilter.updateAverate(transport);
      } });
    }
    else
      if (arguments.length > 1 && arguments[1])
        new Ajax.Request(IssuesFilter.data_url, { method: 'post', onSuccess: function(transport) {
          IssuesFilter.response(transport);
        }, parameters: { share_type: 2, sort_by: this.sort_field, type: 1 } });
      else
        new Ajax.Request(IssuesFilter.data_url, { method: 'post', onSuccess: function(transport) {
          IssuesFilter.response(transport);
        }, parameters: { sort_by: this.sort_field, type: 1 } });
  }
};

var Scripts = {
  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
  html: '',
  extractScripts: function() {

    var matchAll = new RegExp(this.ScriptFragment, 'img');
    var matchOne = new RegExp(this.ScriptFragment, 'im');
    return (this.html.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  },

  evalScripts: function() {
    return this.extractScripts().map(function(script) {
      return eval(script);
    });
  }
};


var Current_Filters = {

  fast: {
    criteria: "",
    index: "",
    sector: ""
  },
  index: {
    cname: "",
    ticker: ""
  },
  extended: {
    count: 0,
    data : [],
    pos: 0,

    clear: function()
    {
      this.count = 0;
      this.pos = 0;
      delete( this.data );
      this.data = new Array();
    },

    add: function(criteria, condition, value)
    {
      this.data[ this.count ] = new Array(criteria, condition, value);
      this.count++;
    },
    edit: function(id, criteria, condition, value)
    {
      this.data[ id ] = new Array(criteria, condition, value);
    },

    remove: function(id)
    {
      if (this.data.length < id)
        return;
      this.data.splice(id, 1);
      this.count--;
    }
  },

  filter: "",

  setCurrent: function(filter_type, base, link)
  {
    var el = false;
    if (filter_type == 'fast')
    {
      // Set Fast Filter data.
      if (base == 'criteria') {
        this.fast.criteria = link.lang;
      }
      else if (base == 'index') {
        this.fast.index = link.lang;
      }
      else if (base == 'sector') {
        this.fast.sector = link.lang;
      }

      el = document.getElementById('ff_' + base);
      if (el) {
        el.innerHTML = link.innerHTML + ( base == 'criteria' ? " * " : "" );
        el.setAttribute('lang', link.lang);
      }

      el = document.getElementById('ff_' + base + '_desc');
      if (el) {
        el.innerHTML = ( link.title == "" ? "" : " * " ) + link.title;
      }

      IssuesFilter.updateTableData();
    }
    if (filter_type == "index")
    {
      if (base == "name") {
        this.index.ticker = "";
        this.index.cname = link
      }
      else if (base == "ticker") {
        this.index.name = "";
        this.index.ticker = link
      }

      IssuesFilter.updateTableData();
      IssuesFilter.setFilter('f_index');
    }
  }

};

var Column_Handler = {

  columns: [],
  defaults: [],

  init: function()
  {
    // Read the column length;
    var el = false;
    for (i = 1; i < 50; i++)
    {
      el = document.getElementById("e_data_column_" + i);
      if (!el)
        break;
      this.columns[i] = "";
      this.defaults[i] = el.title;
    }
  },

  printDefaults: function()
  {
    var data = "";
    for (i = 0; i < this.defaults.length; i++)
      data += this.defaults[i] + ", ";
    alert(data);
  },

  setColumn: function(link)
  {
    this.columns[ document.is_popup.parent.parentNode.lang ] = link.lang;
		// Update placeholder
    document.is_popup.parent.innerHTML = link.innerHTML;
    document.is_popup.parent.lang = link.lang;
  },

  changed: function()
  {
    for (i = 0; i < this.columns.length; i++)
      if (this.columns[i] != "")
        return true;

    return false;
  },

  sendColumns: function()
  {
    var el = document.getElementById(IssuesFilter.data_container);
    if (!el)
      return;
    var cols = {};

    for (i = 1; i < this.columns.length; i++)
    {
      if (this.columns[i] != "")
        eval("cols.column" + i + " = this.columns[i] ");
    }

    cols.filter = IssuesFilter.current.filter;
    cols.columns = 1;
        // Send request to ajax handler.
    //el.innerHTML = IssuesFilter.loading + el.innerHTML;
    IssuesFilter.loading.show(el);
    new Ajax.Request(IssuesFilter.data_url, { method: 'post', onSuccess: function(transport) {
      IssuesFilter.response(transport);
    }, parameters: cols });
  }
}
IssuesFilter.init();
