var differentiationLevels = new Array();
var selectedList = new Array();
var startParent = -1;

function DifferentiationLevel(level, parentId, differentiations) {
    this.level = level;
    this.parentId = parentId;
    this.differentiations = differentiations;
    this.selected = -1;
}

function fillSelectedList(id) {
    selectedList[selectedList.length] = id;
}

function addDifferentiationLevels(startparentId) {
    addDifferentiationLevel(startparentId);
    startParent = startparentId;
    for (var i = 0; i < selectedList.length; i++) {
        handleSelect(selectedList[i], i);
    }

    renderDifferentiationLevels();
}

function addDifferentiationLevel(parentId) {

    if (parentId == -1) {
        return;
    }

    var diffs = server.getDifferentiations(productId, parentId);

    if (diffs == null) {
        if (diffMode!=CREATE_ORDER) {
            renderDifferentiationOptionEditor(diffs);
        }
        return;
    }

    var level = differentiationLevels.length;
    differentiationLevels[level] =
    new DifferentiationLevel(level, parentId, diffs);

    if (diffMode!=CREATE_ORDER) {
         renderDifferentiationOptionEditor(diffs);
    }

    renderDifferentiationLevels();
}

function handleSelect(selected, level) {

    // remember selected value (for re-rendering)
    differentiationLevels[level].selected = selected;
    
    // remove levels below current level
    if (differentiationLevels.length > level + 1) {
        differentiationLevels.length = level + 1;
        renderDifferentiationLevels();
    }

    if (diffMode!=CREATE_ORDER) {
        var renderId = selected;
        addDifferentiationLevel(selected);

        if (selected==-1) {
            if (differentiationLevels.length>1){
                renderId = differentiationLevels[differentiationLevels.length-2].selected;
            } else {
                renderId = rootId;
            }
        }

        var diffs = server.getDifferentiations(productId, renderId);
        renderDifferentiationOptionEditor(diffs);


    } else {
        if (selected == -1) {
            document.getElementById('nextStep').style.display = 'none';
            return;
        }

        if (isLeaf(level, selected)) {
            document.forms[0].differentiation.value = selected;
            document.getElementById('nextStep').style.display = 'block';
        } else {
            document.getElementById('nextStep').style.display = 'none';
            addDifferentiationLevel(selected);
        }
    }
}

function handleDifferentiationSelect(select, level) {
    var selected = select.options[select.selectedIndex].value;
    handleSelect(selected, level);
}

function isLeaf(level, id) {
    var differentiationLevel = differentiationLevels[level];
    var differentiations = differentiationLevel.differentiations.differentiations;
    for (var i = 0; i < differentiations.length; i++) {
        var differentiation = differentiations[i];
        if (differentiation.id == id) {
            return differentiation.leaf;
        }
    }
    return false;
}

function renderDifferentiationLevels() {
    var html = "<table cellspacing=\"0\" cellpadding=\"4\" border=\"0\">";

    for (var i = 0; i < differentiationLevels.length; i++) {
        var differentiationLevel = differentiationLevels[i];
        var isLast = false;
        if(i==differentiationLevels.length-1&&diffMode==VIEW_DIFF_OPTIONS) isLast=true;
        html += renderDifferentiationLevel(differentiationLevel,isLast);
    }

    html += "</table>";

    document.getElementById("differentiations").innerHTML = html;

    //setLabelCombo(d);

    if (diffMode!=CREATE_ORDER)
        document.forms[0].noOfLevels.value = differentiationLevels.length;
}

function renderDifferentiationLevel(differentiationLevel,isLast) {
    var differentiations = differentiationLevel.differentiations;
    var selectedId = differentiationLevel.selected;

    var html = "";

    html += "<tr><td>";
    html += differentiations.label;
    html += "</td><td> ";
    html += "<select name=\"level_" + differentiationLevel.level;
    html += "\" onchange=\"handleDifferentiationSelect(this, ";
    html += differentiationLevel.level;
    html += ")\">";
    //html += renderDifferentiationOption(-1, "--- " + differentiations.label
    //        + " ---", selectedId)
    html += renderDifferentiationOption(-1, "----", selectedId);

    var diffs = differentiations.differentiations;
    for (var i = 0; i < diffs.length; i++) {
        var differentiation = diffs[i];
        html +=
            renderDifferentiationOption(differentiation.id, differentiation.value, selectedId);
    }

    html += "</select>";
    if(isLast){
        html += renderSetLabel();
    }
    html += "</td></tr>";

    return html;
}

