/* (c) 2007 The Roundhouse
 * ------------------------
 * - All Rights Reserved
 */

if(!TheRoundhouse) 								var TheRoundhouse 							= new Object();
if(!TheRoundhouse.Frameworks) 					TheRoundhouse.Frameworks	 				= new Object();
if(!TheRoundhouse.Frameworks.Accessibility) 	TheRoundhouse.Frameworks.Accessibility		= function(){};
if(!TheRoundhouse.Frameworks.ToolTips) 			TheRoundhouse.Frameworks.ToolTips			= function(){};

TheRoundhouse.Frameworks.__available		= function()
{
	return (typeof $ == "function");
}

TheRoundhouse.Frameworks.__validateOptions  = function(objOptions, arrExpectedOptions)
{
	for(var i in objOptions)
		for(var j = 0; j < arrExpectedOptions.length; j++)
			if(i == arrExpectedOptions[j])
				arrExpectedOptions.splice(j,1);
				
	if(arrExpectedOptions.length)
		alert("Error: Missing options: "+arrExpectedOptions.join(", "));
	
	return (arrExpectedOptions.length == 0);
}

TheRoundhouse.Frameworks.Accessibility.prototype = {
	available 	: false,
	debug 		: false,
	fontSize	: 70,
	domain		: "",
	init 		: function(domain, debug)
	{
		this.domain		= domain;
		this.debug 		= debug || false;
		this.available 	= TheRoundhouse.Frameworks.__available();
		// check for mootools
		if(this.available)
		{
			this.fontSize	= Cookie.get("FontSize") || this.fontSize;
			
			if(!(Cookie.get("TextOnly") && Cookie.get("TextOnly")=="Yes"))
				this.setTextSize();
		}
		else
			alert("WARNING: No tools available");
	},
	
	setTextSize : function(strFontSize)
	{
		if(strFontSize)
			this.fontSize = parseInt(strFontSize);
			
		Cookie.set("FontSize", this.fontSize, {duration : 365, domain : this.domain, path : "/"});
		$(document.body).setStyle('fontSize', this.fontSize +"%");
		showCurr();
	},
	
	calculateTextSize : function(iXPosition)
	{
		this.fontSize 	= this.iLowerScale + ((iXPosition / this.iMaxX) * this.iDragRange);
		this.setTextSize();
	},
	
	trackBarPosition : function()
	{
		var iVal = 0;
		if($('accessibilitydragbar'))
			iVal = ($('accessibilitydragbar').getCoordinates().left - $('accessibilitydragbar').getParent().getCoordinates().left);
		
		document.accessibility.calculateTextSize(iVal);
	},
	
	createTextResizeDrag : function(objOptions)
	{
		var arrExpectedOptions 		= new Array("strDivId", "iLowerScale", "iUpperScale", "iBarWidth", 
												"iBarHeight", "iDragHeight", "iDragWidth", "iDragColor");
		
		if(TheRoundhouse.Frameworks.__validateOptions(objOptions, arrExpectedOptions))
		{
			if(this.available)
			{
				if($(objOptions.strDivId))
				{
					// work out how big the drag range is
					this.iDragRange 		= (objOptions.iUpperScale - objOptions.iLowerScale);
				
					// work out the current position along the bar
					this.iCurrentPosition	= (this.fontSize - objOptions.iLowerScale) / this.iDragRange;
					
					// store the maximum x position
					this.iMaxX				= objOptions.iBarWidth - objOptions.iDragWidth;
					this.iLowerScale		= objOptions.iLowerScale;
				
					// clear the div
					if(typeof objOptions.bClearDiv != "undefined")
						$(objOptions.strDivId).setHTML('');
					
					var divTextResizeHolder	= new Element('div');
					var divTextSize			= new Element('div');
					var aScaleBar 			= new Element('a');
					var aDragBar 			= new Element('a');
					aScaleBar.setProperty('href', 'javascript:void(0)');
					aDragBar.setProperty('href', 'javascript:void(0)');
					divTextResizeHolder.setStyles({'height':'1em', 'top':'0.57em', 'marginTop':(-objOptions.iDragHeight/2)+'px', 'width':(objOptions.iBarWidth+objOptions.iDragWidth)+'px'});
					//, 'float': 'left', 'width': '200px'
					
					divTextSize.setStyles({'width':				(objOptions.iBarWidth+objOptions.iDragWidth)+'px',
										  'height':				objOptions.iDragHeight+'px',
										  'position':			'relative'});
					aScaleBar.setStyles({'width':				objOptions.iBarWidth+'px',
										  'height':				objOptions.iBarHeight+'px',
										  'position': 			'absolute',
										  'left': 				0,
										  'top':				((objOptions.iDragHeight - objOptions.iBarHeight)/2)+'px'});
					aDragBar.setStyles({'backgroundColor': 		objOptions.iDragColor,
										  'width':				objOptions.iDragWidth+'px',
										  'height':				objOptions.iDragHeight+'px',
										  'position': 			'absolute',
										  'left': 				(this.iCurrentPosition * objOptions.iBarWidth)+'px',
										  'top':				'0px'});
					
					aDragBar.setProperty('id', 'accessibilitydragbar');
					aScaleBar.aDragBar		= aDragBar;
					/*aScaleBar.addEvent('click', function(event)
												{
													var xPos = event.layerX || event.x;
													if(xPos)
													{
														var fxVibe = new Fx.Style(this.aDragBar, 'left', {	duration:	400, 
																				  							transition:	Fx.Transitions.expoOut,
																											onStart:	function()
																														{
																															document.iTrackFontSize = setInterval(document.accessibility.trackBarPosition, 1000/30);
																														},
																											onComplete:	function()
																														{
																															clearInterval(document.iTrackFontSize);
																														}}).start(this.aDragBar.getStyle('left'), xPos);
													}
													
												});*/
					
					if(typeof objOptions.strNewId != "undefined")
						divTextResizeHolder.setProperty('id', objOptions.strNewId);
					
					divTextSize.adopt(aScaleBar);
					divTextSize.adopt(aDragBar);
					divTextResizeHolder.adopt(divTextSize);
					$(objOptions.strDivId).adopt(divTextResizeHolder);
					
					aDragBar.makeDraggable({onDrag: 
										    function()
											{
												var iXPosition = this.element.getCoordinates().left - this.element.getParent().getCoordinates().left;
												document.accessibility.calculateTextSize(iXPosition);
											},
											
											limit:
											{
												x:[0,objOptions.iBarWidth-objOptions.iDragWidth],
												y:[0,0]
											}
											});
					
				}
				else
					alert("Error: Unable to locate accessibility div");
			}
			else
				alert("Error: Accessibility options unavailable: no tools");
		}
	},
	
	createTextOnlyLink : function(objOptions)
	{
		var arrExpectedOptions 		= new Array("strDivId", "strGraphicText", "strTextOnly");
		
		if(TheRoundhouse.Frameworks.__validateOptions(objOptions, arrExpectedOptions))
		{
			if(this.available)
			{
				if($(objOptions.strDivId))
				{
					if(typeof objOptions.bClearDiv != "undefined")
						$(objOptions.strDivId).setHTML('');
					
					var aTextOnly 	= new Element('a');
					var strVal		= (Cookie.get("TextOnly") && Cookie.get("TextOnly")=="Yes") ? "No" : "Yes";
					aTextOnly.setProperty('href', 'javascript:document.accessibility.switchToTextOnly("'+strVal+'")');
					aTextOnly.setHTML(strVal=="Yes" ? objOptions.strTextOnly : objOptions.strGraphicText);
					
					if(typeof objOptions.strNewId != "undefined")
						aTextOnly.setProperty('id', objOptions.strNewId);
						
					$(objOptions.strDivId).adopt(aTextOnly);					
				}
				else
					alert("Error: Unable to locate accessibility div");
			}
			else
				alert("Error: Accessibility options unavailable: no tools");
		}
	},
	
	switchToTextOnly : function(strVal)
	{
		Cookie.set("TextSize", "", {duration : -100, domain : this.domain, path : "/"});
		Cookie.set("TextOnly", strVal, {duration : 365, domain : this.domain, path : "/"});
		window.location.reload(true);
	}
};

