/* Mys.LogWriteCtrl - 미니로그 글쓰기 동작에 대한 컨트롤러. by J.K */
Mys.LogWriteCtrl = function(config){
		this.initialize(config);
}

Ext.extend(Mys.LogWriteCtrl, Ext.util.Observable, {
	imageCount : 0,
	writeBoxHtml : '<form class="writeLogBox" onsubmit="return false">' +
										'<div class="typeBox">' +
											'<a href="#" onclick="return false" title="글" class="text"><img src="/images/icon/btn_contents_text.png" class="png24" alt="글"/></a>' +
											'<a href="#" onclick="return false" title="링크" class="link"><img src="/images/icon/btn_contents_link.png" class="png24" alt="링크"/></a>' +
											'<a href="#" onclick="return false" title="사진" class="photo"><img src="/images/icon/btn_contents_photo.png" class="png24" alt="사진"/></a>' +
											'<a href="#" onclick="return false" title="동영상" class="video"><img src="/images/icon/btn_contents_video.png" class="png24" alt="동영상"/></a>' +
											'<a href="#" onclick="return false" title="영화" class="movie"><img src="/images/icon/btn_contents_movie.png" class="png24" alt="영화"/></a>' +
											'<a href="#" onclick="return false" title="음악" class="music"><img src="/images/icon/btn_contents_music.png" class="png24" alt="음악"/></a>' +			
											'<a href="#" onclick="return false" title="책" class="book"><img src="/images/icon/btn_contents_book.png" class="png24" alt="책"/></a>' +
											'<a href="#" onclick="return false" title="쇼핑" class="shop"><img src="/images/icon/btn_contents_shopping.png" class="png24" alt="쇼핑"/></a>' +
											/*'<a href="#" onclick="return false" title="질문" class="question">질문</a>' +*/
										'</div>' +


									'<div class="writeAreaBox">' +
										'<div class="memo">'+
											'<textarea name="memo"/></textarea>'+
										'</div>'+
										'<a href="#" class="writeSaveBtn" onclick="return false"><span>글쓰기</span></a>'+
										'<a href="#" class="writeModifyBtn" onclick="return false"><span>수정</span></a>'+
										'<a href="#" class="writeCancelBtn" onclick="return false"><span>취소</span></a>'+
									'</div>' +

									'<div class="gradeBox">'+
										'<p class="selectBox">'+
											'<a href="#" onclick="return false">전체공개</a>'+
										'</p>'+
										'<span>공개설정</span>'+
									'</div>'+

									'<ul class="gradeList list none">' +
										'<li><a href="#" class="public" onclick="return false">전체공개</a></li>' +
										'<li><a href="#" class="group" onclick="return false">채널공개</a></li>' +
										'<li><a href="#" class="friend" onclick="return false">친구공개</a></li>' +
										'<li><a href="#" class="private" onclick="return false">비공개</a></li>' +
									'</ul>' +
								'</form>',

	writeToggleFlag : false,
	defaultGrade : null,
	contentsCtrl : {},
	contentsItem : null,
	contentsCategory : null,
	currentCtrlEl : null,	// 선택된 종류 Btn Element
	greetingStr : "미니로그에 새로 가입하였습니다.  반갑습니다. ",

	// 초기화 함수
	initialize : function(config){
		this.addEvents({'write' : true});

		// 권한 확인
		// 클럽에서는 Check 하지 않는다.
		if(PAGE_USER_ID != EXT_SESSION.getID() && !GROUP_FLAG && !Global.isMain)
			return;

		Ext.apply(this, config);

		this.setDefaultGrade();

		var writeBtnEl = Ext.get("logWriteBtn");
		if(writeBtnEl){writeBtnEl.on("click", this.onClickWriteBtn, this);}

		this.containerEl = Ext.get(this.containerName);

		if(this.useModify) this.logCtrl.on("modify", this.onClickModify, this);

		// mode가 'write' 또는 'greeting'이면 show
		if(this.mode == "write" || this.mode == "greeting")
			this.show();
	},

	setDefaultGrade : function()
	{
			if(GROUP_FLAG && Global.searchable == 0)
			{
					this.defaultGrade = 8;
			}
			else
			{
					this.defaultGrade = 9;
			}
	},

	setVar : function(){
			this.selectedGrade = this.defaultGrade;
			this.setGradeName(this.selectedGrade);

			// 현재 선택된 컨텐츠 종류 버튼 - default text
			this.currentCtrlEl = this.writeBox.child(".typeBox a.text", true);
			this.addSelect(this.currentCtrlEl);
			this.currentCtrlName = "text";
	},

	removeVar : function(){
			var ctrl;

			this.memoEl.dom.value = "";

			//this.writeAreaEl.select("div").remove();
			this.contentsBoxEl = null;

/*			if(this.isModify){
				this.modifyData = null;
			}			*/

			// contents box hide
			if(this.currentCtrlName && (ctrl = this.getContentsCtrl(this.currentCtrlName))) ctrl.hideBox();

			// temp image remove
			photoCtrl = this.getContentsCtrl("photo");
			if(photoCtrl && photoCtrl.hasImage() && this.currentCtrlName	!= "photo")
					photoCtrl.removeImage();

			// contentsCtrl reset
			//for(var name in this.contentsCtrl) this.contentsCtrl[name].reset();
			this.removeSelect(this.currentCtrlEl);

			this.currentCtrlEl = null;
			this.currentCtrlName = null;
			this.contentsItem = null;
			this.contentsCategory = null;
	},

	// 글쓰기 창 생성
	make : function()
	{
		this.writeBox = this.containerEl.insertHtml("beforeBegin", this.writeBoxHtml, true);

		this.writeAreaEl = this.writeBox.child('.writeAreaBox');
		this.memoEl = this.writeBox.child("textarea");

		if(!EXT_SESSION.isLog())
				this.memoEl.on("click", this.showLoginBox, this);

		// 붙이기, 취소 설정
		this.writeSaveBtnEl = this.writeBox.child(".writeSaveBtn");
		this.writeSaveBtnEl.on("click", this.onClickSubmitBtn, this);
		/*this.writeBox.child(".writeCancelBtn").on("click", this.hide, this);
		this.writeBox.addKeyListener(Ext.EventObject.ESC, this.hide, this);*/

		if(this.mode == "greeting")
			this.setMemo(this.greetingStr);

		// 공개 설정
		this.makeGrade();

		// load 컨텐츠 버튼 이미지
		this.makeContentsImg();

		this.makeUserImg();

		// 컨텐츠 클릭 Event Set
		this.writeBox.select(".typeBox a").on("click", this.onClickContentsBtn, this);
	},

	makeGrade : function()
	{
		if(GROUP_FLAG && Global.searchable == 1)
		{
				this.writeBox.child(".gradeBox").remove();
				this.writeBox.child(".gradeList").remove();
				return;
		}
		var gradeListEl = this.writeBox.child('.gradeList');

		gradeListEl.select("a").on("click", this.onClickGrade, this);

		if(GROUP_FLAG)
		{
			gradeListEl.child(".friend").parent().remove();
			gradeListEl.child(".private").parent().remove();
		}
		else
			gradeListEl.child(".group").parent().remove();

		this.gradeBtnEl = this.writeBox.child('.gradeBox p a');
		this.gradeBtnEl.on("click", this.onClickListBtn, this, {el : gradeListEl});
	},

	makeContentsImg : function()
	{
			if(Mys.readCookie("initImg1"))
					return;

			var arr = [];
			arr.push('/images/icon/btn_contents_text_hover.png');
			arr.push('/images/icon/btn_contents_photo_hover.png');
			arr.push('/images/icon/btn_contents_video_hover.png');
			arr.push('/images/icon/btn_contents_link_hover.png');
			arr.push('/images/icon/btn_contents_book_hover.png');
			arr.push('/images/icon/btn_contents_shopping_hover.png');
			arr.push('/images/icon/btn_contents_music_hover.png');
			arr.push('/images/icon/btn_contents_movie_hover.png');

			Mys.preloadImages(arr);

			Mys.createCookie("initImg1", true, 365, null, null, null, DOMAIN);
	},

	makeUserImg : function()
	{
			if(!this.useUserImg)
					return;

			var userImg = EXT_SESSION.myLogo?EXT_SESSION.myLogo:"/images/icon/defaultImage.gif";
			var html = "<div class='userImg'><img src='"+userImg+"'/></div>";

			this.writeAreaEl.insertHtml("afterBegin", html);
	},

	makeForm : function(memo, grade){
		var form, mode, gradeName, targetUserId;
		form = document.createElement("form");
		targetUserId = GROUP_FLAG?PAGE_USER_ID:null;

		if(this.isModify)
		{
				gradeName = "read_grade";
				mode = "modify";
				form.innerHTML += "<input type='hidden' name='item_id' value='"+this.modifyData.item_id+"'/>";
		}
		else
		{
				gradeName = "grade";
				mode = "add";
		}

		if(targetUserId && this.currentCtrlName != "review")
				form.innerHTML += "<input type='hidden' name='target_user_id' value='"+targetUserId+"'/>";

		form.innerHTML += "<input type='hidden' name='model' value='log'/>";
		form.innerHTML += "<input type='hidden' name='view' value='json'/>";
		form.innerHTML += "<input type='hidden' name='memo' value='"+memo+"'/>";
		form.innerHTML += "<input type='hidden' name='"+gradeName+"' value='"+grade+"'/>";
		form.innerHTML += "<input type='hidden' name='mode' value='"+mode+"'/>";
		form.innerHTML += "<input type='hidden' name='user_id' value='"+EXT_SESSION.getID()+"'/>";

		return form;
	},

	makeContentsCtrl : function(category)
	{
		var ctrl;

		if(!this.resultCtrl) this.resultCtrl = new Mys.ResultCtrl(this.writeBox);

		ctrlName = category.charAt(0).toUpperCase()+category.substring(1)+"ContentsCtrl";

		ctrl = new Mys[ctrlName](this.resultCtrl, this.writeBox.child(".typeBox"));

		//ctrl.on("select", this.setContentsItem, this);

		this.contentsCtrl[category] = ctrl;

		return this.contentsCtrl[category];
	},

/*	setContentsItem : function(item, category, tpl)
	{
		var currentCtrl = this.getContentsCtrl(this.currentCtrlName);
		currentCtrl.hideBox();

		this.currentCtrlName = null;

		this.contentsItem = item;
		this.contentsCategory = category;

		if(!this.contentsBoxEl) this.contentsBoxEl = this.writeAreaEl.insertHtml("afterBegin", "<div class='contentsBox'></div>", true);

		this.contentsBoxEl.update(tpl.apply(item));

		this.contentsBoxEl.setStyle("display", "block");
	},*/

	setMemo : function(memo)
	{
			this.memoEl.dom.value = memo;
	},

	setGrade : function(grade)
	{
		this.selectedGrade = grade;
	},

	setGradeName : function(grade)
	{
			if(!this.gradeBtnEl)
					return;

			var gradeText = this.getGradeText(grade);

			this.gradeBtnEl.update(gradeText);
	},

	showLoginBox : function()
	{
			alert("로그인을 하신 후 글을 작성 할 수 있습니다");

			var loginBoxEl = Ext.get("loginBox");
			loginBoxEl.removeClass("none");
			loginBoxEl.child(".userId").focus();
	},

	getCurrentContentsCtrl : function()
	{
			if(!this.currentCtrlName)
					return;

			return this.getContentsCtrl(this.currentCtrlName);
	},

	checkContents : function()
	{
			var ctrl, item;

			if(!(ctrl = this.getCurrentContentsCtrl()))
					return true;

			return ctrl.isSet();
	},

	getContents : function()
	{
			var ctrl, item;
			if(!(ctrl = this.getCurrentContentsCtrl()))
					return "";

			item = ctrl.getSelectedItem();

			return (item)?this.getContentsParam(item, this.currentCtrlName):"";
	},

	getContentsParam : function(item, category)
	{
		var param = "";
		var exceptArr;

		switch(category)
		{
			case "photo" :
					exceptArr = ["id"];
				break;

			case "book" :
			case "movie" :
			case "shop" :
			case "video" :
			case "music" :
					exceptArr = ["price", "discount", "pointView", "pointHtml", "author"];

				if(item.point == "is_wish")
				{
					item.is_wish = 1;
					exceptArr.push("point");
				}
				break;

			case "link" :
					exceptArr = [];
					break;

			case "review" :
					exceptArr = ["pointView", "pointHtml", "imageHtml", "category", "contents_id"];
			
				if(item.point == "is_wish")
				{
					item.is_wish = 1;
					exceptArr.push("point");
				}
							
					category = this.getCurrentContentsCtrl().category;
					
					param += "<input type='hidden' name='publish' value='1'/>";
					break;
			default :
					exceptArr = [];
					break
		}

		exceptArr.push("el");
		exceptArr.push("imageFlag");
		exceptArr.push("parsed");

		for(var instance in item)
		{
			if(exceptArr.indexOf(instance) != -1)
				continue;
					
			param += "<input type='hidden' name='"+instance+"' value='"+item[instance]+"'/>";
		}

		category = Mys.getContentsCategoryId(category);

		param += "<input type='hidden' name='contents_category' value='"+category+"'/>";
		
		return param;
	},

	getContentsCtrl : function(name){
		return this.contentsCtrl[name];
	},

	getGradeText : function(grade){
		var gradeText;

		switch(parseInt(grade)){
			case 9 :
				gradeText = "전체공개";
				break;
			case 8 :
				gradeText = "채널공개";
				break;

			case 1 :
				gradeText = "친구공개";
				break;

			default :
				gradeText = "비공개";
				break;
		}
		return gradeText;
	},

	getMemo : function(){
		return this.memoEl.dom.value;
	},

	getImage : function(){
			return this.getContentsCtrl("photo").getImage();
	},

	getGradeInfo : function(className){
			var grade, gradeText;
			switch(className){
					case "public" :
						grade = 9;
						gradeText = "전체공개";
						break;

					case "group":
						grade = 8;
						gradeText = "채널공개";
						break;

					case "friend" :
						grade = 1;
						gradeText = "친구공개";
						break;

					case "private" :
						grade = 0;
						gradeText = "비공개";
						break;

					default :
						grade = null;
						break;
			}

			return {grade : grade, gradeText : gradeText};
	},

	removeSelect : function(el)
	{
			if(!el)
					return;

			el.innerHTML = el.innerHTML.replace("_hover", "");
			//Ext.fly(el).removeClass("select");
	},

	addSelect : function(el)
	{
			if(!el)
					return;

			el.innerHTML = el.innerHTML.replace(".png", "_hover.png");
			//Ext.fly(el).addClass("select");
	},

	hasContentsCtrl : function(category){
			if(!category)
				return false;

			var hasCtrl = false;

			if(typeof(this.contentsCtrl[category]) != "undefined")
				hasCtrl = true;

			return hasCtrl;
	},

	onClickContentsBtn : function(evt, t)
	{
			/*if(!EXT_SESSION.isLog())
			{
					this.showLoginBox();
					return;
			}*/

			while(t.tagName != "A")
					t = t.parentNode;

			if(!t.className || this.isModify)
				return;

			var ctrlName = t.className.replace(/select|last/gi, "").trim();

			// exception
			if(this.currentCtrlName == ctrlName)
					return;

			// change background
			this.removeSelect(this.currentCtrlEl);
			this.addSelect(t);

			// hide contentsBox
			if(this.currentCtrlName && this.currentCtrlName != "text")
			{
				var currentCtrl = this.getContentsCtrl(this.currentCtrlName);
				currentCtrl.hideBox();
			}

			// set value
			this.currentCtrlName = ctrlName;
			this.currentCtrlEl = t;

			// text는 ctrl 생성을 하지 않는다.
			if(ctrlName == "text")
					return;

			// make contentsCtrl
			if(!this.hasContentsCtrl(ctrlName)) this.makeContentsCtrl(ctrlName);

			// show contentsBox
			var ctrl = this.getContentsCtrl(ctrlName);
			ctrl.toggleBox();
	},

	onClickModify : function(obj){

		if(this.writeToggleFlag) this.hide();

		this.isModify = true;

		var modifyData = {};

		Ext.apply(modifyData, obj.data);

		if(!this.modifyImageArr)
			this.modifyImageArr = new Ext.util.MixedCollection(false, function(item){return item.uploadNo});

		modifyData.memo = modifyData.memo.replace(/<br\/>|<br>/gi, "\n");
		modifyData.grade = modifyData.grade?modifyData.grade:0;

		// 공개설정 변경 확인을 위해 수정할 시에 저장. 그리 크지 않음으로 전체를 저장함.
		this.modifyData = modifyData;
		this.modifyData.el = obj.el;

		var itemEl = obj.el;
		
		if(obj.contentsName) this.modifyContentsEl = itemEl.child(obj.contentsName);
		
		this.modifyMemoEl = itemEl.child(obj.memoName);
		this.modifyNaviEl = itemEl.child(obj.naviName);
		this.modifyReplyEl = itemEl.child(obj.replyName);

		this.show();

		this.setMemo(modifyData.memo);
		this.setGrade(modifyData.grade);
		this.setGradeName(this.selectedGrade);
	},

	onClickGrade : function(evt, t){
				if(!t || !t.className)
						return;

				var className = t.className;

				var gradeInfo = this.getGradeInfo(className);

				this.setGrade(gradeInfo.grade);

				this.setGradeName(gradeInfo.grade);
	},

	onClickListBtn : function(evt, t, obj){
		if(!obj.el.isVisible())
		{
			obj.el.removeClass("none");
			obj.el.alignTo(t, "bl", [0, 0]);
			(function(obj){Ext.fly(document.body).on("click", this.onClickListBtn, this, obj)}).defer(100, this, [obj]);
		}
		else
		{
			Ext.fly(document.body).un("click", this.onClickListBtn);
			obj.el.addClass("none");
		}
	},

	// 상단 글쓰기 버튼 클릭시
	onClickWriteBtn : function()
	{
			if(this.isModify)
			{
				this.hide();
				this.show();
			}
			else
				this.writeToggle();
	},

	// 글 쓰기 클릭시
	onClickSubmitBtn : function()
	{
		if(!EXT_SESSION.isLog())
		{
				this.showLoginBox();
				return;
		}

		var memo = "", grade, parser;

		if(this.loadingFlag){alert("현재 처리 중입니다. 잠시만 기다려주세요"); return}

		if(!(memo = this.getMemo())){alert("내용을 입력해주세요"); this.memoEl.dom.focus(); return}

		if((grade = this.selectedGrade) == null){alert("공개설정을 선택해주세요"); return}

		if(!this.checkContents()){return}

		memo = this.replaceMemo(memo);

		this.write(memo, grade);
	},

	write : function(memo, grade){
		var form,ctrl;

		form = this.makeForm(memo, grade);

		form.innerHTML += this.getContents();

		this.loadingFlag = true;
		this.showLoading();

		Global.modelLogItem.formCreate(form, true, this.cbWrite, this);

	/*	if(this.isModify && this.modifyData.grade != this.selectedGrade && this.modifyImageArr.length != 0){
			this.modifyImage();
		}
		else
						*/
	},

	// 글쓰기 콜백 함수
	cbWrite : function(data){
		this.loadingFlag = false;
		if(!data || data.response.code != 100){alert(data.response.message); return}

		this.hideLoading();

		var logItems = Mys.getSafeArray(data.response.item);
		var contents = data.response.contents;

		if(!this.useFix)
		{
			this.hide();
		}
		else
		{
			this.removeVar();
			this.setVar();
		}
		this.fireEvent("write", logItems, contents);
	},

	// 쓰기창 열고 닫기
	writeToggle : function(el,t,option){

		if(this.writeToggleFlag)
		{
			this.hide();
		}
		else
		{
			this.show();
		}
	},

	show : function()
	{
			if(!this.writeBox) this.make();

			// write Form 위치 변경
			if(this.isModify)
			{
				this.writeBox.addClass("modify");

				if(this.modifyReplyEl && this.modifyReplyEl.isDisplayed())
					this.modifyReplyEl.setStyle("display", "none");

				if(this.modifyContentsEl)
						this.modifyContentsEl.setStyle("display", "none");

				this.modifyNaviEl.setStyle("display", "none");
				this.modifyMemoEl.setStyle("display", "none");

				var parentEl = this.writeBox.parent("div.item");

				if(!parentEl || parentEl.id != this.modifyData.el.id)
				{
					this.writeBox.insertBefore(this.modifyMemoEl);
				}

				// 수정, 취소 버튼 set
				if(!this.writeModifyBtnEl || !this.writeCancelBtnEl)
				{
						this.writeModifyBtnEl = this.writeBox.child(".writeModifyBtn");
						this.writeCancelBtnEl = this.writeBox.child(".writeCancelBtn");

						this.writeModifyBtnEl.on("click", this.onClickSubmitBtn, this);
						this.writeCancelBtnEl.on("click", this.hide, this);
				}

				this.writeModifyBtnEl.setStyle("display", "inline");
				this.writeCancelBtnEl.setStyle("display", "inline");
				this.writeSaveBtnEl.setStyle("display", "none");

				this.writeBox.child(".typeBox").setStyle("display", "none");
			}
			else
			{
				this.writeBox.removeClass("modify");

				this.writeBox.insertBefore(this.containerEl);

				if(this.writeModifyBtnEl && this.writeCancelBtnEl)
				{
					this.writeModifyBtnEl.setStyle("display", "none");
					this.writeCancelBtnEl.setStyle("display", "none");
				}
				this.writeSaveBtnEl.setStyle("display", "inline");
				this.writeBox.child(".typeBox").setStyle("display", "block");
			}

			this.writeBox.show();

			if(EXT_SESSION.isLog() && !GROUP_FLAG)
				this.memoEl.dom.focus();

			this.setVar();

			this.writeToggleFlag = true;
	},

	hide : function(){
			this.writeBox.setStyle("display", "none");

			if(this.isModify)
			{
				this.modifyNaviEl.setStyle("display", "block");
				this.modifyMemoEl.setStyle("display", "block");

				if(this.modifyContentsEl)
						this.modifyContentsEl.setStyle("display", "block");
			}

			this.writeToggleFlag = false;
			this.isModify = false;

			this.removeVar();
	},

	showLoading : function(){
		if(!this.loadingEl)
		{
			var insertEl = this.writeBox.child(".btn");
			if(!insertEl) return;

			this.loadingEl = insertEl.insertHtml("beforeEnd", "<li><img class='loading' src='./images/icon/loading_write.gif' title='로딩 중...' alt='로딩 중...'/></li>", true);
		}
		this.loadingEl.fadeIn({useDisplay:true});
	},

	hideLoading : function(){
		if(!this.loadingEl){
		//	window.status = '내부 오류 603';
			return;
		}

		this.loadingEl.fadeOut({useDisplay:true});
	},

	replaceMemo : function(memo){
		if(this.mode == "greeting") memo = "[" + EXT_SESSION.getName() + "님의 첫글입니다.] " + memo;

		 return memo.replace(/\n/gi, "<br>").encodeSP();
	}
});


