package
{
	import flash.display.*;
	import flash.events.Event;
	import flash.geom.*;
	import flash.text.*;
	
	/**
	 * @author (t)ad
	 */
	public class PlayingCard extends Sprite
	{
		
		public var red:ColorTransform;
		
		public var black:ColorTransform;
		
		public var numbers:Array = ["A", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "King", "Queen", "Jack"];
		
		public var suits:Array = ["c", "club", "d", "diamond", "h", "heart", "s", "spade"];
		
		public var cardColor:uint;
		
		
		public var suitSpots:Sprite;
		
		public function PlayingCard(num:String, suit:String, immortal:Boolean = false) {
			
			
			suitSpots = new Sprite();
			
			red = new ColorTransform(0, 0, 0, 1, 255, 0, 0, 0);
			
			black = new ColorTransform(0, 0, 0, 1, 0, 0, 0, 0);
			
			cardColor = (suit == "h" || suit == "d") ? 0xFF0000 : 0x000000;
			
			this.graphics.beginFill(0xFFFFFF);
			this.graphics.lineStyle(1, cardColor);
			this.graphics.drawRect(0, 0, 100, 150);
			this.mouseEnabled = false;
			
			
			addChildren(num, suit);
			
			
			if (numChildren == 2) {
				var numChild:DisplayObject = getChildAt(0);
				numChild.scaleX = numChild.scaleY /= 1.5;
				numChild.x = numChild.y = 2;
				var suitImage:DisplayObject = getChildAt(1);
				suitImage.y = 24 -3;
				suitImage.x = 3;
				suitImage.scaleX = suitImage.scaleY  /= 4;
				makeOppositeTwo(num, suit);
			}
			
			
			if (!immortal) addEventListener(Event.REMOVED_FROM_STAGE, die, false, 0, true);
			
		}
		
		private function makeOppositeTwo(n:String, s:String):void {
			
			addChildren(n, s);
			
			var suitImage:DisplayObject = getChildAt(3);
			var numberImage:DisplayObject = getChildAt(2);
			
			suitImage.rotation = 180;
			numberImage.rotation = 180;
			
			numberImage.y = 150 - numberImage.height/numberImage.scaleY + 20;
			numberImage.x = 100 - numberImage.width + 14;
			numberImage.scaleX = numberImage.scaleY /= 1.5;
			
			suitImage.y = numberImage.y - 20;
			suitImage.x = numberImage.x - 2;
			
			suitImage.scaleX = suitImage.scaleY /= 4;
			makeSuitSpots();
			makePattern(n, s);
		}
		
		
		
		private function makeSuitSpots():void {
			
			
			suitSpots.graphics.lineStyle(1, 0x000000);
			suitSpots.graphics.drawRect(0, 0, 100, 150);
			
			var positions:Array = [
			
			[15, 10], [15, 45], [15, 80], [15, this.height - 35 + 5],
			[40, 10], [40, 65], [40, this.height - 35 + 5],
			[this.width - 33, 10], [this.width -33, 45], [this.width - 33, 80], [this.width - 33, this.height - 35 + 5],
			[15,65], [this.width-31, 65]
			
			];
			
			for (var i:int = 0; i < positions.length; i++) {
				
				makeSpot(suitSpots, positions[i]);
				
			}
					
			this.addChild(suitSpots);
		}
		
		
		
		
		
		private function makePattern(numb:String, suiter:String):void {
			
			var sChoices:Array = ["c", "Club", "d", "Diamond", "h", "Heart", "s", "Spade"];
			
			var suitImage:Class = blackJackImages[sChoices[sChoices.indexOf(suiter)+1]];
			
			var theNum:int = (numb == "A") ? 1 : int(numb);
			
			var img:DisplayObject;
			
			
			switch(theNum) {
				
				case 3:
					doImagePlace(img, suitImage, [4, 5, 6]);
					break;
				case 2:
					doImagePlace(img, suitImage, [4, 6]);
					break;
				case 1:
					doImagePlace(img, suitImage, [5]);
					break;
				case 4:
					doImagePlace(img, suitImage, [0, 3, 7, 10]);
					break;
				case 5:
					doImagePlace(img, suitImage, [0, 3, 5, 7, 10]);
					break;
				case 6:
					doImagePlace(img, suitImage, [0, 11, 3, 7, 12, 10]);
					break;
				case 7:
					doImagePlace(img, suitImage, [0, 11, 3, 5, 7, 12, 10]);
					break;
				case 8:
					doImagePlace(img, suitImage, [0, 11, 3, 4, 6, 7, 12, 10]);
					break;
				case 9:
					doImagePlace(img, suitImage, [0, 1, 2, 3, 5, 7, 8, 9, 10]);
					break;
				case 10:
					doImagePlace(img, suitImage, [0, 1, 2, 3, 4, 6, 7, 8, 9, 10]);
					break;
				default:
				
					break;
				
				
			}
			
			
		}
		
		private function makeSpot(inThis:Sprite, position:Array):void {
			
			inThis.addChild(new Sprite());
			var child:DisplayObject = inThis.getChildAt(inThis.numChildren - 1);
			child.x = position[0];
			child.y = position[1];
			
		}
		
		
		private function doImagePlace(i:DisplayObject, c:Class, p:Array):void {
			
			for (var t:int = 0; t < p.length; t++) {
				
				i = new c();
				i.scaleX = i.scaleY  /= 2;
				(suitSpots.getChildAt(p[t]) as DisplayObjectContainer).addChild(i);
			}
			
		}
		
		
		public function addChildren(num:String, suit:String):void {
			
				
			var index:int = getIndexFor(num);
			var suitIs:String = (index >= 10) ? suits[suits.indexOf(suit) + 1] : "";
				
			addChild(new blackJackImages[suitIs+numbers[index]]());
			
				
			if (suitIs != "") suit = "done"
			else getChildAt(numChildren-1).transform.colorTransform = (suit == "h" || suit == "d") ? red : black;
			
			
			switch (suit) {
				
				case "c" :
					addChild(new blackJackImages.Club());
					break;
				case "d":
					addChild(new blackJackImages.Diamond());
					break;
				case "h":
					addChild(new blackJackImages.Heart());
					break;
				case "s":
					addChild(new blackJackImages.Spade());
					break;
				default:
					
					break;
				
			}
			
		}
		
		
		
		public function getIndexFor(card:String):int {
			
			var cardIndex:int;
			
			if (card.match(/[KQJA]{1}/)) {
				if (card == "K") cardIndex = 10;
				if (card == "Q") cardIndex = 11;
				if (card == "J") cardIndex = 12;
				if (card == "A") cardIndex = 0;
			} else {
				cardIndex = int(card) - 1;
			}
			
			return cardIndex;
		}
		
		
		public function die(e:Event):void {
			
			for (var i:int = 0; i < numChildren; i++) {
				
				this.removeChildAt(i);
				
			}
			
			red = null;
			black = null;
			numbers = null;
			suits = null;
			suitSpots = null;
			
		}
		
		
	}
	
}