﻿/*
* YouFree Basic 2.0 
* Copyright(c) 2007-2009, ETRI. 
* 
* http://www.youfree.or.kr/license
*/

var Search = {};
var myPageSize = 20;
var ss;  // Search Store
var sp;  // Search Panel
var tls; // Tag List Store
var os;  // Ontology Store
var es;  // Engine Store
var shs; // Search History Store
var dc;
var viewport;
var se_target;
var network_ok;
var category_store;
var searchengine_store;
var altengine_store;
var settingDialog;


//////////////////////////////////////////////////////////////////////////////////////////////

function loadRecentContent() {
	// dummy callback function for launcFile.php
}

// Ext.onReady : 브라우져가 초기화될 때 맨 처음 호출되는 메소드
Ext.onReady(function(){
    
	Ext.QuickTips.init(); // htmleditor와 같이 quicktips 이 있는 경우에 꼭 필요함. 
	
	//alert(query+" "+query_euckr);

	ss = new Search.SearchStore();
	//tls = new Search.TagListStore();
	os = new Search.OntologyStore();
	es = new Search.EngineStore();
	shs = new Search.SearchHistoryStore();

	sp = new Search.SearchPanel();
	widgetPanel = new Search.WidgetPanel();
	
	category_store = new Search.CategoryStore();
        searchengine_store = new Search.SearchEngineStore();
        altengine_store = new Search.AltEngineStore();
	
	network_ok = true;
	
	var button = Ext.get('show-setting');
	
	button.on('click', function() {
		if(!settingDialog) {
			settingDialog = new Search.SettingDialog();
		}
  		settingDialog.show(this);
	});
	
	Ext.Ajax.request({
	   url: '/basic/search/check_network.php',
	   success: function(response){
//					alert(response.responseText);
					var nok = Ext.util.JSON.decode(response.responseText);
					if(nok.success != true) {
						Ext.MessageBox.alert('Message', '네트워크 오류.');
						network_ok = false;
					}
				}
	});
	
	
	// Viewport : container, 한페이지에 하나의 뷰포트, 스크롤바가 없다(자식 패널에서 생성해서 사용)
	viewport = new Ext.Viewport({
        layout:'border', // 스윙의 레이아웃과 비슷
        items:[
			// NORTH: 서비스 설명
            new Ext.BoxComponent({ // raw
                region:'north',
                el: 'north',
	            margins:'5 10 0 10',// 위, 오른쪽, 아래, 왼쪽 / north, east, south, west / 북 동 남 서
                height:40
            }),
			// SOUTH: 카피라이트
            new Ext.BoxComponent({ // raw
                region:'south',
                el: 'south',
	            margins:'0 10 5 10',// 위, 오른쪽, 아래, 왼쪽 / north, east, south, west / 북 동 남 서
                height:30
            }),
			// WEST : 검색대상, 온톨로지 결과
			//leftPanel,
			// ESST : 인기검색어, 태그 
			widgetPanel,
			
			// CENTER : 검색 결과 표시
			sp // Search Panel
        ] //item
    }); // viewport
	
	//ss.loadResult(encodeURIComponent(query));
	ss.loadResult(query, "all");

	es.on('load', function(){
		if(network_ok != true)
			Ext.MessageBox.alert('Message', '네트워크 오류로 외부 검색을 수행할 수 없습니다.');
		
		if(scate == '') {
			show_result(es.getAt(0).get('name'), es.getAt(0).get('engine'), es.getAt(0).get('setype'), 1);
		}
		else if (scate == '1') {
//			show_summary(scate);
			for (i = 0; i < es.getTotalCount(); i++) {
				show_result(es.getAt(i).get('name'), es.getAt(i).get('engine'), es.getAt(i).get('setype'), 1);
			}
			Ext.getCmp('main-tabs').activate(1); 

		}
		else {
//			show_summary(scate);
			var content_flag = 0;
			for (i = 0; i < es.getTotalCount(); i++) {
				show_result(es.getAt(i).get('name'), es.getAt(i).get('engine'), es.getAt(i).get('setype'), 1);
//				alert(es.getAt(i).get('engine'));
				if(es.getAt(i).get('engine')=='desktop')
					content_flag = 1;
			}
			if(content_flag == 0) // 내부 검색이 포함되어 있을 때 탭을 제거하지 않는다.
				Ext.getCmp('main-tabs').remove(0, true);
			
			Ext.getCmp('main-tabs').activate(0);
		}
		
		
	});	
	es.loadEngine(scate);
	
	os.loadResult(encodeURIComponent(query));
	os.on('load', function(){
		
		var grid = Ext.getCmp('ontology-grid');
		//grid.collapsed;
		if(os.getTotalCount()==0)
			grid.collapse(true);
		else
			grid.expand(true);
	});
	
	shs.loadSearchHistories();
	//tls.loadTags();

	
	//Ext.getCmp('west-panel').setTitle("검색 - "+query);
});

function pause(milliseconds) {
	var dt = new Date();
	while ((new Date()) - dt <= milliseconds) { /* Do nothing */ }
}
//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.EngineStore
 * 
 * 검색 대상을 위한 데이터 Store
 */
Search.EngineStore = function() {
    Search.EngineStore.superclass.constructor.call(this, {
        proxy: new Ext.data.HttpProxy({
            url: '/basic/api/search/getSearchEngines.php'
        }),

        reader: new Ext.data.JsonReader({
            root: 'Results',
            totalProperty: 'Total'
        }, ['id', 'name', 
			{name: 'visibility', type: 'bool'}, 
			'engine', 'setype', 'cate', 'parent'
        ])
    });
	
}

Ext.extend(Search.EngineStore, Ext.data.Store, {
    loadEngine : function(category){
        this.baseParams = {
            category: category
        };
        this.load({
/*
            params: {
                start:0,
                limit:myPageSize
            }
*/
        });		
    }
});

//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.OntologyStore
 * 
 * 온톨로지 검색을 위한 데이터 Store
 */
Search.OntologyStore = function() {
    Search.OntologyStore.superclass.constructor.call(this, {
        proxy: new Ext.data.HttpProxy({
            url: '/basic/api/search/searchOntology.php'
        }),

        reader: new Ext.data.JsonReader({
            root: 'Results',
            totalProperty: 'Total'
        }, [
			{name: 'id', mapping: 'id'},
		    {name: 'name', mapping: 'title'},
		    {name: 'desc', mapping: 'desc'},
		    {name: 'termtype', mapping: 'termtype'}
        ])
    });
	
}

Ext.extend(Search.OntologyStore, Ext.data.Store, {
    loadResult : function(keyword){
        this.baseParams = {
            query: keyword
        };
        this.load({
/*
            params: {
                start:0,
                limit:myPageSize
            }
*/
        });		
    }
});

// 숫자인지 문자인지 알아내는 함수
isNumber = function(s) {
  s += ''; // 문자열로 변환
  s = s.replace(/^\s*|\s*$/g, ''); // 좌우 공백 제거
  if (s == '' || isNaN(s)) return false;
  return true;
}

calcHeight = function(target) { // Iframe 크기 조절 스크립트
	name = "main_"+target;
	if (navigator.appName == "Netscape") {
	
		//find the height of the internal page
		document.getElementById(name).height = 0;
		
		var the_height = document.body.scrollHeight - 140;
		
		//change the height of the iframe
		document.getElementById(name).height = the_height;
	}
};

function syncAJAX(url) {
	if (window.XMLHttpRequest) {              
    AJAX=new XMLHttpRequest();              
  } else {                                  
    AJAX=new ActiveXObject("Microsoft.XMLHTTP");
  }
  if (AJAX) {
     AJAX.open("POST", url, false);                             
     AJAX.send(null);
     return AJAX.responseText;                                         
  } else {
     return false;
  } 
}

