
/////////////////// Ajax ////////////////////

function ajaxRequest(url, parameters, cb, fail_cb)
{
	var options =
	{
		"asynchronous":true,
		"onComplete":function(response) { cb(response.responseText); },
		"parameters":parameters,
		"method":"get"
	}

	if (fail_cb != null)
	{
		options.onFailure = fail_cb;
		options.onException = fail_cb;
	}

	return new Ajax.Request(url, options);
}

/////////////////// Lookup Utilities ////////////////////

// decoding json:
function decodeJSON(raw)
{
	try
	{
		var Result = eval("(" + raw + ")");
	}
	catch(e)
	{
		return false;
	}
	return Result;
}

//////////////// HTML Access ////////////////

function setDivContent(dom_id, str)
{
	var ob = document.getElementById(dom_id);
	ob.innerHTML = str;
}

function lockButton(dom_id)
{
	var ButtonObj = document.getElementById(dom_id);
	ButtonObj.disabled = true;
}

function unlockButton(dom_id)
{
	var ButtonObj = document.getElementById(dom_id);
	ButtonObj.disabled = false;
}


///////////// Scriptaculous Effects //////////

// note: add option {"duration":2} to slow down the effects

// table with dom_id's for keys
// track locks on elements
// - can't run 2 effects on an element at once
var myElementLocks = new Object();

function lockElement(dom_id, lock_cb, user_cb)
{
	if (myElementLocks[dom_id] == null)
	{
		myElementLocks[dom_id] = {"dom_id":dom_id, "lock_cb":null, "user_cb":user_cb};
		return true;
	}

	// else set the callbacks on the existing lock
	myElementLocks[dom_id]["lock_cb"] = lock_cb;
	myElementLocks[dom_id]["user_cb"] = user_cb;
	return false;
}

function unlockElement(dom_id)
{
	// cache the user callback
	var user_cb = myElementLocks[dom_id]["user_cb"];

	// remove the lock
	myElementLocks[dom_id] = null;

	if (user_cb != null)
	{
		user_cb(dom_id);
	}
}

function finishEffect(dom_id)
{
	// cache the callback (if any)
	var lock_cb = myElementLocks[dom_id]["lock_cb"];
	var user_cb = myElementLocks[dom_id]["user_cb"];

	// remove the lock
	myElementLocks[dom_id] = null;

	if (lock_cb != null)
	{
		lock_cb(dom_id, user_cb);
	}
}

// Perform a blind down effect if the element is hidden
function showDropdown(dom_id, user_cb)
{
	if (lockElement(dom_id, showDropdown))
	{
		var ob = document.getElementById(dom_id);

		// Show the element if hidden
		if (ob.style.display == "none")
		{
			new Effect.BlindDown(ob, {"afterFinish":function() { finishEffect(dom_id); }});
		}
		else
		{
			// no effect performed, so unlock the element now
			unlockElement(dom_id);
		}
	}
}

// Perform a blind up effect if the element is visible
function hideDropdown(dom_id, user_cb)
{
	if (lockElement(dom_id, hideDropdown))
	{
		var ob = document.getElementById(dom_id);

		// Hide the element if visible
		if (ob.style.display != "none")
		{
			new Effect.BlindUp(ob, {"afterFinish":function() { finishEffect(dom_id); }});
		}
		else
		{
			// no effect performed, so unlock the element now
			unlockElement(dom_id);
		}
	}
}

// Show a hidden element, hide a visible element
function toggleDropdown(dom_id, user_cb) {
	if (lockElement(dom_id, toggleDropdown))
	{
		var ob = document.getElementById(dom_id);

		if (ob.style.display == "none")
		{
			new Effect.BlindDown(ob, {"afterFinish":function() { finishEffect(dom_id); }});
		}
		else
		{
			new Effect.BlindUp(ob, {"afterFinish":oncomplete_cb});
		}
	}
}