// contents result box
Mys.ResultCtrl = function(container){
	this.init(container);
	this.addEvents({
		'nextlist' : true,
		'prevlist' : true,
		'selectItem' : true,
		'changePoint' : true,
		'changeAgree' : true
	});
}


  Ext.extend(Mys.ResultCtrl, Ext.util.Observable,
  {
    template : 	'<div class="resultBox">'+
				  				'<div class="itemBox">'+
									'</div>'+

									'<div class="navi">'+
										'<a href="#" onclick="return false" class="prev"><img src="/images/icon/btn_navi_contents_prev.gif" alt="이전"/></a>'+
										'<span class="page"></span>'+
										'<a href="#" onclick="return false" class="next"><img src="/images/icon/btn_navi_contents_next.gif" alt="이전"/></a>'+
									'</div>'+

									'<div class="detail">'+
				  				'</div>'+
								'</div>',

    init : function(container)
    {
    	this.container = container;
    	this.resultBoxEl = container.child(".writeAreaBox").insertHtml("beforeBegin", this.template, true);

      this.itemBoxEl = this.resultBoxEl.child(".itemBox");
			this.pageEl = this.resultBoxEl.child(".page");
			this.detailBoxEl = this.resultBoxEl.child(".detail");

      this.resultBoxEl.child(".prev").on("click",this.goPrevPage, this);
      this.resultBoxEl.child(".next").on("click",this.goNextPage, this);
    },

    showItems : function(category, tpl, getItems, totalPage, curPage, contentsEl)
    {
    	var el = null;
    	this.selectedItem = null;
      this.category = category;
      this.totalPage = totalPage;

			this.initResult();

			this.show(contentsEl);

			this.setPage(curPage, totalPage?totalPage:1);

      if(typeof(getItems) == "undefined" || getItems == null || getItems.length == 0){
      	this.itemBoxEl.insertHtml("beforeEnd", "<p>검색 결과가 없습니다</p>");
        return;
			}

      var items = (getItems instanceof Array) ? getItems : [getItems];
			var length = items.length;
      for(var i = 0; i < length; i++)
      {
      	//alert(tpl.apply(items[i]));
      	el = Ext.get(this.itemBoxEl.insertHtml("beforeend",tpl.apply(items[i])), true);
      	items[i].el = el;
      	el.on("click",this.onSelectItem, this, items[i]);

      	if(i == length - 1)
      			el.addClass("last");
      }
    },

		show : function(contentsEl)
		{
			// 위치 이동
			this.resultBoxEl.insertAfter(contentsEl);
			this.resultBoxEl.setStyle("display", "block");
		},

		showDetailBox : function()
		{
				this.detailBoxEl.setStyle("display", "block");
		},

		hide : function()
		{
			this.initResult();

			this.resultBoxEl.setStyle("display", "none");
		},

		hideDetailBox : function()
		{
				this.detailBoxEl.setStyle("display", "none");

				this.container.un(Ext.isIE?"click":"change", this.onClickAgree);
		},

		initResult : function()
		{
      this.itemBoxEl.update("");
      this.detailBoxEl.update("");

      this.hideDetailBox();
		},

    showDetailItem : function(item, tpl)
    {
				if(item === null || tpl === null)
					return;

				this.container.un(Ext.isIE?"click":"change", this.onClickAgree);

				this.detailBoxEl.update("");
				// detail item insert
				this.detailBoxEl.insertHtml("beforeEnd", tpl.apply(item));

				// select button insert
				//var selectEl = this.detailBoxEl.insertHtml("beforeEnd", this.selectTemplate, true);
				//selectEl.on("click", this.onSelectDetailItem, this, item);

				// if item uses point, point event set
				this.starBtnEl = this.detailBoxEl.child(".star a");
				if(this.starBtnEl)
				{
						var starListEl = this.detailBoxEl.child("ul.starList");
						starListEl.on("click", this.onClickStar, this, item);

						this.starBtnEl.on("click",  this.onClickListBtn, this, {el : starListEl});
				}

				// 추천
				this.agreeEl = this.detailBoxEl.child(".agree");

				if(this.agreeEl)
				{
						this.agreeEl.setStyle("display", "none");
						this.agreeEl.on(Ext.isIE?"click":"change", this.onClickAgree, this, item);
				}

				this.showDetailBox();
    },

		setPage : function(curPage, totalPage)
		{
				curPage = curPage || 1;
				totalPage = totalPage || 1;

				this.pageEl.update(curPage+" / "+totalPage);
		},

    goNextPage : function()
    {
			this.fireEvent("nextlist", this.totalPage, this.category);
    },

    goPrevPage : function()
    {
      this.fireEvent("prevlist", this.totalPage, this.category);
    },

    onSelectItem : function(evt, t, item)
    {
    	this.fireEvent("selectItem", item, this.category);
		
    	// change background
    	if(this.selectedItem)	this.selectedItem.removeClass("select");
    	item.el.addClass("select");

    	this.selectedItem = item.el;
    },

		onClickListBtn : function(evt, t, obj)
		{
			if(!obj.el.isVisible())
			{
				while(t.tagName != "A")
						t = t.parentNode;

				obj.el.removeClass("none");
				obj.el.alignTo(t, "bl", [0, 0]);
				(function(obj){Ext.fly(document.body).on("click", this.onClickListBtn, this, obj)}).defer(100, this, [obj]);
			}
			else
			{
				Ext.fly(document.body).un("click", this.onClickListBtn);
				obj.el.addClass("none");
			}
		},

		onClickAgree : function(evt, t, item)
		{
				if(typeof(t.value) == "undefined" || t.value == null || t.name != "agree")
						return;

				var agree = t.value;

				this.fireEvent("changeAgree", item, this.category, agree);
		},

		onClickStar : function(evt, t, item)
		{
				var agree;

				if(!t || t.tagName == "LI" || t.tagName == "UL")
						return;

				while(t.tagName != "A")
						t = t.parentNode;

    		var point = t.className.replace("star_", "");
    		var str = t.innerHTML;


    		this.fireEvent("changePoint", item, this.category, point);

				str = "<strong class='star_"+point+"'>"+str+"</strong>";

				this.starBtnEl.update(str);

				//Agree Set
				if(point >= 8 || point == "is_wish")
				{
						this.container.dom.agree[0].checked = true;
						agree = 1;
				}
				else
				{
						this.container.dom.agree[1].checked = true;
						agree = 2;
				}

	 			this.fireEvent("changeAgree", item, this.category, agree);
	 			this.agreeEl.setStyle("display","block");
		}
    /*onSelectDetailItem : function(evt, t, item)
    {
    	this.fireEvent("selectDetailItem", item, this.category);
    },*/
  });


