var Base = new Class({
  isIE: false,
  running: false,
  usingComponents: ["Menu","Collapse","Page_admin","Calendar","Tab","Popup"],
  components: false,
  runningComponents: false,
  componentsElements: false,
  
  initialize: function() 
  {
    this.components = new Array();
    this.runningComponents = new Array();
    this.componentsElements = new Array();

    if (navigator.userAgent.indexOf("MSIE") >= 0) this.isIE = true;
  },
  
  init: function() 
  {
    this.initializeComponents();
    this.initializeCallbacks();
  },

  loadComponents: function()
  {
    for (var i = 0; i < this.usingComponents.length; i++) {
      var name = this.usingComponents[i];
      var elements = $$(".jsComponent"+name);
      if (elements != "") {
        this.loadJS("/lib/js/components/"+name.toLowerCase()+"/"+name+".class.js");
        elements.each(function(element) {
          if (element.hasClass("preload")) element.remove();
        });
        this.componentsElements[i] = elements;
      } else this.usingComponents[i] = "";
    }
    this.loadJS("/lib/js/base/bootstrap.js");
    this.running = true;
  },

  parseElement: function (element)
  {
    var update = false;
    for (var i = 0; i < this.usingComponents.length; i++) {
      var name = this.usingComponents[i];
      if (name == "") continue;

      var elements = $ES(".jsComponent"+name, element);
      if (elements != "") {
        for (var j = 0; j < elements.length; j++) {
          this.componentsElements[i].push(elements[j]);
          update = true;
        }
      } 
    }
    if (update) this.initializeComponents();
  },
  
  initializeComponents: function()
  {
    for (var i = 0; i < this.usingComponents.length; i++) {
      var name = this.usingComponents[i];
      if (name == "") continue;
      var elements = this.componentsElements[i];

      if (elements != "") {
        for (var j = 0; j < elements.length; j++) {
          var componentId = (i+1)*j;
          if (typeof(this.runningComponents[name]) != "object") 
            this.runningComponents[name] = new Array();
          if (typeof(this.components[elements[j].id]) != "object") {
            this.components[elements[j].id] = eval("new "+name+"('"+elements[j].id+"')");
          }
          if ($(elements[j]).hasClass("jsComponent"+name)) {
            this.components[elements[j].id].run(elements[j]);
          }
          this.runningComponents[name][elements[j].id] = this.components[elements[j].id]
          $(elements[j]).removeClass("jsComponent"+name);
        }
      }
    }
  },
  
  initializeCallbacks: function()
  {
    window.addEvent('resize', function() { base.repaint(); });
  },
  
  repaint: function()
  {
    this.components.each ( function ( id ) {
      if (this.components[id]) this.components[id].repaint();
    });
  },
  
  loadJS: function( jsFile )
  {
    var script = new Element("script", {
      "type": "text/javascript",
      "src": jsFile
    });

    document.getElement("head").appendChild(script);
  },
  
  getWindowSize: function ()
  {
    return {
      "width": (window.getWidth()<=0?document.body.clientWidth:window.getWidth()),
      "height": (window.getHeight()<=0?document.body.clientHeight:window.getHeight())
    }
  }
});

/* Initialize Javascript framework */
var base;

var callback = function() { if (!base) { base = new Base(); } else if (!base.running) { base.loadComponents(); } }
window.addEvent('domready', callback);
window.addEvent('load', callback);
