/* Javascript for the my gaia ext layout.  Search the wiki for 'My-gaia-ext-layout-implementation' for doc */





/*Listener designed to send updates to the server.  In the backend, adding a widget
*to the column will remove it from the other column, so we don't have to worry about
*remove listener
*/
addPortletListener = function(container, component, number) {
    var widget_id = portal_to_widget[component.id];
    var column = column_containers[container.id];
    Ext.Ajax.request({
        url: layout_command_url,
        params: { layout_action: move_widget_action, widget_id: widget_id, 
            column: column, position: number.valueOf() }
    });
}

//The ajax request to remove a widget.
removePortlet = function( component) {
    var widget_id = portal_to_widget[component.id];
    Ext.Ajax.request({
        url: remove_widget_url,
        params: { widget_id: widget_id }
    });
}

var panel;
var portal_to_widget = new Array();
var widget_to_portal = new Array();
var column_containers = new Array();
var load_order = null;
var load_groups = new Array();
var updating_group = 0;
var widgets = null;

/** The following three methods (load_widgets, continue_load_widgets and
* load widget) work together in order to load the widgets.
* The ext framework was having problems when we asked it to simply
* load everythig at once.  So instead we ask the first row to load,
* then the second 1000 ms later and so on. */
function load_widgets() {
    load_order = init_load_order();
    
    for(var i = 0; i < load_order.length; i++){
        var group;
        if (i % 3 == 0) {
            group = new Array();
            load_groups.push(group);
        }
        group.push(load_order[i]);
    }
    if (load_order.length > 0){
        continue_load_widgets();
    }
}


function continue_load_widgets() {
    
    var load_group = load_groups[updating_group];
    for (var i = 0; i < load_group.length; i++){
        load_widget(load_group[i]);
    }
    updating_group++;
    if (updating_group < load_groups.length){
        setTimeout( continue_load_widgets, 1000 );
    }
}


function load_widget(widget_id){
    var portlet = widget_to_portal[widget_id]
    var widget = widgets[widget_id];
    if (portlet != null) {
        var updater = portlet.getUpdater();
        
        if (widget.reload_interval == 0) {
            portlet.getUpdater().update({
                url: render_widget_url, 
                method: 'GET',
                params: {
                    widget_id: widget_id
                }
            });
         } else {
            portlet.getUpdater().startAutoRefresh(
                widget.reload_interval, render_widget_url, "widget_id=" + widget_id, null, true);
         }
    }
}


//Pop open a window with settings for the specified widget.
function display_settings(widget_id) {
    
    panel = widget_to_portal[widget_id];
    
    updating_widget_id = widget_id;
    panel.getUpdater().stopAutoRefresh();
    //Call to the server to get HTML to display the settings.
    panel.getUpdater().update({
        url: layout_command_url,
        method: 'GET',
        params: { layout_action: display_settings_action, widget_id: widget_id  }
    });
}

/** Load the widget again when settings are complete.
*   This is called by submitting the settings form which is generated by an ajax call.
*/
function update_settings_callback(transport) {
    load_widget( updating_widget_id );
}

var close = {
    id:'close',
    handler: function(e, target, panel){
        var c = window.confirm('Are you sure you want to remove this widget?');
				if(!c){
					e.cancel=true;
					return false;
				}else{
					panel.ownerCt.remove(panel, true);
        	removePortlet(panel);
				}
    }
};

function create_portlet(widget){
    
    var refresh = {
        id: 'refresh',
        handler: function(){
            load_widget(widget.id);
        }
    };
    var tools = null;
    if (widget.num_options > 0) {
        var gear = {
            id:'gear',
            handler: function(){
                display_settings(widget.id);
            }
        };
        tools = [gear, refresh, close];
    } else {
        tools = [refresh, close];
    }

    portlet = new Ext.ux.Portlet({
        id: ("widget-" + widget.id),
        title: widget.name,
        tools: tools,
        xtype: 'portlet',
        contentEl: ("my-gaia-widget-" + widget.id),
        baseCls: 'x-panel',
        cls: ("widget x-" + widget.underscore_name)
    });
    
    return portlet;
}

/************** Here is the ONLOAD ********************/

/** Put the widgets skeletons in place, then ajax load the widgets. */
Ext.onReady(function(){
    widgets = init_widgets();
    var columns = init_columns();
    Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
    
    // create some portlet tools using built in Ext tool ids
    
    
    var column_container_items = new Array();
    //Create the ext column objects
    for (var i = 0; i < columns.length; i++){
        var column = columns[i];
        var column_portlets = new Array();
        
        //create the ext portlet objects
        for (var j = 0; j < column.widgets.length; j++) {
            
            widget = widgets[column.widgets[j]];
            column_portlets[j] = create_portlet(widget);
            
            //Provide forward and reverse lookup.
            widget_to_portal[widget.id] = portlet;
            portal_to_widget[portlet.id] = widget.id;
        }
        
        //now we create the column ext container items
        var item = new Object();
        column_container_items[i] = item;
        var column_name = "my-gaia-portalcolumn-" + i;
        item.id = column_name
        item.el = Ext.get(column_name);
        item.columnWidth = columns[i].width;
        item.baseClass = "x-panel-column";
        if (column_portlets.length > 0){
            item.items = column_portlets;
        }
    }
    
    
    
    var portal = new Ext.ux.Portal({
        items: column_container_items
    });
    
    for (var i = 0; i < columns.length; i++){
        column_containers[i] = portal.getComponent("my-gaia-portalcolumn-" + i);
        //provide reverse lookup
        column_containers[column_containers[i].id] = i;
        column_containers[i].addListener("add", addPortletListener);
        
    }
    
    portal.render("my-gaia-layout");
    
    load_widgets();
    
    
});    //end onReady

