/**
 * Return a reference to the element
 *
 * Can take a string (element ID) or an element reference
 */
function getElement(elementOrId) {
    if (typeof elementOrId == 'string') return document.getElementById(elementOrId);
    return elementOrId;
}
/**
 * Some AJAX support (Samy Ascha)
 */
var xmlHttpRequest = null;
var xmlHttpRequestInitialized = false;
function initXMLHttpRequest() {
	if (xmlHttpRequestInitialized) { return; }
	//alert("Obtaining XMLHttpRequest object ...");
	
	try { // FF, IE7, Safari, Opera 8.0+
		xmlHttpRequest = new XMLHttpRequest();
	}
	catch(e) { // IE6
		try {
			xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(e) {
			try {
				xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(e) {
				alert( "I could not obtain an XMLHttpRequest from your browser.\n\n"
					+ "You can change the refresh type or check your browser settings.");
			}
		}
	}
	xmlHttpRequestInitialized = true;
}
function standardRequestHandler() {
	switch(xmlHttpRequest.readyState) {
		case 0: break;
		case 1: displayLoadingMessage(); break;
		case 2: hideLoadingMessage();    break;
		case 3: showProcessingMessage(); break;
		case 4: hideProcessingMessage();
		        //alert(summarizeResponse());
				break;
		default: alert( "Unexpected error:\n\n"
		             + "self.xmlHttpRequest.readyState switch defaulted.");
	}
}
function displayLoadingMessage() {
	setInnerHtmlById('ajaxstatus', "Loading ...");
	//alert("Loading ...");
}
function hideLoadingMessage() {
	setInnerHtmlById('ajaxstatus', "Done loading ...");
	//alert("Done loading.");
}
function showProcessingMessage() {
	setInnerHtmlById('ajaxstatus', "Processing ...");
	//alert("Processing ...");
}
function hideProcessingMessage() {
	setInnerHtmlById('ajaxstatus', "Idle");
	//alert("Done processing.");
}
function summarizeResponse() {
	summary  = "Ready state: "      + xmlHttpRequest.readyState   + "\n";
	summary += "Response code: "    + xmlHttpRequest.status       + "\n";
	summary += "Response message: " + xmlHttpRequest.statusText   + "\n\n";
	summary += "Response:\n\n"      + xmlHttpRequest.responseText + "\n";
	return summary;
	//alert(summary);
}
function performGetRequest(url, requestHandler) {
	xmlHttpRequest.open('GET', url, false);
	xmlHttpRequest.onreadystatechange = requestHandler;
	xmlHttpRequest.send(null);
	return false;
}
function performPostRequest(url, postData, requestHandler) {
    xmlHttpRequest.open('POST', url, false);
	xmlHttpRequest.onreadystatechange = requestHandler;
	xmlHttpRequest.send(postData);
	return false;
}
function setInnerHtmlById(id, html) {
	var elem = false;
	elem = getElement(id);
	if (elem == false || elem == null) { return; }
	elem.innerHTML = html;
}
function setInnerHtmlByIdFromGetRequest(id, url) {
	performGetRequest(url, standardRequestHandler);
	setInnerHtmlById(id, xmlHttpRequest.responseText);
	return xmlHttpRequest.responseText;
}
function setInnerHtmlByIdFromPostRequest(id, url, postData) {
	performGetRequest(url, postData, standardRequestHandler);
	setInnerHtmlById(id, xmlHttpRequest.responseText);
}

function toggleClass(element, class1, class2) {
    element = getElement(element);
    if (!element) return;

    var klasses = element.className.split(" ");
    for (i = 0; i < klasses.length; i++) {
        if (klasses[i] == class2) klasses[i] = class1;
        else if (klasses[i] == class1) klasses[i] = class2;
    }
    element.className = klasses.join(" ");
}

function setClass(element, discriminator, class1, class2) {
    element = getElement(element);
    if (!element) return;

    var klasses = element.className.split(" ");
    found = false;
    for (i = 0; i < klasses.length; i++) {
        if (klasses[i] == class1 || klasses[i] == class2) {
            klasses[i] = discriminator ? class1 : class2;
            found = true;
        }
    }
    if (!found) klasses[klasses.length] = discriminator ? class1 : class2;
    element.className = klasses.join(" ");
}

function setDisplayBlockElementById(id, display) {
    var element = getElement(id);
    if (!element) return;

    element.style.display = (display) ? 'block' : 'none';
}

function setDisplayTRElementById(id, display) {
    var element = getElement(id);
    if (!element) return;

    element.style.display = (display) ? '' : 'none';
}

function toggleDisplayBlockElementById(id) {
    var element = document.getElementById(id);
    element.style.display = (element.style.display == 'none') ? 'block' : 'none';
}

function setDisabledInputElementById(id, disabled) {
    var inputElement = document.getElementById(id);
    inputElement.disabled = disabled;
}

function toggleDisabledInputElementById(id) {
    var inputElement = document.getElementById(id);
    inputElement.disabled = !inputElement.disabled;
}

function rotateValuesWithDelayForAttributeOfElementById(values, delay, attribute, id) {
	for (i = 0; i < values.length; i++) {
		setTimeout("doRotate('"+id+"', '" + attribute + "', '" + values[i] + "', " + (delay * values.length) + ")", delay * i);
	}
}

function doRotate(id, attribute, value, interval) {
	getElement(id).setAttribute(attribute , value);
	setInterval("getElement('" + id + "').setAttribute('" + attribute + "' , '" + value + "')", interval);
}

function setFocusById(id) {
	var element = getElement(id);
	element.focus();
}

function clickElementById(id) {
    var element = getElement(id);
    element.click();
}

function setVisibleClass(element, visible) {
    setClass(element, visible, "visible", "invisible");
}

function toggleCaption(headerElement, blockElement, headerClass1, headerClass2) {
    toggleClass(headerElement, headerClass1, headerClass2);
    toggleClass(blockElement, "visible", "invisible");
}

function toggleVisible(blockElement) {
    toggleClass(blockElement, "visible", "invisible");
}

function checkControlsVisibility(checkElementId, elementIds, positive) {
    var checkElement = getElement(checkElementId);
    if (!checkElement) return;

    for (i = 0; i < elementIds.length; i++) {
        var obj = document.getElementById(elementIds[i]);

        if (obj.tagName.toUpperCase() == 'TR')
            setDisplayTRElementById(obj, positive ? checkElement.checked : !checkElement.checked);
        else
            setVisibleClass(obj, positive ? checkElement.checked : !checkElement.checked);
    }
}

function setVisibleToCheckState(checkElementId, elementIds) {
    checkControlsVisibility(checkElementId, elementIds, true);
}

function explodePopup(explodeSource, popupId) {
    // Center div vertically
    var view  = dojo.html.getViewport();

    var popup = document.getElementById(popupId);
    var height = popup.offsetHeight;

    popup.style.top  = (dojo.html.getScrollTop() + (view.height - height) / 2) + "px";

    dojo.lfx.html.explode(explodeSource, popup, 250).play();
}

function showToolTip(elementId, event) {
    var obj = document.getElementById(elementId);
    if (!obj) return;

    mouse = getMousePosition(event);
    
    // Position the tooltip a bit behind the cursor, but correct for end-of-window troubles.
    x = mouse[0] + 3;
    y = mouse[1] + 3;

    var view   = dojo.html.getViewport();
    var height = obj.offsetHeight;
    var width  = obj.offsetWidth;

    // X
    if (x + width > view.width) x = mouse[0] - 3 - width;

    // Y
    var overShoot = (y + height) - (dojo.html.getScrollTop() + view.height) + 3;
    if (overShoot > 0) y -= overShoot;

    // Set position
    obj.style.left = x + "px";
    obj.style.top  = y + "px";

    setDisplayBlockElementById(obj, true);
}

function hideToolTip(elementId) {
    setDisplayBlockElementById(elementId, false);
}

/**
 * Show contact details based on <select> value
 * 
 * Similar to showToolTip, but takes the ID of a <select> element and requires
 * that the contactsToUids array is set. Shows the <div> with the contactId gotten
 * from the select.
 */
function showSelectedToolTip(selectElement, dictionary, event) {
    var obj = getElement(selectElement);
    if (!obj) return;

    var id = obj.value;
    showToolTip(dictionary[id], event);
}

/**
 * Same as previous, but not in cases where IE6 fucks up because form elements
 * will show thru the tooltip.
 */
function showSelectedToolTipNoIE6(selectElement, dictionary, event) {
    if (BrowserDetect.browser == "Explorer" && BrowserDetect.version < 7.0) return;
    showSelectedToolTip(selectElement, dictionary, event);
}

/**
 * Open popup with url based on form input value
 *
 * Use %s to specify hole in template.
 */
function openPopupFromValue(urlTemplate, formInput, popupAttributes) {
    var obj = getElement(formInput);
    if (!obj) return;
    var value = obj.value;

    url = urlTemplate.replace("REPLACE", value);
    window.open(url, "popupWindow", popupAttributes);
}

/**
 * Hide all contact tips
 */
function hideToolTips(dictionary) {
    for (var i in dictionary) hideToolTip(dictionary[i]);
}

function switchToTab(tabPrefix, switchIndex, capSelClass, capUnselClass, tabCookie) {
    var captions = findElements(tabPrefix, '-cap');
    var blocks   = findElements(tabPrefix, '-block');

    for (var i = 0; i < captions.length; i++) {
        setVisibleClass(blocks[i], i == switchIndex);
        if (capSelClass && capUnselClass) setClass(captions[i], i == switchIndex, capSelClass, capUnselClass);
    }

    if (tabCookie) Set_Cookie("tab_" + tabCookie, switchIndex, 0, '/', '', '');
}

function findElements(idPrefix, idPostfix) {
    var i = 0;
    var el;
    found = Array();
    while (true) {
        el = document.getElementById(idPrefix + i + idPostfix);
        if (!el) break;
        found[found.length] = el;
        i += 1;
    }
    return found;
}

/**
 * Show a popup modally
 *
 * This will also activate the DIV that will "hide" the background
 */
function showModalPopup(popupId, visible) {
    showModalPopupBackground(visible);
    setDisplayBlockElementById(popupId, visible);
}

function showModalPopupBackground(visible) {
    document.getElementById("popupDimBack").style.height = document.body.offsetHeight + "px";
    setDisplayBlockElementById("popupDimBack", visible);
}

/**
 * Determine mouse position
 * 
 * From: http://www.quirksmode.org/js/events_properties.html
 */
function getMousePosition(e) {
	var posx = 0;
	var posy = 0;
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) 	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY) 	{
		posx = e.clientX + document.body.scrollLeft
			+ document.documentElement.scrollLeft;
		posy = e.clientY + document.body.scrollTop
			+ document.documentElement.scrollTop;
	}

    return Array(posx, posy);
}

/**
 * Set a cookie
 *
 * From: http://techpatterns.com/downloads/javascript_cookies.php
 */
function Set_Cookie(name, value, expires, path, domain, secure) {
    // set time, it's in milliseconds
    var today = new Date();
    today.setTime( today.getTime() );

    /*
    if the expires variable is set, make the correct 
    expires time, the current script below will set 
    it for x number of days, to make it for hours, 
    delete * 24, for minutes, delete * 60 * 24
    */
    if (expires) expires = expires * 1000 * 60 * 60 * 24;
    var expires_date = new Date( today.getTime() + (expires) );

    document.cookie = name + "=" +escape( value ) +
    ( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) + 
    ( ( path ) ? ";path=" + path : "" ) + 
    ( ( domain ) ? ";domain=" + domain : "" ) +
    ( ( secure ) ? ";secure" : "" );
}


