GM.namespace('GM.cms.util');

// Target

GM.cms.util.addTarget = function ()
{
  var base = document.getElementsByTagName('base');
  
  if (base[0]) {
    var links = document.getElementsByTagName('a');
    
    for (var i = 0; i < links.length; i += 1) {
      if (links[i].href.indexOf(base[0].href) === -1) {
        links[i].target = '_blank';
      }
    }
  }
}

// Scroller

GM.cms.util.Scroller = function (element)
{
  this.scroller = element;
  this.addHandlers();
}

GM.cms.util.Scroller.prototype.addHandlers = function ()
{
  this.left  = this.scroller.firstChild;
  this.right = this.scroller.lastChild;
  
  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.clickLeft = function (e)
{
  var elements = GM.dom.getElementsByClassName('scroll', 'div', 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 + 2].style.visibility = 'hidden';
      elements[i + 2].style.position   = 'absolute';
      
      if (i === 1) {
        GM.event.unregister(this.left, 'click', this.clickLeft);
        
        this.left.className += ' disabled';
      }
      
      if ((i + 2) < 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', 'div', this.scroller);
  
  for (var i = (elements.length - 1); i >= 0; 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 - 2].style.visibility = 'hidden';
      elements[i - 2].style.position   = 'absolute';
      
      if (i === elements.length - 2) {
        GM.event.unregister(this.right, 'click', this.clickRight);
      
        this.right.className += ' disabled';
      }
      
      if ((i - 2) === 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.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.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;
      }
    }
  }
}
