// Since JavaScript is a loosely-typed language, it is sometimes necessary to examine an object
// to determine its type. JavaScript provides a typeof operator to facilitate this, but typeof has
// problems. We are better off to wrap typeof in a set of global functions.
// Library from Douglas Crockford's Wrrrld Wide Web (http://www.crockford.com/)
// isAlien(), isArray(), isBoolean(), isEmpty(), isFunction(), isNull(), isNumber(), isObject(),
// isString(), isUndefined()

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';};

// Scott Andrew’s original $myEvents.addEvent(elm,evType,fn,useCapture)
// function $myEvents.addLoadEvent(func) by Simon Willison
// and my $myEvents.addUnLoadEvent(func)

var $myEvents={addEvent:function(elm,evType,fn,useCapture){if(elm.addEventListener){elm.addEventListener(evType,fn,useCapture);return true;}else if(elm.attachEvent){var r=elm.attachEvent('on'+evType,fn);return r;}else{elm['on'+evType]=fn;}},addLoadEvent:function(func){var oldonload=window.onload;
if(!isFunction(oldonload)){/*if(typeof oldonload!='function'){*/window.onload=func;}else{window.onload=function(){oldonload();func();};}},addUnLoadEvent:function(func){var oldonunload=window.unonload;if(!isFunction(oldonunload)){/*if(typeof oldonunload!='function'){*/window.unonload=func;}else{window.onunload=function(){oldonunload();func();};}}};

// Classical $myCookies.getCookie(name)
// $myCookies.setCookie(name,value,expires,path,domain,secure)
// $myCookies.deleteCookie(name,path,domain)

var $myCookies={getCookie:function(name){var cook=document.cookie;var start=cook.indexOf(name+'=');var len=start+name.length+1;if((!start)&&(name!=cook.substring(0,name.length))){return null;};if(start==-1)return null;var end=cook.indexOf(';',len);if(end==-1)end=cook.length;return unescape(cook.substring(len,end));},setCookie:function(name,value,expires,path,domain,secure){var today=new Date();today.setTime(today.getTime());if(expires){expires=expires*1000*60*60*24;};var expires_date=new Date(today.getTime()+(expires));document.cookie=name+'='+escape(value)+((expires)?';expires='+expires_date.toGMTString():'')+((path)?';path='+path:'')+((domain)?';domain='+domain:'')+((secure)?';secure':'');},deleteCookie:function(name,path,domain){if(getCookie(name))document.cookie=name+'='+((path)?';path='+path:'')+((domain)?';domain='+domain:'')+';expires=Thu, 01-Jan-1970 00:00:01 GMT';}};

// Date Format 1.1
// (c) 2007 Steven Levithan <stevenlevithan.com>
// MIT license
// With code by Scott Trenda (Z and o flags, and enhanced brevity)
// Date.prototype.format(mask)

var dateFormat=function(){var token=/d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloZ]|"[^"]*"|'[^']*'/g,timezone=/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,timezoneClip=/[^-+\dA-Z]/g,pad=function(value,length){value=String(value);length=parseInt(length)||2;while(value.length<length){value="0"+value;};return value;};return function(date,mask){if(arguments.length==1&&isString(date)/*(typeof date=="string"||date instanceof String)*/&&!/\d/.test(date)){mask=date;date=undefined;};date=date?new Date(date):new Date();if(isNaN(date)){throw"invalid date";};var dF=dateFormat;mask=String(dF.masks[mask]||mask||dF.masks["default"]);var d=date.getDate(),D=date.getDay(),m=date.getMonth(),y=date.getFullYear(),H=date.getHours(),M=date.getMinutes(),s=date.getSeconds(),L=date.getMilliseconds(),o=date.getTimezoneOffset(),flags={d:d,dd:pad(d),ddd:dF.i18n.dayNames[D],dddd:dF.i18n.dayNames[D+7],m:m+1,mm:pad(m+1),mmm:dF.i18n.monthNames[m],mmmm:dF.i18n.monthNames[m+12],yy:String(y).slice(2),yyyy:y,h:H%12||12,hh:pad(H%12||12),H:H,HH:pad(H),M:M,MM:pad(M),s:s,ss:pad(s),l:pad(L,3),L:pad(L>99?Math.round(L/10):L),t:H<12?"a":"p",tt:H<12?"am":"pm",T:H<12?"A":"P",TT:H<12?"AM":"PM",Z:(String(date).match(timezone)||[""]).pop().replace(timezoneClip,""),o:(o>0?"-":"+")+pad(Math.floor(Math.abs(o)/60)*100+Math.abs(o)%60,4)};return mask.replace(token,function($0){return($0 in flags)?flags[$0]:$0.slice(1,$0.length-1);});};}();dateFormat.masks={"default":"ddd mmm d yyyy HH:MM:ss",shortDate:"m/d/yy",mediumDate:"mmm d, yyyy",longDate:"mmmm d, yyyy",fullDate:"dddd, mmmm d, yyyy",shortTime:"h:MM TT",mediumTime:"h:MM:ss TT",longTime:"h:MM:ss TT Z",isoDate:"yyyy-mm-dd",isoTime:"HH:MM:ss",isoDateTime:"yyyy-mm-dd'T'HH:MM:ss",isoFullDateTime:"yyyy-mm-dd'T'HH:MM:ss.lo"};dateFormat.i18n={dayNames:["Sun","Mon","Tue","Wed","Thr","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"]};
Date.prototype.format=function(mask){return dateFormat(this,mask);};

