function getRequest(url, callback, data) {
    var req = new XMLHttpRequest();
    req.open("GET", url);
    req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    function stateChange() {
        if (didLoad(req)) {
            callback(req);
        }
    }
    req.onreadystatechange = stateChange;
    req.send(data);
}

function didLoad(request) {
    if(request.readyState !== 4) {
        return false;
    }
    if(request.status !== 200) {
        return false;
    }
    return true;
}

function getValue(element) {
    if(isEmpty(element) || isEmpty(element.value)) {
        return;
    }
    return element.value;
}

function clearSelect(elementId) {
    if(isEmpty(elementId)) {
        return;
    }
    var startLength = elementId.length;
    for(var i = startLength; i >= 0; i--) {
        elementId.options[i] = null;
    }
    elementId.disabled = true;
}

function isButtonEnabled(elementId) {
    if(isNull(document.getElementById(elementId))) {
        return true;
    }
    return document.getElementById(elementId).enabled;
}


function enableBookButton(buttonId) {
    var button = document.getElementById(buttonId);
    if(isEmpty(button)) {
        return;
    }
    button.disabled = false;
}

function enableBookButton2(buttonId, callerId) {
    var caller = document.getElementById(callerId);
    if(isEmpty(caller.value)) {
        return;
    }
    var button = document.getElementById(buttonId);
    if(isEmpty(button)) {
        return;
    }
    button.disabled = false;
}

function disableBookButton(buttonId) {
    var button = document.getElementById(buttonId);
    if(isEmpty(button)) {
        return;
    }
    button.disabled = true;
}

function selectAll(checkboxName) {
    var boxes = document.getElementsByName(checkboxName);
    for(var i = 0; i < boxes.length; i++) {
        boxes[i].checked = true;
    }
}

function selectNone(checkboxName) {
    var boxes = document.getElementsByName(checkboxName);
    for(var i = 0; i < boxes.length; i++) {
        boxes[i].checked = false;
    }
}

function selectElement(dropDown, value) {
    if(isEmpty(dropDown)) {
        return;
    }    
    if(isEmpty(value)) {
        return;
    }
    for(var i = 0; i < dropDown.options.length; i++) {
        if(dropDown.options[i].value === value) {
            dropDown.options[i].selected = true;
            return;
        }
    }
}


function debug(message, important) {
    if(important) {
        alert(message);
    } else {
        window.status = message;
    }
}

function isNotEmpty(toCheck) {
    return !isEmpty(toCheck);
}

function isNotNull(toCheck) {
    return !isNull(toCheck);
}

function isNull(toCheck) {
    if(toCheck === undefined) {
        return true;
    }
    if(toCheck === null) {
        return true;
    }
    return false;
}

function isEmpty(toCheck) {
    if(isNull(toCheck)) {
        return true;
    }
    if(toCheck === "") {
        return true;
    }
    return false;
}

function findOnEnter(event, method) {
    if(keyPressed(event, 13)) {
        method();
        stopEvent(event);
        return false;
    }
    return true;
}

function keyPressed(event, keyCode) {
    if(event.keyCode === keyCode) {
        return true;
    }
    if(event.which === keyCode) {
        return true;
    }
    return false;
}

function containsErrors(xmlHttpRequest) {
    if(xmlHttpRequest.responseXML) {
        var errorList = xmlHttpRequest.responseXML.getElementsByTagName("error");
        if(errorList.length && errorList.length > 0) {
            return true;
        }
    }
    return false;
}

function showMessages(xmlHttpRequest) {
    if(!xmlHttpRequest.responseXML) {
        return;
    }
    var messages = xmlHttpRequest.responseXML.getElementsByTagName("message");
    for(var i = 0; i < messages.length; i++) {
        alert(messages[i].getAttribute("text"));
    }
}

