
Function.prototype.bind = function(){
    // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Functions:arguments
    var _$A = function(a){return Array.prototype.slice.call(a);}
    if(arguments.length < 2 && (typeof arguments[0] == "undefined")) return this;
    var __method = this, args = _$A(arguments), object = args.shift();
    return function() {
      return __method.apply(object, args.concat(_$A(arguments)));
    }
};

jQuery.fn.extend({
	getClasses : function() {
		var classes = new Array();

		jQuery(this).each(function() {
			classes = classes.concat(jQuery(this).attr("class").split(" "));
		});
		
		return classes;
	},
	
	eachClass : function(callback) {
		jQuery(this).each(function() {
			var _class = jQuery(this).attr("class");
			if(typeof _class != "undefined")
				jQuery.each(_class.split(" "), callback);
		});
		
		return this;
	},
	
	setTextField : function(e, maxLength) {
		jQuery(this).focus(function() {
			jQuery(this).removeClass("default").addClass("focus").unbind("focus");
		}).keyup(function() {
			if(!e || !maxLength) return;

			var bytes = bugs.utils.byteSize($(this).val());
			
			var html = "(" + bytes + " / " + maxLength + ")";
			if(bytes > maxLength) html = "<em>글자수가 초과되었습니다. 다시 입력해 주세요.</em>" + html;
			e.html(html);
		});
		
		return this;
	},
	
	openWindow : function(callback) {
		jQuery(this).click(function() {
			var href = jQuery(this).attr("href");
			window.open(href);
			
			if(typeof(callback) == "function") callback();
			
			return false; 		
		});
		return this;
	},

	nextInput : function(nextElem, maxLength) {
		jQuery(this).keyup(function() {
			if(!nextElem || !maxLength) return;
			if ($(this).val().length >= maxLength) {
				jQuery(this).removeClass("focus").addClass("default");
				$(nextElem).focus();
			}
		});
		return this;
	}
});