// contentsCtrl
Mys.ContentsCtrl = function(config){
	this.initialize(config);

	this.addEvents({'selectItem' : true});
}

Ext.extend(Mys.ContentsCtrl, Ext.util.Observable, {
  start : 1,
  LIMIT : 5,
  MAX_PAGE : 10,
  curPage : 1,
  tpl : null,
  alt : null,
  orderby : null,
  category : null,
  resultCtrl : null,
  usePoint : false,
  searchTemplate : new Ext.Template('<div id="{boxName}" class="contentsBox {className}"><label for="keyword" class="subject">{subject}</label><input type="text" class="keyword input"/><a href="#" class="searchBtn" onclick="return false"><img src="/images/icon/btn_contents_search.gif" alt="검색"/></a></div>'),

	initialize : function(config)
	{
		this.isVisible = false;

		if(!Global.modelContents)
			Global.modelContents = new Mys.Model.Contents;
		var container = config.container;

		this.boxEl = container.insertHtml(config.where?config.where:"afterEnd", this.searchTemplate.apply({className : config.className, boxName : config.boxName, subject : config.subject}), true);

		this.keywordEl = this.boxEl.child(".keyword");
		this.searchBtnEl = this.boxEl.child(".searchBtn");

		this.keywordEl.addKeyListener(Ext.EventObject.ENTER, this.onSearch, this);

		this.searchBtnEl.on("click", this.onSearch, this);

		this.resultCtrl.on("nextlist", this.nextList, this);
		this.resultCtrl.on("prevlist", this.prevList, this);

		this.resultCtrl.on("selectItem", this.selectItem, this);
		//this.resultCtrl.on("selectDetailItem", this.selectDetailItem, this);
	},

	onSearch : function(evt, t)
	{
		var keyword = this.keywordEl.dom.value;
		this.curPage = 1;
		this.start = 1;
		this.savedKeyword = keyword;

		if(!keyword){alert("검색할 내용을 입력해주세요"); return;}

		this.search(keyword);
	},

  search : function(keyword)
  {
  	var category = Mys.getContentsCategoryId(this.category);

		Global.modelContents.search(keyword, category, this.start, this.LIMIT, this.alt, this.orderby, this.cbSearch, this);
  },

	cbSearch : function(data)
	{
		var datas = this.getItems(data); // item 배열과 item total개수를 받는다.
		this.resultCtrl.showItems(this.category, this.tpl, datas.items, Math.ceil(datas.total/this.LIMIT), this.curPage, this.searchBtnEl);
	},

  getItems : function()
  {
      //override
  },

  getSelectedItem : function()
  {
			return this.selectedItem;
  },

	isUsePoint : function()
	{
			return this.usePoint;
	},

	isSet : function() // override
	{
			//override
	},

  reset : function()
  {
  		this.selectedItem = null;

  		if(this.keywordEl)
				this.keywordEl.dom.value = "";
  },

	toggleBox : function()
	{
		this.isVisible?this.hideBox():this.showBox();
	},

	showBox : function()
	{
		this.isVisible = true;
		this.boxEl.setStyle("display", "block");

		if(this.keywordEl)
			this.keywordEl.dom.focus();
	},

	hideBox : function()
	{
		this.isVisible = false;

		this.reset();
		this.boxEl.setStyle("display", "none");
		this.resultCtrl.hide();
	},

	nextList : function(totalPage, category)
	{
		if(this.category != category) return;

		this.curPage++;
		if(this.curPage > totalPage){ this.curPage--; return;}
		this.start = (this.curPage-1)*this.LIMIT+1;
		this.search(this.savedKeyword);
	},

	prevList : function(totalPage, category)
	{
		if(this.category != category) return;

		this.curPage--;
		if(this.curPage <=0) {this.curPage = 1; return;}
		this.start = (this.curPage-1)*this.LIMIT+1;
		this.search(this.savedKeyword);
	},

  selectItem : function(item, category)
  {
		if(this.category != category) return;

		if(!this.detailTpl) return;

		this.selectedItem = item;

		this.resultCtrl.showDetailItem(item, this.detailTpl);
  }

  /*selectDetailItem : function(item, category)
  {
		if(this.category != category) return;

  	this.fireEvent("select", item, category, this.detailTpl);
  }*/
});