show_result = function(name, se_target, se_type, start) { // 검색 결과를 탭에 표시
	content_type = 'normal';
	var main_tabs = Ext.getCmp('main-tabs');	

	if (se_type == 0) { // 내부 검색
		//ss.loadResult(encodeURIComponent(query), "all");
		ss.loadResult(query, "all");
		var main_tab = Ext.getCmp('main-view');
		main_tab.setTitle(name);
		var main_tabs = Ext.getCmp('main-tabs');
		main_tabs.activate(0); // 첫번째 탭 표시?
		return;
	}
	else if (se_type == 1) {
		if(network_ok == false)
			return;
		
		var search_panel = Ext.getCmp(se_target+'-panel');
		content_type = 'normal';
		var newtab;
		if(!search_panel) { // 검색 결과 탭이 없으면 생성
			newtab = new Search.HtmlSearchPanel(se_target);
			main_tabs.add(newtab);
			newtab.show();
		} else { // 검색 결과 탭이 있으면 표시
			newtab = Ext.getCmp(se_target+'-panel');
			main_tabs.activate(newtab);
		}
		newtab.setTitle(name);//+" - "+query); // 탭 타이틀 수정
		//newtab.store.loadResult(encodeURIComponent(query), se_target, content_type);
		var myMask = new Ext.LoadMask(Ext.get(se_target+'-preview'), {msg:"검색 중입니다..."});
		myMask.show();
		
		//pause(300);
		
		Ext.Ajax.request({
			url: "/basic/search/searchWebHTML.php",
			success: function(response){
				var preview = Ext.getCmp(se_target+'-preview');
				preview.body.update('<div id = \''+se_target+'-preview-body\'>'+response.responseText+'</div>');
				myMask.hide();
			},
			params: {"query" : encodeURI(query), "target": se_target, "setype": 1, "title": name, "start":start}
		});
		
		/*
		responseText = syncAJAX("/basic/search/searchWebHTML.php?query="+encodeURI(query)+"&target="+se_target+"&setype=1&title="+name+"&start="+start);
		var preview = Ext.getCmp(se_target+'-preview');
		preview.body.update('<div id = \''+se_target+'-preview-body\'>'+responseText+'</div>');
		myMask.hide();
		*/
	}
	else if(se_type == 2) {
		if(network_ok == false)
			return;
		
		var search_panel = Ext.getCmp(se_target+'-panel');
		content_type = 'media';
		var newtab;
		if(!search_panel) { // 검색 결과 탭이 없으면 생성
			newtab = new Search.HtmlSearchPanel(se_target);
			main_tabs.add(newtab);
			newtab.show();
		} else { // 검색 결과 탭이 있으면 표시
			newtab = Ext.getCmp(se_target+'-panel');
			main_tabs.activate(newtab);
		}
		newtab.setTitle(name);//+" - "+query); // 탭 타이틀 수정
		//newtab.store.loadResult(encodeURIComponent(query), se_target, content_type);
		var myMask = new Ext.LoadMask(Ext.get(se_target+'-preview'), {msg:"검색 중입니다..."});
		myMask.show();
		
		//pause(300);
		
		Ext.Ajax.request({
			url: "/basic/search/searchWebHTML.php",
			success: function(response){
				var preview = Ext.getCmp(se_target+'-preview');
				preview.body.update('<div id = \''+se_target+'-preview-body\'>'+response.responseText+'</div>');
				myMask.hide();
			},
			params: {"query" : encodeURI(query), "target": se_target, "setype": 2, "title": name, "start":start}
		});
		/*
		
		responseText = syncAJAX("/basic/search/searchWebHTML.php?query="+encodeURI(query)+"&target="+se_target+"&setype=2&title="+name+"&start="+start);
		var preview = Ext.getCmp(se_target+'-preview');
		preview.body.update('<div id = \''+se_target+'-preview-body\'>'+responseText+'</div>');
		myMask.hide();
		*/
	}
	else if(se_type == 4) { // 포털 검색
		if(network_ok == false)
			return;
		
		var search_panel = Ext.getCmp(se_target+'-panel');
		//content_type = 'media';
		var newtab;
		if(!search_panel) { // 검색 결과 탭이 없으면 생성
			newtab = new Search.HtmlSearchPanel(se_target);
			main_tabs.add(newtab);
			newtab.show();
		} else { // 검색 결과 탭이 있으면 표시
			newtab = Ext.getCmp(se_target+'-panel');
			main_tabs.activate(newtab);
		}
		newtab.setTitle(name);//+" - "+query); // 탭 타이틀 수정
		//newtab.store.loadResult(encodeURIComponent(query), se_target, content_type);
		var myMask = new Ext.LoadMask(Ext.get(se_target+'-preview'), {msg:"검색 중입니다..."});
		myMask.show();
				
		Ext.Ajax.request({
			url: "/basic/search/searchPortal.php",
			success: function(response){
				var preview = Ext.getCmp(se_target+'-preview');
				preview.body.update('<div id = \''+se_target+'-preview-body\'>'+response.responseText+'</div>');
				myMask.hide();
			},
			params: {"query" : encodeURI(query), "target": se_target}
		});
		/*
		responseText = syncAJAX("/basic/search/searchPortal.php?query="+encodeURI(query)+"&target="+se_target);
		var preview = Ext.getCmp(se_target+'-preview');
		preview.body.update('<div id = \''+se_target+'-preview-body\'>'+responseText+'</div>');
		myMask.hide();
		*/
	}
	else { // 탭에 웹 검색 결과  페이지를 iframe으로 삽입
		if(network_ok == false)
			return;

		iframe_target = se_target.split(";");
		
		if(search_popup == "1") {
			window.open(iframe_target[1]+query_euckr);
			return;
		}
		
		var search_panel = Ext.getCmp(iframe_target[0]+'-panel');
		var newtab;
		var url;
		if(!search_panel) { 
			newtab = new Search.IFrameSearchPanel(iframe_target[0]);
			main_tabs.add(newtab);
			newtab.show();
		} else { 
			newtab = Ext.getCmp(iframe_target[0]+'-panel');
			main_tabs.activate(newtab);
		}
		
		url = iframe_target[1];
		
//		if (se_target == 'yahoo')
//			url = "http://kr.search.yahoo.com/search?h_p=&ret=1&fr=kr-search_top&p=";
//		else if (se_target == 'paran') 
//			url = "http://search.paran.com/search/index.php?Query=";
//		else if (se_target == 'empas') 
//			url = "http://nate.search.empas.com/search/all.html?s=&z=A&q=";
//		else if (se_target == 'daum') 
//			url = "http://search.daum.net/cgi-bin/nsp/search.cgi?w=tot&q=";
//		else if (se_target == 'naver') 
//			url = "http://news.naver.com/search/search.naver?sort=1&qt=df&query=";
//		else if (se_target == 'naver-endic') 			
//			url = "http://endic.naver.com/search.nhn?kind=keyword&query=";
//		else if (se_target == 'daum-endic')
//			url = "http://engdic.daum.net/dicen/search_result_total.do?q=";
//		else if (se_target == 'empas-endic')
//			url = "http://alldic.empas.com/search/endic.html?f=e&q=";
//		else if (se_target == 'google-endic')
//			url = "http://www.google.co.kr/dictionary?ie=UTF-8&oe=UTF-8&hl=ko&tab=wD&langpair=en|ko&q=";
//		else 
//			url = "http://www.google.co.kr/search?hl=ko&q=";
		
	    var preview = Ext.get(iframe_target[0]+'-preview-body');
		// encodeURIComponent(query) -> query_euckr
		preview.update('<iframe id="main_'+iframe_target[0]+'" onLoad="calcHeight(\''+iframe_target[0]+'\');" src="'+url+query_euckr+'" width="100%" height="100%">');
		newtab.setTitle(name);
//		main_tabs.activate(newtab);
		return;
	}
};

show_summary = function(category) { // 검색 결과를 탭에 표시
	var main_tabs = Ext.getCmp('main-tabs');	
	var se_target = "summary-"+category;
	
	if(network_ok == false)
		return;
	
	var search_panel = Ext.getCmp(se_target+'-panel');
	var newtab;
	if(!search_panel) { // 검색 결과 탭이 없으면 생성
		newtab = new Search.HtmlSearchPanel(se_target);
		main_tabs.add(newtab);
		newtab.show();
	} else { // 검색 결과 탭이 있으면 표시
		newtab = Ext.getCmp(se_target+'-panel');
		main_tabs.activate(newtab);
	}
	newtab.setTitle("요약");//+" - "+query); // 탭 타이틀 수정
	//newtab.store.loadResult(encodeURIComponent(query), se_target, content_type);
	var myMask = new Ext.LoadMask(Ext.get(se_target+'-preview'), {msg:"검색 중입니다..."});
	myMask.show();
	
	Ext.Ajax.request({
		url: "/search/searchSummary",
		success: function(response){
			var preview = Ext.getCmp(se_target+'-preview');
			preview.body.update('<div id = \''+se_target+'-preview-body\'>'+response.responseText+'</div>');
			myMask.hide();
		},
		params: {"query" : encodeURI(query), "cate": category}
	});
	
};


bookmark = function(src) {
	var window = Ext.getCmp('bookmark-add-dialog');
	if(window) {
		window.close();
		window.destroy();
	}
	var bookmarkAddDialog = new Search.BookmarkAddDialog();
	Ext.getCmp('bookmark_name').setValue(Ext.get(src+"_title").dom.innerHTML);
	Ext.getCmp('bookmark_url').setValue(Ext.get(src+"_url").dom.innerHTML);
	var bookmark_form = Ext.getCmp('bookmark-form');
	bookmark_form.getComponent('bookmark_id').setValue(3);
	bookmark_form.getComponent('bookmark_type_id').setValue(3);
	bookmarkAddDialog.show();
};

/* 
 * Search.BookmarkAddDialog
 * 
 * 북마크 추가를 위한 Dialog
 * 
 */