bugs = {
	create : function() {
		return function() { this.initialize.apply(this, arguments); } 
	},
	overed : function(destination, source) {
		for (var property in source) {destination[property] = source[property];}
		return destination;
	},
	extend : function(ext, sup) {
		var ext_prototype = ext.prototype; var sup_prototype = sup.prototype;
		for (var property in sup_prototype) { if(!ext_prototype[property]) ext_prototype[property] = sup_prototype[property]; }
	},
	clone : function(obj) {
		var newObj = {};
		for (var property in obj) newObj[property] = obj[property];
		return newObj;
	},
	log : {
		LEVEL : 2,
		levels: {
			DEBUG:0,
			INFO:1,
			ERROR:2
		},
		setLogLevel : function(lv) {
			if(lv == "DEBUG") bugs.log.LEVEL = bugs.log.levels.DEBUG; 
			else if(lv == "INFO") bugs.log.LEVEL = bugs.log.levels.DEBUG;
			else if(lv == "ERROR") bugs.log.LEVEL = bugs.log.levels.DEBUG;
		},
		log : function(s) {
			try {
				if(typeof(console) != "undefined") console.log(s);
				//else alert(bugs.object.toString(s));
			} catch(e) {}
		},
		debug : function(s) {
			if(bugs.log.LEVEL <= bugs.log.levels.DEBUG) bugs.log.log(s);;
		},
		info : function(s) {
			if(bugs.log.LEVEL <= bugs.log.levels.INFO) bugs.log.log(s);;
		},
		error : function(s) {
			if(bugs.log.LEVEL <= bugs.log.levels.ERROR) bugs.log.log(s);;
		}
	},
	date : {
		yyyyMMdd : function(d) {
			if(!d) d = new Date();
			return d.yyyyMMdd();
		}
	},
	math : {
		abs : function(x) {
			return Math.abs(x);
		},
		random : function(n) {
			if(typeof(n) == "undefined") return Math.random();
			else return bugs.math.floor(Math.random() * n, 0);
		},
		round : function(n, index) {
			return bugs.math._get(Math.round, n, index);
		},
		ceil : function(n, index) {
			return bugs.math._get(Math.ceil, n, index);
		},
		floor : function(n, index) {
			return bugs.math._get(Math.floor, n, index);
		},
		_get : function(type, n, index) {
			if(typeof(index) == "undefined" || index == null) {
				index = 0;
			}
			//if(index==0) return eval("Math."+type+"(n)");
			if(index==0) return type(n);
			else {
				var p = Math.pow(10, index);
//				return eval("Math."+type+"(n * p) / p");
				return type(n * p) / p;
			}
		}
	},
	cookie : {
		set : function(name, value) {
			var argc = arguments.length;
			var argv = arguments;
			var expires = ( argc > 2) ? argv[2]:null;
			var path = ( argc > 3) ? argv[3]:null;
			var domain = ( argc > 4) ? argv[4]:null;
			var secure = ( argc > 5) ? argv[5]:false;
			var encode = ( argc > 6) ? argv[6]:true;
			
			document.cookie = name + "=" + (encode ? escape(value) : value) +
				((expires == null) ? "" : ("; expires =" + expires.toGMTString())) +
				((path == null) ? "" : ("; path =" + path)) +
				((domain == null) ? "" : ("; domain =" + domain)) +
				((secure == true) ? "; secure" : "");
		},
		get : function(name) {
			var dcookie = document.cookie;
			var cname = name + "=";
			var clen = dcookie.length;
			var cbegin = 0;
			while (cbegin < clen) {
				var vbegin = cbegin + cname.length;
					if (dcookie.substring(cbegin, vbegin) == cname) {
						var vend = dcookie.indexOf (";", vbegin);
						if (vend == -1) vend = clen;
					return unescape(dcookie.substring(vbegin, vend));
				}
				cbegin = dcookie.indexOf(" ", cbegin) + 1;
				if (cbegin == 0) break;
			}
			return "";
		}
	},
	visible : function(e) {
		var _is_display = false;
		if(e) {
			return (e.get(0).style.display != "none");
		} else
			return false;
		/*
		if(e) e.each(function() {if(this.style.display != "none") _is_display = true; });
		return _is_display;
		*/
	},
	focusNblur : function(selector, focusClass, blurClass) {
		if(typeof focusClass == "undefined") focusClass = "focus";
		if(typeof blurClass == "undefined") blurClass = "default";
		$(selector).focus(function(e) {
			var ee = $(e.target);
			ee.removeClass(blurClass);
			ee.addClass(focusClass);
		}).blur(function(e) {
			var ee = $(e.target);
			ee.removeClass(focusClass);
			ee.addClass(blurClass);
		});
	},
	object : {
		toString : function(obj) {
			var str = "";
			if(typeof obj == "string") return obj;
			else {
				for (var property in obj) {
					str += property + ":" + "{" + bugs.object.toString(obj[property])+ "}";
				}
				return str;
			}
		},
		empty : function(obj) {
			if(typeof obj == "undefine" || obj == null) return true;
			if(typeof obj == "string") return bugs.valid.empty(obj);
			if(typeof obj == "object") {
				var _ret = true;
				for (var property in obj) {
					_ret = false; break;
				}
				return _ret;
			}
		}
	},
	utils : {
		stripTag : function(s) {
			s = s.replace(/&(lt|gt);/g, function (strMatch, p1){	return (p1 == "lt")? "<" : ">"; });
			return s.replace(/<\/?[^>]+(>|$)/g, "");
		},
		toTag : function(s) {
			s = s.replace(/&(lt|gt);/g, function (strMatch, p1){	return (p1 == "lt")? "<" : ">"; });
			return s;
		},
		cutstring : function(s, length, postfix) {
			if(!s) return "";
			if(!postfix) postfix = "";
			if(s.length <= length) return s;
//			if(bugs.utils.byteSize(s) <= length) return s;
			else return s.substring(0, length) + postfix;
		},
		cutstring1 : function(s, length) {
			return bugs.utils.cutstring(s, length, "...");
		},
		
		trim : function(str) {
			return str.replace(/(^\s*)|(\s*$)/g, "");
		}, 
		byteSize : function(str, twoByteWeight) {
			if(typeof twoByteWeight == "undefined") twoByteWeight = 2;
			if(!str ||  typeof str != 'string') return 0;
			var cnt = 0;
			for (var i = 0; i < str.length; i++) {
				if (str.charCodeAt(i) > 127)
					cnt += twoByteWeight;
				else
					cnt++;
			}
			
			return Math.ceil(cnt);
		},
		strlengthByByte : function(str, size, twoByteWeight) {
			if(typeof twoByteWeight == "undefined") twoByteWeight = 2;
			if(!str ||  typeof str != 'string') return 0;
			var cnt = 0, len = 0;
			
			for (var i = 0; i < str.length; i++) {
				if (str.charCodeAt(i) > 127)
					cnt += twoByteWeight;
				else
					cnt++;
				if(cnt > size) return len;
				len++;

			}
			return len;
		},
		strlen : function(str) {
			var len = 0;
			for ( var i = 0; i < str.length; i++) {
				if (str.charCodeAt(i) > 128)
					len += 2;
				else
					len++;
			}
			return len;
		},
		numToStr : function (num) {
	    	if (num.length < 4)	return num;
	    	
	    	while(num.indexOf(",") >= 0) {
	    		num = num.replace(",", "");
	    	}
	    	
	    	return num;
		},
		strToNum : function (str) {
	    	var num = "";
	    	var getString = ""+str;
	    	
	    	while(getString.length > 3) {
	    		num = ","+getString.substring(getString.length-3, getString.length)+num;
	    		getString = getString.substring(0, getString.length-3);
	    	}
	    	
	    	if (getString != "")	num = ""+getString+num;
	    	
	    	return num;
		},
		cutbytestring : function(s, size, postfix, twoByteWeight) {
			if(!s) return "";
			if(!postfix) postfix = "";
			if(bugs.utils.byteSize(s) <= size) return s;
			else return s.substring(0, bugs.utils.strlengthByByte(s, size, twoByteWeight)) + postfix;
		},
		cutbytestring1 : function(s, size, twoByteWeight) {
			return bugs.utils.cutbytestring(s, size, "...", twoByteWeight);
		},
		cut : function(str, size, postfix) {
			if(typeof(postfix) == 'undefined') postfix = '...';

			var bytes = bugs.utils.byteSize(str);
			if(bytes < size) return str;
			
			var cnt = 0, len = 0, t = -1;

			for(var i = 0; i < str.length; i++) {
				cnt += (str.charCodeAt(i) > 127) ? 2 : 1;
				
				if(t < 0 && (cnt + postfix.length > size)) t = len;
				
				if(cnt > size) break;
				len++;
			}
			
			if(cnt <= size) return str.substring(0, len);
			else return str.substring(0, t) + postfix;
		},
		cutline : function(str, size, line, postfix) {
			if(typeof(postfix) == 'undefined') postfix = '...';
			
			var cnt = 0, ln = 0, start = 0, end = 0;
			var result = '';
			
			for(var i = 0; i < str.length; i++) {
				cnt += (str.charCodeAt(i) > 127) ? 2 : 1;
				if(cnt > size) {
					var tmp = str.substring(start, end);
					ln++;
					
					if(ln < line) result += tmp + "\n";
					else {
						if(i <= str.length - 1) tmp = bugs.utils.cut(tmp + postfix, size, postfix);
						
						result += tmp;
						break;
					}
					
					start = end++;
					cnt = (str.charCodeAt(i) > 127) ? 2 : 1;
				}
				else end++;
			}
			
			if(ln < line && end > start) result += str.substring(start, end);
			
			return result;
		},
		countLine : function(str) {
			var line = 1;
			for(var i = 0; i < str.length; i++) {
				if(str.charCodeAt(i) == 10) line++;
			}
			
			return line;
		},
		addCommas : function(nStr) {
			nStr += '';
			x = nStr.split('.');
			x1 = x[0];
			x2 = x.length > 1 ? '.' + x[1] : '';
			var rgx = /(\d+)(\d{3})/;
			while (rgx.test(x1)) {
				x1 = x1.replace(rgx, '$1' + ',' + '$2');
			}
			return x1 + x2;
		},
		// img out over
		imgOver : function(obj) { 
			obj.src = obj.src.replace("Off.gif", "Over.gif");
		},
		imgOut : function(obj) { 
			obj.src = obj.src.replace("Over.gif", "Off.gif");
		},
		imgError : function(obj, defaultSize) {
			if(!obj) return;
			
			// defaultSize가 argument에 있다면 소스 이미지가 썸네일이 아닌 오리지날 이미지로 
			// 해당 이미지가 없으면 바로 default 이미지를 보여줌. (썸네일 서버 부하 줄임)
			if(defaultSize) {
				obj.onerror = null;
				obj.src = bugs.url.defaultThumbnail(obj.src, defaultSize);
				//obj.src = g_urlThumbnail + "/requestDefaultImage?url=" + encodeURIComponent(obj.src);
			}
			else {
				obj.onerror = function() {
					obj.onerror = null;
					obj.src = bugs.url.defaultThumbnail(obj.src);
				};
				obj.src = g_urlThumbnail + "/request?url=" + encodeURIComponent(obj.src);
			}
		},
		setImgError : function(selector) {
			return $(selector).one("error", function() {
				$(this).one("error", function() {
					$(this).attr("src", bugs.url.defaultThumbnail($(this).attr("src")));
				});
				
				$(this).attr("src", g_urlThumbnail + "/request?url=" + encodeURIComponent($(this).attr("src")));
			});
		},
		bannerError : function(obj) {
			if(!obj) return;
			
			obj.onerror = null;
			obj.src = "http://file.bugsm.co.kr/bugs/images/common/noalbumD.gif";
		},
		setBannerError : function(selector) {
			return $(selector).one("error", function() {
				$(this).attr("src", "http://file.bugsm.co.kr/bugs/images/common/noalbumD.gif");
			});
		},
		moreView : function(anchor, obj, height) {
			if(typeof obj == "undefined") return;
			if(typeof obj == "string") obj = $(obj);
			if(typeof height == "undefined") height = 80;
			anchor = $(anchor);
			if(obj.css("overflow") == "hidden") {
				obj.css({"height":null, "overflow":"visible"});
				anchor.parent().addClass("close");
				anchor.html(anchor.html().replace("더보기", "닫기"));
			} else {
				bugs.log.log(obj.find("img"));
				obj.find("img").hide();
				
				obj.css({"height":height, "overflow":"hidden"});
				anchor.parent().removeClass("close");
				anchor.html(anchor.html().replace("닫기", "더보기"));
			}
			
		},
		toggleMoreView : function(anchor) {
			anchor = $(anchor);
			if(anchor.text() == "더보기") {
				anchor.parent().addClass("close");
				anchor.html(anchor.html().replace("더보기", "닫기"));
			} else {
				anchor.parent().removeClass("close");
				anchor.html(anchor.html().replace("닫기", "더보기"));
			}
		},
		parentOpenClose : function(obj, headSelector, listSelector) {
			var oo = $(headSelector);
			if(oo.hasClass("open")) {
				oo.removeClass("open").addClass("close");
				$(listSelector).hide();
			} else if(oo.hasClass("close")) {
				oo.removeClass("close").addClass("open");
				$(listSelector).show();
			}
			
		},
		focus : function(obj) {
			var oo = $(obj);
			if( typeof oo.get(0) != "undefined") oo.get(0).focus();
		},
		openWindow : function(obj) {
			window.open(obj.href);
			return false;
		},
		anchor : function(target, speed, callback) {
			if(arguments.length == 1) {
				speed = 1000;
				callback = function() {};
			} else if(arguments.length == 2) {
				if(typeof speed == "undefind") {
					speed = 1000;
					callback = function() {};
				} else if(typeof speed == "function") {
					callback = speed;
					speed = 1000;
				}
			}
			
			target = $(target);
			var targetOffset = target.offset().top;
			$('html,body').animate({scrollTop: targetOffset}, speed, callback);
		},
		urlParam : function(paramsName, url) {
			if(bugs.valid.empty(paramsName)) return null;
			if(typeof url == "undefined") url = document.location.href;
			
			var idx = url.indexOf("?");
			if(idx > 0) {
				var queryString = url.substring(idx + 1);
				if(!bugs.valid.empty(queryString)) {
					var params = queryString.split("&");
					if(typeof params != "undefined" && params.length > 0) {
						for(var i=0;i<params.length;i++) {
							var pStr = params[i].split("=");
							var pName = pStr[0];
							var pValue = pStr[1];
							if(paramsName == pName) return pValue;
						}
					}
				}
			} 
			return null;
		}
	},	
	valid : {
		empty : function(str) {
			if(typeof str == "string" && bugs.utils.trim(str).length > 0) 
				return false;
			return true;
		},
		email : function(str) {
			return (/\w+([-+.]\w+)*@\w+([-.]\w+)*\.[a-zA-Z]{2,4}$/).test(str);
		},
		kor : function(str) {
			str = bugs.utils.trim(str);
			return (/^[가-힝]+$/).test(str);
		},
		eng : function(str) {
			str = bugs.utils.trim(str);
			return (/^[a-zA-Z]+$/).test(str);
		},		
		numeng : function(str) {
			str = bugs.utils.trim(str);
			return (/^[0-9a-zA-Z]+$/).test(str);
		},
		notnumeng : function(str) {
			str = bugs.utils.trim(str);
			return (/[^0-9a-zA-Z]+$/).test(str);
		},
		numengkor : function(str) {
			str = bugs.utils.trim(str);
			return (/^[가-힝0-9a-zA-Z]+$/).test(str);
		},
		notkor : function(str) {
			str = bugs.utils.trim(str);
			return (/[가-힝]+/).test(str);
		},
		numdash : function(str) {
			str = bugs.utils.trim(str);
			return (/^[0-9]{1}[0-9\-]+$/).test(str);
		},
		url : function(str) {
			str = bugs.utils.trim(str);
			return (/^http:\/\/([\w\-]+\.)+/).test(str);
		},
		num : function(str) {
			str = bugs.utils.trim(str);
			return (/^[0-9]+$/).test(str);
		},
		phone : function(str) {
			str = bugs.utils.trim(str);
			return (/^[0-9]{1,3}-[0-9]{3,4}-[0-9]{4}$/).test(str);
		},
		dateYMD : function(str) {
			str = bugs.utils.trim(str);
			return (/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/).test(str);
		},
		dateYMDHS : function(str) {
			str = bugs.utils.trim(str);
			return (/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$/).test(str);
		},
		include2byte : function(str) {
			if(!str ||  typeof str != 'string') return false;
			for (var i = 0; i < str.length; i++) {
				if (str.charCodeAt(i) > 127)
					return true;
			}
			return false;
		},
		isSsnCheck : function(strSsn) {
			strSsn = bugs.utils.trim(strSsn);
			if (strSsn.length != 13) return false;
			var isForeigner = false;
			switch (strSsn.substr(6,1)) {
				case '5'	:
				case '6'	:
				case '7'	:
				case '8'	: isForeigner = true;	break;
				default		: isForeigner = false;	break;
			}

			if (isForeigner) {
				return bugs.valid.isFgnSsnCheck(strSsn);
			}
			else {
				var strCheckKey = '234567892345';
				var nCheckNo = 0, nCheckVal= 0, rVal;

				for (var i=0;i<strCheckKey.length;i++) {
					nCheckNo += strSsn.charAt(i) * strCheckKey.charAt(i);
				}
				nCheckVal = strSsn.charAt(i);

				rVal = 11 - (nCheckNo % 11)
				if (rVal > 9) rVal = (rVal % 10);

				return (nCheckVal == rVal) ? true : false;
			}
		},
		isFgnSsnCheck : function(strSsn) {
			strSsn = bugs.utils.trim(strSsn);
			if (strSsn.length != 13) return false;
			var strCheckKey = '234567892345';
			var nCheckNo = 0, nCheckVal= 0, rVal;
			var nList = new Array(13);

			for (var i=0;i<13;i++) {
				nList[i] = strSsn.charAt(i);
			}

			if(nList[11] < 6) return false;
			if((nList[7]*10 + nList[8])&1) return false;

			for (var i=0;i<strCheckKey.length;i++) {
				nCheckVal += nList[i] * strCheckKey.charAt(i);
			}

			if ((nCheckVal  = 11 - (nCheckVal%11)) >= 10) nCheckVal -= 10;
			if ((nCheckVal += 2) >= 10) nCheckVal -= 10;

			return (nCheckVal != nList[12]) ? false : true;
		}
	},
	mainurl : function() {
		var url = document.location.href;
		//return url;
		if(url.indexOf("www.bugs.co.kr") > 0) {
			return "http://www.bugs.co.kr";
		} else return _staticUrl;
	},
	url : {
		artistPage : function(artist_id) {
			if(typeof artist_id == "undefined") return;
			return g_urlMusic +  "/artist/"+artist_id;
		},
		albumPage : function(album_id) {
			if(typeof album_id == "undefined") return;
			return g_urlMusic +  "/album/"+album_id;
		},
		trackPage : function(track_id) {
			if(typeof track_id == "undefined") return;
			return g_urlMusic +  "/track/"+track_id;
		},
		memberPage : function(userId) {
			if(typeof userId == "undefined") return;
			return g_urlMe +  "/"+userId;
		},
		albumThumbnail : function(album_id, size, ext) {
			if(typeof album_id == "undefined") return;
			if(typeof ext == "undefined") ext = ".jpg";
			return g_urlClipimg + "/album/images/" + size + "/" + Math.floor(album_id / 100) + "/" + album_id + ext;
		},
		mvThumbnail : function(mv_id, size) {
			if(typeof mv_id == "undefined") return;
			return g_urlClipimg + "/mv/images/" + size + "/" + Math.floor(mv_id / 100) + "/" + mv_id + ".jpg";
		},
		artistThumbnail : function(artist_id, size, ext) {
			if(typeof artist_id == "undefined") return;
			if(typeof ext == "undefined") ext = ".jpg";
			return g_urlClipimg + "/artist/images/" + size + "/" + Math.floor(artist_id / 100) + "/" + artist_id + ext;
		},
		defaultThumbnail : function(src, defaultSize) {
			var index = src.indexOf("?");
			src = decodeURIComponent(src.substring(index + 5));

			var tmp = src.split("/");
			var type = tmp[tmp.length - 7];
			var width, height;
			
			if(type == "member" || type == "playlist") {
				if(type == "member") type = "user";
				else type = "albumUser";
				width = height = defaultSize ? defaultSize : tmp[tmp.length - 5];
			}
			else {
				type = tmp[tmp.length - 5];
				if(type == "poll") type = "artist";
				else if(type == "essential") type = "album";
				
				width = defaultSize ? defaultSize : tmp[tmp.length - 3];
				height = width;
				if(type == "mv" && width == "100") height = "75";
			}

			return "http://file.bugsm.co.kr/nbugs/common/i_" + type + width + "x" + height + ".gif";
		}
	}
}

