GM.namespace('GM.cms.util');

// Scroller

GM.cms.util.Scroller = function (element)
{
  this.scroller = element;
  
  this.left  = this.scroller.firstChild;
  this.right = this.scroller.lastChild;
  this.num   = 0;
  
  for (var i = 0; i < this.scroller.childNodes.length; i += 1) {
    if (i == 0) {
      this.left = this.scroller.childNodes[i];
    } else if (i == this.scroller.childNodes.length - 1) {
      this.right = this.scroller.childNodes[i];
    } else if (this.scroller.childNodes[i].style.visibility != 'hidden'){
      this.num += 1;
    }
  }
  
  this.addHandlers();
};

GM.cms.util.Scroller.prototype.addHandlers = function ()
{
  if (this.left.className.indexOf('disabled') === -1) {
    GM.event.register(this.left, 'click', this.clickLeft, this);
  }
  
  if (this.right.className.indexOf('disabled') === -1) {
    GM.event.register(this.right, 'click', this.clickRight, this);
  }
};

GM.cms.util.Scroller.prototype.removeHandlers = function ()
{
  if (this.left.className.indexOf('disabled') === -1) {
    GM.event.unregister(this.left, 'click', this.clickLeft);
  }
  
  if (this.right.className.indexOf('disabled') === -1) {
    GM.event.unregister(this.right, 'click', this.clickRight);
  }
};
  
GM.cms.util.Scroller.prototype.clickLeft = function (e)
{
  var elements = GM.dom.getElementsByClassName('scroll', 'label', this.scroller);
  
  for (var i = 0; i < elements.length; i += 1) {
    if (elements[i].style.visibility === 'visible' || elements[i].style.visibility === '') {
      elements[i - 1].style.visibility = 'visible';
      elements[i - 1].style.position   = 'relative';
      elements[i + (this.num - 1)].style.visibility = 'hidden';
      elements[i + (this.num - 1)].style.position   = 'absolute';
      
      if (i - 1 === 0) {
        GM.event.unregister(this.left, 'click', this.clickLeft);
        
        this.left.className += ' disabled';
      }
      
      if ((i + (this.num - 1) ) < elements.length && this.right.className.indexOf('disabled') !== -1) {
        GM.event.register(this.right, 'click', this.clickRight, this);
        
        this.right.className = this.right.className.replace('disabled', '');
      }
      
      break;
    }
  }          
};
    
GM.cms.util.Scroller.prototype.clickRight = function (e)
{
  var elements = GM.dom.getElementsByClassName('scroll', 'label', this.scroller);
  
  for (var i = 0; i < elements.length; i += 1) {
    if (elements[i].style.visibility === 'visible' || elements[i].style.visibility === '') {
      elements[i].style.visibility = 'hidden';
      elements[i].style.position   = 'absolute';
      elements[i + (this.num)].style.visibility = 'visible';
      elements[i + (this.num)].style.position   = 'relative';
      
      if ((i + this.num) === (elements.length - 1) ) {
        GM.event.unregister(this.right, 'click', this.clickRight);
        
        this.right.className += ' disabled';
      }
      
      if (i === 0 && this.left.className.indexOf('disabled') !== -1) {
        GM.event.register(this.left, 'click', this.clickLeft, this);
        
        this.left.className = this.left.className.replace('disabled', '');
      }
      
      break;
    }
  }
};

// Fold

GM.cms.util.fold =
{
  addHandlers: function (element)
  {
    var fold = GM.dom.getElementsByClassName('fold', 'div', element);
    
    for (var i = 0; i < fold.length; i += 1) {
      GM.event.register(fold[i].firstChild, 'click', GM.cms.util.fold.clickFold, fold[i]);
    }    
  },
  
  removeHandlers: function (element)
  {
    var fold = GM.dom.getElementsByClassName('fold', 'div', element);
    
    for (var i = 0; i < fold.length; i += 1) {
      GM.event.unregister(fold[i].firstChild, 'click', GM.cms.util.fold.clickFold);
    }
  },
  
  clickFold: function (e)
  {
    if (this.className.indexOf('closed') === -1) {
      this.className += ' closed';
      
      var value = 0; 
    } else { 
      this.className = this.className.replace(' closed', '');
      
      var value = 1;
    }
    
    var name = this.className.substr(0, this.className.indexOf(' ') );  
    
    GM.request.send( {
      data:     'act=session&name=fold.' + name + '&value=' + value,
      method:   'post',
      url:      'async.do'
    } );    
  }
};

// Checkbox group

GM.cms.util.checkboxgroup =
{  
  addHandlers: function (element)
  {    
    var groups = GM.dom.getElementsByClassName('checkbox-group', 'div', element);
    
    for (var j = 0; j < groups.length; j += 1) {
      if (groups[j].firstChild && groups[j].firstChild.nodeName.toLowerCase() === 'h2') {
        GM.event.register(groups[j].firstChild, 'click', GM.cms.util.checkboxgroup.clickSelect, groups[j]);
        
        var boxes   = groups[j].getElementsByTagName('input');
        var checked = true;
        
        for (var k = 0; k < boxes.length; k += 1) {
          if (!boxes[k].checked) {
            checked = false;
            break;
          }
        }
        
        groups[j].checked = checked;
      }
    }   
  },
  
  removeHandlers: function (element)
  {
    var groups = GM.dom.getElementsByClassName('checkbox-group', 'div', element);
    
    for (var j = 0; j < groups.length; j += 1) {
      if (groups[j].firstChild && groups[j].firstChild.nodeName.toLowerCase() === 'h2') {
        GM.event.unregister(groups[j].firstChild, 'click', GM.cms.util.checkboxgroup.clickSelect);
      }
    }
  },
    
  clickSelect: function (e)
  {
    var boxes    = this.getElementsByTagName('input');
    var checked  = (this.checked) ? false : true;      
    this.checked = (this.checked) ? false : true;

    for (var i = 0; i < boxes.length; i += 1) {
      if (boxes[i].type.toLowerCase() === 'checkbox') {
        boxes[i].checked = checked;
      }
    }
  }
};

