
/*/
var UserAgent={matches:{},
	supports:{},
	uaDefs:{
		mac:/(\bmac.os\b|\bmac_)/i,
		windows:/\b(win95|win98|win 9x|winnt|windows)\b/i,
		x11:/\bx11\b/i,
		nix:/\b(unix|linux|x11|bsd)\b/i,
		vista:/NT\s*6.0/,
		xp:/NT\s*5\.1/,
		xpsp2:/NT\s*5\.1\s?;\s*SV1/,
		iewin:/msie(.*)?windows/i,
		iewinlt7:/msie [1-6](.*)?windows/i,
		iewin7:/msie 7(.*)?windows/i,
		iewin6:/msie 6(.*)?windows/i,
		iewin55:/msie 5\.5(.*)?windows/i,
		iewin5:/msie 5\.0(.*)?windows/i,
		iewinold:/msie [1-4](.*)?windows/i,
		iemac:/msie 5(.*)?mac/i,
		ns4:/netscape 4/i,
		safari:/(safari|applewebkit)/i,
		khtml:/(konqueror|khtml|safari)/i,
		opera:/opera/i,
		opera9:/opera\/9/i,
		firefox:/firefox/i,
		firefox1dot0:/firefox\/1\.0/i,
		firefox1dot5:/firefox\/1\.5/i,
		firefox2dot0:/firefox\/2/i
	},
	featureDefs:{
		pngAlpha:function(){
			var m=UserAgent.matches;
			return m.khtml||m.opera||m.gecko||m.iewin&&!(m.iewin5||m.iewinold);
		},
		pngAlphaIEWin:function(){
			var m=UserAgent.matches;
			return m.iewin&&!(m.iewin5||m.iewinold);
		},
		elementAlpha:function(){
			var m=UserAgent.matches;
			return m.khtml||m.opera9||m.gecko||(m.iewin&&!m.iewinold);
		},
		elementAlphaIEWin:function(){
			return UserAgent.supports.elementAlpha&&UserAgent.matches.iewin;
		},
		fixedPosition:function(){
			var m=UserAgent.matches;
			return !m.iewin&&(m.gecko||m.khtml||m.opera);
		}
	},
	init:function(){
		var m=this.matches;
		var _54=function(_55,_56){
			m[_55]=_56;
		};
		for(var _57 in this.uaDefs){
			_54(_57,this.uaDefs[_57].test(navigator.userAgent));
		}
		_54("gecko",!m.khtml&&!m.opera&&/(firefox|camino|gecko)/i.test(navigator.userAgent));
		for(var _58 in this.featureDefs){
			this.supports[_58]=this.featureDefs[_58]();
		}
		Browser={
			MSIE:function(){
				return UserAgent.matches.iewin;
			}
		};
		isMacIE=this.matches.iemac;
		isSafari=this.matches.safari;
		isOpera=this.matches.opera;
	},
	addSupportedFeature:function(_59,_60){
		this.supports[_59]=_60;
	}
};
var appVers=navigator.appVersion;
UserAgent.init();

Array.prototype.contains = function(val) {
	var i
	for(i = 0; i < this.length; i++) {
		if (this[i] == val) return true;
	}
	return false
}
Array.prototype.itemContains = function(val) {
	var i
	for(i = 0; i < this.length; i++) {
		if (this[i].indexOf(val) != -1) return true;
	}
	return false
}

if(!window.encodeURIComponent){
	encodeURIComponent=function(str){
		return escape(str);
	};
	decodeURIComponent=function(str){
		return unescape(str);
	};
}

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/, "");
}
String.prototype.left = function() {
	return this.replace(/^\s+/, "");
}
String.prototype.right = function() {
	return this.replace(/\s+$/, "");
}
String.NUMBERS = ["0","1","2","3","4","5","6","7","8","9"];
String.ALPHA_LOWERCASE = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
String.ALPHA_UPPERCASE = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
String.prototype.getUrlAttribute=function(attName){
	var ls;
	var ind=this.indexOf(URLLib.QUERY_START);
	if(ind!=-1){
		ls=this.substring(ind);
	}else{
		return null;
	}
	if(ls.length>0&&ls.indexOf(attName)!=-1){
		var aNVPairs=ls.substring(1).split(URLLib.QUERY_DELIM);
		var tAttAssignment=_85+URLLib.NVPAIR_DELIM;
		for(var i=0;i<aNVPairs.length;i++){
			if(aNVPairs[i].indexOf(tAttAssignment)==0&&aNVPairs[i].length>tAttAssignment.length){
				return decodeURIComponent(aNVPairs[i].substring(tAttAssignment.length));
			}
		}
	}
	return null;
};
String.prototype.setUrlAttribute=function(attName,attValue){
	var oStr=this;
	if(attValue===false){
		attValue="false";
	}else{
		if(attValue===0){
			attValue="0";
		}
	}
	var curAttValue=oStr.getUrlAttribute(attName);
	if(curAttValue){
		oStr=oStr.replace(attName+URLLib.NVPAIR_DELIM+encodeURIComponent(curAttValue),attName+URLLib.NVPAIR_DELIM+encodeURIComponent(attValue||""));
	}else{
		oStr+=((oStr.indexOf(URLLib.QUERY_START)==-1)?URLLib.QUERY_START:URLLib.QUERY_DELIM)+attName+URLLib.NVPAIR_DELIM+encodeURIComponent(attValue||"");
	}
	return oStr;
};
String.prototype.setUrlAttributes=function(params){
	var oStr=this;
	for(var i in params){
		oStr=oStr.setUrlAttribute(i,params[i]);
	}
	return oStr;
};
String.prototype.containsClass=function(strClass){
	return new RegExp("(^|\\s)"+strClass+"($|\\s)","g").test(this);
};
String.prototype.addClass=function(strClass){
	if(!this.containsClass(strClass)){
		return this.length>0?this+" "+strClass:strClass;
	}
	return this;
};
String.prototype.swapClass=function(strClassOld,strClassNew){
	return this.removeClass(strClassOld).addClass(strClassNew);
};
String.prototype.removeClass=function(strClass){
	if(typeof strClass!="string"){
		if(typeof strClass=="object"&&strClass.constructor==Array){
			var s=this;
			for(var ii=0;ii<strClass.length;ii++){
				s=s.removeClass(strClass[ii]);
			}
		}
		return s;
	}
	if(!this.containsClass(strClass)){
		return this;
	}
	var rx1=new RegExp("\\s"+strClass+"\\s");
	if(rx1.test(this)){
		var rx2=new RegExp("\\s"+strClass);
	}else{
		var rx2=new RegExp("\\s?"+strClass+"\\s?");
	}
	return this.replace(rx2,"");
};
String.prototype.getClasses=function(){
	return this.split(/\s+/);
};
String.prototype.toggleClass=function(strClass) {
	if(this.containsClass(strClass)) {
		return this.removeClass(strClass);
	} else {
		return this.addClass(strClass);
	}
						  
}

var URLLib={QUERY_START:"?",QUERY_DELIM:"&",NVPAIR_DELIM:"="};

function $(id){
	if( document.getElementById ) {  // if a compliant browser
		return document.getElementById(id);
	} else if( document.all ) { // if a compatable browser
		return document.all[id];
	} else { // Oh, well...
		return null;
	}
}

function $$(id) {
	return new ElementWrapper(id);
}

var ElementWrapper = function(obj){
	if(obj.nodeType == 1){
		this.id = obj.id||(obj.id = ElementWrappers.getNewId());
	} else {
		this.id = obj;
	}
};

ElementWrapper.prototype = {
	getElement:function(){
		return $(this.id);
	},
	setStyle:function(_style,_value){
		this.getElement().style[_style]=_value;
	},
	setStyles:function(oStyles){
		for(var s in oStyles) {
			if(oStyles[s] !== null){
				this.setStyle(s,oStyles[s]);
			}
		}
	},
	getStyle:function(_style){
		return this.getElement().style[_style];
	},
	getXY:function(){
		var tParent = this.getElement().offsetParent;
		var tPoint = {_x:this.getElement().offsetLeft,_y:this.getElement().offsetTop};
		do {
			tPoint._x += tParent.offsetLeft;
			tPoint._y += tParent.offsetTop;
		} while((tParent = tParent.offsetParent));
		return tPoint;
	}
};

var ElementWrappers = {
	idPrefix:"autoid",
	idCounter:0,
	getNewId:function(){
		return this.idPrefix + this.getUniqueIdSuffix();
	},
	getUniqueIdSuffix:function(){
		return this.idCounter++;
	}
};

var ServerConnectionFactory={
	getConnection:function(){
		return new ServerConnection();
	},
	isSupported:function(){
		var s=new ServerConnection();
		var ok=s.hasTransport;
		s=null;
		return (this.isSupported=function(){ return ok; })();
	}
};

function ServerConnection(){
	this.hasTransport=false;
	this.method=ServerConnection.METHOD_GET;
	if(!this.returnType){
		this.returnType=ServerConnection.RETURN_XML;
	}
	this.setTransport();
}

ServerConnection.METHOD_GET="GET";
ServerConnection.METHOD_POST="POST";
ServerConnection.METHOD_HEAD="HEAD";
ServerConnection.RETURN_XML="XML";
ServerConnection.RETURN_TEXT="TEXT";
ServerConnection.prototype={
	getNewAXO:function(strAXO){
		return eval(["(ne","w Ac","tive","XObj","ect('",strAXO,"'))"].join(""));
	},
	parameters:{},
	transportStates:["Uninitialized","Loading","Loaded","Interactive","Complete"],
	setTransport:function(){
		this.transport=false;
		var tSC=this;
		var ConnectionMethods=[
			function(){
				return tSC.getNewAXO("Msxml2.XMLHTTP.5.0");
			},
			function(){
				return tSC.getNewAXO("Msxml2.XMLHTTP.4.0");
			},
			function(){
				return tSC.getNewAXO("Msxml2.XMLHTTP.3.0");
			},
			function(){
				return tSC.getNewAXO("Msxml2.XMLHTTP");
			},
			function(){
				return tSC.getNewAXO("Microsoft.XMLHTTP");
			},
			function(){
				return new XMLHttpRequest();
			}];
		for(var i=0;i<ConnectionMethods.length;i++){
			try{
				this.transport=ConnectionMethods[i]();
				this.hasTransport=true;
				break;
			}
			catch(e){
			}
		}
	},
	bindStateChangeHandler:function(){
		var tSC=this;
		this.transport.onreadystatechange=function(){ tSC.handleReadyStateChange(); };
	},
	handleReadyStateChange:function(){
		var tState=this.transportStates[this.transport.readyState];
		if(tState=="Loaded"||(UserAgent.matches.opera&&tState=="Interactive")){
			this.beginReceiveDataCallback();
		}else{
			if(tState=="Complete"){
				if(this.transport.status=="200"){
					this.successCallback(this.returnType==ServerConnection.RETURN_XML?this.transport.responseXML:this.transport.responseText);
				}else{
					this.failureCallback(this.transport.status,this.url);
				}
			}
		}
	},
	fixMozillaContentLength:function(){
		if(this.transport&&this.transport.overrideMimeType){
			this.transport.setRequestHeader("Connection","close");
		}
	},
	execute:function(){
		if(this.transport){
			var payload=null;
			if(this.method==ServerConnection.METHOD_GET){
				this.url=this.url.setUrlAttributes(this.parameters);
			}
			this.transport.open(this.method,this.url,true);
			this.bindStateChangeHandler();
			if(this.method==ServerConnection.METHOD_POST){
				payload="".setUrlAttributes(this.parameters).substring(1);
				this.transport.setRequestHeader("Content-type","application/x-www-form-urlencoded");
				this.fixMozillaContentLength();
			}
			this.transport.send(payload);
		}
	},
	setParameters:function(oParams){
		this.parameters=oParams;
	},
	successCallback:function(){},
	failureCallback:function(errAtStatus,url){},
	beginReceiveDataCallback:function(){}
};

var EventDispatcher={
	elements:[],
	eventCounter:1,
	stopPropagation:function(_28){
		if(window.event){
			window.event.cancelBubble=true;
		}else{
			if(_28.stopPropagation){
				_28.stopPropagation();
			}
		}
	},
	addEvent:function(_29,_30,_31){
		EventDispatcher.callCounter++;
		if(!_31.__eid){
			_31.__eid=this.eventCounter++;
		}
		if(!_29.__events){
			_29.__events={};
			this.elements[this.elements.length]=_29;
		}
		var _32=_29.__events[_30];
		if(!_32){
			_32=_29.__events[_30]={};
			if(_29["on"+_30]){
				_32[0]=_29["on"+_30];
			}
		}
		_29["on"+_30]=EventDispatcher.handleEvent;
		_32[_31.__eid]=_31;
		_29.notifyEventListenerAdded&&_29.notifyEventListenerAdded(_30);
		return _31.__eid;
	},
	removeEvent:function(_33,_34,_35){
		var eid=(typeof _35=="function")?_35.__eid:_35;
		if(_33.__events&&_33.__events[_34]&&eid){
			delete _33.__events[_34][eid];
			return true;
		}else{
			return false;
		}
	},
	handleEvent:function(_37){
		_37=(_37)? _37 : window.event;
		var _38=true;
		var _39=this.__events[_37.type];
		for(var ii in _39){
			_38=_39[ii].apply(this,[_37])!==false&&_38;
		}
		if(this==window&&_37.types=="unload"){
			EventDispatcher.cleanupAll();
		}
		return _38;
	},cleanupAll:function(){
		for(var ii=0;ii<this.elements.length;ii++){
			this.cleanupElement(this.elements[ii]);
			delete this.elements[ii];
		}
	},
	cleanupElement:function(_40){
		if(_40.__events){
			for(type in _40.__events){
				for(eid in _40.__events[type]){
					delete _40.__events[type][eid];
				}
				_40["on"+type]=null;
			}
		}
	}
};
//EventDispatcher.addEvent(window,"unload",function(){});

BtnFactory = {
	btns:{},
	idPrefix:"btn",
	idCounter:0,
	getNewId:function(){
		return this.idPrefix + this.getUniqueIdSuffix();
	},
	getUniqueIdSuffix:function(){
		return this.idCounter++;
	},
	createBtn:function(obj,oEvents) {
		obj.onmouseover = null;		
		if(!obj.id){
			obj.id = this.getNewId();
		}
		this.btns[obj.id] = {};
		obj.style.cursor = "pointer";
		for(var e in oEvents) {
			switch(typeof oEvents[e]){
				case "function" :
				EventDispatcher.addEvent(obj,e,oEvents[e]);
				if(e == "mouseover") {
					oEvents[e]();
				}
				break;
				default :
				this.btns[obj.id][e] = new Image();
				this.btns[obj.id][e].src = oEvents[e];
				var tFn = function(e) {
					if(!e) { e = window.event; }
					BtnFactory.changeImg(this,e.type);
				};
				EventDispatcher.addEvent(obj,e,tFn);
				if(e == "mouseover") {
					this.changeImg(obj,e);
				}
			}
		}
		return null;
	},
	changeImg:function(obj,e) {
		if(this.btns[obj.id][e].src.match(/(\.png)$/gi) && (UserAgent.matches.iewin&&!UserAgent.matches.iewin7)){
			obj.src = "/_images/spacer.gif";
			obj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.btns[obj.id][e].src+"', sizingMethod='image')";
		} else {
			obj.src = this.btns[obj.id][e].src;
		}
	}
};

function hoverFix(obj) {
	if(UserAgent.matches.iewinlt7) {
		var fnMouseOver = function(){ this.className = this.className.addClass("hover"); };
		var fnMouseOut = function(){ this.className = this.className.removeClass("hover"); };
		var fnClick = function(){ this.className = this.className.removeClass("hover"); };
		EventDispatcher.addEvent(obj, "mouseover", fnMouseOver);
		EventDispatcher.addEvent(obj, "mouseout", fnMouseOut);
		EventDispatcher.addEvent(obj, "click", fnClick);
	}
	return null;
};

/**/

