var WNBAVideoSearch = {

	//data_source : "/esi-test/videotest.js",
	data_source : "/search/wnbavideojson.jsp",
	results_per_page : 5,
	
	Search : Class.create({

		initialize : function(params, result_container, max_results, results_per_page, no_results_message) {
		
			this.result_container = result_container;
			this.params = params;
			
			this.max_results = max_results;
			this.num_results = 0;
			this.num_results_per_page = results_per_page > 0 ? results_per_page : WNBAVideoSearch.results_per_page;
			this.num_result_pages = max_results > 0 ? Math.ceil(max_results / this.num_results_per_page) : 0;
			
			this.no_results_message = "There are no results for the selected criteria";
			if (no_results_message) { this.no_results_message = no_results_message; }
			
			if (this.max_results > 0) { this.params.rm = this.max_results; }
			this.params.pm = this.num_results_per_page;
			
			
			this.loadResults();
		},
		
		loadResults : function() {
		
			if (!this.params.q && !this.params.f) { return; }
			
			var url = WNBAVideoSearch.data_source + "?" + $H(this.params).toQueryString();
		
			new Ajax.Request(url, {
				method : "get",
				evalJSON : "force",
				onFailure : function(transport) {
					this.displayNoResultsMessage();
				},
				onSuccess : (function(object) {
					return function(transport) {
					
						if (!transport.responseJSON) { return; }
						
						var json = transport.responseJSON;
					
						var results = json.results;
						var results_count = json.metaResults.videos;

						object.num_result_pages = results.length;
						object.num_results = results_count;
						object.resultset = results;
						
						total_results = null;   // clear out possible large json
						
						object.displayResults(1);
					};
				})(this)
			});
		},
		
		paginationButton : function(text, class_name, new_page) {
		
			var button = document.createElement("A");
			button.className = class_name;
			button.href = "#";
			button.innerHTML = text;
			button.onclick = (function(object, page) {
				return function(e) { object.displayResults(page); return false; };
			})(this, new_page);
			
			return button;
		},
		
		displayNoResultsMessage : function() {
			this.result_container.innerHTML = this.no_results_message;
		},
		
		displayResults : function(page) {

			if (this.resultset && this.num_results > 0) {
			
				if (page < 1 || page > this.num_result_pages) { return; }	
				
				this.result_container.innerHTML = "";

				// add results

				var videosElement = document.createElement("DIV");
				videosElement.className = "videos";
				this.result_container.appendChild(videosElement);

				var videos = this.resultset[page - 1];

				for (var i = 0; i < videos.length; i++) {

					var video = videos[i];

					var thumbnail = "";
					var no_thumbnail = "";
					var title = "";
					var length = "";
					var date = "";
						
					var url = video.url;

					if (video.metadata.media.thumbnail.url) {
						thumbnail = ["<div class='thumbnail'>",
										"<a href='" + url + "'>",
											"<img src='" + unescape(video.metadata.media.thumbnail.url) + "' />",
										"</a>",
									"</div>"].join("");
					}
					else { no_thumbnail = " no_thumbnail"; }

					if (video.title) {
						title = ["<div class='headline'>",
									"<a href='" + url + "'>",
										video.title,
									"</a>",
								"</div>"].join("");
					}
					
					if (video.metadata.video.length) { 
						length = ["<div class='length'>",
									video.metadata.video.length,
								"</div>"].join("");
					}
					
					var play_link = ["<div class='play_link'>",
										"<a href='", url, "'>",
											"Play",
										"</a>",
									"</div>"].join("");
					
					if (video.mediaDateUts) {
						var realDate = new Date(video.mediaDateUts * 1000);
						date = ["<div class='date'>", realDate.toDateString(), "</div>"].join("");
					}
					
					var copy = video.metadata.media.excerpt ? ["<div class='copy'>", video.metadata.media.excerpt, "</div>"].join("") : ""; 

					var videosElementInnerHTML = [videosElement.innerHTML, 
								"<div class='video'",
									" onmouseover='this.style.backgroundColor=\"#F8F0DD\";' ",
									" onmouseout='this.style.backgroundColor=\"transparent\";'>",
									thumbnail,
									"<div class='summary" + no_thumbnail + "'>",
										title,
										"<div class='details'>",
											length, play_link, date,
										"</div>",
										copy,
									"</div>",
								"</div>"];
									
									
					videosElement.innerHTML = videosElementInnerHTML.join("");
				}

				this.result_container.innerHTML = [this.result_container.innerHTML, "<div class='total_results'>Total Results: ", this.num_results, "</div>"].join("");

				
				// add top navigation if there is more than one page
				if (this.num_results > this.num_results_per_page) {
				
					var top_nav = document.createElement("DIV");
					top_nav.className = "page_navigation top_nav";
									
					if (page > 1) {
						var top_previous_button = this.paginationButton("&laquo; Previous " + this.num_results_per_page, "prev", (page - 1));
						top_nav.insertBefore(top_previous_button, top_nav.firstChild);
					}
					
					if (page < this.num_result_pages) {				
						var top_next_button = this.paginationButton("Next " + this.num_results_per_page + " &raquo;", "next", (page + 1));
						top_nav.insertBefore(top_next_button, top_nav.firstChild);
					}

					this.result_container.insertBefore(top_nav, this.result_container.firstChild);
				
				
				
				
					// add bottom navigation
					var bottom_nav = document.createElement("DIV");
					bottom_nav.className = "page_navigation bottom_nav";

					if (page > 1) {
						var bottom_previous_button = this.paginationButton("&laquo; Previous " + this.num_results_per_page, "prev", (page - 1));
						bottom_nav.appendChild(bottom_previous_button);
					}

					// show ellipses at ends of pagination?
					var start_pagination = 1;
					var end_pagination = this.num_result_pages;
					
					var left_ellipsis = right_ellipsis = false;
					
					var max_before_ellipsis = 15;
					var pages_to_show_with_ellipsis = 10;
						
					if (this.num_result_pages > max_before_ellipsis) {

						var page_far_from_start = left_ellipsis = (page - pages_to_show_with_ellipsis >= 0) ? true : false;
						var page_far_from_end = right_ellipsis = (page + pages_to_show_with_ellipsis <= this.num_result_pages + 1) ? true : false;

						if (page_far_from_start || page_far_from_end) {
							start_pagination = page - Math.ceil(pages_to_show_with_ellipsis / 2) + 1;
							end_pagination = start_pagination + pages_to_show_with_ellipsis - 1;
						}

						if (end_pagination >= this.num_result_pages || (this.num_result_pages - page) < pages_to_show_with_ellipsis - 1) {
							end_pagination = this.num_result_pages;
							start_pagination = end_pagination - pages_to_show_with_ellipsis + 1;
							
							left_ellipsis = true; right_ellipsis = false; 
						} 

						if (start_pagination < 1 || page < pages_to_show_with_ellipsis) {
							start_pagination = 1;
							end_pagination = pages_to_show_with_ellipsis;
							
							right_ellipsis = true; left_ellipsis = false; 
						}
					}

					if (left_ellipsis) {
						var specific_button = this.paginationButton(1, "", 1);
						bottom_nav.appendChild(specific_button);

						var ellipsis = document.createElement("DIV");
						ellipsis.className = "ellipsis";
						ellipsis.innerHTML = "...";
						bottom_nav.appendChild(ellipsis);
					}
					for (var j = start_pagination; j <= end_pagination; j++) {
						var specific_button = this.paginationButton(j, (page == j ? "selected" : ""), j);
						bottom_nav.appendChild(specific_button);
					}
					if (right_ellipsis) {
						var ellipsis = document.createElement("DIV");
						ellipsis.className = "ellipsis";
						ellipsis.innerHTML = "...";
						bottom_nav.appendChild(ellipsis);

						var specific_button = this.paginationButton(this.num_result_pages, "", this.num_result_pages);
						bottom_nav.appendChild(specific_button);
					}

					if (page < this.num_result_pages) {
						var bottom_next_button = this.paginationButton("Next " + this.num_results_per_page + " &raquo;", "next", (page + 1));
						bottom_nav.appendChild(bottom_next_button);
					}

					this.result_container.appendChild(bottom_nav);
				}
				
			} else {
				this.displayNoResultsMessage();
			}
		}
	})
}