$(document).ready(initialize);

function initialize()
{
//	window.onerror = handleError;

	addStyles();
	
//	fixRot13Transformations(); // see rot13.js
	
	handleRequiredFields();
	
	handleWatermarks();
	
	initializeOptions();
	
	initializeVerbose();
	
	initializeAjaxForms();
	
	initializeAjaxLoader();
	
	hideFooterWithoutScrollbars();
}

function handleError(msg, url, line)
{
	alert(msg);
	return true; 
}

/* Global Variables */

var _defaultTexts = new Hashtable();


/* Add Styles */

function addStyles()
{
	$(":text, :password, :file, textarea, select").addClass("input");
}

/* Handle Required Fields */

function handleRequiredFields()
{
	var requiredFields = $(":input[required=true]");

	requiredFields.each(function() 
	{
		if ($(this).attr("watermark") != null)
		{
			if (this.id == "")
			{
				throw("Error: Required fields need an id.");
			}
		
			_defaultTexts.put(this.id, $(this).attr("watermark"));
		}
	});
	
	$("form").bind("submit", validateRequiredFields);
}

function validateRequiredFields()
{
	clearRequiredFields();
	
	var form = $(this);
	var requiredFields = $(":input[required=true]", this);
	
	form.isValid = true;
	
	requiredFields.each(function() 
	{
		if (isEmptyOrDefault(this))
		{
			$(this).addClass("required");
			form.isValid = false;
			
			$(this).change(function()
			{
				if (!isEmptyOrDefault(this))
				{
					$(this).removeClass("required");
				}
			});
		}
	});
	
	handleErrorMessage(form);
	
	if (form.isValid)
	{
		removeWatermarksBeforeSubmit(form);
	}
	
	return form.isValid;
}

function clearRequiredFields()
{
	$(":input[required=true]").removeClass("required");
}

function handleErrorMessage(form)
{
	if (!form.isValid && form.attr("errormessage") != null)
	{
		alert(form.attr("errormessage"));
	}
}

function isEmptyOrDefault(field)
{
	return ($.trim(field.value) == "" || field.value == _defaultTexts.get(field.id));
}

function removeWatermarksBeforeSubmit(form)
{
	if (form.isValid)
	{
		$(":input[watermark]", form).each(function() {
			if (this.value == _defaultTexts.get(this.id))
			{
				this.value = "";
			}
		});
	}
}

/* Handle Watermark Scripts */

function handleWatermarks()
{
	var watermarks = $(":input[watermark]")
	
	watermarks.each(function()
	{
		if (this.id == "")
		{
			throw("Error: Watermark fields need an id.");
		}
		
		_defaultTexts.put(this.id, $(this).attr("watermark"));
		
		if (this.value == "" || this.value == _defaultTexts.get(this.id))
		{
			this.value = $(this).attr("watermark");
	
			$(this).addClass("watermark");
		}
	});
							  
	watermarks.focus(watermarkFocus);
	watermarks.blur(watermarkBlur);
}

function watermarkFocus()
{
	if (this.value == _defaultTexts.get(this.id))
	{
		this.value = "";
		$(this).removeClass("watermark");
	}
	else
	{
		$(this).select();
	}
}

function watermarkBlur()
{
	this.value = $.trim(this.value);

	if (isEmptyOrDefault(this))
	{
		this.value = _defaultTexts.get(this.id);
		$(this).addClass("watermark");
	}
}

/* Initialize Verbose */

function initializeVerbose()
{	
	$(".verbose").click(function()
	{
		$(this).next().toggle();
		$(document).scrollTop($(this).offset().top);
	});
}

/* Initialize AJAX Loader (Progress) */

function initializeAjaxLoader()
{
	var searchResults = $("div#SearchResults");
	
	if (searchResults.length == 1)
	{		
		$(document).bind("ajaxStart", function() 
		{
			if (typeof(OmitAjaxLoader) == "undefined" || OmitAjaxLoader == false)
			{
				searchResults.empty();
				searchResults.html("<div class='ajaxloader' title='Loading...'></div>");
			
				$("div.ajaxloader").show();
			}
		});
		
		$(document).bind("ajaxComplete", function()
		{
			if (typeof(OmitAjaxLoader) == "undefined" || OmitAjaxLoader == false)
			{
				$("div.ajaxloader").hide();
			}
		});
	}
		
	$(document).bind("ajaxError", function(event, XMLHttpRequest, ajaxOptions)
	{
//	TODO: uncomment
		alert("An unexpected error occurred");
		
//		var win = window.open('');
//		win.document.write(XMLHttpRequest.responseText);
	});
}