// parseUri 1.2.1
// (c) 2007 Steven Levithan <stevenlevithan.com>
// MIT License
// $myUri.parseUri(str)

var $myUri={parseUri:function(str){var o=parseUri.options,m=o.parser[o.strictMode?"strict":"loose"].exec(str),uri={},i=14;while(i--){uri[o.key[i]]=m[i]||"";};uri[o.q.name]={};uri[o.key[12]].replace(o.q.parser,function($0,$1,$2){if($1){uri[o.q.name][$1]=$2;};});return uri;}};$myUri.parseUri.options={strictMode:false,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}};
// Steven Levithan trim function

if(!String.prototype.trim){String.prototype.trim=function(){var str=this.replace(/^\s\s*/,''),ws=/\s/,i=str.length;while(ws.test(str.charAt(--i)));return str.slice(0,i+1);};};

// Sugar Arrays (c) Creative Commons 2006
// http://creativecommons.org/licenses/by-sa/2.5/
// Author: Dustin Diaz | http://www.dustindiaz.com
// Reference: http://www.dustindiaz.com/basement/sugar-arrays.html
// Array.prototype.forEach, every, some, map, filter, indexOf, lastIndexOf

Function.prototype.method=function(name,fn){this.prototype[name]=fn;return this;};if(!Array.prototype.forEach){Array.method('forEach',function(fn,thisObj){var scope=thisObj||window;for(var i=0,j=this.length;i<j;++i){fn.call(scope,this[i],i,this);}}).method('every',function(fn,thisObj){var scope=thisObj||window;for(var i=0,j=this.length;i<j;++i){if(!fn.call(scope,this[i],i,this)){return false;}}return true;}).method('some',function(fn,thisObj){var scope=thisObj||window;for(var i=0,j=this.length;i<j;++i){if(fn.call(scope,this[i],i,this)){return true;}}return false;}).method('map',function(fn,thisObj){var scope=thisObj||window;var a=[];for(var i=0,j=this.length;i<j;++i){a.push(fn.call(scope,this[i],i,this));}return a;}).method('filter',function(fn,thisObj){var scope=thisObj||window;var a=[];for(var i=0,j=this.length;i<j;++i){if(!fn.call(scope,this[i],i,this)){continue;}a.push(this[i]);}return a;}).method('indexOf',function(el,start){var start=start||0;for(var i=start,j=this.length;i<j;++i){if(this[i]===el){return i;}}return-1;}).method('lastIndexOf',function(el,start){var start=start||this.length;if(start>=this.length){start=this.length;}if(start<0){start=this.length+start;}for(var i=start;i>=0;--i){if(this[i]===el){return i;}}return-1;});};

// Developed by Robert Nyman, http://www.robertnyman.com
// Code/licensing: http://code.google.com/p/getelementsbyclassname/

var getElementsByClassName=function(className,tag,elm){if(document.getElementsByClassName){getElementsByClassName=function(className,tag,elm){elm=elm||document;var elements=elm.getElementsByClassName(className),nodeName=(tag)?new RegExp("\\b"+tag+"\\b","i"):null,returnElements=[],current;for(var i=0,il=elements.length;i<il;i+=1){current=elements[i];if(!nodeName||nodeName.test(current.nodeName)){returnElements.push(current);}}return returnElements;};}else if(document.evaluate){getElementsByClassName=function(className,tag,elm){tag=tag||"*";elm=elm||document;var classes=className.split(" "),classesToCheck="",xhtmlNamespace="http://www.w3.org/1999/xhtml",namespaceResolver=(document.documentElement.namespaceURI===xhtmlNamespace)?xhtmlNamespace:null,returnElements=[],elements,node;for(var j=0,jl=classes.length;j<jl;j+=1){classesToCheck+="[contains(concat(' ', @class, ' '), ' "+classes[j]+" ')]";}try{elements=document.evaluate(".//"+tag+classesToCheck,elm,namespaceResolver,0,null);}catch(e){elements=document.evaluate(".//"+tag+classesToCheck,elm,null,0,null);}while(node=elements.iterateNext()){returnElements.push(node);}return returnElements;};}else{getElementsByClassName=function(className,tag,elm){tag=tag||"*";elm=elm||document;var classes=className.split(" "),classesToCheck=[],elements=(tag==="*"&&elm.all)?elm.all:elm.getElementsByTagName(tag),current,returnElements=[],match;for(var k=0,kl=classes.length;k<kl;k+=1){classesToCheck.push(new RegExp("(^|\\s)"+classes[k]+"(\\s|$)"));}for(var l=0,ll=elements.length;l<ll;l+=1){current=elements[l];match=false;for(var m=0,ml=classesToCheck.length;m<ml;m+=1){match=classesToCheck[m].test(current.className);if(!match){break;}}if(match){returnElements.push(current);}}return returnElements;};}return getElementsByClassName(className,tag,elm);};







