/**
 *  manageCalendar.js -- uses AJAX to POST events to the user's calendar
 */

/******************************************************************************
 *  Global Variables                                                          *
 ******************************************************************************/

var request;

/******************************************************************************
 *  Intialization                                                             *
 ******************************************************************************/

addEvent(window, "load", initManager);

function initManager()
{
    var form = document.getElementById("eventForm");
    var buttons = document.getElementsByTagName("input");

    for (var i = 0; i < buttons.length; i++) {
        buttons[i].onclick = sendRequest;
    }
}

function sendRequest(event)
{
    var url = "/ports/calendarPort.php";
    var query;

    var match;
    var action;
    var dateID;

    if (match = this.getAttribute("name").match(/(\D+)(\d+)/)) {
        action = match[1];
        dateID = match[2];
        query = action + "=" + dateID;
        if (postXML(url, query)) {
            updateStatus("Sending request...");
            status = true;
        } else {
            status = false;
        }
    } else {
        status = false;
    }

    // Return false if successful to prevent form submission.
    return (!status);
}

// Processes the information from a returned count XML
function processXML()
{
	if (request.readyState == 4) {
		if (response = request.responseXML) {

			var code = getNodeValue(response, "code");
			var text = getNodeValue(response, "text");
			var dateID = getNodeValue(response, "dateID");

            updateStatus(text);

            if (code == 10) {
                if (button = document.getElementById("add" + dateID)) {
                    button.setAttribute("id", "remove" + dateID);
                    button.setAttribute("name", "remove" + dateID);
                    button.setAttribute("value", "Remove");
                }
            } else if (code == 20) {
                if (button = document.getElementById("remove" + dateID)) {
                    button.setAttribute("id", "add" + dateID);
                    button.setAttribute("name", "add" + dateID);
                    button.setAttribute("value", "Add");
                }
            }
        }
    }
}

function updateStatus(text)
{
    var statusDiv;

    if (statusDiv = document.getElementById("ajaxStatus")) {
        setText(statusDiv, text);
    } else {
        statusDiv = document.createElement("div");
        statusDiv.setAttribute("id", "ajaxStatus");
        document.getElementById("main").appendChild(statusDiv);
        setText(statusDiv, text);
    }
}

/******************************************************************************
 *  Utility Functions                                                         *
 ******************************************************************************/

function postXML(url, query)
{
    var status;

	// branch for native XMLHttpRequest object
	if (window.XMLHttpRequest) {
		request = new XMLHttpRequest();
		request.onreadystatechange = processXML;
		request.open("POST", url, true);
        request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
		request.send(query);
        status = true;

	// branch for IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		request = new ActiveXObject("Microsoft.XMLHTTP");
		if (request) {
			request.onreadystatechange = processXML;
			request.open("POST", url, true);
            request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
			request.send(query);
            status = true;
		} else {
            status = false;
        }
	} else {
        status = false;
    }

    return status;
}

// Adds an event handler to an element
function addEvent(element, type, handler)
{
    if (element.addEventListener) {
        element.addEventListener( type, handler, false );
    } else if (element.attachEvent) {
        element["e" + type + handler] = handler;
        element[type + handler] = function() { element["e" + type + handler](window.event); }
        element.attachEvent("on" + type, element[type + handler]);
    }
}

// Removes an event handler from an element
function removeEvent(element, type, handler)
{
    if (element.removeEventListener) {
        element.removeEventListener(type, handler, false);
    } else if (element.detachEvent) {
        element.detachEvent("on" + type, element[type+handler]);
        element[type+handler] = null;
    }
}

// Sets the text of an element (element should be empty or first child text)
function setText(element, text)
{
    var textNode = document.createTextNode(text);

    if (element.firstChild)
        element.replaceChild(textNode, element.firstChild);
    else
        element.appendChild(textNode);
}

function getNodeValue(topNode, tagName)
{
    if (elements = topNode.getElementsByTagName(tagName)) {
        if (elements[0].firstChild)
            value = elements[0].firstChild.nodeValue;
        else
            value = '';
    } else {
            value = '';
    }

    return value;
}