Mys.TabContentsCtrl = function(config)
{
	Mys.TabContentsCtrl.superclass.constructor.call(this, config);
}

Ext.extend(Mys.TabContentsCtrl, Mys.ContentsCtrl,
{

	initialize : function(config)
	{
		this.isVisible = false;

		if(!Global.modelContents)
			Global.modelContents = new Mys.Model.Contents;

		var container = config.container;

		this.boxEl = container.insertHtml("afterEnd", this.searchTemplate.apply({boxName : config.boxName}), true);

		this.boxEl.select(".tab a").on("click", this.onClickTab, this);

		this.ctrl = {};
	},

	isSet : function()
	{
			var ctrl = this.getCurrentCtrl();

			return ctrl.isSet();
	},

	reset : function()
	{
			for(var name in this.ctrl) this.ctrl[name].reset();
	},

	onClickTab : function(evt, t)
	{
		if(t.tagName == "IMG")
				t = t.parentNode;
		this.showCtrl(t.className.trim(), t, false);
	},

	showBox : function()
	{
		Mys.TabContentsCtrl.superclass.showBox.call(this);

		this.showCtrl(this.defaultClass, this.boxEl.child("a."+this.defaultClass, false));
	},

	hideBox : function()
	{
		Mys.TabContentsCtrl.superclass.hideBox.call(this);
	},

	getSelectedItem : function()
	{
			var ctrl = this.getCurrentCtrl();

			return ctrl.getSelectedItem();
	},

	getCtrlName : function(className)
	{
			// override
	},

	getCtrl : function(ctrlName)
	{
			return this.ctrl[ctrlName];
	},

	getCurrentCtrl : function()
	{
			return this.getCtrl(this.currentCtrlName);
	},

	showCtrl : function(className, t)
	{
			var ctrl, ctrlName;

			// className이 잘못되었거나, 같은 것을 클릭했을 경우 종료.
			if(!(ctrlName = this.getCtrlName(className)) || this.currentCtrlName == ctrlName)
				return;

			// change Back Ground
			if(this.currentCtrlEl)
			{
					Ext.fly(this.currentCtrlEl).removeClass("select");
					this.getCurrentCtrl().hideBox();
			}
			Ext.fly(t).addClass("select");

			if(!this.hasCtrl(ctrlName)) this.makeCtrl(ctrlName);

			ctrl = this.getCtrl(ctrlName);

			ctrl.showBox();

			this.currentCtrlName = ctrlName;
			this.currentCtrlEl = t;
	},

	hasCtrl : function(ctrlName)
	{
			return (this.ctrl[ctrlName])?true:false;
	},

	makeCtrl : function(ctrlName)
	{
			this.ctrl[ctrlName] = new Mys[ctrlName](this.resultCtrl, this.boxEl);
	}
});


Mys.VideoContentsCtrl = function(resultCtrl, container)
{
  this.resultCtrl = resultCtrl;
	var config = {boxName : "videoContentsBox", container : container};

	Mys.VideoContentsCtrl.superclass.constructor.call(this, config);
}

Ext.extend(Mys.VideoContentsCtrl, Mys.TabContentsCtrl,
{
	defaultClass : "youtube",
	searchTemplate : new Ext.Template('<div class="contentsBox" id="videoContentsBox">' +
																		'<div class="tab">'+
																			'<a href="#" onclick="return false" class="youtube"><img src="/images/icon/tab_youtube.png" class="png24"/></a>'+
																	/*		'<a href="#" onclick="return false" class="url"><img src="/images/icon/tab_url.png" class="png24"/></a>'+*/
																		'</div>'),

	getCtrlName : function(className)
	{
			var ctrlName = "";

			switch(className)
			{
					case "youtube" :
							ctrlName = "VideoYoutubeContentsCtrl";
							break;

					case "url" :
							ctrlName = "VideoUrlContentsCtrl";
							break;

					default :
							break;
			}

			return ctrlName;
	}
	
});

Mys.VideoUrlContentsCtrl = function(resultCtrl, container){
  this.resultCtrl = resultCtrl;
	var config = {container : container};

	Mys.VideoUrlContentsCtrl.superclass.constructor.call(this, config);
}

