/**
 * global search main script
 */

/**
 * 스트링 객체 확장 메소드
 * 
 * @param i
 *            index
 * @param str
 *            삽입할 string
 * @return 결과 string
 */
String.prototype.insert = function(i, str) {
	return this.substring(0, i) + str + this.substring(i);
};
//Array Remove - By John Resig (MIT Licensed)
Array.remove = function(array, from, to) {
	var rest = array.slice((to || from) + 1 || array.length);
	if(array.length > 0){
		array.length = from < 0 ? array.length + from : from;
	}
	return array.push.apply(array, rest);
};

////////////////////////////////////////////////////////////////
// gnb_search
////////////////////////////////////////////////////////////////
function gnb_search(config) {
	///////////////////////////////////////////////////////
	// private variables
	///////////////////////////////////////////////////////
	/**
	 * 마스크 여부
	 */
	var isMask = false;
	/**
	 * visual search 검색 결과
	 */
	var visualDataList = null;
	/**
	 * 코드 값
	 */
	var SEARCH_BTN_WATING	= 1;
	var SEARCH_BTN_NOINPUT	= 2;
	var SEARCH_BTN_TYPING	= 3;

	/**
	 * 설정
	 */
	var config = config || {};
	config.recommendKeyword = config.recommendKeyword || '';
	config.isRecommendClick = config.recommendKeyword.length > 0;
	config.isSearchReady = true;

	// /////////////////////////////////////////////////////
	// private functions
	// /////////////////////////////////////////////////////
	/**
	 * Visual Search JSON 검색
	 * 
	 * @param input
	 * @return
	 */
	function getJSONVisualSearch(input) {
		$.getJSON(config.visualSearchUrl + '?query=' + input, function(data) {
			$('.layer_search').show();
			
			var dataList = data.xperVisual;
			if (dataList.length > 0 && !dataList[dataList.length - 1]) {
				Array.remove(dataList, dataList.length - 1);
			}

			if (dataList.length == 0) {
				showNoResults();
			} else if (dataList.length == 1) {
				var visualData = dataList[0];
				showProductMatchView(visualData);
			} else {
				showListView(dataList);
			}
			config.isSearchReady = false;
		});
	}

	/**
	 * 전체 dialog를 닫습니다.
	 * @return
	 */
	function hideDialogAll() {
		// Global Main Search List
		$('#layer_search_list').hide();
		$('#layer_search_list').empty();

		// Product Match View
		$('.match_view').hide();
		$('.match_view div.thumb').empty();

		// Layer Popup Product In Brief
		$('#layer_pop_brief_1').hide();
		$('div.thumb_sec').empty();
		
		// No product results found
		$('div.layer_search .no_results').hide();
	}

	/**
	 * 결과 없음 layer를 display
	 */
	function showNoResults() {
		hideDialogAll();
		$('div.layer_search .no_results').show();
	}

	/**
	 * 해당 product의 detail layer를 display
	 * @param visualData product data
	 */
	function showProductMatchView(visualData) {
		var	visualQuery = document.getElementById("input_search").value;	// Omniture Add
		hideDialogAll();
		$('.match_view').show();
		$('.match_view div.thumb')
			.append('<a href="' + visualData.url + '" onclick="visual(\' '+visualQuery+' \' )" ><img src="'+ visualData.img3 +'"/></a><br/>')
			.append('<a href="' + visualData.url + '" onclick="visual(\' '+visualQuery+' \' )" ><img src="/images/common/btn/bt_detail_view.gif"/></a>');

		$('.match_view dl.detail')
			.empty()
			.append('<dt>' + visualData.pd_model + '<br /><span>' + visualData.visualkeyword + '</span></dt>');
		
		var dd = $('<dd></dd>').appendTo($('.match_view dl.detail'));
		//var features = visualData.feature.split('\u25B6');
		var features = visualData.feature.split('##');
		for (var i = 0; i < 5; i++) {
			if (features[i].length > 0) {
				dd.append('<div class="product_match_features">' + features[i] + '</div>');
			} else {
				dd.append('<div style="height:20px"></div>');
			}
		}


		var dd_icon = null;
		for (var i = 1; i <= 10; i++) {
			if (i == 1 || i == 6) {
				dd_icon = $('<dd class="icon"></dd>').appendTo($('.match_view dl.detail'));
			}
			var fimg = visualData['featureimg' + i];
			if (fimg && fimg.length > 0) {
				dd_icon
					.append('<span><img src="' + fimg + '"/><br/>' + visualData['featureimgnm' + i] + '</span>');
			}
		}

		$("div.product_match_features").autoEllipsis();
	}

	/**
	 * 검색된 visual search의 detail view layer를 display
	 * @param visualData product data
	 */
	function showDetailView(visualData) {
		var	visualQuery = document.getElementById("input_search").value;	// Omniture Add
		$('#layer_pop_brief_1').show();
		$('div.thumb_sec')
			.empty()
			.append('<div class="thumb_img"><a href="' + visualData.url + '" onclick="visual(\' '+visualQuery+' \' )" ><img src="'+ visualData.img2 +'" title="' + visualData.pd_model + '" alt="' + visualData.pd_model  +'" /></a></div>')
			.append('<a href="' + visualData.url + '" onclick="visual(\' '+visualQuery+' \' )" ><img src="/images/common/btn/bt_detailview_off.gif" onmouseover="ImageOver(this)" onmouseout="ImageOut(this)" alt="Detail View" /></a>');
		
		
		var descript_sec = $('.descript_sec dl.descript_txt');
		descript_sec
			.empty()
			.append('<dt>' + visualData.pd_model + '<br /><em>' + visualData.visualkeyword + '</em></dt>');
		
		//var features = visualData.feature.split('\u25B6');
		var features = visualData.feature.split('##');
		for (var i = 0; i < 5; i++) {
			if (features[i].length > 0) {
				descript_sec
				.append('<dd><div class="product_features">' + features[i] + '</div></dd>');
			} else {
				descript_sec
					.append('<dd class="empty_featrues"></dd>');
			}
		}
		
		var featureIcons = $('.descript_sec ul.icon');
		featureIcons.empty();
		for (var i = 1; i <= 10; i++) {
			var fimg = visualData['featureimg' + i];
			if (fimg && fimg.length > 0) {
				featureIcons
					.append('<li><img src="' + fimg + '" alt="' + visualData['featureimgnm' + i] + '" /></li>');
			}
		}
		
		$("div.product_features").autoEllipsis();
	}
	
	/**
	 * visual search 결과를 display
	 * @param dataList 검색된 결과 리스트
	 * @return
	 */
	function showListView(dataList) {
		var	visualQuery = document.getElementById("input_search").value;	// Omniture Add
		visualDataList = dataList;
		hideDialogAll();
		$('#layer_search_list').show();
		for (var i = 0; i < dataList.length; i++) {
			var visualData = dataList[i];
			var li = $('<li></li>').addClass('productView');
			if (i % 5 == 0) {
				li.addClass('first');
			}		
			li.append($('<a href="' + visualData.url + '" onclick="visual(\' '+visualQuery+' \' )" style="display:block; cursor:pointer;"><span class="thumb"><img src="' + visualData.img + '"/></span><span class="title">' + visualData.pd_model + '</span></a>'));
			li.append($('<div class="bt_icon"><img id="_in_brief' + i + '" onmousedown="showDetailViewByIndex(' + i + ')" onmouseover="overInbrief(' + i + ')" src="/images/common/btn/ico_brief_on.gif" style="cursor:pointer"/><img id="_support' + i + '" onmousedown="moveSupportPage(' + i + ')" onmouseover="overSupport(' + i + ')" onmouseout="overInbrief(' + i + ')" src="/images/common/btn/ico_support_off.gif" style="cursor:pointer"/></div>'));
			
			li.appendTo($('#layer_search_list'));
		}
		for (var i = dataList.length; i < 10; i++) {
			var li = $('<li></li>');
			if (i % 5 == 0) {
				li.addClass('first');
			}
			li.appendTo($('#layer_search_list'));
		}
		
	}

	/**
	 * 검색 layer를 제외한 다른 부분 mask.
	 * @return
	 */
	function maskPanel() {
		if (!isMask) {
			if (config.onMaskPanel) config.onMaskPanel();
			$.blockUI({message : null});
			$("#content_p").block( {message : null});
			$("#content_e").block({message : null});
			if (config.isAsideBlock) $("#aside_main").block({message : null});

			$('.layer_search_dialog').hide();
			isMask = true;
		}
	}

	/**
	 * unmask 처리
	 * @return
	 */
	function unmaskPanel() {
		if (isMask) {
			$.unblockUI();
			$("#content_p").unblock();
			$("#content_e").unblock();
			if (config.isAsideBlock) $("#aside_main").unblock();

			$('.layer_search_dialog').hide();
			isMask = false;
			setTimeout( function() { if (config.onUnmaskPanel) config.onUnmaskPanel(); }, 3000);
		}
		$('.layer_search').hide();
	}

	/**
	 * 검색 textBox를 초기화
	 */
	function textBoxInit() {
		setRecommendKeyword();		
		if (config.recommendKeyword.length == 0) {
			if ($('#input_search').hasClass('searchbox_focus')) {
				$('#input_search').removeClass('searchbox_focus');
			}
		}
		toggleInputSearchButton(SEARCH_BTN_WATING);
		
		// 자동완성 검색창을 숨김
		$('#input_search')[0].autocompleter.hideResultsNow();
		config.beforeInputValue = '';
	}

	/**
	 * 검색 textBox를 입력상태로 전환
	 */
	function textBoxTyping() {
		if (!$('#input_search').hasClass('searchbox_focus')) {
			$('#input_search').addClass('searchbox_focus');
		}
		if ($('#input_search').val().length == 0) { 
			toggleInputSearchButton(SEARCH_BTN_NOINPUT);
		} else {
			toggleInputSearchButton(SEARCH_BTN_TYPING);
		}
	}
	
	/**
	 * 검색 텍스트 박스 옆의 버튼을 토글합니다.
	 * @param type
	 * @return
	 */
	function toggleInputSearchButton(type) {
		if (type == SEARCH_BTN_WATING) {
			$('#input_search_btn').show();
			$('#input_search_none').hide();
			$('#input_search_clear').hide();
		} else if (type == SEARCH_BTN_NOINPUT) {
			$('#input_search_btn').hide();
			$('#input_search_none').show();
			$('#input_search_clear').hide();
		} else if (type == SEARCH_BTN_TYPING) {
			$('#input_search_btn').hide();
			$('#input_search_none').hide();
			$('#input_search_clear').show();
		}
	}
	
	/**
	 * 추천검색어를 설정합니다.
	 * @return
	 */
	function setRecommendKeyword() {
		if (config.recommendKeyword.length > 0) {
			$('#input_search').val(config.recommendKeyword);
			config.isRecommendClick = true;
			if (!$('#input_search').hasClass('searchbox_focus')) {
				$('#input_search').addClass('searchbox_focus');
			}
		} else {
			$('#input_search').val('');
		}
	}

	///////////////////////////////////////////////////////
	// constructor
	// /////////////////////////////////////////////////////
	$('.bt_close').click( function(event) {
		$('#input_search').blur();
		unmaskPanel();
		textBoxInit();		
	});
	$('#layer_pop_brief_close').click( function(event) {
		if ($('#layer_search_wrap').css('display') == 'none') {
			unmaskPanel();
			textBoxInit();
		} else {
			$('#layer_pop_brief_1').hide();
		}
	});

	$('.layer_search').show();
	var beforeLeft = $('.layer_search', document).offset().left;
	$('.layer_search').css( {
		position : 'absolute',
		top : 0,
		zIndex : 1004
	});
	var currentLeft = $('.layer_search', document).offset().left;
	if (currentLeft - beforeLeft > 20) {
		$('.layer_search').css( {
			left : beforeLeft
		});
	}
	$('.layer_search').hide();

	$('#input_search').val(config.recommendKeyword).focus( function(event) {
		if (config.isRecommendClick) {
			$(this).val('');
			config.isRecommendClick = false;
		}
		textBoxTyping();
	}).blur( function(event) {
		if ($(this).val().length == 0) {
			textBoxInit();
		}
	}).keyup( function(event) {
		var input = $(this).val();
		if (input.length == 0) {
			unmaskPanel();
			toggleInputSearchButton(SEARCH_BTN_NOINPUT);
		} else {
			textBoxTyping();
			maskPanel();
		}
		if (config.beforeInputValue != input) {
			config.isSearchReady = true;
		}
		if (input.length >= 3) {
			if (config.beforeInputValue != input || config.isSearchReady) {
				getJSONVisualSearch(input);
			}
			config.beforeInputValue = input;
		} else {
			$('#global_layer_search').hide();
			$('.layer_search_dialog').hide();
			$('#layer_search_list').empty();
		}
	}).autocomplete(
			config.autoCompleteUrl,
			{
				json : true,
				nocache : true,
				queryParam : 'query',
				rootName : 'xpersearch',
				searchName : 'autokeyword',
				resultWidth : 126,
				zIndex : 1100,
				resultsClass : 'sgr_search_result',
				overClass : 'sgr_search_over',
				onKeyPressEnter : function() {
					if (config.onSearch)
						config.onSearch($('#input_search').val());
				},
				delay : 10,
				formatItem : function(row, i, num) {
					var keyword = $('#input_search').val().toLowerCase();
					var rowText = row[0];
					var start = rowText.toLowerCase().indexOf(keyword);
					if (start > -1) {
						var end = start + keyword.length;
						return rowText.insert(end, '</span>').insert(start,'<span class="sch_txt_global">');
					}
					return rowText;
				},
				onItemSelect : function(li) {
					if (li == null)
						return;
					var sValue = li.selectValue;
					if (sValue.length >= 3) {
						getJSONVisualSearch(sValue);
					}
					if (config.onSelectValue)
						config.onSelectValue(sValue);
				}
			});
	
	// 추천검색어를 초기화
	setRecommendKeyword();

	$('#input_search_btn').click( function(event) {
		if (config.onSearch)
			config.onSearch($('#input_search').val());
	});

	$('#input_search_clear').click( function(event) {
		$('#input_search').blur();
		unmaskPanel();
		textBoxInit();		
	}); 

	this.showDetailViewByIndex = function(index) {
		if (visualDataList != null) {
			showDetailView(visualDataList[index]);
		}
	}
	
	this.moveSupportPage = function (index) {
		if (visualDataList != null) {
			location.href = visualDataList[index].supporturl;
		}
	}
	
	this.unmaskPanel = function() {
		unmaskPanel();
		textBoxInit();	
	}
}

