
var req;
var currentListener;
var loader = create('Loading', Node.TEXT_NODE), loadTimer;

function showLoader(append) {
  if (typeof append == "string") {
    loader.nodeValue += ".";        
  }
  else {
    loader.nodeValue = "Loading";
    ref('messageBox').appendChild(loader);
  }
  loadTimer = setTimeout("showLoader('.')", 750);
}

function hideLoader() {
  clearTimeout(loadTimer);
  ref('messageBox').removeChild(loader);  
}


/* constants are not recognised in IE 
const SHOW_MENU = 1;
const HIDE_MENU   = 2; 
*/
var SHOW_MENU = 1, HIDE_MENU = 2;


function getData(url) {
	if (window.XMLHttpRequest) {
	  req = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	// create a timestamp to append to URL to prevent 
	// caching by the client browser...
	var dt = new Date();
	var time = dt.getTime();
  
  var h = window.location.href.match(/http\:\/\/(?:[^\/]+)/);
  
  // this currently assumes only a subdomain or stored in /cms/
  if (h[0].indexOf('cms') == -1) {
    h[0] += "/cms";  
  }
  
  showLoader();  
  req.onreadystatechange = displayData;
	req.open("GET", h[0] + "/ext/x_dynamic_menus.php?url=" + url + "&stamp=" + time);
	req.send(null); 
}


function displayData() {
	if (req.readyState == 4) {
    hideLoader();		
		var newDiv = create('div');
		currentListener.elem.parentNode.parentNode.appendChild(newDiv);
		newDiv.style.display = "block";
		newDiv.innerHTML = req.responseText;		 
		currentListener.html = newDiv;
		currentListener.switchBehaviour(HIDE_MENU);
	}  
}

function hideData() {
  currentListener.elem.parentNode.parentNode.removeChild(currentListener.html);  
}

function XListener(elem) { // extends EventListener
  EventListener.call(this, elem);
  var self = this;  
  var icons = {}, titles = {};
  this.html = undefined;
  this.visible = false;
  
  function __constructor() {
    self.register('click', self.show);    
    
    // pre-cache the button icons?
    
    var h = (window.location.href.indexOf('//cms') != -1) ? "/" : "/cms/";

    icons.max = create('img');
    icons.max.src = h + "g/but/plus.png";
    icons.min = icons.max.cloneNode(true);
    icons.min.src = h + "g/but/minus.png";    
    
    self.elem.appendChild(icons.max);
    self.elem.className = "tiny";
    titles.max = "Get references for the last 10 " + self.elem.nextSibling.nodeValue + " posted.";
    titles.min = "Hide the references for " + self.elem.nextSibling.nodeValue;
    self.elem.title = titles.max;  
          
  }
    
  this.show = function(evt) {   
    self.invoke(evt);
    self.cancelDefault();
    if (currentListener instanceof XListener && currentListener.visible) {
      hideData();
      currentListener.switchBehaviour(SHOW_MENU);  
    }
    currentListener = self;
        
    if (typeof self.html == "undefined") {
      getData(self.elem.parentNode.href);    
    }
    else {
      self.elem.parentNode.parentNode.appendChild(self.html); 
      self.switchBehaviour(HIDE_MENU);
    }
    
    self.visible = true;
  }
  
  this.hide = function(evt) {
    self.invoke(evt);
    self.cancelDefault();
    hideData();
    self.switchBehaviour(SHOW_MENU);          
    self.visible = false;
  }
  
  this.switchBehaviour = function(state) {
    var src, title, unregister, register;
    if (state & HIDE_MENU) {
      this.elem.replaceChild(icons.min, icons.max);      
      this.elem.title = titles.min;  
      unregister = this.show;
      register = this.hide;
    }
    else {
      this.elem.replaceChild(icons.max, icons.min);
      this.elem.title = titles.max; 
      unregister = this.hide;
      register = this.show;
    }

    this.unregister('click', unregister);
    this.register('click', register);

  }  
  
  __constructor();  
  
}
XListener.prototype = new EventListener;
XListener.prototype.constructor = XListener;

addLoadEvent( function() { 
	 var menu = ref('menu'), anc;
	 if (menu) {
	   (function(elem) {
    	 anc = elem.get('a')(0);
    	 if ( (anc.href.indexOf('manage') != -1) && 
    	      (anc.href.indexOf('configuration') == -1) && 
          (anc.href.indexOf('admin') == -1) ) {                 
         var btn, listener;
         btn = create('button');
         elem.firstChild.insertBefore(btn, elem.firstChild.firstChild);
    	   if (anc.href.indexOf('amend') == -1) {          
           listener = new XListener(btn);       
         }
         else {
          var icon = create('img');
          var h = (window.location.href.indexOf('//cms') != -1) ? "/" : "/cms/";    
          icon.src = h + "g/but/blank.png";    
          btn.appendChild(icon);          
          btn.className = "tiny";  
         }
       }  	    
	   }).Iterate(menu.get('li')());
	 }
});