function renderDifferentiationOption(id, value, selectedId) {
    var html = "";

    html += "<option value=\"";
    html += id;
    html += "\"";
    html += (id == selectedId ? " selected" : "");
    html += ">";
    html += value;
    html += "</option>";

    return html;
}

function handleUpdateLeafNode(select, id) {
    var selected = select.options[select.selectedIndex].value;
    //alert(selected + " " +  id);
    document.forms[0].diffId.value = id;
    document.forms[0].accessCodeGroupId.value = selected;
    document.forms[0].submit();
}


function renderDifferentiationOptionEditor(d) {

    if (diffMode==VIEW_DIFF_OPTIONS||diffMode==SET_LEAF_NODES) {
        if (d == null) {
            document.getElementById("differentiationEditor").style.display = 'none';
            return;
        } else {
            document.getElementById("differentiationEditor").style.display =
            'block';
        }

        var diffs = d.differentiations;

        var html = "<table class=\"myFilledTable\" width=\"100%\" cellspacing=\"2\" cellpadding=\"3\">";

        if (diffMode==VIEW_DIFF_OPTIONS){
            // EDIT DIFF OPTIONS
            for (var i = 0; i < diffs.length; i++) {
                var diff = diffs[i];
                html += (i % 2 == 0)? "<tr class=\"even\">" : "<tr class=\"odd\">";
                if (diff.id == editId) {
                    html += "<td><input type=\"Text\" name=\"updateOption\" value=\"" + diff.value + "\" /></td>";
                    html += "<td align=\"right\" width=\"18\"><a href=\"javascript:setModeToUpdate(" + diff.id + ");document.forms[0].submit()\" ><img src=\"pub_images/spacer.gif\" alt=\"\" class=\"mtIcon publishIcon\" hspace=\"3\" /></a></td>";
                } else {
                    html += "<td>" + diff.value + "</td>";
                    html += "<td align=\"right\" width=\"18\"><a href=\"javascript:setModeToEdit(" + diff.id + ");document.forms[0].submit()\" ><img src=\"pub_images/spacer.gif\" class=\"mtIcon editIcon\" alt=\"\" hspace=\"3\" /></a></td>";
                }

                if (diff.deleteable)
                    html += "<td align=\"right\" width=\"18\"><a href=\"javascript:setModeToDelete(" + diff.id + ");document.forms[0].submit()\" ><img src=\"pub_images/spacer.gif\" class=\"mtIcon deleteIcon\" alt=\"\" /></a></td>";
                else
                    html += "<td align=\"right\" width=\"18\"></td>";

                html += "</tr>";

                //setLabelCombo(d);
            }
        }
        // SET LEAF NODES
        if (diffMode==SET_LEAF_NODES) {
            for (var i = 0; i < diffs.length; i++) {
                var diff = diffs[i];
                html += (i % 2 == 0)? "<tr class=\"even\">" : "<tr class=\"odd\">";
                html += "<td>" + diff.value + "</td>";
                html += "<td align=\"right\">";
                html += "<select name=\"LeafNode_"+ diff.id +"\" ";
                html += "\" onchange=\"handleUpdateLeafNode(this, ";
                html += diff.id;
                html += ")\">";

                html += "<option value=\"-1\">------</option>";

                for (var j = 0; j < accessCodeGroups.length; j++) {
                    var value = accessCodeGroups[j][1];
                    var name = accessCodeGroups[j][0];
                    html += "<option ";
                    html += (diff.leaf && (value==diff.accessCodeGroupId) )? " SELECTED" : "";
                    html += " value=\""+ value +"\">"+ name +"</option>";
                }

                html += "</select>";
                html += "</td>";
                html += "</tr>";
            }
        }

        html += "</table>";

        document.getElementById("differentiationEditor").innerHTML = html;
    }
}

function setLabelCombo(diff){
    if (diff!=null){
   //     var diff = diffs.differentiations[0];
        var combo = document.forms[0].optionsLabel;
        var options = combo.options;
        var len = options.length;

        for( var i=0; i<len; i++){
            if (options[i].value==diff.labelId ) combo.selectedIndex = i;
        }
    }
}

function setModeToNew() {
    document.forms[0].mode.value = "New";
}

function setModeToEdit(id) {
    document.forms[0].mode.value = "Edit";
    document.forms[0].diffId.value = id;
}

function setModeToDelete(id) {
    document.forms[0].mode.value = "Delete";
    document.forms[0].diffId.value = id;
}

function setModeToUpdate(id) {
    document.forms[0].mode.value = "Update";
    document.forms[0].diffId.value = id;
}

function setModeToSetLabel() {
    document.forms[0].mode.value = "SetLabel";
}

function setDifferentiation(id) {
    document.forms[0].differentiation.value = id;
}

