function setupHelpful(url) {
    var inputs = document.getElementsByTagName('input');
    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].type != 'submit' || (inputs[i].name != 'yes' && inputs[i].name != 'no'))
            continue;
        inputs[i].onclick = function (e) { return submitHelpful(e, url) };
    }
}

function submitHelpful(e, url) {
    if (!e) e = window.event;
    var button = e.target ? e.target : e.srcElement;
    if (!button)
        return;
    var helpful = button.name == 'yes';

    var review_id;
    var inputs = button.form.getElementsByTagName('input');
    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].name == 'ReviewID') {
            review_id = inputs[i].value;
            break;
        }
    }
    if (!review_id)
        return;

    var req;
    if (window.XMLHttpRequest)
        req = new XMLHttpRequest();
    else if (window.ActiveXObject)
        req = new ActiveXObject("Microsoft.XMLHTTP");
    else
        return;
//    req.open("GET", '<%config.db_cgi_url%>/review.cgi?helpful=1;ReviewID=' + review_id + (helpful ? ';yes=yes' : ';no=no'), true);
    req.open("GET", url + review_id + (helpful ? ';yes=yes' : ';no=no'), true);
    req.onreadystatechange = function () {
        if (req.readyState == 4) {
            if (req.status == 200) {
            /*
                    Assume the form tag is a child of the outer review helpful wrapper div and that
                    the text we need to manipulate is wrapped in spans (this is how the template is
                    by default.
            */
                var voted = req.responseText.match(/You have already voted/);
                var spans = button.form.parentNode.getElementsByTagName('span');
                if (!voted) {
                    for (var i = 0; i < spans.length; i++) {
                        if (!spans[i].hasChildNodes()) {
                            spans[i].appendChild(document.createTextNode((helpful ? 1 : 0) + ' of 1 people agreed with this comment'));
                            break;
                        }
                        else if (spans[i].firstChild.nodeType == 3 && spans[i].firstChild.nodeValue.match(/(\d+) of (\d+)/)) {
                            spans[i].firstChild.nodeValue = spans[i].firstChild.nodeValue.replace(/(\d+) of (\d+)/, (parseInt(RegExp.$1) + (helpful ? 1 : 0)) + ' of ' + (parseInt(RegExp.$2) + 1));
                            break;
                        }
                    }
                }
                var span = button.parentNode;
                while (span.hasChildNodes())
                    span.removeChild(span.firstChild);
                span.appendChild(document.createTextNode(voted ? 'You have already voted' : 'Thanks for the feedback.'));
            }
        }
    }
    req.send(null);

    return false;
}

