
/**
 * Object to store all o2c stuff
 */
var o2c = {

  /**
   * Set this to true to load the jQuery library
   */
  getjQuery : false,

  /**
   * Here plugins can save stuff to "get off the street" = global namespace
   */
  plugin : {
  },

  /**
   * everything related to events
   */
  event : {

    // registry for onload functions
    // all of its properties will be executed on window.onload
    pageload : {

      init : function () {
        for (var e in o2c.event.pageload) {
          if (e != "init" && typeof o2c.event.pageload[e] == "function") {
            o2c.event.pageload[e] ();
          }
        }
      },
      
      o2cdefault : function () {
        o2c.style.defaultFontSize = o2c.style.getCurrentFontSize ();
        if (document.cookie && document.cookie.search (/fontsize=/) != -1) {
          var newDefault = document.cookie.replace (/.*fontsize=([^;]+).*/, "$1");
          document.getElementsByTagName ("body")[0].style.fontSize = newDefault;
        }
        o2c.style.setHeight (true);
        o2c.dom.fakeTargetBlank ();
        if (o2c.getjQuery && typeof jQuery == "undefined") {
          var script = document.createElement ("script");
          script.setAttribute ("src", site_url+"mat/jslib/jquery.js");
          script.setAttribute ("type", "text/javascript");
          document.getElementsByTagName ("head")[0].appendChild (script);
        }
      }

    }
    
  },
  
  /**
   * everything related to css and styles
   */
  style : {
  
    defaultFontSize : "12px",
  
    /**
     * size the font: current size +/- diff
     */
    sizeFont : function (diff) {
      if (!Number (diff)) {
        document.cookie = "fontsize="+o2c.style.defaultFontSize+"; expires=Mon, 10 Sep 2040 18:17:28 GMT";
        return (document.getElementsByTagName ("body")[0].style.fontSize = o2c.style.defaultFontSize);
      }
      var curSize = o2c.style.getCurrentFontSize ();
      var newSize = (Number (curSize.replace (/ *px/, "")) + Number (diff)) + "px";
      document.cookie = "fontsize="+newSize+"; expires=Mon, 10 Sep 2040 18:17:28 GMT";
      o2c.style.setHeight (false);
      window.setTimeout (function () { o2c.style.setHeight (true); }, 200);
      return (document.getElementsByTagName ("body")[0].style.fontSize = newSize);
    },

    /**
     * get the current font size of the body tag
     */
    getCurrentFontSize : function () {
      var body = document.getElementsByTagName ("body")[0];
      var curSize = body.style.fontSize;
      if (!curSize) {
        if (window.getComputedStyle) {
          curSize = window.getComputedStyle (body, "").getPropertyValue ("font-size");
        } else if (body.currentStyle) {
          curSize = body.currentStyle["fontSize"];
        } else {
          curSize = "12px";
        }
      }
      return curSize;
    },

    /**
     * function for uniform changing of all column lengths
     */
    setHeight : function (set) {
      var left  = document.getElementById ('leftcolumn')?  document.getElementById ('leftcolumn')  : { offsetHeight : 0 };
      var right = document.getElementById ('rightcolumn')? document.getElementById ('rightcolumn') : { offsetHeight : 0 };
      var mid   = document.getElementById ('midcolumn')?   document.getElementById ('midcolumn')   : document.getElementById ('fullmidcolumn');
      if (!set) {
        try { left.style.height  = ''; } catch (e) {}
        try { right.style.height = ''; } catch (e) {}
        try { mid.style.height   = ''; } catch (e) {}
      } else {
        var maxheight = Math.max (
                          Math.max (left.offsetHeight, right.offsetHeight), 
                          mid.offsetHeight);
        try { left.style.height  = ( maxheight
                               - Number (o2c.style.getStyle (left,  'paddingTop').replace (/px/, ''))
                               - Number (o2c.style.getStyle (left,  'paddingBottom').replace (/px/, '')) 
                             ) + "px"; } catch (e) {}
        try { right.style.height = ( maxheight
                               - Number (o2c.style.getStyle (right, 'paddingTop').replace (/px/, '')) 
                               - Number (o2c.style.getStyle (right, 'paddingBottom').replace (/px/, '')) 
                             ) + "px"; } catch (e) {}
        try { mid.style.height   = ( maxheight
                               - Number (o2c.style.getStyle (mid,   'paddingTop').replace (/px/, ''))
                               - Number (o2c.style.getStyle (mid,   'paddingBottom').replace (/px/, '')) 
                             ) + "px"; } catch (e) {}
      }
    },
    
    /**
     * unfold an inactive, not clickable navigation node
     */
    unfold : function (id) {
      if (document.getElementById (id) && document.getElementById (id).getElementsByTagName ("ul")[0]) {
        var ul = document.getElementById (id).getElementsByTagName ("ul")[0];
        console.log (o2c.getjQuery);
        if (typeof jQuery != "undefined") {
          if (ul.style.display == "none") {
            o2c.dom.removeClass (document.getElementById (id), "unfolded");
            $(ul).slideDown ("normal");
          } else {
            o2c.dom.addClass (document.getElementById (id), "unfolded");
            $(ul).slideUp ("normal");
          }
        } else {
          if (ul.style.display == "none") {
            o2c.dom.removeClass (document.getElementById (id), "unfolded");
            ul.style.display = "";
          } else {
            o2c.dom.addClass (document.getElementById (id), "unfolded");
            ul.style.display = "none";
          }
        }
      }
    },
    
    /**
     * get the actual style of an element
     */
    getStyle : function (element, property, pseudoelement) {
      if (!pseudoelement) { pseudoelement = null; }
      if (window.getComputedStyle) {
        return window.getComputedStyle (element, pseudoelement)[property];
      } else if (element.currentStyle) {
        return element.currentStyle[property];
      } else if (element.style[property]) {
        return element.style[property];
      }
    }

  },
  
  /**
   * everything related to DOM manipulation
   */
  dom : {
  
    /**
     * provide links with rel="external" with a target="_blank" attribute
     */
    fakeTargetBlank : function () {
      var as = document.getElementsByTagName("a");
      var i = 0;
      for (i = 0; i < as.length; i++) {
        var a = as[i];
        if (a.getAttribute ("href") && a.getAttribute ("rel") && a.getAttribute ("rel").search (/\bexternal\b/) > -1) {
          a.target = "_blank";
          a.className += " external";
        }
      }
      var forms = document.getElementsByTagName("form");
      for (i = 0; i < forms.length; i++) {
        var form = forms[i];
        if (form.getAttribute ("class") && form.getAttribute ("class").search(/\bexternal\b/) > -1) {
          form.target = "_blank";
        }
      }
    },
    
    /**
     * look for a certain class
     *
     * @param {Object} node node to query for a certain class
     * @param {String} className class name to look for
     * @return bool
     */
    hasClass : function (node, className) {
      var current = node.className;
      if (current == "") {
        return false;
      } else if (current.search (new RegExp ("\\b"+className+"\\b")) > -1) {
        return true;
      }
      return false;
    },

    /**
     * add a new class
     *
     * @param {Object} node node to add a certain class
     * @param {String} className class name to add
     */
    addClass : function (node, className) {
      var current = node.className;
      if (current == "") {
        node.className = className;
      } else if (!o2c.dom.hasClass (node, className)) {
        node.className += " "+className;
      }
    },

    /**
     * remove a class
     *
     * @param {Object} node node to remove a certain class
     * @param {String} className class name to remove
     */
    removeClass : function (node, className) {
      var current = node.className;
      if (current == "") {
        return true;
      } else if (o2c.dom.hasClass (node, className)) {
        node.className = current.replace (new RegExp ("\\b"+className+"\\b"), " ");
      } else {
        return true;
      }
    }

  
  }

};

// on page load initialize this
window.onload = o2c.event.pageload.init;


