Report abuse

package {
	/******************************** Glossary ********************************/
	/* A Spanish explorer who was also a mathematician spent time learning a
	/* a mystery system from African Sufi mystics. They used a peculiar system
	/* for divining future events and explaining patterns in the natural world.
	/* They would draw lines in the sand such as ----, ====, -=-=, =-=-, etc.
	/* Each of these quadrigrams were called "sacred words" and represented
	/* aspects of nature. It turns out that these "mystics" were practicing the
	/* worlds first binary mathematical logic and artificial chaos system or
	/* random number generator.
	/* The numbers sacred to this system were 2, 4, 8, 16, 32, and 256 and they
	/* used 16 as the base of their mathematics rather than 10. This system
	/* would be transmitted to Europe as "Geomancy" and eventually be the sole
	/* model for memory storage and computation in the modern age.
	/*
	/* Ifa is the sacred system whence this all derives and since they have 
	/* concise and succinct words for handling concepts inherent to programming
	/* I tend to make use of this system in my own nomenclature. This is done for
	/* much the same reason contempory scientists use the Greco-Roman sufix/prefix system
	/*
	/* The follow is a list of words used in this ap and their definitions:
	/* Ile: Home or Abode
	/* Ire: Yang, Possitive, Expansion
	/* Ibi: Yin, Negative, Contraction
	/* Ori: Head, Self, Soul
	/* Obi: Parent
	/* Omo: Child
	/* Oba: Chief, King/Queen
	/* Oku: Ghost, Spirit
	/* Oju: Face
	/* Egun: Ancestor
	/* Oruko: Full Name
	/* Ologun: Warrior, Contender
	/**************************************************************************/
	import flash.display.*;
	import flash.geom.Point;
	import fl.motion.easing.*;
	import flash.events.Event;
	import flash.utils.getTimer;
	import flash.text.TextFormat;
	import flash.utils.getDefinitionByName;
	import flash.external.ExternalInterface;
	import ayz.templates.Component;
	import ayz.interfaces.IComponent;
	import ayz.loaders.ImageLoader;
	import ayz.utils.Debugger;
	import ayz.managers.*;
	import rw.handlers.Liaison;
	import rw.data.XMLObject;
	import rw.utils.Copy;
	import gs.*;

	public class TournamentBrackets extends Component implements IComponent {
		//Inherent Elements
		public var cell:MovieClip;
		public var closeButton:MovieClip;
		public var expandButton:MovieClip;
		public var predictMessage:MovieClip;
		public var trailerMessage:MovieClip;
		//Variables
		private var ourMode:String;
		private var ourQue:uint = 0;
		private var ourBreadth:Number;
		private var ourDepth:Number;
		private var ourTree:CombatTree;
		private var ourFocus:ContenderSlot;
		private var ourOlogun:Array;//Ologun means Warrior
		private var ourOku:Contender;//Oku means Ghost
		private var ourMarquee:*;
		private var ourSlot:Object = new Object();//Registry of ContenderSlots
		private var ourBanished:Object = new Object();
		private var ourDebugger:Debugger = new Debugger();
		private var ourSeed:XMLObject = new XMLObject();

		private var ourIsInitialized:Boolean = false;
		
		public function get isInitialized():Boolean { return ourIsInitialized; }
		/******************************** INSPECTABLES ********************************/
		protected var ourInspectablesSet:Array = new Array();
		protected var ourHPadding:Number;
		protected var ourVPadding:Number;
		protected var ourAutoInit:Boolean;

		[Inspectable(name = "1) Horizontal Padding (Pixels)", defaultValue = 10, type = Number)]
		public function set hPadding(val:Number):void{setInspectable("HPadding", val);}
		public function get hPadding():Number { return ourHPadding; }

		[Inspectable(name = "2) Vertical Padding (Pixels)", defaultValue = 10, type = Number)]
		public function set vPadding(val:Number):void { setInspectable("VPadding", val); }
		public function get vPadding():Number { return ourVPadding; }

		[Inspectable(name = "5) Auto Initialize (Boolean)", defaultValue = true, type = Boolean)]
		public function set autoInit(val:Boolean):void { setInspectable("AutoInit", val); }
		public function get autoInit():Boolean { return ourAutoInit; }
		
		protected function setInspectable(propName:String, val:* = null):void {
			ourInspectablesSet.push(propName);
			if (val != null) { this["our"+propName] = val; }
			checkInspectables();
		}

		protected function checkInspectables():void {
			if (ourInspectablesSet.length >= 3) {
				// do after all inspectables are set...
				if (autoInit && ourIsInitialized == false) { init(); }
			}
		}
		/******************************************************************************/
		
		public function TournamentBrackets():void {
			addInterests(new Array("NiOri", "RegisterSlot", "SlotFocus", "SlotBlur", "TrapOku", "FreeOku"));
		}
		
		public function init():void {
			/**** Expand/Close Button ****/
			var isExpanded:Boolean = ExternalInterface.call("isBracketsExpanded");
			expandButton.alpha = int(expandButton.mouseEnabled = !isExpanded);
			closeButton.alpha = int(closeButton.mouseEnabled = isExpanded);
			if (isExpanded) toggle(true);
			expandButton.buttonMode = expandButton.useHandCursor = closeButton.buttonMode = closeButton.useHandCursor = true;
			/*****************************/
			ourBreadth = cell.width - (hPadding*2);
			ourDepth = cell.height - (vPadding*2);
			ourIsInitialized = true;
			ourSeed.key		= "id";
			ourSeed.onParse	= buildBrackets;
			ourSeed.load("_xml/brackets.xml");
			new Liaison(this);
		}
		
		public function buildBrackets(myData:Object):void {
			ourOlogun = ourSeed.data.contender.slice(0);
			ourTree			= new CombatTree(ourSeed.data.structure.tier);
			ourTree.breadth	= ourBreadth/2;
			ourTree.depth	= ourDepth;
			ourTree.grow();
			cell.addChild(ourTree);
			setMode(Boolean(loaderInfo.parameters.mode) ? loaderInfo.parameters.mode : "predict");
		}
		
		public function setMode(myRef:String):void {
			switch (ourMode = myRef) {
				case "view":
					TweenLite.to(cell.predictMessage, 1, {alpha:0});
					TweenLite.to(cell.trailerMessage, 1, {alpha:1});
				break;
				case "predict":
					TweenLite.to(cell.predictMessage, 1, {alpha:1});
					TweenLite.to(cell.trailerMessage, 1, {alpha:0});
				break;
			}
		}
		
		override public function catchEvent(myEvent:String, myParticular:Object):void {
			switch (myEvent) {
				case "RegisterSlot": ourSlot[myParticular.target.oruko] = myParticular.target; break;
				case "SlotFocus":
					ourFocus = myParticular.target;
					if (Boolean(ourFocus.contender) && !Boolean(ourOku) && ourFocus.name != "champion") evokeOku(ourFocus.contender);
				break;
				case "SlotBlur":
					TweenLite.to(ourFocus.glow, .5, {alpha:0});
					ourFocus = null;
					if (Boolean(ourOku)) {
						if (ourOku.isInHand) return;
						fadeOku();
					}
				break;
				case "NiOri"://Establish Ori; Ni means possess and Ori means Head, Self, Soul
					if (!Boolean(myParticular.oju)) {//Get next available Ologun
						var myOlogun:Object = ourOlogun[binToDec(myParticular.target.ile.oruko)];
						ImageLoader.load(imgRef(myOlogun.image), myParticular.target.render);
						myParticular.target.name	= myOlogun.image;
						myParticular.target.oruko	= myOlogun.name;
						if (String(myOlogun.placement) != "") {//Preselection Contender placement...
							if (myParticular.target.ile.oruko.indexOf(myOlogun.placement) == 0 || myOlogun.placement == "champion") {//If the calling ContenderSlot and proposed ContenderSlot are from the same branch...
								ourSlot[myOlogun.placement].contender = myParticular.target as Contender;//Set Contender for proposed
								ourTree.bearFruits(myParticular.target, ourSlot[myOlogun.placement].contender);//Set ContendersSlot leading to proposed ContenderSlot
							}
						}
					} else {//Load image of specified oju
						ImageLoader.load(imgRef(myParticular.oju), myParticular.target.render);
					}
				break;
				case "TrapOku":
					if (ourMode == "view") {trace(ourSeed.data.media.src+ourOku.name+ourSeed.data.media.ext);
						if (Boolean(ourOku)) ExternalInterface.call("openVideo", ourSeed.data.media.src+ourOku.name+ourSeed.data.media.ext);
						return;
					}
					var mySize:Number = ourOku.size/ourSeed.data.structure.viewSize;
					ourOku.isInHand = true;
					TweenLite.to(ourOku, .5, {size:ourFocus.size});
				break;
				case "FreeOku":
					if (ourMode == "view") return;
					ourOku.isInHand = false;
					if (Boolean(ourFocus)) {
						var myFoci:String = (Boolean(ourFocus.ile) ? ourFocus.ile.name : "")+ourFocus.name;
						var isEligable:Boolean = ourFocus.name == "champion" ? true : ourOku.oba.name.indexOf(myFoci) == 0;
						if (ourFocus.contender != ourOku.haunt && !isEligable) {//ourOku has been freed but doesn't originate from ourFocus.contender
							fadeOku();
							EventManager.fireEvent("SlotFocus", {target:ourFocus});
						} else if (isEligable) {//ourOku is eligable to occupy ourFocus
							ourOku.size = ourFocus.size;
							ourFocus.contender		= ourOku;
							ourFocus.contender.name	= ourOku.haunt.name;
							EventManager.fireEvent("NiOri", {target:ourFocus.contender, oju:ourOku.haunt.name});
							ourTree.bearFruits(ourOku.haunt, ourFocus.contender);
							fadeOku(true);
							EventManager.fireEvent("SlotFocus", {target:ourFocus});
						} else {//ourOku centers on ourFocus
							var myLocus:Point = ourFocus.localToGlobal(new Point(x,y));
							TweenLite.to(ourOku, .25, {x:myLocus.x, y:myLocus.y});
						}
					} else { fadeOku(); }//Nothing is in focus
				break;
			}
		}
		
		private function evokeOku(myContender:Contender):void {
			var mySpan:uint = ourSeed.data.structure.viewSize;
			var myLocus:Point = myContender.localToGlobal(new Point(ourTree.x,ourTree.y));
			myLocus = cell.globalToLocal(myLocus);
			ourOku			= new Contender(myContender);
			ourOku.x		= myLocus.x;
			ourOku.y		= myLocus.y;
			ourOku.haunt	= ourFocus.contender;
			EventManager.fireEvent("NiOri", {target:ourOku, oju:myContender.name});
			TweenLite.to(ourOku, .5, {size:mySpan, ease:Sine.easeOut});
			cell.addChild(ourOku);
			ourMarquee			= new Copy(ourOku.oruko.toUpperCase(), Eurostile, {width:ourSeed.data.structure.viewSize*1.5, wordWrap:true});//new Marquee();
			ourMarquee.format	= new TextFormat(null, ourSeed.data.structure.fontSize, null, null, null, null, null, null, "center", null, null, null, -2);
			ourMarquee.x		= myLocus.x - ourMarquee.width/2;
			ourMarquee.y		= myLocus.y + mySpan/2 - int(ourOku.haunt.ile.name)*(mySpan + ourMarquee.height);
			ourMarquee.alpha	= 0;
			ourMarquee.applyGlow({color:0xFFFFFF, alpha:1, blurX:4, blurY:4, strength:16});
			TweenLite.to(ourMarquee, 1, {alpha:1, ease:Sine.easeInOut});
//			ourMarquee.addChild(myWrighter);
			cell.addChild(ourMarquee);
		}
		
		private function fadeOku(isEligable:Boolean = false):void {
			TweenLite.to(ourOku, .25, {alpha:0, size:ourSeed.data.structure.viewSize*2, ease:Sine.easeInOut});
			TweenLite.to(ourMarquee, .25, {alpha:0, ease:Sine.easeInOut, onComplete:banish});
			ourBanished[ourOku.name] = ourOku;
			ourBanished[ourMarquee.name] = ourMarquee;
			ourMarquee = null;
			ourOku = null;
		}
		
		private function banish():void {
			for (var member:String in ourBanished) {
				if (ourBanished[member].alpha == 0) {
					if (cell.contains(ourBanished[member])) {
						cell.removeChild(ourBanished[member]);
						delete ourBanished[member];
					}
				}
			}
		}
		
		public function toggle(myState:Boolean):void {
			TweenLite.to(cell, 1, {width:myState ? 1238 : 825, height:myState ? 698 : 465, onComplete:myState ? activate : close});
		}
		
		public function close():void {
			ExternalInterface.call("closeBrackets");
			activate();
		}
		
		public function activate(myState:Boolean = true):void {
			ourTree.mouseChildren = myState;
		}
		
		//Utilities
		private function binToDec(myBinary:*):uint {
			var myResult:uint = 0;
			myBinary = myBinary.split("").reverse();
			for (var n:uint = 0; n < myBinary.length; n++) myResult += int(myBinary[n])*Math.pow(2, n);
			return myResult;
		}
		
		private function imgRef(myRef:String):String { return ourSeed.data.image.src+myRef+ourSeed.data.image.ext; }
		
		//Events
		public function clickHandler(e:Event):void {
			switch (e.target) {
				case expandButton:
					activate(false);
					closeButton.mouseEnabled = true;
					ExternalInterface.call("expandBrackets");
					expandButton.alpha = int(expandButton.mouseEnabled = false);
					TweenLite.to(closeButton, .25, {alpha:1, delay:1});
					toggle(true);
				break;
				case closeButton:
					activate(false);
					expandButton.mouseEnabled = true;
					closeButton.alpha = int(closeButton.mouseEnabled = false);
					TweenLite.to(expandButton, .25, {alpha:1, delay:1});
					toggle(false);
				break;
			}
		}
		
		public function mouse_upHandler(e:Event):void {
			if (Boolean(ourOku) && !Boolean(ourFocus)) fadeOku();
		}
		
		public function mouse_moveHandler(e:Event):void {
			if (Boolean(ourOku)) {
				if (ourOku.isInHand) {//ourOku follows mouse when isInHand
					ourOku.x = cell.mouseX;
					ourOku.y = cell.mouseY;
				}
				if (Boolean(ourFocus)) {
					var myFoci:String = (Boolean(ourFocus.ile) ? ourFocus.ile.name : "")+ourFocus.name;
					var isEligable:Boolean = myFoci == "champion" ? true : ourOku.haunt.oba.name.indexOf(myFoci) == 0;
					if (ourOku.isInHand && isEligable && ourFocus.glow.alpha == 0) TweenLite.to(ourFocus.glow, .5, {alpha:1});//If ourFocus is empty and available, highlight ourFocus
				}
			}
		}
	}
}