You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by er...@apache.org on 2013/07/15 00:55:08 UTC

svn commit: r1503074 [3/5] - in /rave/trunk: ./ rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/ rave-components/rave-web/src/main/java/org/apache/rave/portal/web/tag/ rave-components/rave-web/src/test/java/org/apache/rave/...

Modified: rave/trunk/rave-portal-resources/src/main/webapp/static/script/core/rave_opensocial.js
URL: http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/static/script/core/rave_opensocial.js?rev=1503074&r1=1503073&r2=1503074&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/main/webapp/static/script/core/rave_opensocial.js (original)
+++ rave/trunk/rave-portal-resources/src/main/webapp/static/script/core/rave_opensocial.js Sun Jul 14 22:55:06 2013
@@ -17,26 +17,24 @@
  * under the License.
  */
 
-rave.registerProvider(
-    'opensocial',
-    (function () {
+define(['underscore', 'core/rave_view_manager', 'core/rave_api', 'core/rave_openajax_hub', 'core/rave_log', 'core/rave_state_manager', 'osapi'],
+    function (_, viewManager, api, managedHub, log, stateManager) {
         var exports = {};
 
         var container;
 
-        exports.init = function () {
-            var containerConfig = {};
-            containerConfig[osapi.container.ServiceConfig.API_PATH] = "/rpc";
-            containerConfig[osapi.container.ContainerConfig.RENDER_DEBUG] = rave.getJavaScriptDebugMode();
-            container = new osapi.container.Container(containerConfig);
+        var containerConfig = {};
+        containerConfig[osapi.container.ServiceConfig.API_PATH] = "/rpc";
+        containerConfig[osapi.container.ContainerConfig.RENDER_DEBUG] = stateManager.getDebugMode();
+        container = new osapi.container.Container(containerConfig);
+
+        gadgets.pubsub2router.init({
+            hub: managedHub
+        });
 
-            gadgets.pubsub2router.init({
-                hub:rave.getManagedHub()
-            });
+        rpcRegister();
+        implementViews();
 
-            rpcRegister();
-            implementViews();
-        }
 
         function rpcRegister() {
             container.rpcRegister('requestNavigateTo', requestNavigateTo);
@@ -46,49 +44,11 @@ rave.registerProvider(
             container.rpcRegister('showWidget', showWidget);
         }
 
-        function requestNavigateTo(args, viewName, opt_params, opt_ownerId) {
-            var widget = args.gs._widget,
-                viewSurface = viewName.split('.')[0],
-                renderInto = rave.getView(viewSurface) ? viewSurface : widget._el;
-
-            widget.render(renderInto, {view: viewName, view_params: opt_params, ownerId: opt_ownerId});
-        }
-
-        function setPref(args, editToken, prefName, prefValue) {
-            var widget = args.gs._widget;
-            widget.savePreference(prefName, prefValue);
-        }
-
-        /*
-         TODO: these rely on a gadget's view implementing a method
-         */
-        function setTitle(args) {
-            var widget = args.gs._widget;
-            if (widget._view && widget._view.setTitle) {
-                var title = _.isArray(args.a) ? args.a[0] : args.a;
-                widget._view.setTitle(title);
-            }
-        }
-
-        function hideWidget(args, viewName, opt_params, opt_ownerId) {
-            var widget = args.gs._widget;
-            if (widget._view && widget._view.collapse) {
-                widget._view.collapse();
-            }
-        }
-
-        function showWidget(args, viewName, opt_params, opt_ownerId) {
-            var widget = args.gs._widget;
-            if (widget._view && widget._view.expand) {
-                widget._view.expand();
-            }
-        }
-
         function implementViews() {
             container.views.createElementForGadget = function (metadata, rel, opt_view, opt_viewTarget, opt_coordinates, parentSite, opt_callback) {
                 if (opt_viewTarget) {
                     var prefs = (metadata && metadata.views && metadata.views[opt_view])
-                    var view = rave.renderView(opt_viewTarget, prefs);
+                    var view = viewManager.renderView(opt_viewTarget, prefs);
                     var el = view.getWidgetSite();
                     el.setAttribute('data-rave-view', view._uid);
                     return el;
@@ -98,30 +58,28 @@ rave.registerProvider(
             container.views.createElementForEmbeddedExperience = function (rel, opt_gadgetInfo, opt_viewTarget, opt_coordinates, parentSite, opt_callback) {
                 var widgetUrl = opt_gadgetInfo.url;
 
-                rave.api.rest.getSecurityToken({
+                api.rest.getSecurityToken({
                     "url": widgetUrl,
-                    //TODO: need to remove reference to rave.ui once we understand need for current pageid
-                    //violates core dependency
-                    "pageid": rave.ui.getCurrentPageId(),
+                    "pageid": stateManager.getPage().id,
                     "successCallback": renderEE
                 });
 
                 function renderEE(data) {
                     if (data.error) {
-                        return rave.log(data.error.message)
+                        return log(data.error.message)
                     }
                     var gadget = {
                             "widgetUrl": widgetUrl,
                             "securityToken": data.securityToken,
                             "metadata": opt_gadgetInfo
                         },
-                        height = gadget.metadata.modulePrefs.height || rave.RegionWidget.defaultHeight,
-                        width = gadget.metadata.modulePrefs.width || rave.RegionWidget.defaultWidth;
+                        height = gadget.metadata.modulePrefs.height || stateManager.getDefaultHeight(),
+                        width = gadget.metadata.modulePrefs.width || stateManager.getDefaultWidth();
 
                     preloadMetadata(gadget);
 
                     if (opt_viewTarget) {
-                        var view = rave.renderView(opt_viewTarget, {"preferredHeight": height, preferredWidth: width});
+                        var view = viewManager.renderView(opt_viewTarget, {"preferredHeight": height, preferredWidth: width});
                         var el = view.getWidgetSite();
                         el.setAttribute('data-rave-view', view._uid);
                         opt_callback(el);
@@ -131,7 +89,7 @@ rave.registerProvider(
 
             container.views.createElementForUrl = function (rel, opt_viewTarget, opt_coordinates, parentSite, opt_callback) {
                 if (opt_viewTarget) {
-                    var view = rave.renderView(opt_viewTarget);
+                    var view = viewManager.renderView(opt_viewTarget);
                     var el = view.getWidgetSite();
                     el.setAttribute('data-rave-view', view._uid);
                     opt_callback(el);
@@ -142,10 +100,48 @@ rave.registerProvider(
                 var el = site.el_;
                 container.closeGadget(site);
                 var _uid = el.getAttribute('data-rave-view');
-                rave.destroyView(_uid);
+                viewManager.destroyView(_uid);
             };
         }
 
+        function requestNavigateTo(args, viewName, opt_params, opt_ownerId) {
+            var widget = args.gs._widget,
+                viewSurface = viewName.split('.')[0],
+                renderInto = viewManager.getView(viewSurface) ? viewSurface : widget._el;
+
+            widget.render(renderInto, {view: viewName, view_params: opt_params, ownerId: opt_ownerId});
+        }
+
+        function setPref(args, editToken, prefName, prefValue) {
+            var widget = args.gs._widget;
+            widget.savePreference(prefName, prefValue);
+        }
+
+        /*
+         TODO: these rely on a gadget's view implementing a method
+         */
+        function setTitle(args) {
+            var widget = args.gs._widget;
+            if (widget._view && widget._view.setTitle) {
+                var title = _.isArray(args.a) ? args.a[0] : args.a;
+                widget._view.setTitle(title);
+            }
+        }
+
+        function hideWidget(args, viewName, opt_params, opt_ownerId) {
+            var widget = args.gs._widget;
+            if (widget._view && widget._view.collapse) {
+                widget._view.collapse();
+            }
+        }
+
+        function showWidget(args, viewName, opt_params, opt_ownerId) {
+            var widget = args.gs._widget;
+            if (widget._view && widget._view.expand) {
+                widget._view.expand();
+            }
+        }
+
         exports.initWidget = function (widget) {
             widget.error = getMetadataErrors(widget.metadata);
             if (!widget.error) {
@@ -158,7 +154,7 @@ rave.registerProvider(
          full spectrum of allowed render options!
          */
         exports.renderWidget = function (widget, el, opts) {
-            if(widget.error) {
+            if (widget.error) {
                 widget.renderError(el, widget.error.message);
                 return;
             }
@@ -168,13 +164,13 @@ rave.registerProvider(
             widget._site = site;
 
             var renderParams = {};
-            renderParams[osapi.container.RenderParam.VIEW] = opts.view || rave.RegionWidget.defaultView;
+            renderParams[osapi.container.RenderParam.VIEW] = opts.view || stateManager.getDefaultView();
             renderParams[osapi.container.RenderParam.ALLOW_DEFAULT_VIEW ] = opts.allowDefaultView;
             renderParams[osapi.container.RenderParam.DEBUG ] = opts.debug;
-            renderParams[osapi.container.RenderParam.HEIGHT ] = opts.height || rave.RegionWidget.defaultHeight;
+            renderParams[osapi.container.RenderParam.HEIGHT ] = opts.height || stateManager.getDefaultHeight();
             renderParams[osapi.container.RenderParam.NO_CACHE ] = opts.noCache;
             renderParams[osapi.container.RenderParam.TEST_MODE] = opts.testMode;
-            renderParams[osapi.container.RenderParam.WIDTH ] = opts.width || rave.RegionWidget.defaultWidth;
+            renderParams[osapi.container.RenderParam.WIDTH ] = opts.width || stateManager.getDefaultWidth();
             renderParams[osapi.container.RenderParam.USER_PREFS] = getCompleteUserPrefSet(widget.userPrefs, widget.metadata.userPrefs);
             container.navigateGadget(site, widget.widgetUrl, opts.view_params, renderParams, opts.callback);
         }
@@ -225,10 +221,9 @@ rave.registerProvider(
             }
         }
 
-        exports.getContainer = function() {
+        exports.getContainer = function () {
             return container;
         }
 
         return exports;
-    })()
-)
\ No newline at end of file
+    })

Modified: rave/trunk/rave-portal-resources/src/main/webapp/static/script/core/rave_widget.js
URL: http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/static/script/core/rave_widget.js?rev=1503074&r1=1503073&r2=1503074&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/main/webapp/static/script/core/rave_widget.js (original)
+++ rave/trunk/rave-portal-resources/src/main/webapp/static/script/core/rave_widget.js Sun Jul 14 22:55:06 2013
@@ -17,127 +17,118 @@
  * under the License.
  */
 
-rave = rave || {};
+define(['underscore', 'core/rave_api', 'core/rave_view_manager', 'core/rave_providers'],
+    function (_, api, viewManager, providers) {
 
-/*
- Rave RegionWidget Interface
+        function getProvider(name) {
+            return providers[name.toLowerCase()];
+        }
 
- Dependencies:
- rave.ui
- rave.api
- */
+        /*
+         rave widget constructor
+         */
+        var Widget = function (definition) {
+            var provider = definition.type;
+
+            _.extend(this, definition);
+
+            this._provider = getProvider(provider);
+
+            if (!this._provider) {
+                throw new Error('Cannot render widget ' + definition.widgetUrl + '. ' +
+                    'Provider ' + provider + ' is not registered.');
+            }
+
+            this._provider.initWidget(this);
+        }
+
+        Widget.extend = function (mixin) {
+            _.extend(this.prototype, mixin);
+        }
+
+        Widget.prototype.render = function (el, opts) {
+            //if we receive only one argument, and the first arg is not a string or dom element, assume it is an opts object
+            //and el should default to the widgets current render element
+            if (!opts && !(_.isString(el) || (el instanceof HTMLElement))) {
+                opts = el;
+                el = this._el;
+            }
+            //if el is a string, go to rave's view system
+            if (_.isString(el)) {
+                //TODO: potential memory leak - rendering a widget into new views does not force cleanup of current view
+                var view = viewManager.renderView(el, this);
+                el = view.getWidgetSite();
+                this._view = view;
+            }
+            //at this point el must be a valid dom element. if not, throw an error
+            if (!(el instanceof HTMLElement)) {
+                throw new Error('Cannot render widget. You must provide an el to render the view into');
+            }
+            this._el = el;
+            this._provider.renderWidget(this, el, opts);
+            return this;
+        }
+
+        Widget.prototype.renderError = function (el, errors) {
+            el.innerHTML = 'Error rendering widget.' + "<br /><br />" + errors;
+        }
+
+        Widget.prototype.hide = function () {
+            this.collapsed = true;
+
+            api.rest.saveWidgetCollapsedState({
+                regionWidgetId: this.regionWidgetId,
+                collapsed: this.collapsed
+            });
+        }
+
+        Widget.prototype.show = function () {
+            this.collapsed = false;
+
+            api.rest.saveWidgetCollapsedState({
+                regionWidgetId: this.regionWidgetId,
+                collapsed: this.collapsed
+            });
+        }
+
+        Widget.prototype.close = function (opts) {
+            this._provider.closeWidget(this, opts);
+            if (this._view) {
+                viewManager.destroyView(this._view);
+            }
+
+            api.rpc.removeWidget({
+                regionWidgetId: this.regionWidgetId
+            });
+        }
 
-rave.RegionWidget = (function () {
-    /*
-     rave widget constructor
-     */
-    var Widget = function (definition) {
-        var provider = definition.type;
-
-        _.extend(this, definition);
-
-        this._provider = rave.getProvider(provider);
-
-        if (!this._provider) {
-            throw new Error('Cannot render widget ' + definition.widgetUrl + '. ' +
-                'Provider ' + provider + ' is not registered.');
-        }
-
-        this._provider.initWidget(this);
-    }
-
-    Widget.defaultView = 'default';
-    Widget.defaultWidth = 320;
-    Widget.defaultHeight = 200;
-
-    Widget.extend = function (mixin) {
-        _.extend(this.prototype, mixin);
-    }
-
-    Widget.prototype.render = function (el, opts) {
-        //if we receive only one argument, and the first arg is not a string or dom element, assume it is an opts object
-        //and el should default to the widgets current render element
-        if (!opts && !(_.isString(el) || (el instanceof HTMLElement))) {
-            opts = el;
-            el = this._el;
-        }
-        //if el is a string, go to rave's view system
-        if (_.isString(el)) {
-            //TODO: potential memory leak - rendering a widget into new views does not force cleanup of current view
-            var view = rave.renderView(el, this);
-            el = view.getWidgetSite();
-            this._view = view;
-        }
-        //at this point el must be a valid dom element. if not, throw an error
-        if (!(el instanceof HTMLElement)) {
-            throw new Error('Cannot render widget. You must provide an el to render the view into');
-        }
-        this._el = el;
-        this._provider.renderWidget(this, el, opts);
-        return this;
-    }
-
-    Widget.prototype.renderError = function (el, errors) {
-        el.innerHTML = 'Error rendering widget.' + "<br /><br />" + errors;
-    }
-
-    Widget.prototype.hide = function () {
-        this.collapsed = true;
-
-        rave.api.rest.saveWidgetCollapsedState({
-            regionWidgetId: this.regionWidgetId,
-            collapsed: this.collapsed
-        });
-    }
-
-    Widget.prototype.show = function () {
-        this.collapsed = false;
-
-        rave.api.rest.saveWidgetCollapsedState({
-            regionWidgetId: this.regionWidgetId,
-            collapsed: this.collapsed
-        });
-    }
-
-    Widget.prototype.close = function (opts) {
-        this._provider.closeWidget(this, opts);
-        if (this._view) {
-            rave.destroyView(this._view);
-        }
-
-        rave.api.rpc.removeWidget({
-            regionWidgetId: this.regionWidgetId
-        });
-    }
-
-    Widget.prototype.moveToPage = function (toPageId, cb) {
-        rave.api.rpc.moveWidgetToPage({
-            toPageId: toPageId,
-            regionWidgetId: this.regionWidgetId,
-            successCallback: cb
-        });
-    }
-
-    Widget.prototype.moveToRegion = function (fromRegionId, toRegionId, toIndex) {
-        rave.api.rpc.moveWidgetToRegion({
-            regionWidgetId: this.regionWidgetId,
-            fromRegionId: fromRegionId,
-            toRegionId: toRegionId,
-            toIndex: toIndex
-        });
-    }
-
-    Widget.prototype.savePreference = function (name, val) {
-        this.userPrefs[name] = val;
-        rave.api.rest.saveWidgetPreference({regionWidgetId: this.regionWidgetId, prefName: name, prefValue: val});
-    }
-
-    Widget.prototype.savePreferences = function (updatedPrefs) {
-        this.userPrefs = updatedPrefs;
-        rave.api.rest.saveWidgetPreferences({regionWidgetId: this.regionWidgetId, userPrefs: updatedPrefs});
-    }
+        Widget.prototype.moveToPage = function (toPageId, cb) {
+            api.rpc.moveWidgetToPage({
+                toPageId: toPageId,
+                regionWidgetId: this.regionWidgetId,
+                successCallback: cb
+            });
+        }
+
+        Widget.prototype.moveToRegion = function (fromRegionId, toRegionId, toIndex) {
+            api.rpc.moveWidgetToRegion({
+                regionWidgetId: this.regionWidgetId,
+                fromRegionId: fromRegionId,
+                toRegionId: toRegionId,
+                toIndex: toIndex
+            });
+        }
 
+        Widget.prototype.savePreference = function (name, val) {
+            this.userPrefs[name] = val;
+            api.rest.saveWidgetPreference({regionWidgetId: this.regionWidgetId, prefName: name, prefValue: val});
+        }
+
+        Widget.prototype.savePreferences = function (updatedPrefs) {
+            this.userPrefs = updatedPrefs;
+            api.rest.saveWidgetPreferences({regionWidgetId: this.regionWidgetId, userPrefs: updatedPrefs});
+        }
 
-    return Widget;
 
-})();
\ No newline at end of file
+        return Widget;
+    })
\ No newline at end of file

Modified: rave/trunk/rave-portal-resources/src/main/webapp/static/script/core/rave_wookie.js
URL: http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/static/script/core/rave_wookie.js?rev=1503074&r1=1503073&r2=1503074&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/main/webapp/static/script/core/rave_wookie.js (original)
+++ rave/trunk/rave-portal-resources/src/main/webapp/static/script/core/rave_wookie.js Sun Jul 14 22:55:06 2013
@@ -17,12 +17,9 @@
  * under the License.
  */
 
-rave.registerProvider(
-    'W3C',
-    (function () {
+define(['core/rave_openajax_hub', 'core/rave_state_manager'], function(managedHub, stateManager){
         var exports = {}
 
-        exports.init = function(){};
         exports.initWidget = function(widget){}
         exports.renderWidget = function(widget, el, opts){
             var widgetBodyElement = document.getElementById(["widget-", widget.regionWidgetId, "-body"].join(""));
@@ -30,7 +27,7 @@ rave.registerProvider(
                 window.document.getElementById(widget.regionWidgetId).style.visibility="visible";
             };
 
-            new OpenAjax.hub.IframeContainer(rave.getManagedHub() , ""+widget.regionWidgetId,
+            new OpenAjax.hub.IframeContainer(managedHub , ""+widget.regionWidgetId,
                 {
                     Container: {
                         onSecurityAlert: onClientSecurityAlert,
@@ -39,11 +36,9 @@ rave.registerProvider(
                     },
                     IframeContainer: {
                         parent:      el,
-                        //TODO: I dropped a bunch of the attrs here - seems like it should all be css
-                        //unless it is being defined by the gadget spec
                         iframeAttrs: {
-                            height: widget.height || rave.RegionWidget.defaultHeight,
-                            width:  widget.width || rave.RegionWidget.defaultWidth,
+                            height: widget.height || stateManager.getDefaultHeight(),
+                            width:  widget.width || stateManager.getDefaultWidth(),
                             frameborder: 0
                         },
                         uri: widget.widgetUrl,
@@ -62,5 +57,4 @@ rave.registerProvider(
         }
 
         return exports;
-    })()
-)
\ No newline at end of file
+})
\ No newline at end of file

Modified: rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_admin.js
URL: http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_admin.js?rev=1503074&r1=1503073&r2=1503074&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_admin.js (original)
+++ rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_admin.js Sun Jul 14 22:55:06 2013
@@ -17,51 +17,42 @@
  * under the License.
  */
 
-var rave = rave || {};
-rave.admin = rave.admin || (function() {
+define(["jquery"], function ($) {
 
-    var adminUi = (function() {
+    function datatableClick() {
+        $('.datatable tr').bind('click', function () {
+            var link = $(this).attr('data-detaillink');
+            if (link != undefined && link != '') {
+                window.location = link;
+            }
+        });
+    }
 
-        function datatableClick() {
-            $('.datatable tr').bind('click', function() {
-                var link = $(this).attr('data-detaillink');
-                if (link != undefined && link != '') {
-                    window.location = link;
-                }
-            });
-        }
-
-        //Resize bootstrap modal & adjust margins to size of image.
-        function resizeImageModal(){
-            $('#thumbnailModal, #screenshotModal').on('shown', function () {
-                if(!$(this).hasClass("sized")){
-                    var imageWidth = $(this).find("img").width(),
-                        imageHeight = $(this).find("img").height(),
-                        footerHeight = $(this).find(".modal-footer").outerHeight(),
-                        headerHeight = $(this).find(".modal-header").outerHeight(),
-                        totalHeight = imageHeight + footerHeight + headerHeight;
-
-                    $(this).css({
-                        width: imageWidth + "px",
-                        'margin-top': "-" + Math.round(totalHeight/2) + "px",
-                        'margin-left': "-" + Math.round(imageWidth/2) + "px"
-                    }).addClass("sized");
-                }
-            });
-        }
-
-        function init() {
-            datatableClick();
-            resizeImageModal();
-        }
-
-        return {
-            init:init
-        }
-    })();
+    //Resize bootstrap modal & adjust margins to size of image.
+    function resizeImageModal() {
+        $('#thumbnailModal, #screenshotModal').on('shown', function () {
+            if (!$(this).hasClass("sized")) {
+                var imageWidth = $(this).find("img").width(),
+                    imageHeight = $(this).find("img").height(),
+                    footerHeight = $(this).find(".modal-footer").outerHeight(),
+                    headerHeight = $(this).find(".modal-header").outerHeight(),
+                    totalHeight = imageHeight + footerHeight + headerHeight;
+
+                $(this).css({
+                    width: imageWidth + "px",
+                    'margin-top': "-" + Math.round(totalHeight / 2) + "px",
+                    'margin-left': "-" + Math.round(imageWidth / 2) + "px"
+                }).addClass("sized");
+            }
+        });
+    }
 
-    return {
-        initAdminUi : adminUi.init
+    function init() {
+        datatableClick();
+        resizeImageModal();
     }
 
-})();
+    return {
+        init: init
+    }
+})
\ No newline at end of file

Modified: rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_backbone.js
URL: http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_backbone.js?rev=1503074&r1=1503073&r2=1503074&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_backbone.js (original)
+++ rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_backbone.js Sun Jul 14 22:55:06 2013
@@ -16,62 +16,69 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var rave = rave || {};
-
-/*
-Extend backbone's standard model and collection with some
- */
-rave.Model = Backbone.Model.extend({
-    get: function(attr){
-        //tweak model get so that array / object members are passed by value instead of reference
-        //needed for managing deep objects
-        return _.clone(this.attributes[attr]);
-    },
 
+define(["underscore", "backbone"], function(_, Backbone){
     /*
-    Overridable function that models can implement for serializing themselves for view rendering,
-    since often a handlebars template needs explicit keys or booleans that don't make sense
-    in a normal json representation of the model. By default will just return toJSON().
+     Extend backbone's standard model and collection with some
      */
-    toViewModel: function () {
-        return this.toJSON();
-    }
-});
-
-rave.Collection = Backbone.Collection.extend({
-    toViewModel: function () {
-        return this.map(function (model) {
-            return model.toViewModel();
-        });
-    }
-})
+    var Model = Backbone.Model.extend({
+        get: function(attr){
+            //tweak model get so that array / object members are passed by value instead of reference
+            //needed for managing deep objects
+            return _.clone(this.attributes[attr]);
+        },
+
+        /*
+         Overridable function that models can implement for serializing themselves for view rendering,
+         since often a handlebars template needs explicit keys or booleans that don't make sense
+         in a normal json representation of the model. By default will just return toJSON().
+         */
+        toViewModel: function () {
+            return this.toJSON();
+        }
+    });
+
+    var Collection = Backbone.Collection.extend({
+        toViewModel: function () {
+            return this.map(function (model) {
+                return model.toViewModel();
+            });
+        }
+    })
 
 
-/*
- rave.View is an extension of Backbone's view with some scaffolding put in place. The expectation is that a view
- will be declared with a hash of models (models or collections) that will be merged and fed to the view at render
- time. By default on any change to the models the view will be re-rendered. Also provides an implementation of
- render that probably will not need to be overrridden.
- */
-rave.View = Backbone.View.extend({
-    initialize: function () {
-        var self = this;
-        _.bindAll(this);
-
-        _.each(this.models, function (model) {
-            model.on('change', self.render);
-            model.on('reset', self.render);
-        });
-    },
-    render: function () {
-        var template = this.template;
-
-        var viewData = {};
-        _.each(this.models, function (model, key) {
-            viewData[key] = model.toViewModel();
-        });
-
-        this.$el.html(template(viewData));
-        return this;
+    /*
+     rave.View is an extension of Backbone's view with some scaffolding put in place. The expectation is that a view
+     will be declared with a hash of models (models or collections) that will be merged and fed to the view at render
+     time. By default on any change to the models the view will be re-rendered. Also provides an implementation of
+     render that probably will not need to be overrridden.
+     */
+    var View = Backbone.View.extend({
+        initialize: function () {
+            var self = this;
+            _.bindAll(this);
+
+            _.each(this.models, function (model) {
+                model.on('change', self.render);
+                model.on('reset', self.render);
+            });
+        },
+        render: function () {
+            var template = this.template;
+
+            var viewData = {};
+            _.each(this.models, function (model, key) {
+                viewData[key] = model.toViewModel();
+            });
+
+            this.$el.html(template(viewData));
+            return this;
+        }
+    });
+
+    return{
+        Model:Model,
+        Collection:Collection,
+        View:View
     }
-});
\ No newline at end of file
+})
\ No newline at end of file

Modified: rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_forms.js
URL: http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_forms.js?rev=1503074&r1=1503073&r2=1503074&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_forms.js (original)
+++ rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_forms.js Sun Jul 14 22:55:06 2013
@@ -17,9 +17,7 @@
  * under the License.
  */
 
-var rave = rave || {};
-rave.forms = rave.forms || (function() {
-
+define(["jquery", "portal/rave_portal", "jqueryValidate"], function($, ravePortal){
     function validateNewAccountForm() {
         $("#newAccountForm").validate({
             rules: {
@@ -43,7 +41,7 @@ rave.forms = rave.forms || (function() {
             },
             messages: {
                 confirmPassword: {
-                    equalTo: rave.getClientMessage("form.password.invalid_match")
+                    equalTo: ravePortal.getClientMessage("form.password.invalid_match")
                 }
             }
         });
@@ -64,23 +62,23 @@ rave.forms = rave.forms || (function() {
             },
             messages: {
                 passwordConfirm: {
-                    equalTo: rave.getClientMessage("form.password.invalid_match")
+                    equalTo: ravePortal.getClientMessage("form.password.invalid_match")
                 }
             }
         });
     }
-    
+
     function validateEditAccountForm() {
         $("#editAccountForm").validate({
             rules: {
-            	 email : {
-                     required: true,
-                     email: true
-                 }
-            }            
+                email : {
+                    required: true,
+                    email: true
+                }
+            }
         });
     }
-    
+
     function validatePageForm() {
         $("#pageForm").validate({
             rules: {
@@ -93,8 +91,8 @@ rave.forms = rave.forms || (function() {
 
     return {
         validateNewAccountForm : validateNewAccountForm,
-	    validateUserProfileForm: validateUserProfileForm,
-	    validateEditAccountForm: validateEditAccountForm,
+        validateUserProfileForm: validateUserProfileForm,
+        validateEditAccountForm: validateEditAccountForm,
         validatePageForm: validatePageForm
     };
-})();
+})
\ No newline at end of file

Modified: rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_layout.js
URL: http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_layout.js?rev=1503074&r1=1503073&r2=1503074&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_layout.js (original)
+++ rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_layout.js Sun Jul 14 22:55:06 2013
@@ -17,597 +17,365 @@
  * under the License.
  */
 
-var rave = rave || {};
-rave.layout = rave.layout || (function () {
-    var MOVE_PAGE_DEFAULT_POSITION_IDX = -1;
-    var $moveWidgetDialog;
-    var showImportExportUI = false;
-    var $movePageDialog = $("#movePageDialog");
-    var $pageFormTabbed = $("#pageFormTabbed");
-    var $pageFormImport = $("#pageFormImport");
-    var $omdlFile = $("#omdlFile");
-    var $pageForm = $("#pageForm");
-    var $tab_title_input = $("#tab_title"),
-        $tab_id = $("#tab_id"),
-        $page_layout_input = $("#pageLayout");
-
-    // page menu related functions
-    var pageMenu = (function () {
-        var $addPageButton = $("#addPageButton");
-        var $menuItemEdit = $("#pageMenuEdit");
-        var $menuItemDelete = $("#pageMenuDelete");
-        var $menuItemMove = $("#pageMenuMove");
-        var $menuItemShare = $("#pageMenuShare");
-        var $menuItemRevokeShare = $("#pageMenuRevokeShare");
-        var $MenuItemExport = $("#pageMenuExport");
+define(["jquery", "rave", "portal/rave_portal", "portal/rave_models", "bootstrap", "jqueryValidate"],
+    function ($, rave, ravePortal, raveModels) {
+        var MOVE_PAGE_DEFAULT_POSITION_IDX = -1;
+        var $moveWidgetDialog;
+        var showImportExportUI = false;
+        var $movePageDialog = $("#movePageDialog");
+        var $pageFormTabbed = $("#pageFormTabbed");
+        var $pageFormImport = $("#pageFormImport");
+        var $omdlFile = $("#omdlFile");
+        var $pageForm = $("#pageForm");
+        var $tab_title_input = $("#tab_title"),
+            $tab_id = $("#tab_id"),
+            $page_layout_input = $("#pageLayout");
+
+        // page menu related functions
+        var pageMenu = (function () {
+            var $addPageButton = $("#addPageButton");
+            var $menuItemEdit = $("#pageMenuEdit");
+            var $menuItemDelete = $("#pageMenuDelete");
+            var $menuItemMove = $("#pageMenuMove");
+            var $menuItemShare = $("#pageMenuShare");
+            var $menuItemRevokeShare = $("#pageMenuRevokeShare");
+            var $MenuItemExport = $("#pageMenuExport");
+
+            /**
+             * Initializes the private pageMenu closure
+             * - binds click event handler to menu button
+             * - binds menu item click event handlers
+             * - binds body click event handler to close the menu
+             */
+            function init(showImportExport) {
+                showImportExportUI = showImportExport;
+                // initialize the page form validator overriding the
+                // styles to wire in bootstrap styles
+                $pageForm.validate({
+                    errorElement: 'span',
+                    errorClass: 'help-inline',
+                    highlight: function (element, errorClass) {
+                        $(element).parent().parent().addClass('error');
+                    },
+                    unhighlight: function (element, errorClass) {
+                        $(element).parent().parent().removeClass('error');
+                    }
+                });
+                $pageFormTabbed.validate({
+                    errorElement: 'span',
+                    errorClass: 'help-inline',
+                    highlight: function (element, errorClass) {
+                        $(element).parent().parent().addClass('error');
+                    },
+                    unhighlight: function (element, errorClass) {
+                        $(element).parent().parent().removeClass('error');
+                    }
+                });
+                $pageFormImport.validate({
+                    errorElement: 'span',
+                    errorClass: 'help-inline',
+                    highlight: function (element, errorClass) {
+                        $(element).parent().parent().addClass('error');
+                    },
+                    unhighlight: function (element, errorClass) {
+                        $(element).parent().parent().removeClass('error');
+                    }
+                });
 
-        /**
-         * Initializes the private pageMenu closure
-         * - binds click event handler to menu button
-         * - binds menu item click event handlers
-         * - binds body click event handler to close the menu
-         */
-        function init(showImportExport) {
-            showImportExportUI = showImportExport;
-            // initialize the page form validator overriding the
-            // styles to wire in bootstrap styles
-            $pageForm.validate({
-                errorElement: 'span',
-                errorClass: 'help-inline',
-                highlight: function (element, errorClass) {
-                    $(element).parent().parent().addClass('error');
-                },
-                unhighlight: function (element, errorClass) {
-                    $(element).parent().parent().removeClass('error');
-                }
-            });
-            $pageFormTabbed.validate({
-                errorElement: 'span',
-                errorClass: 'help-inline',
-                highlight: function (element, errorClass) {
-                    $(element).parent().parent().addClass('error');
-                },
-                unhighlight: function (element, errorClass) {
-                    $(element).parent().parent().removeClass('error');
-                }
-            });
-            $pageFormImport.validate({
-                errorElement: 'span',
-                errorClass: 'help-inline',
-                highlight: function (element, errorClass) {
-                    $(element).parent().parent().addClass('error');
-                },
-                unhighlight: function (element, errorClass) {
-                    $(element).parent().parent().removeClass('error');
-                }
-            });
-
-
-            // initialize the close button in the page menu dialog
-            $("#pageMenuCloseButton").click(rave.layout.closePageDialog);
-            $("#pageMenuCloseButtonTab").click(rave.layout.closePageDialogTabbed);
-            if (showImportExport) {
-                $("#pageMenuExport").removeClass('hidden');
-            }
 
-            // setup the edit page menu item
-            $addPageButton.bind('click', function (event) {
+                // initialize the close button in the page menu dialog
+                $("#pageMenuCloseButton").click(closePageDialog);
+                $("#pageMenuCloseButtonTab").click(closePageDialogTabbed);
                 if (showImportExport) {
-                    var $pageMenuUpdateButtonTabbed = $("#pageMenuUpdateButtonTab");
-                    $pageMenuUpdateButtonTabbed.html(rave.getClientMessage("common.add"));
-                    $("#page-tabs").tabs();
-                    $pageMenuUpdateButtonTabbed.click(rave.layout.addOrImportPage);
-                    $('#pageMenuDialogTabbed').on('shown', function () {
-                        $("#tab_title").first().focus();
-                    });
-                    $("#pageMenuDialogTabbed").modal('show');
-                } else {
-                    $("#pageMenuDialogHeader").html(rave.getClientMessage("page.add"));
-                    var $pageMenuUpdateButton = $("#pageMenuUpdateButton");
-                    $("#pageLayoutGroup").show();
-                    $pageMenuUpdateButton.html(rave.getClientMessage("common.add"));
-                    // unbind the previous click event since we are sharing the
-                    // dialog between separate add/edit page actions
-                    $pageMenuUpdateButton.unbind('click');
-                    $pageMenuUpdateButton.click(rave.layout.addPage);
-                    $('#pageMenuDialog').on('shown', function () {
-                        $("#tab_title").first().focus();
-                    });
-                    $("#pageMenuDialog").modal('show');
+                    $("#pageMenuExport").removeClass('hidden');
                 }
-            });
 
-            // setup the edit page menu item
-            $menuItemEdit.bind('click', function (event) {
-                rave.api.rpc.getPagePrefs({pageId: getCurrentPageId(),
-                    successCallback: function (result) {
-                        $tab_title_input.val(result.result.name);
-                        $tab_id.val(result.result.id);
-                        $page_layout_input.val(result.result.pageLayout.code);
-                        $("#pageMenuDialogHeader").html(rave.getClientMessage("page.update"));
+                // setup the edit page menu item
+                $addPageButton.bind('click', function (event) {
+                    if (showImportExport) {
+                        var $pageMenuUpdateButtonTabbed = $("#pageMenuUpdateButtonTab");
+                        $pageMenuUpdateButtonTabbed.html(ravePortal.getClientMessage("common.add"));
+                        $("#page-tabs").tabs();
+                        $pageMenuUpdateButtonTabbed.click(addOrImportPage);
+                        $('#pageMenuDialogTabbed').on('shown', function () {
+                            $("#tab_title").first().focus();
+                        });
+                        $("#pageMenuDialogTabbed").modal('show');
+                    } else {
+                        $("#pageMenuDialogHeader").html(ravePortal.getClientMessage("page.add"));
                         var $pageMenuUpdateButton = $("#pageMenuUpdateButton");
                         $("#pageLayoutGroup").show();
-                        $pageMenuUpdateButton.html(rave.getClientMessage("common.save"));
+                        $pageMenuUpdateButton.html(ravePortal.getClientMessage("common.add"));
                         // unbind the previous click event since we are sharing the
                         // dialog between separate add/edit page actions
                         $pageMenuUpdateButton.unbind('click');
-                        $pageMenuUpdateButton.click(rave.layout.updatePage);
+                        $pageMenuUpdateButton.click(addPage);
                         $('#pageMenuDialog').on('shown', function () {
                             $("#tab_title").first().focus();
                         });
                         $("#pageMenuDialog").modal('show');
                     }
                 });
-            });
 
-            // setup the delete page menu item if it is not disabled
-            if (!$menuItemDelete.hasClass("menu-item-disabled")) {
-                $menuItemDelete.bind('click', function (event) {
-                    // send the rpc request to delete the page
-                    rave.api.rest.deletePage({pageId: getCurrentPageId(), successCallback: rave.viewPage});
+                // setup the edit page menu item
+                $menuItemEdit.bind('click', function (event) {
+                    rave.api.rpc.getPagePrefs({pageId: getCurrentPageId(),
+                        successCallback: function (result) {
+                            $tab_title_input.val(result.result.name);
+                            $tab_id.val(result.result.id);
+                            $page_layout_input.val(result.result.pageLayout.code);
+                            $("#pageMenuDialogHeader").html(ravePortal.getClientMessage("page.update"));
+                            var $pageMenuUpdateButton = $("#pageMenuUpdateButton");
+                            $("#pageLayoutGroup").show();
+                            $pageMenuUpdateButton.html(ravePortal.getClientMessage("common.save"));
+                            // unbind the previous click event since we are sharing the
+                            // dialog between separate add/edit page actions
+                            $pageMenuUpdateButton.unbind('click');
+                            $pageMenuUpdateButton.click(updatePage);
+                            $('#pageMenuDialog').on('shown', function () {
+                                $("#tab_title").first().focus();
+                            });
+                            $("#pageMenuDialog").modal('show');
+                        }
+                    });
                 });
-            }
 
-            // setup the move page menu item if it is not disabled
-            if (!$menuItemMove.hasClass("menu-item-disabled")) {
-                $menuItemMove.bind('click', function (event) {
-                    $movePageDialog.modal('show');
-                });
-            }
+                // setup the delete page menu item if it is not disabled
+                if (!$menuItemDelete.hasClass("menu-item-disabled")) {
+                    $menuItemDelete.bind('click', function (event) {
+                        // send the rpc request to delete the page
+                        rave.api.rest.deletePage({pageId: getCurrentPageId(), successCallback: ravePortal.viewPage});
+                    });
+                }
 
-            // setup the export page menu item if it is not disabled
-            if (!$MenuItemExport.hasClass("hidden")) {
-                $MenuItemExport.bind('click', function (event) {
-                    window.open(rave.getContext() + "api/rest/" + "page/" + getCurrentPageId() + "/omdl");
-                });
-            }
+                // setup the move page menu item if it is not disabled
+                if (!$menuItemMove.hasClass("menu-item-disabled")) {
+                    $menuItemMove.bind('click', function (event) {
+                        $movePageDialog.modal('show');
+                    });
+                }
 
-            // setup the revoke share page menu item
-            if (!$menuItemRevokeShare.hasClass("menu-item-disabled")) {
-                $menuItemRevokeShare.bind('click', function (event) {
-                    rave.models.currentPage.removeForSelf();
-                });
-            }
-        }
+                // setup the export page menu item if it is not disabled
+                if (!$MenuItemExport.hasClass("hidden")) {
+                    $MenuItemExport.bind('click', function (event) {
+                        window.open(rave.getContext() + "api/rest/" + "page/" + getCurrentPageId() + "/omdl");
+                    });
+                }
 
-        return {
-            init: init
-        }
-    })();
+                // setup the revoke share page menu item
+                if (!$menuItemRevokeShare.hasClass("menu-item-disabled")) {
+                    $menuItemRevokeShare.bind('click', function (event) {
+                        raveModels.currentPage.removeForSelf();
+                    });
+                }
+            }
 
-    // functions associated with the user search for sharing pages
+            return {
+                init: init
+            }
+        })();
 
-    // widget menu related functions
-    var widgetMenu = (function () {
-        var $menu;
-        var $menuItemMove;
-        var $menuItemDelete;
-        var $menuItemMaximize;
-        var $menuItemAbout;
-        var $menuItemComment;
-        var $menuItemRate;
+        // functions associated with the user search for sharing pages
 
-        /**
-         * Hides the widget menu for a specific widget
-         * @param widgetId the id of the widget to hide the menu for
-         */
-        function hideMenu(widgetId) {
-            $("#widget-" + widgetId + "-menu").hide();
-            $(".iframe-overlay").remove();
-        }
 
-        /**
-         * Hides all widget menus
-         */
-        function hideAllMenus() {
-            $(".widget-menu").hide();
-            $(".iframe-overlay").remove();
-        }
 
         /**
-         * Shows the widget menu for a specific widget
-         * @param widgetId the id of the widget to show the menu for
+         * Submits the RPC call to move the widget to a new page
          */
-        function showMenu(widgetId) {
-            $("#widget-" + widgetId + "-menu").show();
+        function moveWidgetToPage(regionWidgetId) {
+            var toPageId = $("#moveToPageId").val();
+            var args = { toPageId: toPageId,
+                regionWidgetId: regionWidgetId,
+                successCallback: function () {
+                    ravePortal.viewPage(toPageId);
+                }
+            };
+            // send the rpc request to move the widget to new page
+            rave.api.rpc.moveWidgetToPage(args);
         }
 
         /**
-         * Initializes a single widgets private widgetMenu closure
-         * - binds click event handler to menu button
-         * - binds menu item click event handlers
-         * - binds body click event handler to close the menu
+         * Submits the RPC call to add a new page if form validation passes
          */
-        function bindWidgetMenu(widgetId) {
-            // setup the move to page menu item
-            $menuItemMove = $("#widget-" + widgetId + "-menu-move-item");
-            if (!$menuItemMove.hasClass("menu-item-disabled")) {
-                $menuItemMove.bind('click', function (event) {
-                    var regionWidgetId = rave.getObjectIdFromDomId(this.id);
-                    // Clear the dropdown box; needing to do this may be a bug?
-                    $('.dropdown').removeClass('open');
-                    // Open the modal
-                    $("#moveWidgetModal").data('regionWidgetId', regionWidgetId);
-                    $("#moveWidgetModal").modal('show');
-
-                    // prevent the menu button click event from bubbling up to parent
-                    // DOM object event handlers such as the page tab click event
-                    event.stopPropagation();
-                });
-            }
-
-            // setup the delete widget menu item
-            $menuItemDelete = $("#widget-" + widgetId + "-menu-delete-item");
-            if (!$menuItemDelete.hasClass("menu-item-disabled")) {
-                $menuItemDelete.bind('click', function (event) {
-                    var regionWidgetId = rave.getObjectIdFromDomId(this.id);
-
-                    // invoke the rpc call to remove the widget from the page
-                    rave.layout.deleteRegionWidget(regionWidgetId);
-
-                    // prevent the menu button click event from bubbling up to parent
-                    // DOM object event handlers such as the page tab click event
-                    event.stopPropagation();
-                });
+        function addPage() {
+            if (showImportExportUI) {
+                if ($pageFormTabbed.valid()) {
+                    var newPageTitle = $("#tab_titleTabbed1").val();
+                    var newPageLayoutCode = $("#pageLayoutTabbed").val();
+                    // send the rpc request to create the new page
+                    rave.api.rpc.addPage({pageName: newPageTitle,
+                        pageLayoutCode: newPageLayoutCode,
+                        errorLabel: 'pageFormErrorsTabbed1',
+                        successCallback: function (result) {
+                            ravePortal.viewPage(result.result.id);
+                        },
+                        errorCallback: function (errorLabel) {
+                            $("#" + errorLabel).html(ravePortal.getClientMessage("page.duplicate_name"));
+                        }
+                    });
+                }
+            } else {
+                if ($pageForm.valid()) {
+                    var newPageTitle = $tab_title_input.val();
+                    var newPageLayoutCode = $page_layout_input.val();
+                    // send the rpc request to create the new page
+                    rave.api.rpc.addPage({pageName: newPageTitle,
+                        pageLayoutCode: newPageLayoutCode,
+                        errorLabel: 'pageFormErrors',
+                        successCallback: function (result) {
+                            ravePortal.viewPage(result.result.id);
+                        },
+                        errorCallback: function (errorLabel) {
+                            $("#" + errorLabel).html(ravePortal.getClientMessage("page.duplicate_name"));
+                        }
+                    });
+                }
             }
+        }
 
-            // setup the maximize widget menu item
-            $menuItemMaximize = $("#widget-" + widgetId + "-menu-maximize-item");
-            if (!$menuItemMaximize.hasClass("menu-item-disabled")) {
-                $menuItemMaximize.bind('click', function (event) {
-                    var regionWidgetId = rave.getObjectIdFromDomId(this.id);
-
-                    // maximize the widget
-                    rave.maximizeWidget({data: {id: regionWidgetId}});
-                    // prevent the menu button click event from bubbling up to parent
-                    // DOM object event handlers such as the page tab click event
-                    event.stopPropagation();
-                });
+        function importPage() {
+            if ($.browser.msie == true) {
+                alert(ravePortal.getClientMessage("import.page.not.supported"));
             }
-
-            // setup the about this widget menu item
-            $menuItemAbout = $("#widget-" + widgetId + "-menu-about-item");
-            if (!$menuItemAbout.hasClass("menu-item-disabled")) {
-                $menuItemAbout.bind('click', function (event) {
-                    var regionWidget = rave.getRegionWidgetById(rave.getObjectIdFromDomId(this.id));
-
-                    // go to the widget detail page
-                    rave.viewWidgetDetail(regionWidget.widgetId, getCurrentPageId());
-                    // prevent the menu button click event from bubbling up to parent
-                    // DOM object event handlers such as the page tab click event
-                    event.stopPropagation();
-                });
+            else {
+                if ($pageFormImport.valid()) {
+                    $pageFormImport.get(0).setAttribute('action', rave.getContext() + "api/rpc/page/import/omdl");
+                    document.getElementById('pageFormImport').onsubmit = function () {
+                        document.getElementById('pageFormImport').target = 'file_upload_frame';
+                        document.getElementById("file_upload_frame").onload = processFileUploadResult;
+                    }
+                    $pageFormImport.submit();
+                }
             }
+        }
 
-            // setup the comment on this widget menu item
-            $menuItemComment = $("#widget-" + widgetId + "-menu-comment-item");
-            if (!$menuItemComment.hasClass("menu-item-disabled")) {
-                $menuItemComment.bind('click', function (event) {
-                    var regionWidget = rave.getRegionWidgetById(rave.getObjectIdFromDomId(this.id));
-
-                    // go to the widget detail page
-                    rave.viewWidgetDetail(regionWidget.widgetId, getCurrentPageId(), 'widgetComments');
-                    // prevent the menu button click event from bubbling up to parent
-                    // DOM object event handlers such as the page tab click event
-                    event.stopPropagation();
-                });
+        function processFileUploadResult() {
+            // chrome & firefox a <pre> has been added to the begining of the json
+            var ret = frames['file_upload_frame'].document.getElementsByTagName("body")[0].firstChild.innerHTML;
+            var data = eval("(" + ret + ")");
+            if (data.error) {
+                if (data.errorCode == 'DUPLICATE_ITEM') {
+                    $("#pageFormErrorsTabbed2").html(ravePortal.getClientMessage("page.duplicate_name"));
+                }
+                else if (data.errorCode == 'INTERNAL_ERROR' && data.errorMessage.indexOf("BadOmdlXmlFormatException") != -1) {
+                    var msg = data.errorMessage.substr(data.errorMessage.indexOf("BadOmdlXmlFormatException"), data.errorMessage.length)
+                    $("#pageFormErrorsTabbed2").html(msg);
+                }
+                else {
+                    alert(ravePortal.getClientMessage("api.rpc.error.internal"));
+                }
             }
-
-            // setup the Rate this widget menu item
-            $menuItemRate = $("#widget-" + widgetId + "-menu-rate-item");
-            if (!$menuItemRate.hasClass("menu-item-disabled")) {
-                $menuItemRate.bind('click', function (event) {
-                    var regionWidget = rave.getRegionWidgetById(rave.getObjectIdFromDomId(this.id));
-
-                    // go to the widget detail page
-                    rave.viewWidgetDetail(regionWidget.widgetId, getCurrentPageId(), 'widgetRatings');
-                    // prevent the menu button click event from bubbling up to parent
-                    // DOM object event handlers such as the page tab click event
-                    event.stopPropagation();
-                });
+            else {
+                ravePortal.viewPage(data.result.id);
             }
         }
 
-        /**
-         * Initializes ALL widgets private widgetMenu closure
-         */
-        function init() {
-            // loop over each widget-menu and initialize the menu items
-            // note: the edit prefs menu item is by default rendered disabled
-            //       and it is up to the provider code for that widget to
-            //       determine if the widget has preferences, and to enable
-            //       the menu item
-            $(".widget-menu").each(function (index, element) {
-                var widgetId = rave.getObjectIdFromDomId(element.id);
-                bindWidgetMenu(widgetId);
-            });
+        function addOrImportPage() {
+            var selectedTab = $("#page-tabs").tabs('option', 'selected');
+            if (selectedTab == 0) {
+                addPage();
+            } else {
+                importPage();
+            }
         }
 
         /**
-         * Enables the Edit Prefs including the Preferences view (Custom Edit Prefs)
-         * menu item in the widget menu to be clicked.
-         * Widget providers should use this function when initializing their
-         * widgets after determining if the widget has preferences to modify.
-         *
-         * @param regionWidgetId the regionWidgetId of the regionWidget menu to enable
-         * @param isPreferencesView boolean to indicate whether "preferences" view or the default prefs view
+         * Submits the RPC call to move the page to a new render sequence
          */
-        function enableEditPrefsMenuItem(regionWidgetId, isPreferencesView) {
-            // setup the edit prefs widget menu item
-            var $menuItemEditPrefs = $("#widget-" + regionWidgetId + "-menu-editprefs-item");
-            $menuItemEditPrefs.removeClass("menu-item-disabled");
-            $menuItemEditPrefs.on('click', function (event) {
-                var regionWidgetId = rave.getObjectIdFromDomId(this.id);
-
-                // show the regular edit prefs or the Custom Edit Prefs(preferences) region
-                if (isPreferencesView) {
-                    rave.editCustomPrefs({data: {id: regionWidgetId}});
-                }
-                else {
-                    rave.editPrefs(regionWidgetId);
+        function movePage() {
+            var moveAfterPageId = $("#moveAfterPageId").val();
+            var args = { pageId: $("#currentPageId").val(),
+                successCallback: function (result) {
+                    ravePortal.viewPage(result.result.id);
                 }
-                // prevent the menu button click event from bubbling up to parent
-                // DOM object event handlers such as the page tab click event
-                return false;
-            });
-        }
+            };
 
-        return {
-            init: init,
-            bindWidgetMenu: bindWidgetMenu,
-            hideAll: hideAllMenus,
-            hide: hideMenu,
-            show: showMenu,
-            enableEditPrefsMenuItem: enableEditPrefsMenuItem
-        }
-    })();
-
-    function addIframeOverlays(event) {
-        //e.preventDefault();
-
-        var i = 0;
-        $(".widget").each(function () {
-            var W = $(this).outerWidth(),
-                H = $(this).outerHeight(),
-                X = $(this).position().left,
-                Y = $(this).position().top;
-
-            $(this).after('<div class="iframe-overlay" onclick="rave.layout.hideWidgetMenu()" />');
-            $(this).next('.iframe-overlay').css({
-                width: W,
-                height: H,
-                position: "absolute",
-                top: Y,
-                left: X
-            });
-
-        });
-
-        // Remove any overlays onclick of all the things!!!
-        $("*:not(.dropdown-toggle)").on("click", function () {
-            $(".iframe-overlay").remove();
-        });
-    }
-
-    /**
-     * Submits the RPC call to move the widget to a new page
-     */
-    function moveWidgetToPage(regionWidgetId) {
-        var toPageId = $("#moveToPageId").val();
-        var args = { toPageId: toPageId,
-            regionWidgetId: regionWidgetId,
-            successCallback: function () {
-                rave.viewPage(toPageId);
-            }
-        };
-        // send the rpc request to move the widget to new page
-        rave.api.rpc.moveWidgetToPage(args);
-    }
-
-    /**
-     * Submits the RPC call to add a new page if form validation passes
-     */
-    function addPage() {
-        if (showImportExportUI) {
-            if ($pageFormTabbed.valid()) {
-                var newPageTitle = $("#tab_titleTabbed1").val();
-                var newPageLayoutCode = $("#pageLayoutTabbed").val();
-                // send the rpc request to create the new page
-                rave.api.rpc.addPage({pageName: newPageTitle,
-                    pageLayoutCode: newPageLayoutCode,
-                    errorLabel: 'pageFormErrorsTabbed1',
-                    successCallback: function (result) {
-                        rave.viewPage(result.result.id);
-                    }
-                });
+            if (moveAfterPageId != MOVE_PAGE_DEFAULT_POSITION_IDX) {
+                args["moveAfterPageId"] = moveAfterPageId;
             }
-        } else {
+
+            // send the rpc request to move the new page
+            rave.api.rpc.movePage(args);
+        }
+
+        function updatePage() {
             if ($pageForm.valid()) {
-                var newPageTitle = $tab_title_input.val();
-                var newPageLayoutCode = $page_layout_input.val();
-                // send the rpc request to create the new page
-                rave.api.rpc.addPage({pageName: newPageTitle,
-                    pageLayoutCode: newPageLayoutCode,
+                // send the rpc request to update the page
+                rave.api.rpc.updatePagePrefs({pageId: $tab_id.val(),
+                    title: $tab_title_input.val(),
+                    layout: $page_layout_input.val(),
                     errorLabel: 'pageFormErrors',
                     successCallback: function (result) {
-                        rave.viewPage(result.result.id);
+                        ravePortal.viewPage(result.result.id);
+                    },
+                    errorCallback: function (errorLabel) {
+                        $("#" + errorLabel).html(ravePortal.getClientMessage("page.duplicate_name"));
                     }
                 });
             }
         }
-    }
 
-    function importPage() {
-        if ($.browser.msie == true) {
-            alert(rave.getClientMessage("import.page.not.supported"));
-        }
-        else {
-            if ($pageFormImport.valid()) {
-                $pageFormImport.get(0).setAttribute('action', rave.getContext() + "api/rpc/page/import/omdl");
-                document.getElementById('pageFormImport').onsubmit = function () {
-                    document.getElementById('pageFormImport').target = 'file_upload_frame';
-                    document.getElementById("file_upload_frame").onload = processFileUploadResult;
-                }
-                $pageFormImport.submit();
-            }
+        function closePageDialog() {
+            $pageForm[0].reset();
+            $tab_id.val('');
+            $("#pageFormErrors").text('');
+            $("#pageMenuDialog").modal("hide");
         }
-    }
 
-    function processFileUploadResult() {
-        // chrome & firefox a <pre> has been added to the begining of the json
-        var ret = frames['file_upload_frame'].document.getElementsByTagName("body")[0].firstChild.innerHTML;
-        var data = eval("(" + ret + ")");
-        if (data.error) {
-            if (data.errorCode == 'DUPLICATE_ITEM') {
-                $("#pageFormErrorsTabbed2").html(rave.getClientMessage("page.duplicate_name"));
-            }
-            else if (data.errorCode == 'INTERNAL_ERROR' && data.errorMessage.indexOf("BadOmdlXmlFormatException") != -1) {
-                var msg = data.errorMessage.substr(data.errorMessage.indexOf("BadOmdlXmlFormatException"), data.errorMessage.length)
-                $("#pageFormErrorsTabbed2").html(msg);
-            }
-            else {
-                alert(rave.getClientMessage("api.rpc.error.internal"));
-            }
+        function closePageDialogTabbed() {
+            $pageForm[0].reset();
+            $("#pageFormErrors").text('');
+            $("#pageFormErrorsTabbed1").text('');
+            $("#pageFormErrorsTabbed2").text('');
+            $pageFormTabbed[0].reset();
+            $pageFormImport[0].reset();
+            $("#pageMenuDialogTabbed").modal("hide");
         }
-        else {
-            rave.viewPage(data.result.id);
-        }
-    }
 
-    function addOrImportPage() {
-        var selectedTab = $("#page-tabs").tabs('option', 'selected');
-        if (selectedTab == 0) {
-            addPage();
-        } else {
-            importPage();
-        }
-    }
-
-    /**
-     * Submits the RPC call to move the page to a new render sequence
-     */
-    function movePage() {
-        var moveAfterPageId = $("#moveAfterPageId").val();
-        var args = { pageId: $("#currentPageId").val(),
-            successCallback: function (result) {
-                rave.viewPage(result.result.id);
-            }
-        };
-
-        if (moveAfterPageId != MOVE_PAGE_DEFAULT_POSITION_IDX) {
-            args["moveAfterPageId"] = moveAfterPageId;
+        /**
+         * Returns the pageId of the currently viewed page
+         */
+        function getCurrentPageId() {
+            return rave.getPage().id
         }
 
-        // send the rpc request to move the new page
-        rave.api.rpc.movePage(args);
-    }
-
-    function updatePage() {
-        if ($pageForm.valid()) {
-            // send the rpc request to update the page
-            rave.api.rpc.updatePagePrefs({pageId: $tab_id.val(),
-                title: $tab_title_input.val(),
-                layout: $page_layout_input.val(),
-                errorLabel: 'pageFormErrors',
-                successCallback: function (result) {
-                    rave.viewPage(result.result.id);
-                }});
+        /**
+         * Determines if the widget should be rendered as part of the initial page view.  This can be used to help optimize
+         * page loads as widgets located on non-active sub pages will not be rendered initially.  The function will return
+         * false if one of the following criteria is met, and true otherwise:
+         *
+         * 1) the widget is on a top level page (not a sub page)
+         * 2) the widget is on a sub page that is currently requested in the URL via the hash tag
+         *    ie /app//person/canoniocal#My%20Activity
+         * 3) the widget is on the default sub page and the page request URL doesn't contain a sub-page hash tag
+         *    ie /app/person/canonical
+         *
+         * @return boolean
+         */
+        function isWidgetOnHiddenTab(widget) {
+            var hash = decodeURIComponent(location.hash);
+            var subPage = widget.subPage;
+            return !(subPage.id === null ||
+                ("#" + subPage.name) === hash ||
+                (hash === "" && subPage.isDefault));
         }
-    }
 
-    function closePageDialog() {
-        $pageForm[0].reset();
-        $tab_id.val('');
-        $("#pageFormErrors").text('');
-        $("#pageMenuDialog").modal("hide");
-    }
-
-    function closePageDialogTabbed() {
-        $pageForm[0].reset();
-        $("#pageFormErrors").text('');
-        $("#pageFormErrorsTabbed1").text('');
-        $("#pageFormErrorsTabbed2").text('');
-        $pageFormTabbed[0].reset();
-        $pageFormImport[0].reset();
-        $("#pageMenuDialogTabbed").modal("hide");
-    }
-
-    /**
-     * Invokes the RPC call to delete a regionWidget from a page
-     *
-     * @param regionWidgetId the regionWidgetId to delete
-     */
-    function deleteRegionWidget(regionWidgetId) {
-        if (confirm(rave.getClientMessage("widget.remove_confirm"))) {
-            rave.api.rpc.removeWidget({
-                regionWidgetId: regionWidgetId,
-                successCallback: function () {
-                    // remove the widget from the dom and the internal memory map
-                    $("#widget-" + this.regionWidgetId + "-wrapper").remove();
-                    rave.removeWidgetFromMap(this.regionWidgetId);
-                    if (rave.isPageEmpty()) {
-                        rave.displayEmptyPageMessage();
-                    }
-                }
-            });
+        function init(){
+            pageMenu.init(rave.getExportEnabled());
         }
-    }
 
-    /**
-     * Returns the pageId of the currently viewed page
-     */
-    function getCurrentPageId() {
-        return $("#currentPageId").val();
-    }
-
-    /**
-     * Determines if the widget should be rendered as part of the initial page view.  This can be used to help optimize
-     * page loads as widgets located on non-active sub pages will not be rendered initially.  The function will return
-     * false if one of the following criteria is met, and true otherwise:
-     *
-     * 1) the widget is on a top level page (not a sub page)
-     * 2) the widget is on a sub page that is currently requested in the URL via the hash tag
-     *    ie /app//person/canoniocal#My%20Activity
-     * 3) the widget is on the default sub page and the page request URL doesn't contain a sub-page hash tag
-     *    ie /app/person/canonical
-     *
-     * @return boolean
-     */
-    function isWidgetOnHiddenTab(widget) {
-        var hash = decodeURIComponent(location.hash);
-        var subPage = widget.subPage;
-        return !(subPage.id === null ||
-            ("#" + subPage.name) === hash ||
-            (hash === "" && subPage.isDefault));
-    }
-
-    /***
-     * initializes the rave.layout namespace code
-     */
-    function init(showImportExport) {
-        pageMenu.init(showImportExport);
-        //widgetMenu.init();
-        // initialize the bootstrap dropdowns
-        $(".dropdown-toggle").dropdown();
-    }
-
-    // public rave.layout API
-    return {
-        init: init,
-        getCurrentPageId: getCurrentPageId,
-        hideWidgetMenu: widgetMenu.hide,
-        deleteRegionWidget: deleteRegionWidget,
-        enableEditPrefsMenuItem: widgetMenu.enableEditPrefsMenuItem,
-        bindWidgetMenu: widgetMenu.bindWidgetMenu,
-        addPage: addPage,
-        addOrImportPage: addOrImportPage,
-        updatePage: updatePage,
-        movePage: movePage,
-        importPage: importPage,
-        closePageDialog: closePageDialog,
-        closePageDialogTabbed: closePageDialogTabbed,
-        moveWidgetToPage: moveWidgetToPage,
-        isWidgetOnHiddenTab: isWidgetOnHiddenTab,
-        addIframeOverlays: addIframeOverlays
-    };
-})();
+        rave.registerOnInitHandler(init);
+
+        // public rave.layout API
+        return {
+            addPage: addPage,
+            addOrImportPage: addOrImportPage,
+            updatePage: updatePage,
+            movePage: movePage,
+            importPage: importPage,
+            closePageDialog: closePageDialog,
+            closePageDialogTabbed: closePageDialogTabbed,
+            moveWidgetToPage: moveWidgetToPage,
+            isWidgetOnHiddenTab: isWidgetOnHiddenTab
+        };
+    })

Modified: rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_models.js
URL: http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_models.js?rev=1503074&r1=1503073&r2=1503074&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_models.js (original)
+++ rave/trunk/rave-portal-resources/src/main/webapp/static/script/portal/rave_models.js Sun Jul 14 22:55:06 2013
@@ -17,21 +17,18 @@
  * under the License.
  */
 
-var rave = rave || {};
-
-rave.models = (function () {
-
+define(["underscore", "portal/rave_backbone", "portal/rave_portal", "rave"], function(_, raveBackbone, ravePortal, rave){
     /*
      User model. Further implementation pending.
      */
-    var User = rave.Model.extend({
+    var User = raveBackbone.Model.extend({
 
     });
 
     /*
      Collection of users. Currently used for the share page users search.
      */
-    var Users = rave.Collection.extend({
+    var Users = raveBackbone.Collection.extend({
         model: User,
         pageSize: 10,
 
@@ -55,7 +52,11 @@ rave.models = (function () {
             this.searchTerm = term;
 
             if (this.searchTerm) {
-                rave.api.rpc.searchUsers({searchTerm: this.searchTerm, offset: 0, successCallback: this.parse });
+                rave.api.rpc.searchUsers({searchTerm: this.searchTerm,
+                    offset: 0,
+                    successCallback: this.parse,
+                    alertEmptySearch: function(){alert(ravePortal.getClientMessage("api.rpc.empty.search.term"));}
+                });
             }
             else {
                 rave.api.rpc.getUsers({offset: 0, successCallback: this.parse });
@@ -70,7 +71,11 @@ rave.models = (function () {
             offset *= this.pageSize;
 
             if (this.searchTerm) {
-                rave.api.rpc.searchUsers({searchTerm: this.searchTerm, offset: offset, successCallback: this.parse });
+                rave.api.rpc.searchUsers({searchTerm: this.searchTerm,
+                    offset: offset,
+                    successCallback: this.parse,
+                    alertEmptySearch: function(){alert(ravePortal.getClientMessage("api.rpc.empty.search.term"));}
+                });
             }
             else {
                 rave.api.rpc.getUsers({offset: offset, successCallback: this.parse });
@@ -120,17 +125,12 @@ rave.models = (function () {
     /*
      Page model. Used for managing most of the sharing functionality.
      */
-    var Page = rave.Model.extend({
+    var Page = raveBackbone.Model.extend({
 
         defaults: {
             members: {}
         },
 
-        /*
-         TODO: currently this is used to silently bootstrap the page model from the page view. Once
-         the jsp views are lightened up we should be able to provide a full representation of the page
-         model to pass to .set() and this should not be needed.
-         */
         addInitData: function (userId, isEditor) {
             var members = this.get('members');
 
@@ -175,7 +175,6 @@ rave.models = (function () {
                     /*
                      The model does not manage or care about views. Instead it fires events
                      that views can subscribe to for ui representation.
-                     TODO: solidify and document eventing model
                      */
                     self.trigger('share', 'member:add', userId);
                 }
@@ -250,11 +249,6 @@ rave.models = (function () {
             rave.api.rpc.clonePageForUser({pageId: this.get('id'), userId: userId, pageName: pageName,
                 successCallback: function(result){
                     if(result.error) {
-                        /*
-                         TODO: this is a weird error handling condition used by clone to catch duplicate
-                         named pages. Firing an event and letting the view handle for now, but the api
-                         should be managing errors better.
-                         */
                         return self.trigger('error', result.errorCode, userId);
                     }
                     self.trigger('share', 'clone', userId);
@@ -290,7 +284,4 @@ rave.models = (function () {
         currentPage: new Page(),
         users: new Users()
     }
-
-})();
-
-
+})