var dashboard = null, controls = null, editingDashboard = false;
var Dashboard = {
    config: {},
    observers: {},
    otherProperties: null,
    currentlyViewableClass: null,
    widgetListURL: '/dashboard/widget/widgetlist.nn',    
    observer: function(eventname, func)
    {
        if(!this.observers[eventname])
        {
            this.observers[eventname] = [];    
        }
        
        this.observers[eventname].push(func);
    },
    triggerEvent: function(eventname, object)
    {
        var funcs = this.observers[eventname];
        
        if(funcs)
        {
            funcs.each(function(func)
                {
                    func(object);    
                });
        }
        
    },
    setOtherProperties: function(p)
    {
        this.otherProperties = p;       
    },
    setInheritedParameters: function(p)
    {
        this.config.inheritedParameters = p;    
    },
    toggleViewableWidgets: function(className)
    {
        if(!className) { return; }
        this.currentlyViewableClass = className;
        dashboard.select('li.widget').each(function(li)
            {
                if(li.hasClassName(className))
                {
                    li.show();    
                }
                else
                {
                    li.hide();    
                }
                
            });
    },
    resetViewableWidgets: function()
    {
        this.toggleViewableWidgets(this.currentlyViewableClass);    
    },
    resetDashboard: function(button)
    {
        Cognoti.confirmBubble(button, new Element('div').update('This will reset your dashboard to the original system configuration.  Doing so will remove any customization you have added to your dashboard.  Would you like to continue?'),
            false, ['Yes', 'No'], function(val)
            {
                if(val == 'Yes')
                {
                    Dashboard.config.form.down('input[name="process"]').setValue('resetdashboard');
                    Dashboard.config.form.submit();
                }
            });
        
    }
    
}


var registerDashboard = function(dash, dashcontrols, category, inherited)
{
    dashboard = $(dash);
    controls = $(dashcontrols);
    Dashboard.config.category = category;
    Dashboard.config.inheritedParameters = inherited;
    
    if(controls)
    {
        controls.show();
    }
}

var addWidgetWizard = function(toolbar)
{
    var tb = $(toolbar);  
    
    tb.update(new Element('img', { 'src': '/cognoti/img/spinner.gif', 'alt': 'Loading...' }));
    
    
    new Ajax.Request(Dashboard.widgetListURL, { 
            parameters: { view: 'listbycategory', category: Dashboard.config.category },
            onComplete: 
            function(t) 
            { 
                var xml = t.responseXML.documentElement;
                
                var widgets = {};
                
                var ul = new Element('ul', { 'class': 'toolbar'});
                
                $A(xml.childNodes).each(function (child)
                {
                    var w = xmlElementToJs(child);
                    
                    var li = new Element('li', {'class':'button'}).update(w.name);
                    li.info = w;
                    new Draggable(li, { revert: true, ghosting: true, scroll: window });
                    ul.insert(li);
                });
                
                tb.update(ul).insertClear();
            }
    });
}

var reloadWidget = function(widgetBlock)
{
    widgetBlock = $(widgetBlock);

    var params = widgetBlock.down('input[name=parameters]').getValue();
    var preferences = widgetBlock.down('input[name=preferences]').getValue();
    var widget = widgetBlock.down('input[name=widgetid]').getValue();
    var content = widgetBlock.down('div.widget_content');
    
    /* content.setStyle({height: content.getHeight()+'px'}); */
    content.update(new Element('img', { 'src': '/cognoti/img/spinner.gif', 'alt': 'Loading...' }));
    
    new Ajax.Updater(content, '/dashboard/widget/widgetrender.nn', { 
            parameters: { parameters: params, preferences: preferences, widget: widget, inherited: Dashboard.config.inheritedParameters },
            evalScripts: true,
            onComplete: function(t) { 
                content.setStyle({height: 'auto'}); 
                Dashboard.triggerEvent('layout-updated', null);
            }
    });
        
}