function showDetailViewByIndex(index) {
	gnbSearch.showDetailViewByIndex(index);
}

function moveSupportPage(index) {
	gnbSearch.moveSupportPage(index);
}

function overInbrief(i) {
	$('#_in_brief' + i).attr('src', '/images/common/btn/ico_brief_on.gif');
	$('#_support' + i).attr('src', '/images/common/btn/ico_support_off.gif');
}

function overSupport(i) {
	$('#_in_brief' + i).attr('src', '/images/common/btn/ico_brief_off.gif');
	$('#_support' + i).attr('src', '/images/common/btn/ico_support_on.gif');
}



///////////////////////////////////////////////////////////////////
//for GNB
///////////////////////////////////////////////////////////////////	
function slideProducts(sec) {
	global.sliding_type = "P";
	$("#content_p").animate(
		//{ width:global.content_p.width },
		{ width:796 },
		(sec != null ? sec : 500),
		function() {
			$("#global_layer_search").css({ marginLeft:25 });
		}
	);
}

function slideEntertainment(sec) {
	global.sliding_type = "E";
	$("#content_e").show();
	$("#content_p").animate(
		{ width:1 },
		(sec != null ? sec : 500),
		function() {
			if (parseInt($.browser.version) < 7 && $.browser.msie) {
				$("#content_p").hide();
			} else {
				$("#aside_main").css({ marginLeft:-1 });
			}
			$("#global_layer_search").css({ marginLeft:175 });
		}
	);
}