Search.BookmarkAddDialog = function() {
	Search.BookmarkAddDialog.superclass.constructor.call(this, {
		id: 'bookmark-add-dialog',
		title: '북마크 추가',
		layout: 'fit', 
		width: 300,
		height: 320,
		closeAction: 'hide',
		iconCls: 'bookmarkservice-icon',
		plain: true,
		modal: true,
		items: [
			new Ext.FormPanel({
				id: 'bookmark-form',
				collapsible: true,
				autoScroll: true,
				frame: true,
				labelWidth: 75,
				labelAlign: 'top',
				url: '/basic/api/content/createContent.php', //'/content/addBookmark',
				title: "내 북마크",
				header: false,
				bodyStyle: 'padding: 0px 0px 0px 0px',
				autowidth: true,
				items: [
					{
						xtype: 'textfield',
						fieldLabel: '이름',
						name: 'name',
						id: 'bookmark_name',
						anchor: '100%'
					}, {
						xtype: 'textfield',
						fieldLabel: 'URL',
						name: 'data',
						id: 'bookmark_url',
						anchor: '100%'
					}, {
						xtype: 'textarea',
						fieldLabel: '설명',
						name: 'desc',
						id: 'bookmark_desc',
						anchor: '100%'
					}, {
						xtype: 'textfield',
						fieldLabel: '태그',
						name: 'tag',
						id: 'bookmark_tag',
						anchor: '100%'
					} , {
						xtype: 'hidden',
						name: 'content_type_id',
						id: 'bookmark_type_id'
					} , {
						xtype: 'hidden',
						name: 'parent_id',
						id: 'bookmark_id'
					}//items
				],
				buttons: [
					{
						text: '저장',
						iconCls: 'save-icon',
						handler: this.addBookmark
					}
				]
			})// FormPanel
		]
	});
};

Ext.extend(Search.BookmarkAddDialog, Ext.Window, {
	addBookmark : function() {
		var bookmark = Ext.getCmp('bookmark-form');
		var win = Ext.getCmp('bookmark-add-dialog');
		alert("이 기능을 사용하려면 YouFree Basic을 다운받으세요");
		return;
		
		if(bookmark.getComponent('bookmark_name').getValue() == '') {
			Ext.MessageBox.alert('Message', '이름을 입력하세요.');
			return;
		}
		
		if(bookmark.getComponent('bookmark_url').getValue() == '') {
			Ext.MessageBox.alert('Message', 'URL을 입력하세요.');
			return;
		}
		
		bookmark.form.submit({
//			params: {"id": id},
			waitMsg:'북마크를 저장 중 입니다...',
			failure: function(){
				win.close();
				Ext.MessageBox.alert('Message', '북마크 저장에 실패하였습니다.');
			},	
			success: function(){
				win.close();
				win.destroy();
				Ext.MessageBox.confirm('Message', '북마크를 추가하였습니다. 확인하시겠습니까?' , function(btn) {
				if(btn == 'yes') {
					var url = "/content/";
					var newWin1=window.open(url,"_blank",''); 
					newWin1.location=url;
				}
			});
//				alert('success');
			}
		});
	}
});

scrap = function(src) {
	var window = Ext.getCmp('scrap-dialog');
	if(window) {
		window.close();
		window.destroy();
	}
	var scrapDialog = new Search.ScrapDialog();
	
	Ext.getCmp('content_name').setValue(Ext.get(src+"_title").dom.innerHTML);
	
	var scrap_content = "<a href=\""+Ext.get(src+"_url").dom.innerHTML+"\">원문링크</a><p>";
	if(Ext.get(src+"_desc") != null && Ext.get(src+"_desc").dom.innerHTML)
		scrap_content += Ext.get(src+"_desc").dom.innerHTML;
	if(Ext.get(src+"_thumbnail") != null && Ext.get(src+"_thumbnail").dom.innerHTML)
		scrap_content += "<img src=\""+Ext.get(src+"_thumbnail").dom.innerHTML+"\">";
		
	Ext.getCmp('content_data').setValue(scrap_content);
	
	scrapDialog.show();
};

/* 
 * Search.PlayVideoDialog
 * 
 * 동영상 재생을 위한 Dialog
 * 
 */
Search.PlayVideoDialog = function() {
	Search.PlayVideoDialog.superclass.constructor.call(this, {
		id: 'playvideo-dialog',
		title: '동영상 재생',
		layout: 'fit', 
		width: 460,
		height: 390,
		closeAction: 'hide',
		iconCls: 'bookmarkservice-icon',
		plain: true,
		modal: true,
		items: [
					{
		                id:'playvideo-preview',
		                region:'center',
//		                height:400,
					    autoScroll:true,
		//                title:'콘텐츠 미리 보기',
						html: '<div id = \'playvideo-preview-body\'></div>', 
		                split:true
					} // Preview
		]
	});
	
	var win = Ext.getCmp('playvideo-dialog');
	win.on('hide', function(set_win) {
		win.destroy();
	});

};

Ext.extend(Search.PlayVideoDialog, Ext.Window, {
});

playVideo = function(se_target, play_url) {
	var win = Ext.getCmp('playvideo-dialog');
	if(!win) {
		win = new Search.PlayVideoDialog();
	}
	
	win.show();
	
	Ext.Ajax.request({
			url: "/basic/search/playVideo.php",
			success: function(response){
				var preview = Ext.getCmp('playvideo-preview');
				preview.body.update('<div id = \'playvideo-preview-body\'>'+response.responseText+'</div>');
			},
			params: {"target": se_target, "play_url": play_url}
		});
};

/* 
 * Search.ScrapDialog
 * 
 * 스크랩을 위한 Dialog
 * 
 */
Search.ScrapDialog = function() {
	Search.ScrapDialog.superclass.constructor.call(this, {
		id: 'scrap-dialog',
		title: '스크랩',
		layout: 'fit', 
		width: 300,
		height: 420,
		closeAction: 'hide',
		iconCls: 'bookmarkservice-icon',
		plain: true,
		modal: true,
		items: [
			new Ext.FormPanel({
				id: 'scrap-form',
				collapsible: true,
				autoScroll: true,
				frame: true,
				labelWidth: 75,
				labelAlign: 'top',
				url: '/basic/note/createNote.php',
				title: "스크랩",
				header: false,
				bodyStyle: 'padding: 0px 0px 0px 0px',
				autowidth: true,
				anchor: '100%',
				items: [
					{
						xtype: 'textfield',
						fieldLabel: '제목',
						name: 'name',
						id: 'content_name',
						tabIndex: 1,
						anchor: '100%'
					}, {
						xtype: 'textfield',
						fieldLabel: '태그',
						name: 'tag_list',
						tabIndex: 2,
						anchor: '100%'
					}, {
						tabIndex: 3,
						xtype: 'htmleditor',
						fieldLabel: '스크랩',
						name: 'data',
						id: 'content_data',
						enableAlignments: false,
		//				enableColors: false,
						enableFont: false,
						enableFontSize: false,
		//				enableFormat: false,
						enableLinks: false,
						enableLists: false,
						enableSourceEdit: false,
//			    	        width:200,
						anchor: '100%',
						width: 220,
		        	    height:200
					}
				], //items
				buttons: [{
					text: '저장',
					iconCls: 'save-icon',
					handler: this.saveScrap
				}]
			})// FormPanel
		]
	});
};

Ext.extend(Search.ScrapDialog, Ext.Window, {
	saveScrap : function() {
		var scrap = Ext.getCmp('scrap-form');
		var win = Ext.getCmp('scrap-dialog');
		alert("이 기능을 사용하려면 YouFree Basic을 다운받으세요");
		return;
		
		if(scrap.getComponent('content_name').getValue() == '') {
			Ext.MessageBox.alert('Message', '제목을 입력하세요.');
			return;
		}
		
		if(scrap.getComponent('content_data').getValue() == '') {
			Ext.MessageBox.alert('Message', '내용을 입력하세요.');
			return;
		}
		
		scrap.form.submit({
			//params: {"category_id": 0}, 
			waitMsg:'스크랩을 저장 중 입니다...',
			failure: function(){
				win.close();
				Ext.MessageBox.alert('Message', '스크랩 저장에 실패하였습니다.');
			},	
			success: function(){
				win.close();
				win.destroy();
				Ext.MessageBox.confirm('Message', '스크랩을 추가하였습니다. 확인하시겠습니까?' , function(btn) {
				if(btn == 'yes') {
					var url = "/note/";
					var newWin1=window.open(url,"_blank",''); 
					newWin1.location=url;
					newWin1.focus();
				}
			});
//				alert('success');
			}
		});
	}
});


//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.Renderers
 * 
 *  콘텐츠 타입에 대한 렌더러들 
 *  
 */
Search.Renderers = {
    topic : function(value, p, record){
		var content_type = record.data['file_type_name'];
		servername = location.host.split(":")[0];
		switch(content_type) {
			case 'note' :
       			return String.format('<img width=12 height=12 src=\"/basic/res/images/icon/note_16.png\" />  {0}', value);
			case 'document' :
				if(record.data['icon'] == null || record.data['icon'] == '')
       				return String.format('<img width=12 height=12 src=\"/basic/res/images/icon/document_16.png\" />  {0}', value);
				else
       				return String.format('<img width=12 height=12 src=\"http://'+servername+'{1}\" />  {0}', value,  record.data['icon']);
			case 'text' :
       			return String.format('<img width=12 height=12 src=\"/basic/res/images/icon/document_16.png\" />  {0}', value);
			case 'image' :
       			return String.format('<img width=12 height=12 src=\"/basic/res/images/icon/image_16.png\" />  {0}', value);
			case 'audio' :
       			return String.format('<img width=12 height=12 src=\"/basic/res/images/icon/audio_16.png\" />  {0}', value);
			case 'video' :
       			return String.format('<img width=12 height=12 src=\"/basic/res/images/icon/video_16.png\" />  {0}', value);
			case 'compressed' :
       			return String.format('<img width=12 height=12 src=\"/basic/res/images/icon/compressed_16.png\" />  {0}', value);
			case 'sw' :
				if(record.data['icon'] == null || record.data['icon'] == '')
	       			return String.format('<img width=12 height=12 src=\"/basic/res/images/icon/software_16.png\" />  {0}', value);
				else
		       		return String.format('<img width=12 height=12 src=\"http://'+servername+'/{1}\"/>  {0}', value, record.data['icon']);
			case 'etc' :
       			return String.format('<img width=12 height=12 src=\"/basic/res/images/icon/etc_16.png\" />  {0}', value);
			case 'system' :
       			return String.format('<img width=12 height=12 src=\"/basic/res/images/icon/system_16.png\" />  {0}', value);
			case 'se_default' :
				return String.format('<div class="topic"><b>{0}</b></div>', value);
			case 'se_media' :
				return String.format('<img src=\"{0}"\ width="150">', value);
			default :
				return String.format('<img width=12 height=12 src=\"/basic/res/images/icon/etc_16.png\" />  {0}', value);
		}
    }
};