Ext.extend(Mys.VideoUrlContentsCtrl, Mys.ContentsCtrl, {
	TYPE_YOUTUBE : 0,
	category : "video",
	searchTemplate : new Ext.Template('<div class="videoUrl">' +
																			'<p>' +
																				'<label for="url" class="subject">동영상 주소</label> <input type="text" class="url input" name="url" value="youtube 동영상 주소를 입력해주세요"/><a id="ext-gen138" class="confirmBtn" onclick="return false" href="#"><img alt="확인" src="/images/icon/btn_contents_search.gif"/></a>'+
																			'</p>' +
																			'<p class="preview">' +
																			'</p>' +
																		'</div>'),

	youtubeTpl : 	new Ext.Template('<div class="itemContents">' +
																	'<p>'+
																		'<embed height="225" width="300" wmode="transparent" type="application/x-shockwave-flash" src="http://www.youtube.com/v/{videoId}?f=videos&app=youtube_gdata&autoplay=0" wmode="transparent"/>'+
																	'</p>'+
																	'</div>'),


	initialize : function(config)
	{
		this.isVisible = false;

		if(!Global.modelContents)
			Global.modelContents = new Mys.Model.Contents;

		var container = config.container;

		this.boxEl = container.insertHtml("beforeEnd", this.searchTemplate.apply(), true);

		this.urlEl = this.boxEl.child("input.url");
		this.urlEl.on("focus", this.onFocusUrl, this);

		this.previewEl = this.boxEl.child("p.preview");

		this.boxEl.child("a.confirmBtn").on("click", this.onClickConfirm, this);
	},

	checkUrl : function(value)
	{
			var type, result = false;
			var start, last;
			if(typeof(value) != "string")
					return false;

			if(value.indexOf("youtube") != -1)
			{
				type = this.TYPE_YOUTUBE;
			}
			/*else if() // 추가 url
			{
			}*/

			switch(type)
			{
					case this.TYPE_YOUTUBE :
							if(value.indexOf("v=") != -1)
								result = true;

							this.type = this.TYPE_YOUTUBE;
							break;
			}

			return result;
	},
	reset : function()
	{
			Mys.VideoUrlContentsCtrl.superclass.reset.call(this);

			this.urlEl.dom.value = "youtube 동영상 주소를 입력해주세요";
			this.urlEl.on("focus", this.onFocusUrl, this);

			this.previewEl.update("");
			this.previewEl.setStyle("display", "none");
	},

	onFocusUrl : function(evt, t)
	{
			this.urlEl.dom.value = "";
			this.urlEl.un("focus", this.onFocusUrl, this);
	},

	onClickConfirm : function(evt, t)
	{
			if(!this.isSet())
						return;

  		var videoId;
  		var item = {};
  		var value = this.urlEl.dom.value;

  		switch(this.type)
  		{
  				case this.TYPE_YOUTUBE :
  						item.videoId = this.getYoutubeId(value);
  						item.image = "http://img.youtube.com/vi/"+item.videoId+"/2.jpg";
  						alert(this.youtubeTpl.apply(item));
  						this.previewEl.insertHtml("beforeEnd", "");
  						break;
  		}

  		this.previewEl.setStyle("display", "block");
  		this.selectedItem = item;
	},

	isSet : function()
	{
			if(!this.urlEl.dom.value)
			{
					alert("동영상 주소를 입력해주세요");
					return false;
			}

			if(!this.checkUrl(this.urlEl.dom.value))
			{
					alert("정확한 동영상 주소를 입력해주세요");
					return false;
			}

			return true;
	},

	getYoutubeId : function(value)
	{
  		var first, last, result;

			first = value.indexOf("v=");

			if(first == -1)
					return "";

			first += 2;
			last = value.indexOf("&", first);

			result = (last != -1)?value.substring(first, last):value.substring(first);

			return result;
	}
});


Mys.VideoYoutubeContentsCtrl = function(resultCtrl, container, config){
  this.resultCtrl = resultCtrl;

	if(!config)
		var config = {subject : "검색하실 동영상을 입력하세요", where : "beforeEnd", className : "youtube", container : container};

	Mys.VideoYoutubeContentsCtrl.superclass.constructor.call(this, config);
};

Ext.extend(Mys.VideoYoutubeContentsCtrl, Mys.ContentsCtrl, {
	LIMIT : 4,
	orderby : "relevance_lang_kr",
	alt : "atom",
	category : "video",
  searchTemplate : new Ext.Template('<div class="{className}"><label for="keyword" class="subject">{subject}</label><input type="text" class="keyword input"/><a href="#" class="searchBtn" onclick="return false"><img src="/images/icon/btn_contents_search.gif" alt="검색"/></a></div>'),
	tpl : new Ext.Template("<div class='item video'><p class='image'><img src='{image}' width='118' height='88'/></p><p class='title'>{title}</p></div>"),
	detailTpl : new Ext.Template('<div class="itemContents">' +
																	'<p>'+
																		'<embed height="225" width="300" wmode="transparent" type="application/x-shockwave-flash" src="http://www.youtube.com/v/{videoId}?f=videos&app=youtube_gdata&autoplay=0" wmode="transparent"/>'+
																	'</p>'+
																	'</div>'),

	getItems : function(data)
	{
			var entry = data.response.entry;

			if(!entry)
				return {items : null, total : 0};

			var total = data.response['openSearch:totalResults'];
			var length = entry.length;
			var items = [];
			var it = {};
			var item, pos;
			for(var i = 0; i < length; i++){
				item = entry[i];
			  it = {};
				it.title = item['title'];
				it.author = item['author']['name'];
				it.link = item['link']['0_attr']['href'];
				it.image = item['media:group']['media:thumbnail']['0_attr']['url'];
				it.description = item['media:group']['media:description'];

				if(item['gd:rating_attr'])
					it.userRating = item['gd:rating_attr']['average'];

				pos = item['id'].lastIndexOf("/");
				it.videoId = item['id'].substring(pos+1);

				items.push(it);
			}

			return {items: items, total : total};
	},

	isSet : function()
	{
			if(!this.selectedItem)
			{
						alert("동영상을 선택해주세요");
						return false;
			}

			return true;
	},
			
	getSelectedItem : function()
	{
			var item = this.selectedItem;
			
			if(item.link) item.link = encodeURIComponent(item.link);
			
			return item;
	}
});


//영화 검색
Mys.MovieContentsCtrl = function(resultCtrl, container){
	if(!resultCtrl || !container)
			return;
		
  this.resultCtrl = resultCtrl;
	var config = {subject : "검색하실 영화명을 입력하세요", boxName : "movieContentsBox", container : container};
	Mys.MovieContentsCtrl.superclass.constructor.call(this, config);
}

Ext.extend(Mys.MovieContentsCtrl, Mys.ContentsCtrl, {
	LIMIT : 5,
	category : "movie",
	tpl : new Ext.Template('<div class="item movie"><p class="image {imageFlag}">{imageHtml}</p><p class="title">{title}</p></div>'),
	usePoint : true,
	useAgree : true,
	detailTpl : null,

	detailHtml : '<div class="itemContents movie">'+
										'<p class="image {imageFlag}">{imageHtml}</p>'+
										'<dl>'+
												'<dd class="title"><a href="{link}" target="_blank">{title}</a></dd>'+
												'<dd>{director}</dd>'+
												'<dd>{pubdate}</dd>'+
												'<dd>{actor}</dd>'+
												'<dd class="point">'+
														'<p class="star selectBox">'+
															'<a href="#" onclick="return false">별점등록</a>'+
														'</p>'+
												'</dd>'+
												'<dd class="agree">'+
														'<input type="radio" name="agree" value="1" checked="true"/> <label for="agree" class="agreeUp">이 영화을 추천합니다</label><input type="radio" name="agree" value="2"/> <label for="agree" class="agreeDown">이 영화을 비추천합니다</label>'+
												'</dd>'+
										'</dl>'+

										'<ul class="starList list none">' +
											'<li><a href="#" class="star_10" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_9" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_8" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_7" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_6" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_5" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_4" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_3" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_2" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_1" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_0" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_is_wish" onclick="return false">보고싶어</a></li>' +
										'</ul>' +

							'</div>',


	initialize : function(config)
	{
			Mys.MovieContentsCtrl.superclass.initialize.call(this, config);

			this.detailTpl = new Ext.Template(this.detailHtml);

			this.resultCtrl.on("changePoint", this.changePoint, this);
			this.resultCtrl.on("changeAgree", this.changeAgree, this);
	},

	isSet : function()
	{
			if(!this.selectedItem)
			{
						alert("영화를 선택해주세요");
						return false;
			}

			if(this.usePoint && (typeof(this.selectedItem.point) == 'undefined' || this.selectedItem.point == ""))
			{
					alert("별점을 선택해주세요");
					return false;
			}
			return true;
	},

	getItems : function(data)
	{
		var items = Mys.getSafeArray(data.response.item);
		var total = data.response.total;
		var length = items?items.length:0;
		var item;
		for(var i = 0; i < length; i++)
		{
				item = items[i];

				if(item.image == null)
				{
						item.imageFlag = "notfound";
						delete item.image;
				}
				else
				{
						item.imageHtml = '<img src="'+item.image+'" height="136" width="92"/>';
				}
		}

		return {items : items, total : total};
	},

	selectItem : function(item, category)
	{
		if(this.category != category) return;

		if(!item.parsed)
		{
			//exception. actor & director 값 변경. 배우|배우|배우| -> 배우, 배우, 배우
			item.actor = (item.actor == null)?"":item.actor.substring(0, item.actor.length-1).replace(/\|/gi, ", ");
			item.director = (item.director == null)?"":item.director.substring(0, item.director.length-1).replace(/\|/gi, ", ");
			item.pubdate = item.pubDate;
			if(item.image) item.imageHtml = '<img src="'+item.image+'" height="156" width="108"/>';
			item.parsed = true;

			delete item.pubDate;
		}

		Mys.MovieContentsCtrl.superclass.selectItem.call(this, item, category);
	},

  getSelectedItem : function()
  {
  		var item = this.selectedItem;
  		//if(!this.detailTpl) return;

			// detailTpl을 공통으로 사용하기 위해 추가. combo box 들어가는 부분을 점수로 변경
			//var detailTpl = new Ext.Template(this.detailHtml.replace("pointHtml", "pointView"));

			item.pointView = (item.point == "is_wish")?"보고싶어":item.point;
			if(item.link) item.link = encodeURIComponent(item.link);

  		return item;
  },

  changePoint : function(item, category, point)
  {
  		if(!this.usePoint || !point)
  				return;

  		item.point = point;
  },

  changeAgree : function(item, category, agree)
  {
  		if(!this.useAgree || !agree)
  				return;

  		item.agree_type = agree;
  }
});

