var undefined;

Function.prototype.add_method = function (name, method) {
  this.prototype[name] = method;
  return this;
};

Function.prototype.add_static_member = function (name, defaultvalue) {
  this.prototype['get_' + name] = function () {
    return defaultvalue;
  };
  this.prototype['set_' + name] = function (value) {
    defaultvalue = value;
    return this;
  };
  return this;
};

function attach_event_handler (element, event_name, handler, debug) {
  try {
    if(!element) throw('attach_event_handler called without element');
    // NOTE: (bc-20050111) IE doesn't like using any DOM Objects with the instanceof operator
    // object types not supported by IE: Node -> Element -> HTMLElement -> HTMLAnchorElement
    if(navigator.userAgent.toLowerCase().indexOf('msie') == -1 && navigator.userAgent.toLowerCase().indexOf('safari') == -1 && !(element instanceof Object)) {
      throw('attach_event_handler called with invalid element: '+element);
    }
    
    if (element.addEventListener) {
      return element.addEventListener(event_name, handler, false);
    }
    else if (element.attachEvent) {
      return element.attachEvent('on' + event_name, handler);
    }
    else {
      throw 'browser does not support DOM2 or IE style event model on element: '+element;
    }
  }
  catch (error) {
        alert('ERROR in attach_event_handler: ' + error + '\n-- element: ' + element + '\n-- event_name: ' + event_name + '\n-- handler: ' + handler + '\n-- debug: ' + debug);
  }
}

function detach_event_handler (element, event_name, handler) {
  if (element.removeEventListener) {
      try {
        element.removeEventListener(event_name, handler, false);
      } catch (error) {
	  alert('Error removing event listener: ' + error);
      }
  }
  else if (element.detachEvent) {
    try {
      element.detachEvent('on' + event_name, handler);
    } catch (error) {
      alert('Erorr detaching event: ' + error);
    }
  }
  else {
    throw 'browser does not support DOM2 or IE style event model';
  }
}

function captureEventReturnKeyPress (event) {
  try {
    return (navigator.userAgent.toLowerCase().indexOf('msie')) ? event.keyCode == 13 : event.which == 13
  }
  catch (error) {
    alert('Error in captureEventReturnKeyPress: ' + error);
  }
}

var add_to_global_hash;
var get_from_global_hash;

(function () {

var id_hash = {};
add_to_global_hash = function (args_hash) {
        for (var key in args_hash) {
                id_hash[key] = args_hash[key];
  }
}

get_from_global_hash = function (key) {
        return id_hash[key];
}

})();


// Small piece of code to add a push function to the Array object for IE 5. //
try {
  if (navigator.userAgent.toLowerCase().indexOf('msie') != -1 && navigator.userAgent.toLowerCase().indexOf('msie 5')) {
    Array.prototype.push = function () {
      try {
        for (var i=0; i < arguments.length; i++) {
          this[this.length] = arguments[i];
        }
      }
      catch (error) {
        alert('Error trying to push onto array:' + error);
      }
    }
  }
}
catch (error) {
  alert('Error overriding push function: ' + error);
}




