/*
 * NTA aux javascripts
 *
 *  Copyright (c) 2008 by Scheme Arts, L.L.C., All rights reserved.
 */

/*
 * Variable name selector, left half
 */
function downloadVarNameSel(s, n)
{
    for (var i=n+1; i<=8; i++) downloadVarNameReset(i);
    if (!isSpecialVar(s.value)) {
        new Ajax.Request('nta/download-var-name-sel/' + s.value,
          {
            method: 'get',
            evalJSON: 'force',
            onSuccess: function(t) { downloadVarNameSet(n+1, t.responseJSON) }
          });
    }
}

function downloadVarNameResetAll()
{
    for (var i=2; i<=8; i++) downloadVarNameReset(i);
}

function isAllOffsprings(s)
{
    return (s && s.charAt(0) == "(");
}

function isAllDescendants(s)
{
    return (s && s.charAt(0) == "*");
}

function isSpecialVar(s)
{
    return (isAllOffsprings(s) || isAllDescendants(s));
}

function downloadVarNameReset(n)
{
    var s = $("var-names-" + n);
    if (s) {
        $A(s.childNodes).each(function(v) {
                                  if (!isAllOffsprings(v.value))
                                      s.removeChild(v);
                              });
        s.disabled = true;
    }
    var b = $("var-add-" + n);
    if (b) b.disabled = true;
}

function downloadVarNameSet(n, ns)
{
    var s  = $("var-names-" + n);
    if (s && $A(ns).size() > 0) {
        $A(ns).each(function(v, i) { s.appendChild(newOption(v)); });
        s.appendChild(newOption('* All descendants *'));
        s.disabled = false;
        var b = $("var-add-" + n);
        if (b) b.disabled = false;
    }
}

function newOption(v)
{
    return new Element('option',{'value':v}).update(v);
}

/*
 * Variable name selected, right half
 */

function downloadVarNameAdd(n)
{
    var s = $("var-names-" + n);
    var ns = $("var-names-selected");
    var added = [];
    var add1 = function(elt) {
        if (!isSpecialVar(elt)
            && !$A(ns.childNodes).find(function(v) {return v.value==elt;})) {
            ns.appendChild(newOption(elt));
            added.push(elt);
        }
    };
    var addN = function(elts) {
        elts.each(add1);
    };
    
    if (!s) return;
    if (!isSpecialVar(s.value)) {
        add1(s.value);
    } else if (isAllOffsprings(s.value)) {
        /* Adding all offsprings */
        addN($A(s.childNodes).map(function(v) {return v.value}));
    } else if (isAllDescendants(s.value)) {
        /* Adding all descendants.  We query to the server.
           To prevent multiple request, we temporarily disable "add" button.*/
        $("var-add-" + n).disabled = true;
        new Ajax.Request('nta/download-var-name-sel-all/'
                         + s.childNodes[1].value,
          {
            method: 'get',
            evalJSON: 'force',
            onSuccess: function(t)  { addN(t.responseJSON); },
            onComplete: function(t) { $("var-add-" + n).disabled = false; }
          });
    }
    downloadVarNameUndoPut('a', added);
}

function downloadVarNameDeleteSelected()
{
    var ns = $("var-names-selected");
    var deled = [];
    $A(ns.childNodes).each(function(v) {
                               if (v.selected) {
                                   deled.push(v.value);
                                   ns.removeChild(v);
                               }
                           });
    downloadVarNameUndoPut('d', deled)
}

function downloadVarNameDeleteAll()
{
    var ns = $("var-names-selected");
    var deled = [];
    $A(ns.childNodes).each(function(v) {
                               deled.push(v.value);
                               ns.removeChild(v);
                           });
    downloadVarNameUndoPut('d', deled);
}

/* Array to push add/deletion action for undo */
var downloadVarNameHistory = [];

function downloadVarNameUndoPut(action, items)
{
    if (items.length > 0) {
        downloadVarNameHistory.push([action, items]);
        $("var-selected-undo").disabled = false;
    }
}

function downloadVarNameUndo()
{
    var ns = $("var-names-selected");
    if (downloadVarNameHistory.length > 0) {
        var item = downloadVarNameHistory.pop();
        if (downloadVarNameHistory.length == 0) {
            $("var-selected-undo").disabled = true;
        }
        if (item[0] == 'a') {
            $A(ns.childNodes)
              .each(function(v) {
                        if (item[1].include(v.value)) ns.removeChild(v);
                    });
        } else if (item[0] == 'd') {
            item[1].each(function(v) { ns.appendChild(newOption(v)); });
        }
    }
}

/*
 * Select All/Select Clear
 */

function downloadSelectAll(selElementId)
{
    var sel = $(selElementId);
    if (sel) {
        $A(sel.childNodes).each(function (v) { v.selected = true; });
    }
}

function downloadSelectClear(selElementId)
{
    var sel = $(selElementId);
    if (sel) {
        $A(sel.childNodes).each(function (v) { v.selected = false; });
    }
}

/*
 * Before submitting the download form, select everything in
 * var-names-selected selection box so that they are included
 * in the request.
 */
function downloadFormOnSubmit() 
{
    var ns = $('var-names-selected');
    $A(ns.childNodes).each(function(v) { v.selected = true; });
}

/*
 * Disable submit button once pressed, to prevent the user to
 * click again.
 */
function uploadSubmitOnce(but)
{
    but.disabled = true;
    but.form.submit();
    return true;
}