var toggleDashboard = function()
{
    if(editingDashboard)
    {
        if(dashboard)
        {
            dashboard.addClassName('helpersoff');
        }
        
        if(controls)
        {
            //Effect.SlideUp(controls.down('.dashboardtoolbar'));
            controls.down('.dashboardtoolbar').hide();
        }
        
        editingDashboard = false;
    }
    else
    {
        if(dashboard)
        {
            dashboard.removeClassName('helpersoff');
        }
        
        if(controls)
        {
            //Effect.SlideDown(controls.down('.dashboardtoolbar'));
            controls.down('.dashboardtoolbar').show();
            addWidgetWizard('dashboardWidgetToolbar');
            
            setupScrollingBox('scrollingDashboardControls');
        }
        editingDashboard = true;
    }
}

var setupScrollingBox = function(box)
{
    var fw = $(box); 
    var offset = fw.cumulativeOffset();
    fw.originalTop = offset[1];
    fw.originalLeft = offset[0];
    fw.absolutize();
    fw.relativize();
    
    fw.setStyle({'margin': 'auto', 'width': fw.getWidth()+'px'}); 
    
    var scrollFunc = function()
        {
            var top = document.viewport.getScrollOffsets()[1];
            var setTop = top - fw.originalTop;
            
            if(top > fw.originalTop - 5)
            {
                fw.setStyle({'position': 'fixed', 'top': '5px', 'left': fw.originalLeft+'px', 'zIndex': 12});
            }
            else
            {
                fw.setStyle({'position': 'static'});
            }
        }
    
        document.observe('scroll', scrollFunc);
        scrollFunc();
}


var supportedBlocks = { portlet: 'portlet' };

var setSupportedBlocks = function(blocks)
{
    supportedBlocks = blocks;    
}

var doEdit = function(widgetblock, deleteOnCancel)
{
    widgetblock = $(widgetblock);
    var lbid = widgetblock.identify();
    var widgetid = widgetblock.down('input[name="widgetid"]').getValue();
    var params = widgetblock.down('input[name="parameters"]').getValue();
    var prefs = widgetblock.down('input[name="preferences"]').getValue();
    
    var params = {
        widgetid: widgetid,
        parameters: params,
        preferences: prefs,
        widgetblock: lbid,
        deleteoncancel: deleteOnCancel
    };
    
    Modalbox.show('/dashboard/widget/widgetproperties.nn', 
        {   
            title: 'Modify Widget Properties',
            width: 600,
            overlayClose: false,
            closeString: ' ',
            params: params,
            method: 'post',
            afterLoad: function() 
            {
                var wpo = $('widgetPropertyOthers');
                
                if(wpo && Dashboard.otherProperties)
                {
                    for(var i in Dashboard.otherProperties)
                    {
                        var div = new Element('div');
                        
                        var p = Dashboard.otherProperties[i];
                        
                        var fe = null;
                        
                        if(p.type == 'select')
                        {
                            fe = Cognoti.makeSelect(i,
                                p.selectOptions,
                                null);
                        }
                        else if(p.type == 'textbox')
                        {
                            fe = new Element('input', { 'type': 'textbox', 'name': i });
                        }
                        
                        
                        if(fe)
                        {
                            fe.addClassName('other');
                            div.appendFormElement(p.label, fe);    
                            
                            var val = widgetblock.down('input[name="'+i+'"]');
                            
                            if(val)
                            {
                                fe.setValue(val.getValue());    
                            }
                            
                            wpo.insert(div);
                        }
                        
                    }
                    
                    Modalbox.resizeToContent();
                }
            },
			beforeHide: function()
			{
				var textareas = $('widgetPropertyManager').select('textarea');
				for (i = 0; i < textareas.size(); i++)
				{
					closeTextArea(textareas[i].identify());
				}
			},
            afterHide: function()
            {	
				completeEdit(widgetblock, null, deleteOnCancel); 
            }
        });
    
}

