var DM = {
	// always invoked, once document is loaded
	init: function()
	{
		// track mouse events, for the purposes of automatically closing any open drop-downs
		Event.observe(document, 'click', DM.onGlobalClick, false);
		
		// automatically place focus in form field, if applicable
		DM.autoFocus('form-main');
	},
	
	// invoked any time the mouse is clicked, anywhere on the page
	onGlobalClick: function(evt)
	{
		// automatically close any open drop-downs
		$$('.drop-down').each(function(dropDown)
		{
			// Note: evt.target is undefined and so this feature is broken, in IE7
			if (evt.target && evt.target.parentNode && evt.target.parentNode != dropDown) // don't close self
			{
				DM.toggleSelect(dropDown, true); // second argument forces drop-down to be closed
			}
		});
	},
	
	// automatically shift focus to applicable form field
	autoFocus: function(formID)
	{
		var f = $(formID);
		
		if (!f) { return; } // no auto-focus form exists
		
		// find the first eligible input in the form
		for (var i=0; i<f.elements.length; i++)
		{
			if (f.elements[i].focus && f.elements[i].type == 'text' && f.elements[i].value == '')
			{
				// shift focus to it
				f.elements[i].focus();
				break;
			}
		}
	},
	
	// toggle open/closed state of the given drop-down
	// second argument, optional, forces drop-down to be closed
	toggleSelect: function(dropDown, autoClose)
	{
		if (!dropDown) return;
		
		// show or hide drop-down list
		var list = document.getElementsByClassName('list', dropDown);
		
		// there should only be one list; act on it
		if (list && list[0])
		{
			if (list[0].style.display == 'block' || autoClose)
			{
				// hide it
			    DM.hide(list[0]);
			} else
			{
				// show it
			    DM.show(list[0]);
			}
		}
	},
	
	// show an element
	show: function(el)
	{
		el.style.display = 'block';
	},
	
	// hide an element, by id
	hide: function(el)
	{
		el.style.display = 'none';
	},
	
	isVisible: function(el)
	{
		return (el.style.display == 'block');
	},
	
	// toggle visible state of an element, by by
	toggle: function(id)
	{
		var el = $(id);
		if (el)
		{
			if (DM.isVisible(el))
			{
				// hide it
			    DM.hide(el);
			} else
			{
				// show it
			    DM.show(el);
			}
		}
	},
	
	// select an item in a drop-down
	select: function(option, targetID, value, isLink)
	{
		if (!option) return;
		
		var selected;
		
		if (!isLink)
		{
			// get reference to parent drop-down element
			var dropDown = option.parentNode.parentNode.parentNode.parentNode;
			
			// get a reference to the "selected value" element of the drop-down
			selected = document.getElementsByClassName('value', dropDown);
		}
		
		// get a handle on the corresponding hidden input
		var target = $(targetID);
		
		if (target && option.innerHTML)
		{
			// change the displayed selected value
			if (selected && selected[0])
			{
				selected[0].innerHTML = option.innerHTML;
			}
			
			// save the selected value in the corresponding hidden input
			target.value = value;
			
			// close the drop-down
			DM.toggleSelect(dropDown);
		}
		
		// special case; automatically reset input-pg selection to 1
		if (targetID == 'input-p')
		{
			DM.select(option, 'input-pg', 1);
		}
	},
	
	// shift focus to given element
	focus: function(el)
	{
		var focalElement = $(el);
		if (focalElement && focalElement.focus)
		{
			$(el).focus();
		}
	},
	
	// submit a form
	submitForm: function(formID)
	{
		var form = $(formID);
		if (form)
		{
			form.submit();
		}
	},
	
	/* 	AJAX: load result of given url into given element, passing as GET variables
	 *	form element values, calling onComplete function when loaded 
	 */
	load: function(url, container, variables, onComplete) {
		
		// GET parameter string to pass with URL
		var parameters;
		
		if (variables) 
		{
			if (variables.elements) 
			{
				// variables is a form; get all eligible form values and add to parameters
				var vars = [];
				
				parameters = '';
				for (var i=0; i<variables.elements.length; i++) 
				{
					var el = variables.elements[i];
					if (el.type == 'text' || el.type == 'textarea' || el.type == 'hidden') 
					{
						parameters += el.name+'='+$F(el)+'&';
					}
				}
				
			} else 
			{
				// assume variables is a string
				parameters = variables;
			}
		}
		
		// make AJAX call
		new Ajax.Updater(container, url, { method: 'get', parameters: parameters, onComplete: onComplete }); 
	},
	
	loadStates: function(id, src, parameters)
	{
		DM.load(src, id, parameters);
	},
	
	// show the "share this page" popup
	shareThisPage: function()
	{
		DM.load('inc/html/share.php', 'share', 'title='+escape(document.title)+'&location='+window.location.href, DM.onSendShare);
	},
	
	cancel: function(id)
	{
		$(id).innerHTML = '';
	},
	
	sendShare: function(formID, pageTrackerURL)
	{
		DM.load('inc/html/share.php', 'share', $(formID), function() { DM.onSendShare(pageTrackerURL); });
	},
	
	onSendShare: function(pageTrackerURL)
	{
		DM.autoFocus('share-form');
		if (!$('share-with'))
		{
			pageTracker._trackPageview(pageTrackerURL);
		}
	},
	
	reload: function()
	{
		var type = $F('input-t');
		/*
		DM.load('inc/html/search-'+type+'.php', 'form-main', 't='+type, DM.onReload);
		*/
		document.location.href = 'advanced-search?t='+type;
	},
	
	onReload: function()
	{
		DM.focus('auto-input');
	},
	
	play: function(container, parameters)
	{
		// first clear all other players
		var players = document.getElementsByClassName('player');
		for (var i=0; i<players.length; i++)
		{
			if (!players[i]._playButton)
			{
				players[i]._playButton = players[i].innerHTML;
			}
			if (players[i]._video)
			{
				players[i].innerHTML = players[i]._playButton;
				players[i]._video = null;
			}
		}
		
		if (parameters.match('youtube.com'))
		{
			var re = new RegExp('v=([^&]+)');
			var matches = parameters.match(re);
			videoCode = matches[1];
			
			$(container).innerHTML = '<object width="640" height="518"><param name="movie" value="http://www.youtube.com/v/'+videoCode+'&hl=en&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/'+videoCode+'&hl=en&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="518"></embed></object>';
			
		} else
		{
			$(container).innerHTML = '<div class="player-wrapper">Loading...<\/div>';
			$(container)._video = true;
			
			DM.load('inc/html/play.php', container, parameters);
		}
	},

	encrypt: function(form, fromInput, toInput)
	{
		if (form[fromInput].value == '') { return; }
		
		form[toInput].value = hex_md5(form[fromInput].value);
		form[fromInput].value = '';
	}
}

Event.observe(window, 'load', DM.init, false);