RC.Widgets = {};
RC.Widgets.References = function() {
	var $Y = YAHOO.util;
	var $D = $Y.Dom;
	var $E = $Y.Event;
	var $A = $Y.Anim;
	return {
		init: function(oArg) {
			var oArg = oArg || {};
			var oIndicator = oArg.oIndicator || '\u2197';
			var base = oArg.oBaseEl || null;
			var refs = $D.getElementsBy(RC.Widgets.References.hasCite,'q',base).concat($D.getElementsBy(RC.Widgets.References.hasCite,'blockquote',base));
			var refsLength = refs.length;
			for (i=0;i<refsLength;i++) {
				var a,el;
				a = document.createElement('a');
				if (typeof(oIndicator)=='string') a.appendChild(document.createTextNode(oIndicator));
				else a.appendChild(oIndicator);
				a.setAttribute('href',refs[i].getAttribute('cite'));
				a.setAttribute('title','See quote in context');
				a.className = 'RC-Widgets-Reference';
				if (refs[i].nodeName.toLowerCase()=='q') el = a;
				else {
					el = document.createElement('div');
					el.className = 'RC-Widgets-Reference';
					el.appendChild(a);
				}
				refs[i].appendChild(el);
			}
		},
		hasCite: function(el) { if (el.getAttribute('cite')!=null) return true; }
	}
}();
RC.Widgets.Tooltips = function() {
/*
Tooltips Widget (c) Creative Commons 2006
http://creativecommons.org/licenses/by-sa/2.5/
Author: Ryan Cannon | http://ryancannon.com/
Adapted from the Sweet Titles script by Dustin Diaz | http://www.dustindiaz.com
*/
	var $Y = YAHOO.util;
	var $D = $Y.Dom;
	var $E = $Y.Event;
	var $A = $Y.Anim;
	var tipElements = ['a','abbr','acronym'];
	var region = Object;
	var obj = Object;
	var tip = Object;
	var active = 0;
	return {
		init: function(oObjectRef,nSpeed) {
			tip = document.createElement('div');
			tip.id = 'RC-Widgets-Tooltip';
			var title = document.createElement('div');
			title.id = 'RC-Widgets-Tooltip-title';
			title.appendChild(document.createTextNode('text'));
			var address = document.createElement('div');
			address.id = 'RC-Widgets-Tooltip-address';
			address.appendChild(document.createTextNode('text'));
			tip.appendChild(title);
			tip.appendChild(address);
 			$D.setStyle(tip,'top','0');
			$D.setStyle(tip,'visibility','hidden');
			var tipLen = tipElements.length;
			for ( i=0; i<tipLen; i++ ) {
				var current = document.getElementsByTagName(tipElements[i]);
				var curLen = current.length;
				for ( j=0; j<curLen; j++ ) {
					$E.addListener(current[j],'mouseover',RC.Widgets.Tooltips.tipOver);
					$E.addListener(current[j],'mouseout',RC.Widgets.Tooltips.tipOut);
					current[j].setAttribute('tip',current[j].title);
					current[j].removeAttribute('title');
				}
			}
			document.getElementsByTagName('body')[0].appendChild(tip);
		},
		tipOver: function() {
			RC.Widgets.Tooltips.obj = this;
			RC.Widgets.Tooltips.region = $Y.Region.getRegion(this);
			tID = window.setTimeout("RC.Widgets.Tooltips.tipShow()",500);
		},
		tipOut: function() {
			if ( window.tID ) clearTimeout(tID);
			if ( window.opacityID ) clearTimeout(opacityID);
			var anim = new $A(tip,{opacity:{to:0}},0.3);
			anim.onComplete.subscribe(function(){$D.setStyle(tip,'visibility','hidden')});
			anim.animate();
		},
		checkNode: function() {
			var trueObj = this.obj;
			var inArray = false;
			for (i=0;i<tipElements.length;i++) {
				if (tipElements[i]== trueObj.nodeName.toLowerCase());
				inArray = true;
			}
			if ( inArray ) return trueObj;
			else return trueObj.parentNode;
		},
		tipShow: function() {
			tip = $D.get('RC-Widgets-Tooltip'); // Why must I do this?
			var anch = RC.Widgets.Tooltips.checkNode();
			var addy = '';
			var access = '';
			if ( anch.getAttribute('href') != null ) {
				var url = new RC.Helpers.URL(anch.getAttribute('href'));
				addy = (url.host!='' && url.host!=window.location.host)?
					url.host :
					(url.path != '' && url.path != window.location.pathname)?
						url.path :
						'An event on this page.';
				var access = ( anch.accessKey ? " ["+anch.accessKey+"]" : "" );
			}
			else addy = anch.firstChild.nodeValue;
			tip.childNodes[0].firstChild.nodeValue = anch.getAttribute('tip');
			tip.childNodes[1].firstChild.nodeValue = access+addy;
			if ( parseInt(document.documentElement.clientWidth+document.documentElement.scrollLeft) < parseInt(tip.offsetWidth+this.region.left) )
				$D.setStyle(tip,'left',parseInt(this.region.right-tip.offsetWidth-10)+'px');
			else $D.setStyle(tip,'left',(this.region.left+10)+'px');
			if (parseInt(document.documentElement.clientHeight+document.documentElement.scrollTop) < parseInt(tip.offsetHeight+this.region.top) )
				$D.setStyle(tip,'top',(this.region.top - tip.offsetHeight-10)+'px');
			else $D.setStyle(tip,'top',(this.region.bottom+10)+'px');
			$D.setStyle(tip,'visibility','visible');
			var anim = new $A(tip,{opacity: {to: 0.9,from: 0}},0.5);
			anim.animate();
		}
	}
}();
RC.Widgets.hCard = function() {
	var $D = YAHOO.util.Dom;
	var $E = YAHOO.util.Event;
	var $A = YAHOO.util.Anim;
	var hCard = Object;
	var hCardHeight = 0;
	var hCardOffHeight = 0;
	var hCardLabel = Object;
	return {
		init: function() {
			hCard = $D.get('hCard');
			if (hCard) {
				hCardHeight = RC.Helpers.stripUnits($D.getStyle(hCard,'height')).amount;
				if (isNaN(hCardHeight) && hCard.offsetHeight) hCardHeight = hCard.offsetHeight;
				$D.addClass(hCard,'off');
				hCardOffHeight = RC.Helpers.stripUnits($D.getStyle(hCard,'height')).amount;
				hCardLabel = $D.get('hCard-label');
				$E.addListener(hCardLabel,'click',RC.Widgets.hCard.slide);
				$E.addListener(hCardLabel,'mouseover',RC.Widgets.hCard.slideIndicatorOn);
				$E.addListener(hCardLabel,'mouseout',RC.Widgets.hCard.slideIndicatorOff);
				if (window.location.hash == '#hCard') {
					RC.Widgets.hCard.slide();
					window.location.hash = '#hCard';
				}
			}
		},
		slide: function() {
			var closed = ($D.hasClass(hCard,'off'));
			var toHeight = (closed)? hCardHeight : hCardOffHeight;
			var anim = new $A(hCard,{height:{to:toHeight}},0.3,YAHOO.util.Easing.easeOut);
			if (closed) RC.Widgets.hCard.slideOpen();
			else RC.Widgets.hCard.slideClosed();
			if (closed) anim.onStart.subscribe(RC.Widgets.hCard.slideOpen);
			else anim.onComplete.subscribe(RC.Widgets.hCard.slideClosed);
			anim.animate();
		},
		slideOpen: function() { $D.removeClass($D.get('hCard'),'off'); },
		slideClosed: function() { $D.addClass($D.get('hCard'),'off'); },
		slideIndicatorOn: function() { $D.addClass(hCardLabel,'over'); },
		slideIndicatorOff: function() { $D.removeClass(hCardLabel,'over'); }
	}
}();
RC.Widgets.AJAXSearch = function() {
	var $D = YAHOO.util.Dom;
	var $E = YAHOO.util.Event;
	var $A = YAHOO.util.Anim;
	var $C = YAHOO.util.Connection;
	var form = Object;
	var submit = Object;
	var query = Object;
	var submitVal = '';
	var results = Object;
	return {
		init: function() {
			form = $D.get('searchform');
			var inputs = form.getElementsByTagName('input');
			query = inputs[0];
			if (typeof query.setAttribute =='function') {
				query.setAttribute('type','search');
			}
			submit = inputs[1];
			submitVal = submit.getAttribute('src');
			var down = new Image();
			down.src = submitVal.substr(0,submitVal.lastIndexOf('-'))+'-down.png';
			var over = new Image();
			over.src = submitVal.substr(0,submitVal.lastIndexOf('-'))+'-over.png';
			results = document.createElement('div');
			results.id = "RC-Widgets-AJAXSearch-results";
			$D.setStyle(results,'overflow','hidden');
			$D.setStyle(results,'height','0px');
			form.parentNode.appendChild(results);
			$E.addListener(submit,'mouseover',RC.Widgets.AJAXSearch.submitOver);
			$E.addListener(submit,'mouseout',RC.Widgets.AJAXSearch.submitOut);
			$E.addListener(submit,'mousedown',RC.Widgets.AJAXSearch.submitDown);
			$E.addListener(form,'submit',RC.Widgets.AJAXSearch.formSubmit);
		},
		submitOver: function() { submit.setAttribute('src',submitVal.substr(0,submitVal.lastIndexOf('-'))+'-over.png'); },
		submitOut: function() { submit.setAttribute('src',submitVal.substr(0,submitVal.lastIndexOf('-'))+'-on.png'); },
		submitDown: function() { submit.setAttribute('src',submitVal.substr(0,submitVal.lastIndexOf('-'))+'-down.png'); },
		formSubmit: function(e) {
			$E.preventDefault(e);
			var location = form.getAttribute('action') || (window.location.scheme +'://' + window.location.host + window.location.pathname);
			var sReq = location+'?s='+encodeURIComponent(query.value)+'&RC-Widgets-AJAXSearch';
			var oArg = {
				method: 'GET',
				sReq: sReq,
				callback: {
					success: RC.Widgets.AJAXSearch.handleSuccess,
					failure: RC.Widgets.AJAXSearch.handleFailure,
					argument: { sReq: sReq }
				}
			}
			var searchHeight = RC.Helpers.stripUnits($D.getStyle(results,'height')).amount;
			if (isNaN(searchHeight) && results.offsetHeight) searchHeight = results.offsetHeight;
			if (searchHeight > 0) {
				var anim = new $A(results,{height:{to:0}},0.3,YAHOO.util.Easing.easeOut);
				anim.onComplete.subscribe(RC.Widgets.AJAXSearch.sendRequest, oArg, true);
				anim.animate();
			}
			else RC.Widgets.AJAXSearch.sendRequest(oArg);
			
		},
		sendRequest: function(oArg) {
			var arg = (this.method && this.sReq && this.callback)? this : oArg;
			var request = YAHOO.util.Connect.asyncRequest(arg.method, arg.sReq, arg.callback);
		},
		handleSuccess: function(o) {
			if (o.getResponseHeader['Content-Type'].match(/text\/html/) != null) {
			// html mode
				var oDoc = o.responseText;
				results.innerHTML=oDoc;
			}
			else {
			// xhtml mode
				var oDoc = o.responseXML.documentElement;
				var list = document.importNode(oDoc, true);
				if (results.childNodes.length>0) results.replaceChild(list,results.firstChild);
				else results.appendChild(list);
			}
			var resultsList = $D.getElementsByClassName('RC-Widgets-AJAXSearch-list','div',results)[0];
			var resultsListHeight = RC.Helpers.stripUnits($D.getStyle(resultsList,'height')).amount;
			if (isNaN(resultsListHeight)) resultsListHeight = resultsList.offsetHeight;
			var anim = new $A(results,{height:{to:resultsListHeight}},0.3,YAHOO.util.Easing.easeOut);
			anim.animate();
		},
		handleFailure: function(o) { window.location = o.argument.sReq.substring(0,o.argument.sReq.length - 22); }
	}
}();
RC.Widgets.loadEvent = function() {
	YAHOO.util.Dom.addClass(document.getElementsByTagName('body')[0],'hasJS');
	RC.Widgets.hCard.init();
	RC.Widgets.References.init();
	RC.Widgets.Tooltips.init();
	RC.Widgets.AJAXSearch.init();
}
YAHOO.util.Event.addListener(window,'load',RC.Widgets.loadEvent);

