GM.namespace('GM.cms.table');

GM.cms.table.init = function ()
{
  var tables = GM.dom.getElementsByClassName('overview', 'table');
  
  for (var i = 0; i < tables.length; i += 1) {
    new GM.cms.table.TableController(tables[i]);
  }
};

GM.cms.table.TableController = function (table)
{
  this.ids   = [];
  this.table = table;
  this.addHandlers();
};

GM.cms.table.TableController.prototype.addHandlers = function ()
{
  var headers = this.table.getElementsByTagName('th');
    
  for (var i = 0; i < headers.length; i += 1) {
    if (headers[i].firstChild && headers[i].firstChild.nodeName.toLowerCase() === 'a') {
      GM.event.register(headers[i].firstChild, 'click', this.clickUpdate, this);
    } else if (headers[i].firstChild && headers[i].firstChild.name && headers[i].firstChild.name == 'checkall') {
      GM.event.register(headers[i].firstChild, 'click', this.clickCheckall, this);
    } else if (headers[i].className === 'toggle') {
      GM.event.register(headers[i].firstChild, 'click', this.openToggle, this);
    }
  }
  
  var buttons = GM.dom.getElementsByClassName('buttons', 'tr', this.table);
  
  if (buttons[0]) {
    var links = buttons[0].getElementsByTagName('a');
    
    for (var i = 0; i < links.length; i += 1) {
      GM.event.register(links[i], 'click', this.clickButton, this);
    }
  }
  
  var controls = GM.dom.getElementsByClassName('controls', 'tr', this.table);
  
  if (controls[0]) {
    var input = controls[0].getElementsByTagName('input');
    
    for (var i = 0; i < input.length; i += 1) {
      if (input[i].name === 'filter') {
        GM.event.register(input[i].form, 'submit', this.submitUpdate, this);
      }
    }
    
    var select = controls[0].getElementsByTagName('select');
    
    for (var i = 0; i < select.length; i += 1) {
      GM.event.register(select[i], 'change', this.changeUpdate, this);
    }    
   
    var links = controls[0].getElementsByTagName('a');
    
    for (var i = 0; i < links.length; i += 1) {
      if (links[i].className.indexOf('insert') !== -1) {
        GM.event.register(links[i], 'click', this.clickInsert, this);
      } else if (links[i].className.indexOf('disabled') === -1) {
        GM.event.register(links[i], 'click', this.clickUpdate, this);
      }
    }
  }
  
  var rows = this.table.getElementsByTagName('tr');
  
  var skip = ['header', 'controls', 'buttons', 'empty'];
  
  for (var i = 0; i < rows.length; i += 1) {
    if (skip.indexOf(rows[i].className.toLowerCase() ) === -1) {
      GM.event.register(rows[i], 'click', this.clickRow, this);
    }
  }
};

GM.cms.table.TableController.prototype.removeHandlers = function ()
{
  var headers = this.table.getElementsByTagName('th');
    
  for (var i = 0; i < headers.length; i += 1) {
    if (headers[i].firstChild && headers[i].firstChild.nodeName.toLowerCase() === 'a') {
      GM.event.unregister(headers[i].firstChild, 'click', this.clickUpdate);
    } else if (headers[i].firstChild && headers[i].firstChild.name && headers[i].firstChild.name == 'checkall') {
      GM.event.unregister(headers[i].firstChild, 'click', this.clickCheckall);
    } else if (headers[i].className === 'toggle') {
      GM.event.unregister(headers[i].firstChild, 'click', this.openToggle);
    }
  }
  
  var controls = GM.dom.getElementsByClassName('controls', 'tr', this.table);
  
  if (controls[0]) {
    controls = controls[0];
    
    var input = controls.getElementsByTagName('input');
    
    for (var i = 0; i < input.length; i += 1) {
      if (input[i].name === 'filter') {
        GM.event.unregister(input[i].form, 'submit', this.submitUpdate);
      }
    }
    
    var select = controls.getElementsByTagName('select');
    
    for (var i = 0; i < select.length; i += 1) {
      GM.event.unregister(select[i], 'change', this.changeUpdate);
    }
    
    var links = controls.getElementsByTagName('a');
    
    for (var i = 0; i < links.length; i += 1) {
      if (links[i].className.indexOf('disabled') === -1) {
        GM.event.unregister(links[i], 'click', this.clickUpdate);
      }
    }
  }
  
  var rows = this.table.getElementsByTagName('tr');
  
  var skip = ['header', 'controls', 'buttons', 'empty'];
  
  for (var i = 0; i < rows.length; i += 1) {
    if (skip.indexOf(rows[i].className.toLowerCase() ) === -1) {
      GM.event.unregister(rows[i], 'click', this.clickRow);
    }
  }
};