var completeEdit = function(widgetblock, propdiv, deleteOnCancel)
{
    var lb = $(widgetblock);
    propdiv = $(propdiv);

    if(!propdiv) //cancelled
    {
        if(deleteOnCancel.toString() == 'true')
        {
            lb.remove();                
        }
    }
    else
    {
        var parameters = new Hash();
        var preferences = new Hash();
        var others = new Hash();
        propdiv.select('input[type="text"]','select').each(function(item)
            {
                var name = item.name;
                var value = item.getValue();
                var isParameter = item.hasClassName('parameter');
                var isPreference = item.hasClassName('preference');
                var isOther = item.hasClassName('other');
                
                if(isParameter)
                {
                    parameters.set(name, value);
                }
                
                if(isPreference)
                {
                    preferences.set(name, value);
                }
                
                if(isOther)
                {
                    others.set(name, value);
                }
                
            });
        
        propdiv.select('textarea').each(function(item)
            {
                var name = item.name;
                var value = getWysiwygContent(item.identify());;
                var isParameter = item.hasClassName('parameter');
                var isPreference = item.hasClassName('preference');
                var isOther = item.hasClassName('other');
                
                
                if(isParameter)
                {
                    parameters.set(name, value);
                }
                
                if(isPreference)
                {
                    preferences.set(name, value);
                }
                
                if(!isOther)
                {
                    others.set(name, value);
                }
                
                if(!isParameter && !isPreference && !isOther) //wysiwyg clears out these classnames, we assume its parameter at this point
                {
                    parameters.set(name, value);    
                }
            });
        
        propdiv.select('input[type="checkbox"]', 'input[type="radio"]').each(function(item)
            {
                if(!item.checked) { return; }
                var name = item.name;
                var value = item.getValue();
                var isParameter = item.hasClassName('parameter');
                var isPreference = item.hasClassName('preference');
                var isOther = item.hasClassName('other');
                
                if(isParameter)
                {
                    var array = parameters.get(name);
                    array = (array != null && array.constructor == Array) ? array : []; 
                    array.push(value);
                    parameters.set(name, array);
                }
                
                if(isPreference)
                {
                    var array = preferences.get(name);
                    array = (array != null && array.constructor == Array) ? array : []; 
                    array.push(value);
                    preferences.set(name, array);
                }
                
                if(isOther)
                {
                    var array = others.get(name);
                    array = (array != null && array.constructor == Array) ? array : []; 
                    array.push(value);
                    others.set(name, array);
                }
                
            });
        
        var paramInput = lb.down('input[name="parameters"]');
        var prefInput = lb.down('input[name="preferences"]');
        lb.down('input[name="modified"]').setValue('1');
        
        paramInput.value = parameters.toQueryString();
        prefInput.value = preferences.toQueryString();
        
        others.each(function(pair)
            {
                var ib = lb.down('input[name="'+pair.key+'"]');
                
                if(ib)
                {
                    ib.setValue(pair.value);    
                }
                
            });
        
        reloadWidget(lb);
        Dashboard.triggerEvent('widget-edited', lb);
    }
    
    Modalbox.hide({afterHide: Prototype.emptyFunction });
}

var setupDragAndDrop = function(form, toolbar, layout)
{
    Dashboard.config.form = $(form);
    Dashboard.config.form.down('input[name="process"]').setValue('savedashboard');
    var lo = $(layout);
    Dashboard.config.layout = lo;
    
    /* var tb = $(toolbar);
    var buttons = tb.select('.button');
    buttons.each(
        function(e)
        {
            new Draggable(e, { revert: true, ghosting: true, scroll: window });
        }); */
    
    var cols = lo.select('.dropzone');
    
    cols.each(function(col)
        {
            col.select('.widget').each(setupEditOnLayoutBox);
        });
    
    buildSortable(lo);
    
    
    /* Event.observe(window, 'load', function()
        {
            tb.originalTop = tb.cumulativeOffset()[1];
            tb.originalWidth = tb.getWidth();
            tb.currentlyStatic = true;
            
            tb.up('.holder').setStyle({height: tb.getHeight()+'px'});
            
            tb.setStyle({top: '5px'});
            
            scrollFunc = function()
                {
                    var top = document.viewport.getScrollOffsets()[1];
                    
                    if(top < tb.originalTop && !tb.currentlyStatic)
                    {
                        tb.setStyle({position: 'static'});
                        tb.currentlyStatic = true;
                    }
                    else if(top > tb.originalTop && tb.currentlyStatic)
                    {
                        tb.setStyle({
                            position: 'fixed',                              
                            zIndex: '5',
                            width: tb.getWidth()+'px'});
                        tb.currentlyStatic = false;
                    }
                }
            
                document.observe('scroll', scrollFunc);
                scrollFunc();
        });  */
}