//책 검색
Mys.BookContentsCtrl = function(resultCtrl, container){
	if(!resultCtrl || !container)
			return;
	
  this.resultCtrl = resultCtrl;
	var config = {subject : "검색하실 도서명을 입력하세요", boxName : "bookContentsBox", container : container};
	
	Mys.BookContentsCtrl.superclass.constructor.call(this, config);
}

Ext.extend(Mys.BookContentsCtrl, Mys.ContentsCtrl, {
	LIMIT : 6,
	category : "book",
	tpl : new Ext.Template('<div class="item book"><p class="image {imageFlag}"><img src="{image}" height="109" width="73"><p class="title">{title}</p></div>'),
	usePoint : true,
	useAgree : true,
	detailTpl : null,
	detailHtml : '<div class="itemContents book">'+
									'<p class="image {imageFlag}"><img src="{image}" height="109" width="73"/></p>'+
									'<dl>'+
											'<dd class="title"><a href="{link}">{title}</a></dd>'+
											'<dd>{author}</dd>'+
											'<dd>{publisher}</dd>'+
											'<dd>{pubdate}</dd>'+
/*											'<dd>{description}</dd>'+*/
												'<dd class="point">'+
														'<p class="star selectBox">'+
															'<a href="#" onclick="return false">별점등록</a>'+
														'</p>'+
												'</dd>'+

												'<dd class="agree">'+
														'<input type="radio" name="agree" value="1" checked="true"/> <label for="agree" class="agreeUp">이 책을 추천합니다</label><input type="radio" name="agree" value="2"/> <label for="agree" class="agreeDown">이 책을 비추천합니다</label>'+
												'</dd>'+
										'</dl>'+

										'<ul class="starList list none">' +
											'<li><a href="#" class="star_10" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_9" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_8" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_7" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_6" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_5" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_4" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_3" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_2" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_1" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_0" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_is_wish" onclick="return false">보고싶어</a></li>' +
										'</ul>' +
								'</div>',

	initialize : function(config)
	{
			Mys.MovieContentsCtrl.superclass.initialize.call(this, config);

			this.detailTpl = new Ext.Template(this.detailHtml);

			this.resultCtrl.on("changePoint", this.changePoint, this);
			this.resultCtrl.on("changeAgree", this.changeAgree, this);
	},

	isSet : function()
	{
			if(!this.selectedItem)
			{
						alert("책을 선택해주세요");
						return false;
			}

			if(this.usePoint && (typeof(this.selectedItem.point) == 'undefined' || this.selectedItem.point == ""))
			{
					alert("별점을 선택해주세요");
					return false;
			}

			return true;
	},

	getItems : function(data)
	{
		var items = Mys.getSafeArray(data.response.item);
		var total = data.response.total;
		var length = items?items.length:0;
		var item;
		//var re = new RegExp("b(.[^\/b]*)\/b", "gi");

		for(var i = 0; i < length; i++){
				item = items[i];

				if(item.title !== null){

						item.title.stripTags();
						
			//		item.title = item.title.replace(re, "<b>$1</b>");
			//		item.title = item.title.replace(/amp;/gi, "");

					if(item.image == "http://bookimg.naver.com/book_imgno.gif")
					{
							delete item.image;
							item.imageFlag = "notfound";
					}
				}
		}

		return {items : items, total : total};
	},

	selectItem : function(item, category)
	{
		if(this.category != category) return;

		//exception
		//var re = new RegExp("b(.[^\/b]*)\/b", "gi");

		if(!item.parsed)
		{
			if(item.author !== null)
			{
					item.author.stripTags();
				//item.author = item.author.replace(re, "<b>$1</b>");
			}

			if(item.description !== null)
			{
					item.description.stripTags();
					
			//	item.description = item.description.replace(re, "<b>$1</b>");
			//	item.description = item.description.replace(/(lt;|gt;)/gi, "&$1");
			//	item.description = item.description.replace(/quot;/gi, "\"");
			}

			item.parsed = true;
		}

		Mys.BookContentsCtrl.superclass.selectItem.call(this, item, category);
	},

	getSelectedItem : function()
	{
			var item = this.selectedItem;

			item.title = item.title.replace(/<b>|<\/b>/gi, "");
			item.author = item.author.replace(/<b>|<\/b>/gi, "");
			item.description = item.description.replace(/<b>|<\/b>/gi, "");

			item.pointView = (item.point == "is_wish")?"읽고싶어":item.point;
			if(item.link) item.link = encodeURIComponent(item.link);
			
			return item;
	},

  changePoint : function(item, category, point)
  {
  		if(!this.usePoint || !point)
  				return;

  		item.point = point;
  },

  changeAgree : function(item, category, agree)
  {
  		if(!this.useAgree || !agree)
  				return;

  		item.agree_type = agree;
  }
});

//쇼핑 검색
Mys.ShopContentsCtrl = function(resultCtrl, container){
	if(!resultCtrl || !container)
			return;
	
  this.resultCtrl = resultCtrl;
	var config = {subject : "검색하실 상품명을 입력하세요", boxName : "shopContentsBox", container : container};
	Mys.ShopContentsCtrl.superclass.constructor.call(this, config);
}

Ext.extend(Mys.ShopContentsCtrl, Mys.ContentsCtrl, {
	LIMIT : 4,
	category : "shop",
	tpl : new Ext.Template('<div class="item shopping"><p class="image"><img src="{image}" height="118" width="118"/></p><p class="title">{title}</p></div>'),
	usePoint : true,
	useAgree : true,
	detailTpl : null,
	detailHtml : '<div class="itemContents shopping">'+
									'<p class="image"><img src="{image}" height="118" width="118"/></p>'+
									'<dl>'+
											'<dd class="title"><a href="{link}">{title}</a></dd>'+
											'<dd>최저가 : {lprice}</dd>'+
											'<dd>최고가 : {hprice}</dd>'+
											'<dd>{pointHtml}</dd>'+
												'<dd class="point">'+
														'<p class="star selectBox">'+
															'<a href="#" onclick="return false">별점등록</a>'+
														'</p>'+
												'</dd>'+

												'<dd class="agree">'+
														'<input type="radio" name="agree" value="1" checked="true"/> <label for="agree" class="agreeUp">이 상품을 추천합니다</label><input type="radio" name="agree" value="2"/> <label for="agree" class="agreeDown">이 상품을 비추천합니다</label>'+
												'</dd>'+
										'</dl>'+

										'<ul class="starList list none">' +
											'<li><a href="#" class="star_10" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_9" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_8" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_7" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_6" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_5" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_4" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_3" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_2" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_1" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_0" onclick="return false"><span></span></a></li>' +
											'<li><a href="#" class="star_is_wish" onclick="return false">갖고싶어</a></li>' +
										'</ul>' +
								'</div>',

	initialize : function(config)
	{
			Mys.MovieContentsCtrl.superclass.initialize.call(this, config);

			this.detailTpl = new Ext.Template(this.detailHtml);

			this.resultCtrl.on("changePoint", this.changePoint, this);
			this.resultCtrl.on("changeAgree", this.changeAgree, this);
	},

	isSet : function()
	{
			if(!this.selectedItem)
			{
						alert("물품을 선택해주세요");
						return false;
			}

			if(typeof(this.selectedItem.point) == 'undefined' || this.selectedItem.point == "")
			{
					alert("별점을 선택해주세요");
					return false;
			}

			return true;
	},

	getItems : function(data)
	{
		var items = Mys.getSafeArray(data.response.item);
		var total = data.response.total;
		var length = items?items.length:0;
		var item;
		//var re = new RegExp("b(.[^\/b]*)\/b", "gi");

		for(var i = 0; i < length; i++){
				item = items[i];

				if(item.title !== null){
					item.title.stripTags();
					//item.title = item.title.replace(re, "<b>$1</b>");
				}
		}

		return {items : items, total : total};
	},

	selectItem : function(item, category)
	{
		if(this.category != category) return;

		Mys.BookContentsCtrl.superclass.selectItem.call(this, item, category);
	},

	getSelectedItem : function()
	{
			var item = this.selectedItem;
			item.pointView = (item.point == "is_wish")?"사고싶어":item.point;
			if(item.link) item.link = encodeURIComponent(item.link);
			
			return item;
	},
  /*selectDetailItem : function(item, category)
  {
  		if(this.category != category)
  				return;

  		if(!this.detailTpl) return;

			// detailTpl을 공통으로 사용하기 위해 추가. combo box 들어가는 부분을 점수로 변경
			var detailTpl = new Ext.Template(this.detailHtml.replace("pointHtml", "pointView"));



  		this.fireEvent("select", item, category, detailTpl);
  },*/

  changePoint : function(item, category, point)
  {
  		if(!this.usePoint || !point)
  				return;

  		item.point = point;
  },

  changeAgree : function(item, category, agree)
  {
  		if(!this.useAgree || !agree)
  				return;

  		item.agree_type = agree;
  }
});

