function msUtils() {
  this.Format = new format();
  this.BrowserCompat = new browserCompat();
  this.Logger = new logger();
}
var Utils = Utils ? Utils : new msUtils();

// BEGIN: Format functions ==========================================

// USE IN Utils NAMESPACE
// EX: Utils.Format.addCommas(num)
function format() {};

// Formats a number in a US-style comma-separated number
// like 100000 into 100,000
format.prototype.addCommas = function(num) {
    num += '';
    // Start from scratch, get rid of the commas
    num = num.replace(/,/,'')
    var x = num.split('.');
    var x1 = x[0];
    var x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}

// END: Format functions ============================================

// BEGIN: Compat functions ==========================================

// USE IN Utils NAMESPACE
// EX: Utils.BrowserCompat.attachEvent(obj, eventName, eventHandler)
function browserCompat() {};

// Browser independent way to attach an event
browserCompat.prototype.attachEvent = function(obj, eventName, eventHandler) {
    if(obj) {
        // e.g. load vs onload
        if(eventName.substring(0, 2) == 'on') {
            eventName = eventName.substring(2,eventName.length);
        }
        if (obj.addEventListener) { // FF/W3C
            obj.addEventListener(eventName, eventHandler, false);
        } else if (obj.attachEvent) { // IE
            obj.attachEvent('on'+eventName, eventHandler);
        }
    }
}

// Next three functions detect whether the mouse cursor is inside an element or any of its children
// Reference: http://www.faqts.com/knowledge_base/view.phtml/aid/1606/fid/145
// RE: HS 20175
browserCompat.prototype.containsDOM = function(container, containee) {
  var isParent = false;
  do {
    if ((isParent = container == containee))
      break;
    try { containee = containee.parentNode; }
    catch (err) { break; }
  }
  while (containee != null);
  return isParent;
}
browserCompat.prototype.checkMouseEnter = function(element, evt) {
  if (element.contains && evt.fromElement) { // IE
    return !element.contains(evt.fromElement);
  }
  else if (evt.relatedTarget) { // FF/W3C
    return !this.containsDOM(element, evt.relatedTarget);
  }
}
browserCompat.prototype.checkMouseLeave = function(element, evt) {
  if (element.contains && evt.toElement) { // IE
    return !element.contains(evt.toElement);
  }
  else if (evt.relatedTarget) { // FF/W3c
    return !this.containsDOM(element, evt.relatedTarget);
  }
}

// END: Compat functions ============================================

// BEGIN: Logging functions =========================================

// USE IN Utils NAMESPACE
// EX: Utils.Logger.attachEvent(obj, eventName, eventHandler)
function logger() {};

logger.prototype.log = function() {
   if (typeof console == 'object' && typeof console.log != 'undefined') {
        for (var i = 0, l = arguments.length; i < l; i++)
            console.log(arguments[i]);
   }
}