var setupEditOnLayoutBox = function(lb)
{
    var edit = new Element('span', { 'class': 'edit'});
    var reloadlink = new Element('a').update('Refresh');
    var editlink = new Element('a').update('Edit');
    var dellink = new Element('a').update('X');
    
    edit.insert({bottom: reloadlink});
    edit.insert({bottom: editlink});
    edit.insert({bottom: dellink});
    
    var blockdrag = lb.down('.blockdrag');
    blockdrag.insert({top: edit});
    blockdrag.setAttribute('title', "Click to drag");
    
    lb.observe('mouseover', function() { blockdrag.show(); });
    lb.observe('mouseout', function() { blockdrag.hide(); });
    
    reloadlink.observe('click', function() { reloadWidget(lb); });
    editlink.observe('click', function(e) { doEdit(lb, false); Event.stop(e); return false; });
    dellink.observe('click', function(e) { 
        /* if(confirm('Are you sure you would like to remove this block?')) 
        {
            lb.remove(); 
        } */
        
        Cognoti.confirmBubble(dellink, new Element('div').update('Are you sure you would like to remove this widget?'), false,
            ['Yes', 'No'], 
            function(result)
            {
               if(result == 'Yes')
               {
                   new Effect.Puff(lb, {afterFinish: function() { lb.remove(); 
                       Dashboard.triggerEvent('layout-updated', null);
                       monitoredFormChanged(Dashboard.config.form);
                   }});
               }
            },
            {
                relativePlacement: false,
                /* relativePlacementElem: lb, */ 
                right: true
            });
        
        Event.stop(e); 
        return false; 
    });
}

var buildSortable = function(layout)
{
    var list = layout.select('.dropzone');
    
    list.each(function(e)
    {
        Sortable.create(e.identify(), {
            dropOnEmpty: true,
            containment: list,
            constraint: false,
            only: ['button', 'widget'],
            hoverclass: 'hover',
            handle: 'blockdrag',
            scroll: window,
            onUpdate: function(a)
            {
                a.highlight();
                
                var colId = a.next('input[name="col_id"]').getValue();
                
                
                a.select('input[name="region"]').each(function(input)
                {
                    input.value = colId;                        
                });
                
                monitoredFormChanged(Dashboard.config.form);
                
                Dashboard.triggerEvent('layout-updated', null);
            }
        });
        
        Droppables.add(e, {
            accept: 'button',
            hoverclass: 'hover',
            onDrop: function(item) {
                
                var info = item.info;
                
                var title = new Element('div').addClassName('blockdrag').update(info.name).hide();
                var content = new Element('div').addClassName('widget_content');
                var newitem = new Element('li').addClassName('widget');
                
                var regioninput = new Element('input', { type: 'hidden', name: 'region', value: e.id });
                var paraminput = new Element('input', { type: 'hidden', name: 'parameters', value: info.parameters });
                var prefinput = new Element('input', { type: 'hidden', name: 'preferences', value: info.preferences });
                var widgetidinput = new Element('input', { type: 'hidden', name: 'widgetid', value: info.id });
                var udwidinput = new Element('input', { type: 'hidden', name: 'dwiid', value: '0' });
                var modifiedinput = new Element('input', { type: 'hidden', name: 'modified', value: '1' });

                var clear = new Element('div', { style: 'clear: both' });
                title.insert({bottom: clear});
                
                newitem.insert({bottom: title})
                       .insert({bottom: content}) 
                       .insert({bottom: clear})
                       .insert({bottom: regioninput})
                       .insert({bottom: paraminput})
                       .insert({bottom: prefinput})
                       .insert({bottom: widgetidinput})
                       .insert({bottom: udwidinput})
                       .insert({bottom: modifiedinput});
                       
                if(Dashboard.otherProperties)
                {
                    for(var i in Dashboard.otherProperties)
                    {
                        otherInput = new Element('input', { type: 'hidden', name: i, value: '' });
                        newitem.insert({bottom: otherInput});
                    }
                }
                
                content.wrap('div', { 'class': 'content' });
                   
                e.insert({bottom: newitem});
                
                setupEditOnLayoutBox(newitem);
                
                buildSortable(layout);
                
                doEdit(newitem, true);
            }
        });
    });
}

