window.daum = {};
/**
 * @namespace JIGU의 기본 namespace daum
 */
daum = {
    /**
     * @ignore
     */
    documentLoaded : false,
	/**
     * @param {Object} dest - 대상객체
     * @param {Object} source - 원본객체
     * @param {Boolean} overwrite - 대상객체에 원본객체의 멤버를 덮어 쓸것인지를 결정
     * @default Boolean true
     */
	extend : function(dest, source, overwrite){
		var ow = true; if(overwrite != undefined) ow = overwrite;

		for(var p in source) if(!dest[p] || ow){
			dest[p] = source[p];
		}

		return dest;
	},
	/**
	 * descrptrion
	 *
	 * @param
	 * @type Object dest - 목적객체
	 * @param {Object} source - 대상객체
	 * @param {Boolean} overwrite - 덮어쓸지를 결정
	 * @return object
	 */
	extendMethods : function(dest, source, overwrite){
		var ow = true; if(overwrite != undefined) ow = overwrite;

		for(var p in source) if(!dest[p] || ow){
			if(typeof(source[p]) == "function") dest[p] = daum.methodize(source[p]);
		}

		return dest;
	},

	/**
	 */
	Object : {
		toJSON : function(_obj){
			var ret = new String.Buffer("{");

			for(var p in _obj){
				var _type = typeof(_obj[p]);

				ret.append("\"" + p + "\": ");

				if(_type == "object"){
					ret.append(daum.Object.toJSON(_obj[p]));
				}else if(_type == "function"){
					ret.append(daum.String.removeCR(_obj[p].toString()));
				}else{
					if(_type == "number"){
						ret.append(_obj[p]);
					}else{
						ret.append("\"" + _obj[p] + "\"");
					}
				}
				ret.append(", ");
			}
			ret.removeLast();
			ret.append("}");

			return ret.evaluate();
		}
	},

    Function : {
		bind : function(f){
			var __method = f, args = daum.$A(arguments); args.shift();
			var object = args.shift();
			var binded = function(){
				return __method.apply(object, args.concat(daum.$A(arguments)));
			}
			binded.__Binded = true;
			return binded;
		},
		bindAsEventListener : function(f){
			var __method = f, args = daum.$A(arguments); args.shift();
			var object = args.shift();
			var binded = function(e){
				return __method.apply(object, [e || window.event].concat(args));
			}
			binded.__Binded = true;
			return binded;
		},

		timeout : function(f, ms, _object){
			var func = (_object) ? daum.Function.bind(f, _object) : f;
			return window.setTimeout(func, ms);
		},

		interval : function(f, ms, _object){
			var func = (_object) ? daum.Function.bind(f, _object) : f;
			return window.setInterval(func, ms);
		},
		callBack : function(f){
			var that = f, args = daum.$A(arguments);
			args.shift(); var func = args.shift();

			return function(){
				args = args.concat(daum.$A(arguments));

				var ret = that.apply(null, args);
				func.apply(null, args);

				return ret;
			}
		},
		callFore : function(f){
			var that = f, args = daum.$A(arguments);
			args.shift(); var func = args.shift();

			return function(){
				args = args.concat(daum.$A(arguments));

				func(args);
				return that(args);
			}
		},

		inherit : function(f, _parent_, /*optional*/_members){
			if(typeof _parent_ !== "function") return f;

			var superclass = function(){};
			superclass.prototype = _parent_.prototype;
			f.prototype = new superclass();
			f.prototype.constructor = f;

			f._parent = _parent_;
			var constructorStr = _parent_.toString();

			if(constructorStr.search(/\$super/) > -1){
				var parameter = constructorStr.match(/function\s?\((.+)\)/);
				var body = constructorStr.replace(/(^function.+(\s*)?\{|\}$)/g,'');
				var callSuperIdx = body.search(/this\.\$super/);
				var aboveCode = body.substr(0,callSuperIdx).trim();
				var belowCode = body.substring(callSuperIdx + body.match(/this\.\$super.+;/)[0].length).trim();

				if(parameter && parameter.length > 1){
					parameter = parameter[1].split(',');
				}else{
					parameter = [];
				}

				f.prototype.$super = function(){
					if(aboveCode){
						var func = daum.createFunction(parameter, aboveCode);
						func.apply(this,arguments);
					}

					_parent_.prototype.$super.apply(this,arguments);

					if(belowCode){
						var func = daum.createFunction(parameter, belowCode);
						func.apply(this,arguments);
					}
				}
			}else{
				f.prototype.$super = function(){
					return _parent_.apply(this, arguments);
				}
			}

			if(_members){
				daum.Function.members(f, _members);
			}

			return f;
		},
		clone : function(f, _parent_){
			if(typeof _parent_ !== "function") return f;

			var _proto = _parent_.prototype;

			for(var p in _proto){
				if(_proto[p]){
					if(typeof _proto[p] === "string" || typeof _proto[p] === "number" || typeof _proto[p] === "boolean"){
						var tmp = _proto[p];
						f.prototype[p] = tmp;
					}else if(_proto[p] instanceof Array){
						f.prototype[p] = daum.Array.copy(_proto[p]);
					}else{
						f.prototype[p] = _proto[p];
					}
				}
			}

			return f;
		},
		members : function(f, _members){
			for(var name in _members){
				f.prototype[name] = (typeof(_members[name]) == "function") ? (f._parent.prototype[name]) ? (function(name, fn){
					return function(){
						this.$super = function(){
							return f._parent.prototype[name].apply(this, arguments);
						}

						return fn.apply(this, arguments);
					}
				})(name, _members[name]) : (function(name, fn){
					return function(){
						this.$super = function(){};

						return fn.apply(this, arguments);
					}
				})(name, _members[name]) : _members[name];
			}

			return f;
		},
		method : function(f, name, impl){
			f.prototype[name] = (typeof(impl) == "function") ? (f._parent.prototype[name]) ? (function(name, fn){
				return function(){
					this.$super = function(){
						return f._parent.prototype[name].apply(this, arguments);
					}
					return fn.apply(this, arguments);
				}
			})(name, impl) : (function(name, fn){
				return function(){
					this.$super = function(){};

					return fn.apply(this, arguments);
				}
			})(name, impl) : impl;

			return f;
		}
    },//Function Native Extenstion

    createFunction : function(param, body){
		var statement = 'return function(';

		for(var i=0,loop=param.length; i<loop; i++){
			statement += '' + param[i] + ',';
		}

		statement = statement.replace(/,$/,'');
		statement = statement + '){' + body + '}';

		return (new Function(statement))();
	}, //Create New Function By Statement

    Array : {
		each : function(a, func){
			for(var i=0,len=a.length; i<len; i++){
				func(a[i]);
			}
		},
		copy : function(a){
			var clone = [];

			for(var i=0,len=a.length; i<len; i++){
				if (a[i].constructor == a.constructor){
					clone[i] = daum.Array.copy(a[i]);
				}else if(typeof(a[i]) == 'object'){
					if(typeof(a[i].valueOf()) == 'object'){
						clone[i] = a[i].constructor();
						for (var p in a[i]) clone[i][p] = a[i][p];
					}else{
						clone[i] = a[i].constructor(a[i].valueOf());
					}
				}else{
					clone[i] = a[i];
				}
			}

			return clone;
		},

		compact : function(a){
			var ret = [];
			for(var i=0,len=a.length; i<len; i++){
				if(!(a[i] == null || typeof(a[i]) == "undefined")) ret.push(a[i]);
			}

			return ret;
		},
		indexOf : function(a, _find){
			for(var i=a.length; i>-1; i--) if(a[i] === _find) return i;

			return -1;
		},
		size : function(a){
			return daum.Array.compact(a).length;
		},
		toJSON : function(a){
			var ret = new String.Buffer("[");

			for(var i=0,len=a.length; i<len; i++){
				var _type = typeof(a[i]);
				if(_type == "object"){
					if(a[i] instanceof Array){
						ret.append(daum.Array.toJSON(a[i]));
					}else{
						ret.append(daum.Object.toJSON(a[i]));
					}
				}else if(_type == "function"){
					ret.append(daum.String.removeCR(a[i].toString()));
				}else if(_type == "string"){
					ret.append("\"" + a[i] + "\"");
				}else if(_type == "number"){
					ret.append(a[i]);
				}
				ret.append(", ");
			}
			ret.removeLast();
			ret.append("]");

			return ret.evaluate();
		},
		uniq : function(a){
			var ret = [];
			for(var i=0,len=a.length; i<len; i++){
				if(daum.Array.indexOf(ret, a[i]) == -1) ret.push(a[i]);
			}

			return ret;
		},

		getFirst : function(a){
			return a[0];
		},

		getLast : function(a){
			return a[a.length-1];
		}
	}, //Array Native Extension

    Number : {
		px : function(n){
			return String(n) + "px";
		},
		fillZero : function(n, cipher){
			var cipher = cipher || 0;
			var ret = "" + n;
			if(cipher < ret.length) return ret;

			while(ret.length < cipher) ret = "0"+ret;

			return ret;
		},
		toInt : function(n, l){
			var l = l || 10;
			return parseInt(n, l);
		},
		toFloat : function(n, l){
			var l = l || 10;
			return parseFloat(n, l);
		}
    }, //Number Native Extenstion

	String : {
		px : function(s){
			s = String(s);
			return daum.String.endWith(s, "px") ? s : s + "px";
		},
		trim : function(s){
			return s.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
		},
		replaceAll : function(/* s, findstr, newstr */){
			if(navigator.userAgent.toLowerCase().indexOf("msie") != -1){
				return function(s, findstr, newstr){
					return s.replace(new RegExp(findstr, "gi"), newstr);
				}
			}else{
				return function(s, findstr, newstr){
					return s.split(findstr).join(newstr);
				}
			}
		}(),
		removeCR : function(s){
			var ret = s;
			return daum.String.replaceAll(daum.String.replaceAll(ret, "\n", " "), "\r", "");
		},

		toInt : function(s, l){
			var l = l || 10;
			return parseInt(s, l);
		},
		toFloat : function(s, l){
			var l = l || 10;
			return parseFloat(s, l);
		},
		empty : function(s){
			return (s.length == 0)
		},
		startWith : function(s, st){
			return s.substring(0, st.length) == st;
		},
		endWith : function(s, se){
			return s.substring(s.length - se.length) == se;
		},
		byteLength : function(s){
			var _byte = 0;
			for(var i=0,len=s.length;i<len;i++){
				var val = escape(s.charAt(i)).length;
				if(val>3) _byte++;
				_byte++;
			}

			return _byte;
		},

		cutString : function(s, limit, suffix){
			var suffix = suffix || "";
			var _limit = limit - suffix.length;
			var _byte = 0;
			var _str = new String.Buffer();
			for(var i=0,len=s.length;i<len;i++){
				if(_limit>0) _str.append(s.charAt(i));
				var val = escape(s.charAt(i)).length;
				if(val>3){ _byte++; _limit--; }
				_byte++; _limit--;
			}
			_str.append(suffix);

			return (limit >= _byte) ? s : _str.evaluate();
		},
		cutPixel : function(s, _px, suffix){
			if(!daum.documentLoaded) return false;

			var suffix = suffix || "";
			document.body.appendChild(daum.HTMLPrototype);
			daum.HTMLPrototype.innerHTML = suffix;
			var suffixLen = daum.HTMLPrototype.offsetWidth;
			_px -= suffixLen;
			daum.HTMLPrototype.innerHTML = "";
			var _str = new String.Buffer();
			for(var i=0,len=s.length;i<len;i++){
				daum.HTMLPrototype.innerHTML += s.charAt(i);
				if(_px > daum.HTMLPrototype.offsetWidth){
					_str.append(s.charAt(i));
				}else{
					_str.append(suffix);
					break;
				}
			}
			daum.HTMLFragment.appendChild(daum.HTMLPrototype);

			return _str.evaluate();
		},

		escape : function(s, flag){
			var s1=["&amp;","&#39;","&quot;","&lt;","&gt;"];
			var s2=["&","'","\"","<",">"];
			var s3 = [];
			var ret = s;
			if(flag) { s3=s1;s1=s2;s2=s3; }
			for(var i=0,len=s1.length;i<len;i++) ret = ret.replace(new RegExp(s1[i], "g"), s2[i]);

			return ret;
		},

		escapeHTML : function(s){
			return daum.String.escape(s, true);
		},

		toHTML : function(s){
			return daum.String.escape(s, false);
		},

		stripTag : function(s){
			return s.replace(/<\/?[^>]+>/g,'');
		}
	}, //String Native Extension

	//////////// Jigu Utilities
	loadedScripts : {},
	loadTimer : {},
	load : function(jsurl, onsuccess, options){
		if(daum.loadedScripts[jsurl]){ if(onsuccess) onsuccess(); return false; }

		var s = document.createElement("script");
		s.src = jsurl;
		s.type = "text/javascript";
		for(var p in options) if(options.hasOwnProperty(p)){
			s.setAttribute(p, options[p]);
		}

		daum.$T("head")[0].appendChild(s);

		if(!onsuccess) return false;

		s.onreadystatechange = function(){
			if(this.readyState == "loaded" || this.readyState == "complete"){
				if(!daum.loadedScripts[jsurl]){
					daum.loadedScripts[jsurl] = true;
					onsuccess();
				}
			}
			return;
		}
		s.onload = function(){
			if(!daum.loadedScripts[jsurl]){
				daum.loadedScripts[jsurl] = true;
				onsuccess();
			}
			return;
		}
		if(daum.Browser.sf || daum.Browser.op){
			daum.loadTimer[jsurl] = window.setInterval(function(){
				if(/loaded|complete/.test(document.readyState)){
					window.clearInterval(daum.loadTimer[jsurl]);
					if(!daum.loadedScripts[jsurl]) onsuccess();
				}
			}, 10);
		}
	},

    $A : function(unarray){
		if(!unarray) return [];
		if(unarray instanceof Array) return unarray;

		var ret = [];
		for(var i=0,len=unarray.length; i<len; i++){
			ret.push(unarray[i]);
		}

		return ret;
    },

    $ : function(obj){
		return (obj) ? ((typeof(obj) == "string") ? document.getElementById(obj) : obj) : null;
	},

	$T : function(tagName,node){
		node = node || document;
		return node.getElementsByTagName(tagName);
	},

	$C : function(e, _cname){
		var e = daum.$(e);
		return daum.Element.getElementsByClassName(e, _cname);
	},

	$E : function(obj){
		var e = daum.$(obj);
		if(e) daum.extendMethods(e, daum.Element, false);

		return e;
	},

	urlParameter : function(){
		var r={}, t=[];
		var a=location.search.substr(1).split('&');
		for(i=0;i<a.length;i++){t=a[i].split("=");r[t[0]] = t[1];}

		return r;
	}(),

	getParam : function(_name){
		return this.urlParameter[_name] || null;
	},

	random : function(min, max){
		return Math.floor(Math.random() * (max - min + 1) + min);
	},

	return_false : function(){ return false; },

	activeX : function(/*obj,div, htmltext*/){
		var seq = 0;

		return function(obj, div, htmltext){
			var htmltext = htmltext || false;
			var idx = seq++, buffer = new String.Buffer("<object ");
			//, add = function(str){ buffer.append(str); };
			var add = buffer.append.bind(buffer);

			add('id="'); if(obj.id) add(obj.id+'" '); else add('daumActiveX'+idx+'" ');
			add('name="'); if(obj.name) add(obj.name+'" '); else add('daumActiveX'+idx+'" ');

			if(obj.type) add('type="'+obj.type+'" ');
			if(obj.classid) add('classid="'+obj.classid+'" ');
			if(obj.width) add('width="'+obj.width+'" ');
			if(obj.height) add('height="'+obj.height+'" ');
			if(obj.codebase) add('codebase="'+obj.codebase+'" ');
			add('>\r\n');

			var params = obj.param;
			for(var pname in params) if(params.hasOwnProperty(pname)) add('<param name="'+pname+'" value="'+params[pname]+'" \/>\r\n');

			add('<embed '); add('id="');
			if(obj.id) add(obj.id+'" '); else add('daumActiveX'+idx+'" ');

			add('name="'); if(obj.name) add(obj.name+'" '); else add('daumActiveX'+idx+'" ');

			if(obj.type) add('type="'+obj.type+'" ');
			if(obj.width) add('width="'+obj.width+'" ');
			if(obj.height) add('height="'+obj.height+'" ');

			var useflashvar = false, src = null;
			for(var pname in params) if(params.hasOwnProperty(pname)){
				var param_name = pname.toLowerCase();
				if(param_name){
					if(param_name == "movie" || param_name == "src") src = params[pname];
					if(param_name != "flashvars") add(param_name+'="'+params[pname]+'" '); else useflashvar = params[pname];
				}
			}
			add(' \/>\r\n<\/object>\r\n');
			add = null;
			var html = buffer.evaluate();
			if(!!useflashvar && !!src) html = html.replace('src="'+src+'"', 'src="'+src+'?'+useflashvar+'"');

			if(!htmltext){
				var _panel = daum.$(div);
				if(daum.Browser.ie || obj.type=='application/x-shockwave-flash' || obj.classid.toLowerCase()=='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' || (daum.Browser.win && obj.classid.toLowerCase()=='clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95')){
					if(!htmltext) _panel.innerHTML = html;
				}

				var activeObject = daum.Element.getFirstChild(_panel);

				return (daum.Browser.ie) ? activeObject : activeObject.getElementsByTagName("embed")[0];
			}else{
				return html;
			}
		}
	}(),

	showFlash : function(src, width, height, div, _options){
		var options = {quality : "high", wmode : "transparent", bgcolor : "#FFFFFF", pluginspace : "http://www.macromedia.com/go/getflashplayer",allowScriptAccess : "always", allowFullScreen : "true", htmltext : false };
		daum.extend(options, _options || {});
		var obj = {
			"type" : 'application/x-shockwave-flash',
			"classid" : 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000',
			"codebase" : 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0',
			"wmode" : 'transparent',
			"width" : width,
			"height" : height,
			"param" : { "movie" : src, "src" : src }
		};
		daum.extend(obj.param, options);

		if(location.toString().indexOf("https://") != -1) obj.codebase = obj.codebase.replace("http://", "https://");

		return daum.activeX(obj,div, options.htmltext);
	},

	methodize : function(method){
		return function(){
			return method.apply(null, [this].concat(daum.$A(arguments)));
		}
	},

	nativeExtend : function(){
		var natives = [[daum.Object, Object], [daum.String, String.prototype], [daum.Number, Number.prototype], [daum.Array, Array.prototype], [daum.Function, Function.prototype]];
		Array.prototype.isArray = true; Number.prototype.isNumber = true; String.prototype.isString = true; Function.prototype.isFunction = true;

		for(var i=0,len=natives.length; i<len; i++){
			daum.extendMethods(natives[i][1], natives[i][0], false);
		}
	}
};
daum.useHTMLPrototype = function(){
	daum.HTMLFragment = (document.createDocumentFragment) ? document.createDocumentFragment() : document.createElement("div");

	daum.HTMLPrototype = document.createElement("div");
	daum.HTML_Stack = document.createElement("div");

	daum.HTMLPrototype.id = "daum_html_prototype";
	daum.HTML_Stack.id = "daum_html_stack";

	daum.HTMLFragment.appendChild(daum.HTMLPrototype);
	daum.HTMLFragment.appendChild(daum.HTML_Stack);

	daum.HTMLPrototype.style.position = daum.HTML_Stack.style.position = "absolute";
	daum.HTMLPrototype.style.left = daum.HTML_Stack.style.left = daum.HTMLPrototype.style.top = daum.HTML_Stack.style.top = "-10000px";

	return true;
}();

