(function(win, doc) {

var h = doc.getElementsByTagName('head')[0],
    m = Math;

// a couple utility functions

FM.extend({
  inArray: function(el, arr) {
    if (typeof Array.prototype.indexOf == 'function') {
      FM.inArray = function(el, arr) {
        return arr.indexOf(el) !== -1;
      };
    } else {
      FM.inArray = function(el, arr) {
        for (var i = arr.length - 1; i >= 0; i--){
          if (arr[i] === el) {
            return true;
          }
        }
        return false;
      };
    }
    return FM.inArray(el, arr);
  },
  add: function(nums) {
    var tally = 0;
    for (var i = nums.length - 1; i >= 0; i--) {
      tally += nums[i];
    }

    return tally;
  },

  /** =insert a CSS <link> element in the head.
  ************************************************************/
  addLink: function(params) {

    var opts = FM.extend({
      media: 'screen',
      rel: 'stylesheet',
      type: 'text/css',
      href: ''
    }, params);

    // bail out if the <link> element is already there
    for (var i=0, lnks=h.getElementsByTagName('link'), ll=lnks.length; i < ll; i++ ) {
      if (!opts.href || lnks[i].href.indexOf(opts.href) !== -1) {
        return;
      }
    }
    var lnk = doc.createElement('link');
    for (var prop in opts) {
      lnk[prop] = opts[prop];
    }
    h.appendChild(lnk);

    lnk = null;
  }
});



/** =generic addEventListener
    used almost solely as more reliable window.onload
    because of how LABjs loads stuff.
************************************************************/

var listener = function() {
  if (typeof win.addEventListener === 'function') {
    listener = function(el, type, fn) {
      el.addEventListener(type, fn, false);
    };
  } else if (typeof doc.attachEvent == 'function' || typeof doc.attachEvent == 'object') {

    listener = function(el, type, fn) {
      el.attachEvent('on' + type, fn);
    };
  } else {
    listener = function(el, type, fn) {
      el['on' + type] = fn;
    };
  }
  return listener;
};


FM.addEvent = listener();

// call addEvent on window load
// redefine addEvent to call the function immediately if window is already loaded

FM.addEvent(win, 'load', function() {
  document.body.className += ' js-loaded';
  FM.windowLoaded = true;
  var _listener = FM.addEvent;

  FM.addEvent = function(el, type, fn) {
    if (el == window && type === 'load') {
      fn();
    } else {
      _listener(el, type, fn);
    }
  };
});

})(window, window.document);