//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.SearchPanel
 * 
 * 메인 패널로, 검색 결과(콘텐츠)의 grid를 보여준다.
 * 
 */
Search.SearchPanel = function() {
	Search.SearchPanel.superclass.constructor.call(this, {
        id:'main-tabs',
        activeTab:0,
        region:'center',
        margins:'0 0 5 10', // 위, 오른쪽, 아래, 왼쪽
        tabWidth:200,
		width: 600,
//		resizeTabs:true,		
		minTabWidth:100,
		enableTabScroll:true,
	    defaults: {autoScroll:true},
//        plain:true,
		items: [
			{
			id: 'main-view',
			layout: 'border',
			title: 'Loading...',
			closable: true,
			iconCls: 'desktop-icon',
	        plain:true,
			items:[ 
                new Ext.grid.GridPanel({
                    region:'center',
                    id:'search-grid',
                    store: ss,
					itemCls: "x-hide-display",
					columns: [
						{id: 'title', header: "이름", sortable: true, renderer: Search.Renderers.topic, dataIndex: 'name'},
						{id: 'size', align: 'right', header: "크기", width: 20, sortable: true, dataIndex: 'size'},
						{id: 'extension', header: "확장자", width: 20, sortable: true, dataIndex: 'extension'},
						{id: 'accessed_at', header: "날짜", width: 60, sortable: true, dataIndex: 'accessed_at'},
						{id: 'file_type_name', header: "종류", width: 30, sortable: true, dataIndex: 'file_type_name'}
					],
					defaultSortable: true,
                    trackMouseOver:false,
                    loadMask: {msg:'컨텐츠 로딩 중입니다...'},
                    viewConfig: {
                        forceFit:true,
                        enableRowBody:true,
                        getRowClass : function(record, rowIndex, p, dc){ // 수정
                            if(this.showPreview){
                                p.body = '<p>'+record.data.content+'</p>';
                                return 'x-grid3-row-expanded';
                            }
                            return 'x-grid3-row-collapsed';
                        },
                        showPreview:false
                    } // viewConfig
                    ,
                    bbar: new Ext.PagingToolbar({
                        pageSize: myPageSize,
                        store: ss,
                        displayInfo: true,
                        displayMsg: '{2}중 {0} - {1}',
                        emptyMsg: "콘텐츠가 없습니다."
                    }) //bbar
                }) //GridPanel
			] // item 
		}]  //item
	});
	
	// 콘텐츠를 선택하면 preview 에 보여준다.
	var grid = Ext.getCmp('search-grid');
	
	// 콘텐츠를 더블클릭하면 콘텐츠를 열거나 프로그램을 실행해준다.
	grid.on('rowdblclick', function(grid){
		var node = grid.getSelectionModel().getSelected();
		var content_type = node.data.content_type;
		switch(content_type){
			case "note":
				var url = "/note/view/"+node.data.id;
				var newWin1=window.open(url,"_blank",''); 
				newWin1.location=url;
				newWin1.focus();
				break;
			case "bookmark":
				var url = node.data.content;
				if(url.indexOf("http://") == -1 && url.indexOf("https://") == -1) {
					url = 'http://' + url;
				}
				var newWin1=window.open(url,"_blank",''); 
				newWin1.location=url;
				newWin1.focus();
				break;
			default :
				// contents 열기
				alert("콘텐츠를 사용하려면 YouFree Basic을 다운받으세요");
				//window.open("/content/launchFile?id="+grid.getSelectionModel().getSelected().data.id);
//				Ext.Ajax.request({
//					url: "/content/launchFile/",
//					params: {"id" : grid.getSelectionModel().getSelected().data.id}
//				});
				break;
		}
	});
};
Ext.extend(Search.SearchPanel, Ext.TabPanel, {
	
});


//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.SearchStore
 * 
 * 검색을 위한 데이터 Store
 */
Search.SearchStore = function() {
    Search.SearchStore.superclass.constructor.call(this, {
        proxy: new Ext.data.HttpProxy({
            url: '/basic/api/content/searchContents.php'
        }),

        reader: new Ext.data.JsonReader({
            root: 'Contents',
            totalProperty: 'Total'
        }, [
			{name: 'id', mapping: 'id'},
		    {name: 'name', mapping: 'name'},
		    {name: 'size', mapping: 'size'},
		    {name: 'extension', mapping: 'extension'},
		    {name: 'accessed_at', mapping: 'accessed_at'},
		    {name: 'file_type_name', mapping: 'file_type_name'},
		    {name: 'path', mapping: 'path'},
		    {name: 'icon', mapping: 'icon'},
		    {name: 'content', mapping: 'content'},
		    {name: 'stype', mapping: 'stype'},
		    {name: 'appid', mapping: 'appid'},
		    {name: 'content_id', mapping: 'content_id'},
		    {name: 'supported_os', mapping: 'supported_os'}
        ])
    });
	
}

Ext.extend(Search.SearchStore, Ext.data.Store, {
    loadResult : function(keyword, content_type){
        this.baseParams = {
            keyword: keyword,
			file_type_name: content_type
        };
        this.load({
            params: {
                start:0,
                limit:myPageSize
            }
        });
    }
});



//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.WebSearchPanel
 * 
 * 웹 검색 결과를 보여주는 탭 패널
 * 
 */
Search.WebSearchPanel = function(engine) {
	var se = engine.split("-");
	var tmpPageSize = myPageSize;
	// engine에 따라 store 달라짐
 	if(se[0] == "google") {
		tmpPageSize = 4;
	}

 	this.store = new Search.WebSearchStore();
	
	Search.WebSearchPanel.superclass.constructor.call(this, {
   		id: engine+'-panel',
		layout:'border',
      	title:'Search: ',//'+Ext.util.Format.htmlEncode('"'+keyword+'"'),
		closable: true,
		iconCls: se[0]+'-icon',
        items:[
			new Ext.grid.GridPanel({
				id: 'search-grid',
        		region:'center',
        		store: this.store,
	        	trackMouseOver:false,
		        loadMask: {msg:'Searching...'},

			    cm: new Ext.grid.ColumnModel
			    	([{
			            id: 'title',
			            header: "제목",
			            dataIndex: 'title',
					    renderer: Search.Renderers.topic
					},{  
					    id: 'link',
					    header: "주소",
					    dataIndex: 'link',
					    width: 50
					}]), //cm

        		sm: new Ext.grid.RowSelectionModel({
            		singleSelect:true
        		}),
		        viewConfig: {
   	    			forceFit:true,
            		enableRowBody:true,
			    	showPreview:true,
            		getRowClass : function(record, rowIndex, p, store){
			        	if(this.showPreview){
							var xf = Ext.util.Format;
            				p.body = '<p>' + xf.ellipsis(xf.stripTags(record.data.desc), 200) +'</p>';
        		        	return 'x-grid3-row-expanded';
			        	}	
    	            	return 'x-grid3-row-collapsed';
        	    	}
        		},
    	    	bbar: new Ext.PagingToolbar({
        			pageSize: tmpPageSize,
       				store: this.store,
			    	displayInfo: true,
			        displayMsg: 'Displaying results {0} - {1} of {2}',
			        emptyMsg: "검색 결과가 없습니다.",
					items:[
		                '-', {
		                //pressed: true,
		                //enableToggle:true,
		                text: '스크랩',
		                //cls: 'x-btn-text-icon details',
		                handler: cbScrap
						},
						{
							text: '북마크',
							handler: cbBookmark
						}
		            ]
	        	})
            }) //GridPanel
		] // items
	});
	
	// 콘텐츠를 선택하면 preview 에 보여준다.
	var search_grid = Ext.getCmp('search-grid');
	
	// 콘텐츠를 더블클릭하면 열어준다.
	search_grid.on('dblclick', function(grid){
		var node = search_grid.getSelectionModel().getSelected();
		// editor 실행
		var win = window.open(node.data.link);
	});
	
	function cbScrap(btn, e){
		var node = search_grid.getSelectionModel().getSelected();
		if(node != null)
			alert("scrap "+node.data.link);
    }

	function cbBookmark(btn, e){
		var node = search_grid.getSelectionModel().getSelected();
		if(node != null)
			alert("bookmark "+node.data.link);
    }
}
Ext.extend(Search.WebSearchPanel, Ext.Panel);