/* Ajax Filter */

function initializeAjaxForms()
{
	$("form[ajax=true]").submit(function()
	{
		ajaxFilter();
		
		return false;
	});
}

function doAjaxFilter(form, scriptname, pageSize, pageIndex)
{
	var data = "isAjax=true";
	
	if (isDefined(pageSize) && isDefined(pageIndex))
	{
		data = data + "&PageSize=" + pageSize + "&CurrentPage=" + pageIndex;
	}
	
	if (form != null)
	{
		for (var i = 0; i < form.length; i++)
		{
			var field = form[i];
	
			// Don't send default watermark text
			if ($(field).attr("watermark") != null && field.value == _defaultTexts.get(field.id))
			{
				continue;
			}
			
			// Don't send unchecked radio and checkbox fields
			if ((field.type.toLowerCase() == "radio" || field.type.toLowerCase() == "checkbox") && !field.checked)
			{
				continue;
			}
			
			if (data != "")
			{
				data += "&";
			}
			
			if (field.tagName == "SELECT" && field.multiple)
			{
				var selectedOptions = $.makeArray($("option:selected[value!=]", field));
				var selectedIDs = $.map(selectedOptions, function(a) { return parseInt($(a).val()); });
				
				data += field.name + "=" + selectedIDs.join(",");							
			}
			else
			{
				data += field.name + "=" + encodeURI(field.value);
			}
		}
	}
	
	$.post(scriptname, data, ajaxFilterComplete, "html");
}
	
function ajaxFilterComplete(html)
{
	$("#SearchResults").html(html);

	fixRot13Transformations(); // see rot13.js

	detectRssFeed(html);
}

function detectRssFeed(html)
{
	$("head>link#rssLink").remove();
	
	var rssFeeds = $(html).find("a.syndication");
	
	if (rssFeeds.length > 0)
	{
		$("head").append('<link id="rssLink" href="' + rssFeeds[0].href + '" title="' + rssFeeds[0].title + '" rel="alternate" type="application/rss+xml" />');
	}
}

/* Synchronize checkboxes */
function initializeAllCheckbox(divid)
{
	$("#" + divid + " :checkbox").click(synchronizeCheckboxes);
}

function synchronizeCheckboxes() 
{
	var checkbox = $(this);
	var allcheckbox = $(this).parents("div.options").find(":checkbox[value=All]")[0];
	var othercheckboxes = $(this).parents("div.options").find(":checkbox[value!=All]");
	
	if (this.value == "All")
	{
		othercheckboxes.each(function() 
		{
			this.checked = allcheckbox.checked;
		});
	}
	else
	{
		var allchecked = true;
		
		othercheckboxes.each(function()
		{
			if (!this.checked)
			{
				allchecked = false;
			}
		});
		
		allcheckbox.checked = allchecked;
	}
}

/* Initialize Options */

function initializeOptions()
{
	if ($(".showoptions").length > 0 && $(".hideoptions").length > 0)
	{
		$(".showoptions").show();	
		$(".hideoptions").hide();
		$(".options").hide();
		
		$(".showoptions").click(function()
		{
			$(this).nextAll(".options:first").show();
			$(this).nextAll(".hideoptions:first").show();
			$(this).hide();
		});
		
		$(".hideoptions").click(function()
		{
			$(this).nextAll(".options:first").hide();
			$(this).prevAll(".showoptions:first").show();
			$(this).hide();
		});
	}
}

/* Hide footer without scrollbars */

function hideFooterWithoutScrollbars()
{
	doHideFooterWithoutScrollbars();
	
	$(window).resize(doHideFooterWithoutScrollbars);
}

function doHideFooterWithoutScrollbars()
{
	if ($(window).height() == $(document).height())
	{
		$("div#footer").hide();
	}
	else
	{
		$("div#footer").show();
	}
}

/* Various Methods */

function isDefined(tester)
{
	return !(typeof(tester) == "undefined");
}
