Object.extend = function(dest, source, replace) {for(var prop in source) {if(replace == false && dest[prop] != null) { continue; }dest[prop] = source[prop];}return dest;
};Object.extend(Function.prototype, {apply: function(o, a) {var r, x = "__fapply";if(typeof o != "object") { o = {}; }o[x] = this;var s = "r = o." + x + "(";for(var i=0; i<a.length; i++) {if(i>0) { s += ","; }s += "a[" + i + "]";}s += ");";eval(s);delete o[x];return r;},bind: function(o) {if(!Function.__objs) {Function.__objs = [];Function.__funcs = [];}var objId = o.__oid;if(!objId) {Function.__objs[objId = o.__oid = Function.__objs.length] = o;}var me = this;var funcId = me.__fid;if(!funcId) {Function.__funcs[funcId = me.__fid = Function.__funcs.length] = me;}if(!o.__closures) {o.__closures = [];}var closure = o.__closures[funcId];if(closure) {return closure;}o = null;me = null;return Function.__objs[objId].__closures[funcId] = function() {return Function.__funcs[funcId].apply(Function.__objs[objId], arguments);};}
}, false);Object.extend(Array.prototype, {push: function(o) {this[this.length] = o;},addRange: function(items) {if(items.length > 0) {for(var i=0; i<items.length; i++) {this.push(items[i]);}}},clear: function() {this.length = 0;return this;},shift: function() {if(this.length == 0) { return null; }var o = this[0];for(var i=0; i<this.length-1; i++) {this[i] = this[i + 1];}this.length--;return o;}
}, false);Object.extend(String.prototype, {trimLeft: function() {return this.replace(/^\s*/,"");},trimRight: function() {return this.replace(/\s*$/,"");},trim: function() {return this.trimRight().trimLeft();},endsWith: function(s) {if(this.length == 0 || this.length < s.length) { return false; }return (this.substr(this.length - s.length) == s);},startsWith: function(s) {if(this.length == 0 || this.length < s.length) { return false; }return (this.substr(0, s.length) == s);},split: function(c) {var a = [];if(this.length == 0) return a;var p = 0;for(var i=0; i<this.length; i++) {if(this.charAt(i) == c) {a.push(this.substring(p, i));p = ++i;}}a.push(s.substr(p));return a;}
}, false);Object.extend(String, {format: function(s) {for(var i=1; i<arguments.length; i++) {s = s.replace("{" + (i -1) + "}", arguments[i]);}return s;},isNullOrEmpty: function(s) {if(s == null || s.length == 0) {return true;}return false;}
}, false);if(typeof addEvent == "undefined")addEvent = function(o, evType, f, capture) {if(o == null) { return false; }if(o.addEventListener) {o.addEventListener(evType, f, capture);return true;} else if (o.attachEvent) {var r = o.attachEvent("on" + evType, f);return r;} else {try{ o["on" + evType] = f; }catch(e){}}};if(typeof removeEvent == "undefined")removeEvent = function(o, evType, f, capture) {if(o == null) { return false; }if(o.removeEventListener) {o.removeEventListener(evType, f, capture);return true;} else if (o.detachEvent) {o.detachEvent("on" + evType, f);} else {try{ o["on" + evType] = function(){}; }catch(e){}}};