var LayoutManager = {
    _newColumnCount: 1,
    _newRowCount: 1,
    minColumnWidth: 40,
    browserHackOffset: Prototype.Browser.WebKit ? -1 : 0,
    addRow: function()
    {
        this._addRow(this.rowList);
    },
    setupLayoutRows: function(id)
    {
        var thisObj = this;
        id = $(id);
        
        thisObj.rowList = id.down('.layoutbase');
        thisObj.layoutrows = id.select('.layoutrow'); 
        thisObj.layoutrows.each(function(layoutrow)
            {
                thisObj._configureRow(layoutrow);
            });
        
        thisObj._resetRowSorting();
        thisObj.layoutChanged();
        
        var monitorUpdated = function()
        {
            monitoredFormChanged(Dashboard.config.form);
        }
        
        Dashboard.observer('layout-updated', monitorUpdated);
        Dashboard.observer('widget-edited', monitorUpdated);
        window.setInterval(thisObj.layoutChanged.bind(this), 800);
    },
    layoutChanged: function()
    {
        var thisObj = LayoutManager;
        thisObj.layoutrows.each(function(layoutrow)
        {
            var maxHeight = 0;
            
            layoutrow.columns.each(function(c)
                {
                    var h = c.down('ul.dropzone').setStyle({'height': 'auto'}).getHeight();
                    maxHeight = maxHeight < h ? h : maxHeight;
                });
            
            layoutrow.columns.each(function(c)
                {
                    c.down('ul.dropzone').setStyle({'height': maxHeight+'px'});  //set minheight on all columns to match the other columns    
                });
            
            layoutrow.resizers.each(function(r)
                {
                    r.setStyle({'height': (maxHeight)+'px'});  //set minheight on all resizers to match the other columns    
                });
        });
    },
    
    _resetRowSorting: function()
    {
        var thisObj = this;
        var s = Sortable.create(thisObj.rowList.identify(), {
            tag: 'div',
            handle: 'rowcontrols',
            scroll: window
        });
    },
    
    _addRow: function(rowparent) 
    {
        var thisObj = this;
        var newRow = new Element('div', { 'class': 'layoutrow' });
        
        var controls = new Element('div', { 'class': 'rowcontrols' })
        controls.insert(new Element('a', { 'class': 'addcolumn', 'href': '#', 'title': 'Add Column' }).update('+'))
                .insert(new Element('a', { 'class': 'removerow', 'href': '#', 'title': 'Remove Row' }).update('&times;'))
                .insert(new Element('span').update('Click + Drag = Reorder Row'));
        
        
        var rowId = thisObj._newRowCount++;
        
        newRow.insert(controls)
            .insert(new Element('div', { 'class': 'columns' }))
            .insert(new Element('input', { 'type': 'hidden', 'name': 'row_id', 'value': 'newrow'+rowId }))
            .insert(new Element('div', { 'class': 'clear' }));
        
            
        rowparent.insert(newRow);
        
        thisObj._configureRow(newRow);
        thisObj._addColumn(newRow, true);
        
        thisObj._resetRowSorting();     
        
        thisObj.layoutrows = thisObj.rowList.select('.layoutrow'); 
        
        newRow.scrollTo();
        
    },
    
    _configureRow: function(layoutrow)
    {   
        var thisObj = this;
        var cols = layoutrow.select('.rowcolumn');
        var resizers = layoutrow.select('.rowcolumnsep');
        
        layoutrow.columns = cols;
        layoutrow.resizers = resizers;
        layoutrow.columnDiv = layoutrow.down('.columns');
        layoutrow.width = layoutrow.columnDiv.getWidth();
        layoutrow.controls = layoutrow.down('.rowcontrols');
        layoutrow.identifier = layoutrow.down('input[name="row_id"]').getValue();
        
        thisObj.setupColumns(layoutrow, layoutrow.columns);
        thisObj.setupResizers(layoutrow, layoutrow.resizers);
        
        layoutrow.controls.down('a.addcolumn').observe('click', function(e) { thisObj._addColumn(layoutrow); Event.stop(e); return false; });
        layoutrow.controls.down('a.removerow').observe('click', function(e) { thisObj._removeRow(layoutrow); Event.stop(e); return false; });

    },
    
    setupColumns: function(layoutrow, columns)
    {
        var thisObj = this;
        columns.each(function(c)
            {
                c.layoutrow = layoutrow;    
                thisObj._addRemoveColumnButton(c);
            });
    },

    resizerFunction: function(draggable)
    {
        var thisObj = this;
        var offset = draggable.currentDelta()[0];
        var resizer = draggable.element;
        
        var prev = resizer.previous('.rowcolumn');
        var next = resizer.next('.rowcolumn');
        var layoutrow = resizer.layoutrow;
        
        //limit offset
        
        var prevWidth = prev.getWidth();
        var nextWidth = next.getWidth();
        
        var mw = thisObj.minColumnWidth;
        
        if(prevWidth - mw + offset < 0)
        {
            offset = -(prevWidth - mw);
        }
        else if(nextWidth - mw < offset)
        {
            offset = nextWidth - mw;
        }
        
        var percentShift = (offset / layoutrow.width) * 100;
        
        if(prevWidth + offset > mw && nextWidth - offset > mw)
        {
            thisObj._setColWidth(prev, prevWidth + offset, true);
            thisObj._setColWidth(next, nextWidth - offset, true);
        }
        
        /* prev.setStyle({ width: ((prevWidth / layoutrow.width) * 100 + percentShift) + '%'});
        next.setStyle({ width: ((nextWidth / layoutrow.width) * 100 - percentShift) + '%'}); */
        
        resizer.setStyle({left: 0 });
        
    },

    setupResizers: function(layoutrow, resizers)
    {
        var thisObj = this;
        var resizerFunction = function(resizer) { thisObj.resizerFunction(resizer) };
        resizers.each(function(r)
            {
                r.layoutrow = layoutrow;
                r.drag = new Draggable(r, { 
                    constraint: 'horizontal',
                change: resizerFunction,
                onEnd: function(d) { resizerFunction(d); Dashboard.triggerEvent('layout-updated', null); } 
                 });
                
            });
    },
    _addRemoveColumnButton: function(column)
    {
        var thisObj = this;
        var button = new Element('a', { 'class': 'removecolumn', 'href': '#', 'title': 'Remove Column' }).insert(new Element('span').update('&times'));
        
        column.insert({top: button});
        
        button.observe('click', function(e) { thisObj._removeColumn(this, column); Event.stop(e); return false;});
        
    },

    _addColumn: function(layoutrow, first)
    {
        var thisObj = this;
        var columnIdentifier = 'newcol'+thisObj._newColumnCount++;
        var newColumn = new Element('div', { 'class': columnIdentifier+' rowcolumn' })
            .insert(new Element('ul', { 'class': 'col main dropzone' }))
            .insert(new Element('input', { 'type': 'hidden', 'name': 'col_id', 'value': columnIdentifier }))
            .insert(new Element('input', { 'type': 'hidden', 'name': 'col_width' }))
            .insert(new Element('input', { 'type': 'hidden', 'name': 'col_row',  'value': layoutrow.identifier}));
        
            
        thisObj.setupColumns(layoutrow, [newColumn]);
            
        if(!first)
        {
            var newResizer = new Element('div', { 'class': 'rowcolumnsep' });
            thisObj.setupResizers(layoutrow, [newResizer]);
        }
        
        var stripValue = first ? 0 : ((thisObj.minColumnWidth * 1.5) * 100 / layoutrow.width) / layoutrow.columns.length;
        
        layoutrow.columns.each(function(col)
            {
                var width = col.getWidth();
                
                thisObj._setColWidth(col, ((width / layoutrow.width) * 100) - stripValue); 
            });
        
        thisObj._setColWidth(newColumn, first ? 99 : ((stripValue * layoutrow.columns.length) - 1));
        
        if(!first)
        {
            layoutrow.columnDiv.insert(newResizer);
            layoutrow.columnDiv.insert(new Element('div', { 'class': 'rowcolumnsep2' }));
        }
        layoutrow.columnDiv.insert(newColumn);
        
        if(!first)
        {
            layoutrow.resizers = layoutrow.select('.rowcolumnsep');
        }
        
        layoutrow.columns = layoutrow.select('.rowcolumn');
        
        thisObj.layoutChanged();
        
        buildSortable(Dashboard.config.layout);
        
    },
    _setColWidth: function(column, width, asPx)
    {
        if(asPx)
        {
            width = width / (column.layoutrow.width + this.browserHackOffset) * 100.0;
        }
        column.setStyle({ 'width': width+'%' });
        column.down('input[name="col_width"]').setValue(width);
        
    },
    _removeColumn: function(button, column)
    {
        var thisObj = this;
        
        var layoutrow = column.layoutrow;
        
        if(layoutrow.columns.length == 1)
        {
            thisObj._removeRow(layoutrow, 'Removing last column will remove the entire row.  Would you like to remove this row?', button);        
        }
        else if(!button.bubble || !button.bubble.visible())
        {
            button.bubble = confirmBubble(button, 'Are you sure you would like to remove this column?', ['Yes', 'No'],
                function(result)
                {
                    if(result == 'Yes')
                    {
                        var width = (column.getWidth() / layoutrow.width) * 100 + 1;
                        
                        var changePct = width / (layoutrow.columns.length - 1);
                        
                        //move items from columns into 'lost bin'
                        
                        
                        var targetResizer = column.next('.rowcolumnsep') || column.previous('.rowcolumnsep');
                        targetResizer.drag.destroy();
                        targetResizer.remove();
                        
                        var rowSep2 = column.next('.rowcolumnsep2') || column.previous('.rowcolumnsep2');
                        if(rowSep2)
                        {
                            rowSep2.remove();
                        }
                        
                        
                        column.remove();
                        
                        layoutrow.resizers = layoutrow.select('.rowcolumnsep');
                        layoutrow.columns = layoutrow.select('.rowcolumn');
                        
                        layoutrow.columns.each(function(col)
                            {
                                thisObj._setColWidth(col, ((col.getWidth() / layoutrow.width) * 100) + changePct);                                                                    
                            });
                    }
                }
                );
        }
        
        thisObj.layoutChanged();
    },
    
    _removeRow: function(layoutrow, text, target)
    {
        var thisObj = this;
        target = target || layoutrow;
        
        if(!target.bubble || !target.bubble.visible())
        {
            target.bubble = confirmBubble(target, text || 'Are you sure you would like to remove this row?', ['Yes', 'No'],
                function(result)
                {
                    
                    if(result == 'Yes')
                    {
                        layoutrow.resizers.each(function(r)
                            {
                                //unset draggables
                                r.drag.destroy();    
                            });
                        
                        //move items from columns into 'lost bin'
                        
                        layoutrow.remove();
                        
                        thisObj.layoutrows = thisObj.rowList.select('.layoutrow'); 
                        
                    }
                });
        }
    }
    
}
