/*

Flash Heading Replacement v0.1

Provides a method of replacing browser-text headings with smooth Flash text.
The script looks for tags with the CSS-specified font and replaces their
text contents with a Flash movie containg the same text.

Font paths are defined in CSS
Example: h1{ font-family:"Swf/FranklinGothicBook.swf",Helvetica,sans-serif"; } 

*/

TL.FlashHeaders = function(){
	
	var headings = [];
	
	var EMWidthListener;
	var DPI;
	var EMWidth;
	
	// For brevity
	var UA = TL.UserAgent;
	var Utils = TL.Utilities;
	
	// Minimum Requirements
	if(!UA.HasFlashPlayerVersion(6,0,0) || UA.isMacIE || UA.isOpera || !UA.IsModern){
		return false;
	}
	
	document.write('<style type="text/css">h1,h2,h3,h4,h5,h6,legend{visibility:hidden;}</style>');
			
	return {
		BUILD:'20060607',
		VERSION_8_MODE: UA.HasFlashPlayerVersion(8,0,0),
		IS_IE: UA.Browser == "msie",
		IS_WIN_IE: function(){return (UA.Browser == "msie" && UA.OS == "Windows")}(),
		IS_MAC: UA.IsMac,
		BROWSER_VERSION: UA.Version,
		
		createEMWidthListener: function(){
			
			// Only IE supports element.onresize
			// and IE5 needs special access for iframes
			// Therefore, for IE we will use div.onresize
			if(UA.Browser == "msie"){
				
					EMWidthListener = document.createElement("div");
					document.body.appendChild(EMWidthListener);
					
					// Prevent IE 'loading' animation
					setTimeout(function(){
										EMWidthListener.style.visibility = "hidden";
										EMWidthListener.style.width = "1em";
										EMWidthListener.style.height = "1em";
										},10);
					TL.Events.addEvent(EMWidthListener,"resize",function(){
																	
						TL.FlashHeaders.resizeFonts();
					});
				
				
			// All other browsers do not support element.onresize
			// Therefore, we use an IFRAME
			}else{
					
					EMWidthListener = document.createElement("iframe");
					EMWidthListener.setAttribute('frameborder',0);
					EMWidthListener.setAttribute('framemargin',0);
					EMWidthListener.setAttribute('framespace',0);
					EMWidthListener.setAttribute('scrolling','no');
					

					if(UA.Browser == "safari"){
						/* 
						IFRAME must be wrapped in a div so it can be absolute-positioned 
						and still broadcast resize events in Safari.  It must also appear
						in the visible portion of the screen.
						*/
						EMWidthListenerWrapper = document.createElement("div");
						document.body.insertBefore(EMWidthListenerWrapper,document.body.childNodes[0]);
						
						EMWidthListenerWrapper.appendChild(EMWidthListener);
						
						var doc = EMWidthListener.contentWindow.document;
						
						doc.open();
						doc.write('Font Resize Checker');
						doc.close();
						
						EMWidthListener.style.width = "1em";
						EMWidthListener.style.height = "1em";
						EMWidthListener.contentWindow.counter = 0;
					
						// Iframe must be onscreen to broadcast events
						EMWidthListenerWrapper.style.position = "absolute";
						EMWidthListenerWrapper.style.visibility = "hidden";
						EMWidthListener.style.zIndex = "100";
						
						EMWidthListener.contentWindow.counter = 1;
					}else{
						document.body.appendChild(EMWidthListener);
						
						var doc = EMWidthListener.contentWindow.document;
						
						doc.open();
						doc.write('Font Resize Checker');
						doc.close();
						
						EMWidthListener.style.width = "1em";
						EMWidthListener.style.height = "1em";
						EMWidthListener.contentWindow.counter = 0;
						
						EMWidthListener.style.position = "absolute";
						EMWidthListener.style.zIndex = "100";
						EMWidthListener.style.left = "-1000px";
						EMWidthListener.style.top = "-1000px";
					}
					
					TL.Events.addEvent(EMWidthListener.contentWindow,"resize",function(){
						// When the iframe loads, it calls a resize event
						// The counter allows us to ignore this event
						
						EMWidthListener.contentWindow.counter++; 
						
						if(EMWidthListener.contentWindow.counter > 1){
							TL.FlashHeaders.resizeFonts();
						}
					});
			}
		},
		
		getEMWidth: function(){
			if(!EMWidth){
				EMWidth = document.createElement("div");
				document.body.appendChild(EMWidth);
				EMWidth.style.width = "1em";
				EMWidth.style.height = "1em";
			}
			EMWidth.style.position = "absolute";
			EMWidth.style.visibility = "hidden";
			
			var r = EMWidth.offsetWidth;
			
			return r;
		
		},

		getDPI: function(){
			if(!DPI){
				DPI = document.createElement("div");
				document.body.appendChild(DPI);
			}
			DPI.style.width = "1in";
			DPI.style.height = "1in";
			DPI.style.zIndex = "100";
			DPI.style.position = "absolute";
			DPI.style.left = "-1000px";
			DPI.style.top = "-1000px";
			DPI.style.visibility = "hidden";
			
			var r = DPI.offsetWidth;
			
			return r;
			
		},
		
		getFontPts: function($element){
		
			var s = Utils.getElementStyle($element,"font-size");
			var u = s.replace(/[^a-zA-Z%]/g,'');
			var n = parseFloat(s.replace(/[a-zA-Z%]/g,''));
			
			if(u == "px"){
				// Safari does not update the ComputedStyle for font-size 
				// when the text is resized.  Some adjustment must be made.
				if(UA.Browser == "safari"){
					var pts = (this.getEMWidth()/(this.getDPI()/72));
					var px = parseFloat(Utils.getElementStyle(document.body,"font-size"));
					var r = pts/px;
					return (n*r);
				}else{
					return (72/this.getDPI())*n;
				}
			}
			
			if(u == "em"){
				return n*this.getFontPts($element.parentElement);
			}
			
			if(u == "pt"){
				return n;
			}
			
			if(u == "%"){
				return (n/100)*this.getFontPts($element.parentElement);
			}
			
			return n;
		},
		
		convertColor: function($color){
		
			if($color.match("rgb")){
				var tmp = $color.replace(/[a-zA-Z()]/g,'');
				tmp = tmp.split(",");
				
				var r = parseInt(tmp[0]).toString(16);
				var g = parseInt(tmp[1]).toString(16);
				var b = parseInt(tmp[2]).toString(16);
				if (r.length == 1) {r = '0' + r};
				if (g.length == 1) {g = '0' + g};
				if (b.length == 1) {b = '0' + b};
				return '#' + r + g + b;
			} else {
				return $color;
			}
		},

		selectElements: function(){
			var headings = Utils.getHeadingElements();
			var legends = document.body.getElementsByTagName("legend");
			
			if(legends.length > 0){
				headings = TL.Utilities.joinNodeLists(headings, legends);
			}
			
			var r = [];
			var i = headings.length - 1;
			do{
				var h = headings[i];
				
				var family = Utils.getElementStyle(h,"font-family");
				if(family.match(".swf")){
					r[r.length] = h;
				}
			}
			while(i--);
			return r;
		},	
		
		loader: {},

		queueLength: 0,

		prefetchQueue: {},

		getPrefetchQueue: function($elements){
			var i = $elements.length - 1;
			var q = this.prefetchQueue;
			do{
				var family = Utils.getElementStyle($elements[i],"font-family");
				
				var temp = family.split(/['"]/);
				var filename;
				
				var j = temp.length -1;
				do{
					var t = temp[j];
					if(t.match(".swf")){
						filename = t;
						break;
					}	
				}
				while(j--);

				var f1 = filename.split(".swf")[0];
				
				if(!q[f1]){
					this.queueLength++;
					if(this.VERSION_8_MODE){
						q[f1]=f1+"V8.swf";
					}else{
						q[f1]=f1+"V6.swf";
					}
					
				}				
				
			}
			while(i--);
			return q;
		},	

		prefetchFonts: function($queue){
			
			this.loader = document.createElement("div");
			document.body.appendChild(this.loader);
			this.loader.style.position = "absolute";
			this.loader.style.zIndex = "100";
			this.loader.style.width = "0px";
			this.loader.style.height = "0px";
			
			if(!this.IS_IE||this.IS_MAC){
				
				var counter = this.queueLength;
				for(var i in $queue){
					counter--;
					var thisFont = document.createElement("div");
					thisFont.setAttribute('style','visibility:hidden');
					this.loader.appendChild(thisFont);
					var str = '<embed src="'+$queue[i]+'?'+this.BUILD+'" id="loader_'+parseInt(counter)+'"  width="1" height="1" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" allowScriptAccess="sameDomain" swLiveConnect="true" flashvars="swfPrefetch=true"/>';
					
					thisFont.innerHTML = str;
					
				}
				
				
			}else{
				var counter = this.queueLength;
				
				for(var i in $queue){
					counter--;
				
					var thisFont = document.createElement("div");
					this.loader.appendChild(thisFont);
					var fsScript ="";
					if(this.IS_WIN_IE && !this.VERSION_8_MODE){
						fsScript = '<script event=FSCommand(command,args) for=loader_'+counter+'>\n TL.FlashHeaders.resizeHeading(command,args); <\/script>';
					}
					
					thisFont.innerHTML = '<object id="loader_'+parseInt(counter)+'" type="application/x-shockwave-flash" width="1px" height="1px"><param name="allowScriptAccess" value="sameDomain" /><param name="movie" value="'+$queue[i]+'?'+this.BUILD+'" /><param name="flashvars" value="swfPrefetch=true&swfFSCommand=true" /></object>'+fsScript;
				}
			}
		},
		
		fontsReady: 0,
		
		onFontReady: function(){
			this.fontsReady++;
			
			if(this.fontsReady == this.queueLength){
				 setTimeout(function(){TL.FlashHeaders.loader.innerHTML = "";},1);
				 setTimeout(TL.FlashHeaders.onPrefetchComplete,1);
			}
			
		},

		buildQueryString: function($params){
			return 'swfId='+$params.swfId+'&swfTxt='+$params.swfTxt+'&swfFontsize='+$params.swfFontsize+'&swfFontweight='+$params.swfFontWeight+'&swfColor='+$params.swfColor+'&swfTextAlign='+$params.swfTextAlign+'&swfScreenDPI='+$params.swfScreenDPI+'&swfFSCommand='+$params.swfFSCommand+'&swfPrefetch=false';
		},
		
		buildInnerHTML: function($params,$query){
		
			var r = "";
			if((UA.Browser != "msie")||(UA.IsMac)){
				r = '<div style="position:relative; margin:0; padding:0; border:0; overflow:hidden;"><div style="visibility:hidden; margin:0; padding:0; border:0;" >'+$params.headingText+'</div>'+'<embed style="position:absolute; top:0; left:-3px; z-index:1;" id="'+$params.swfId+'" src="'+$params.swfFilename+'?'+this.BUILD+'" flashvars="'+$query+'" quality="high" wmode="'+$params.swfWMode+'" scale="noscale" salign="lt" bgcolor="'+$params.swfBGColor+'"  height="34px" align="top" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" swLiveConnect="true"/></div>';
			}else{
				r = '<div style="height:1%; position:relative; margin:0; padding:0; border:0;"><div style="overflow:hidden; visibility:hidden; margin:0; padding:0; border:0;">'+$params.headingText+'</div>'+'<object style="position:absolute; top:0; left:-3px; z-index:1;" id="'+$params.swfId+'" type="application/x-shockwave-flash" width="1px" height="34px" align="left"><param name="allowScriptAccess" value="sameDomain" /><param name="bgcolor" value="'+$params.swfBGColor+'" /><param name="wmode" value="'+$params.swfWMode+'" /><param name="movie" value="'+$params.swfFilename+'?'+this.BUILD+'" /><param name="flashvars" value="'+$query+'" /><param name="quality" value="high" /><param name="scale" value="noscale" /><param name="salign" value="lt" /></object></div>'+$params.swfFSScript;
			}
			
			return r;
			
		},
		
		replaceHeadings: function($elements){
			if(this.VERSION_8_MODE){
				var ext = "V8.swf";
			}else{
				var ext = "V6.swf";
			}

			var i = $elements.length-1;
   			do 
    			{	
				var h = $elements[i];
				
				var family = Utils.getElementStyle(h,"font-family");	
				
				var temp = family.split(/['"]/);
				var filename;

				var j = temp.length-1;
				do{
					var t = temp[j];
					if(t.match(".swf")){
						filename = t;
						break;
					}	
				}
				while(j--);
				
				var f1 = filename.split(".")[0];
				
				var params = {};
				params.swfFilename = f1+ext;
				params.swfId = "flashHeading"+parseInt(i);
				params.swfTxt = escape(h.innerHTML);
				params.swfFontsize = this.getFontPts(h);
				params.swfFontWeight = Utils.getElementStyle(h,"font-weight");
				params.swfColor = this.convertColor(Utils.getElementStyle(h,"color"));
				params.swfTextAlign = Utils.getElementStyle(h,"text-align");
				params.swfScreenDPI = this.getDPI();
				params.swfBGColor = Utils.getElementStyle(h,"background-color");
				params.headingText = h.innerHTML;
				params.swfFSScript = "";
				
				if((params.swfBGColor == "transparent")||(params.swfBGColor == "rgba(0, 0, 0, 0)")){
					params.swfWMode = "transparent";
				}else{
					params.swfBGColor = this.convertColor(params.swfBGColor);
					params.swfWMode = "opaque";
				}

				params.swfFSCommand = false;
				
				if(this.IS_WIN_IE && !this.VERSION_8_MODE){
					params.swfFSCommand = true;
					params.swfFSScript = '<script event=FSCommand(command,args) for='+params.swfId+'>\n TL.FlashHeaders.resizeHeading(command,args); <\/script>';
				}
				
				if(!this.IS_IE||this.IS_MAC){
					var query = this.buildQueryString(params);
					h.innerHTML = this.buildInnerHTML(params,query); 
				}else{
					var query = this.buildQueryString(params);
					h.innerHTML = this.buildInnerHTML(params,query);
					if(this.VERSION_8_MODE&&(document.forms[0])){
						window[params.swfId] = document.forms[0][params.swfId];
					}
					
				}
				
				h.params = params;
				
			}
			while(i--);
			
		},
		
		showHeadings: function(){
			var headings = Utils.getHeadingElements();
			var legends = document.body.getElementsByTagName("legend");
			if(legends.length > 0){
				 headings = TL.Utilities.joinNodeLists(headings, legends);
			}
		
			var i=headings.length-1;
			do{
				var h = headings[i];
				if(h.style){
					h.style.visibility = "visible";
				}
			}
			while(i--);
		},
		
		resizeWidths: function(){
			var i = headings.length-1;
   			
			do 
    			{
     				var div = headings[i].firstChild.firstChild;
					div.nextSibling.style.width = parseInt(div.offsetWidth+3)+"px";
					
    			}
  			while (i--); 
   			
		},
		
		resizeFonts: function(){
			var i = headings.length-1;
			do
			{
				var h = headings[i];
				var p = h.params;
				p.swfFontsize = this.getFontPts(h);
				h.innerHTML = this.buildInnerHTML(p, this.buildQueryString(p));
			}
			while(i--);
			this.resizeWidths();
		},
		
		resizeHeading: function($id,$height){
		
			if($id == "onFontReady"){
				TL.FlashHeaders.onFontReady();
				return false;
			}
			

			if(UA.isMacIE){
				var thisHeading = document[$id];
			}else{
				var thisHeading = document.getElementById($id);
			}
			
			var h = Math.ceil(parseFloat($height));
		/*	if(UA.isWinIE){
				thisHeading.style.height = h+1+"px";
				var n = thisHeading.parentElement.childNodes[0];
				n.style.marginBottom = h-n.offsetHeight+"px";
				
			}else{*/
				
				thisHeading.style.height = h+1+"px";
				thisHeading.parentNode.childNodes[0].style.height = h+1+"px";
			/*}*/
		},
		

		init: function(){
			
			headings = TL.FlashHeaders.selectElements();
			
			var prefetchQueue = TL.FlashHeaders.getPrefetchQueue(headings);
			
			TL.FlashHeaders.onPrefetchComplete = function(){
				
				TL.FlashHeaders.replaceHeadings(headings);
				TL.FlashHeaders.createEMWidthListener();
				if(!TL.FlashHeaders.IS_IE){TL.FlashHeaders.resizeWidths();}
				TL.Events.addEvent(window,"resize",TL.FlashHeaders.resizeWidths);
				TL.FlashHeaders.showHeadings(headings);	
				
			}
		
			TL.FlashHeaders.prefetchFonts(prefetchQueue);
			
		}
	}
}();
TL.Events.addOnDOMReadyEvent(TL.FlashHeaders.init);

/*TL.Events.addEvent(window, "load", TL.FlashHeaders.init);*/

