
(function() {
	var current_URL = "";
	var current_username = "";
	var results_html = "<span class=\"title\">Your OpenID is:</span> <span id=\"your-openid\">%s</span>";
	var results_div;
	var toggle_form_interval = null;
	var form_increment = 10;
	var form_interval_duration = 10;

	var move_form = function( )
	{
		var form = document.getElementById("id-builder-form");
		if(form.direction)
		{
			form.height_val += form_increment;
			if(form.height_val >= form.original_height)
			{
				form.height_val = form.original_height;
				form.style.height = "auto";
				clearInterval(toggle_form_interval);
				toggle_form_interval = null;
			}
			else
			{
				form.style.height = form.height_val + "px";
			}
		}
		else
		{
			form.height_val -= form_increment;
			if(form.height_val <= 0)
			{
				form.height_val = 0;
				form.style.height = "0px";
				clearInterval(toggle_form_interval);
				toggle_form_interval = null;
			}
			else
			{
				form.style.height = form.height_val + "px";
			}
		}
	}

	var getHeight = function(obj)
	{
		if(obj.currentStyle)
			return obj.currentStyle.height;
		else if(window.getComputedStyle)
			return window.getComputedStyle(obj,null).height;
		else
			return "0px";
	}

	window.onload = function(){
		if(document.getElementById("return"))
		{
			var link = document.getElementsByTagName("A")[0];
			var address = link.href;
			link.onclick = function() {
				window.location = address;
				return false;
			}
			link.href = link.href.substring(link.href.indexOf("=")+1);
		}
		if(document.getElementById("id-builder-preface"))
		{
			document.getElementById("submit-button-container").style.display = "none";

			var form = document.getElementById("id-builder-form");

			form.original_height = getHeight(form);
			form.style.height = "0px";
			form.style.overflow = "hidden";

			form.original_height = form.original_height.substring(0,form.original_height.length-3);
			form.direction = 0;
			form.height_val = 0;
			var link = document.createElement("a");
			var link_text = document.createTextNode("Click here to find out.");
			var link_text2 = document.createTextNode("Click here to hide the form.");
			link.appendChild(link_text);
			link.href = "";

			var toggle_form = function() {
				if(toggle_form_interval != null)
				{
					clearInterval(toggle_form_interval);
					toggle_form_interval = null;
				}
				else if(form.style.height == "auto")
				{
					form.original_height = getHeight(form);
					form.original_height = form.original_height.substring(0,form.original_height.length-3);
					form.height_val = form.original_height;
				}

				if(form.direction == 0)
				{
					link.removeChild(link_text);
					link.appendChild(link_text2);
					form.direction = 1;
					toggle_form_interval = setInterval(move_form, form_interval_duration);
					move_form();
				}
				else
				{
					link.removeChild(link_text2);
					link.appendChild(link_text);
					form.direction = 0;
					toggle_form_interval = setInterval(move_form, form_interval_duration);
					move_form();
				}
				return false;
			}
			link.onclick = toggle_form;

			var preface = document.getElementById("id-builder-preface");
			preface.appendChild(link);

			results_div = document.getElementById("results-container");
			document.getElementById("username").onkeyup = modUsername;
			document.getElementById("domain").onchange = modDomain;
			document.forms[0].onsubmit = function() { return false; }
			current_username = document.getElementById("username").value;
			var select = document.getElementById('domain');
			var domain_string = select.options[select.selectedIndex].value;
			if(domain_string != "")
				current_URL = domain_string;
		}
		var contents = document.getElementById("table-of-contents");
		var anchors = contents.getElementsByTagName("a");
		var i;
		for(i = 0; i < anchors.length; i++)
		{
			if(anchors[i].href.indexOf("#") != -1)
			{
				var id = anchors[i].href.substring(anchors[i].href.indexOf("#")+1);
				anchors[i].onclick = function() { return scroll(id) };
			}
		}

		if(document.getElementById('providers-table'))
		{
			function Provider(values, tr)
			{
				this.values = values;
				this.tr = tr;
				this.getValue = getValue;
			}	
			function getValue(key)
			{
				return this.values[key];
			}
			var sortBy = "Name";
			var lastBy = "";
			var lastByObj = null;
			var lastDir = 0;

			var sortProvidersAsc = function(a, b)
			{
				var x = a.getValue(sortBy);
				var y = b.getValue(sortBy);
				if(x ==  y) return 0;
				else if(!x) return 1;
				else if(!y) return -1;
				else
				{
					if(isNaN(+ x) || isNaN(+ y))
					{
						if(x<y) return -1;
						else return 1;
					}
					else if(parseInt(x) < parseInt(y)) return -1;
					else return 1;
				}
			}
			var sortProvidersDesc = function(a, b)
			{
				var x = a.getValue(sortBy);
				var y = b.getValue(sortBy);
				if(x ==  y) return 0;
				else if(!x) return -1;
				else if(!y) return 1;
				else
				{
					if(isNaN(+ x) || isNaN(+ y))
					{
						if(x<y) return 1;
						else return -1;
					}
					else if(parseInt(x) < parseInt(y)) return 1;
					else return -1;
				}
			}

			var providers_table = document.getElementById('providers-table');
			var provider_trs = providers_table.getElementsByTagName('tr');
			var providers = new Array(provider_trs.length);
			var i, j;

			var provider_ths = provider_trs[0].getElementsByTagName('th');
			var provider_labels = new Array(provider_ths.length);
			for(j = 1; j < provider_ths.length; j++)
			{
				var anchor = provider_ths[j].firstChild;
				if(anchor && anchor.firstChild != null)
				{
					anchor.onclick = function(e) {
						var anchor;

						if(e.target)
							anchor = e.target;
						else if(e.srcElement)
							anchor = e.srcElement;
						else
							return;
						
						sortBy = anchor.firstChild.nodeValue;
						var providers_table = document.getElementById('providers-table');
						if(lastBy == sortBy)
						{
							if(lastDir == 1)
							{
								providers = providers.sort(sortProvidersDesc);
								anchor.className = "sorted desc";
								lastDir = 0;
							}
							else
							{
								providers = providers.sort(sortProvidersAsc);
								anchor.className = "sorted asc";
								lastDir = 1;
							}
						}
						else
						{
							lastBy = sortBy;
							if(lastByObj != null)
								lastByObj.className = "";
							lastByObj = anchor;

							if(anchor.href.indexOf("default=desc") != -1)
							{
								providers = providers.sort(sortProvidersDesc);
								anchor.className = "sorted desc";
								lastDir = 0;
							}
							else
							{
								providers = providers.sort(sortProvidersAsc);
								anchor.className = "sorted asc";
								lastDir = 1;
							}
						}

						var i,j;
						for(i = 0, j = 1; i < providers.length; i++)
						{
							if(providers[i])
							{
								providers_table.appendChild(providers[i].tr);

								if(j%2==0)
									providers[i].tr.className = "even";
								else
									providers[i].tr.className = "";

								j++;
							}
						}
						return false;
					}
					
					provider_labels[j] = anchor.firstChild.nodeValue;
					if(anchor.className.indexOf("sorted") != -1)
					{
						lastBy = provider_labels[j];
						lastByObj = anchor;
						if(anchor.className.indexOf("asc") != -1)
							lastDir = 1;
					}

				}
				else
				{
					provider_labels[j] = "";
				}
			}

			for(i = 1; i < provider_trs.length; i++)
			{
				var provider_tds = provider_trs[i].getElementsByTagName('td');
				var provider_values = new Array();
				var name_anchor = provider_tds[1].firstChild;
				provider_values[provider_labels[1]] = name_anchor.firstChild.nodeValue;
				for(j = 2; j < provider_tds.length; j++)
				{
					if(provider_labels[j])
						provider_values[provider_labels[j]] = provider_tds[j].title;
				}
				providers[i] = new Provider(provider_values, provider_trs[i]);
			}
			
		}
	}

	var modDomain = function(change_event)
	{
		var select;

		if(change_event.target)
			select = change_event.target;
		else if(change_event.srcElement)
			select = change_event.srcElement;
		else
			return;

		var domain_value = select.options[select.selectedIndex].value;
		if(domain_value == 0)
		{
			current_URL = "";
			if(is_result_shown)
				hide_result();
		}
		else
		{
			current_URL = domain_value;
			if( current_URL.indexOf('%s') == -1 )
				URL_depends_on_username = false;
			else
				URL_depends_on_username = true;

			if(URL_depends_on_username)
			{
				if(current_username == "")
				{
					if(is_result_shown)
						hide_result();
				}
				else
					update_result();
			}
			else
				update_result();
		}
			
	}

	var modUsername = function(change_event)
	{
		var textfield;

		if(change_event.target)
			textField = change_event.target;
		else if(change_event.srcElement)
			textField = change_event.srcElement;
		else
			return;

		if(current_username != textField.value)
		{
			current_username = textField.value;
			if(URL_depends_on_username)
			{
				if(current_username == "")
				{
					if(is_result_shown)
						hide_result();
				}
				else
				{
					if(current_URL != "")
						update_result();
				}
			}
		}
	}

	var result_interval_duration = 5000;
	var result_interval = null;
	var posted_result = "";

	var post_result = function()
	{
		var text = current_URL.replace('%s',current_username);
		if(posted_result != text)
		{
			ajax("set_oidcu.php",null,null,"POST","OIDCU="+text,1);
			posted_result = text;
		}
	}

	var hide_result = function()
	{
		results_div.innerHTML = "";
		is_result_shown = false;
		if(result_interval != null)
		{
			clearInterval(result_interval);
			result_interval = null;
		}
	}
		
	var update_result = function()
	{
		hide_result();

		var text = current_URL;
		if( URL_depends_on_username )
		{
			text = current_URL.replace('%s',current_username);
		}
		results_div.innerHTML = results_html.replace('%s',text);
		is_result_shown = true;
		if( result_interval == null && URL_depends_on_username )
			result_interval = setInterval(post_result, result_interval_duration);
	}

	var URL_depends_on_username;
	var is_result_shown = false;
	var t;
	var lastYPos;
	var scroll_amount = 15;
	var wait_amount = 5;

	// based on "bottom" function from: http://www.codingforums.com/showthread.php?t=39936
	var move_down = function(targetYPos) {
		var y = get_scroll_position();
		if (y<targetYPos && y!=lastYPos){
			window.scrollBy(0,scroll_amount);
			t=setTimeout(move_down, wait_amount, targetYPos);
			lastYPos = y;
		}
		else clearTimeout(t);
	}

	/* These two functions are based on code from: http://www.sitepoint.com/article/scroll-smoothly-javascript/1 */
	var scroll = function(dest_id)
	{
		var dest = document.getElementById(dest_id);
		var destx = dest.offsetLeft;
		var desty = dest.offsetTop;
		var current_el = dest;
		 while (current_el.offsetParent &&  
					 (current_el.offsetParent != document.body)) {
				current_el = current_el.offsetParent;
				destx += current_el.offsetLeft;
				desty += current_el.offsetTop; 
		 }
		 move_down(desty);
		return false;
	}

	var get_scroll_position = function()
	{
		if (document.body && document.body.scrollTop)
			return document.body.scrollTop;
		if (document.documentElement && document.documentElement.scrollTop)
			return document.documentElement.scrollTop;
		if (window.pageYOffset)
			return window.pageYOffset;
		return 0;
	}

})();