//String Buffer
String.Buffer = function(){
	this.buffer = [];
	this.bufferLength = 0;
	this.append.apply(this, arguments);
};
String.Buffer.prototype = {
	append : function(){
		this.bufferLength = this.buffer.push.apply(this.buffer, arguments);
		return this;
	},

	removeLast : function(){
		this.buffer.splice(this.bufferLength - 1, 1);
	},

	evaluate : function(d){
		return this.buffer.join(d || "");
	},

	toString : function(d){
		return this.evaluate(d);
	}
};

/* Event */
daum.Event = {
	observer : [],
	crossEvent : function(/*src, type, handler, isCapture*/){
		var methods = {};

		if(!!document.addEventListener){
			methods.add = function(src, type, handler, isCapture){
				if(type.toLowerCase()=="mousewheel") type="DOMMouseScroll";
				src.addEventListener(type, handler, isCapture || false);
			}
			methods.remove = function(src, type, handler, isCapture){
				if(type.toLowerCase()=="mousewheel") type="DOMMouseScroll";
				src.removeEventListener(type , handler, isCapture || false);
			}
		}else{
			methods.add = function(src, type, handler){
				if(type.toLowerCase()=="dommousescroll") type="mousewheel";
				//if(!handler.__Binded) handler = daum.Function.bindAsEventListener(handler, src);
				src.attachEvent("on"+type, handler);
			}
			methods.remove = function(src, type, handler){
				if(type.toLowerCase()=="dommousescroll") type="mousewheel";
				src.detachEvent("on"+type, handler);
			}
		}

		return methods;
	}(),
	bindedHandlerRegister: [],
	getBindedHandler: function(src, fn){
		var register = daum.Event.bindedHandlerRegister;
		var index = -1;
		for(var i = 0, loop = register.length; i < loop; i++){
			if(register[i].src === src && register[i].handler === fn){
				index = i;
				break;
			}
		}
		if(index >= 0){
			return register[index].bindedHandler;
		}else{
			var bindedHandler = daum.Function.bindAsEventListener(fn, src);
			register.push({ "src": src, "handler": fn, "bindedHandler": bindedHandler });
			return bindedHandler;
		}
	},
	addEvent : function(src, type, handler, isCapture){
		var src = daum.$(src);
		var observer = {"src" : src, "type" : type, "handler" : handler};

		if(!handler.__Binded){
			handler = daum.Event.getBindedHandler(src, handler);
			observer.handler = handler;
		}

		var flag = false;
		var asserted_index = -1;
		//for(var i=0,len=this.observer.length; i<len; i++){
		for(var i=this.observer.length-1; i>=0; i--){
			if(this.observer[i].src === observer.src && this.observer[i].type === observer.type && this.observer[i].handler === observer.handler){
				asserted_index = i;
				break;
			}
		}
		if(asserted_index != -1) return this.observer[asserted_index];

		asserted_index = this.observer.push(observer) - 1;
		this.crossEvent.add(src, type, handler, isCapture || false);

		return this.observer[asserted_index];
	},
	removeEvent : function(src, type, handler, isCapture){
		var src = daum.$(src);

		if(!handler.__Binded){
			handler = daum.Event.getBindedHandler(src, handler);
		}

		this.crossEvent.remove(src, type, handler, isCapture || false);

		for(var i=0,len=this.observer.length; i<len; i++){
			if(this.observer[i].src == src && this.observer[i].type == type && this.observer[i].handler === handler){
				this.observer.splice(i, 1);
				break;
			}
		}
	},

	stopObserving : function(observer){
		if(observer) this.removeEvent(observer.src, observer.type, observer.handler);
	},

	stopEvent : function(e){
		var e = e || window.event;
		e.cancelBubble = true;
		if(e.stopPropagation) e.stopPropagation();
		return false;
	},

	preventDefault : function(e){
		var e = e || window.event;
		e.returnValue = false;
		if(e.preventDefault) e.preventDefault();
		return false;
	},

	getWheel : function(e){
		var e = e || window.event;
		var delta=0;
		if(e.wheelDelta) delta=e.wheelDelta/120;
		else if(e.detail) delta=-e.detail/3;
		return delta;
	},
	getMouseButton : function(e){
		var e = e || window.event;
		var bcode = e.button;

		return {
			left : (daum.Browser.ie) ? bcode == 1 : bcode == 0,
			middle : (daum.Browser.ie) ? bcode == 4 : bcode == 1,
			right : bcode == 2
		}
	},
	getElement : function(e){
		var e = e || window.event;
		return e.srcElement || e.target;
	},
	GC : function(){
		for(var i=this.observer.length-1; i>-1; i--){
			var found = false;
	  		var element = this.observer[i].src;
	  		if(daum.Browser.ie){
	  			if(element && element["ownerDocument"]){
	  				try{
	  					if(!this.observer[i].src["offsetParent"]){
	  						found = true;
	  					}
	  				}catch(e){
	  					found = true;
	  				}
	  			}
	  		}else if(element && element.ownerDocument){
				if(!this.observer[i].src.offsetParent){
					var isBodyElement = false;
					do{
						if(element == document.body){
							isBodyElement = true;
							break;
						}
					}while(element = element.parentNode)

					if(!isBodyElement) found = true;
				}
	  		}
	    	if(found) this.stopObserving(this.observer[i]);
	   	}
	}
}//daum.Event

