package com.tadSrc.tadsClasses
{

	import flash.events.EventDispatcher;
	import flash.external.ExternalInterface;
	import flash.events.TimerEvent;
	import flash.events.Event;
	import flash.utils.Timer;

	public class onHashChangeManager extends EventDispatcher
	{

		public var functionToCall:Function;
	
		public function onHashChangeManager(func:Function = null, lag:Number = 500)
		{

			functionToCall = func;
			var t:Timer = new Timer(lag, 1);
			t.addEventListener(TimerEvent.TIMER_COMPLETE, ini, false, 0, true);
			t.start();
		}
		
		
		private function ini(e:TimerEvent):void {
		
		
			if (ExternalInterface.available) {
			
				ExternalInterface.addCallback("onHashChangeCallback", callFunc);
				makeLevelOneMasterTalk("onHashChangeForSWF", "onHashChangeCallback", getIdByIndex());
				establishOnHashChangeListener();
			
			}
			
			e.target.removeEventListener(TimerEvent.TIMER_COMPLETE, ini);
		
		}
		
		private function callFunc(currentHash:String = ""):void {
		
			if (functionToCall != null) functionToCall(currentHash);
			this.dispatchEvent(new Event(currentHash));
		}
		
		private function establishOnHashChangeListener():void {
		
		
			var javaScript:XML = 
			<script>
			<![CDATA[
			function () {
			
			
				window.onhashchange = function (e) {
				
					var thee = (e != undefined) ? e : event;
					var afthash = new RegExp("[\#]{1}[a-z0-9\,\-]{1,}", "i");
					var thehashword = (window.location.toString().match(afthash)) ? 
						window.location.toString().match(afthash).toString().replace("#", "") : "";
					
					onHashChangeForSWF(thehashword);
				};
			
			}
			]]>
			</script>;
			
			if (ExternalInterface.available) ExternalInterface.call(javaScript);
		
		
		}
		
		private function makeLevelOneMasterTalk(nameToBe:String, funcIs:String, idIs:String):void
		{

			/* used to create a javascript function that acts as the callBack function itself. */


			var masterTalkBuild:String = 
			"<script><![CDATA[function(){"+nameToBe+" = function"+
			"() { var fcontenter;"+
			"try {fcontenter=window.document.getElementById('"+idIs+"');}catch(e) {"+
			"try {var theflash='"+idIs+"';fcontenter=window.document.theflash;}catch(e) {var movie='"+idIs+"';"+
			"if (navigator.appName.indexOf('Microsoft')!=-1 || navigator.appName.indexOf('MSIE')!=-1) {"+ 
			"if (window.document[movie]){fcontenter=window.document[movie];}else{fcontenter=window[movie];};"+
			"}else {if (document.embeds[movie]){fcontenter=document.embeds[movie];}else"+
			"{fcontenter=document[movie];};}}}"+
			"if (arguments && arguments.length > 0) {fcontenter['"+funcIs+"'].apply(fcontenter, arguments);}"+
			"else{fcontenter['"+funcIs+"']();} }; }]]></script>";


			if (ExternalInterface.available) {

				var builtFunction:XML = new XML(masterTalkBuild);

				ExternalInterface.marshallExceptions = true;
				ExternalInterface.call(builtFunction);
			}

		}


		public function getIdByIndex(index:Number = 0):String
		{
			var outed:String = "";
			var idofswfobject:XML = 
			<script>
			<![CDATA[
			function (indexr) {
	
				function getid(indexer) {
					var objects;
					var r = "";
					try {
	     
						 (document.getElementsByTagName("object")) ? 
						 objects = document.getElementsByTagName("object")[indexer] : 
						 objects = document.getElementsByTagName("OBJECT")[indexer];
								 
						 if (objects.hasAttribute("id") && !objects.id) {r=objects.getAttribute("id");}
						 if (objects.id && !objects.hasAttribute("ID")) {r=objects.id+"";}
						 if (objects.hasAttribute("ID")) {r=objects.getAttribute("ID");}
 
	
					}catch (e) {

						  (document.getElementsByTagName("object")) ? 
						  objects = document.getElementsByTagName("object")[indexer] : 
						  objects = document.getElementsByTagName("OBJECT")[indexer];

						if (objects && objects.outerHTML) {
						
							 var ohtml=objects.outerHTML.toString();
							 var idfind = new RegExp("id[ ]{0,}=[ ]{0,}[ a-zA-Z0-9\_\"]{1,}", "i");
							 var ridid = new RegExp("id", "i");
							 var rideq = new RegExp("[=\"]{1,}", "ig");
							 var ridspace = new RegExp("[ ]{1,}", "g");
							 var nocodeBase = new RegExp("codeBase|classid|height|width", "ig");
							 
							if (ohtml.match(idfind)) { 
								r = 
								ohtml.match(idfind).toString().replace(ridid, "").replace(rideq, 								"").replace(ridspace, "").replace(nocodeBase, "");
							}else{r = "";}
						}else {r = "";}

					}
					return r;
				};

			return(getid(indexr));

			}
			]]>
			</script>;


			if (ExternalInterface.available) {
				outed = ExternalInterface.call(idofswfobject, index);
			}

			return outed;

		}
		
		

	}
}