package org.subalternproductions.seepResource.dsl.style
{
	import org.subalternproductions.util.collections.IIterator;

	public class SStyleSheet implements ISStylesheet
	{
		public function SStyleSheet()
		{
		}
		
		public var styles:Array = [];  // pre-init, this may be populated with IStyle obejcts or SVarDef
		public var vars:Object = {};

				
		
		protected var _styleMap:StyleMap = new StyleMap;

		public function styleByName(name:String):ISStyle {
			return name ?  _styleMap.styleByName(name) : null; 
		} // getStyle

		public var isInit:Boolean;
		
		public function init():void {
			var item:*;
			isInit = true;
			for each (item in styles) {
				if (item is SVarDef) {
					var vardef:SVarDef = item as SVarDef;
					vardef.init();
					vars[vardef.name] = vardef;					
				}
			}
			
			for each (item in styles) {
				if (item is ISStyle) {
					addStyle(ISStyle(item));
				}
			}
			
			
		} // init
		
		public function index(v:String):int {
			return _styleMap.index(v);
		}
		
		
		public function getVar(name:String):SVarDef {
			return vars[name];
		}
		
		public function name(i:int):String {
			return _styleMap.name(i);
		}
		
		
		public function style(i:int):ISStyle {
			return _styleMap.style(i);
		}
		
		
		public var maxIndex:int = 0;
		public function addStyle(s:ISStyle):void {
			var index:int = _styleMap.add(s);
			if (index > maxIndex) {
				maxIndex = index;
			}
		} // addStyle
		
		public function iterator():IIterator {
			return _styleMap.iterator();
		}
		public function show():String {
			return toTrace()
		}
		
		public function toTrace():String {
			var out:String = "--- stylesheet ---\n"; 
			var it:IIterator = _styleMap.iterator(); 
			while (it.hasNext()) {
				var style:SElementStyle = it.next();
				out += ("   " + style.name + " {\n");
				if (style.properties) {
					for each (var p:Object in style.properties) {
						var vStr:String;
						if (p.varName) {
							vStr = "$" + p.varName
						} else {
							var v:* = p.value;
							vStr = v ? v.toString() : ""
						}
						out += ("       " + p.name + ": " + vStr ) +"\n"
					}
				}
				out += "   }\n";
			}
			return out;
		}
		
		
	} // class
} // package