//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.MediaSearchPanel
 * 
 * 멀티미디어 검색 결과를 보여주는 탭 패널
 * 
 */
Search.MediaSearchPanel = function(engine) {
	var se = engine.split("-");
	var tmpPageSize = myPageSize;
	// engine에 따라 store 달라짐
 	if(se[0] == "google") {
		tmpPageSize = 4;
	}
	this.store = new Search.WebSearchStore();
		
    var tpl = new Ext.XTemplate(
		'<tpl for=".">',
            '<div class="thumb-wrap" id="{link}">',
		    '<div class="thumb"><img src="{thumbnail}" title="{title}"></div>',
		    '<span class="x-editable">{shortName}</span></div>',
        '</tpl>',
        '<div class="x-clear"></div>'
	);
	
	var media_view = new Ext.DataView({
			id: engine+'-view',
            store: this.store,
            tpl: tpl,
            autoHeight:true,
            multiSelect: true,
            overClass:'x-view-over',
            itemSelector:'div.thumb-wrap',
//            emptyText: 'No images to display',
			prepareData: function(data){
                var xf = Ext.util.Format;
                data.shortName = xf.ellipsis(xf.stripTags(data.title), 20);
                return data;
            }		
	});
	
	var view = Ext.getCmp(engine+'-view');
	view.on('dblclick', function(){
		var selNode = media_view.getSelectedNodes()[0];
		var win = window.open(selNode.id);
	});	
	
	Search.MediaSearchPanel.superclass.constructor.call(this, {
   		id: engine+'-panel',
        frame:true,
//        autoHeight:true,
//        collapsible:true,
        layout:'fit',		
      	title:'Search: ',//'+Ext.util.Format.htmlEncode('"'+keyword+'"'),
		closable: true,
		iconCls: se[0]+'-icon',
	
        items:
			media_view
		// items
		,
	    	bbar: new Ext.PagingToolbar({
    			pageSize: tmpPageSize,
   				store: this.store,
		    	displayInfo: true,
		        displayMsg: 'Displaying results {0} - {1} of {2}',
		        emptyMsg: "검색 결과가 없습니다."
        	})	
	});
}
Ext.extend(Search.MediaSearchPanel, Ext.Panel);

//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.IFrameSearchPanel
 * 
 * 검색 결과를 iframe에 보여주는 탭 패널
 * 
 */
Search.IFrameSearchPanel = function(engine) {
	var se = engine.split("-");
	
	if(isNumber(se[0]))
		se[0] = "query";
	
	Search.IFrameSearchPanel.superclass.constructor.call(this, {
   		id: engine+'-panel',
		layout:'border',
      	title:'Search: ',//'+Ext.util.Format.htmlEncode('"'+keyword+'"'),
		closable: true,
		iconCls: se[0]+'-icon',
        items:[
			{
                id:engine+'-preview',
                region:'center',
                height:250,
			    autoScroll:true,
//                title:'콘텐츠 미리 보기',
				html: '<div id = \''+engine+'-preview-body\'><p>콘텐츠를 선택하세요</p></div>', 
                split:true
			} // Preview
		] // items
	});
}
Ext.extend(Search.IFrameSearchPanel, Ext.Panel);

//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.HtmlSearchPanel
 * 
 * 검색 결과를 Html로 보여주는 탭 패널
 * 
 */
Search.HtmlSearchPanel = function(engine) {
	var se = engine.split("-");
	
	Search.HtmlSearchPanel.superclass.constructor.call(this, {
   		id: engine+'-panel',
		layout:'border',
      	title:'Search: ',//'+Ext.util.Format.htmlEncode('"'+keyword+'"'),
		closable: true,
		iconCls: se[0]+'-icon',
        items:[
			{
                id:engine+'-preview',
                region:'center',
                height:250,
			    autoScroll:true,
//                title:'콘텐츠 미리 보기',
				html: '<div id = \''+engine+'-preview-body\'></div>', 
                split:true
			} // Preview
		] // items
	});
}
Ext.extend(Search.HtmlSearchPanel, Ext.Panel);

//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.WebSearchStore
 * 
 * 외부 일반 검색을 위한 데이터 Store
 */
Search.WebSearchStore = function() {
    Search.WebSearchStore.superclass.constructor.call(this, {
        proxy: new Ext.data.HttpProxy({
            url: '/search/searchWeb'
        }),

        reader: new Ext.data.JsonReader({
            root: 'Results',
            totalProperty: 'Total'
        }, [
			{name: 'id', mapping: 'id'},
		    {name: 'title', mapping: 'title'},
			{name: 'link', mapping: 'link'},
			{name: 'desc', mapping: 'desc'},
			{name: 'thumbnail', mapping: 'thumbnail'},
			'content_type'
        ])
    });
	
}

Ext.extend(Search.WebSearchStore, Ext.data.Store, {
    loadResult : function(keyword, target, content_type){ 
        this.baseParams = {
            query: keyword,
			target: target
        };
        this.load({
            params: {
                start:0,
                limit:myPageSize
            }
        });
    }
});

//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.TagStore
 * 
 * 태그를 json 타입으로 얻어온다.
 * 
 */
Search.TagListStore = function(){
    Search.TagListStore.superclass.constructor.call(this, {
        remoteSort: true,

        proxy: new Ext.data.HttpProxy({
            url: '/search/getTags'
        }),

		// file : id, name*, size*, extension*, date(accessed_at)*, content_type*, path, content
        reader: new Ext.data.JsonReader({
            root: 'items',
            totalProperty: 'Total'
        }, [
			{name: 'id', mapping: 'id'},
		    {name: 'name', mapping: 'name'},
		    {name: 'count', mapping: 'count'}
        ])
    });

//    this.setDefaultSort('name', 'ASC');
};
Ext.extend(Search.TagListStore, Ext.data.Store, {
    loadTags : function(){
		this.baseParams = {
            content_type_id : 1,
			id: 0
        };
        this.load({
/*
            params: {
                start:0,
                limit:myPageSize
            }
*/
        });
    }
});


//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.SearchHistoryStore
 * 
 * 검색 로그를 json 타입으로 얻어온다.
 * 
 */
Search.SearchHistoryStore = function(){
    Search.SearchHistoryStore.superclass.constructor.call(this, {
        remoteSort: true,

        proxy: new Ext.data.HttpProxy({
            url: '/basic/api/search/getSearchHistory.php'
        }),

		// file : id, name*, size*, extension*, date(accessed_at)*, content_type*, path, content
        reader: new Ext.data.JsonReader({
            root: 'Results',
            totalProperty: 'Total'
        }, [
			{name: 'id', mapping: 'id'},
		    {name: 'query', mapping: 'query'},
		    {name: 'count', mapping: 'count'},
			{name: 'date', mapping: 'date'}
        ])
    });

//    this.setDefaultSort('name', 'ASC');
};
Ext.extend(Search.SearchHistoryStore, Ext.data.Store, {
    loadSearchHistories : function(){
        this.load({
/*
            params: {
                start:0,
                limit:myPageSize
            }
*/
        });
    }
});

//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.WidgetPanel
 * 
 * 오른쪽 패널의 편리한 도구 패널
 */