daum.Browser = {
	ua : navigator.userAgent.toLowerCase(),
	offset : { width : 0, height:0 },
	init : function(){
		this.ie = this.ua.indexOf("msie") != -1;
		this.ie_sv1 = this.ua.indexOf("sv1") != -1;
		this.ie_sv2 = this.ua.indexOf("sv2") != -1;
		this.ie6 = this.ua.indexOf("msie 6") != -1;
		this.ie7 = this.ua.indexOf("msie 7") != -1;
		this.ie8 = this.ua.indexOf("msie 8") != -1;
		this.ff = this.ua.indexOf("firefox") != -1 && this.ua.indexOf("navigator") == -1;
		this.ff2 = this.ff && this.ua.indexOf("firefox/2.") != -1;
		this.ff3 = this.ff && this.ua.indexOf("firefox/3.") != -1;
		this.sf = this.ua.indexOf("safari") != -1;
		this.op = this.ua.indexOf("opera") != -1;
		this.cr = this.ua.indexOf("chrome/") != -1;
		this.ns = this.ua.indexOf("netscape") != -1 || (this.ua.indexOf("firefox") != -1 && this.ua.indexOf("navigator") != -1);
		this.gecko = this.ua.indexOf("gecko") != -1;
		this.infopath = this.ua.indexOf("infopath") != -1;
		this.etc = this.gecko && this.ff && this.ns;

		this.win = this.ua.indexOf("win") != -1;
			this.vista = this.ua.indexOf("nt 6") != -1; this.xp = this.ua.indexOf("nt 5.1") != -1; this.w2k = this.ua.indexOf("nt 5.0") != -1; this.w98 = this.ua.indexOf("windows 98") != -1;
		this.mac = this.ua.indexOf("mac") != -1;
		this.unix = !(this.win || this.mac);

		this.versioning();
		this.setOffset();

		return;
	},

	versioning : function(){
		if(this.ie){
			if(this.ie8) this.ie7 = this.ie6 = this.ie_sv2 = this.ie_sv1 = false;
			if(this.ie7) this.ie6 = this.ie_sv2 = this.ie_sv1 = false;
		}
		if(this.ff) if(this.ff3) this.ff2 = false;

		if(this.sf && this.cr) this.sf = false;
	},

	setOffset : function(){
		if(this.ie_sv1)	{ this.offset.width = 10; this.offset.height = (this.infopath) ? 58 : 29; }
		else if(this.ie7) { this.offset.width = 10; this.offset.height = 81; }
		else if(this.etc) { this.offset.width = (this.mac) ? 0 : 6; this.offset.height = (this.mac) ? 68 : 54; }
		else if(this.ff2) { this.offset.width = (this.mac) ? 0 : 6; this.offset.height = (this.mac) ? 18 : (this.infopath) ? 54 : 49; }
		else if(this.ff3) { this.offset.width = (this.mac) ? 0 : 8; this.offset.height = (this.mac) ? 68 : (this.infopath) ? 85 : 75; }
		else if(this.sf) { this.offset.width = (this.mac) ? 0 : 4; this.offset.height = (this.mac) ? 23 : 27; }
		else if(this.ns) { this.offset.width = (this.mac) ? 0 : 6; this.offset.height = (this.mac) ? 18 : 54; }
		else if(this.op) { this.offset.width = (this.mac) ? 0 : 9; this.offset.height = (this.mac) ? 36 : 49; }
	},

	resizePop : function(w, h){
		if(typeof(w) == "object") var h = w.offsetHeight, w = w.offsetWidth;

		w += this.offset.width;
		h += this.offset.height;

		window.resizeTo(w, h);
	},

	getWindowSize : function(){
		var w = (window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth || 1003) - 2;
		var h = (window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight || 650) - 2;

		return { "width" : w, "height" : h }
	},

	popup : function(url, w, h, _options){
		var options = {
			"name" : "daumPopup",
			"scroll" : false,
			"resize" : false,
			"status" : false
		}
		daum.extend(options, _options || {}, true);

		return window.open(url,options.name,"width="+w+",height="+h+",status="+options.status+",resizable="+options.resize+",scrollbars="+options.scroll);
	},

	setCookie : function(name,value,expires){
		var d = new Date();	var day="";
		if(expires){
			d.setDate(d.getDate()+expires);
			day = "expires="+d.toGMTString()+";";
		}
		document.cookie = name+"="+escape(value)+"; path=/;"+day;
	},

	getCookie : function(name){
		name += "=";
		cookie = document.cookie + ";";
		start = cookie.indexOf(name);
		if (start != -1){
			end = cookie.indexOf(";",start);
			return unescape(cookie.substring(start + name.length, end));
		}
		return;
	},

	delCookie : function(name){
		document.cookie = name + "=;expires=Fri, 31 Dec 1987 23:59:59 GMT;";
	}
}; //daum.Broswer
daum.Browser.init();
daum.Template = function(template){
	this.template = template;
};
daum.Template.prototype = {
	evaluate : function(data){
		var result = this.template;
		for(var p in data) if(data.hasOwnProperty(p)){
			result = daum.String.replaceAll(result, "#{"+p+"}", data[p]);
		}

		return result;
	},

	toElement : function(data){
		daum.HTMLPrototype.innerHTML = this.evaluate(data);

		var element = daum.Element.getFirstChild(daum.HTMLPrototype);

		daum.HTML_Stack.appendChild(element);

		return element;
	}
};
daum.Element = {
	getElementsByClassName : function(e, cname){
		var nodes = daum.$(e).getElementsByTagName("*");
		var element = [];
		for(var i=0,len=nodes.length; i<len; i++){
			if(daum.Element.hasClassName(nodes[i], cname)) element.push(nodes[i]);
		}
		return (element.length > 0) ? element : null;
	},

	getChildElements : function(element){
		var realNodes = [];

		if(element.hasChildNodes()){
			var cNodes = element.childNodes;

			for(var i=0,loop=cNodes.length; i<loop; i++){
				if(cNodes[i].nodeType == 1){
					realNodes.push(cNodes[i]);
				}
			}
		}

		return realNodes;
	},

	hasClassName : function(e, cname){
		return (e.className.indexOf(cname) != -1);
	},

	addClassName : function(e, cname){
		if(daum.Element.hasClassName(e, cname)) return;

		if(daum.String.trim(e.className) == ""){
			e.className = cname;
		}else{
			e.className += (" " + cname);
		}
	},

	removeClassName : function(e, cname){
		var _classNames = e.className;
		if(_classNames.length > 0) _classNames = daum.String.replaceAll(_classNames, cname, "");

		e.className = _classNames;
	},

	setLeft : function(e, _left){
		e.style.left = daum.String.px(_left);
	},

	setTop : function(e, _top){
		e.style.top = daum.String.px(_top);
	},

	setPosition : function(e, _left, _top){
		daum.Element.setTop(e, _top);
		daum.Element.setLeft(e, _left);
	},

	setWidth : function(e, _width){
		e.style.width = daum.String.px(_width);
	},

	setHeight : function(e, _height){
		e.style.height = daum.String.px(_height);
	},

	setSize : function(e, _width, _height){
		daum.Element.setWidth(e, _width);
		daum.Element.setHeight(e, _height);
	},

	setWidthByOffset : function(e, _offsetWidth){
		daum.Element.setWidth(e, daum.String.toInt(e.style.width) + _offsetWidth);
	},

	setHeightByOffset : function(e, _offsetHeight){
		daum.Element.setHeight(e, daum.String.toInt(e.style.height) + _offsetHeight);
	},

	setSizeByOffset : function(e, _offsetWidth, _offsetHeight){
		daum.Element.setWidthByOffset(e, _offsetWidth);
		daum.Element.setHeightByOffset(e, _offsetHeight);
	},

	setLeftByOffset : function(e, _offsetLeft){
		daum.Element.setLeft(e, daum.String.toInt(e.style.left) + _offsetLeft);
	},

	setTopByOffset : function(e, _offsetTop){
		daum.Element.setTop(e, daum.String.toInt(e.style.top) + _offsetTop);
	},

	setPositionByOffset : function(e, _offsetLeft, _offsetTop){
		daum.Element.setLeftByOffset(e, _offsetLeft);
		daum.Element.setTopByOffset(e, _offsetTop);
	},

	setStyle : function(e, cssProperty, cssValue){
		daum.$(e).style[cssProperty] = cssValue;
	},

	getStyle : function(e, cssProperty, mozCssProperty){
   		var mozCssProperty = mozCssProperty || cssProperty

   		return (e.currentStyle) ? e.currentStyle[cssProperty] : document.defaultView.getComputedStyle(e, null).getPropertyValue(mozCssProperty);
	},

	getNext : function(e){
		var next = e.nextSibling;
		while(next && next.nodeType != 1) next = next.nextSibling;

		return next;
	},

	getPrev : function(e){
		var prev = e.previousSibling;
		while(prev && prev.nodeType != 1) prev = prev.previousSibling;

		return prev;
	},

	getParent : function(e){
		return e.parentNode;
	},

	getFirstChild : function(e){
		var fchild = e.firstChild;
		while(fchild && fchild.nodeType != 1) fchild = fchild.nextSibling;

		return fchild;
	},

	getLastChild: function(e){
		var lchild = e.lastChild;
		while(lchild && lchild.nodeType !=1) lchild = lchild.previousSibling;

		return lchild;
	},

	getCoords : function(e, useOffset){
		var useOffset = useOffset || false;
		var element = daum.$(e);
		var w = element.offsetWidth;
		var h = element.offsetHeight;

		var coords = { "left" : 0, "top" : 0, "right" : 0, "bottom" : 0 };

		while(element){
			coords.left += element.offsetLeft || 0;
			coords.top += element.offsetTop || 0;
			element = element.offsetParent;

			if(useOffset){
				if(element){
					if(element.tagName == "BODY") break;
					var p = daum.Element.getStyle(element, "position");
					if(p !== "static") break;
				}
			}
		}

		coords.right = coords.left + w;
		coords.bottom = coords.top + h;

		return coords;
	},
	visible : function(e){
		return e.style.display != "none";
	},
	show : function(e){
		e.style.display = "";
	},
	hide : function(e){
		e.style.display = "none";
	},
	toggle : function(e){
		(daum.Element.visible(e)) ? daum.Element.hide(e) : daum.Element.show(e);
	},
	posHide : function(e){
		daum.Element.setPosition(e, -10000, -10000);
	},

	setOpacity : function(e, op){
		e.style.filter="alpha(opacity="+op*100+")";
		e.style.opacity = e.style.MozOpacity = e.style.KhtmlOpacity = op;
	},

	setCssText : function(/*e, _csstext*/){
		if(daum.Browser.ie) return function(e, _csstext){ e.style.cssText = _csstext; }
		else return function(e, _csstext){ e.setAttribute("style", _csstext); }
	}(),

	cleanNode : function(e){
	    var child = e.firstChild;
	    while (child){
	        var nextNode = child.nextSibling;
	        if (child.nodeType == 3 && !/\S/.test(child.nodeValue)){
	            e.removeChild(child);
	        }
	        child = nextNode;
	    }
	    return e;
	},

	setPngOpacity : function(/*e, src, method*/){
		if(daum.Browser.ie6){
			return function(e, src, method){
				var method = method || "image";

				e.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\"" + src + "\", sizingMethod=\"" + method + "\")";
				if (e.style.background != "")
					e.style.background = "none";
				if (e.tagName.toLowerCase() == "img")
					e.src = "http://imap.daum-img.net/defaultimg/transparent.gif";
			}
		}else{
			return function(e, src, method){
				var method = (method == "scale") ? "repeat" : "no-repeat";
				if (e.tagName.toLowerCase() != "img")
					e.style.background = "url(" + src + ") " + method;
				else
					e.src = src;
			}
       }
	}()
};

//JIGU initialize
(function(){
	if(!window.$) window.$ = daum.$;
	if(!window.$A) window.$A = daum.$A;
	if(!window.$E) window.$E = daum.$E;
	if(!window.$T) window.$T = daum.$T;
	if(!window.$C) window.$C = daum.$C;

	daum.extend(daum, daum.Event);
	daum.extend(daum, daum.Browser);
	daum.extend(daum, daum.Element);

	window.JiguEventGC = daum.Function.interval(daum.Event.GC, 60000, daum.Event);

	daum.Event.addEvent(window, "load", function(){ daum.documentLoaded = true; });

	daum.nativeExtend();
	if(!document.getElementsByClassName) document.getElementsByClassName = daum.methodize(daum.Element.getElementsByClassName);

	return true;
})();

/////////console.debug
if(!window.console){
	window.console = {
		debug : function(){},
		log : function(){}
	};
}else{
	if(!window.console.log){
		window.console.debug = window.console.log = function(){};
	}else{
		if (!window.console.debug)
			window.console.debug = function(){
				for(var i=0,len=arguments.length; i<len; i++){
					window.console.log(arguments[i]);
				}
			};
	}
}