GM.namespace('GM.cms');

GM.cms.help = function ()
{
  var object,
      isOpen;

  return {
  
    init: function ()
    {
      GM.cms.help.addHandlers(document);
      
      object = document.getElementById('help');
      
      if (object) {
        GM.cms.help.prepare();
      }
    },
    
    addHandlers: function (element)
    {
      var links = GM.dom.getElementsByClassName('help', 'a', element);
      
      for (var i = 0; i < links.length; i +=1) {
        GM.event.register(links[i], 'click', GM.cms.help.click, links[i]);
      }
    },
    
    removeHandlers: function (element)
    {
      var links = GM.dom.getElementsByClassName('help', 'a', element);
      
      for (var i = 0; i < links.length; i +=1) {
        GM.event.unregister(links[i], 'click', GM.cms.help.click);
      }
    },
    
    prepare: function ()
    {
      GM.event.register(window, 'resize', GM.cms.help.resize);
      GM.event.register(object.firstChild.nextSibling, 'click', GM.cms.help.close);    
      
      object.style.top = (document.getElementById('toolbar').offsetTop + document.getElementById('toolbar').offsetHeight - 4) + 'px';
      
      GM.cms.help.resize();
      
      document.body.style.marginRight = object.offsetWidth + 'px';
      
      isOpen = true;
    },
    
    click: function (e)
    {
      GM.event.preventDefault(e);
      this.blur();
      
      if (!isOpen) {
        if (!object) {
          object = document.createElement('div');
          object.id = 'help';
          document.body.appendChild(object);
          
          var title = document.createElement('div');
          title.className = 'title';
          title.innerHTML = 'Help';
          object.appendChild(title);
    
          var close = document.createElement('div');
          close.className = 'close';
          close.innerHTML = 'x';
          object.appendChild(close);
          
          var iframe = document.createElement('iframe');
          iframe.frameBorder = 0;
          object.appendChild(iframe);
        } else {
          object.style.display = 'block';
        }
        
        GM.cms.help.prepare();
      }
      
      object.lastChild.src = this.href; 
    },
    
    close: function ()
    {
      object.lastChild.src = object.lastChild.src.replace(/\?code=.*/, '?code=close');
      
      GM.event.unregister(window, 'resize', GM.cms.help.resize);
      GM.event.unregister(object.firstChild.nextSibling, 'click', GM.cms.help.close); 
      
      document.body.style.marginRight = 0;
      
      object.style.display = 'none';
      
      isOpen = false;
    },
    
    resize: function ()
    {
      object.lastChild.style.height = (object.offsetHeight - 36) + 'px';  
    }
  }
}();

GM.event.register(window, 'load', GM.cms.help.init);