Search.WidgetPanel = function() {
	var searchtype_store = new Ext.data.JsonStore({
		url: '/basic/api/search/getSearchCategoriesCombo.php',
		fields: ['id','name'],
		autoLoad: true
	});
	
	var vComboBox = new Ext.form.ComboBox({
		valueField: 'id',
		displayField: 'name',
		mode: 'local',
		editable: false,
		readOnly: true,
		forceSelection: true,
		triggerAction: 'all',
		store: searchtype_store,
		fieldLabel: '검색 대상',
		name: 'stype',
		id: 'stype',
		anchor: '90%'
	});
	
	vComboBox.store.on('load', function(my, record, options) {
		if(scate == '')
			vComboBox.setValue(1); //set first data to default
		else
			vComboBox.setValue(scate);
			
		Ext.getCmp('keyword').setValue(query);
//		vComboBox.setValue(record[0].get('filetype')); //set first data to default
	}); 
	
	Search.WidgetPanel.superclass.constructor.call(this, {
        region:'east',
		id: 'east-panel',
        title: '편리한 도구',
        collapsible: true,
        split:true,
        width: 225,
//        minSize: 50,
//        maxSize: 600,
        layout:'border',
        margins:'0 10 5 0',// 위, 오른쪽, 아래, 왼쪽
        autoScroll:true,
        layoutConfig:{
            animate:true
        },
        items: [
			/*
			 * 검색 FormPanel
			 */
			new Ext.FormPanel({
				region: 'north',
				height: 180,
				collapsible: true,
				frame: true,
				id: 'search-form',
				iconCls: 'query-icon',
				labelWidth: 75,
				labelAlign: 'top',
//				url: '/content/searchContents',
				title: "검색",
				bodyStyle: 'padding: 0px 0px 0px 0px',
				autoScroll: true,
				items: [
					vComboBox,
					new Ext.form.TextField({
						fieldLabel: '키워드를 입력하세요',
						name: 'keyword',
						anchor: '90%',
						id: 'keyword'
					}) 
				],
				buttons: [
					{
						text: '검색',
//						iconCls: 'search-icon',
						handler: this.searchKeyword
					}
				]
			}),// FormPanel

			/*
			 * 인기 검색어를 위한 GridPanel
			 */
	        new Ext.grid.GridPanel({
	  		    id:'querylog-grid',
				region: 'center',
				title: "인기 검색어",
//	            height:300,
				width: 210,
	            store: shs,
				autoScroll: true,
				collapsible: true,
				enableDragDrop: true,
				enableColumnMove: false,
				iconCls: 'query-log-icon',
				anchor: '90%',
				autoExpandColumn: true,
		        sm:new Ext.grid.RowSelectionModel({singleSelect:true}),
				columns: [
					{id: 'name', header: "검색어", dataIndex: 'query'},
					{id: 'count', header: "검색수", width: 35, dataIndex: 'count'}
				],
				defaultSortable: true,
	            trackMouseOver:false,
	            loadMask: {msg:'검색어 로그 로딩 중입니다...'},
	            viewConfig: {
	                forceFit:true,
	                enableRowBody:true,
	                getRowClass : function(record, rowIndex, p, bs){
	                    if(this.showPreview){
	                        p.body = '<p>'+record.data.url+'</p>';
	                        return 'x-grid3-row-expanded';
	                    }
	                    return 'x-grid3-row-collapsed';
	                },
	                showPreview:false
	            } // viewConfig
	        }),
			/*
			 * 온톨로지 검색을 위한 GridPanel
			 */
	        new Ext.grid.GridPanel({
	  		    id:'ontology-grid',
				region: 'south',
				title: "온톨로지",
	            height:260,
//				width: 210,
	            store: os,
				autoScroll: true,
				collapsible: true,
//				collapsed: true,
				enableDragDrop: true,
				enableColumnMove: false,
				iconCls: 'ontology-icon',
				anchor: '90%',
				autoExpandColumn: true,
		        sm:new Ext.grid.RowSelectionModel({singleSelect:true}),
				columns: [
					{id: 'name', header: "용어 이름", dataIndex: 'name'},
					{id: 'termtype', header: "종류", width: 35, dataIndex: 'termtype'}
				],
				defaultSortable: true,
	            trackMouseOver:false,
	            loadMask: {msg:'온톨로지 목록 로딩 중입니다...'},
	            viewConfig: {
	                forceFit:true,
	                enableRowBody:true,
	                getRowClass : function(record, rowIndex, p, bs){
	                    if(this.showPreview){
	                        p.body = '<p>'+record.data.desc+'</p>';
	                        return 'x-grid3-row-expanded';
	                    }
	                    return 'x-grid3-row-collapsed';
	                },
	                showPreview:false
	            } // viewConfig
	            ,split:true
	        })			
		]
	});
	
	// 검색창 선택 상태에서 "Enter" 키를 치면 검색을 수행한다.
	var search = Ext.getCmp('keyword');
	search.on('specialkey', this.onEnter);
	
	// 더블클릭하면 검색한다.
	var grid = Ext.getCmp('ontology-grid');
	grid.on('rowdblclick', function(grid){
		var node = grid.getSelectionModel().getSelected();
		var ftcombo = Ext.getCmp('stype');
		
		window.location.href="/basic/search/?query="+encodeURI(node.data.name)+"&scate="+ftcombo.getValue();
	});	
	
	// 더블클릭하면 검색한다.
	var grid = Ext.getCmp('querylog-grid');
	grid.on('rowdblclick', function(grid){
		var node = grid.getSelectionModel().getSelected();
		var ftcombo = Ext.getCmp('stype');
			
		window.location.href="/basic/search/?query="+encodeURI(node.data.query)+"&scate="+ftcombo.getValue();
		
	});
	
};

Ext.extend(Search.WidgetPanel, Ext.Panel, {
	// "Enter" 키를 치면 검색을 수행한다.
	onEnter: function(f, e) {
		if(e.getKey() == Ext.EventObject.ENTER) {
			var ftcombo = Ext.getCmp('stype');
			var query = Ext.getCmp('keyword').getValue();
			window.location.href="/basic/search/?query="+encodeURI(query)+"&scate="+ftcombo.getValue();
		}
	},
	searchKeyword : function() {
	// 검색
		var ftcombo = Ext.getCmp('stype');
		var query = Ext.getCmp('keyword').getValue();
		window.location.href="/basic/search/?query="+encodeURI(query)+"&scate="+ftcombo.getValue();
	}
});


/* 
 * Search.SettingDialog
 * 
 * 카테고리 설정 Dialog
 * 
 */
Search.SettingDialog = function() {
	
	category_store.loadCategory();
	
	
	Search.SettingDialog.superclass.constructor.call(this, {
		id: 'category-setting-dialog',
		title: '카테고리 설정',
		layout: 'border', 
		width: 600,
		height: 400,
		closeAction: 'hide',
		iconCls: 'query-icon',
		plain: true,
		modal: true,
		items: [
			new Ext.grid.GridPanel({
                    region:'west',
                    id:'category-grid',
                    width: 150,
                    store: category_store,
//                  cm: cm,
					itemCls: "x-hide-display",
					columns: [
						{id: 'title', header: "카테고리 이름", sortable: true, dataIndex: 'name'}
					],
					defaultSortable: true,
                    trackMouseOver:false,
                    loadMask: {msg:'컨텐츠 로딩 중입니다...'},
                    viewConfig: {
                        forceFit:true,
                        enableRowBody:true,
                        getRowClass : function(record, rowIndex, p, ds){
                            if(this.showPreview){
                                p.body = '<p>'+record.data.content+'</p>';
                                return 'x-grid3-row-expanded';
                            }
                            return 'x-grid3-row-collapsed';
                        },
                        showPreview:false
                    } // viewConfig
                    ,
                    tbar:[
                          {
                              text:'추가',
                              iconCls: 'yellow-add-icon',
                              handler: this.addCategory
                          },
                          {
                              text:'수정',
							  iconCls: 'edit-icon',
                              handler: this.renameCategory
                              
                          },
//							'-',
                          {
                              text:'삭제',
                              iconCls: 'yellow-del-icon',
							  handler: this.deleteCategory
                              
                          }
                      ] //tbar
                }) //GridPanel
                ,
                new Ext.grid.GridPanel({
                    region:'center',
                    id:'searchengine-grid',
                    store: searchengine_store,
//                  cm: cm,
					itemCls: "x-hide-display",
					columns: [
						{id: 'title', header: "검색 사이트 이름", sortable: true, dataIndex: 'name'}
                        //,{id: 'title', header: "검색 엔진",  width: 60, sortable: true, dataIndex: 'engine'}
					],
					defaultSortable: true,
                    trackMouseOver:false,
                    loadMask: {msg:'컨텐츠 로딩 중입니다...'},
                    viewConfig: {
                        forceFit:true,
                        enableRowBody:true,
                        getRowClass : function(record, rowIndex, p, ds){
                            if(this.showPreview){
                                p.body = '<p>'+record.data.content+'</p>';
                                return 'x-grid3-row-expanded';
                            }
                            return 'x-grid3-row-collapsed';
                        },
                        showPreview:false
                    } // viewConfig
                    ,
                    tbar:[
                          {
                              text:'제거',
                              iconCls: 'move-right-icon',
							  handler: this.removeEngine
                              
                          }
                      ] //tbar
                }) //GridPanel
                ,
                new Ext.grid.GridPanel({
                    region:'east',
                    id:'altengine-grid',
                    width:250,
                    store: altengine_store,
                    //                  cm: cm,
                    itemCls: "x-hide-display",
                    columns: [
                        {id: 'title', header: "검색 사이트 이름", sortable: true, dataIndex: 'name'},
                                                {id: 'title', header: "검색 엔진",  width: 80, sortable: true, dataIndex: 'engine'}
                    ],
                    defaultSortable: true,
                    trackMouseOver:false,
                    loadMask: {msg:'컨텐츠 로딩 중입니다...'},
                    viewConfig: {
                        forceFit:true,
                        enableRowBody:true,
                        getRowClass : function(record, rowIndex, p, ds){
                            if(this.showPreview){
                                p.body = '<p>'+record.data.content+'</p>';
                                return 'x-grid3-row-expanded';
                            }
                            return 'x-grid3-row-collapsed';
                        },
                        showPreview:false
                    } // viewConfig
                    ,
                    tbar:[
                        {
                            text:'등록',
                            iconCls: 'move-left-icon',
							handler: this.addEngine
                            
                        },
                          {
                              text:'추가',
                              iconCls: 'yellow-add-icon',
                              handler: this.createEngine
                          },
                          {
                              text:'수정',
							  iconCls: 'edit-icon',
                              handler: this.renameEngine
                              
                          },
//							'-',
                          {
                              text:'삭제',
                              iconCls: 'yellow-del-icon',
							  handler: this.deleteEngine
                          }						
                    ] //tbar
                }) //GridPanel
		]
	});
	
	altengine_store.loadEngine();
        
        var grid = Ext.getCmp('category-grid');
        grid.on('rowclick', function(grid, dataIndex) {
            var node = grid.getSelectionModel().getSelected();
            searchengine_store.loadEngine(node.data.id);
//            altengine_store.loadEngine(node.data.id);
        });
		
		var win = Ext.getCmp('category-setting-dialog');
		win.on('hide', function(set_win) {
			var ftcombo = Ext.getCmp('stype');
			ftcombo.store.load();
//			window.location.href="/search/application?query="+encodeURI(query)+"&scate="+scate;
		});
};

