﻿/// <reference name="MicrosoftAjax.debug.js" />

Type.registerNamespace("CoasterBuzz");

CoasterBuzz.Search = function() {
	CoasterBuzz.Search.initializeBase(this);
	this._resultCache = null;
	this._previousValue = null;
	this._isParkSearch = false;
}

CoasterBuzz.Search.prototype = {
	initialize : function() {
		CoasterBuzz.Search.callBaseMethod(this, "initialize");
		this._searchBox = $get("CBSearchBox");
		this._resultBox = $get("SearchResult");
		this._resultList = $get("SearchList");
		this._coasterRadio = $get("SearchCoasters");
		this._parkRadio = $get("SearchParks");
		this._coasterRadio.checked = true;
		this._dbLink = $get("SearchDbLink");
		this._closeButton = $get("SearchCloseButton");
		this._whirl = $get("SearchLoadingWhirl");
		$addHandlers(this._searchBox, {"keyup":this._handleKeyup, "keydown":this._preventSubmit}, this);
		$addHandlers(this._parkRadio, {"click":this._handleKeyup}, this);
		$addHandlers(this._coasterRadio, {"click":this._handleKeyup}, this);
		$addHandlers(this._closeButton, {"click":this._closeSearch}, this);
	},
	
	dispose : function() {
		$clearHandlers(this._searchBox);
		$clearHandlers(this._parkRadio);
		$clearHandlers(this._coasterRadio);
		$clearHandlers(this._closeButton);
		CoasterBuzz.Search.callBaseMethod(this, "dispose");
	},
	
	_clearCache : function() {
		this._resultCache = null;
		this._previousValue = null;
	},
	
	_handleKeyup : function(e) {
		if (this._searchBox.value.length < 3) {
			this._closeSearch(); return;
		}
		this._resultBox.style.display = "block";
		this._resultList.innerHTML = "";
		this._whirl.style.display = "block";
		if (this._previousValue && this._isParkSearch == this._parkRadio.checked) {
			if (this._searchBox.value.toLowerCase().indexOf(this._previousValue) > -1) {
				this._populateResults(this._resultCache, null);
				return;
			}
		}
		this._clearCache();
		this._previousValue = this._searchBox.value;
		if (this._parkRadio.checked) {
			this._isParkSearch = true;
			CoasterBuzz.Services.ParkSearch(this._searchBox.value, Function.createDelegate(this, this._populateResults), Function.createDelegate(this, this._fail));
			this._dbLink.href = "/AmusementParks.aspx";
			this._dbLink.innerHTML = "Visit our complete amusement park database";
		}
		else {
			this._isParkSearch = false;
			CoasterBuzz.Services.CoasterSearch(this._searchBox.value, Function.createDelegate(this, this._populateResults), Function.createDelegate(this, this._fail));
			this._dbLink.href = "/RollerCoasters.aspx";
			this._dbLink.innerHTML = "Visit our complete roller coaster database";
		}
	},
	
	_preventSubmit : function(e) {
		if (e.keyCode == Sys.UI.Key.enter) e.preventDefault();
	},
	
	_populateResults : function(result, eventArgs) {
		if (!result) return;
		this._resultCache = result;
		var searchText = this._searchBox.value.toLowerCase();
		var parsedResult = Sys.Serialization.JavaScriptSerializer.deserialize(result);
		Array.forEach(parsedResult, function(o) {
			if (o.Text.toLowerCase().indexOf(searchText) > -1) {
				var item = document.createElement("dd");
				if (this._parkRadio.checked)
					item.innerHTML = String.format("<a href=\"/park/{0}/{1}.aspx\">{2}</a>", o.ID, o.Url, o.Text);
				else
					item.innerHTML = String.format("<a href=\"/coaster/{0}/{1}.aspx\">{2}</a>, <a href=\"/park/{3}/{4}.aspx\">{5}</a>", o.ID, o.Url, o.Text, o.PID, o.PUrl, o.PText);
				this._resultList.appendChild(item);
			}
		}, this);
		if (parsedResult.length == 0 || this._resultList.childNodes.length == 0)
			this._resultList.innerHTML = "<p>No results found for \"" + this._searchBox.value + "\"</p>";
		this._whirl.style.display = "none";
	},
	
	_fail : function(error, context, methodName) {
		this._whirl.style.display = "none";
		this._resultList.innerHTML = "<p>There was an error getting search results</p>";
	},
	
	_closeSearch : function() {
		this._resultBox.style.display = "none";
		this._resultList.innerHTML = "";
		this._clearCache();
	}
}

CoasterBuzz.Search.registerClass("CoasterBuzz.Search", Sys.Component);

if (typeof(Sys) !== "undefined") Sys.Application.notifyScriptLoaded();

Sys.Application.add_init(function() { $create(CoasterBuzz.Search, {"id":"SeachComponent"}); });
