package com.tadSrc.tadsClasses
{


  import flash.utils.*;
  import flash.events.*;
  import flash.external.ExternalInterface;
  import com.tadSrc.tadsClasses.DOMExEvent;


public class DOMExEventDispatcher extends EventDispatcher
{

	private var onWhat:String;
	private var uniqueNumber:Number;
	private var theLag:Number =  1000;

	private var eventProperties:Array;


public function DOMExEventDispatcher(onWhater:String, propsToGet:Array, lag:Number = 1000)
{

	uniqueNumber = Math.floor(Math.random()*new Date().getTime());
	onWhat = onWhater;
	theLag = lag;

	eventProperties = propsToGet;

	var lagTime:Timer = new Timer(theLag, 1);
	lagTime.addEventListener(TimerEvent.TIMER_COMPLETE, iniDevd);
	lagTime.start();

}


private function iniDevd(e:TimerEvent):void
{
	e.target.stop();

	var callName:String = "DOMExEventDispatcher"+uniqueNumber+"";
	var eventName:String = "domexEvent"+uniqueNumber+"";
        var props:Array = [];


	for (var i:int = 0; i < eventProperties.length; i++)
	{ props.push(eventProperties[i]); }

	if (ExternalInterface.available) {

		ExternalInterface.addCallback(callName, theEventDispatcher);
		makeLevelOneMasterTalk(eventName, callName, getIdByIndex());

		//We can not pass events themselves between AS and JS.
		//So instead, whatever uses this class will also pass in the event properties it wants to get
		//A DOMExEvent will then have an Array of the values of those properties

		var theJavaScriptString:String = 
		"<script><![CDATA[function (arr) {"+onWhat+" = "+
		"function (e) {var thee = (e != undefined) ? e : event;"+
		"if (thee.preventDefault) { thee.preventDefault();}"+
		"thee.cancelBubble = true;"+
		"thee.returnValue = false;"+
		"if (thee.stopPropagation) thee.stopPropagation();"+
		"var propers = arr; var outputinger = []; "+
		"for (var i = 0; i < propers.length; i++)"+
		"{ outputinger.push(thee[propers[i]]); };"+
		eventName+"(outputinger);return false;};}]]></script>";

		var theJavaScript:XML = new XML(theJavaScriptString);


		ExternalInterface.call(theJavaScript, props);


	}

	e.target.removeEventListener(TimerEvent.TIMER_COMPLETE, iniDevd);

}


private function theEventDispatcher(arrayOfEventProperties:Array):void
{


	dispatchEvent(new DOMExEvent(arrayOfEventProperties));


}


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):*
{
	var outed:*;
	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;

}



}

}