Ext.extend(Search.SettingDialog, Ext.Window, {
	addCategory : function() {
		var window = new Search.CategoryCreateDialog();
		window.show(this);
	}
        ,
        renameCategory : function() {
            var category_grid = Ext.getCmp('category-grid');
            var node = category_grid.getSelectionModel().getSelected();
            if(node != null) {
	      if(node.data.id < 10) {
		alert("이 기능을 사용할 수 없습니다");
		return;
	      }
              var window = new Search.CategoryRenameDialog();
              window.show(this);        
            }
            else
                    Ext.MessageBox.alert('Message', '수정할 카테고리를 선택하세요.');
            
        }
        ,
        deleteCategory: function() {
			var category_grid = Ext.getCmp('category-grid');
			var node = category_grid.getSelectionModel().getSelected();
			if(node != null) {
	      if(node.data.id < 10) {
		alert("이 기능을 사용할 수 없습니다");
		return;
	      }
				Ext.MessageBox.confirm('Message', '정말로 지우시겠습니까?' , function(btn) {
	                            if(btn == 'yes') {
	                                    var category_grid = Ext.getCmp('category-grid');
	                                    var node = category_grid.getSelectionModel().getSelected();
	//                                    Ext.MessageBox.alert('Message', '카테고리 '+node.data.id+' 삭제(구현해야함)');
	                                    category_store.deleteCategory(node, node.data.id);
										
										category_grid.getSelectionModel().selectRow(0); // row index
										searchengine_store.loadEngine(1); // category id
	                            }
	                        });
			}
			else
				Ext.MessageBox.alert('Message', '삭제할 카테고리를 선택하세요.');
		}
        ,
        addEngine: function() {
            var category_grid = Ext.getCmp('category-grid');
            var category_node = category_grid.getSelectionModel().getSelected();
            
            var engine_grid = Ext.getCmp('altengine-grid');
            var engine_node = engine_grid.getSelectionModel().getSelected();
            
            if(category_node != null) {
                if(engine_node != null) {
	      if(category_node.data.id < 10) {
		alert("이 기능을 사용할 수 없습니다");
		return;
	      }
                    searchengine_store.addEngine(category_node.data.id, engine_node.data.id);
                }
                else
                    Ext.MessageBox.alert('Message', '추가할 검색엔진을 선택하세요.');
            }
            else
                Ext.MessageBox.alert('Message', '추가할 카테고리를 선택하세요.');
        }
        ,
        removeEngine: function() {
            var category_grid = Ext.getCmp('category-grid');
            var category_node = category_grid.getSelectionModel().getSelected();
            
            var engine_grid = Ext.getCmp('searchengine-grid');
            var engine_node = engine_grid.getSelectionModel().getSelected();
            
            if(category_node != null) {
                if(engine_node != null) {
	      if(category_node.data.id < 10) {
		alert("이 기능을 사용할 수 없습니다");
		return;
	      }
                    searchengine_store.removeEngine(engine_node, category_node.data.id, engine_node.data.id);
                }
                else
                    Ext.MessageBox.alert('Message', '삭제할 검색엔진을 선택하세요.');
            }
            else
                Ext.MessageBox.alert('Message', '삭제할 카테고리를 선택하세요.');
        }
		,
		createEngine : function() {
			var window = Ext.getCmp('engine-create-dialog');
			
			if(window == null)
				window = new Search.EngineCreateDialog();
				
			window.show(this);
		}
		,
        renameEngine : function() {
			var window = Ext.getCmp('engine-rename-dialog');
			var engine_grid = Ext.getCmp('altengine-grid');
            var node = engine_grid.getSelectionModel().getSelected();
            if(node != null) {
	      if(node.data.id < 40) {
		alert("이 기능을 사용할 수 없습니다");
		return;
	      }
			  if(window == null)
              	window = new Search.EngineRenameDialog();
              
			  window.show(this);        
			  
			  Ext.getCmp('rsname').setValue(node.data.name);
			  Ext.getCmp('rsname').focus(true, 10);
			  Ext.getCmp('rsurl').setValue(node.data.engine.split(";")[1]);
            }
            else
                    Ext.MessageBox.alert('Message', '수정할 검색 사이트 선택하세요.');
            
        }
		,
        deleteEngine: function() {
			var engine_grid = Ext.getCmp('altengine-grid');
			var node = engine_grid.getSelectionModel().getSelected();
			if(node != null) {
	      if(node.data.id < 40) {
		alert("이 기능을 사용할 수 없습니다");
		return;
	      }
				Ext.MessageBox.confirm('Message', '정말로 지우시겠습니까?' , function(btn) {
	                            if(btn == 'yes') {
	                                    var engine_grid = Ext.getCmp('altengine-grid');
	                                    var node = engine_grid.getSelectionModel().getSelected();
	//                                    Ext.MessageBox.alert('Message', '카테고리 '+node.data.id+' 삭제(구현해야함)');
	                                    altengine_store.deleteEngine(node, node.data.id);
	                            }
	                        });
			}
			else
				Ext.MessageBox.alert('Message', '삭제할 카테고리를 선택하세요.');
		}
	      
});

//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.CategoryStore
 * 
 * 검색 카테고리를 위한 데이터 Store
 */
Search.CategoryStore = function() {
    Search.CategoryStore.superclass.constructor.call(this, {
        proxy: new Ext.data.HttpProxy({
            url: '/basic/api/search/getSearchCategories.php'
        }),

        reader: new Ext.data.JsonReader({
            root: 'Results',
            totalProperty: 'Total'
        }, ['id', 'name' ])
    });
	
}

Ext.extend(Search.CategoryStore, Ext.data.Store, {
    loadCategory : function(){
        this.load({
/*
            params: {
                start:0,
                limit:myPageSize
            }
*/
        });		
    }
    ,
    deleteCategory: function(row, id) {
        this.remove(row);
        Ext.Ajax.request({
            url:"/basic/search/deleteCategory.php",
            params: {"id" : id}
        });
    }
});

//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.SearchEngineStore
 * 
 * 검색엔진을 위한 데이터 Store
 */
Search.SearchEngineStore = function() {
    Search.SearchEngineStore.superclass.constructor.call(this, {
        proxy: new Ext.data.HttpProxy({
            url: '/basic/api/search/getSearchEngines.php'
        }),

        reader: new Ext.data.JsonReader({
            root: 'Results',
            totalProperty: 'Total'
        }, ['id', 'name', 'engine'
        ])
    });
	
}

Ext.extend(Search.SearchEngineStore, Ext.data.Store, {
    loadEngine : function(category){
		this.baseParams = {
				category: category
		};
        this.load({
/*
            params: {
                start:0,
                limit:myPageSize
            }
*/
        });		
    }
    ,
    addEngine: function(category_id, engine_id) {
        Ext.Ajax.request({
            url:"/basic/search/addEngine.php",
            success: function(response) {
                 searchengine_store.loadEngine(category_id);
//                 altengine_store.loadEngine(category_id);
            },
            params: {"category_id" : category_id, "engine_id": engine_id}
        });
        
       
    }
    ,
    removeEngine: function(row, category_id, engine_id) {
        Ext.Ajax.request({
            url:"/basic/search/removeEngine.php",
            success: function(response) {
                 searchengine_store.loadEngine(category_id);
//                 altengine_store.loadEngine(category_id);
            },
            params: {"category_id" : category_id, "engine_id": engine_id}
        });
    }
});

//////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Search.AltEngineStore
 * 
 * 카테고리에 속하지 않은 검색엔진을 위한 데이터 Store
 */
Search.AltEngineStore = function() {
    Search.AltEngineStore.superclass.constructor.call(this, {
        proxy: new Ext.data.HttpProxy({
            url: '/basic/api/search/getAltEngines.php'
        }),

        reader: new Ext.data.JsonReader({
            root: 'items',
            totalProperty: 'Total'
        }, ['id', 'name', 'engine'
        ])
    });
	
}

Ext.extend(Search.AltEngineStore, Ext.data.Store, {
    loadEngine : function(category){
		this.baseParams = {
				category: category
		};
        this.load({
/*
            params: {
                start:0,
                limit:myPageSize
            }
*/
        });		
    }
	,
    deleteEngine: function(row, id) {
        this.remove(row);
        Ext.Ajax.request({
            url:"/basic/search/deleteEngine.php",
            params: {"id" : id},
			success: function(response) {
				var category_grid = Ext.getCmp('category-grid');
				var category_node = category_grid.getSelectionModel().getSelected();
				searchengine_store.loadEngine(category_node.data.id);
			}
        });
    }
});

/* 
 * Search.CategoryCreateDialog
 * 
 * 카테고리 생성을 위한 Dialog
 * 
 */
