package com.actiontad.javascript.events
{


  	import flash.utils.*;
  	import flash.events.*;
  	import flash.external.ExternalInterface;
  	import com.actiontad.javascript.events.DOMExEvent;


	public class DOMExEventDispatcher extends EventDispatcher
	{

		private var onWhat:String;
		private var uniqueNumber:Number;
		private var theLag:Number =  1000;
		private var theDOMExEvent:DOMExEvent;
		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;
			theDOMExEvent = new DOMExEvent(["",""]);
			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 =
				"";

				var theJavaScript:XML = new XML(theJavaScriptString);


				ExternalInterface.call(theJavaScript, props);


			}

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

		}


		private function theEventDispatcher(arrayOfEventProperties:Array):void
		{

			theDOMExEvent.eventPropertiesArray = arrayOfEventProperties;
			dispatchEvent(theDOMExEvent);


		}


		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 =
			"";


			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 =
			;


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

			return outed;

		}



	}

}