text: var debugWindow = null;
  function debug(text, reverse) {
  	if (debugWindow == null)
   		return;
  
  	time = "-"; //new Date();
  	if (reverse) {
  		$('debug').innerHTML = time + " " + text + "<br>"+ 	$('debug').innerHTML;
  		debugWindow.getContent().scrollTop=0;
  	}
  	else {
  		$('debug').innerHTML +=  time + " " + text + "<br>";
  		debugWindow.getContent().scrollTop=10000; // Far away 
  	}
  }
  
  function hideDebug() {
  	if (debugWindow) {
  		debugWindow.destroy();
  		debugWindow = null;
  	}
  }
  
  function showDebug(bShow) {
   if (debugWindow == null) {
    debugWindow = new Window('debug_window', {className: 'dialog',width:250, height:100, right:4, bottom:42, zIndex:1000, opacity:1, showEffect: Element.show, resizable: true, title: "Debug"})
    debugWindow.getContent().innerHTML = "<style>#debug_window .dialog_content {background:#000;}</style> <div id='debug'></div>";
    date=new Date;
      date.setMonth(date.getMonth()+3);
      
    //debugWindow.setCookie(null, date);
   }
   if( typeof bShow == 'undefined' || bShow)debugWindow.show()
  }
  
  
  function clearDebug() {
  	if (debugWindow == null)
   		return;
  	$('debug').innerHTML = "";
  }
  
  /**
   * document.createElement convenience wrapper
   *
   * The data parameter is an object that must have the "tag" key, containing
   * a string with the tagname of the element to create.  It can optionally have
   * a "children" key which can be: a string, "data" object, or an array of "data"
   * objects to append to this element as children.  Any other key is taken as an
   * attribute to be applied to this tag.
   *
   * Available under an MIT license:
   * http://www.opensource.org/licenses/mit-license.php
   *
   * @param {Object} data The data representing the element to create
   * @return {Element} The element created.
   */
  function $E(data) {
    var el;
    if ('string'==typeof data) {
        el=document.createTextNode(data);
    } else {
      //create the element
      el=document.createElement(data.tag);
      delete(data.tag);
  
      //append the children
      if ('undefined'!=typeof data.children) {
        if ('string'==typeof data.children ||'undefined'==typeof data.children.length) {
          //strings and single elements
          el.appendChild($E(data.children));
        } else {
          //arrays of elements
          for (var i=0, child=null; 'undefined'!=typeof (child=data.children[i]); i++) {
              el.appendChild($E(child));
          }
        }
        delete(data.children);
      }
  
      //any other data is attributes
      for (attr in data) {
        el[attr]=data[attr];
      }
    }
  
    return el;
  }
  
  // FROM Nick Hemsley
  var Debug = {
  	inspectOutput: function (container, within) {
  		within = within || debugWindow.getContent()
  		
  		if (debugWindow == null)
   			return;
  
  		within.appendChild(container)
  	},
  	
  	inspect: function(object) {
  		var cont = $E({tag: "div", className: "inspector"})
  		Debug.inspectObj(object, cont)
  		debugWindow.getContent().appendChild(cont)
  	},
  	
  	inspectObj: function (object, container) {
  		for (prop in object) {
  			Debug.inspectOutput(Debug.inspectable(object, prop), container)
  		}
  	},
  	
  	inspectable: function(object, prop) {
  		cont = $E({tag: 'div', className: 'inspectable', children: [prop + " value: " + object[prop] ]})
  		cont.toInspect = object[prop]
  		Event.observe(cont, 'click', Debug.inspectClicked, false)
  		return cont
  	},
  	
  	inspectClicked: function(e) {
  		Debug.inspectContained(Event.element(e))
  		Event.stop(e)
  	},
  	
  	inspectContained: function(container) {
  		if (container.opened) {
  			container.parentNode.removeChild(container.opened)
  			delete(container.opened)
  		} else {
  			sibling = container.parentNode.insertBefore($E({tag: "div", className: "child"}), container.nextSibling)
  			if (container.toInspect)
  				Debug.inspectObj(container.toInspect, sibling)
  			container.opened = sibling
  		}
  	}
  }
  var inspect = Debug.inspect;
  