GM.cms.table.TableController.prototype.update = function (e, object)
{
  this.removeHandlers();

  var container = document.createElement('div');
  container.innerHTML = object.request.responseText;
  
  var table = container.firstChild;
  
  this.table.parentNode.replaceChild(table, this.table);
  
  this.table = table;

  this.addHandlers();
  
  this.lock.unlock();
  this.lock = null;
};

GM.cms.table.TableController.prototype.clickInsert = function (e)
{
  GM.event.preventDefault(e);

  var target = GM.event.getTarget(e);
  var href   = target.href.replace('site/', 'async/');
  var lock   = new GM.dom.Lock({color: 'FFF', opacity: 0, cursor: 'wait', zIndex: 90});
  
  GM.request.send( {
    method:   'get',
    url:      href,
    callback: this.openPopupInsert,
    context:  this,
    object:   {lock: lock}
  } );
};

GM.cms.table.TableController.prototype.clickUpdate = function (e)
{
  this.lock = new GM.dom.Lock({color: 'FFF', opacity: 0, cursor: 'wait', zIndex: 90});

  GM.event.preventDefault(e);

  var target = GM.event.getTarget(e);
  var href   = target.href.replace('site/', 'async/');

  target.blur();

  GM.request.send( {
    method:   'get',
    url:      href,
    callback: this.update,
    context:  this
  } );    
};
  
GM.cms.table.TableController.prototype.changeUpdate = function (e)
{
  this.lock = new GM.dom.Lock({color: 'FFF', opacity: 0, cursor: 'wait', zIndex: 90});

  var target = GM.event.getTarget(e);
  
  target.blur();
    
  target.form.action = target.form.action.replace('site/', 'async/');
  
  GM.request.send( {
    form:     target.form,
    callback: this.update,
    context:  this
  } );  
};
  
GM.cms.table.TableController.prototype.submitUpdate = function (e)
{
  this.lock = new GM.dom.Lock({color: 'FFF', opacity: 0, cursor: 'wait', zIndex: 90});

  GM.event.preventDefault(e);

  var target = GM.event.getTarget(e);
  
  target.action = target.action.replace('site/', 'async/');
  
  GM.request.send( {
    form:     target,
    callback: this.update,
    context:  this
  } );  
};

GM.cms.table.TableController.prototype.openToggle = function (e)
{
  if (!this.toggle) {
    GM.event.cancelBubble(e);
  
    var target = GM.event.getTarget(e);
    
    this.toggle = target.nextSibling;
    this.toggle.style.display = 'inline';
    this.toggle.style.left = (target.offsetLeft - this.toggle.offsetWidth + target.offsetWidth + 4) + 'px';
    this.toggle.style.top  = (target.offsetTop + target.offsetHeight + 5) + 'px';
    
    var inputs = this.toggle.getElementsByTagName('input');
    
    for (var i = 0; i < inputs.length; i += 1) {
      GM.event.register(inputs[i], 'click', this.doToggle, this);
    }
    
    GM.event.register(this.toggle, 'click', GM.event.cancelBubble);
    GM.event.register(window.document, 'click', this.closeToggle, this);
  }
};

GM.cms.table.TableController.prototype.closeToggle = function (e)
{
  if (this.toggle) {
    var link = this.toggle.getElementsByTagName('a');
    
    if (link[0]) {
      this.lock = new GM.dom.Lock({color: 'FFF', opacity: 0, cursor: 'wait', zIndex: 90});
    
      var href = link[0].href.replace('site/', 'async/');;
  
      GM.request.send( {
        method:   'get',
        url:      href,
        callback: this.update,
        context:  this
      } );
    }  
  
    this.toggle.style.display = 'none';
    
    var inputs = this.toggle.getElementsByTagName('input');
    
    for (var i = 0; i < inputs.length; i += 1) {
      GM.event.unregister(inputs[i], 'click', this.doToggle);
    }    
    
    GM.event.unregister(this.toggle, 'click', GM.event.cancelBubble);
    GM.event.unregister(window.document, 'click', this.closeToggle);
    
    this.toggle = null;
  }  
};