Search.CategoryCreateDialog = function() {
	Search.CategoryCreateDialog.superclass.constructor.call(this, {
		id: 'category-create-dialog',
		title: '카테고리 생성',
		layout: 'fit', 
		width: 300,
		height: 150,
		closeAction: 'hide',
		iconCls: 'query-icon',
		modal: true,
		plain: true,
		items: [
			new Ext.FormPanel({
				id: 'category-create-form',
				collapsible: true,
				autoScroll: true,
				frame: true,
				labelWidth: 75,
				labelAlign: 'top',
				url: '/basic/search/createCategory.php',
				title: "카테고리",
				header: false,
				bodyStyle: 'padding: 0px 0px 0px 0px',
				autowidth: true,
				items: [
					{
						xtype: 'textfield',
						fieldLabel: '카테고리 이름',
						name: 'cname',
						id: 'cname',
						anchor: '100%'
					}
				],
				buttons: [
					{
						text: '저장',
						iconCls: 'save-icon',
						handler: this.addCategory
					}
				]
			})// FormPanel
		]
	});
};

Ext.extend(Search.CategoryCreateDialog, Ext.Window, {
	addCategory : function() {
		var window = Ext.getCmp('category-create-dialog');
		var category = Ext.getCmp('category-create-form');
		
		if(category.getComponent('cname').getValue() == '') {
			Ext.MessageBox.alert('Message', '카테고리 이름을 입력하세요.');
			return;
		}
                
		 category.form.submit({
			// params: {"id": node.id},
			 waitMsg:'카테고리를 저장 중 입니다...',
			 failure: function(){
				 window.close();
				 Ext.MessageBox.alert('Message', '카테고리 생성에 실패하였습니다.');
			 },	
			 success: function(){
				 category.form.reset();
				 // 트리로드 부분 갱신 or 전체 갱신하고 경로 확장
				 // ds.loadContents(2,node.id);
				  category_store.loadCategory();
				 
				 window.close();
				 window.destroy();
			 }
		 });
	}
});

/* 
 * Search.CategoryRenameDialog
 * 
 * 카테고리 수정을 위한 Dialog
 * 
 */
Search.CategoryRenameDialog = function() {
	Search.CategoryRenameDialog.superclass.constructor.call(this, {
		id: 'category-rename-dialog',
		title: '카테고리 수정',
		layout: 'fit', 
		width: 300,
		height: 150,
		closeAction: 'hide',
		iconCls: 'query-icon',
		modal: true,
		plain: true,
		items: [
			new Ext.FormPanel({
				id: 'category-rename-form',
				collapsible: true,
				autoScroll: true,
				frame: true,
				labelWidth: 75,
				labelAlign: 'top',
				url: '/basic/search/renameCategory.php',
				title: "카테고리",
				header: false,
				bodyStyle: 'padding: 0px 0px 0px 0px',
				autowidth: true,
				items: [
					{
						xtype: 'textfield',
						fieldLabel: '카테고리 이름',
						name: 'rname',
						id: 'rname',
						anchor: '100%'
					}
				],
				buttons: [
					{
						text: '저장',
						iconCls: 'save-icon',
						handler: this.renameCategory
					}
				]
			})// FormPanel
		]
	});
};
Ext.extend(Search.CategoryRenameDialog, Ext.Window, {
	renameCategory : function() {
		var window = Ext.getCmp('category-rename-dialog');
		var category = Ext.getCmp('category-rename-form');
		var category_grid = Ext.getCmp('category-grid');
        var node = category_grid.getSelectionModel().getSelected();
		
		if(category.getComponent('rname').getValue() == '') {
			Ext.MessageBox.alert('Message', '카테고리 이름을 입력하세요.');
			return;
		}
                
		 category.form.submit({
			 params: {"id": node.data.id},
			 waitMsg:'카테고리를 수정 중 입니다...',
			 failure: function(){
				 window.close();
				 Ext.MessageBox.alert('Message', '카테고리 수정에 실패하였습니다.');
			 },	
			 success: function(){
				 category.form.reset();
				 // 트리로드 부분 갱신 or 전체 갱신하고 경로 확장
				 // ds.loadContents(2,node.id);
				  category_store.loadCategory();
				 
				 window.close();
				 window.destroy();
			 }
		 });
	}
});

/* 
 * Search.EngineCreateDialog
 * 
 * 검색 사이트  생성을 위한 Dialog
 * 
 */
Search.EngineCreateDialog = function() {
	Search.EngineCreateDialog.superclass.constructor.call(this, {
		id: 'engine-create-dialog',
		title: '검색 사이트 추가',
		layout: 'fit', 
		width: 300,
		height: 180,
		closeAction: 'hide',
		iconCls: 'query-icon',
		modal: true,
		plain: true,
		items: [
			new Ext.FormPanel({
				id: 'engine-create-form',
				collapsible: true,
				autoScroll: true,
				frame: true,
				labelWidth: 75,
				labelAlign: 'top',
				url: '/basic/search/createEngine.php',
				title: "검색 사이트",
				header: false,
				bodyStyle: 'padding: 0px 0px 0px 0px',
				autowidth: true,
				items: [
					{
						xtype: 'textfield',
						fieldLabel: '검색 사이트 이름',
						name: 'sname',
						id: 'sname',
						anchor: '100%'
					},
					{
						xtype: 'textfield',
						fieldLabel: '검색 사이트 주소',
						name: 'surl',
						id: 'surl',
						anchor: '100%'
					}
				],
				buttons: [
					{
						text: '저장',
						iconCls: 'save-icon',
						handler: this.createEngine
					}
				]
			})// FormPanel
		]
	});
};

Ext.extend(Search.EngineCreateDialog, Ext.Window, {
	createEngine : function() {
		var window = Ext.getCmp('engine-create-dialog');
		var engine = Ext.getCmp('engine-create-form');
		
		if(engine.getComponent('sname').getValue() == '') {
			Ext.MessageBox.alert('Message', '검색 사이트 이름을 입력하세요.');
			return;
		}
		
		if(engine.getComponent('surl').getValue() == '') {
			Ext.MessageBox.alert('Message', '검색 사이트 주소를 입력하세요.');
			return;
		}
                
		 engine.form.submit({
			// params: {"id": node.id},
			 waitMsg:'검색 사이트를 저장 중 입니다...',
			 failure: function(){
				 window.close();
				 Ext.MessageBox.alert('Message', '검색 사이트 생성에 실패하였습니다.');
			 },	
			 success: function(){
				 engine.form.reset();
				 // 트리로드 부분 갱신 or 전체 갱신하고 경로 확장
				 // ds.loadContents(2,node.id);
				 altengine_store.loadEngine();
				 
				 window.close();
				 window.destroy();
			 }
		 });
	}
});

/* 
 * Search.EngineRenameDialog
 * 
 * 검색 사이트 수정을 위한 Dialog
 * 
 */
Search.EngineRenameDialog = function() {
	Search.EngineRenameDialog.superclass.constructor.call(this, {
		id: 'engine-rename-dialog',
		title: '검색 사이트 수정',
		layout: 'fit', 
		width: 300,
		height: 180,
		closeAction: 'hide',
		iconCls: 'query-icon',
		modal: true,
		plain: true,
		items: [
			new Ext.FormPanel({
				id: 'engine-rename-form',
				collapsible: true,
				autoScroll: true,
				frame: true,
				labelWidth: 75,
				labelAlign: 'top',
				url: '/basic/search/renameEngine.php',
				title: "카테고리",
				header: false,
				bodyStyle: 'padding: 0px 0px 0px 0px',
				autowidth: true,
				items: [
					{
						xtype: 'textfield',
						fieldLabel: '검색 사이트 이름',
						name: 'rsname',
						id: 'rsname',
						anchor: '100%'
					},
					{
						xtype: 'textfield',
						fieldLabel: '검색 사이트 주소',
						name: 'rsurl',
						id: 'rsurl',
						anchor: '100%'
					}
				],
				buttons: [
					{
						text: '저장',
						iconCls: 'save-icon',
						handler: this.renameEngine
					}
				]
			})// FormPanel
		]
	});
};
Ext.extend(Search.EngineRenameDialog, Ext.Window, {
	renameEngine : function() {
		var window = Ext.getCmp('engine-rename-dialog');
		var engine = Ext.getCmp('engine-rename-form');
		var engine_grid = Ext.getCmp('altengine-grid');
        var node = engine_grid.getSelectionModel().getSelected();
		
		if(engine.getComponent('rsname').getValue() == '') {
			Ext.MessageBox.alert('Message', '검색 사이트 이름을 입력하세요.');
			return;
		}
		
		if(engine.getComponent('rsurl').getValue() == '') {
			Ext.MessageBox.alert('Message', '검색 사이트 주소를 입력하세요.');
			return;
		}
                
		 engine.form.submit({
			 params: {"id": node.data.id},
			 waitMsg:'검색 사이트를 수정 중 입니다...',
			 failure: function(){
				 window.close();
				 Ext.MessageBox.alert('Message', '검색 사이트 수정에 실패하였습니다.');
			 },	
			 success: function(){
				 engine.form.reset();
				 // 트리로드 부분 갱신 or 전체 갱신하고 경로 확장
				 // ds.loadContents(2,node.id);
				 
				 window.close();
				 window.destroy();
				 
				 altengine_store.loadEngine(); // refresh 안됨
				 
				 var category_grid = Ext.getCmp('category-grid');
				 var category_node = category_grid.getSelectionModel().getSelected();
				 searchengine_store.loadEngine(category_node.data.id);
				 
			 }
		 });
	}
});