function fixPNG() {
	// Use only with ie5 - ie6 to fix support of png transparency.  Require jQuery.
	$("img[src$='.png']").each(function() {
		$(this).css("filter", "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+ $(this).attr("src") +"', sizingMethod='image')");
		$(this).attr("src", "/~images/spacer.gif");
	});
}

/* Object to Show and Hide elements with a vertical slide and fading contents.  Require jQuery. */
if(!Veil) {

var Veil = function() {};
Veil = {
	toOpen:{
		duration:800,
		easing:"easeOutQuad",
		complete:function() {
			$(this).data("veiled", false);
		}
	},
	toClose:{
		duration:800,
		easing:"easeOutQuad",
		complete:function() {
			$(this).data("veil", true);
		}
	},
	showHide:function(s) {
		s = (typeof s === "string") ? $(s) : s;
		if(s.is(":hidden")) {
			this.show(s, arguments[1]);
		} else {
			this.hide(s, arguments[1]);
		}
	},
	show:function(s) {
		s = (typeof s === "string") ? $(s) : s;
		var c = s.children(":not(script)");
		var opt = (arguments[1]) ? arguments[1] : jQuery.extend( {}, this.toOpen );
		c.fadeIn((opt.duration < 1000) ? opt.duration : 1000, "jswing");
		s.slideDown(opt);
	},
	hide:function(s) {
		s = (typeof s === "string") ? $(s) : s;
		var c = s.children(":not(script)");
		var opt = (arguments[1]) ? arguments[1] : jQuery.extend( {}, this.toClose );
		c.fadeOut((opt.duration < 1000) ? opt.duration : 1000, "jswing");
		s.slideUp(opt);
	},
	getDurationByRate:function(s, r) {
		// s : selector :: r : Rate
		// beacuse the transitions in this object are slides, we can just worry about the elements innerHeight
		s = (typeof s === "string") ? $(s) : s;
		var h = s.innerHeight();
		if( s.children().is(":hidden") ) {
			s.children().show()
			h = s.innerHeight();
			s.children().hide()
		}
		// returns a duration (time) in milliseconds.
		return ( (h < r*2) ? h : r*2) / r * 1000;;
	}
}

}