/*
	Title: MLB.com Search Engine
	Desc: This code is intended for MLB Search functionality only!

	Company: MLB Advanced Media.
	Author: Sam Tsvilik
	Project: MLB Search
	Last Modified: 07/21/2008
	
	Dependencies: jQuery.js, bam.js, bam.tracking.js
*/
bam.imports(bam.dom, bam.url);
//Text Search
var TextSearch = (function() {
	var pageData = null,
		pageSize = 0,
		totalCount = 0,
		numOfPages = 0,
		loc = bam.url.Location(window.location), 
		URL_SEARCH_QUERY = unescape(loc.getParam("query")),
		_self = {},
		$doc = $(document);
	
	//Fetches search results
	var _getData = function(cb) {
		//var pageData = {};
		//var loc = bam.url.Location(window.location), URL_SEARCH_QUERY = loc.getParam("query");
		if(bam.validation.isStr(URL_SEARCH_QUERY) && !bam.validation.isEmpty(URL_SEARCH_QUERY)) {
			$.ajax({
				type: "GET",
				url: _self.ServiceURL,
				dataType: "json",
				async:false,
				success: cb
			});
		}
	};
	//Renders suggested link
	var _suggestLink = function(word) {
		var loc = bam.url.Location(window.location),
			cId = loc.getParam("c_id") || "mlb",
			tId = loc.getParam("teamCode") || "";
			
		var _out = [];
			_out.push("Did you mean: ");
			_out.push("<a href=\"");
			_out.push(bam.url.buildSearch({
				query:word,
				c_id: cId ,
				teamCode: tId
			}));
			_out.push("\">");
			_out.push(word);
			_out.push("</a>?");
			return _out.join("");
	};
	//Renders team filters
	var _renderFilters = function() {
		var teamCode = _self.TeamCode;
		if(club === "mlb") {
			var teamsUrl = "/lookup/json/named.team_all.bam?sport_code='mlb'&active_sw='Y'&all_star_sw='N'";
			$.ajax({
				type: "GET",
				url: teamsUrl,
				dataType: "json",
				success: function(json) {
					var rows = [{name:"-- All MLB Sites --", file_code:"mlb"}];
					rows = rows.concat(json.team_all.queryResults.row);
					rows.sort(function(a, b) {
						var out = (a.name<b.name)?-1:(b.name<a.name)?1:0;
						return out;
					});
					bam.dom.populateSelect({
						object: $("#selTeamFilter"),
						data: rows,
						key: "name",
						value: "file_code",
						complete: function(sel) {
							setTimeout(function() {
								sel.val(teamCode);
							}, 10);
						}
					});
					$("#selTeamFilter").show();
				}
			});			
		} else {				
			$("#selTeamFilter").remove();
			$("#radThisTeam").val(club);
			$("#radioFilter").show();
			if(teamCode === "mlb") {
				$("#radAllTeams")[0].checked = true;
			}
		}
	};	
	//Me, myself and Irene?		
	_self = {
		Query:"",
		ServiceURL:"",
		TeamCode:"",
		LoadData: function() {
			_getData(function(data) {				
				pageData = data;
				pageSize = pageData.hitsPerPage;
				totalCount = pageData.total;
				numOfPages = Math.ceil(totalCount / pageSize);
				_self.Query = pageData.query;
			});
		},
		Init: function() {
			//Initialize Auto-Complete
			/* Temporarily disabled
			$("#txtSearch").autocomplete(
				"/ws/search/complete", //autocomplete.jsp
				{
					delay:10,
					minChars:2,
					matchSubset:1,
					matchContains:1,
					cacheLength:10,
					maxItemsToShow:10,
					wrapInQuotes: true
				}
			).focus();
			*/
			//Initialize Search Fields
			var resultsDiv = $("#divSearchResults");
			var searchResultsDiv = $("#divResultsCount");
			//Load Search results from JSON
			if(!!pageData) {
				if(!!pageData.query && !bam.validation.isEmpty(pageData.query)) {
					//Set Search box to query value
					$("#txtSearch").val(pageData.query).focus();
				}
				//Performing keyword search regardless of main content results
				if(!pageData.start || (~~+pageData.start) === 1) {
					KeywordSearch.Search(URL_SEARCH_QUERY);
				}
				if(pageData.total === 0) {						
					//Hide Navigation Links
					$("#topResultsBar").hide();
					$("#botResultsBar").hide();
					//See if there is a suggested spelling
					var suggestedQuery = pageData.suggestedQuery;
					if(!!suggestedQuery && !bam.validation.isEmpty(suggestedQuery)) {
						//No Results
						searchResultsDiv.html("Your search - " + pageData.query + " - did not match any documents.");
						// showing div spell check element if suggested query found.
						$("#divSpellCheck").html(_suggestLink(suggestedQuery));
						$("#divSpellCheck").show();														
					} else {
						searchResultsDiv.html("No results found");
						// hiding the divSpellCheck div element as a whole if suggested query not found.
						$("#divSpellCheck").hide();
						$("#divResultsBox").hide();
					}						
				} else {					
					//Find related Videos and Keywords
					if(!!pageData.query && (~~+pageData.start) === 1) {
						//Changed to accept original url query instead of query from search response
						/*KeywordSearch.Search(pageData.query);
						VideoSearch.Find(pageData.query);	*/
						
						VideoSearch.Find(URL_SEARCH_QUERY);						
					}					
					//Render Result Count
					var lastPageRecordNo = 	(pageData.start+pageData.hitsPerPage) > (pageData.total)?(pageData.total):(pageData.start+pageData.hitsPerPage);
					searchResultsDiv.html("Displaying "+(pageData.start)+" to "+(lastPageRecordNo-1)+" results of "+pageData.total+" matching for \""+pageData.query+"\"");
					//Render Navigation Links (Top and Bottom)
					if(numOfPages > 1) {						
						$("#topResultsBar").html(MLBSearch.RenderPageNav(pageData));
						$("#botResultsBar").html(MLBSearch.RenderPageNav(pageData));
					}
					//Render Search Results
					var results = pageData.results, pos = (~~+pageData.start)+1;
					if(!!results && results.length > 0) {
						$.each(results, function(i, result) {
							resultsDiv.append(MLBSearch.RenderResult(result, pos+i));
						});
						//OMTR Tracking
						$(".searchResTitle a").each(function() {								
							$(this).click(function() {
								bam.tracking.track({
									async:{
										isDynamic:false,
										compName:"MLB Search",
										compActivity:"Text Link Click",
										actionGen:true
									}
								}, $(this)[0]);	
							});
						});
					}
					resultsDiv.append("<div class=\"clear\">");
				}
			}
			//Assign Page Submit handler
			$("#frmSearch").submit(function() {
				_self.Search(null, null, null);
				return false;
			});
			
			//Render filtering
			_renderFilters();
		},
		Search: function(s, ps, ss) {
			var searchStr = $("#txtSearch").val();				
			MLBSearch.GetResults(searchStr, s, ps, ss, null);
		},
		FilterByTeam: function(val) {
			MLBSearch.TeamCodeFilter = val;
			//_self.Search(null, null, null); //Auto-submit
		}
	};
	
	//Search Tracking Live Events
	$doc.selector = ".searchResTitle a";
	$doc.live("click", function(e) {
		var $this = $(this), pos = $this.attr("pos");
		bam.tracking.track({searchResult:{searchType:"CONTENT",searchPosition:pos}});
	});
	
	return _self;
})();
//Video Search 
var VideoSearch = (function() {
	var _self = {},
		_searchStr = "",
		_loc = bam.url.Location(location),
		_cid = _loc.getParam("c_id") || "mlb";;
	//Fetches video slides
	var _findVideos = function(str, cb) {
		if(typeof(str) === "string" && typeof(cb) === "function") {
			//?type=json&ns=1&text=%22Siano%2C%20Mike%22&start=1&hitsPerPage=12
			var _data = {
				type: "json",
				ns: 1,
				query: str,
				start: 1,
				hitsPerPage: 6,
				sort: "desc",
				src: "vpp",
				sort_type: "custom",
				c_id: _cid
			};
			var _url = "/ws/search/MediaSearchService" + bam.url.buildSearch(_data);
			$.getJSON(_url, cb);				
		}
	};
	//Slides Filter
	var itemAlreadyExists = function(mid){
		var itemExists = false;
		$("ul#searchResults li a").each(function(i, curItem){
			if ($(curItem).attr("ref") === mid){ itemExists = true; }
			});
		return itemExists;
	};
	//Render slides
	var _renderSlides = function(data) {
		_self.searchData = data;			
		if (_self.searchData.mediaContent && _self.searchData.mediaContent.constructor===Array){
			$.each(_self.searchData.mediaContent, function(i, obj){
			if (obj.contentId && obj.title && !itemAlreadyExists(obj.contentId) && ($("ul#searchResults li").size() < 12) ){
				var thumbnailSrc = (!!obj.thumbnails && obj.thumbnails.constructor===Array && obj.thumbnails[0].src) ? obj.thumbnails[0].src : "";
				var itemHtml = new bam.string.StringBuffer();
				itemHtml.append("<li>")
					.append("<div>")
					.append("<a href=\"/media/video.jsp?content_id="+obj.contentId+"\" onclick=\"VideoSearch.OpenVideo(this)\" ref=\""+obj.contentId+"\" pos=\""+i+"\"><img src=\""+thumbnailSrc+"\"/><div class=\"videoText\">"+obj.blurb+"</div></a>")
					.append("<div class='duration'>"+VideoSearch.formatDuration(obj.duration)+"</div>")
					.append("</div>")
				.append("</li>");
				// console.log("appending item: " + obj.mid);
				$("ul#searchResults").append(itemHtml.toString());
				}
			});			
			$("#allVideosLink").attr("href", "/search/media.jsp" + bam.url.buildSearch({query:_searchStr})).click(function() {
				_self.OpenAllVideos(this);
			});	
			$("#divVideoResultsBox").show();
			//bam.tracking.track({searchVideoExists:{isVideo:"True"}});
		}
		else {
			$("#divVideoResultsBox").hide();
			//bam.tracking.track({searchVideoExists:{isVideo: "False"}});
		}			
	};	
	//Myself again...
	_self = {
		Find: function(srchStr) {
			_searchStr = srchStr;
			_findVideos(srchStr, _renderSlides);			
		},
		formatDuration: function(duration){ // converts HH:MM:SS to MM:SS
			var minSec = "";
			if (typeof(duration)==="string" && duration.length > 7){
				minSec = duration.substring(3,8);
			}
			return minSec;
		},
		OpenVideo: function(_link) {
			var pos = $(_link).attr("pos");
			//OMTR Tracking
			bam.tracking.track({searchResult:{searchType:"VIDEO",searchPosition:pos}});
			/*
			bam.tracking.track({
				async:{
					isDynamic:false,
					compName:"MLB Search",
					compActivity:"Video Click",
					actionGen:true
				}
			}, _link);
			*/
		},
		OpenAllVideos: function(_link) {
			//OMTR Tracking
			bam.tracking.track({
				async:{
					isDynamic:false,
					compName:"MLB Search",
					compActivity:"Video Page Click",
					actionGen:true
				}
			}, _link);
		}
	};		
	
	return _self;
})();

