﻿(function()
{
	if (location.href.toLowerCase().indexOf('/resources.aspx') != -1)
	{
		var SearchHandlerUrl = "/Handlers/www/ResourcesSearchHandler.ashx";
		
		var KeywordsContainer;
		var TypesContainer;
		var LanguagesContainer;
		var ResultsContainer;
		var ResetButton;

		jQuery(document).ready(function()
		{
			KeywordsContainer = jQuery('#ResourceKeywords');
			TypesContainer = jQuery('#ResourceTypes');
			LanguagesContainer = jQuery('#ResourceLanguages');
			ResultsContainer = jQuery('#ResourcesSearchResults');
			ResetButton = jQuery('#ResourcesResetButton');

			KeywordsContainer.ajaxStart(function() { jQuery(this).block(); }).ajaxStop(function() { jQuery(this).unblock(); });
			TypesContainer.ajaxStart(function() { jQuery(this).block(); }).ajaxStop(function() { jQuery(this).unblock(); });
			LanguagesContainer.ajaxStart(function() { jQuery(this).block(); }).ajaxStop(function() { jQuery(this).unblock(); });
			ResultsContainer.ajaxStart(function() { jQuery(this).block({ message: "<h3>Loading...</h3>" }); }).ajaxStop(function() { jQuery(this).unblock(); });			
			ResetButton.click(function() { ResetSearch(); });

			var keyword = jQuery.query.get('keyword');
			var resourceType = jQuery.query.get('category');
			var language = jQuery.query.get('language');

			LoadKeywords(keyword);
			LoadResourceTypes(resourceType);
			LoadLanguages(language);

			jQuery(document).bind('ajaxStop', function()
			{
				if (keyword != '' || resourceType != '' || language != '')
				{
				    DoSearch();

				    LoadKeywords(TypesContainer.val());
				    LoadResourceTypes(TypesContainer.val());
				    LoadLanguages(LanguagesContainer.val());
				}
				jQuery(this).unbind('ajaxStop');
			}); 

		});

		function ResetSearch()
		{
			KeywordsContainer.val('');
			TypesContainer.val('');
			LanguagesContainer.val('');

			LoadKeywords();
			LoadResourceTypes();
			LoadLanguages();

			ResultsContainer.html('');
		}

		function BuildQuery(action, includeType, includeKeyword, includeLanguage)
		{
			var query = "refreshCache=true&action=" + action;
			if (includeType)
				query += "&resourceTypeID=" + TypesContainer.val();
			if (includeKeyword)
				query += "&keywordID=" + KeywordsContainer.val();
			if (includeLanguage)
				query += "&language=" + LanguagesContainer.val();

			return query;
		}

		function LoadKeywords(selectedKeyOrValue)
		{
			jQuery.ajax({
				type: "POST",
				url: SearchHandlerUrl,
				data: BuildQuery("keywords", true, false, true),
				contentType: "application/x-www-form-urlencoded",
				dataType: "json",
				success: function(msg)
				{
					var data = (typeof msg.d) == 'string' && msg.d != '' ? JSON.parse(msg.d) : '';
					if (data != '')
					{
						KeywordsContainer.find(' option:not(:first)').remove();
						var html = '';
						for (var i = 0; i < data.length; i++)
						{
							var value = data[i].Value;
							var key = data[i].Key;

							html += '<option value="' + value + '"';
							if (selectedKeyOrValue != undefined && selectedKeyOrValue != null && (selectedKeyOrValue === value || selectedKeyOrValue.toLowerCase() === key.toLowerCase()))
								html += ' selected="selected"';
							html += '>' + key + '</option>';
						}
						KeywordsContainer.append(html);

						KeywordsContainer.unbind('change').bind('change', function()
						{
							DoSearch();
							LoadResourceTypes(TypesContainer.val());
							LoadLanguages(LanguagesContainer.val());
						});
					}
				}
			});
		}

		function LoadResourceTypes(selectedKeyOrValue)
		{
			jQuery.ajax({
				type: "POST",
				url: SearchHandlerUrl,
				data: BuildQuery("types", false, true, true),
				contentType: "application/x-www-form-urlencoded",
				dataType: "json",
				success: function(msg)
				{
					var data = (typeof msg.d) == 'string' && msg.d != '' ? JSON.parse(msg.d) : '';
					if (data != '')
					{
						TypesContainer.find(' option:not(:first)').remove();
						var html = '';
						for (var i = 0; i < data.length; i++)
						{
							var value = data[i].Value;
							var key = data[i].Key;

							html += '<option value="' + value + '"';
							if (selectedKeyOrValue != undefined && selectedKeyOrValue != null && (selectedKeyOrValue === value || selectedKeyOrValue.toLowerCase() === key.toLowerCase()))
								html += ' selected="selected"';
							html += '>' + key + '</option>';
						}
						TypesContainer.append(html);

						TypesContainer.unbind('change').bind('change', function()
						{
							DoSearch();
							LoadKeywords(KeywordsContainer.val());
							LoadLanguages(LanguagesContainer.val());
						});
					}
				}
			});
		}

		function LoadLanguages(selectedKeyOrValue)
		{
			jQuery.ajax({
				type: "POST",
				url: SearchHandlerUrl,
				data: BuildQuery("languages", true, true, false),
				contentType: "application/x-www-form-urlencoded",
				dataType: "json",
				success: function(msg)
				{
					var data = (typeof msg.d) == 'string' && msg.d != '' ? JSON.parse(msg.d) : '';
					if (data != '')
					{
						LanguagesContainer.find(' option:not(:first)').remove();

						var html = '';
						for (var i = 0; i < data.length; i++)
						{
							var value = data[i].Value;
							var key = data[i].Key;

							html += '<option value="' + value + '"';
							if (selectedKeyOrValue != undefined && selectedKeyOrValue != null && (selectedKeyOrValue === value || selectedKeyOrValue.toLowerCase() === key.toLowerCase()))
								html += ' selected="selected"';
							html += '>' + key + '</option>';
						}

						LanguagesContainer.append(html);

						LanguagesContainer.unbind('change').bind('change', function()
						{
							DoSearch();
							LoadResourceTypes(TypesContainer.val());
							LoadKeywords(KeywordsContainer.val());
						});
					}
				}
			});
		}

		function DoSearch()
		{
			jQuery.ajax({
				type: "POST",
				url: SearchHandlerUrl,
				data: BuildQuery("search", true, true, true),
				contentType: "application/x-www-form-urlencoded",
				dataType: "json",
				success: function(msg)
				{
					var data = (typeof msg.d) == 'string' && msg.d != '' ? JSON.parse(msg.d) : '';
					if (data != '')
					{
					    var html = ParseTemplate(jQuery('#ResultsTemplate').html(), { results: data, view: jQuery.query.get('view') });
						ResultsContainer.html(html);

						var togglerTop = ResultsContainer.find('#ResultsTogglerTop');
						var togglerBottom = ResultsContainer.find('#ResultsTogglerBottom');

						togglerTop.find('a').css('cursor', 'pointer').bind('click', function()
						{
							togglerTop.hide();
							togglerBottom.show();
							ResultsContainer.find("tr[class='hide']").removeClass('hide').addClass('show');
						});

						togglerBottom.find('a').css('cursor', 'pointer').bind('click', function()
						{
							togglerBottom.hide();
							togglerTop.show();
							ResultsContainer.find("tr[class='show']").removeClass('show').addClass('hide');
						});
					}
				}
			});
		}
	}
})();

(function() {
	var _tmplCache = {};

	this.ParseTemplate = function(str, data)
	{
		// Figure out if we're getting a template, or if we need to
		// load the template - and be sure to cache the result.
		var func = _tmplCache[str];
		if (!func)
		{
			var strFunc =
				"var p=[],print=function(){p.push.apply(p,arguments);};" +
							"with(obj){p.push('" +

				str.replace(/[\r\t\n]/g, " ")
				   .replace(/'(?=[^#]*#>)/g, "\t")
				   .split("'").join("\\'")
				   .split("\t").join("'")
				   .replace(/<#=(.+?)#>/g, "',$1,'")
				   .split("<#").join("');")
				   .split("#>").join("p.push('")
				   + "');}return p.join('');";

			//alert(strFunc);
			func = new Function("obj", strFunc);
			_tmplCache[str] = func;
		}
		return func(data);
	};
})();