TheRoundhouse.Frameworks.ToolTips.prototype = {
	debug		: false,
	available	: false,
	arrLinks	: null,
	domain		: null,
	init 		: function(domain, debug)
	{
		this.domain		= domain || "";
		this.debug 		= debug || false;
		this.available	= TheRoundhouse.Frameworks.__available();
		this.arrLinks	= new Array();
	},
	
	attachToolTips : function(objOptions)
	{
		var arrExpectedOptions 		= new Array();
		if(TheRoundhouse.Frameworks.__validateOptions(objOptions, arrExpectedOptions))
		{
			if(this.available)
			{
				this.arrLinks 	= $$('a');
				for(var i = 0; i < this.arrLinks.length; i++)
				{
					var aHref	= this.arrLinks[i].getProperty('href') || "";
					if(this.arrLinks[i].hasClass('flink'))
					{
						this.arrLinks.splice(i, 1);
						i--;
						continue;
					}
					else if(aHref.indexOf("mailto:") === 0)
						this.applyMailtoLabel(this.arrLinks[i]);
					else if((Window.ie && aHref.indexOf("http://www."+this.domain) != 0) || (!Window.ie && aHref.indexOf("http://") === 0))
						this.applyExternalLabel(this.arrLinks[i]);
					else
					{
						this.arrLinks.splice(i, 1);
						i--;
						continue;
					}
				}
				this.attachTips();
			}
			else
				alert("Error: Tooltip options unavailable: no tools");
		}
		
	},
	
	applyExternalLabel : function(aLink)
	{
		aLink.setProperty('title', '&nbsp;::External link to <strong>'+unescape(aLink.getProperty('href'))+'</strong>');
	},
	
	applyMailtoLabel : function(aLink)
	{
		if(aLink.getProperty('href') && aLink.getProperty('href') != "")
			aLink.setProperty('title', '&nbsp;::Send an e-mail to: <strong>'+unescape(aLink.getProperty('href').substring('mailto:'.length), aLink.getProperty('href').length+'</strong>'));
	},
	
	attachTips : function()
	{
		var strMsg = "";
		for(var i = 0; i < this.arrLinks.length; i++)
		{
			strMsg += " - "+this.arrLinks[i].getProperty('href') +"\n";
			
		}
		if(this.debug) alert("Added tooltips to :\n"+strMsg);
		var linkTips = new Tips(this.arrLinks, {duration:400, maxOpacity:0.9, offsets:{x:0,y:-45},onShow:function(tip){tip.setStyle('visibility', 'visible'); tip.setStyle('marginLeft', ((-tip.getCoordinates().width)/2 - 5)+'px')}});
		
	}
};
