
  var Utils = function() {
  
    var getWindowSize = function() {
      return { "width" : $(window).width(), "height" : $(window).height() };
    };

    var getExactPosition = function(obj) {
      var curr = obj;
      
      var top = 0;
      var left = 0;
      
      while(curr != null) {
        if(isNaN(curr.offsetTop) || isNaN(curr.offsetLeft)) {
          break;
        }
        top += curr.offsetTop;
        left += curr.offsetLeft;
        
        curr = curr.parentNode;
      }
      
      return { "top" : top, "left" : left };
    };

    var genericMove = function(newPos, element) {
      newPos.Apply(element);
    };
    
    var hide = function(obj) {
      if(typeof(obj) == "string") {
        obj = document.getElementById(obj);
      }
      if(obj != null) {
        obj.style.visibility = 'hidden';
        obj.style.display = 'none';
      }
    };
    
    var show = function(obj) {
      if(typeof(obj) == "string") {
        obj = document.getElementById(obj);
      }
      if(obj != null) {
        obj.style.visibility = 'visible';
        obj.style.display = 'block';
      }
    };
    
    var swap = function(obj) {
      if(typeof(obj) == "string") {
        obj = document.getElementById(obj);
      }
      if(obj != null) {
        if(obj.style.visibility == 'hidden') {
          show(obj);
        }
        else {
          hide(obj);
        }
      }
    };

    var removeChildren = function(node) {
      if(node == null) {
        return;
      }
      for(var curr = node.firstChild; curr != null; ) {
        var next = curr.nextSibling;
        node.removeChild(curr);
        curr = next;
      }
    };
    
    var setConfirmUnsavedUnload = function(on) {
      window.onbeforeunload = (on) ? unsavedUnloadMessage : null;
    };

    var unsavedUnloadMessage = function() {
      return 'You have made changes that will be lost if you do not save your work before leaving.';
    };
    
    var createZoomSlider = function(sliderID, valueID) {
      $(sliderID).slider({
        value:100,
        min: 50,
        max: 200,
        step: 10,
        slide: function(event, ui) {
          $(valueID).text(ui.value + '%');
          doc.zoom(ui.value);
        },
        change: function(event, ui) { $(valueID).text(ui.value + '%'); doc.zoom(ui.value); }
      });

      $(valueID).text($(sliderID).slider("value") + '%');

    };
    
    var isBrowserIE = function() {
      return (navigator.userAgent.indexOf('MSIE') != -1 ? true : false);
    };
    
    var createTEModal = function(teDivId) {
      $(teDivId).dialog({
        position: 'center',
        width: $(window).width() - 60,
        height: $(window).height() - 60,
        modal: true,
        draggable: false,
        resizable: false,
        autoOpen: false,
        close: function(event, ui) {
          $(this).empty();
        }
      });
      
    };

    var loadTEModal = function(teDivId, siteContext, templateId) {
      $(teDivId).append(document.createElement("iframe"));
      $(teDivId + " > iframe").attr("src", "/" + siteContext + "/edittemplate.do?modal&template=" + templateId);
      $(teDivId + " > iframe").attr("scrolling", "auto");
      $(teDivId + " > iframe").attr("frameborder", 0);
      $(teDivId + " > iframe").css({"width" : "100%", "height" : "100%", "display" : "block", "clear" : "both", "margin" : "auto"});
      $(teDivId).dialog('open');
    };

    
    return {
      "getWindowSize" : getWindowSize,
      "getExactPosition" : getExactPosition,
      "genericMove" : genericMove,
      "hide" : hide,
      "show" : show,
      "swap" : swap,
      "removeChildren" : removeChildren,
      "setConfirmUnsavedUnload" : setConfirmUnsavedUnload,
      "createZoomSlider" : createZoomSlider,
      "isBrowserIE" : isBrowserIE,
      "createTEModal" : createTEModal,
      "loadTEModal" : loadTEModal
    };
    
  }();

  /*
   *
   * Debugger
   *
   */
  function Debugger(debugId) {
    if(debugId != null) {
      this.debugItem = document.getElementById(debugId);
      Debugger.theInstance = this;
    }
  }
  
  Debugger.prototype.debugItem = null;
  Debugger.theInstance = null;
  
  Debugger.debug = function(message) {
    if(!Debugger.theInstance) {
      return;
    }
      
    var tmp = document.createElement('DIV');
    tmp.align = "left";
    
    tmp.innerHTML = message;
    Debugger.theInstance.debugItem.insertBefore(tmp, Debugger.theInstance.debugItem.firstChild);
  }
  
  Debugger.clear = function() {
    if(!Debugger.theInstance) {
      return;
    }
      
    Debugger.theInstance.debugItem.innerHTML = "";
  }
  