/**
 * 功能：UI组件基础类
 */
package("com.henry.ui");

com.henry.ui.HTML = function(tag, id) {

	var self = null;
	var _tag = "SPAN";
	var _text = null;
	
	var _classes = {};
	var _attributes = {};
	var _styles = {};
	
	var _eventListeners = {};
	var _listenersAttached = {};
	
	var _children = {};
	var _docs = [document];
	var _innerHTML = null;
	var _outerHTML = null;
	var _parent = null;
		
	var HTML = classBuilder.create(this.constructor);
		
	function getClasses() {
		var buffer = null;
		var i=0;
		for (var aClass in _classes) {
			if (i==0) {
				buffer = new com.henry.lang.StringBuffer();
			}
			buffer.append(" aw-");
			buffer.append(aClass);
			buffer.append("-");
			buffer.append(_classes[aClass]);
			i++;
		}
		return buffer;
	}

	with(HTML) {
		prototype.initialize = function() {
			self = this;									
			if (tag) {
				_tag = tag;
			}
			if (id) {
				self.setId(id);							//使用self时不支持重载，使用this可支持重载
			}
		}
		
		prototype.buildBox = function() {
			var box = new com.henry.ui.SPAN();
			box.setClass("item", "box");

			var marker = this.buildMarker();
			var image = this.buildImage();
			var ruler = this.buildRuler();
			var text = this.buildText();
			var sign = this.buildSign();
			
			if (marker) {
				box.addChild("marker", marker);
			}

			if (image) {
				box.addChild("image", image);
			}

			if (ruler) {
				box.addChild("ruler", ruler);
			}

			if (text) {
				box.addChild("text", text);
			}

			if (sign) {
				box.addChild("sign", sign);
			}
			
			return box;
		}
		
		prototype.buildMarker = function() {
			return null;
		}
		
		prototype.buildImage = function() {
			return null;
		}
		
		prototype.buildRuler = function() {
			var ruler = new com.henry.ui.SPAN();
			ruler.setClass("item","ruler");
			return ruler;
		}
		
		prototype.buildText = function() {			
			return null;
		}
		
		prototype.buildSign = function() {
			return null;
		}

		prototype.getControlText = function() {
			return _text;
		}
			
		prototype.setControlText = function(theText, noRefresh) {
	/*		
			if (!theText) {
				return;
			}
	*/		
			_text = theText;

			if (!noRefresh) {
				this.setChild("html", theText);

				var el = this.getElement();
				if (el) {
					el.innerText = theText;
				}
			}

			return this;
		}

		prototype.getElement = function() {
			if (!this.getId()) {
				return null;
			}
			for(var i=0;i<_docs.length;i++){
				var els =_docs[i].all(this.getId());
				if (els && !els.tagName) {
					for (var k=0; k<els.length; k++) {
						var el = els[k];

						if (parseInt(el.aw) == this.getIndex()) {
								return el;
						}
					}
				}
				else {
					return els;
				}
			}
		}
		
		prototype.getTag = function() {
			return _tag;
		}
		prototype.setTag = function(theTag) {
			_outerHTML = null;
			_tag = theTag;
			return this;
		}
		
		prototype.getClass = function(name) {
			return _classes[name];
		}		
		prototype.setClass = function(name, theClass) {
			_outerHTML = null;

			if (theClass == null || theClass == "") {
				delete _classes[name];
			}
			else {
				_classes[name] = theClass;
			}

			var el = this.getElement();
			if (el) {
				el.className = getClasses();
			}
			
			return this;
		}

		prototype.getStyle = function(name) {
			if (arguments.length == 0) {
				return _styles;
			}
			else {
				return _styles[name];
			}
		}		
		prototype.setStyle = function(name, theStyle) {
			_outerHTML = null;

			if (theStyle == null || theStyle == "") {
				delete _styles[name];
			}
			else {
				_styles[name] = theStyle;
			}

			var el = this.getElement();
			if (el) {
				el.style[name] = theStyle;
			}
			
			return this;
		}
		prototype.setStyles = function(styles) {
			for (var name in styles) {
				this.setStyle(name, styles[name]);
			}
			return this;
		}
		
		prototype.getAttribute = function(name) {
			if (arguments.length == 0) {
				return _attributes;
			}
			else {
				return _attributes[name];
			}
		}
		prototype.setAttribute = function(name, theAttribute) {
			if (name == "selected" || name == "checked" || name == "disabled") {
				if (theAttribute == "true") {
					theAttribute = true;
				}
				else if (theAttribute == "false") {
					theAttribute = false;				
				}
			}
		
			_outerHTML = null;
			if (theAttribute == null || theAttribute == "") {
				delete _attributes[name];
			}
			else {
				_attributes[name] = theAttribute;				
			}

			var el = this.getElement();
			if (el) {
				el[name] = theAttribute;
			}	

			return this;		
		}
		prototype.setAttributes = function(attributes) {
			for (var name in attributes) {
				this.setAttribute(name, attributes[name]);
			}
			return this;
		}
		
		prototype.getChild = function(name) {
			var parts = name.split(".");
			var child = _children[parts[0]];
			
			for (var i=1; i<parts.length; i++) {
				if (child) {
					child = child.getChild(parts[i]);
				}
				else {
					return null;
				}
			}

			return child;
		}
		prototype.addChild = function(name, child) {
			_outerHTML = null;
			_innerHTML = null;

			_children[name] = child;
			
			if (child && typeof child.setParent == "function") {
				try {
					child.setParent(this);
				}
				catch (ex) {
					//alert(ex.description);
				}
			}
			return this;
		}
		prototype.setChild = function(name, child) {
			return self.addChild(name, child);									//使用self时不支持重载，使用this可支持重载
		}
		
		prototype.setParent = function(obj) {
			_parent = obj;
			return this;
		}
		prototype.getParent = function() {
			return _parent;
		}
		
		prototype.addEventListener = function() {
			if (arguments.length == 2) {
				var eventName = arguments[0];
				var eventType = eventName;
				var eventhandler = arguments[1];
			}
			else if (arguments.length == 3) {
				var eventName = arguments[0];
				var eventType = arguments[1];
				var eventhandler = arguments[2];				
			}
			else {
				throw new Error("eventType and eventHandler must be specified in function addEventListener!");
			}
						
			if (_listenersAttached[eventName]) {
				throw new Error("event [" + eventName + "] is already registered on object [" + this.getId() + "]!");
			}
			var theEventhandler = eventhandler.bindAsEventListener(this);
			var eventListener = {"eventType":eventType, "eventHandler": theEventhandler};

			var el = this.getElement();
			if (el) {
				el.attachEvent(eventType, theEventhandler);
				_listenersAttached[eventName] = "attached";
			}
			else {
				_listenersAttached[eventName] = "notAttached";
			}

			_eventListeners[eventName] = eventListener;
			
			return this;
		}
		
		prototype.removeEventListener = function(eventName) {
			if(!_listenersAttached[eventName]) {
				return;
			}
						
			if (_listenersAttached[eventName] == "attached") {
				var el = this.getElement();
				if (el) {
					var eventListener = _eventListeners[eventName];
					var eventType = eventListener.eventType;
					var eventHandler = eventListener.eventHandler;
					
					el.detachEvent(eventType, eventHandler);
				}				
			}

			delete _listenersAttached[eventName];
			delete _eventListeners[eventName];
			
			return this;	
		}

		prototype.releaseAll = function() {
			for (var eventName in _eventListeners) {
				this.removeEventListener(eventName);
			}
			
			return this;	
		}
		
		prototype.registerEventListeners = function () {
			for (var eventName in _eventListeners) {
				var el = this.getElement();
				if (el && _listenersAttached[eventName] != "attached") {
					var eventListener = _eventListeners[eventName];
					var eventType = eventListener.eventType;
					var eventHandler = eventListener.eventHandler;		
	
					el.attachEvent(eventType, eventHandler);
					_listenersAttached[eventName] = "attached";
				}
			}
			
			return this;
		}
		
		prototype.innerHTML = function(buffer) {
			if (_innerHTML) {
				return _innerHTML;
			}
	
			if (!buffer) {
				buffer = new com.henry.lang.StringBuffer();
			}
			
			for (var item in _children) {
				var content = _children[item];
				if (content instanceof Array) {
					for (var i=0; i<content.length; i++) {
						if (content[i] && typeof content[i].outerHTML == "function") {
							/*
							if (!content[i].getId()) {
								content[i].setId([this.getId(), item, i].join("-"));
							}
							*/
							content[i].outerHTML(buffer);
						}
						else {
							buffer.append(content[i]);
						}
					}
				}
				else if (content && typeof content.outerHTML == "function") {
					/*
					if (!content.getId()) {
						content.setId([this.getId(), item].join("-"));
					}
					*/
					content.outerHTML(buffer);
				}
				else {
					buffer.append(content);
				}
			}
						
			return buffer;
		}
		
		prototype.outerHTML = function(buffer) {
			if (!buffer) {
				buffer = new com.henry.lang.StringBuffer();
			}
			
			buffer.openTag(_tag)
						.putAttributes({"id":self.getId(), "aw": this.getIndex(), "class": getClasses()})
						.putAttributes(_attributes)
						.putStyles(_styles)
						.closeTag();			
			
			this.innerHTML(buffer)
			
			buffer.endTag(_tag);
						
			return buffer; //_outerHTML;
		}
		
		prototype.decorate = function() {
			return this;
		}
		
		prototype.toString = function() {			
			return this.decorate().outerHTML().toString();
		}
	}

	return new HTML();
}

