namespace(
		'jindo2',
		function() {
			if (typeof window != "undefined"
					&& typeof window.nhn == "undefined") {
				window.nhn = new Object;
			}
			function $(sID) {
				var ret = new Array;
				var el = null;
				var reg = /<([a-z]+|h[1-5])>/i;
				for ( var i = 0; i < arguments.length; i++) {
					el = arguments[i];
					if (typeof el == "string") {
						if (reg.test(el)) {
							el = document.createElement(RegExp.$1);
						} else {
							el = document.getElementById(el);
						}
					}
					if (el)
						ret[ret.length] = el;
				}
				return ret.length ? ((arguments.length > 1) ? ret : ret[0])
						: null;
			}
			function $Class(oDef) {
				function typeClass() {
					var t = this;
					var a = [];
					while (typeof t.$super != "undefined") {
						t.$super.$this = this;
						if (typeof t.$super.$init == "function")
							a[a.length] = t;
						t = t.$super;
					}
					for ( var i = a.length - 1; i > -1; i--)
						a[i].$super.$init.apply(a[i].$super, arguments);
					if (typeof this.$init == "function")
						this.$init.apply(this, arguments);
				}
				;
				typeClass.prototype = oDef;
				typeClass.prototype.constructor = typeClass;
				typeClass.extend = $Class.extend;
				return typeClass;
			}
			$Class.extend = function(superClass) {
				this.prototype.$super = new Object;
				var superFunc = function(m, func) {
					return function() {
						var r;
						var f = this.$this[m];
						var t = this.$this;
						t[m] = func;
						r = t[m].apply(t, arguments);
						t[m] = f;
						return r;
					}
				};
				for ( var x in superClass.prototype) {
					if (typeof this.prototype[x] == "undefined" && x != "$init")
						this.prototype[x] = superClass.prototype[x];
					if (typeof superClass.prototype[x] == "function") {
						this.prototype.$super[x] = superFunc(x,
								superClass.prototype[x]);
					} else {
						this.prototype.$super[x] = superClass.prototype[x];
					}
				}
				for ( var x in superClass) {
					if (x == "prototype")
						continue;
					this[x] = superClass[x];
				}
				return this;
			};
			function $A(array) {
				var cl = arguments.callee;
				if (typeof array == "undefined")
					array = [];
				if (array instanceof cl)
					return array;
				if (!(this instanceof cl))
					return new cl(array);
				this._array = [];
				for ( var i = 0; i < array.length; i++) {
					this._array[this._array.length] = array[i];
				}
			}
			;
			$A.prototype.toString = function() {
				return this._array.toString();
			};
			$A.prototype.length = function(len, elem) {
				if (typeof len == "number") {
					var l = this._array.length;
					this._array.length = len;
					if (typeof elem != "undefined") {
						for ( var i = l; i < len; i++) {
							this._array[i] = elem;
						}
					}
					return this;
				} else {
					return this._array.length;
				}
			};
			$A.prototype.has = function(any) {
				return (this.indexOf(any) > -1);
			};
			$A.prototype.indexOf = function(any) {
				if (typeof this._array.indexOf != 'undefined')
					return this._array.indexOf(any);
				for ( var i = 0; i < this._array.length; i++) {
					if (this._array[i] == any)
						return i;
				}
				return -1;
			};
			$A.prototype.$value = function() {
				return this._array;
			};
			$A.prototype.push = function(element1) {
				return this._array.push.apply(this._array, $A(arguments)
						.$value());
			};
			$A.prototype.pop = function() {
				return this._array.pop();
			};
			$A.prototype.shift = function() {
				return this._array.shift();
			};
			$A.prototype.unshift = function(element1) {
				this._array.unshift.apply(this._array, $A(arguments).$value());
				return this._array.length;
			};
			$A.prototype.forEach = function(callback, thisObject) {
				var arr = this._array;
				var errBreak = this.constructor.Break;
				var errContinue = this.constructor.Continue;
				function f(v, i, a) {
					try {
						callback.call(thisObject, v, i, a);
					} catch (e) {
						if (!(e instanceof errContinue))
							throw e;
					}
				}
				;
				if (typeof this._array.forEach == "function") {
					try {
						this._array.forEach(f);
					} catch (e) {
						if (!(e instanceof errBreak))
							throw e;
					}
					return this;
				}
				for ( var i = 0; i < arr.length; i++) {
					try {
						f(arr[i], i, arr);
					} catch (e) {
						if (e instanceof errBreak)
							break;
						throw e;
					}
				}
				return this;
			};
			$A.prototype.map = function(callback, thisObject) {
				var arr = this._array;
				var errBreak = this.constructor.Break;
				var errContinue = this.constructor.Continue;
				function f(v, i, a) {
					try {
						return callback.call(thisObject, v, i, a);
					} catch (e) {
						if (e instanceof errContinue)
							return v;
						else
							throw e;
					}
				}
				;
				if (typeof this._array.map == "function") {
					try {
						this._array = this._array.map(f);
					} catch (e) {
						if (!(e instanceof errBreak))
							throw e;
					}
					return this;
				}
				for ( var i = 0; i < this._array.length; i++) {
					try {
						arr[i] = f(arr[i], i, arr);
					} catch (e) {
						if (e instanceof errBreak)
							break;
						throw e;
					}
				}
				return this;
			};
			$A.prototype.filter = function(callback, thisObject) {
				var ar = new Array;
				this.forEach( function(v, i, a) {
					if (callback.call(thisObject, v, i, a) === true) {
						ar[ar.length] = v;
					}
				});
				return $A(ar);
			};
			$A.prototype.every = function(callback, thisObject) {
				if (typeof this._array.every != "undefined")
					return this._array.every(callback, thisObject);
				var result = true;
				this.forEach( function(v, i, a) {
					if (callback.call(thisObject, v, i, a) === false) {
						result = false;
						$A.Break();
					}
				});
				return result;
			};
			$A.prototype.some = function(callback, thisObject) {
				if (typeof this._array.some != "undefined")
					return this._array.some(callback, thisObject);
				var result = false;
				this.forEach( function(v, i, a) {
					if (callback.call(thisObject, v, i, a) === true) {
						result = true;
						$A.Break();
					}
				});
				return result;
			};
			$A.prototype.refuse = function(value) {
				var a = $A(arguments);
				return this.filter( function(v, i) {
					return !a.has(v)
				});
			};
			$A.prototype.slice = function(start, end) {
				var a = this._array.slice.call(this._array, start, end);
				return $A(a);
			};
			$A.prototype.splice = function(index, howMany) {
				var a = this._array.splice.apply(this._array, arguments);
				return $A(a);
			};
			$A.prototype.suffle = function() {
				this._array.sort( function(a, b) {
					return Math.random() > Math.random() ? 1 : -1
				});
				return this;
			};
			$A.prototype.unique = function() {
				var a = this._array, b = [], l = a.length;
				var i, j;
				for (i = 0; i < l; i++) {
					for (j = 0; j < b.length; j++) {
						if (a[i] == b[j])
							break;
					}
					if (j >= b.length)
						b[j] = a[i];
				}
				this._array = b;
				return this;
			};
			$A.Break = function() {
				if (!(this instanceof arguments.callee))
					throw new arguments.callee;
			};
			$A.Continue = function() {
				if (!(this instanceof arguments.callee))
					throw new arguments.callee;
			};
			function $H(hashObject) {
				var cl = arguments.callee;
				if (typeof hashObject == "undefined")
					hashObject = new Object;
				if (hashObject instanceof cl)
					return hashObject;
				if (!(this instanceof cl))
					return new cl(hashObject);
				this._table = {};
				for ( var k in hashObject) {
					if (this._table[k] == hashObject[k])
						continue;
					this._table[k] = hashObject[k];
				}
			}
			;
			$H.prototype.$value = function() {
				return this._table;
			};
			$H.prototype.length = function() {
				var i = 0;
				for ( var k in this._table) {
					if (typeof Object.prototype[k] != "undeifned"
							&& Object.prototype[k] === this._table[k])
						continue;
					i++;
				}
				return i;
			};
			$H.prototype.forEach = function(callback, thisObject) {
				var t = this._table;
				var h = this.constructor;
				for ( var k in t) {
					if (!t.propertyIsEnumerable(k))
						continue;
					try {
						callback.call(thisObject, t[k], k, t);
					} catch (e) {
						if (e instanceof h.Break)
							break;
						if (e instanceof h.Continue)
							continue;
					}
				}
				return this;
			};
			$H.prototype.filter = function(callback, thisObject) {
				var h = $H();
				this.forEach( function(v, k, o) {
					if (callback.call(thisObject, v, k, o) === true) {
						h.add(k, v);
					}
				});
				return h;
			};
			$H.prototype.map = function(callback, thisObject) {
				var t = this._table;
				this.forEach( function(v, k, o) {
					t[k] = callback.call(thisObject, v, k, o);
				});
				return this;
			};
			$H.prototype.add = function(key, value) {
				this._table[key] = value;
				return this._table[key];
			};
			$H.prototype.remove = function(key) {
				if (typeof this._table[key] == "undefined")
					return null;
				var val = this._table[key];
				delete this._table[key];
				return val;
			};
			$H.prototype.search = function(value) {
				var result = false;
				this.forEach( function(v, k, o) {
					if (v === value) {
						result = k;
						$H.Break();
					}
				});
				return result;
			};
			$H.prototype.hasKey = function(key) {
				var result = false;
				return (typeof this._table[key] != "undefined");
			};
			$H.prototype.hasValue = function(value) {
				return (this.search(value) !== false);
			};
			$H.prototype.sort = function() {
				var o = new Object;
				var a = this.values();
				var k = false;
				a.sort();
				for ( var i = 0; i < a.length; i++) {
					k = this.search(a[i]);
					o[k] = a[i];
					delete this._table[k];
				}
				this._table = o;
				return this;
			};
			$H.prototype.ksort = function() {
				var o = new Object;
				var a = this.keys();
				a.sort();
				for ( var i = 0; i < a.length; i++) {
					o[a[i]] = this._table[a[i]];
				}
				this._table = o;
				return this;
			};
			$H.prototype.keys = function() {
				var keys = new Array;
				for ( var k in this._table) {
					keys.push(k);
				}
				return keys;
			};
			$H.prototype.values = function() {
				var values = new Array;
				for ( var k in this._table) {
					values.push(this._table[k]);
				}
				return values;
			};
			$H.Break = function() {
				if (!(this instanceof arguments.callee))
					throw new arguments.callee;
			};
			$H.Continue = function() {
				if (!(this instanceof arguments.callee))
					throw new arguments.callee;
			};
			function $Element(el) {
				var cl = arguments.callee;
				if (el instanceof cl)
					return el;
				if (!(this instanceof cl))
					return new cl(el);
				this._element = $(el);
				this.tag = this._element ? this._element.tagName.toLowerCase()
						: '';
				this._queue = new Array;
			}
			;
			$Element.prototype.$value = function() {
				return this._element;
			};
			$Element.prototype.visible = function() {
				return (this.css("display") != "none");
			};
			$Element.prototype.show = function() {
				var s = this._element.style;
				var b = "block";
				var c = {
					p :b,
					div :b,
					form :b,
					h1 :b,
					h2 :b,
					h3 :b,
					h4 :b,
					ol :b,
					ul :b,
					fieldset :b,
					td :"table-cell",
					th :"table-cell",
					li :"list-item",
					table :"table",
					thead :"table-header-group",
					tbody :"table-row-group",
					tfoot :"table-footer-group",
					tr :"table-row",
					col :"table-column",
					colgroup :"table-column-group",
					caption :"table-caption"
				};
				try {
					if (typeof c[this.tag] == "string") {
						s.display = c[this.tag];
					} else {
						s.display = "inline";
					}
				} catch (e) {
					s.display = "block";
				}
				return this;
			};
			$Element.prototype.hide = function() {
				this._element.style.display = "none";
				return this;
			};
			$Element.prototype.toggle = function() {
				this[this.visible() ? "hide" : "show"]();
				return this;
			};
			$Element.prototype.css = function(sName, sValue) {
				var e = this._element;
				if (typeof sName == "string") {
					var view;
					if (typeof sValue == "string" || typeof sValue == "number") {
						var obj = new Object;
						obj[sName] = sValue;
						sName = obj;
					} else {
						if (e.currentStyle) {
							if (sName == "cssFloat")
								sName = "styleFloat";
							return e.currentStyle[sName] || e.style[sName];
						} else if (window.getComputedStyle) {
							if (sName == "cssFloat")
								sName = "float";
							return document.defaultView.getComputedStyle(e,
									null).getPropertyValue(
									sName.replace(/([A-Z])/g, "-$1")
											.toLowerCase())
									|| e.style[sName];
						} else {
							if (sName == "cssFloat"
									&& /MSIE/.test(window.navigator.userAgent))
								sName = "styleFloat";
							return e.style[sName];
						}
						return null;
					}
				}
				if (typeof $H != "undefined" && sName instanceof $H) {
					sName = sName.$value();
				}
				if (typeof sName == "object") {
					var v, type;
					for ( var k in sName) {
						v = sName[k];
						type = (typeof v);
						if (type != "string" && type != "number")
							continue;
						if (k == "cssFloat"
								&& navigator.userAgent.indexOf("MSIE") > -1)
							k = "styleFloat";
						try {
							e.style[k] = v;
						} catch (err) {
							if (k == "cursor" && v == "pointer") {
								e.style.cursor = "hand";
							} else if (("#top#left#right#bottom#").indexOf(k
									+ "#") > 0
									&& (type == "number" || !isNaN(parseInt(v)))) {
								e.style[k] = parseInt(v) + "px";
							}
						}
					}
				}
				return this;
			};
			$Element.prototype.offset = function(top, left) {
				var e = this._element;
				var t = 0, l = 0;
				if (typeof top == "number" && typeof left == "number") {
					var op = $Element(e.offsetParent);
					var po = op.offset();
					var ps = this.css("position");
					if (ps == "static" || ps == "")
						ps = e.style.position = "relative";
					if (ps == "relative")
						e.style.top = e.style.left = 0;
					t = top - po.top - ((ps == "relative") ? e.offsetTop : 0);
					l = left - po.left
							- ((ps == "relative") ? e.offsetLeft : 0);
					e.style.top = t + "px";
					e.style.left = l + "px";
					return this;
				}
				while (typeof e != "undefined" && e != null) {
					t += e.offsetTop;
					l += e.offsetLeft;
					e = e.offsetParent;
				}
				return {
					top :t,
					left :l
				};
			};
			$Element.prototype.width = function(width) {
				if (typeof width == "number") {
					var e = this._element;
					e.style.width = width + "px";
					if (e.offsetWidth != width) {
						e.style.width = (width * 2 - e.offsetWidth) + "px";
					}
				}
				return this._element.offsetWidth;
			};
			$Element.prototype.height = function(height) {
				if (typeof height == "number") {
					var e = this._element;
					e.style.height = height + "px";
					if (e.offsetHeight != height) {
						e.style.height = (height * 2 - e.offsetHeight) + "px";
					}
				}
				return this._element.offsetHeight;
			};
			$Element.prototype.className = function(sClass) {
				var e = this._element;
				if (typeof sClass == "undefined")
					return e.className;
				e.className = sClass;
				return this;
			};
			$Element.prototype.hasClass = function(sClass) {
				return (" " + this._element.className + " ").indexOf(" "
						+ sClass + " ") > -1;
			};
			$Element.prototype.addClass = function(sClass) {
				var e = this._element;
				if (this.hasClass(sClass))
					return this;
				e.className = (e.className + " " + sClass).replace(/^\s+/, "");
				return this;
			};
			$Element.prototype.removeClass = function(sClass) {
				var e = this._element;
				e.className = e.className.replace(
						new RegExp('(^|\\s)' + sClass + '(\\s|$)'), ' ')
						.replace(/\s+$/, '');
				return this;
			};
			$Element.prototype.toggleClass = function(sClass) {
				if (this.hasClass(sClass))
					this.removeClass(sClass);
				else
					this.addClass(sClass);
				return this;
			};
			$Element.prototype.html = function(sHTML) {
				if (typeof sHTML == "string") {
					this._element.innerHTML = sHTML;
					return this;
				}
				return this._element.innerHTML;
			};
			$Element.prototype.fireEvent = function(sEvent) {
				function IE(sEvent) {
					sEvent = (sEvent + "").toLowerCase();
					this._element.fireEvent("on" + sEvent);
					return this;
				}
				;
				function DOM2(sEvent) {
					var sType = "HTMLEvents";
					sEvent = (sEvent + "").toLowerCase();
					if (sEvent == "click" || sEvent.indexOf("mouse") == 0) {
						sType = "MouseEvents";
						if (sEvent == "mousewheel")
							sEvent = "dommousescroll";
					} else if (sEvent.indexOf("key") == 0) {
						sType = "KeyEvents";
					}
					var evt = document.createEvent(sType);
					evt.initEvent(sEvent, true, true);
					this._element.dispatchEvent(evt);
					return this;
				}
				;
				$Element.prototype.fireEvent = (typeof this._element.dispatchEvent != "undefined") ? DOM2
						: IE;
				return this.fireEvent(sEvent);
			};
			function $Fn(func, thisObject) {
				var cl = arguments.callee;
				if (func instanceof cl)
					return func;
				if (!(this instanceof cl))
					return new cl(func, thisObject);
				this._events = {};
				this._tmpElm = null;
				if (typeof func == "function") {
					this._func = func;
					this._this = thisObject;
				} else if (typeof func == "string"
						&& typeof thisObject == "string") {
					this._func = new Function(func, thisObject);
				}
			}
			$Fn.prototype.$value = function() {
				return this._func;
			}
			$Fn.prototype.bind = function() {
				var a = $A(arguments).$value();
				var f = this._func;
				var t = this._this;
				var b = function() {
					var args = $A(arguments).$value();
					if (a.length)
						args = a.concat(args);
					return f.apply(t, args);
				};
				return b;
			}
			$Fn.prototype.bindForEvent = function() {
				var a = arguments;
				var f = this._func;
				var t = this._this;
				var m = this._tmpElm || null;
				var b = function(e) {
					var args = $A(a);
					if (typeof e == "undefined")
						e = window.event;
					if (typeof e.currentTarget == "undefined") {
						e.currentTarget = m;
					}
					args.unshift($Event(e));
					return f.apply(t, args.$value());
				};
				return b;
			}
			$Fn.prototype.attach = function(oElement, sEvent) {
				var f;
				if ((oElement instanceof Array)
						|| ($A && (oElement instanceof $A) && (oElement = oElement
								.$value()))) {
					for ( var i = 0; i < oElement.length; i++) {
						this.attach(oElement[i], sEvent);
					}
					return this;
				}
				if ($Element && oElement instanceof $Element) {
					oElement = oElement.$value();
				}
				oElement = $(oElement);
				sEvent = sEvent.toLowerCase();
				this._tmpElm = oElement;
				f = this.bindForEvent();
				this._tmpElm = null;
				if (typeof oElement.attachEvent != "undefined") {
					oElement.attachEvent("on" + sEvent, f);
				} else {
					if (sEvent == "mousewheel")
						sEvent = "DOMMouseScroll";
					if (sEvent == "DOMMouseScroll"
							&& navigator.userAgent.indexOf("WebKit") > 0) {
						var events = "__jindo_wheel_events";
						if (typeof oElement[events] == "undefined")
							oElement[events] = new Array;
						if (typeof oElement.onmousewheel == "object") {
							oElement.onmousewheel = function(evt) {
								if (!this[events])
									return;
								for ( var i = 0; i < this[events].length; i++) {
									this[events][i](evt);
								}
							}
						}
						oElement[events][oElement[events].length] = f;
					} else {
						oElement.addEventListener(sEvent, f, false);
					}
				}
				var key = "$" + $Fn.gc.count++;
				var inf = {
					element :oElement,
					event :sEvent,
					func :f
				};
				$Fn.gc.pool[key] = this._events[key] = inf;
				return this;
			}
			$Fn.prototype.detach = function(oElement, sEvent) {
				if ((oElement instanceof Array)
						|| ($A && (oElement instanceof $A) && (oElement = oElement
								.$value()))) {
					for ( var i = 0; i < oElement.length; i++) {
						this.detach(oElement[i], sEvent);
					}
					return this;
				}
				if ($Element && oElement instanceof $Element) {
					oElement = oElement.$value();
				}
				oElement = $(oElement);
				sEvent = sEvent.toLowerCase();
				var e = this._events;
				var f = null;
				for ( var key in e) {
					try {
						if (e[key].element !== oElement
								|| e[key].event !== sEvent)
							continue;
						f = e[key].func;
						delete e[key];
						delete $Fn.gc.pool[key];
						break;
					} catch (e) {
					}
				}
				if (typeof oElement.detachEvent != "undefined") {
					oElement.detachEvent("on" + sEvent, f);
				} else {
					if (sEvent.toLowerCase() == "mousewheel")
						sEvent = "DOMMouseScroll";
					if (sEvent == "DOMMouseScroll"
							&& navigator.userAgent.indexOf("WebKit") > 0) {
						var events = "__jindo_wheel_events", found = false;
						if (!oElement[events])
							return;
						for ( var i = 0; i < oElement[events].length; i++) {
							if (oElement[events][i] == f) {
								found = true;
							} else if (found) {
								oElement[events][i - 1] = oElement[events][i];
							}
						}
						if (oElement[events].length)
							oElement[events].length--;
					} else {
						oElement.removeEventListener(sEvent, f, false);
					}
				}
				return this;
			}
			$Fn.gc = function() {
				var p = $Fn.gc.pool;
				for ( var key in p) {
					try {
						$Fn(p[key].func).detach(p[key].element, p[key].event)
					} catch (e) {
					}
					;
				}
			}
			$Fn.gc.count = 0;
			$Fn.gc.pool = new Array;
			if (typeof window != "undefined") {
				$Fn($Fn.gc).attach(window, "unload");
			}
			;
			function $Event(e) {
				var cl = arguments.callee;
				if (e instanceof cl)
					return e;
				if (!(this instanceof cl))
					return new cl(e);
				if (typeof e == "undefined") {
					e = (!document.createEventObject) ? window.event : document
							.createEventObject(window.event);
				}
				this._event = e;
				this.type = e.type.toLowerCase();
				if (this.type == "dommousescroll") {
					this.type = "mousewheel";
				}
				this.canceled = false;
				this.element = e.target || e.srcElement;
				this.currentElement = e.currentTarget;
				this.relatedElement = null;
				if (typeof e.relatedTarget != "undefined") {
					this.relatedElement = e.relatedTarget;
				} else if (e.fromElement && e.toElement) {
					this.relatedElement = e[(this.type == "mouseout") ? "toElement"
							: "fromElement"];
				}
			}
			$Event.prototype.mouse = function() {
				var e = this._event;
				var delta = 0;
				var left = (e.which && e.button == 0) || !!(e.button & 1);
				var mid = (e.which && e.button == 1) || !!(e.button & 4);
				var right = (e.which && e.button == 2) || !!(e.button & 2);
				if (e.wheelDelta) {
					delta = e.wheelDelta / 120;
				} else if (e.detail) {
					delta = -e.detail / 3;
				}
				return {
					delta :delta,
					left :left,
					middle :mid,
					right :right
				};
			}
			$Event.prototype.key = function() {
				var e = this._event;
				var k = e.keyCode;
				return {
					keyCode :k,
					alt :e.altKey,
					ctrl :e.ctrlKey,
					meta :e.metaKey,
					shift :e.shiftKey,
					up :(k == 38),
					down :(k == 40),
					left :(k == 37),
					right :(k == 39),
					enter :(k == 13)
				}
			}
			$Event.prototype.pos = function() {
				var e = this._event;
				var b = document.body;
				var de = document.documentElement;
				var pos = [ b.scrollLeft || de.scrollLeft,
						b.scrollTop || de.scrollTop ];
				return {
					clientX :e.clientX,
					clientY :e.clientY,
					pageX :e.pageX || e.clientX + pos[0] - b.clientLeft,
					pageY :e.pageY || e.clientY + pos[1] - b.clientTop,
					layerX :e.offsetX || e.layerX - 1,
					layerY :e.offsetY || e.layerY - 1
				};
			}
			$Event.prototype.stop = function() {
				this.canceled = true;
				if (typeof this._event.preventDefault != "undefined")
					this._event.preventDefault();
				if (typeof this._event.stopPropagation != "undefined")
					this._event.stopPropagation();
				this._event.returnValue = false;
				this._event.cancelBubble = true;
				return this;
			}
			function $Agent() {
				var cl = arguments.callee;
				var cached = cl._cached;
				if (cl._cached)
					return cl._cached;
				if (!(this instanceof cl))
					return new cl;
				if (typeof cl._cached == "undefined")
					cl._cached = this;
			}
			;
			$Agent.prototype.navigator = function() {
				var info = new Object;
				var ver = -1;
				var u = navigator.userAgent;
				var v = navigator.vendor || "";
				function f(s, h) {
					return ((h || "").indexOf(s) > -1)
				}
				;
				info.opera = (typeof window.opera != "undefined")
						|| f("Opera", u);
				info.ie = !info.opera && f("MSIE", u);
				info.safari = f("Apple", v);
				info.mozilla = f("Gecko", u) && !info.safari;
				info.firefox = f("Firefox", u);
				info.camino = f("Camino", v);
				info.netscape = f("Netscape", u);
				info.omniweb = f("OmniWeb", u);
				info.icab = f("iCab", v);
				info.konqueror = f("KDE", v);
				try {
					if (info.ie) {
						ver = u.match(/(?:MSIE) ([0-9.]+)/)[1];
					} else if (info.firefox || info.opera || info.omniweb) {
						ver = u.match(/(?:Firefox|Opera|OmniWeb)\/([0-9.]+)/)[1];
					} else if (info.mozilla) {
						ver = u.match(/rv:([0-9.]+)/)[1];
					} else if (info.safari) {
						ver = parseFloat(u.match(/Safari\/([0-9.]+)/)[1]);
						if (ver == 100) {
							ver = 1.1;
						} else {
							ver = [ 1.0, 1.2, -1, 1.3, 2.0, 3.0 ][Math
									.floor(ver / 100)];
						}
					} else if (info.icab) {
						ver = u.match(/iCab[ \/]([0-9.]+)/)[1];
					}
					info.version = parseFloat(ver);
					if (isNaN(info.version))
						info.version = -1;
				} catch (e) {
					info.version = -1;
				}
				$Agent.prototype.navigator = function() {
					return info;
				}
				return info;
			}
			$Agent.prototype.os = function() {
				var info = new Object;
				var u = navigator.userAgent;
				var p = navigator.platform;
				var f = function(s, h) {
					return (h.indexOf(s) > -1)
				};
				info.win = f("Win", p);
				info.mac = f("Mac", p);
				info.linux = f("Linux", p);
				info.win2000 = info.win && (f("NT 5.0", p) || f("2000", p));
				info.winxp = info.win && (f("NT 5.1", p) || f("Win32", p));
				info.xpsp2 = info.winxp && (f("SV1", u) || f("MSIE 7", u));
				info.vista = f("NT 6.0", p);
				$Agent.prototype.os = function() {
					return info;
				}
				return info;
			}
			$Agent.prototype.flash = function() {
				var info = new Object;
				var p = navigator.plugins;
				var m = navigator.mimeTypes;
				var f = null;
				info.installed = false;
				info.version = -1;
				if (typeof p != "undefined" && p.length) {
					f = p["Shockwave Flash"];
					if (f) {
						info.installed = true;
						if (f.description) {
							info.version = parseFloat(f.description
									.match(/[0-9.]+/)[0]);
						}
					}
					if (p["Shockwave Flash 2.0"]) {
						info.installed = true;
						info.version = 2;
					}
				} else if (typeof m != "undefined" && m.length) {
					f = m["application/x-shockwave-flash"];
					info.installed = (f && f.enabledPlugin);
				} else {
					for ( var i = 9; i > 1; i--) {
						try {
							f = new ActiveXObject(
									"ShockwaveFlash.ShockwaveFlash." + i);
							info.installed = true;
							info.version = i;
							break;
						} catch (e) {
						}
					}
				}
				$Agent.prototype.info = function() {
					return info;
				}
				return info;
			}
			$Agent.prototype.silverlight = function() {
				var info = new Object;
				var p = navigator.plugins;
				var s = null;
				info.installed = false;
				info.version = -1;
				if (typeof p != "undefined" && p.length) {
					s = p["Silverlight Plug-In"];
					if (s) {
						info.installed = true;
					}
				} else {
					try {
						s = new ActiveXObject("AgControl.AgControl");
						info.installed = true;
					} catch (e) {
					}
				}
				$Agent.prototype.silverlight = function() {
					return info;
				}
				return info;
			}
			nhn.Component = $Class( {
				_eventHandlers :null,
				_options :null,
				$init : function() {
					var ins = this.constructor._instances;
					if (typeof ins == "undefined") {
						this.constructor._instances = ins = [];
					}
					ins[ins.length] = this;
					this._eventHandlers = {};
					this._options = {};
				},
				option : function(sName, sValue) {
					var nameType = (typeof sName);
					if (nameType == "undefined") {
						return this._options;
					} else if (nameType == "string") {
						if (typeof sValue != "undefined") {
							this._options[sName] = sValue;
							return this;
						} else {
							return this._options[sName];
						}
					} else if (nameType == "object") {
						try {
							for ( var x in sName) {
								this._options[x] = sName[x];
							}
						} catch (e) {
						}
						return this;
					}
				},
				fireEvent : function(sEvent, oEvent) {
					var oEvent = oEvent ? (oEvent instanceof $Event ? oEvent._event
							: oEvent)
							: {};
					var isRealEvent = ('boundElements' in oEvent && 'cancelBubble' in oEvent)
							|| ('initEvent' in oEvent)
							|| (typeof Event != 'undefined' && oEvent.constructor === Event);
					if (isRealEvent) {
						oEvent = $Event(oEvent);
					} else {
						oEvent.type = oEvent.type || sEvent;
						oEvent.canceled = false;
						oEvent.stop = function() {
							this.canceled = true;
						};
					}
					var aArg = [ oEvent ];
					for ( var i = 2, len = arguments.length; i < len; i++)
						aArg.push(arguments[i]);
					var inlineHandler = this['on' + sEvent];
					if (typeof inlineHandler == 'function')
						inlineHandler.apply(this, aArg);
					var handlerList = this._eventHandlers[sEvent];
					if (typeof handlerList != 'undefined') {
						for ( var i = 0, handler; handler = handlerList[i]; i++)
							handler.apply(this, aArg);
					}
					return !oEvent.canceled;
				},
				attach : function(sEvent, fpHandler) {
					if (arguments.length == 1) {
						$H(arguments[0]).forEach(
								$Fn( function(fpHandler, sEvent) {
									this.attach(sEvent, fpHandler);
								}, this).bind());
						return this;
					}
					var handlers = this._eventHandlers[sEvent];
					if (typeof handlers == 'undefined')
						handlers = this._eventHandlers[sEvent] = [];
					handlers.push(fpHandler);
					return this;
				},
				detach : function(sEvent, fpHandler) {
					if (arguments.length == 1) {
						$H(arguments[0]).forEach(
								$Fn( function(fpHandler, sEvent) {
									this.detach(sEvent, fpHandler);
								}, 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 === fpHandler) {
							handlers = handlers.splice(i, 1);
							break;
						}
					}
					return this;
				}
			});
			nhn.Component.factory = function(objs, opt) {
				var retArr = [];
				if (typeof opt == "undefined")
					opt = {};
				for ( var i = 0; i < objs.length; i++) {
					try {
						obj = new this(objs[i], opt);
						retArr[retArr.length] = obj;
					} catch (e) {
					}
				}
				return retArr;
			};
			nhn.HTMLComponent = $Class( {
				tagName :""
			}).extend(nhn.Component);
			nhn.HTMLComponent.paint = function() {
				var ins = this._instances;
				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(objs, opt) {
				if (typeof objs == "string") {
					var sClassName = objs;
					if (/^(\w+)\s*(?:\[(\w+)\s*=\s*(\w+)\])?$/
							.test(this.prototype.tagName)) {
						var a = [];
						objs = document.getElementsByTagName(RegExp.$1);
						if (RegExp.$2 && RegExp.$3) {
							for ( var i = 0; i < objs.length; i++) {
								if (objs[i].getAttribute(RegExp.$2) == RegExp.$3)
									a[a.length] = objs[i];
							}
							objs = a;
						}
						if (sClassName) {
							var regex = new RegExp("\\b" + sClassName + "\\b",
									"i");
							for ( var i = 0, a = []; i < objs.length; i++) {
								if (regex.test(objs[i].className)) {
									a[a.length] = objs[i];
								}
							}
							objs = a;
						}
					} else {
						return [];
					}
				}
				this._tmpFactory = nhn.Component.factory;
				var objs = this._tmpFactory(objs, opt);
				delete this._tmpFactory;
			};
			eval(namespace.exports('$', '$Element', '$Agent', '$Class', '$Fn'));
		});