{% extends 'admin/change_form.html' %}
{% block extrahead %}
{{ block.super }} 
<script>
deployment_nodes = [
{% for dn in deployment_nodes %}
   [{{ dn.0 }}, {{ dn.1 }} , "{{ dn.2 }}"],
{% endfor %}
];

deployment_flavors = [
{% for dn in deployment_flavors %}
   [{{ dn.0 }}, {{ dn.1 }} , "{{ dn.2 }}"],
{% endfor %}
];

deployment_images = [
{% for dn in deployment_images %}
   [{{ dn.0 }}, {{ dn.1 }} , "{{ dn.2 }}"],
{% endfor %}
];

site_login_bases = [
{% for s in site_login_bases %}
  [{{ s.0 }}, "{{ s.1 }}"],
{% endfor %}
];

function option_html(val, text, selected) {
    if (selected) {
        return '<option value="' + val + '" selected>' + text + '</option>\n';
    } else {
        return '<option value="' + val + '">' + text + '</option>\n';
    }
}

function update_nodes(deployment_select, flavor_select, node_select) {
    deployment_id = $(deployment_select).val();
    node_id = $(node_select).val();
    flavor_name = $(flavor_select).children(":selected").text()
    html="";
    for (i in deployment_nodes) {
        // this is for EC2, where the node hostnames imply the flavor.
        dn = deployment_nodes[i];
        if ((dn[0] == deployment_id) && (dn[2].lastIndexOf(flavor_name,0) === 0)) {
            html = html + option_html(dn[1], dn[2], dn[1]==node_id);
        }
    }
    if (!html) {
        // now try it without the flavor hostname prefix matching
        for (i in deployment_nodes) {
            dn = deployment_nodes[i];
            if (dn[0] == deployment_id) {
                html = html + option_html(dn[1], dn[2], dn[1]==node_id);
            }
        }
    }
    html = "<option value=''>---------</option>\n" + html;
    node_select.empty().append(html);
}

function update_flavors(deployment_select, flavor_select) {
    deployment_id = $(deployment_select).val();
    flavor_id = $(flavor_select).val();
    html = "<option value=''>---------</option>\n";
    for (i in deployment_flavors) {
        dn = deployment_flavors[i];
        if (dn[0] == deployment_id) {
            html = html + option_html(dn[1], dn[2], dn[1] == flavor_id);
        }
    }
    flavor_select.empty().append(html);
}

function update_images(deployment_select, image_select) {
    deployment_id = $(deployment_select).val();
    image_id = $(image_select).val();
    html = "<option value=''>---------</option>\n";
    for (i in deployment_images) {
        dn = deployment_images[i];
        if (dn[0] == deployment_id) {
            html = html + option_html(dn[1], dn[2], dn[1] == image_id);
        }
    }
    image_select.empty().append(html);
}

function sliver_deployment_changed(any_control) {
   /* This function handles someone changing the deploymentNetwork control
      in the add-sliver line. It updats the flavors and nodes dialogs
      accordingly.
   */

   /* the inscrutable jquery selector below says:
      find the closest parent "tr" to the current element
      then find the child with class "field-deploymentNetwork"
      then find the child with that is a select
      then return it's id
      then turn it into a jquery object
    */
    deployment_select = $("#" + $($(any_control).closest('tr')[0]).find('.field-deploymentNetwork select')[0].id);
    node_select = $("#" + $($(any_control).closest('tr')[0]).find('.field-node select')[0].id);
    flavor_select = $("#" + $($(any_control).closest('tr')[0]).find('.field-flavor select')[0].id);
    image_select = $("#" + $($(any_control).closest('tr')[0]).find('.field-image select')[0].id);
    update_nodes(deployment_select, flavor_select, node_select);
    update_flavors(deployment_select, flavor_select);
    update_images(deployment_select, image_select);
}

function sliver_flavor_changed(any_control) {
    /* this is like sliver_flavor changed, but does not update the flavors
       control
    */
    deployment_select = $("#" + $($(any_control).closest('tr')[0]).find('.field-deploymentNetwork select')[0].id);
    node_select = $("#" + $($(any_control).closest('tr')[0]).find('.field-node select')[0].id);
    flavor_select = $("#" + $($(any_control).closest('tr')[0]).find('.field-flavor select')[0].id);
    update_nodes(deployment_select, flavor_select, node_select);
}

function update_slice_prefix(site_select, slice_name_id) {
    site_id = $(site_select).val();
    slice_prefix="";
    for (i in site_login_bases) {
        if (site_login_bases[i][0] == site_id) {
            slice_prefix=site_login_bases[i][1]+"_";
        }
    }
    $("#"+slice_name_id).val(slice_prefix); 
}
</script>

{% endblock %}