/*
	사진 검색, tab 구조.
*/
Mys.PhotoContentsCtrl = function(resultCtrl, container, config)
{
  this.resultCtrl = resultCtrl;
  
  if(!config)
		var config = {boxName : "photoContentsBox", container : container};

	Mys.PhotoContentsCtrl.superclass.constructor.call(this, config);
}

Ext.extend(Mys.PhotoContentsCtrl, Mys.TabContentsCtrl,
{
	defaultClass : "direct",
	searchTemplate : new Ext.Template('<div id="photoContentsBox" class="contentsBox">' +
																		'<div class="tab">'+
																			'<a href="#" onclick="return false" class="direct"><img src="/images/icon/tab_direct.png" class="png24"/></a>'+
																			'<a href="#" onclick="return false" class="url"><img src="/images/icon/tab_url.png" class="png24"/></a>'+
																		'</div>'+
																		'</div>'),

	removeImage : function()
	{
			// 직접 올릴 때만 삭제를 위해 처리
			if(this.currentCtrlName != "direct")
					return false;

			return this.getCurrentCtrl().removeImage();
	},

	hasImage : function()
	{
			// 직접 올릴 때만 삭제를 위해 처리
			if(this.currentCtrlName != "direct")
					return false;

			return this.getCurrentCtrl().hasImage();
	},

	getCtrlName : function(className)
	{
			var ctrlName = "";

			switch(className)
			{
					case "direct" :
							ctrlName = "PhotoDirectContentsCtrl";
							break;

					case "url" :
							ctrlName = "PhotoUrlContentsCtrl";
							break;

					default :
							break;
			}

			return ctrlName;
	}
});

Mys.PhotoDirectContentsCtrl = function(resultCtrl, container){
  this.resultCtrl = resultCtrl;
	var config = {boxName : "photoContentsBox", container : container};

	Mys.PhotoDirectContentsCtrl.superclass.constructor.call(this, config);
}

Ext.extend(Mys.PhotoDirectContentsCtrl, Mys.ContentsCtrl, {
	category : "photo",
	maxImageWidth : null,
	searchTemplate : new Ext.Template('<div class="direct">' +
																			'<p class="add">' +
																				'<span class="input imgName"></span>' +
																				'<a href="#" onclick="return false"><img src="/images/icon/btn_contents_image_add.png" class="png24" alt="찾아보기"/></a>' +
																			'</p>' +

																			'<p class="preview">'+
																			'</p>'+
																		'</div>'),

	tpl : new Ext.Template('<div class="item"><p>{title}</p><p><img src="{thumbnail}"/></p></div>'),
	detailTpl : new Ext.Template('<div class="item"><p><img src="{image}"/></p></div>'),


	initialize : function(config)
	{
		this.isVisible = false;

		if(!Global.modelContents)
			Global.modelContents = new Mys.Model.Contents;

		var container = config.container;

		this.boxEl = container.insertHtml("beforeEnd", this.searchTemplate.apply({boxName : config.boxName}), true);

		this.boxEl.child(".add").on("click", this.onClickUploadBtn, this);

		this.previewEl = this.boxEl.child(".preview");
		this.imgNameEl = this.boxEl.child(".imgName");
		this.uploadImage = null;
		this.removeImageArr = new Ext.util.MixedCollection(false, function(item){return item.id});
	},

	reset : function()
	{
			this.removeImage();

			this.previewEl.update("");
			this.imgNameEl.update("");

			this.previewEl.setStyle("display", "none");

			this.uploadImage = null;
	},

	addRemoveImage : function()
	{
		if(!this.uploadImage)
			return;

		this.removeImageArr.add(this.uploadImage);
		this.uploadImage = null;
	},

	removeImage : function(index)
	{
		index = index || 0;

		this.addRemoveImage();

		var removeImage = this.removeImageArr.items[index];

		if(removeImage)
			Global.FileServer.deleteFileWithFileNo(this.removeImageArr.items[index].uploadNo, function(data, index){if(!data || data.response.code != 100){alert(data.response.message); return} this.removeImage(++index)}, this, index);
		else
			this.removeImageArr.clear();
	},


	hasImage : function()
	{
			return this.removeImageArr.getCount() || this.uploadImage?true:false;
	},

	isSet : function()
	{
			if(!this.selectedItem)
			{
					alert("사진을 추가해주세요");
					return false;
			}

			return true;
	},

	applyImage : function(data)
	{
		var imageBoxEl, fileFullName, uploadNo;

		imageBoxEl = this.boxEl;
		fileSrc = Mys.getDownloadUrl(data.serverName, data.serverFileName, data.uploadNo);
		uploadNo = data.uploadNo;
		fileName = data.fileName;

		this.imgNameEl.update(fileName);

		this.changePrevImg(fileSrc);
		// 이미지 수정 시에
		if(this.uploadImage)
		{
			this.removeImageArr.add(this.uploadImage);
		}

		this.uploadImage = {};
		Ext.apply(this.uploadImage, {id : imageBoxEl.id, uploadNo : uploadNo, image : fileSrc});

		this.selectedItem = this.uploadImage;
	},

	changePrevImg : function(src, option)
	{
			if(!this.maxImageWidth)
				this.maxImageWidth = this.boxEl.getWidth();

			var script = "onload='if(this.width > "+this.maxImageWidth+"){this.width="+this.maxImageWidth+"}'";
			var html = "<img src='"+src+"' "+script+"/>";

			switch(option)
			{
			}

			this.previewEl.update(html);
			this.previewEl.setStyle("display", "block");
	},

	onClickUploadBtn : function(evt, t)
	{
		var address = "http://" + DOMAIN_FILE +"/upload_image.htm?type=item&user_id="+PAGE_USER_ID;

		Global.uploadFile.cb = this.applyImage;
		Global.uploadFile.scope = this;

		var height = Ext.isIE?181:174;

		this.uploadWin = window.open(address,'notify', 'toolbar=no,location=no,status=no,scrollbars=no,resizable=no,menubar=no, titlebar=no, width=396, height='+height);
	},

	getSelectedItem : function()
	{
			this.uploadImage = null;

			return this.selectedItem;
	}
  /*selectDetailItem : function()
  {
			var item = this.uploadImage;

  		var category = this.category;
  		var detailTpl = this.detailTpl;

  		this.fireEvent("select", item, category, detailTpl);
  } */
});

Mys.PhotoUrlContentsCtrl = function(resultCtrl, container){
  this.resultCtrl = resultCtrl;
	var config = {container : container};

	Mys.PhotoUrlContentsCtrl.superclass.constructor.call(this, config);
}

Ext.extend(Mys.PhotoUrlContentsCtrl, Mys.ContentsCtrl, {
	category : "photo",
	maxImageWidth : null,
	searchTemplate : new Ext.Template('<div class="photoUrl">' +
																			'<p>' +
																				'<label for="url" class="subject">사진 주소</label> <input type="text" class="url input" name="url" value="이미지의 URL을 입력해주세요"/> <a id="ext-gen138" class="confirmBtn" onclick="return false" href="#"><img alt="확인" src="/images/icon/btn_contents_confirm.gif"/></a>'+
																			'</p>' +
																			'<p class="preview">' +
																			'</p>' +
																		'</div>'),

	initialize : function(config)
	{
		this.isVisible = false;

		if(!Global.modelContents)
			Global.modelContents = new Mys.Model.Contents;

		var container = config.container;

		this.boxEl = container.insertHtml("beforeEnd", this.searchTemplate.apply(), true);

		this.urlEl = this.boxEl.child("input.url");
		this.urlEl.on("focus", this.onFocusUrl, this);

		this.confirmBtnEl = this.boxEl.child("a.confirmBtn");
		this.confirmBtnEl.on("click", this.onClickConfirm, this);

		this.previewEl = this.boxEl.child("p.preview");
	},

	reset : function()
	{
			Mys.VideoUrlContentsCtrl.superclass.reset.call(this);

			this.urlEl.dom.value = "이미지의 URL을 입력해주세요";
			this.urlEl.on("focus", this.onFocusUrl, this);

			this.previewEl.setStyle("display", "none");
	},

	onFocusUrl : function(evt, t)
	{
			this.urlEl.dom.value = "";
			this.urlEl.un("focus", this.onFocusUrl, this);
	},

	onClickConfirm : function(evt, t)
	{
			if(!this.isSet())
					return false;

			if(!this.maxImageWidth)
					this.maxImageWidth = this.boxEl.getWidth() - 15;

			var script = "onload='if(this.width > "+this.maxImageWidth+"){this.width="+this.maxImageWidth+"}'";

			this.previewEl.update("<img src='"+this.urlEl.dom.value+"' "+script+"/>");
			this.previewEl.setStyle("display", "block");
	},

	isSet : function()
	{
			if(!this.urlEl.dom.value)
			{
					alert("사진 주소를 입력해주세요");
					return false;
			}

			var index = this.urlEl.dom.value.indexOf("http://");

			if(index != 0)
			{
					alert("정확한 이미지 주소를 입력해주세요");
					return false;
			}
			return true;
	},

	getSelectedItem : function()
  {
  		var value = this.urlEl.dom.value;
  		var item = {};

			item.image = encodeURIComponent(value);
			
  		return item;
  }
});


