﻿var debug = false;

var suggest = {
	settings: 
	{
		minSuggestLength: 1,	//the number of letter in the search input to revoke suggest.
		defaultNumOfItemsToDisplay: 5, //the length of the results display popup.
		currentNumOfDisplayedItems: 5, //the number of the actual items in display.
		numOfItemsToFetch: 15,  //the number of items to fetch = numOfItemsToDisplay * X.
		selectedItem: null,		//current selected item object(by mouse or keyboard).
		selectedIndex: -1,		//current selected item index.
		selectedText: '',		//current selected item text.
		selectedItemId: null,	//current selected item id.
		hideMode: false,		//hides the suggest popup.
		showMode: false,		//force the popup to show.
		url: '/site/v2/search/suggest.aspx', //the suggest service url.
		lastSearchPhrase: '',
		currentSearchPhrase: ''
	},
	results: 
	{
		startIndex: 0,		
		items: null,
		item: function(format, title, price, itemId, moreInfoLink){
			this.format = format;
			this.title = title;
			this.price = price;
			this.itemId = itemId;
			this.moreInfoLink = moreInfoLink;
		},		
		add: function(format, title, price, itemId, moreInfoLink){
			if(suggest.results.items == null)
				suggest.results.items = new Array();
			
			suggest.results.items.push( new suggest.results.item(format, title, price, itemId, moreInfoLink) );
		},
		clear: function(){
			suggest.results.items = null;
		}
	},
	init: function(minSearchLen, numOfItemsToDisplay, url, autoFocus){
		
		//** SETTINGS **//
		
		//min search length (the minimum letter count that envoke the suggest)
		if(minSearchLen && parseInt(minSearchLen,10) != NaN && parseInt(minSearchLen,10) >= 0 ) suggest.settings.minSuggestLength = minSearchLen;
		
		//set the number of items to display:
		if(numOfItemsToDisplay && parseInt(numOfItemsToDisplay,10) != NaN && parseInt(numOfItemsToDisplay,10) >= 0 ){
			suggest.settings.defaultNumOfItemsToDisplay = numOfItemsToDisplay;
			suggest.settings.currentNumOfDisplayedItems = suggest.settings.defaultNumOfItemsToDisplay;
		}
		
		//service url:		
		if(url && url != '')suggest.settings.url = url;
		
		
		//** EVENTS **//
		
		//document keyPress events:
		$(document).bind("keydown",function(e){
			switch(e.keyCode){
				case 40: //arrow down
					suggest.arrowDown()
					break;
				case 38: //arrow up
					suggest.arrowUp();
					break;
				case 13: //enter 
					if(suggest.visible() && suggest.settings.selectedItem != null)
						suggest.chooseItem();
					//perform regular search:
					else if(suggest.getSearchInput()[0].value != '')
						doSearch();							
					break;
				case 27: //escape
					suggest.hide( true );	
					suggest.settings.hideMode = true;		
					break;
			}				
		});
		
		$(document).bind("resize",suggest.documentResize);
		
		//search input text changed event:
		suggest.getSearchInput().bind("propertychange",
					function(e){
						if(event.propertyName == 'value'){													
							suggest.suggest();
						}
					});
		
		//document click event:
		$(document).bind("click",function (e){
			//check to see if sender allow event propagation:
			var sender = e.target || event.srcElement;
			if(sender && sender.id || sender.className){
				if(sender.id == "siteSearchTextInput" 
					|| sender.className == "suggestLink")
					return;
			}
			//suggest.chooseItem();
			
			if(suggest.visible())
				suggest.hide(false);
		});
		
		//handle search input focus:
		suggest.getSearchInput().focus(function(e){						
			this.select();
			suggest.suggest();	
		});
		
		//set the focus on site search input:
		if(autoFocus){
			window.setTimeout( function(){suggest.getSearchInput().focus();}, 2500);
		}
	},
	getSearchInput: function(){ 
		return $("#siteSearchTextInput");
	},
	getSearchTypeInput: function(){ 
		return $("#siteSearchMediaTypeSelect");
	},	
	getSearchType: function(){ 
		return suggest.getSearchTypeInput()[0].value;
	},	
	getContainer: function(){ 
		return $("#suggestContainer");
	},
	visible: function(){
		return suggest.getContainer().css("display") == 'block';
	},
	hide: function( removeFocus ){
		if( suggest.visible() ){
			
			suggest.getContainer().hide("fast");
			
			suggest.settings.selectedIndex = -1;
			
			if( removeFocus ) suggest.getSearchTypeInput().focus();
	  }
	},
	
	suggest: function(){	

		//search input (eng || heb):
		var searchValue = suggest.getSearchInput()[0].value;
		
		//check min suggest length:
		if(searchValue.length < suggest.settings.minSuggestLength){
			suggest.hide();
			return;
		}
		
		//save last searched value:
		suggest.settings.currentSearchPhrase = searchValue;
		
		/*
		//validate search value:
		if(suggest.settings.currentSearchPhrase == suggest.settings.lastSearchPhrase ){
			suggest.draw();
			return;
		}
		else 
			suggest.settings.lastSearchPhrase = suggest.settings.currentSearchPhrase;
		*/
		
		if(suggest.settings.hideMode){
			//cancel hide
			suggest.settings.hideMode = false;
			return;
		}				
		
		//check 
		if(suggest.settings.selectedItem != null && //TODO
			searchValue == suggest.settings.selectedItem.find("td:eq(0)").text())
			return;
		else
			suggest.settings.selectedItem = null;
		
						
		var searchValue_heb = searchValue;
		var searchValue_eng = '';
		
		var reg = /[a-z]+/i
		
		if(reg.test(searchValue)){
			searchValue_eng = searchValue;
			searchValue_heb = '';
		}
		
		//search type (1=movie,2=game,3=accessory, 4=book, 5=music)
		var searchType = suggest.getSearchType();
		
		var url = suggest.settings.url;
		var params = {
			value_heb:	escape(searchValue_heb),
			value_eng:	escape(searchValue_eng),
			type:		searchType
			}
		
		$.ajax({
			async:		true,
			beforeSend: null,
			cache:		false,
			complete:	handle_Ajax_Complete,
			contentType:"application/x-www-form-urlencoded", 
			data:		params,		
			dataType:	"xml",
			error:		handle_Ajax_Error,
			type:		"GET",
			url:		url,
			success:	suggest.suggestCallback
		});
	},
	suggestCallback: function (xmlObj, textStatus){
		
		//validate:
		if(typeof xmlObj == 'undefined' || typeof xmlObj.xml == 'undefined' || xmlObj.xml == '')return;
			
		var statusCode = xmlObj.documentElement.selectSingleNode('.//STATUS/CODE').text;
		var statusMsg = xmlObj.documentElement.selectSingleNode('.//STATUS/TEXT').text;
			
		
		if(statusCode != "ok"){
			if(debug)window.status = "failed with status message: " + statusMsg;
			suggest.hide(false)
			return;
		}
		
		//search type:
		var searchType = parseInt(xmlObj.documentElement.selectSingleNode('.//STATUS/SEARCH_TYPE').text,10);
			
		//search items:
		var searchItems = xmlObj.selectNodes(".//A");
		
		//handle no results:
		if(searchItems.length == 0){
			suggest.hide();
			return;
		}
		
		suggest.results.clear();
		
		//parse and save results:
		for(var i=0; i<searchItems.length; i++){
			var format = getFormatFriendlyStr(searchItems[i].getAttribute("FORMAT"));
			var title = searchItems[i].getAttribute("TITLE");
			var price = RoundFloat(searchItems[i].getAttribute("PRICE"));
			price = price > 0 ? price : 0;
			var itemId = searchItems[i].getAttribute("EXT_ID");
			var moreInfoLink = "/site/" + suggest.getMoreInfoLink(itemId, searchType);
			
			suggest.results.add(format, title, price, itemId, moreInfoLink);
		}				
		
		//draw:
		suggest.draw();
	},
	draw: function(){
		var suggestObj = suggest.getContainer();
		suggestObj.html("");
		
		suggest.selectedIndex = -1;
	
		//build results table:
		var resultItemHTML = "<table style=\"width:100%; line-height:15px; direction:rtl;\" class=\"regTextBlack\">";				
		
		var maxWidth = 0;
		
		for(var i = suggest.results.startIndex; 
			i < suggest.results.items.length && i < suggest.results.startIndex + suggest.settings.currentNumOfDisplayedItems; 
			i++){
			var format = suggest.results.items[i].format;
			var title = suggest.results.items[i].title;
			var price = suggest.results.items[i].price;
			var itemId = suggest.results.items[i].itemId;
			var moreInfoLink = suggest.results.items[i].moreInfoLink;
			
			var searchValue = suggest.getSearchInput()[0].value;
			title = title.replace(searchValue,"<b>" + searchValue + "</b>");
			var titleLink = "<a href=\"" + moreInfoLink + "\" class=\"suggestLink\">"+title+"</a>";
			
			resultItemHTML += "<tr class=\"resultRow\" item_index=\""+i+"\" item_id=\""+itemId+"\" style=\"cursor:pointer;\">";
			resultItemHTML += "<td style=\"white-space:nowrap\" class=\"suggestLink\">"+ titleLink +"</td>";
			resultItemHTML += "<td style=\"white-space:nowrap; text-align:center;\" class=\"textBlackSmall\"><b>"+ format +"</b></td>";
			if(price > 0)
				resultItemHTML += "<td class=\"textRedBold\"><nobr>"+ price +" ₪</nobr></td>";
			else
				resultItemHTML += "<td></td>";
			//resultItemHTML += "<td><a href=" + moreInfoLink + " class=\"suggestLink\">הצג</a></td>";
			resultItemHTML += "</tr>";						
			
			var allText = format + title + price + itemId;
			var currTextWidth = allText.length + 25;
			if(currTextWidth > maxWidth)maxWidth = currTextWidth;
		}
		
		resultItemHTML += suggest.getMoreResultsRow();
				
		resultItemHTML += "</table>";
		
		suggestObj.append(resultItemHTML);
				
		//result item events:
		$("#suggestContainer tr").bind("mouseover",suggest.mouseOver);
		$("#suggestContainer tr").bind("mouseout",suggest.mouseOut);
		$("#suggestContainer .resultRow").bind("click",suggest.itemClick);
			
		//set width for locating the suggest popup right under the search input
		suggestObj.css("width", parseInt(maxWidth * 5,10));
		suggest.locate();
		
		suggestObj.show("fast");
	},
	getMoreResultsRow: function(){
		var moreResultsRow = "";
		
		var isMoreResults = suggest.results.items.length > suggest.settings.currentNumOfDisplayedItems;
		var isLessResults = suggest.settings.currentNumOfDisplayedItems > suggest.settings.defaultNumOfItemsToDisplay
			&& suggest.results.items.length > suggest.settings.defaultNumOfItemsToDisplay;
		
		var moreResultsLink = isMoreResults
			? "<a class=\"suggestLink\" id=\"suggestMoreResultsLink\" href=\"javascript:suggest.expandResults();\">הצג עוד>></a>"
			: "";
		
		var lessResultsLink = isLessResults
			? "<a class=\"suggestLink\" id=\"suggestLessResultsLink\" href=\"javascript:suggest.collapseResults();\"><<הצג פחות</a>"
			: "";
		
		if(isMoreResults || isLessResults){
			moreResultsRow = "<tr><td colspan=\"4\"><span>" + lessResultsLink; 
			moreResultsRow += isMoreResults && isLessResults ? "&nbsp;|&nbsp;" : "";
			moreResultsRow += moreResultsLink;
			moreResultsRow += "</span></td></tr>";
		}
		
		return moreResultsRow;
	},
	expandResults: function(){
		
		suggest.settings.showMode = true;

		//if(suggest.settings.currentNumOfDisplayedItems < suggest.results.items.length)
		suggest.settings.currentNumOfDisplayedItems += suggest.settings.defaultNumOfItemsToDisplay;
		suggest.draw();
	},
	collapseResults: function(){
		suggest.settings.showMode = true;
	
		suggest.settings.currentNumOfDisplayedItems -= suggest.settings.defaultNumOfItemsToDisplay;
		suggest.draw();
	},
	getMoreInfoLink: function (extid, searchType){
		var href = "#";
		switch(searchType){
			case 1:
				href = "film.asp?id=";
				break;
			case 2:
				href = "game.asp?id=";
				break;
			case 3:
				href = "accessory.asp?id=";
				break;
			case 4:
				href = "book.asp?id=";
				break;	
			case 5:
				href = "sound.asp?id=";
				break;	
		}
		href += href != "#" ? extid : "";
		
		return href;
	},
	mouseOver: function(){
		//handle mouse and keyboard combinations:(remove old focus)
		if(suggest.settings.selectedIndex > -1 && suggest.settings.selectedItem != null){			
			suggest.removeFocus();
		}
		
		//set the new selected item:
		suggest.settings.selectedItem = $(this);
		//set the new selected index:
		suggest.getSelectedItemIndex();
		//set the new selected text:
		suggest.getSelectedItemText();
			
		suggest.setFocus();
	},	
	mouseOut: function(){
		suggest.removeFocus();
		
		//clear selected item:
		suggest.settings.selectedItem = null;
		//clear selected index:
		suggest.settings.selectedIndex = -1;
		//clear selected text:
		suggest.settings.selectedText = '';
	},
	arrowDown: function(){
		if(!suggest.visible()){
			//suggest.suggest();
			return;
		}
		
		if(suggest.settings.selectedIndex >= suggest.results.items.length-1 ||
			suggest.settings.selectedIndex >= suggest.settings.currentNumOfDisplayedItems-1 ){			
			window.status = 'exit arrow down: ' + suggest.settings.selectedIndex;
			return;
		}
		
		//handle mouse and keyboard combinations:(remove old focus)
		if(suggest.settings.selectedIndex > -1 && suggest.settings.selectedItem != null){			
			suggest.removeFocus();
		}
				
		suggest.settings.selectedIndex++;
		
		suggest.getSelectedItem();
		
		suggest.setFocus();
	},
	arrowUp: function(){
		if(!suggest.visible())return;
		
		if(suggest.settings.selectedIndex <= 0)return;
				
		//handle mouse and keyboard combinations:(remove old focus)
		if(suggest.settings.selectedIndex > -1 && suggest.settings.selectedItem != null){			
			suggest.removeFocus();
		}
			
		suggest.settings.selectedIndex--;
		
		suggest.getSelectedItem();
		
		suggest.setFocus();
	},
	documentResize: function(){
		suggest.locate();
	},
	locate: function(){
		var searchInput = suggest.getSearchInput();
		var container = suggest.getContainer();
		
		var point = searchInput.offset();
		var top = point.top + parseInt(searchInput.css("height").replace('px',''));
		var left = point.left - parseInt(container.css("width").replace('px',''),10) + parseInt(searchInput.css("width").replace('px',''),10);
		
		container.css("top",top);
		container.css("left",left);
			
	},
	//get/set the selected table (jQuery) row:
	getSelectedItem: function(){
		suggest.settings.selectedItem = $("#suggestContainer tr:eq("+suggest.settings.selectedIndex+")");
		suggest.getSelectedItemIndex();
		suggest.getSelectedItemText();
		suggest.getSelectedItemId();
		
		return suggest.settings.selectedItem;
	},
	//get/set the selected item index:
	getSelectedItemIndex: function(){
		suggest.settings.selectedIndex = parseInt( suggest.settings.selectedItem.attr("item_index") );
		return suggest.settings.selectedIndex;
	},
	getSelectedItemText: function(){
		suggest.settings.selectedText = suggest.settings.selectedItem.find("td:eq(0)").text();
		return suggest.settings.selectedText;
	},
	getSelectedItemId: function(){
		suggest.settings.selectedItemId = suggest.settings.selectedItem.attr("item_id");
		return suggest.settings.selectedItemId;
	},
	itemClick: function(){
		if( !suggest.visible() )return;
		
		suggest.chooseItem();
	},
	//set focus on the selected item:
	setFocus: function(){
		
		if(debug)window.status = "index:"+suggest.settings.selectedIndex;
			
		suggest.settings.selectedItem.css("background-color","#d4d0c8");
	},
	removeFocus: function(){
		
		if(debug)window.status = "index:"+suggest.settings.selectedIndex;
			
		suggest.settings.selectedItem.css("background-color","#ffffff");
	},
	chooseItem:	function(){
		
		suggest.getSearchInput()[0].value = suggest.settings.selectedText;
		
		suggest.hide(false);		
	}
}