bugs.template = bugs.create();
bugs.template.prototype = {
	initialize : function(tmpl, json) {
		this.setTemplate(tmpl);
		this.setData(json);
	}, 
	setFile : function(src) {
		// TODO
	},
	setTemplate : function(tmpl) { if(tmpl) this._template = tmpl;},
	
	setData : function(data) {
		if(data && data != "") {
			this._data = bugs.overed(this._data||{}, data||{});
		} else {
			this._data = {};
		}
	},
	html : function() {
		var js = this._template.replace(/[\r\t\n]/g, " ")
			.replace(/'(?=[^%]*%>)/g, "\t")
			.split("'").join("\\'")
			.split("\t").join("'")
			.replace(/<%=(.+?)%>/g, "',$1,'")
			.split("<%").join("');")
			.split("%>").join("write.push('");
		var f = new Function('obj', "var write=[];with (obj){write.push('"+js+"');}return write.join('');");
		if (!this._data) return f;
		var r = f(this._data);
		return r;
	}
	
}

bugs.layermenu = {
	TEMP_MV : '<div id="mvLayerMenu" class="layerMenu layerMenuMV">' + 
		'<ul>' +
		'	<% if(obj.mediaNo > 0 && obj.mediaYn == "Y") {%><li><a href="javascript:bugs.music.viewMV(<%=id%>);">뮤비보기</a></li><% } %>' +
		'	<% if(obj.svcFullhdYn == "Y") {%><li><a href="javascript:bugs.music.dnFullMV(<%=id%>);">FULL HD 다운</a></li><% } %>' +
		'	<% if(obj.svcHdYn == "Y") {%><li><a href="javascript:bugs.music.dnHdMV(<%=id%>);">HD 다운</a></li><% } %>' +
		'	<% if(obj.svcSdYn == "Y") {%><li><a href="javascript:bugs.music.dnSdMV(<%=id%>);">일반화질 다운</a></li><% } %>' +
		'</ul>' +
		'<div class="layerBg bgTR"></div>' +
		'<div class="layerBg bgTL"></div>' +
		'<div class="layerBg bgTC"></div>' +
		'</div>',
	TEMP_PHONE : '<div id="phoneLayerMenu" class="layerMenu layerMenuPhone">' +
		'<ul>' +
		'	<% if(obj.livebellYn == "Y"){ %><li><a href="javascript:void(0);" onclick="bugs.music.setLivebell(<%=id%>);">라이브벨</a></li><% } %>' +
		'	<% if(obj.ringYn == "Y"){ %><li><a href="javascript:void(0);" onclick="bugs.music.setColoring(<%=id%>);">컬러링</a></li><% } %>' +
		'</ul>' +
		'<div class="layerBg bgTR"></div>' +
		'<div class="layerBg bgTL"></div>' +
		'<div class="layerBg bgTC"></div>' +
		'</div>',
	TEMP_PHONE_SET : '<div id="phoneSetLayerMenu" class="layerMenu layerMenuPhoneSetting" style="right:17px;top:40px;">'+
				'<ul>'+
				'	<li><a href="javascript:void(0);">설정</a></li>'+
				'	<li><a href="javascript:void(0);">선물</a></li>'+
				'</ul>'+
				'<div class="layerBg bgTR"></div>'+
				'<div class="layerBg bgTL"></div>'+
				'<div class="layerBg bgTC"></div>'+
			'</div>',
	mv : function(obj, mv_id, mediaYn, svcFullhdYn, svcHdYn, svcSdYn, mediaNo) {
		if(typeof mediaNo == "undefined") mediaNo = 0;
		if($("#mvLayerMenu").length > 0) {
			$(document).unbind("click", bugs.layermenu.mvHideWhenDocumentClick);
			$("#mvLayerMenu").hide().remove();
			bugs.layermenu.mv(obj, mv_id, mediaYn, svcFullhdYn, svcHdYn, svcSdYn, mediaNo);
			return;
		}
			
		var _tmp = new bugs.template(bugs.layermenu.TEMP_MV, {
			id : mv_id, mediaYn : mediaYn, 
			svcFullhdYn : svcFullhdYn, svcHdYn : svcHdYn, svcSdYn : svcSdYn, mediaNo : mediaNo
		});
		var oobj = $(obj);
		var span = $(obj).parent();
		
		var layer = $(_tmp.html()).appendTo("body");;
		bugs.layermenu.layerEventHandler(oobj, layer, 3, 0);
		$(document).bind("click", {button : span, layer : layer}, bugs.layermenu.mvHideWhenDocumentClick);
	},
	mvHideWhenDocumentClick :  function(e) {
		if(e.data.button.index(e.target) < 0 && e.data.button.children().index(e.target) < 0
			&& e.data.layer.index(e.target) < 0 && e.data.layer.children().index(e.target) < 0) { 
			e.data.layer.hide().remove();
			$(document).unbind("click", bugs.layermenu.mvHideWhenDocumentClick);
		}
	},
	phone : function(obj, trackId, livebellYn, ringYn, _top, _left) {
		if(typeof _top == "undefined") _top = 3;
		if(typeof _left == "undefined") _left = 0;
		if($("#phoneLayerMenu").length > 0) {
			$(document).unbind("click", bugs.layermenu.phoneHideWhenDocumentClick);
			$("#phoneLayerMenu").hide().remove();
			bugs.layermenu.phone(obj, trackId, livebellYn, ringYn);
			return;
		}
			
		var _tmp = new bugs.template(bugs.layermenu.TEMP_PHONE, {id : trackId, "ringYn" : ringYn , "livebellYn" : livebellYn});
		var oobj = $(obj);
		var span = $(obj).parent();
		
		var layer = $(_tmp.html()).appendTo("body");;
		bugs.layermenu.layerEventHandler(oobj, layer, _top, _left);
		$(document).bind("click", {button : span, layer : layer}, bugs.layermenu.phoneHideWhenDocumentClick);
	},
	phoneHideWhenDocumentClick :  function(e) {
		if(e.data.button.index(e.target) < 0 && e.data.button.children().index(e.target) < 0
			&& e.data.layer.index(e.target) < 0 && e.data.layer.children().index(e.target) < 0) { 
			e.data.layer.hide().remove();
			$(document).unbind("click", bugs.layermenu.phoneHideWhenDocumentClick);
		}
	}, 
	phoneSet : function(obj, trackId, type) {
		if($("#phoneSetLayerMenu").length > 0) {
			$(document).unbind("click", bugs.layermenu.phoneSetHideWhenDocumentClick);
			$("#phoneSetLayerMenu").hide().remove();
		}
			
		var _tmp = new bugs.template(bugs.layermenu.TEMP_PHONE_SET, {id : trackId});
		var oobj = $(obj);
		var span = $(obj).parent();
		/*
		<ul>'+
		'	<li><a href="javascript:void(0);">설정</a></li>'+
		'	<li><a href="javascript:void(0);">선물</a></li>'+
		'</ul>'+
		*/
		
		
		var layer = $(_tmp.html());
		layer.find("ul li a").each(function(idx){
			if(type=="livebell") {
				if(idx == 0) 
					$(this).click(function() {
						bugs.music.setLivebell(trackId);
					});
				else if(idx == 1)
					$(this).click(function() {
						bugs.music.setLivebellTo(trackId);
					});
			} else if(type=="coloring") {
				if(idx == 0) 
					$(this).click(function() {
						bugs.music.setColoring(trackId);
					});
				else if(idx == 1)
					$(this).click(function() {
						bugs.music.setColoringTo(trackId);
					});
			}
		});
		
		layer.appendTo("body");
		bugs.layermenu.layerEventHandler(oobj, layer, 3, 0);
		$(document).bind("click", {button : span, layer : layer}, bugs.layermenu.phoneHideWhenDocumentClick);
	},
	phoneSetHideWhenDocumentClick :  function(e) {
		if(e.data.button.index(e.target) < 0 && e.data.button.children().index(e.target) < 0
			&& e.data.layer.index(e.target) < 0 && e.data.layer.children().index(e.target) < 0) { 
			e.data.layer.hide().remove();
			
			$(document).unbind("click", bugs.layermenu.phoneSetHideWhenDocumentClick);
		}
	}, 
	layerEventHandler : function(caller, layer, _top, _left) {
		var span = caller.parent();
		layer.css({
			"top":caller.offset().top + span.height() + _top, 
			"left":caller.offset().left - (layer.width() / 2) + (span.width() / 2) + _left
		}).show();
		
		$(window).resize(function() {
			layer.css({
				"top":caller.offset().top + span.height() + _top, 
				"left":caller.offset().left - (layer.width() / 2) + (span.width() / 2) + _left
			});
		});

	},
	
	tracksClose : function() {
	},
	tracksSuccess : function(html, id, type, obj, left, top) {
		html = html.replace(/^\s*/,'');
		if (html != "") {
			var _layer = $("<div id=\""+type+id+"\" class=\"layerPopup noTitle layerListenAll\" style='display:none;position:absolute;'></div>").appendTo($("body")).css("z-index", "1000");
			bugs.layermenu.trackLayerPosition(_layer, obj, left, top);
			_layer.html(html).show('blind');
			$(window).resize(function() {
				bugs.layermenu.trackLayerPosition(_layer, obj, left, top);
			});
		}
    },
    trackLayerPosition : function(layer, caller, left, top) {
    	var e = caller.offset();
		var x = e.left + left;
		var y = e.top+caller.height() + top;
		layer.css({top : y, left : x});
    },
    tracks : function (id, type, obj, msrl) {
    	if (false) {
    		$("#"+type+id).remove();
    	}
    	$(".layerPopup.layerListenAll").hide();
    	
    	if(typeof obj == "undefined") {
    		obj = $("#_"+type+id);
    	} else obj = $(obj);
    	
    	var url, left, top, data;
    	if (type == "PLAYLIST") {
    		url = g_urlAjax+"/user/ajax/playlist/other/track";
    		left = -32;
    		top = 0;
    		data = {"playlist_id" : id, "msrl" : msrl, "decorator" : "blank"};
    	} else if (type == "ALBUM") {
    		url = g_urlAjax+"/user/ajax/album/other/track/"+id;
    		left = -1;
    		top = 0;
    		data =  {"decorator" : "blank"};
    	} else if (type == "ESALBUM") {
    		url = g_urlAjax+"/openalbum/esential/ajax/track";
    		left = -1;
    		top = 0;
    		data =  {"id" : id, "decorator" : "blank"};
    	} else {
    		url = g_urlMe+"/ajax/album/other/track/"+id;
    		left = -30;
    		top = 0;
    		data = {};
    	}
    	
    	
    	if($("#"+type+id).html() == null) {
    		$.get(url, data, function(html) {
	    		bugs.layermenu.tracksSuccess(html, id, type, obj, left, top);
	    	});
    	} else {
    		var e = obj.offset();
			var x = e.left + left;
			var y = e.top+obj.height() + top;
    		$("#"+type+id).css({"top" : y, "left" : x}).show('blind');
    	}
    }, 
    esTracks : function(id, obj) {
    	bugs.layermenu.tracks(id, "ESALBUM", obj);
    },
    openalbumTracks : function(id, obj) {
    	bugs.layermenu.tracks(id, "PLAYLIST", obj);
    }
};



bugs.form ={};
bugs.form.checkbox = bugs.create();
bugs.form.checkbox.prototype = {
	initialize : function(selector, name, value, option) {
		if(typeof selector != "string") this.checkbox = selector;
		else this.checkbox = $(selector);
		
		var _inp = this.checkbox.find("input");
		
		if(_inp.length > 0 && this.checkbox.find("input").get(0).disabled == true) {
			this._disabled = true;
			return;
		}
		
		this.name = name;
		if(arguments.length == 3 && typeof(value) != "string") {
			option = value;
		} else {
			if(typeof value == "string") this.value = value;
			this.value = value;
		}
		
		this.option = bugs.overed({
			checkedClass : "click",
			onchange : function() {},
			onclick : function() {},
			checked : function() {},
			unchecked : function() {}
		}, option || {});

		var _span = this.checkbox.find("span.checkbox:last");
		if(_span.length < 1) {
			this.checkbox.children().remove();
			_span = $("<span class=\"checkbox\"></span>").appendTo(this.checkbox);
		}
		this.clickObject = _span;
		
		var _inp = this.checkbox.find("span.checkbox:last input:checkbox:last");
		if(_inp.length < 1) {
			_inp = $('<input type="checkbox"/>').attr("name", this.name).attr("value", this.value).appendTo(_span);
		} else {
			if(bugs.valid.empty(_inp.attr("name"))) _inp.attr("name", this.name)
			/*
			if(!bugs.valid.empty(_inp.attr("value"))) {
				this.value = _inp.attr("value");
			}
			else*/ _inp.attr("value", this.value);
		}
		
		this.hiddenObject = _inp;
		if(this.hiddenObject.get(0).checked == true) {
			this.checked(); 
		}

		this.checkbox.unbind("click", this._clickFunc);
		this.checkbox.click($.proxy(this._clickFunc, this));
	},
	_clickFunc : function(event) {
		//event.formObject = _formObject;
		var _input = this.hiddenObject.get(0);
		this.option.onclick(event);
		if(this.isChecked()){
			this.unchecked();
		} else {
			this.checked();
		}
	},
	isDisabled : function() {
		if(this._disabled != "undefined" && this._disabled == true) return true;
		else return false;
	},
	isChecked : function() {
		return this.hiddenObject.get(0).checked;
	},
	checked : function() {
		this.checkbox.addClass(this.option.checkedClass);
		this.option.checked();
		this.hiddenObject.get(0).checked = true;
	},
	unchecked : function() {
		this.checkbox.removeClass(this.option.checkedClass);
		this.option.unchecked();
		this.hiddenObject.get(0).checked = false;
		
		
	},
	disabled : function() {
	},
	val : function(val) {
		if(typeof val != "string")
			return this.hiddenObject.attr("value");
		else
			this.hiddenObject.attr("value", val);
	},
	onchange : function(f) {
		var old = this.option.onchange; 
		this.option.onchange = function(o, n) { old(o, n); f(o, n); }.bind(this);
	},
	onclick : function(f) {
		var old = this.option.onclick;
		this.option.onclick = function(o, n) { old(o, n); f(o, n); }.bind(this);
	},
	hide : function(speed) {
		if(speed) this.checkbox.hide(speed);
		else this.checkbox.hide();
	},
	show : function(speed) {
		if(speed) this.checkbox.show(speed);
		else this.checkbox.show();
	}
}

bugs.logging = {
	url : g_urlWww + "/logging/add",
	add : function(id, cols, nums) {
		if(typeof id == "undefined") return;
		if(typeof cols == "undefined" || cols == null) cols = [];
		if(typeof nums == "undefined" || nums == null) nums = [];
		bugs.log.log(cols);
		bugs.log.log(nums);
		if(cols.length == 0 && nums.length == 0) return;
		$.post(bugs.logging.url, {id : id, "cols[]" : cols, "nums[]" : nums}, function(result) {
			
		});
	
	}
}
		

bugs.gnb = {
	moreMenu : function() {
		var layerMore = $('.layerMore');
		if(layerMore.get(0).style.display == "none") {
			layerMore.show();
			
			var _close = function(event) {
				if($('#tmMore, .layerMore, .layerMore *').index(event.target) < 0) {
					layerMore.hide();
					$(document).unbind("click", _close);
				}
			};
			$(document).bind("click", _close);
		} else {
			layerMore.hide();
		}
	},
	initSearch : function() {
		var _search = $("#gnbSearch");
		if(_search.length > 0) {
			_search.find("button").click(function() {
			});
		}
	},
	funcMemberBox : function(event) {
		if($(".layerMyInfo, .layerMyInfo *, .viewMyInfo").index(event.target) < 0) {
			bugs.gnb.closeMemberBox();
			$(document).unbind("click", bugs.gnb.funcMemberBox);
		}
	},
	openMemberBox : function() {
		$('.layerMyInfo').slideDown(300);
		$(document).click(bugs.gnb.funcMemberBox);
	},
	closeMemberBox : function() {
		$('.layerMyInfo').slideUp(300);
	},
	toggleMemberBox : function() {
		if(bugs.visible($('.layerMyInfo'))) {
			bugs.gnb.closeMemberBox();
		} else {
			bugs.gnb.openMemberBox();
		}
		//javascript:void($('.layerMyInfo').show())
	},
	_topSearchHeight : function(ol) {
		var _h = 0;
		$("li", ol).each(function() {
			_h += $(this).height();
		});
		return _h;
	},
	topSearchRolling : function() {
		
		var rankList = $("#rankList");
		var isMouseOver = false;
		var dd = $("dd", rankList);
		var ol = dd.find("ol");
		
		if(rankList.length == 0 || dd.length == 0 || ol.length == 0) return;
		
		var _timeoutId;
		var rollingHeight = 24;
		ol.height(bugs.gnb._topSearchHeight(ol));
		var _rollingFunc = function() {
			var _t, _h;
			if(ol.css("top") == "auto") 
				_t = 0;
			else
				_t = bugs.math.abs(ol.position().top);
			
			if(ol.css("height") == "auto") 
				_h = 0;
			else
				_h = bugs.gnb._topSearchHeight(ol);
			
			if(_t >= _h) {
				ol.css("top", rollingHeight);
				ol.animate({top : "-="+rollingHeight}, 1000, _rollingFunc);
			} else {
				_timeoutId = setTimeout(function() {
						ol.animate({top : "-="+rollingHeight}, 1000, _rollingFunc);
					}, 3000);
			}
			
		};
		
		dd.hover(
			function(event) {
				dd.find("ol:animated").stop();
				ol.css("top", 0);
				if(typeof _timeoutId != "undefined" && _timeoutId != null) {
					clearTimeout(_timeoutId);
					_timeoutId = null;
				}
				rankList.removeClass("rankList").addClass("layerRank");
			}, function(event) {
				rankList.removeClass("layerRank").addClass("rankList");
				_rollingFunc();
			}
		);
		_rollingFunc();
	},
	_topKeywordsHtml : '<% for(var i=0; i < obj.list.length; i++) { var item = obj.list[i]; %>' +
		'<li class="<%=item.info.rankClass%> <%= item.info.class2%>">' +
		'<span class="ranking"><%=item.info.rank%>.</span>' + 
		'<span class="word"><a href="<%=g_urlSearch + \"/total?q=\" + encodeURIComponent(item.query)%>"><%=item.query%></a></span> ' + 
		'<span class="updown"><em><%=item.info.rackName%></em> <% if(typeof item.deltaRanking != "undefined") { %><strong><%=item.info.rankStr%></strong><% } %></span></li>' +
		'<% } %>',
	topKeywords : function() {
		$.ajax({
			url : g_urlAjax + "/search/top",
			success : function(result) {
				if(typeof result == "undefined" || $.isArray(result) == false || result.length == 0) return;
				$(result).each(function(idx) {
					var _rank = {};
					_rank.rank = idx + 1;
					if(typeof this.deltaRanking == "undefined" || this.deltaRanking == null) {
						_rank.rankClass= "new";
						_rank.rankName = "NEW";
						_rank.rankStr = "";
					} else if(this.deltaRanking > 0) {
						_rank.rankClass= "up";
						_rank.rankName = "NEW";
						_rank.rankStr = this.deltaRanking;
					}else if(this.deltaRanking == 0) {
						_rank.rankClass= "same";
						_rank.rankName = "동일";
						_rank.rankStr = "-";
					}else if (this.deltaRanking < 0) {
						_rank.rankClass= "down";
						_rank.rankName = "하락";
						_rank.rankStr = this.deltaRanking * (-1);
					}
					if(idx == 0) _rank.class2 = " top1";
					else if(idx < 3) _rank.class2 = " top3";
					else if(idx == 2) _rank.class2 = " top3 divider";
					else _rank.class2 = "";
					
					this.info = _rank;
				});
				var _tmp = new bugs.template(bugs.gnb._topKeywordsHtml, {"list" : result});
				$("#rankList dd ol").html(_tmp.html());
				
				// top keywords scrolling
				//bugs.gnb.topSearchRolling();
			},
			dataType : "json"
		});
	},
	chkLoginCode : function() {
		var code = bugs.utils.urlParam("loginCode");
		var msrl = bugs.utils.urlParam("msrl");
		if(!bugs.valid.empty(code)) {
			bugs.ui.showLoginAlert(code, {msrl : "", msrl : ((typeof msrl == "undefined" || msrl == null)?"":msrl) ,layerLogin : false});
		}
		
	}
}


var debug = {
	dump : function() {
		var retVal='', argVal = arguments[0] || '';

		switch((typeof argVal).toLowerCase()) {
			case 'object' :
				$.each(argVal, function(key, value) { 
					retVal += '[' + (typeof value) + '] ' + key + ' => ' + value +'\n';
				});
				break;

			case 'string'	:
			default			:
				retVal += (typeof argVal) + '/' + argVal;
		}
		return retVal;
	}
};

var searchBoxAd = {
		enable : true,
		url : null,
		init : function(url) {
			if(typeof url == "undefined") {
				searchBoxAd.url = $("#_searchBoxAdUrl").val();
			} else {
				searchBoxAd.url = url;
			}
			jQuery(".searchField .btnClearQuery").bind("click",searchBoxAd.close).focus(function() {
				this.blur();
			});
			jQuery("#searchInput").bind("focus",searchBoxAd.close);
			jQuery(".searchField button[type=button]").click(searchBoxAd.clickButton);
		},
		close : function(event) {
			var clearAnchor = jQuery(".searchField .btnClearQuery");
			var input = jQuery("#searchInput"); 
			event.preventDefault();
			clearAnchor.hide().remove();
			input.val("")
				.unbind("focus", searchBoxAd.close)
				.removeClass("adKeyword")
				.focus();
			searchBoxAd.enalbe = false;
			jQuery(".searchField button[type=button]").unbind("click", searchBoxAd.clickButton);
		},
		clickButton : function(event) {
			document.location.href = searchBoxAd.url;
			event.stopPropagation();
		}
	}


$(document).ready(function () {
	if ($(document.body).length > 0) {
		var brName = $.browser.name;
		if (brName == "msie") {
			var verNumber = $.browser.versionNumber; 
			if (verNumber == 5) {
			} else if (verNumber == 6) {
				$("body").addClass("ie6");
			} else if (verNumber == 7) {
				$("body").addClass("ie7");
			}
		} else if (brName == "firefox") {
			$("body").addClass("ff3_5");
		}
	}
});

var buyCash = function () {
	window.open(g_urlBilling+'/pay/pg/popProcess', 'cash','top=10, left=10, width=750, height=564, toolbar=0, directories=0, status=0, menubar=0, scrollbars=0, resizable=0');
};
