/* This is an example that uses xoslib + datatables to display the developer
   view.

   For an example that uses xoslib + marionette, see xosDeveloper.js
*/

function updateSliceTable(data) {
    $('#developerView').html( '<table cellpadding="0" cellspacing="0" border="0" class="display" id="dynamicusersliceinfo"></table>' );
    var actualEntries = [];

    for (rowkey in data.models) {
        row = data.models[rowkey];
        slicename = row.get("name");
        sliceid = row.get("id");
        role = row.get("sliceInfo").roles[0];
        slivercount = row.get("sliceInfo").sliverCount;
        sitecount = row.get("sliceInfo").siteCount;
        backendHtml = row.get("backendHtml")

        if (! role) {
            continue;
        }

        actualEntries.push([backendHtml + ' <a href="/admin/core/slice/' + sliceid + '">' + slicename + '</a>',
                            role, slivercount, sitecount]);
    }
    oTable = $('#dynamicusersliceinfo').dataTable( {
        "bJQueryUI": true,
        "aaData":  actualEntries ,
        "bStateSave": true,
        "aoColumns": [
            { "sTitle": "Slice" },
            { "sTitle": "Privilege" , sClass: "alignCenter"},
            { "sTitle": "Number of Slivers" , sClass: "alignCenter"},
            { "sTitle": "Number of Sites" , sClass: "alignCenter"},
        ]
    } );
}

$(document).ready(function(){
    xos.slicesPlus.on("change", function() { /*console.log("change");*/ updateSliceTable(xos.slicesPlus); });
    xos.slicesPlus.on("remove", function() { /*console.log("sort");*/ updateSliceTable(xos.slicesPlus); });
    xos.slicesPlus.on("sort", function() { /*console.log("sort");*/ updateSliceTable(xos.slicesPlus); });

    xos.slicesPlus.startPolling();
});

