/**
 * Acl management Functions
 */
aclRemoveText = '';
aclRemoveUrl = '';
aclAddUrl = '';
aclObjectId = '';
aclGroupArray = new Array();
aclRoleTypeArray = new Array();
aclNoRulesMessage = '';
aclRulesMessage = '';

function initAclArea(indexUrl)
{
    new Ajax.Request(indexUrl, {
        parameters: '',
        onSuccess: displayAclArea,
        onFailure: displayAjaxError
    });
}
    
function displayAclArea(t) {
    var serverData = eval('(' + t.responseText + ')');
    aclRemoveText = serverData.removeText;
    aclRemoveUrl = serverData.removeUrl;
    aclAddUrl = serverData.addUrl;
    aclObjectId = serverData.objectId;
    aclNoRulesMessage = serverData.noRulesMessage;
    aclRulesMessage = serverData.rulesMessage;

    var form  = Builder.node('form', {onsubmit: 'addAclRule(); return(false);'});
    var table = Builder.node('table', {id: 'aclTable' });
    var thead = Builder.node('thead');
    var trth  = Builder.node('tr');
    var th1   = Builder.node('th'); th1.innerHTML = serverData.headings[0];
    var th2   = Builder.node('th'); th2.innerHTML = serverData.headings[1];
    var th3   = Builder.node('th'); th3.innerHTML = serverData.headings[2];
    var th4   = Builder.node('th'); th4.innerHTML = serverData.headings[3];
    var tbody = Builder.node('tbody', {id: 'aclTableBody'});
    var tfoot = Builder.node('tfoot');
    var trtf  = Builder.node('tr');
    var tf1   = Builder.node('td');
    var selectGroup = Builder.node('select', {id: 'selectGroup', className: 'textarea', style: 'width: 15em;'});
    serverData.applicableGroups.each(function(group) {
            var option = Builder.node('option', {value: group.id}, group.name);
            selectGroup.appendChild(option);
            /* Populate group array */
            aclGroupArray[group.id] = group.name;
            });
    selectGroup.selectedIndex = 0;
    var tf2   = Builder.node('td');
    var checkSubgroups = Builder.node('input', {id: 'checkSubgroups', value: '1', type: 'checkbox'});
    var tf3   = Builder.node('td');
    var selectRoleType = Builder.node('select', {id: 'selectRoleType', className: 'textarea'});
    serverData.applicableRoleTypes.each(function(roleType) {
            var option = Builder.node('option', {value: roleType.id});
            option.innerHTML = roleType.name;
            selectRoleType.appendChild(option);
            /* Populate Role type array*/
            aclRoleTypeArray[roleType.id] = roleType.name;
            });
	selectRoleType.selectedIndex = selectRoleType.options.length - 1;
    var tf4   = Builder.node('td');
    var addButton = Builder.node('input', {type: 'submit', className: 'submit', value: serverData.addText });
    table.appendChild(thead);
    table.appendChild(tbody);
    table.appendChild(tfoot);

    thead.appendChild(trth);
    trth.appendChild(th1);
    trth.appendChild(th2);
    trth.appendChild(th3);
    trth.appendChild(th4);

    tfoot.appendChild(trtf);
    trtf.appendChild(tf1); tf1.appendChild(selectGroup);
    trtf.appendChild(tf2); tf2.appendChild(checkSubgroups);
    trtf.appendChild(tf3); tf3.appendChild(selectRoleType);
    trtf.appendChild(tf4); tf4.appendChild(addButton);

    /* Insert message on first line */
    trMessage = Builder.node('tr');
    tdMessage = Builder.node('td', { id: 'aclMessageCell', colSpan: 4, className: 'informationRow'}, aclNoRulesMessage);
    trMessage.appendChild(tdMessage);
    thead.appendChild(trMessage);

    form.appendChild(table);
    $('aclArea').appendChild(form);
    
    serverData.rules.each(function(rule) {
       emergeAclLine(rule);
    });
}

function emergeAclLine(rule)
{
    var tr  = Builder.node('tr', {id: 'aclRow' + rule.id});
    var td1 = Builder.node('td'); td1.innerHTML = rule.group_name;
    var td2 = Builder.node('td'); if (rule.role_direct_only == 0) td2.innerHTML = 'X';
    var td3 = Builder.node('td'); td3.innerHTML = rule.role_name;
    var td4 = Builder.node('td');
    var removeButton = Builder.node('input', {type: 'button', className: 'submit', value: aclRemoveText, onclick: 'removeAclRule(' + rule.id + ');' });
    tr.appendChild(td1);
    tr.appendChild(td2);
    tr.appendChild(td3);
    tr.appendChild(td4);
    td4.appendChild(removeButton);
    //tr.style.display = 'none';
    $('aclTableBody').appendChild(tr);
    //new Effect.Appear('aclRow' + rule.id, {duration: 0.5});
    var acmc = $('aclMessageCell');
    if (acmc.textContent) acmc.textContent = aclRulesMessage;
    if (acmc.innerText) acmc.innerText = aclRulesMessage;
    acmc.className = 'alertRow';
}

function removeAclRule(ruleId)
{
    new Ajax.Request(aclRemoveUrl, {
        method: 'post',
        postBody: 'aclId=' + ruleId,
        parameters: '',
        onSuccess: hideAclRule,
        onFailure: displayAjaxError,
        on403: displayAjaxError
    });
}

function hideAclRule(t)
{
    var serverData = eval('(' + t.responseText + ')');
    var aclRow = $('aclRow' + serverData.removedAclId)
    //aclRow.style.display = 'none';
    aclRow.parentNode.removeChild(aclRow);
    if ($('aclTableBody').rows.length == 0) {
        var acmc = $('aclMessageCell');
        if (acmc.textContent) acmc.textContent = aclNoRulesMessage;
        if (acmc.innerText) acmc.innerText = aclNoRulesMessage;
        acmc.className = 'informationRow';
    }
}

function addAclRule()
{
    var queryString = 'objectId=' + aclObjectId + '&groupId=' + $('selectGroup').value + '&subgroups=' + ($('checkSubgroups').checked ? '1' : '0');
    if ($('selectRoleType').value != 0) {
        queryString = queryString + '&roleTypeId=' + $('selectRoleType').value;
    }
    new Ajax.Request(aclAddUrl, {
        method: 'post',
        postBody: queryString,
        parameters: '',
        onSuccess: displayAclRule,
        onFailure: displayAjaxError,
        on403: displayAjaxError
    });
}

function displayAclRule(t) {
    var serverData = eval('(' + t.responseText + ')');
    var rule = {
        id: serverData.aclId,
        group_name: aclGroupArray[serverData.groupId],
        role_direct_only: serverData.roleDirectOnly,
        role_name: aclRoleTypeArray[serverData.roleTypeId]
    };
    emergeAclLine(rule);
}