Mys.LinkContentsCtrl = function(resultCtrl, container){
  this.resultCtrl = resultCtrl;
	var config = {boxName : "linkContentsBox", container : container};

	Mys.LinkContentsCtrl.superclass.constructor.call(this, config);
}

Ext.extend(Mys.LinkContentsCtrl, Mys.ContentsCtrl, {
		category : "link",
		linkTemplate : '<div id="linkContentsBox" class="contentsBox">' +
											'<p><label for="title" class="subject">제목</label> <input type="text" class="title input" name="title"/></p>'+
											'<p class="last"><label for="link" class="subject">주소</label> <input type="text" class="link input" name="link"/></p>'+
										'</div>',
		detailTpl : new Ext.Template('<div>' +
									'<a href="{link}" title="{title}" target="_blank"/>{title}</a>'+
								'</div>'),

		initialize : function(config){
		this.isVisible = false;

		if(!Global.modelContents)
			Global.modelContents = new Mys.Model.Contents;

		var container = config.container;

		this.boxEl = container.insertHtml("afterEnd", this.linkTemplate, true);

		this.linkEl = this.boxEl.child(".link");
		this.titleEl = this.boxEl.child(".title");

		//this.boxEl.child(".select").on("click", this.selectDetailItem, this);
	},

	isSet : function()
	{
			if(!this.linkEl.dom.value)
			{
					alert("링크 주소를 입력해주세요");
					this.linkEl.dom.focus();
					return false;
			}

			if(!this.titleEl.dom.value)
			{
					alert("링크 내용을 입력해주세요");
					this.titleEl.dom.focus();
					return false;
			}

			return true;
	},

	getSelectedItem : function()
	{
			var item = {link : this.linkEl.dom.value.toLink(), title : this.titleEl.dom.value.encodeSP()};

			return item;
	},
  /*selectDetailItem : function()
  {
			if(!this.checkValue())
					return;

			var item = {link : this.linkEl.dom.value.toLink(), description : this.descEl.dom.value};
  		var category = this.category;
  		var detailTpl = this.detailTpl;

  		this.fireEvent("select", item, category, detailTpl);
  },*/

  reset : function()
  {
  		this.linkEl.dom.value = "";
  		this.titleEl.dom.value = "";
  }
});

Mys.QuestionContentsCtrl = function(resultCtrl, container){
  this.resultCtrl = resultCtrl;
	var config = {boxName : "questionContentsBox", container : container};

	Mys.QuestionContentsCtrl.superclass.constructor.call(this, config);
}

Ext.extend(Mys.QuestionContentsCtrl, Mys.ContentsCtrl, {
		category : "question",
		linkTemplate : '<div class="question contentsBox">' +
											'<p class="subject q1">답변자를 선정하여 답례로 '+EXT_SESSION.getName()+'님이 보유하신 하트를 선물 할 수 있습니다.</p>'+
											'<p class="q2">몇 개의 하트를 드리시겠습니까?</p>'+
											'<div class="option">' +
												'<span class="dot">하트개수</span>'+
												'<p class="selectBox heart"><a href="#" onclick="return false">선택</a></p>'+
												'<span class="dot">답변긴급도</span>'+
												'<p class="selectBox emergency"><a href="#" onclick="return false">선택</a></p>'+
											'</div>'+

											'<ul class="emergencyList list none">' +
												'<li><a href="#" class="2" onclick="return false">매우긴급</a></li>' +
												'<li><a href="#" class="1" onclick="return false">긴급</a></li>' +
												'<li><a href="#" class="0" onclick="return false">보통</a></li>' +
											'</ul>' +

											'<ul class="heartList list none">' +
												'<li><a href="#" class="0" onclick="return false">0개</a></li>' +
												'<li><a href="#" class="1" onclick="return false">1개</a></li>' +
												'<li><a href="#" class="3" onclick="return false">3개</a></li>' +
												'<li><a href="#" class="5" onclick="return false">5개</a></li>' +
												'<li><a href="#" class="10" onclick="return false">10개</a></li>' +
												'<li><a href="#" class="20" onclick="return false">20개</a></li>' +
												'<li><a href="#" class="30" onclick="return false">30개</a></li>' +
												'<li><a href="#" class="40" onclick="return false">40개</a></li>' +
												'<li><a href="#" class="50" onclick="return false">50개</a></li>' +
											'</ul>' +
										'</div>',

		initialize : function(config){
		this.isVisible = false;

		if(!Global.modelContents)
			Global.modelContents = new Mys.Model.Contents;

		var container = config.container;

		this.boxEl = container.insertHtml("afterEnd", this.linkTemplate, true);

		// select box set

		var emergencyListEl = this.boxEl.child('.emergencyList');
		var heartListEl = this.boxEl.child('.heartList');

		emergencyListEl.select("a").on("click", this.onClickEmergency, this);
		heartListEl.select("a").on("click", this.onClickHeart, this);

		this.emergencyBtnEl = this.boxEl.child('.emergency a');
		this.emergencyBtnEl.on("click", this.onClickListBtn, this, {el : emergencyListEl});

		this.heartBtnEl = this.boxEl.child('.heart a');
		this.heartBtnEl.on("click", this.onClickListBtn, this, {el : heartListEl});
	},

	isSet : function()
	{
			if(!this.heartValue)
			{
					alert("하트 개수를 선택해주세요");
					return false;
			}

			if(!this.emergencyValue)
			{
					alert("답변긴급도를 설정해주세요");
					return false;
			}

			return true;
	},

	getSelectedItem : function()
	{
			var item = {q_heart : this.heartValue, q_emergency : this.emergencyValue};

			return item;
	},
  /*selectDetailItem : function()
  {
			if(!this.checkValue())
					return;

			var item = {link : this.linkEl.dom.value.toLink(), description : this.descEl.dom.value};
  		var category = this.category;
  		var detailTpl = this.detailTpl;

  		this.fireEvent("select", item, category, detailTpl);
  },*/

  reset : function()
  {
  		this.emergencyValue = this.heartValue = null;
  		this.emergencyBtnEl.update("선택");
  		this.heartBtnEl.update("선택");
  },

	onClickEmergency : function(evt, t){
		if(!t || !t.className)
				return;

		var value = t.className;
		var str = t.innerHTML;

		this.emergencyValue = value;
		this.emergencyBtnEl.update(str);
	},

	onClickHeart : function(evt, t){
		if(!t || !t.className)
				return;

		var value = t.className;
		var str = t.innerHTML;

		this.heartValue = value;
		this.heartBtnEl.update(str);
	},

	onClickListBtn : function(evt, t, obj){
		if(!obj.el.isVisible())
		{
			obj.el.removeClass("none");
			obj.el.alignTo(t, "bl", [0, 0]);
			(function(obj){Ext.fly(document.body).on("click", this.onClickListBtn, this, obj)}).defer(100, this, [obj]);
		}
		else
		{
			Ext.fly(document.body).un("click", this.onClickListBtn);
			obj.el.addClass("none");
		}
	}
});


Mys.MusicContentsCtrl = function(resultCtrl, container)
{
  this.resultCtrl = resultCtrl;
	var config = {boxName : "videoContentsBox", container : container};

	Mys.MusicContentsCtrl.superclass.constructor.call(this, config);
}

Ext.extend(Mys.MusicContentsCtrl, Mys.TabContentsCtrl,
{
	defaultClass : "youtube",
	searchTemplate : new Ext.Template('<div class="contentsBox" id="musicContentsBox">' +
																		'<div class="tab">'+
																			'<a href="#" onclick="return false" class="youtube"><img src="/images/icon/tab_youtube.png" class="png24"/></a>'+
																	/*		'<a href="#" onclick="return false" class="url"><img src="/images/icon/tab_url.png" class="png24"/></a>'+*/
																		'</div>'),

	getCtrlName : function(className)
	{
			var ctrlName = "";

			switch(className)
			{
					case "youtube" :
							ctrlName = "MusicYoutubeContentsCtrl";
							break;

					case "url" :
							ctrlName = "MusicUrlContentsCtrl";
							break;

					default :
							break;
			}

			return ctrlName;
	}
});

Mys.MusicYoutubeContentsCtrl = function(resultCtrl, container){
  this.resultCtrl = resultCtrl;

	var config = {subject : "검색하실 가수나 곡명을 입력하세요", where : "beforeEnd", className : "youtube", container : container};

	Mys.MusicYoutubeContentsCtrl.superclass.constructor.call(this, resultCtrl, container, config);
};

Ext.extend(Mys.MusicYoutubeContentsCtrl, Mys.VideoYoutubeContentsCtrl,{
		category : "music"
});

// contentsModel
Mys.Model.Contents = function(){
	Mys.Model.Contents.superclass.constructor.call(this);
};

Ext.extend(Mys.Model.Contents, Mys.Model, {
	search : function(keyword, category, start, limit, alt, orderby, callback, scope){
		query = "model=contents&view=json&mode=search&search_word="+keyword+"&category="+category;

		if(start !== null)
			query += "&start="+start;

		if(limit !== null)
			query += "&limit="+limit;

		if(alt !== null)
			query += "&alt="+alt;

		if(orderby !== null)
			query += "&orderby="+orderby;

		this.ajax.request(query, callback, scope);
	}
});