GM.cms.table.TableController.prototype.doToggle = function (e)
{
  var target = GM.event.getTarget(e);
  
  var name    = target.name;
  var visible = (target.checked) ? 1 : 0;
  
  GM.request.send( {
    data:   'act=preferences&name=' + name + '&value=' + visible,
    method: 'post',
    url:    'async.do'
  } );
};

GM.cms.table.TableController.prototype.clickRow = function (e)
{
  var target   = GM.event.getTarget(e),
      href     = null,
      callback = null;

  if (target.nodeName.toLowerCase() === 'input') {
    this.setId(target.name.substring(target.name.indexOf('_') + 1), target.checked);
    target.blur();
    
    return;
  } else if (target.className === 'checkall' && target.firstChild.nodeName.toLowerCase() === 'input') {
    target.firstChild.checked = (target.firstChild.checked) ? false : true;
  
    this.setId(target.firstChild.name.substring(target.firstChild.name.indexOf('_') + 1), target.firstChild.checked);
    
    return;
  } 
  
  GM.event.preventDefault(e);
  GM.event.cancelBubble(e);
  
  if (target.className === 'delete') {
    href     = target.href.replace('site/', 'async/');
    callback = this.openPopupDelete;
  } else {  
    var links = GM.dom.getElementsByClassName('update', 'a', target.parentNode);
    
    if (links[0]) {
      href     = links[0].href.replace('site/', 'async/');
      callback = this.openPopupUpdate;
    }
  }
  
  if (href && callback) {
    var lock = new GM.dom.Lock({color: 'FFF', opacity: 0, cursor: 'wait', zIndex: 90});
  
    GM.request.send( {
      method:   'get',
      url:      href,
      callback: callback,
      context:  this,
      object:   {lock: lock}
    } );
  }
};

GM.cms.table.TableController.prototype.clickButton = function (e)
{
  var target = GM.event.getTarget(e);
  
  GM.event.preventDefault(e);
  
  target.blur();
  
  if (target.className.indexOf('disabled') === -1) {
    var lock = new GM.dom.Lock({color: 'FFF', opacity: 0, cursor: 'wait', zIndex: 90});
    var href = target.href.replace('site/', 'async/') + '&ids=' + this.ids.join('|');
  
    target.blur();
  
    GM.request.send( {
      method:   'get',
      url:      href,
      callback: this.openPopup,
      context:  this,
      object:   {lock: lock}
    } );
  } 
};

GM.cms.table.TableController.prototype.clickCheckall = function (e)
{
  var target = GM.event.getTarget(e);
  var inputs = this.table.getElementsByTagName('input');
  
  target.blur();
  
  for (var i = 0; i < inputs.length; i += 1) {
    if (inputs[i].name.indexOf('checkall_') !== -1) {
      this.setId(inputs[i].name.substring(inputs[i].name.indexOf('_') + 1), target.checked);
      
      inputs[i].checked = (target.checked) ? true : false;
    }
  }
};

GM.cms.table.TableController.prototype.setId = function (id, add)
{
  if (add && this.ids.indexOf(id) === -1) {
    this.ids.push(id);
  } else if (!add && this.ids.indexOf(id) !== -1) {
    this.ids.splice(this.ids.indexOf(id), 1);
  }
  
  if (this.ids.length > 0) {
    var buttons = GM.dom.getElementsByClassName('multi disabled', 'a', this.table);
    
    for (var i = 0; i < buttons.length; i += 1) {
      buttons[i].className = buttons[i].className.replace('multi disabled', 'multi');
    }
  } else {
    var buttons = GM.dom.getElementsByClassName('multi', 'a', this.table);
    
    for (var i = 0; i < buttons.length; i += 1) {
      if (buttons[i].className.indexOf('multi disabled') === -1) {
        buttons[i].className = buttons[i].className.replace('multi', 'multi disabled');
      }
    }
  }
};

GM.cms.table.TableController.prototype.openPopup = function (e, object)
{
  new GM.cms.popup.PopupController(object.request.responseText, object.lock);
};

GM.cms.table.TableController.prototype.openPopupInsert = function (e, object)
{
  new GM.cms.popup.PopupController(object.request.responseText, object.lock);
};

GM.cms.table.TableController.prototype.openPopupUpdate = function (e, object)
{
  new GM.cms.popup.PopupController(object.request.responseText, object.lock);
};

GM.cms.table.TableController.prototype.openPopupDelete= function (e, object)
{
  new GM.cms.popup.PopupController(object.request.responseText, object.lock);
};

