/**
  * DOM Extensions
  *
  * Adds a DomHelper object with a variety of functions
  */
var DomHelper = function() {
  /**
   * HTMLElement.prototype.setPosition
   *
   * Moves object to a page x/y coordinate
   * @param object pos An object with integer x and y attributes defining the page x/y coordinate for the object.  If not provided, centers the object at 1/3 down the page
   * @returns void
   */
  var setPosition = function(dom_elt, pos) {
    var elt_pos = {
      'x':parseInt((document.body.size.w - dom_elt.size.w)/2),
      'y':parseInt((document.body.size.h - dom_elt.size.h)/3)
    }
    if (typeof pos == 'number') {
      if (pos.x && typeof pos.x == 'number') {
        elt_pos.x = pos.x;
      }
      if (pos.y && typeof pos.y == 'number') {
        elt_pos.y = pos.y;
      }
    }
    if (dom_elt.style.position != 'absolute'
        && dom_elt.style.position != 'fixed'
        && dom_elt.style.position != 'relative'
    ) {
      dom_elt.style.position = 'absolute';
    }
    dom_elt.style.left = elt_pos.x + 'px';
    dom_elt.style.top = elt_pos.y + 'px';
  },
  triggerEvent = function(dom_elt, evt) {
    //From http://jehiah.cz/a/firing-javascript-events-properly
    if (document.createEventObject && !dom_elt.dispatchEvent){
      // dispatch for IE
      var event = document.createEventObject();
      return dom_elt.fireEvent('on'+evt, event);
    } else {
      // dispatch for firefox + others
      var event = document.createEvent("HTMLEvents");
      event.initEvent(evt, true, true); // event type, bubbling, cancelable
      return !dom_elt.dispatchEvent(event);
    }
  },
  toggleClass = function(dom_elt, class_name) {
    var cls = dom_elt.className;
    if (cls.indexOf(class_name) > -1) {
      cls = cls.replace(class_name, '');
    } else {
      cls += ' ' + class_name;
    }
    dom_elt.className = cls;
  },
  addClass = function(dom_elt, class_name) {
    dom_elt.className = (dom_elt.className.replace(class_name, '') + ' ' + class_name).toString().trim();
  },
  removeClass = function(dom_elt, class_name) {
    dom_elt.className = dom_elt.className.replace(class_name, '').trim();
  },
  insertAfter = function(dom_elt, elt) {
    //target is what you want it to go after. Look for dom_elt element's parent.
    var parent = dom_elt.parentNode;

    //if the parents lastchild is the elt_target...
    if (parent.lastchild == dom_elt) {
      //add the elt_new after elt_target
      parent.appendChild(elt);
    } else {
      // else elt_target has siblings, insert the new element between elt_target and it's next sibling.
      parent.insertBefore(elt, dom_elt.nextSibling);
    }
  },
  /**
   * HTMLElement.prototype.observe
   *
   * Wrapper function for adding a DOM event listener
   * @param string evt The event to attach a listener to
   * @param function handler A function to be called when the event occurs
   */
  observe = function (dom_elt, evt, handler) {
    if (window.addEventListener) {
      dom_elt.addEventListener(evt, handler, false);
    } else if (window.attachEvent) {
      dom_elt.attachEvent('on' + evt, handler);
    }
  };

  return {
  /*
    'position': {
      'x': dom_elt.offsetLeft,
      'y': dom_elt.offsetTop
    },
    'size': {
      'w': dom_elt.offsetWidth,
      'h': dom_elt.offsetHeight
    },
  */
    'setPosition':setPosition,
    'triggerEvent': triggerEvent,
    'class': {
      'toggle':  toggleClass,
      'add': addClass,
      'remove': removeClass
    },
    'insertAfter': insertAfter,
    'observe': observe
  }
}();
