function $(n){return document.getElementById(n)}
function RegisterNamespaces(){for(var i=0;i<arguments.length;i++){var p=arguments[i].split("."),w=window;for(var j=0;j<p.length;j++){if(!w[p[j]])w[p[j]]=new Object();w=w[p[j]];}}}
RegisterNamespaces("API.Debug");
API.Debug=new function(){this.Type={};this.log=function(){}}
RegisterNamespaces("API.Browser");
API.Browser = new function(){
var objBrowser=this,n=navigator,ua=n.userAgent.toLowerCase();this.isDom=(document.getElementById?true:false);this.isOpera=0;this.isIe=0;this.isGecko=0;this.isSafari=0;this.isNetscape=0;this.isKonqueror=0;this.isWin=0;this.isMac=0;this.isUnix=0;this.isLinux=0;
try{var rv;
if(window.opera){if((new RegExp("opera ([0-9]{1,}[\.0-9]{0,})")).exec(ua)!=null){rv=parseFloat(RegExp.$1);if(rv)objBrowser.isOpera=rv;}}
else if(!objBrowser.isOpera&&n.appName=='Microsoft Internet Explorer'){if((new RegExp("msie ([0-9]{1,}[\.0-9]{0,})")).exec(ua)!=null){rv=parseFloat(RegExp.$1);if(rv)objBrowser.isIe=rv;}}
else if(ua.indexOf("safari")!=-1){if((new RegExp("safari/([0-9]{1,}[\.0-9]{0,})")).exec(ua)!=null){rv=parseFloat(RegExp.$1);if(rv)objBrowser.isSafari=rv;}}
else if(ua.indexOf("konqueror")!=-1){if((new RegExp("konqueror/([0-9]{1,}[\.0-9]{0,})")).exec(ua)!=null){rv=parseFloat(RegExp.$1);if(rv)objBrowser.isKonqueror=rv;}}
else if(ua.indexOf("gecko")!=-1){if((new RegExp("rv:([0-9]+[\.0-9]*)[\.ab0-9]*\\) gecko")).exec(ua)!=null){rv=parseFloat(RegExp.$1);if(rv)objBrowser.isGecko=rv;}}
else if(ua.indexOf("konqueror")!=-1){this.isKonqueror=1}
objBrowser.isWin=(ua.indexOf('win')!=-1);
objBrowser.isMac=(ua.indexOf('mac')!=-1);
objBrowser.isUnix=(ua.indexOf('unix')!= -1||ua.indexOf('sunos')!=-1||ua.indexOf('bsd')!=-1||ua.indexOf('x11')!=-1);
objBrowser.isLinux=(ua.indexOf('linux')!=-1);
}catch(e){}}
Function.prototype.method=function(name,func){this.prototype[name]=func;return this;};
function isAlien(a){return isObject(a)&&typeof a.constructor!='function'}
function isArray(a){return isObject(a)&&a.constructor==Array}
function isBoolean(a){return typeof a=='boolean'}
function isEmpty(o){var i,v;if(isObject(o))for(i in o){v=o[i];if(isUndefined(v)&&isFunction(v)){return false}}return true}
function isFunction(a){return typeof a=='function'}
function isNull(a){return typeof a=='object'&&!a}
function isNumber(a){return typeof a=='number'&&isFinite(a)}
function isObject(a){return (a&&typeof a=='object')||isFunction(a)}
function isString(a){return typeof a=='string'}
function isUndefined(a){return typeof a=='undefined'}
if (!isFunction(Function.apply)){Function.method('apply',function(o,a){var r,x='____apply';if (!isObject(o))o={};o[x]=this;switch ((a && a.length) || 0) {case 0:r=o[x]();break;case 1:r=o[x](a[0]);break;case 2:r=o[x](a[0],a[1]);break;case 3:r=o[x](a[0],a[1],a[2]);break;case 4:r=o[x](a[0],a[1],a[2],a[3]);break;case 5:r=o[x](a[0],a[1],a[2],a[3],a[4]);break;case 6:r=o[x](a[0],a[1],a[2],a[3],a[4],a[5]);break;default:alert('Too many arguments to apply.');}delete o[x];return r;});}
if(!isFunction(Array.prototype.pop)){Array.method('pop',function(){return this.splice(this.length-1,1)[0]})}
if(!isFunction(Array.prototype.push)){Array.method('push',function(){this.splice.apply(this,[this.length,0].concat(Array.prototype.slice.apply(arguments)));return this.length})}
if(!isFunction(Array.prototype.shift)){Array.method('shift',function(){return this.splice(0,1)[0]})}
if(!isFunction(Array.prototype.splice)){Array.method('splice',function(s,d){var max=Math.max,min=Math.min,a=[],e,i=max(arguments.length-2,0),k=0,l=this.length,n,v,x;s=s||0;if(s<0){s += l}s=max(min(s,l),0);d=max(min(isNumber(d)?d:l,l-s),0);v=i-d;n=l+v;while(k<d){e=this[s+k];if(!isUndefined(e)){a[k]=e}k+=1}x=l-s-d;if(v<0){k=s+i;while(x){this[k]=this[k-v];k+=1;x-=1}this.length=n;}else if(v>0){k=1;while(x){this[n-k]=this[l-k];k+=1;x-=1;}}for(k=0;k<i;++k){this[s+k]=arguments[k+2];}return a})}
if(!isFunction(Array.prototype.unshift)){Array.method('unshift',function(){this.splice.apply(this,[0,0].concat(Array.prototype.slice.apply(arguments)));return this.length})}
