
function _ce(n) {
    return document.createElement(n);
}

function _ct(n) {
    return document.createTextNode(n);
}

function _gi(n) {
    return document.getElementById(n);
}

function ajaxAbstracts_handleError(request, e) {
    // ignore
}

function ajaxAbstracts_showNode(nodeId) {
    var wrapper = _gi(nodeId);
    if (wrapper != null) {
        wrapper.style.display = "block";
    }
}

function ajaxBasket_add(id, callback) {
    ajaxBasket_sendRequest("add", id);
    callback();
}

function ajaxBasket_remove(id, callback) {
    ajaxBasket_sendRequest("del", id);
    callback();
}

function ajaxBasket_pollForChange(data) {
    var url = 'http://www.hpm.org:80/controller/ajax/';
    var pars = '?service=SurveyBasket.Basket';
    $.ajax({
        url: url + pars,
        type: 'GET',
        timeout: 1000,
        success: function (data) {
            ajaxBasket_handlePollData(data);
            window.setTimeout("ajaxBasket_pollForChange()", 2500);
        }
    });

}

function ajaxBasket_handlePollData(data) {
    if (data != null) {
        var $surveyBasketSize = $('#surveybasketsize');
        if ($surveyBasketSize.text() != data) {
            // Re-Init the link state of all basket links.
            $surveyBasketSize.text(data);
            beaviour_basketLinks();
        }
    }
}

function ajaxBasket_sendRequest(action, surveyId) {
    var url = 'http://www.hpm.org:80/controller/ajax/';
    var pars = '?service=SurveyBasket.Basket';
    pars += '&a=' + action;
    pars += '&sid=' + surveyId;
    var $basket = $('.content-infobasket');
    var $basketSize = $('#surveybasketsize');
    $basket.css("background-color", "#FFFFFF");
    $basket.fadeTo("fast", 0, function () {
        $basket.css("background-color", "");
        try {
            $basketSize.load(
                url + pars,
                null,
                function() {
                    $basket.fadeTo("slow",1)
                });
        } catch(e) {}
    });
}

function ajaxAbstracts_initMouseoverEvents() {
    var $summaryButtons = $('.singlesummary');
    $summaryButtons.hover(
        function() {
            $summaryButtons.each(function() {
                if (this.tooltip) {
                    this.tooltip.css("display", "none");
                }
            });
            this.show = true;
            var $offset = $(this).offset();
            if (this.tooltip) {
               ajaxAbstracts_showElement(this.tooltip, $offset.top, $offset.left); 
            } else {
                this.tooltip = $('<div></div>')
                    .css('display', 'none')
                    .appendTo("body");
                ajaxAbstracts_loadAbstract(this.tooltip, this.id, $offset.top, $offset.left);
            }
        },
        function() {
            this.show = false;   
            this.tooltip.css("display", "none");
        }
    );
}

function ajaxAbstracts_loadAbstract($element, surveyId, top, left) {
    var url = 'http://www.hpm.org:80/controller/ajax/';
    var pars = 'service=SuveyDetails.Abstract';
        pars += '&surveyid=' + surveyId;
    $.get(url, pars, function(data) {
        $element.html(data);
        $element.css("position", "absolute")
                .css("width", "200px")
                .css("background-color", "white")
                .css("padding", "4px")
                .css("border", "1px solid gray");
        ajaxAbstracts_showElement($element, top, left);
    });
}

function ajaxAbstracts_showElement($element, top, left) {
    if (!$element.show) return;
    $element.css("top", top + "px")
            .css("left", (left - 210) + "px")
            .css("display", "block");

}

var LAST_QUERY = "";
var NO_RESULTS_TEXT = "";
var BLOCKED_COUNT = 0;
var TIMER = null;
var THRESHOLD_TIMEOUT = 400; // ms
var THRESHOLD_BLOCKEDCOUNT = 3; // no. of keys

function ajaxDicionary_findmatches(query) {
    if (LAST_QUERY != query && PAGELOAD_COMPLETE) {
        LAST_QUERY = query;
        if (TIMER != null) {
           window.clearTimeout(TIMER);
        }
        ++ BLOCKED_COUNT;
        if (BLOCKED_COUNT >= THRESHOLD_BLOCKEDCOUNT) {
            BLOCKED_COUNT = 0;
            ajaxDicionary_performRequest(query);
        } else {
           TIMER = window.setTimeout('ajaxDicionary_findByTimeout()', THRESHOLD_TIMEOUT);
        }
    }
}

function ajaxDicionary_performRequest(query) {
    var url = 'http://www.hpm.org:80/controller/ajax/';
    var pars = '?service=Translation.Translator';
        pars += '&q=' + query;
    $.ajax({
        url: url + pars,
        type: 'GET',
        dataType: 'xml',
        timeout: 1000,
        error: ajaxDicionary_handleError,
        success: ajaxDicionary_renderMatches
    });
}