var KeywordSearch = (function() {
	var _self = {};
	
	var _findKeywords = function(str, cb) {
		var _serviceUrl = "/ws/search/keywordSearchService",
			_cid = bam.url.Location(window.location).getParam("c_id") || "mlb";
		//"/components/search/scripts/keywords.js";
		if(typeof(str) === "string" && typeof(cb) === "function") {
			var _data = {
				type: "json",
				ns: 1,
				query: str,
				c_id: _cid
			};
			var _url = _serviceUrl + bam.url.buildSearch(_data);
			$.getJSON(_url, cb);
		}
	};
	
	var _renderKeyword = function(result) {
		var _out = new bam.string.StringBuffer();
		_out.append("<div class=\"searchResultBox\">")
			.append("<div id=\"keywordImage\">")
			.append("<a href=\""+result.url+"\" onclick=\"KeywordSearch.OpenKeyword(this)\"><img src=\""+result.imageUrl+"\" alt=\""+result.title+"\" title=\""+result.title+"\" border=\"0\"/></a></div>")
			.append("<div id=\"keywordBody\">")
				.append("<div class=\"searchResTitle\"><a href=\""+result.url+"\">"+result.title+"</a></div>")
				.append("<div class=\"searchResBody\">"+result.summary+"</div>")
				.append("<div><a class=\"searchResLink\" href=\""+result.url+"\">"+result.url+"</a></div>")
			.append("</div>")
			.append("<br class=\"clear\"/>")
		.append("</div>");
		return _out.toString();
	};
	
	_self = {
		Search: function(str) {
			_findKeywords(str, function(_data) {
				var _out = new bam.string.StringBuffer();
				if(!!_data && !!_data.results && (_data.results.length > 0)) {
					$.each(_data.results, function() {
						_out.append(_renderKeyword(this));
					});
				}
				$("#divKeywordsResults").html(_out.toString());
				$("#divKeywordsBox").slideDown("slow");
			});
		},
		OpenKeyword: function(_link) {
			//OMTR Tracking
			bam.tracking.track({
				async:{
					isDynamic:false,
					compName:"MLB Search",
					compActivity:"Keyword (" + TextSearch.Query + ") Click",
					actionGen:true
				}
			}, _link);
		}
	};
	return _self;		  
})();