function Indicator(statusContainer, indicatorElement) {
    this.statusContainer = statusContainer;
    this.indicatorElement = indicatorElement;
    this.activate = function() {
        if(this.statusContainer.childNodes[this.indicatorElement.id]) {
            return;
        }
        this.statusContainer.appendChild(this.indicatorElement);
    };
    this.deactivate = function() {
        if(this.statusContainer.childNodes[this.indicatorElement.id]) {
            this.statusContainer.removeChild(this.indicatorElement);
        }
    };
}

function animatedIndicator(statusContainer) {
    var loadImage = document.createElement("img");
    loadImage.src = "navgfx/loading.gif";
    loadImage.id = statusContainer.id + "AnimatedIndicator";
    return new Indicator(statusContainer, loadImage);
}

function loadContent(loadIndicator, container, url) {
    var current = container.innerHTML;
    loadIndicator.activate();
    getRequest(url,function(req) {
        loadIndicator.deactivate();
        if(current === req.responseText) {
            return;
        }
        container.innerHTML = req.responseText;
    });
}

function stopEvent(event) {
    event.cancelBubble = true;
    event.returnValue = false;
    if(event.stopPropagation) {
        event.preventDefault();
        event.stopPropagation();
    }
}

function getChildNode(nodeId, nodeList) {
    var length = nodeList.length;
    for(var i = 0; i < length; i++) {
        if(nodeList[i].id === nodeId) {
            return nodeList[i];
        }
    }
    return null;
}

function helpPopup(element) {
    if(isEmpty(element.title)) {
        return;
    }
    var popup = createPopup(element.title);
    popup.style.zIndex = "600";
    popup.style.position = "absolute";
    positionPopup(popup, element);
    document.body.appendChild(popup);
    addEvent(popup, "mouseover", function() {
        popup.style.visibility = "hidden";
    });
    addEvent(element, "focus", function() {
        popup.style.visibility = "visible";
    });
    addEvent(element, "blur", function() {
        popup.style.visibility = "hidden";
    });
}

function addPopups(tagName) {
    var elements = document.getElementsByTagName(tagName);
    if(isEmpty(elements) || elements.length == 0) {
        return;
    }
    var length = elements.length;
    for(var i = 0; i < length; i++) {
        helpPopup(elements[i]);
    }
}

function positionPopup(popup, parent) {
    popup.style.left = calculateOffsetLeft(parent) + calculateWidth(parent) + "px";
    popup.style.top = calculateOffsetTop(parent) + 10 + "px";
    popup.style.width = "200px";
}

function createPopup(text) {
    var popup = document.createElement("div");
    popup.style.visibility = "hidden";
    popup.className = "helpPopup";
    text = text.replace(/\. /g, ".<br>");
    popup.innerHTML = text;
    return popup;
}

function addEvent(obj,evt,fn) {
    if (obj.addEventListener) {
	obj.addEventListener(evt,fn,false);
    } else if (obj.attachEvent) {
        obj.attachEvent('on'+evt,fn);
    }
}

function removeEvent(obj,evt,fn) {
    if (obj.removeEventListener) {
	obj.removeEventListener(evt,fn,false);
    } else if (obj.detachEvent) {
	obj.detachEvent('on'+evt,fn);
    }
}

function positionBelowParent(div, parent) {
    div.style.left=calculateOffsetLeft(parent)+"px";
    div.style.top=calculateOffsetTop(parent)+parent.offsetHeight-1+"px";
    div.style.width = calculateWidth(parent) + "px";
}

function calculateWidth(parent) {
    return parent.offsetWidth;
}

function calculateOffsetLeft(element){
  return calculateOffset(element,"offsetLeft");
}

function calculateOffsetTop(element){
  return calculateOffset(element,"offsetTop") +1;
}

function calculateOffset(element,attribute){
  var kb=0;
  while(element){
    kb+=element[attribute]; 
    element=element.offsetParent;
  }
  return kb;
}

addEvent(window, "load", function() {
    addPopups("input");
    addPopups("select");
    addPopups("textarea");
});
