/*
Copyright (c) 2009 Yahoo! Inc.  All rights reserved.  
The copyrights embodied in the content of this file are licensed under the BSD (revised) open source license
*/
package com.yahoo.astra.containers.formClasses {
	import com.yahoo.astra.containers.formClasses.FormItemContainer;
	import com.yahoo.astra.containers.formClasses.FormLayoutStyle;
	import com.yahoo.astra.containers.formClasses.IForm;
	import com.yahoo.astra.events.FormLayoutEvent;
	import com.yahoo.astra.layout.LayoutManager;
	import com.yahoo.astra.layout.events.LayoutEvent;

	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.text.TextFormat;	

	/**
	 * <code>FormItemLabel</code> contains a label and required indicator in <code>FormItem</code> .
	 * 
	 * @see com.yahoo.astra.containers.formClasses.FormItem
	 * @see com.yahoo.astra.containers.formClasses.FormItemContainer
	 * @author kayoh
	 */
	public class FormItemLabel extends FormItemContainer  implements IForm {

		
		//--------------------------------------
		//  Constructor
		//--------------------------------------
		/**
		 * Constructor.
		 */
		public function FormItemLabel() {
			super();
		}

		//--------------------------------------
		//  Properties
		//--------------------------------------
		/**
		 * @private
		 */
		private var labelTextField : TextField = null;
		/**
		 * @private
		 */
		private var lableText : String = null;
		/**
		 * @private
		 */
		private var lableSprite : Sprite = null;

		/**
		 * @private
		 */
		private var _actualLabelTextWidth : Number = NaN;

		/**
		 * @private
		 */
		internal function get actualLabelTextWidth() : Number {
			return _actualLabelTextWidth;	
		}

		/**
		 * @private
		 */
		internal function set actualLabelTextWidth(value : Number) : void {
			if(_actualLabelTextWidth == value) return;
			_actualLabelTextWidth = value;
		}

		/**
		 * @private
		 */
		private var _preferredWidth : Number;

		/**
		 * @private
		 */
		internal function get preferredLabelWidth() : Number {
			return _preferredWidth;	
		}

		/**
		 * @private
		 */
		internal function set preferredLabelWidth(value : Number) : void {
			if(_preferredWidth == value) return;
			_preferredWidth = value;

			var tempHeight : Number = (labelTextField) ? labelTextField.height : 0;
			LayoutManager.resize(subItemContainer, value, tempHeight);
			
			if(labelAlign)	this.alignLabel = labelAlign;
			this.dispatchEvent(new LayoutEvent(LayoutEvent.LAYOUT_CHANGE));
		}

		/**
		 * @private
		 */
		private var _preferredLabelTextFormat : TextFormat;

		/**
		 * @private
		 */
		internal function get preferredLabelTextFormat() : TextFormat {
			return _preferredLabelTextFormat;	
		}

		/**
		 * @private
		 */
		internal function set preferredLabelTextFormat(value : TextFormat) : void {
			updateTextFields(value as TextFormat);
			_preferredLabelTextFormat = value;
		}

		
		//--------------------------------------
		//  Internal Methods
		//--------------------------------------

		/**
		 * @private
		 */
		override internal function update_indicatiorLocation(value : String) : void {
			cleanRequiredIndicatorBoxs();
			switch(value) {
				case FormLayoutStyle.INDICATOR_LEFT:
					if(!lableText && labelAlign == FormLayoutStyle.TOP) {
						break;
						return;
					}
					if(required) reqBox_l.showIndicator();
					reqBox_l.makeEmptyGap();
					break;
					
				case FormLayoutStyle.INDICATOR_LABEL_RIGHT:
					if(!lableText && labelAlign == FormLayoutStyle.TOP) {
						break;
						return;
					}
					if(required) reqBox_r.showIndicator();
					reqBox_r.makeEmptyGap();
					break;
			}
		}

		//--------------------------------------
		//  Private Methods
		//--------------------------------------
		/**
		 * @private
		 */
		override public function update(target : String, value : Object = null) : void {
			switch(target) {
				case FormLayoutEvent.UPDATE_LABEL_FONT_CHANGE:
					if(!preferredLabelTextFormat) updateTextFields(value as TextFormat);
					break;
				case FormLayoutEvent.UPDATE_LABEL_WIDTH:
					this.preferredLabelWidth = Number(value);
					break;
						
				case FormLayoutEvent.UPDATE_REQUIRED_ITEM:
					required = Boolean(value);
					break;
						
				case FormLayoutEvent.UPDATE_INDICATOR_LOCATION:
					indicatorLocation = String(value);
					break;
						
				case FormLayoutEvent.UPDATE_LABEL_ALIGN:
					labelAlign = String(value);
					break;
			}
		}

		/**
		 * @private
		 */
		override internal function set labelAlign(value : String) : void {
			if(this.labelAlign == value) return;
			this.alignLabel = _labelAlign = value;
			update_indicatiorLocation(indicatorLocation);
		}

		/**
		 * @private
		 */
		internal function attLabel(lableTxt : String) : void {
			
			lableSprite = new Sprite();
			if(lableTxt is String && lableTxt != "" ) {
				lableText = lableTxt;
				if(!labelTextField) labelTextField = FormLayoutStyle.labelTextField;
				labelTextField.htmlText = lableText;
				actualLabelTextWidth = labelTextField.width;
				labelTextField.x = 0;
				lableSprite.addChild(labelTextField);
			} else {
				lableText = null;
				actualLabelTextWidth = 0;
			}
			

			this.dispatchEvent(new FormLayoutEvent(FormLayoutEvent.LABEL_ADDED));
			
			this.addItem(lableSprite);
		}

		/**
		 * @private
		 */
		override protected function updateTextFields(textformat : TextFormat) : void {
			if(!labelTextField) return;
			actualLabelTextWidth = NaN;
		
			var textFieldToChg : TextField = labelTextField;
			var str : String = textFieldToChg.htmlText;
			textFieldToChg.htmlText = str;
//			trace("updateTextFields", textformat, str)
			textFieldToChg.setTextFormat(textformat);
			actualLabelTextWidth = textFieldToChg.width;
			this.dispatchEvent(new FormLayoutEvent(FormLayoutEvent.LABEL_ADDED));
		}

		/**
		 * @private
		 */

		private  function set alignLabel(value : String) : void {
			if(!lableText) return;
			switch(value) {
				case FormLayoutStyle.TOP:
					labelTextField.x = 0;
					break;
				case FormLayoutStyle.RIGHT:
					labelTextField.x = (preferredLabelWidth) ? preferredLabelWidth - actualLabelTextWidth : 0;
					break;
				case FormLayoutStyle.LEFT:
					labelTextField.x = 0;
					break;
			}
		}
	}
}