com.henry.ui.HTML.define = function(name, tag){
	if(!tag){
		tag = name.toLowerCase();
	}
	com.henry.ui[name] = function(text, id) {
		var self = new com.henry.ui.HTML(tag, id);
		if (typeof text != "undefined") {
			self.setControlText(text);
		}
	
		return this.constructor.extendInstance(self);
	}
};

(function(){
	var tags=["DIV","SPAN","IMG","INPUT","BUTTON","TEXTAREA","TABLE","TR","TD", "CAPTION"];
	for(var i=0; i<tags.length; i++){
		com.henry.ui.HTML.define(tags[i]);
		window[tags[i].toLowerCase()] = com.henry.ui[tags[i]];
	}
}
)();


com.henry.ui.Text = function(name, value, id) {
	var self = new com.henry.ui.HTML("INPUT", id);
	
	self.setAttribute("type", "text");
	self.setAttribute("name", name);
	self.setAttribute("value", value);

	return this.constructor.extendInstance(self);		
}

com.henry.ui.Checkbox = function(name, text, value, id) {
	var self = new com.henry.ui.HTML("SPAN", id);
	
	var item = new com.henry.ui.HTML("INPUT", id);
	item.setAttribute("name", name);
	item.setAttribute("type", "checkbox");
	item.setAttribute("value", text[0]);

	if (value) {
		if (value instanceof Array) {
			for (var i=0; i<value.length; i++) {
				if (text[0] == value[i]) {
					item.setAttribute("checked", true);
				}
			}
		}
		else {
			if (text[0] == value) {
				item.setAttribute("checked", true);
			}
		}
	}
	
	self.addChild("item", item);
	self.addChild("html", text[1]);
		
	return this.constructor.extendInstance(self);		
}