function ajaxDicionary_findByTimeout() {
      BLOCKED_COUNT = 0;
      ajaxDicionary_performRequest(LAST_QUERY);
}

function ajaxDicionary_renderMatches(responseData) {
    var xmlDocument = responseData;
    if (xmlDocument != null) {
        var resultsUl = _gi("translationresults");
        try {
            while (resultsUl.hasChildNodes()) {
                resultsUl.removeChild(resultsUl.firstChild)
            }
            var dl = xmlDocument.getElementsByTagName("dl")[0];
            if (dl) {
                var children = dl.childNodes;
                var key;
                var value;
                if (children.length > 17) {
                    resultsUl.parentNode.parentNode.style.height = "20em";
                    resultsUl.parentNode.parentNode.style.overflow = "auto";
                } else {
                    resultsUl.parentNode.parentNode.style.height = "auto";
                    resultsUl.parentNode.parentNode.style.overflow = "hidden";
                    if (children.length == 0) {
                        var li = _ce("li");
                        li.appendChild(_ct(AJAXDICTIONARY_NO_RESULTS_TEXT));
                        resultsUl.appendChild(li);
                    }
                }
                for (i = 0; i < children.length; i+=2) {
                    key = children[i].firstChild.nodeValue;
                    value = children[i+1].firstChild.nodeValue;
                    var li = _ce("li");
                    var input;
                    var name = "an" + i;
                    var isSelected = ajaxDicionary_containsSelection(key)
                    if (document.all) {
                        input = _ce('<input name="' + name + '"' + (isSelected? ' checked="true"':'') + ' />');
                    } else {
                        input = _ce("input");
                        input.setAttribute("name", name);
                        if (isSelected) {
                            input.setAttribute("checked", "true");
                        }
                    }
                    input.setAttribute("type", "checkbox");
                    input.value = key;
                    input.setAttribute("id", "a" + i);
                    if (ajaxDicionary_containsSelection(key)) {
                        input.checked = true;
                    }
                    input.onclick = function() {
                        if (!this.checked && ajaxDicionary_containsSelection(this.value)) {
                            ajaxDicionary_removeSelection(this.value);
                        } else if(this.checked) {
                            ajaxDicionary_addSelection(this.value);
                        }
                    }

                    var label = _ce("label");
                    if (document.all) {
                        label.style.position = "static";
                        label.htmlFor = input.id;
                    } else {
                        label.setAttribute("for", input.id);
                    }
                    var labelText = _ct(key);
                    label.appendChild(labelText);

                    var span = _ce("span");
                    span.className = "germantext";
                    var spanText = _ct(" (" + value + ")");
                    span.appendChild(spanText);
                    label.appendChild(span);
                    li.appendChild(input);
                    li.appendChild(label);
                    resultsUl.appendChild(li);
                }
            } else {
                resultsUl.parentNode.parentNode.style.height = "auto";
                resultsUl.parentNode.parentNode.style.overflow = "hidden";
            }
        } catch (e) {
            ajaxDicionary_handleError(e);
        }
    }
}

function ajaxDicionary_removeSelection(selection) {
    var textinput = _gi("p_ft");
    textinput.value = textinput.value.replace('"' + trim(selection) + '"', "");
    //Remove multiple whitespaces
    var re = /\s\s+/;
    textinput.value = trim(textinput.value.replace(re, " "));
}

function ajaxDicionary_containsSelection(selection) {
    var textinput = _gi("p_ft");
    return textinput.value.indexOf('"' + trim(selection) + '"') != -1;
}

function ajaxDicionary_addSelection(selection) {
    var textinput = _gi("p_ft");
    textinput.value += " " + '"' + trim(selection) + '"';
    textinput.value = trim(textinput.value);
}

function ajaxDicionary_init() {
    var textinput = _gi("dictsearch");
    // Disable submit button if ajax is active
    var submitButton = _gi("dictsearchsubmit");
    if (submitButton != null) {
        submitButton.parentNode.removeChild(submitButton);
    }
    var dictDesc = _gi("dictdescription");
    if (dictDesc != null && dictDesc.innerHTML) {
        dictDesc.innerHTML = AJAXDICTIONARY_DESCRIPTION;
    }
    if (textinput != null) {
        textinput.style.width = "31em";
    }
    var textinput = _gi("dictsearch");
    if (textinput != null && textinput.value.length > 0) {
        ajaxDicionary_findmatches(textinput.value);
    }
}

function ajaxDicionary_onCreate(e) {
    document.body.style.cursor = "wait";
}

function ajaxDicionary_handleError(e) {
    // ignore.
}

// Removes leading whitespaces
function lTrim( value ) {
	var re = /^\s*/;
	return value.replace(re, "");
}

// Removes ending whitespaces
function rTrim( value ) {
	var re = /\s*$/;
	return value.replace(re, "");
}

// Removes leading and ending whitespaces
function trim( value ) {
	return lTrim(rTrim(value));
}