more user param and widget work
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 29 Sep 2006 23:02:40 +0000 (23:02 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 29 Sep 2006 23:02:40 +0000 (23:02 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@6270 dcc99617-32d9-48b4-a31d-7c20da2025e4

13 files changed:
Open-ILS/web/reports/oils_rpt.css
Open-ILS/web/reports/oils_rpt.js
Open-ILS/web/reports/oils_rpt.xhtml
Open-ILS/web/reports/oils_rpt_editor.xhtml
Open-ILS/web/reports/oils_rpt_folder_manager.xhtml
Open-ILS/web/reports/oils_rpt_folder_window.js
Open-ILS/web/reports/oils_rpt_folders.js
Open-ILS/web/reports/oils_rpt_param_editor.js
Open-ILS/web/reports/oils_rpt_param_editor.xhtml
Open-ILS/web/reports/oils_rpt_report_editor.js
Open-ILS/web/reports/oils_rpt_utils.js
Open-ILS/web/reports/oils_rpt_vars.js
Open-ILS/web/reports/oils_rpt_widget.js

index c435d9f..0f0ed62 100644 (file)
@@ -68,6 +68,16 @@ table { border-collapse: collapse; }
        font-size: 8pt;
 }
 
+.oils_rpt_small_info_selector {
+       border: 1px solid blue; 
+       background: #E0F0F0; 
+       height: 80px;
+       overflow: scroll;
+       font-size: 8pt;
+       width: 12em;
+}
+
+
 .oils_rpt_info_div { 
        text-align: center; 
        width: 300px; 
index de9d902..7751fdc 100644 (file)
@@ -5,21 +5,24 @@ function oilsInitReports() {
        document.captureEvents(Event.MOUSEMOVE);
        document.onmousemove = setMousePos;
 
-
        var cgi = new CGI();
        fetchUser(cgi.param('ses'));
        DOM.oils_rpt_user.appendChild(text(USER.usrname()));
        oilsRptDebugEnabled = cgi.param('dbg');
        if(oilsRptDebugEnabled) DEBUG = 1;
 
-       DEBUG = 1;
+       oilsRptCurrentOrg = USER.ws_ou();
 
-       oilsLoadRptTree(
+       oilsRptFetchOrgTree(
                function() {
-                       hideMe(DOM.oils_rpt_tree_loading); 
-                       unHideMe(DOM.oils_rpt_folder_table);
+                       oilsLoadRptTree(
+                               function() {
+                                       hideMe(DOM.oils_rpt_tree_loading); 
+                                       unHideMe(DOM.oils_rpt_folder_table);
+                               }
+                       )
                }
-       )
+       );
 }
 
 function oilsRtpInitFolders() {
index 9db1786..2c87fee 100644 (file)
@@ -19,7 +19,7 @@
                </div>
 
                <div>
-                       <a class='oils_rpt_main_link' href='javascript:_l("oils_rpt_builder.xhtml");'>Build a New Report</a>
+                       <a class='oils_rpt_main_link' href='javascript:_l("oils_rpt_builder.xhtml");'>Build a New Report Template</a>
                </div>
 
                <div id='oils_rpt_tree_loading'>
index 9d21506..2b8e330 100644 (file)
                        </tr>
                        <tr>
                                <td>Report Description:</td>
-                               <td><input type='text' id='oils_rpt_report_editor_name'/></td>
+                               <td><textarea cols='45' rows='2' id='oils_rpt_report_editor_name'/></td>
                        </tr>
                        <tr><td colspan='2'><hr/></td></tr>
                        <tr>
                                <td>Choose a report folder as the destination: </td>
-                               <td id='oils_rpt_report_editor_dest_folder'/>
+                               <td>
+                                       <div style='margin-bottom: 7px;'>
+                                               <span>Selected Folder: </span>
+                                               <b id='oils_rpt_report_editor_selected_folder'/>
+                                       </div>
+                                       <span id='oils_rpt_report_editor_dest_folder'/>
+                               </td>
                        </tr>
                        <tr><td colspan='2'><hr/></td></tr>
                        <tr>
index d608c7a..e895b1b 100644 (file)
@@ -1,6 +1,7 @@
 <div id='oils_rpt_folder_manager_div' class='hide_me' style='margin-top: 10px; text-align: center;'>
        <select id='oils_rpt_folder_manager_actions'>
                <option value='change_name'>Change folder name</option>
+               <option value='delete' id='oils_rpt_folder_manager_delete_opt'>Delete this folder</option>
                <option value='create_sub_folder'>Create a new sub-folder</option>
                <option id='oils_rpt_folder_manager_share_opt' value='share'>Share this folder</option>
                <option id='oils_rpt_folder_manager_unshare_opt' value='unshare'>Hide (un-share) this folder</option>
                Are you sure you wish to create new subfolder
        </span>
 
+       <span class='hide_me' id='oils_rpt_folder_manager_delete_confirm'>
+               Are you sure you wish to delete this folder?
+       </span>
+               
+       <span class='hide_me' id='oils_rpt_folder_cannot_delete'>
+               This folder may not be deleted because it is not empty.
+       </span>
+
 </div>
+
index fb50590..2f1d39b 100644 (file)
@@ -14,16 +14,12 @@ function oilsRptFetchTemplate(id) {
 /* generic folder window class */
 oilsRptSetSubClass('oilsRptFolderWindow', 'oilsRptObject');
 function oilsRptFolderWindow(type, folderId) { 
+       this.init();
+       _debug("initted folderwindow with id "+this.id);
        var node = oilsRptCurrentFolderManager.findNode(type, folderId);
-       this.init2(node, type);
        this.selector = DOM.oils_rpt_folder_contents_selector;
-}
-
-
-oilsRptFolderWindow.prototype.init2 = function(node, type) {
        this.folderNode = node;
        this.type = type;
-       this.init();
 }
 
 
@@ -96,6 +92,8 @@ oilsRptFolderWindow.prototype.drawEditActions = function() {
                                        DOM.oils_rpt_folder_manager_sub_lib_picker, USER.ws_ou());
                                obj.myOrgSelector.draw();
                                break;
+                       case 'delete':
+                               obj.doFolderDelete();
                }
        }
 
@@ -137,6 +135,7 @@ oilsRptFolderWindow.prototype.fetchFolderData = function(callback) {
        var req = new Request(OILS_RPT_FETCH_FOLDER_DATA, 
                SESSION, this.type, this.folderNode.folder.id());
        var obj = this;
+       removeChildren(obj.selector);
        req.callback(
                function(r) {
                        obj.fmTable = drawFMObjectTable( 
@@ -171,7 +170,10 @@ oilsRptFolderWindow.prototype.setFolderEditActions = function() {
                        if(confirmId('oils_rpt_folder_manager_change_name_confirm')) {
                                oilsRptUpdateFolder(folder, obj.type,
                                        function(success) {
-                                               if(success) oilsRptAlertSuccess();
+                                               if(success) {
+                                                       oilsRptAlertSuccess();
+                                                       oilsRptCurrentFolderManager.draw();
+                                               }
                                        }
                                );
                        }
@@ -198,14 +200,57 @@ oilsRptFolderWindow.prototype.setFolderEditActions = function() {
                if(confirm(DOM.oils_rpt_folder_manager_new_confirm.innerHTML + ' "'+folder.name()+'"')) {
                        oilsRptCreateFolder(folder, obj.type,
                                function(success) {
-                                       if(success) oilsRptAlertSuccess();
+                                       if(success) {
+                                               oilsRptAlertSuccess();
+                                               oilsRptCurrentFolderManager.draw();
+                                       }
                                }
                        );
                }
        }
-
 }
 
 
+oilsRptFolderWindow.prototype.doFolderDelete = function() {
+       
+       var cache = oilsRptFolderNodeCache[this.type];
+       /* let's see if this folder has any children */
+       for( var c in cache ) 
+               if( cache[c].folder.parent() == this.folderNode.folder.id() )
+                       return alertId('oils_rpt_folder_cannot_delete');
+
+       /* lets see if the folder has contents */
+       var req = new Request(OILS_RPT_FETCH_FOLDER_DATA, 
+               SESSION, this.type, this.folderNode.folder.id());
+       var obj = this;
+       req.send();
+
+       req.callback( 
+               function(r) {
+
+                       var contents = r.getResultObject();
+                       if( contents.length > 0 ) 
+                               return alertId('oils_rpt_folder_cannot_delete');
+
+                       if( confirmId('oils_rpt_folder_manager_delete_confirm') ) {
+                               var req2 = new Request(OILS_RPT_DELETE_FOLDER, 
+                                       SESSION, obj.type, obj.folderNode.folder.id());
+       
+                               req2.callback( 
+                                       function(r2) {
+                                               var res = r2.getResultObject();
+                                               if( res == 1 ) {
+                                                       oilsRptAlertSuccess();
+                                                       oilsRptCurrentFolderManager.draw();
+                                               }
+                                               else alert('error: '+js2JSON(res));
+                                       }
+                               );
+
+                               req2.send();
+                       }
+               }
+       );
+}
 
 
index 6366f20..9817811 100644 (file)
@@ -5,9 +5,13 @@ oilsRptFolderNodeCache.output  = {};
 
 oilsRptSetSubClass('oilsRptFolderManager','oilsRptObject');
 
-function oilsRptFolderManager() {
+function oilsRptFolderManager() { this.init(); }
+
+oilsRptFolderManager.prototype.draw = function(auth) {
+
+       if(!auth) auth = SESSION;
+
        this.folderTree = {};
-       this.super.init();
        this.tId = oilsNextId();
        this.rId = oilsNextId();
        this.oId = oilsNextId();
@@ -19,9 +23,13 @@ function oilsRptFolderManager() {
        this.ownerFolders.template = {};
        this.ownerFolders.report = {};
        this.ownerFolders.output = {};
-}
 
-oilsRptFolderManager.prototype.draw = function(auth) {
+       removeChildren(DOM.oils_rpt_template_folder_tree); 
+       removeChildren(DOM.oils_rpt_report_folder_tree); 
+       removeChildren(DOM.oils_rpt_output_folder_tree); 
+       removeChildren(DOM.oils_rpt_template_shared_folder_tree); 
+       removeChildren(DOM.oils_rpt_report_shared_folder_tree); 
+       removeChildren(DOM.oils_rpt_output_shared_folder_tree); 
 
        oilsRptTemplateFolderTree = 
                new SlimTree(
@@ -115,7 +123,8 @@ oilsRptFolderManager.prototype.drawFolders = function(type, folders) {
                var node = { folder : folder, treeId : id };
                oilsRptFolderNodeCache[type][folder.id()] = node;
                node.folderWindow = new oilsRptFolderWindow(type, folder.id())
-               _debug("creating folder node for "+folder.name()+" : id = "+folder.id()+' treeId = '+id);
+               _debug("creating folder node for "+folder.name()+" : id = "+
+                       folder.id()+' treeId = '+id + ' window id = ' + node.folderWindow.id);
        }
 
 
@@ -161,11 +170,11 @@ oilsRptFolderManager.prototype.drawFolders = function(type, folders) {
                                }
                }
 
-               id = this.findNode(type, folder.id()).treeId;
+               node = this.findNode(type, folder.id());
+               id = node.treeId;
                if( folder.parent() ) 
                        pid = this.findNode(type, folder.parent()).treeId;
 
-
                /*
                if(!mine) {
                        if(!this.orgTrail[type][folder.share_with().id()]) {
@@ -200,10 +209,9 @@ oilsRptFolderManager.prototype.drawFolders = function(type, folders) {
                                fname = folder.name() + ' ('+folder.share_with().shortname()+')';
                }
 
-               var action = 'javascript:oilsRptObject.find('+
-                       node.folderWindow.id+').draw();'+treename+'.toggle("'+id+'");';
-
-               _debug('adding node '+fname+' id = ' + id + ' pid = '+pid + ' parent = ' + folder.parent() );
+               var action = 'javascript:oilsRptObject.find('+node.folderWindow.id+').draw();';
+               _debug('adding node '+fname+' id = ' + id + ' pid = '
+                       +pid + ' parent = ' + folder.parent() + ' folder-window = ' + node.folderWindow.id );
 
                tree.addNode(id, pid, fname, action);
                tree.close(pid);
@@ -253,7 +261,7 @@ function oilsRptBuildFolder(type, node, treeVar, rootName, action) {
 function __setFolderCB(tree, id, action, node) {
        var act;
        if( action ) 
-               act = function() { tree.toggle(id);     action( node ); };
+               act = function() { action( node ); };
        return act;
 }
 
index 5bdc4f0..af6ed06 100644 (file)
@@ -7,33 +7,52 @@ function oilsRptParamEditor(report, tbody) {
 
 oilsRptParamEditor.prototype.draw = function() {
        var params = this.report.gatherParams();
+       this.params = params;
 
        if(!oilsRptParamEditor.row)
                oilsRptParamEditor.row = 
                        DOM.oils_rpt_param_editor_tbody.removeChild(
                        $n(DOM.oils_rpt_param_editor_tbody, 'tr'));
 
+       removeChildren(this.tbody);
        _debug(formatJSON(js2JSON(params)));
                        
        for( var p = 0; p < params.length; p++ ) {
                var par = params[p];
                var row = oilsRptParamEditor.row.cloneNode(true);
                $n(row, 'object').appendChild(text(oilsRptMakeLabel(par.relation)));
-               $n(row, 'column').appendChild(text(par.column.colname));
+               $n(row, 'column').appendChild(par.column.colname);
+               $n(row, 'transform').appendChild(text(par.column.transform));
                $n(row, 'action').appendChild(text(par.op));
-               this.buildWidget(par, $n(row, 'widget')).draw();
+               par.widget = this.buildWidget(par, $n(row, 'widget'));
+               par.widget.draw();
                this.tbody.appendChild(row);
        }
 }
 
 
 oilsRptParamEditor.prototype.buildWidget = function(param, node) {
-       _debug("building widget with param op "+ param.op);
+       var cls = param.relation.split(/-/).pop();
+       _debug("building widget with param class:" + cls + ' col: '+param.column.colname + ' op: '+ param.op);
        switch(param.op) {
+               case 'in':
+               case 'not in':
+
+                       /* we have to special case org selection for now, 
+                               until we have generic object fetch support */
+                       if( cls == 'aou' ) {
+                               return new oilsRptOrgMultiSelect({node:node});
+                       } else {
+                               return new oilsRptOrgMultiSelect({node:node});
+                       }
+
                default:
                        return new oilsRptWidget({node:node});
        }
 }
 
+//oilsRptParamEditor.prototype.get = function(param, node) {
+
+
 
 
index 9012279..53a9b25 100644 (file)
@@ -5,12 +5,19 @@
 
        <table id='oils_rpt_param_editor_table'>
                <thead>
-                       <tr><td>Object</td><td>Column</td><td>Action</td><td>User Params</td></tr>
+                       <tr>
+                               <td>Object</td>
+                               <td>Column</td>
+                               <td>Transform</td>
+                               <td>Action</td>
+                               <td>User Params</td>
+                       </tr>
                </thead>
                <tbody id='oils_rpt_param_editor_tbody'>
                        <tr name='tr'>
                                <td name='object'/>
                                <td name='column'/>
+                               <td name='transform'/>
                                <td name='action'/>
                                <td name='widget'/>
                        </tr>
index 59615a5..96f7e87 100644 (file)
@@ -1,6 +1,6 @@
 oilsRptSetSubClass('oilsRptReportEditor', 'oilsRptObject');
 var oilsRptReportEditorFolderTree;
-function oilsRptReportEditor(rptObject) {
+function oilsRptReportEditor(rptObject, folderWindow) {
        var tmpl = rptObject.templateObject;
        var rpt = rptObject.reportObject;
        this.folderWindow = folderWindow;
@@ -23,7 +23,9 @@ function oilsRptReportEditor(rptObject) {
                DOM.oils_rpt_report_editor_dest_folder,
                'oilsRptReportEditorFolderTree',
                'Report Folders',
-               function(node) { obj.selectedFolder = node; });
+               function(node) { 
+                       appendClear(DOM.oils_rpt_report_editor_selected_folder, node.folder.name());
+                       obj.selectedFolder = node; });
 }
 
 
index d3c8013..8809743 100644 (file)
@@ -13,6 +13,17 @@ function oilsRptNextParam() {
        return '::PARAM'+ (oilsRptID2++);
 }
 
+function oilsRptFetchOrgTree(callback) {
+       var req = new Request(OILS_RPT_FETCH_ORG_TREE);
+       req.callback(
+               function(r) {
+                       globalOrgTree = r.getResultObject();
+                       if( callback ) callback();
+               }
+       );
+       req.send();
+}
+
 
 /*
 function oilsRptCacheObject(obj) {
@@ -41,8 +52,9 @@ function oilsRptGetCache(type, id) {
 
 /* -------------------------------------------- */
 function oilsRptObject() {}
-oilsRptObject.prototype.init = function() {
-       oilsRptObject.cache(this);
+oilsRptObject.prototype.init = function(obj) {
+       if(!obj) obj = this;
+       oilsRptObject.cache(obj);
 }
 oilsRptObject.objectCache = {};
 oilsRptObject.find = function(id) {
index 5abc46f..81f0083 100644 (file)
@@ -10,6 +10,8 @@ var oilsRpt;
 /* UI tree  */
 var oilsRptTree;
 
+var oilsRptCurrentOrg;
+
 var oilsRptTemplateFolderTree;
 var oilsRptReportFolderTree;
 var oilsRptOutputFolderTree;
@@ -54,8 +56,10 @@ var OILS_RPT_FETCH_FOLDERS = 'open-ils.reporter:open-ils.reporter.folder.visible
 var OILS_RPT_FETCH_FOLDER_DATA = 'open-ils.reporter:open-ils.reporter.folder_data.retrieve';
 var OILS_RPT_FETCH_TEMPLATE = 'open-ils.reporter:open-ils.reporter.template.retrieve';
 var OILS_RPT_UPDATE_FOLDER = 'open-ils.reporter:open-ils.reporter.folder.update';
+var OILS_RPT_DELETE_FOLDER = 'open-ils.reporter:open-ils.reporter.folder.delete';
 var OILS_RPT_CREATE_FOLDER = 'open-ils.reporter:open-ils.reporter.folder.create';
 var OILS_RPT_FETCH_ORG_FULL_PATH = 'open-ils.reporter:open-ils.reporter.org_unit.full_path';
+var OILS_RPT_FETCH_ORG_TREE = 'open-ils.actor:open-ils.actor.org_tree.retrieve';
 
 var oilsRptCurrentFolderManager;
 
index 0e910cd..d86f8ae 100644 (file)
@@ -3,13 +3,13 @@ oilsRptWidget.OILS_RPT_TRANSFORM_WIDGET = 0;
 oilsRptWidget.OILS_RPT_OPERATION_WIDGET = 1;
 
 function oilsRptWidget(args) {
-       this.init(args);
+       this.initWidget(args);
        this.dest = elem('input',{type:'text'});
 }
 
-oilsRptWidget.prototype.init = function(args) {
+oilsRptWidget.prototype.initWidget = function(args) {
        if(!args) return;
-       this.super.init();
+       this.init();
        this.node       = args.node;
        this.type       = args.type;
        this.action = args.action;
@@ -28,12 +28,12 @@ oilsRptWidget.prototype.draw = function() {
 
 oilsRptSetSubClass('oilsRptMultiInputWidget', 'oilsRptWidget');
 function oilsRptMultiInputWidget(args) {
-       this.init(args);
+       this.initInputWidget(args);
 }
 
-oilsRptMultiInputWidget.prototype.init = function(args) {
+oilsRptMultiInputWidget.prototype.initInputWidget = function(args) {
        if(!args) return;
-       this.super.init(args);
+       this.initWidget(args);
        this.count = (args.count) ? args.count : 2;
        this.dest = [];
        for( var i = 0; i < this.count; i++ )
@@ -66,16 +66,21 @@ oilsRptMultiInputWidget.prototype.setLabels = function(labels) {
 
 oilsRptSetSubClass('oilsRptMultiWidget', 'oilsRptWidget');
 function oilsRptMultiWidget(args) {
-       this.init(args);
+       this.initMultiWidget(args);
 }
 
-oilsRptMultiWidget.prototype.init = function(args) {
+oilsRptMultiWidget.prototype.initMultiWidget = function(args) {
        if(!args) return;
-       this.super.init(args);
+       this.initWidget(args);
        this.dest = elem('select',
-               {multiple:'multiple','class':'oils_rpt_info_selector'});
-       this.addButton = elem('button',null, 'Add');
-       this.addButton = this.getSourceCollector();
+               {multiple:'multiple','class':'oils_rpt_small_info_selector'});
+
+       var obj = this;
+
+       this.addButton = elem('input',{type:'submit',value:"Add"})
+       this.addButton.onclick = this.getSourceCollector();
+       this.delButton = elem('input',{type:'submit',value:"Del"})
+       this.delButton.onclick = function(){obj.removeSelected()};
 }
 
 oilsRptMultiWidget.prototype.getValue = function() {
@@ -86,13 +91,15 @@ oilsRptMultiWidget.prototype.getValue = function() {
 }
 
 oilsRptMultiWidget.prototype.removeSelected = function() {
-       oilsDeleteSelectedItems(this.dest);
+       oilsDelSelectedItems(this.dest);
 }
 
 oilsRptMultiWidget.prototype.addItem = function(name, val) {
-       for( var i = 0; i < this.dest.options.length; i++ )
+       for( var i = 0; i < this.dest.options.length; i++ ) {
                if( this.dest.options[i].value == val ) 
                        return;
+       }
+
        insertSelectorVal(this.dest, -1, name, val);
 }
 
@@ -100,9 +107,13 @@ oilsRptMultiWidget.prototype.setSource = function(src) {
        this.source = src;
 }
 
-oilsRptMultiWidget.prototype.draw = function() {
+oilsRptMultiWidget.prototype.drawMultiWidget = function() {
        appendClear(this.node, this.source);
-       appendClear(this.node, this.dest);
+       this.node.appendChild(elem('br'))
+       this.node.appendChild(this.addButton);
+       this.node.appendChild(this.delButton);
+       this.node.appendChild(elem('br'))
+       this.node.appendChild(this.dest);
 }
 
 
@@ -110,19 +121,21 @@ oilsRptMultiWidget.prototype.draw = function() {
 
 oilsRptSetSubClass('oilsRptInputMultiWidget', 'oilsRptMultiWidget');
 function oilsRptInputMultiWidget(args) {
-       this.init(args);
+       this.initInputMultiWidget(args);
 }
-oilsRptInputMultiWidget.prototype.init = function(args) {
+oilsRptInputMultiWidget.prototype.initInputMultiWidget = function(args) {
        if(!args) return;
-       this.super.init(args);
+       this.initMultiWidget(args);
        this.setSource(elem('input',{type:'text'}));
 }
 
+/*
 oilsRptInputMultiWidget.prototype.addItem = function(name, val) {
-       this.super.addItem(name, val);
+       //this.addItem(name, val);
        this.source.value = "";
        this.source.focus();
 }
+*/
 
 oilsRptInputMultiWidget.prototype.getSourceCollector = function() {
        var obj = this;
@@ -135,20 +148,23 @@ oilsRptInputMultiWidget.prototype.getSourceCollector = function() {
 
 oilsRptSetSubClass('oilsRptSelectorMultiWidget', 'oilsRptMultiWidget');
 function oilsRptSelectorMultiWidget(args) {
-       this.init(args);
+       this.initSelectorMultiWidget(args);
 }
-oilsRptSelectorMultiWidget.prototype.init = function(args) {
+oilsRptSelectorMultiWidget.prototype.initSelectorMultiWidget = function(args) {
        if(!args) return;
-       this.super.init(args);
+       this.initMultiWidget(args);
        this.setSource(
-               elem('select',{multiple:multiple, 'class':'oils_rpt_info_selector'}));
+               elem('select',{multiple:'multiple', 'class':'oils_rpt_small_info_selector'}));
 }
 
 oilsRptSelectorMultiWidget.prototype.getSourceCollector = function() {
        var obj = this;
        return function() {
-               for( var i = 0; i < obj.source.options.length; i++ )
-                       obj.addItem(obj.source.options.name, obj.source.options.value);
+               for( var i = 0; i < obj.source.options.length; i++ ) {
+                       if( obj.source.options[i].selected )
+                               obj.addItem(obj.source.options[i].innerHTML, 
+                                       obj.source.options[i].value);
+               }
        }
 }
 
@@ -156,17 +172,17 @@ oilsRptSelectorMultiWidget.prototype.getSourceCollector = function() {
 
 oilsRptSetSubClass('oilsRptRemoteWidget', 'oilsRptSelectorMultiWidget');
 function oilsRptRemoteWidget(args) {
-       this.init(args);
+       this.initRemoteWidget(args);
 }
-oilsRptRemoteWidget.prototype.init = function(args) {
+oilsRptRemoteWidget.prototype.initRemoteWidget = function(args) {
        if(!args) return;
-       this.super.init(args);
+       this.initSelectorMultiWidget(args);
        this.selector = args.selector;
 }
 
 oilsRptRemoteWidget.prototype.draw = function() {
        this.fetch();
-       this.super.draw();
+       //this.draw();
 }
 
 oilsRptRemoteWidget.prototype.setFetch = function(func) {
@@ -193,10 +209,8 @@ oilsRptMyOrgsWidget.prototype.draw = function() {
 
 oilsRptMyOrgsWidget.prototype.drawWidget = function(orglist) {
        var sel = this.node;
-       _debug('here');
        for( var i = 0; i < orglist.length; i++ ) {
                var org = orglist[i];
-               _debug('here + ' + org.shortname());
                var opt = insertSelectorVal( this.node, -1, 
                        org.name(), org.id(), null, findOrgDepth(org) );
                if( org.id() == this.orgid )
@@ -208,6 +222,41 @@ oilsRptMyOrgsWidget.prototype.getValue = function() {
        return getSelectorVal(this.node);
 }
 
+/* --------------------------------------------------------------------- */
+
+oilsRptSetSubClass('oilsRptOrgMultiSelect','oilsRptSelectorMultiWidget');
+function oilsRptOrgMultiSelect(args) {
+       this.initSelectorMultiWidget(args);
+}
+
+oilsRptOrgMultiSelect.prototype.draw = function(org) {
+       if(!org) org = globalOrgTree;
+       var opt = insertSelectorVal( this.source, -1, 
+               org.shortname(), org.id(), null, findOrgDepth(org) );
+       if( org.id() == oilsRptCurrentOrg )
+               opt.selected = true;
+       if( org.children() ) {
+               for( var c = 0; c < org.children().length; c++ )
+                       this.draw(org.children()[c]);
+       }
+       this.drawMultiWidget();
+}
+
+/*
+oilsRptOrgMultiSelectWidget.prototype.getSourceCollector = function() {
+       var obj = this;
+       return function() {
+               for( var i = 0; i < obj.source.options.length; i++ )
+                       obj.addItem(obj.source.options.name, obj.source.options.value);
+       }
+}
+*/
+
+/*
+oilsRptOrgMultiSelect.prototype.getValue = function() {
+       return getSelectedList(this.select);
+}
+*/