/* ColorController */

GM.cms.util.ColorController = function (element)
{
  this.element = element;
  
  this.opener = document.createElement('span');
  this.opener.className = 'color-picker open-color';
  
  if (this.element.nextSibling) {
    this.element.parentNode.insertBefore(this.opener, this.element.nextSibling);
  } else {
    this.element.parentNode.appendChild(this.opener);
  }
  
  GM.event.register(this.opener, 'click', this.openPicker, this);
};

GM.cms.util.ColorController.prototype.openPicker = function (e)
{
  GM.event.cancelBubble(e);
  
  if (this.isOpen) {
    this.close(e);
    
    return;
  }
  
  if (!this.table) {
    var colors  = ['FF0000', 'FFFF00', '00FF00', '0000FF'];
    var changes = ['3', '6', '9', 'C'];
    
    var table = document.createElement('table');
    table.className = 'color-picker';
    
    for (var i = 0; i < colors.length; i += 1) {
      var row = document.createElement('tr');
      table.appendChild(row);
      
      for (var j = changes.length - 1; j >= 0; j -= 1) {
        var newColor = '#' + colors[i].replace(/\d/gi, changes[j]);
        
        var cell = document.createElement('td');
        cell.style.backgroundColor = newColor;
        cell.title = newColor;
        row.appendChild(cell);
        
        GM.event.register(cell, 'click', this.pickColor, this);
      }
      
      var cell = document.createElement('td');
      cell.style.backgroundColor = '#' + colors[i];
      cell.title = '#' + colors[i];
      row.appendChild(cell);
      
      GM.event.register(cell, 'click', this.pickColor, this);
      
      for (var j = changes.length - 1; j >= 0; j -= 1) {
        var newColor = '#' + colors[i].replace(/\D/gi, changes[j]);
        
        var cell = document.createElement('td');
        cell.style.backgroundColor = newColor; 
        cell.title = newColor;
        row.appendChild(cell);
        
        GM.event.register(cell, 'click', this.pickColor, this);
      }
    }
    
    var greys = ['F', 'E', 'C', 'A', '9', '7', '3', '1', '0'];
    
    var row = document.createElement('tr');
    table.appendChild(row);
    
    for (var i = 0; i < greys.length; i += 1) {
      var newColor = '#' + greys[i];
      
      for (var j = 0; j < 5; j += 1) {
        newColor += greys[i];
      }
      
      var cell = document.createElement('td');
      cell.style.backgroundColor = newColor; 
      cell.title = newColor;
      row.appendChild(cell);
      
      GM.event.register(cell, 'click', this.pickColor, this);
    }
    
    this.table = table;
  }

  var cells = this.table.getElementsByTagName('td');
  
  for (var i = 0; i < cells.length; i += 1) {
    cells[i].className = (cells[i].title === this.element.value) ? 'selected' : null;
  }

  var element = this.element;
  var top     = 0;
  var left    = 0;
  
  
  while (element && element.offsetTop) {
    top  += element.offsetTop - element.scrollTop;
    left += element.offsetLeft - element.scrollLeft;
   
    element = element.offsetParent;
  }
  
  this.lock = new GM.dom.Lock({color: 'FFF', opacity: 0, zIndex: 110});
  
  GM.event.register(this.lock.getElement(), 'click', this.close, this);
  
  this.table.style.position = 'fixed';
  this.table.style.zIndex   = 120;
  this.table.style.left     = (left + 1) + 'px';
  this.table.style.top      = (top + parseInt(this.element.offsetHeight, 10) ) + 'px';
  
  document.body.appendChild(this.table);
  
  this.isOpen = true;
  
  GM.cms.popup.PopupManager.register(this);  
};

GM.cms.util.ColorController.prototype.close = function (e)
{
  if (this.lock) {
    GM.event.unregister(this.lock.getElement(), 'click', this.close);
    
    this.lock.unlock();
    
    this.lock = null;
  }
  
  if (this.table) {
    this.table.parentNode.removeChild(this.table);
  }
  
  this.isOpen = false;
  
  GM.cms.popup.PopupManager.unregister(this);
};

GM.cms.util.ColorController.prototype.pickColor = function (e)
{
  GM.event.cancelBubble(e);
  
  var target = GM.event.getTarget(e);
  
  this.element.value = target.title;
  
  this.close(e);
};

GM.cms.util.ColorController.prototype.destroy = function (e)
{
  if (this.isOpen) {
    this.close(e);
  }
  
  if (this.table) {
    var cells = this.table.getElementsByTagName('td');
    
    for (var i = 0; i < cells.length; i += 1) {
      GM.event.unregister(cells[i], 'click', this.pickColor);
    }
  }
  
  if (this.opener) {  
    GM.event.unregister(this.opener, 'click', this.openPicker);
  
    this.opener.parentNode.removeChild(this.opener);
  }
};

