/**
 * http://ajaxui.nhndesign.com/svn/Jindo_Component/Component/tags/0.2.4/component.js
 * http://ajaxui.nhndesign.com/svn/Jindo_Component/HTMLComponent/tags/0.1.1/htmlcomponent.js
 */


﻿
nhn.Component=jindo.$Class({_eventHandlers:null,_options:null,$init:function(){var aInstance=this.constructor.getInstance();if(typeof aInstance=="undefined"){this.constructor._aInstance=aInstance=[];}
aInstance[aInstance.length]=this;this._eventHandlers={};this._options={};this._options._setters={};},option:function(sName,sValue){var sNameType=(typeof sName);if(sNameType=="undefined"){return this._options;}else if(sNameType=="string"){if(typeof sValue!="undefined"){this._options[sName]=sValue;if(typeof this._options._setters[sName]=="function"){this._options._setters[sName](sValue);}
return this;}else{return this._options[sName];}}else if(sNameType=="object"){try{for(var x in sName){this._options[x]=sName[x];if(typeof this._options._setters[x]=="function"){this._options._setters[x](sName[x]);}}}catch(e){}
return this;}},optionSetter:function(sName,fSetter){var sNameType=(typeof sName);if(sNameType=="undefined"){return this._options._setters;}else if(sNameType=="string"){if(typeof fSetter!="undefined"){this._options._setters[sName]=jindo.$Fn(fSetter,this).bind();return this;}else{return this._options._setters[sName];}}else if(sNameType=="object"){try{for(var x in sName){this._options._setters[x]=jindo.$Fn(sName[x],this).bind();}}catch(e){}
return this;}},fireEvent:function(sEvent,oEvent){var oEvent=oEvent?(oEvent instanceof jindo.$Event?oEvent._event:oEvent):{};var inlineHandler=this['on'+sEvent];var handlerList=this._eventHandlers[sEvent];var bHasInlineHandler=typeof inlineHandler=='function';var bHasHandlerList=typeof handlerList!='undefined';if(!bHasInlineHandler&&!bHasHandlerList){return true;}
handlerList=handlerList.concat();var bIsRealEvent=(function(oEvent){try{if(oEvent instanceof Event){return true;}}catch(x){}
try{if(oEvent instanceof MouseEvent){return true;}}catch(x){}
try{if(oEvent instanceof KeyEvent){return true;}}catch(x){}
try{if(('cancelBubble'in oEvent||'preventBubble'in oEvent)&&'type'in oEvent){return true;}}catch(x){}
return false;})(oEvent);if(!bIsRealEvent){try{if(typeof oEvent._extends=='undefined'){oEvent._extends=[];oEvent.stop=function(){if(oEvent._extends.length>0){oEvent._extends[oEvent._extends.length-1].bCanceled=true;}};}
oEvent._extends.push({sType:sEvent,bCanceled:false});oEvent.sType=sEvent;}catch(e){bIsRealEvent=true;}}
if(bIsRealEvent)oEvent=jindo.$Event(oEvent);var aArg=[oEvent];for(var i=2,nLen=arguments.length;i<nLen;i++){aArg.push(arguments[i]);}
if(bHasInlineHandler){inlineHandler.apply(this,aArg);}
if(bHasHandlerList){for(var i=0,handler;handler=handlerList[i];i++){handler.apply(this,aArg);}}
if(bIsRealEvent){return!oEvent.bCanceled;}
var oPopedEvent=oEvent._extends.pop();return!oPopedEvent.bCanceled;},attach:function(sEvent,fHandler){if(arguments.length==1){jindo.$H(arguments[0]).forEach(jindo.$Fn(function(fHandler,sEvent){this.attach(sEvent,fHandler);},this).bind());return this;}
var handlers=this._eventHandlers[sEvent];if(typeof handlers=='undefined'){handlers=this._eventHandlers[sEvent]=[];}
handlers.push(fHandler);return this;},detach:function(sEvent,fHandler){if(arguments.length==1){jindo.$H(arguments[0]).forEach(jindo.$Fn(function(fHandler,sEvent){this.detach(sEvent,fHandler);},this).bind());return this;}
var handlers=this._eventHandlers[sEvent];if(typeof handlers=='undefined')return this;for(var i=0,handler;handler=handlers[i];i++){if(handler===fHandler){handlers=handlers.splice(i,1);break;}}
return this;},detachAll:function(sEvent){var handlers=this._eventHandlers;if(arguments.length){if(typeof handlers[sEvent]=='undefined'){return this;}
delete handlers[sEvent];return this;}
for(var o in handlers){delete handlers[o];}
return this;}});nhn.Component.factory=function(aObject,oOption){var aReturn=[];if(typeof oOption=="undefined")oOption={};for(var i=0;i<aObject.length;i++){try{oInstance=new this(aObject[i],oOption);aReturn[aReturn.length]=oInstance;}catch(e){}}
return aReturn;};nhn.Component.getInstance=function(){return this._aInstance;};nhn.HTMLComponent=jindo.$Class({tagName:"",$init:function(){return;}}).extend(nhn.Component);nhn.HTMLComponent.paint=function(){var ins=this.getInstance();if(typeof ins=="undefined")return;for(var i=0;i<ins.length;i++){if(ins[i]&&ins[i].paint)ins[i].paint();}};nhn.HTMLComponent.factory=function(aObject,oOption){if(typeof aObject=="string"){var sClassName=aObject;if(/^(\w+)\s*(?:\[(\w+)\s*=\s*(\w+)\])?$/.test(this.prototype.tagName)){var a=[];aObject=document.getElementsByTagName(RegExp.$1);if(RegExp.$2&&RegExp.$3){for(var i=0;i<aObject.length;i++){if(aObject[i].getAttribute(RegExp.$2)==RegExp.$3)a[a.length]=aObject[i];}
aObject=a;}
if(sClassName){var regex=new RegExp("\\b"+sClassName+"\\b","i");for(var i=0,a=[];i<aObject.length;i++){if(regex.test(aObject[i].className)){a[a.length]=aObject[i];}}
aObject=a;}}else{return[];}}
this._tmpFactory=nhn.Component.factory;var aObject=this._tmpFactory(aObject,oOption);delete this._tmpFactory;return aObject;};