var mainPageStatus = "";

function flash_doTrans(transType)
{
	if(transType == "PtoE" && global.sliding_type == "P")
	{
		if (gnbSearch) gnbSearch.unmaskPanel();
		// pause products.swf 
		var f = document.getElementById("flash_products");
		if(f != null && f.ex_pauseMovie) {
			f.ex_pauseMovie();
			mainPageStatus = "enter";
			entertainment_home();
		}
		slideEntertainment();
	}
	else if(transType == "EtoP" && global.sliding_type == "E")
	{
		if (gnbSearch) gnbSearch.unmaskPanel();
		slideProducts();
		// resume products.swf 
		var f = document.getElementById("flash_products");
		if(f != null && f.ex_resumeMovie) {
			f.ex_resumeMovie();
			mainPageStatus = "product";
			products_home();
		}
	}
}

function goEnterMain(targetVal) {
	if( targetVal == "enter") {
		flash_doTrans("PtoE");
	}
}

////////////////////////////////////////////////////////////////
// onLoad
////////////////////////////////////////////////////////////////
var gnbSearch = null;
var global = {
	sliding_type: "P"
};
$(function () {
    gnbSearch = new gnb_search({
		autoCompleteUrl: '/lamp/autoComplete.do',
        visualSearchUrl: '/lamp/visualSearch.do',
		recommendKeyword: window.recommendKeyword || '',
        isAsideBlock: false,
		onSelectValue: function(value) {
			// select auto_complement 
		},
		onSearch: function(value) {
			if (value.length == 0) {
				alert('Voer een trefwoord voor de zoekactie in!');
				return;
			}
			document.gSearch.query.value=value;
			document.gSearch.submit();
		},
		onMaskPanel: function() {
			var vp = document.getElementById("videoplayer");
			if(vp != null && vp.getState != null) {
				if (vp.getState() == "playing") {
					vp.pauseVideo();
				}
			}
			
			var f = document.getElementById("flash_products");
			if(f != null && f.ex_pauseMovie) f.ex_pauseMovie();
		},
		onUnmaskPanel: function() {			
			// flash player가 show 상태가 아니라면 product flash를 resume
			if(!$('.flash_player').hasClass('flash_player_visual')) {
				var f = document.getElementById("flash_products");
				if(f != null && f.ex_resumeMovie) f.ex_resumeMovie();
			}
		}
    });
    
	global.content_p = {
    	width: $('#content_p').width()
	};
});