com.henry.ui.Radio = function(name, text, value, id) {
	var self = new com.henry.ui.Checkbox(name, text, value, id);
	
	self.getChild("item").setAttribute("type", "radio");;
		
	return this.constructor.extendInstance(self);		
}

com.henry.ui.SELECT = function(name, theOptions, theValue, id) {
	var self = new com.henry.ui.HTML("SELECT", id);
	var _value = theValue;
	
	var old = self.setControlText;

	self.setValue = function(value) {
		_value = value;	
		var el = self.getElement();
		if (el) {
			el.value = value;
		}
		//self.setAttribute("value", value);
	}
	
	self.setControlText = function(options, noRefresh) {
		
		old.apply(self, [options, "true"]);

		if (!noRefresh && options) {
			var optionObjects = [];
			for (var i=0; i<options.length; i++) {
				var opt = options[i];
				var theOption = new com.henry.ui.HTML("OPTION");

				theOption.setAttribute("value", opt[0]);
				if (opt[2] || _value == opt[0]) {
					theOption.setAttribute("selected", "true");
				}
				theOption.setControlText(opt[1]);
				optionObjects.push(theOption);
			}
			self.addChild(("options"), optionObjects);

			var el = this.getElement();
			if (el) {
				el.outerHTML = self.toString();
			}
		}		
	}	
	
	self.setAttribute("name", name);
	
 	self.setControlText(theOptions);
 	
 	return this.constructor.extendInstance(self);
}



