/*****************************************************
*  
*  Copyright 2009 Adobe Systems Incorporated.  All Rights Reserved.
*  
*****************************************************
*  The contents of this file are subject to the Mozilla Public License
*  Version 1.1 (the "License"); you may not use this file except in
*  compliance with the License. You may obtain a copy of the License at
*  http://www.mozilla.org/MPL/
*   
*  Software distributed under the License is distributed on an "AS IS"
*  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
*  License for the specific language governing rights and limitations
*  under the License.
*   
*  
*  The Initial Developer of the Original Code is Adobe Systems Incorporated.
*  Portions created by Adobe Systems Incorporated are Copyright (C) 2009 Adobe Systems 
*  Incorporated. All Rights Reserved. 
*  
*****************************************************/
package org.osmf.layout
{
	import org.osmf.events.MetadataEvent;
	import org.osmf.metadata.NonSynthesizingMetadata;

	/**
	 * @private
	 * 
	 * Defines metadata that holds a number of layout related attributes.
	 * 
	 * The default layout renderer adheres specific semantics to each attribute.
	 *  
	 *  @langversion 3.0
	 *  @playerversion Flash 10
	 *  @playerversion AIR 1.5
	 *  @productversion OSMF 1.0
	 */	
	internal class LayoutAttributesMetadata extends NonSynthesizingMetadata
	{
		/**
		 * @private
		 * 
		 * Identifier for the index property.
		 *  
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 1.5
		 *  @productversion OSMF 1.0
		 */
		public static const INDEX:String = "index";
		
		/**
		 * @private
		 *
		 * Identifier for the index property.
		 *  
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 1.5
		 *  @productversion OSMF 1.0
		 */
		public static const SCALE_MODE:String = "scaleMode";
		
		/**
		 * @private
		 *
		 * Identifier for the vertical align property.
		 *  
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 1.5
		 *  @productversion OSMF 1.0
		 */
		public static const VERTICAL_ALIGN:String = "verticalAlign";
		
		/**
		 * @private
		 *
		 * Identifier for the horizontal align property.
		 *  
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 1.5
		 *  @productversion OSMF 1.0
		 */
		public static const HORIZONTAL_ALIGN:String = "horizontalAlign";
		
		/**
		 * @private
		 *
		 * Identifier for the snapToPixel property.
		 *  
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 1.5
		 *  @productversion OSMF 1.0
		 */
		public static const SNAP_TO_PIXEL:String = "snapToPixel";
		
		/**
		 * @private
		 *
		 * Identifier for the layoutMode property.
		 *  
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 1.5
		 *  @productversion OSMF 1.0
		 */
		public static const MODE:String = "layoutMode";
		
		/**
		 * @private
		 *
		 * Identifier for the facet's includeInLayout property.
		 *  
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 1.5
		 *  @productversion OSMF 1.0
		 */
		public static const INCLUDE_IN_LAYOUT:String = "includeInLayout";
		
		public function LayoutAttributesMetadata()
		{
			super();
			
			_verticalAlign = null;
			_horizontalAlign = null;
			_scaleMode = null;
			_snapToPixel = true;
			_layoutMode = LayoutMode.NONE;
			_includeInLayout = true;
		}
		
		/**
		 * @private
		 */
		override public function getValue(key:String):*
		{
			if (key == null)
			{
				return undefined;
			}
			else if (key == INDEX)
			{
				return index;
			}
			else if (key == SCALE_MODE)
			{
				return scaleMode;
			}
			else if (key == VERTICAL_ALIGN)
			{
				return verticalAlign;
			}
			else if (key == HORIZONTAL_ALIGN)
			{
				return horizontalAlign;
			}
			else if (key == SNAP_TO_PIXEL)
			{
				return snapToPixel;
			}
			else if (key == INCLUDE_IN_LAYOUT)
			{
				return snapToPixel;
			}
			else 
			{
				return undefined;
			}
		}
		
		// Public interface
		//
		
		/**
		 * @private
		 */
		public function get index():Number
		{
			return _index;
		}
		public function set index(value:Number):void
		{
			if (_index != value)
			{
				var event:MetadataEvent
					= new MetadataEvent(MetadataEvent.VALUE_CHANGE, false, false, INDEX, value, _index);
					
				_index = value;
						
				dispatchEvent(event);
			}
		}
		
		/**
		 * @private
		 */
		public function get scaleMode():String
		{
			return _scaleMode;
		}
		public function set scaleMode(value:String):void
		{
			if (_scaleMode != value)
			{
				var event:MetadataEvent
					= new MetadataEvent(MetadataEvent.VALUE_CHANGE, false, false, SCALE_MODE, value, _scaleMode);
					
				_scaleMode = value;
						
				dispatchEvent(event);
			}
		}
		
		/**
		 * @private
		 */
		public function get verticalAlign():String
		{
			return _verticalAlign;
		}
		public function set verticalAlign(value:String):void
		{
			if (_verticalAlign != value)
			{
				var event:MetadataEvent
					= new MetadataEvent(MetadataEvent.VALUE_CHANGE, false, false, VERTICAL_ALIGN, value, _verticalAlign);
					
				_verticalAlign = value;
						
				dispatchEvent(event);
			}
		}
		
		/**
		 * @private
		 */
		public function get horizontalAlign():String
		{
			return _horizontalAlign;
		}
		public function set horizontalAlign(value:String):void
		{
			if (_horizontalAlign != value)
			{
				var event:MetadataEvent
					= new MetadataEvent(MetadataEvent.VALUE_CHANGE, false, false, HORIZONTAL_ALIGN, value, _horizontalAlign);
					
				_horizontalAlign = value;
						
				dispatchEvent(event);
			}
		}
		
		/**
		 * @private
		 */	
		public function get snapToPixel():Boolean
		{
			return _snapToPixel;
		}
		public function set snapToPixel(value:Boolean):void
		{
			if (_snapToPixel != value)
			{
				var event:MetadataEvent
					= new MetadataEvent(MetadataEvent.VALUE_CHANGE, false, false, SNAP_TO_PIXEL, value, _snapToPixel);
					
				_snapToPixel = value;
						
				dispatchEvent(event);
			}
		}
		
		/**
		 * @private
		 */
		public function get layoutMode():String
		{
			return _layoutMode;
		}
		public function set layoutMode(value:String):void
		{
			if (_layoutMode != value)
			{
				var event:MetadataEvent
					= new MetadataEvent(MetadataEvent.VALUE_CHANGE, false, false, MODE, value, _layoutMode);
					
				_layoutMode = value;
						
				dispatchEvent(event);
			}
		}
		
		/**
		 * @private
		 */
		public function get includeInLayout():Boolean
		{
			return _includeInLayout;
		}
		public function set includeInLayout(value:Boolean):void
		{
			if (_includeInLayout != value)
			{
				var event:MetadataEvent
					= new MetadataEvent(MetadataEvent.VALUE_CHANGE, false, false, INCLUDE_IN_LAYOUT, value, _layoutMode);
					
				_includeInLayout = value;
						
				dispatchEvent(event);
			}
		}
		
		// Internals
		//
		
		private var _index:Number = NaN;
		private var _scaleMode:String;
		private var _verticalAlign:String;
		private var _horizontalAlign:String;
		private var _snapToPixel:Boolean;
		private var _layoutMode:String;
		private var _includeInLayout:Boolean;
	}
}