$(document).ready(function(){		
	suggest.init(1, 5, '/site/v2/search/suggest.aspx', false);
});


function handle_Ajax_Complete(XMLHttpRequest, textStatus){
	if(debug)window.status = 'complete\n textStatus: ' + textStatus;
}

//perform search
function doSearch(){
	var searchValue = suggest.getSearchInput()[0].value;
	var searchType = suggest.getSearchType();
	document.location.href="/site/SearchResults.asp?searchType="+searchType+"&run_search=1&cfformat=-1&heb_item_name="+searchValue+"#resultsanc";
}

function RoundFloat(num)
{
	if(parseFloat(num) == NaN) return 0;
	
	var splitNumber = num.toString().split('.');
	//check for very small numbers 
	//(with e-X where X represents 10^X if e- its dots after(very small number) the zero if its e+ its dots before (very large number))
	var splitNumberCheckIfTooSmall = num.toString().split('e-');
	if( splitNumber.length == 1 )		
		return splitNumber[0];
		
	tmpNum = splitNumber[1].substring(0,1);
	tmpNum = tmpNum + "." + splitNumber[1].substring(1,splitNumber[1].length);
	tmpNum = Math.round( Number(tmpNum) );
	if  (splitNumberCheckIfTooSmall[0] != num.toString()&& Math.abs(num) < 0.00001) //  there was "e-" in the string because item was TOO SMALL	
		num = 0
	else 
		num = splitNumber[0] + "." + tmpNum + "0";		
	return num;		
}
function handle_Ajax_Error(XMLHttpRequest, textStatus, errorThrown){
	if(debug)window.status = "error\n errorthrown:"+errorThrown;
}

function getFormatFriendlyStr(formatStr){
	//alert(formatStr);
	var format = 'DVD';
	switch(formatStr){
		case "DVD":
			format = "DVD";
			break;
		case "HD":
			format = "HD-DVD"
			break;
		case "BR":
			format = "BD";
			break;
		default:
			format = formatStr.toUpperCase();
			break;
	}
	return format;
}