[fusion-commits] r1900 - trunk/lib

svn_fusion at osgeo.org svn_fusion at osgeo.org
Fri Sep 18 13:46:30 EDT 2009


Author: pagameba
Date: 2009-09-18 13:46:29 -0400 (Fri, 18 Sep 2009)
New Revision: 1900

Modified:
   trunk/lib/ApplicationDefinition.js
Log:
Add support for a new container type, multi, which puts items into a Jx.Button.Multi.  This is an alternative to menus with some slightly different behaviour.

Modified: trunk/lib/ApplicationDefinition.js
===================================================================
--- trunk/lib/ApplicationDefinition.js	2009-09-18 03:49:57 UTC (rev 1899)
+++ trunk/lib/ApplicationDefinition.js	2009-09-18 17:46:29 UTC (rev 1900)
@@ -1,1067 +1,1134 @@
-/**
- * Fusion.Lib.ApplicationDefinition
- *
- * $Id$
- *
- * Copyright (c) 2007, DM Solutions Group Inc.
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-/****************************************************************************
- * Class: Fusion.Lib.ApplicationDefinition
- *
- * Utility class to parse an application definition
- *
- */
-
-Fusion.Lib.ApplicationDefinition = OpenLayers.Class({
-    /**
-     * Property: mapGroups
-     * 
-     * array of map groups, parsed from ApplicationDefinition.  A MapGroup 
-     * consists of one or more Maps that can be combined into the same
-     * OpenLayers Map object
-     */
-    mapGroups: null,
-    
-    /**
-     * Property: widgetSets
-     *
-     * array of widget sets (each one corresponding to a map) parsed
-     * from the ApplicationDefinition.
-     */
-    widgetSets: null,
-    
-    /**
-     * Property: {Object} oBroker
-     *
-     * A Broker object that can communicate with a MapGuide instance
-     * in the case we are running against a MapGuide server
-     */
-    oBroker: null,
-    
-    /**
-     * Property: {Array} searchDefinitions
-     *
-     * An array of search definitions
-     */
-    searchDefinitions: null,
-    
-    /**
-     * Property: {Array} searchCategories
-     *
-     * An array of search categories
-     */
-    searchCategories: null,
-    
-    /**
-     * Constructor: ApplicationDefinition
-     *
-     * construct a new instance of the ApplicationDefinition object.  While
-     * not enforced, this is intended to be a singleton.
-     *
-     * Parameter: sessionId
-     *
-     * an optional session id to initialize the application with, passed to
-     * the map widgets when they are created.
-     */
-     
-    initialize: function(sessionId) {   
-        //console.log('ApplicationDefinition initialize');
-        this.sessionId = sessionId;
-        this.oBroker = Fusion.getBroker();
-        this.applicationDefinition =  Fusion.getApplicationDefinitionURL();
-        
-        this.widgetSets = [];
-        this.mapGroups = {};
-        this.searchDefinitions = [];
-        this.searchCategories = [];
-        this.parse();
-    },
-    
-    /**
-     * Function: parse
-     *
-     * start parsing the ApplicationDefinition file.  This happens
-     * asynchronously since the ApplicationDefinition has to be
-     * retrieved from the server or the MapGuide repository.  When
-     * parsing is complete, an APPLICATIONDEFINITION_PARSED event
-     * will be emitted.  This function returns true if parsing
-     * will start, false if it will not (due to a missing
-     * application definition for instance).
-     */
-    parse : function() {
-        if (this.applicationDefinition == '') {
-            //TODO: emit an error
-            return null;
-        }
-        /* if the application definition is not in the mapguide server, 
-           just load the xml*/
-        
-        if ( (this.applicationDefinition.match('Library://') == null) &&
-             (this.applicationDefinition.match('Session:') == null) ) {
-            if (Fusion.appDefJson) {
-                this.parseAppDef(Fusion.appDefJson);
-            } else {
-                Fusion.getXmlAsJson(this.applicationDefinition, 
-                              OpenLayers.Function.bind(this.getAppDefCB, this));
-            }
-        } else {
-          //these need to be called via setTimeout so that the execution thread
-          //is broken in IE and so that the ApplicationDefinition constructor
-          //will return a valid object to Fusion in loadConfig before the loadState
-          //gets incremented.
-            if (!this.sessionId) {
-              window.setTimeout(OpenLayers.Function.bind(this.createSessionThenGetAppDef,this),5);
-            } else {
-              window.setTimeout(OpenLayers.Function.bind(this.getAppDef,this),5);
-            }
-        }
-        return true;
-    },
-    
-    createSessionThenGetAppDef: function() {
-      var r = new Fusion.Lib.MGRequest.MGCreateSession();
-      this.oBroker.dispatchRequest(r, OpenLayers.Function.bind(this.createSessionThenGetAppDefCB, this));
-    },
-    
-    createSessionThenGetAppDefCB : function(xhr) {
-      if (xhr && typeof(xhr) == "object" && xhr.responseText) { 
-        this.sessionId = xhr.responseText; 
-        Fusion.sessionId = this.sessionId; 
-      }
-      this.getAppDef();
-    },
+/**
+ * Fusion.Lib.ApplicationDefinition
+ *
+ * $Id$
+ *
+ * Copyright (c) 2007, DM Solutions Group Inc.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/****************************************************************************
+ * Class: Fusion.Lib.ApplicationDefinition
+ *
+ * Utility class to parse an application definition
+ *
+ */
+
+Fusion.Lib.ApplicationDefinition = OpenLayers.Class({
+    /**
+     * Property: mapGroups
+     * 
+     * array of map groups, parsed from ApplicationDefinition.  A MapGroup 
+     * consists of one or more Maps that can be combined into the same
+     * OpenLayers Map object
+     */
+    mapGroups: null,
+    
+    /**
+     * Property: widgetSets
+     *
+     * array of widget sets (each one corresponding to a map) parsed
+     * from the ApplicationDefinition.
+     */
+    widgetSets: null,
+    
+    /**
+     * Property: {Object} oBroker
+     *
+     * A Broker object that can communicate with a MapGuide instance
+     * in the case we are running against a MapGuide server
+     */
+    oBroker: null,
+    
+    /**
+     * Property: {Array} searchDefinitions
+     *
+     * An array of search definitions
+     */
+    searchDefinitions: null,
+    
+    /**
+     * Property: {Array} searchCategories
+     *
+     * An array of search categories
+     */
+    searchCategories: null,
+    
+    /**
+     * Constructor: ApplicationDefinition
+     *
+     * construct a new instance of the ApplicationDefinition object.  While
+     * not enforced, this is intended to be a singleton.
+     *
+     * Parameter: sessionId
+     *
+     * an optional session id to initialize the application with, passed to
+     * the map widgets when they are created.
+     */
+     
+    initialize: function(sessionId) {   
+        //console.log('ApplicationDefinition initialize');
+        this.sessionId = sessionId;
+        this.oBroker = Fusion.getBroker();
+        this.applicationDefinition =  Fusion.getApplicationDefinitionURL();
+        
+        this.widgetSets = [];
+        this.mapGroups = {};
+        this.searchDefinitions = [];
+        this.searchCategories = [];
+        this.parse();
+    },
+    
+    /**
+     * Function: parse
+     *
+     * start parsing the ApplicationDefinition file.  This happens
+     * asynchronously since the ApplicationDefinition has to be
+     * retrieved from the server or the MapGuide repository.  When
+     * parsing is complete, an APPLICATIONDEFINITION_PARSED event
+     * will be emitted.  This function returns true if parsing
+     * will start, false if it will not (due to a missing
+     * application definition for instance).
+     */
+    parse : function() {
+        if (this.applicationDefinition == '') {
+            //TODO: emit an error
+            return null;
+        }
+        /* if the application definition is not in the mapguide server, 
+           just load the xml*/
+        
+        if ( (this.applicationDefinition.match('Library://') == null) &&
+             (this.applicationDefinition.match('Session:') == null) ) {
+            if (Fusion.appDefJson) {
+                this.parseAppDef(Fusion.appDefJson);
+            } else {
+                Fusion.getXmlAsJson(this.applicationDefinition, 
+                              OpenLayers.Function.bind(this.getAppDefCB, this));
+            }
+        } else {
+          //these need to be called via setTimeout so that the execution thread
+          //is broken in IE and so that the ApplicationDefinition constructor
+          //will return a valid object to Fusion in loadConfig before the loadState
+          //gets incremented.
+            if (!this.sessionId) {
+              window.setTimeout(OpenLayers.Function.bind(this.createSessionThenGetAppDef,this),5);
+            } else {
+              window.setTimeout(OpenLayers.Function.bind(this.getAppDef,this),5);
+            }
+        }
+        return true;
+    },
+    
+    createSessionThenGetAppDef: function() {
+      var r = new Fusion.Lib.MGRequest.MGCreateSession();
+      this.oBroker.dispatchRequest(r, OpenLayers.Function.bind(this.createSessionThenGetAppDefCB, this));
+    },
+    
+    createSessionThenGetAppDefCB : function(xhr) {
+      if (xhr && typeof(xhr) == "object" && xhr.responseText) { 
+        this.sessionId = xhr.responseText; 
+        Fusion.sessionId = this.sessionId; 
+      }
+      this.getAppDef();
+    },
 	
 
-    getAppDef: function(){ 
-      var r = new Fusion.Lib.MGRequest.MGGetResourceContent(this.applicationDefinition); 
-      r.parameters.session = this.sessionId; 
-      r.parameters.format = 'application/json'; 
-      this.oBroker.dispatchRequest(r, 
-              OpenLayers.Function.bind(this.getAppDefCB, this)); 
-    },
-
-    getAppDefCB: function(xhr) {
-        var o;
-        eval("o="+xhr.responseText);
-        this.parseAppDef(o);
-        Fusion.setLoadState(Fusion.LOAD_WIDGETS);
-    },
-
-    /**
-     * Function: parseAppDef
-     *
-     * parse the ApplicationDefinition file into the appropriate Fusion objects
-     *
-     * Parameter: {XmlHttpRequest} xhr
-     *
-     * the XmlHttpRequest object
-     */
-    parseAppDef: function(json) {
-        var appDef = json.ApplicationDefinition;
-
-        /* Set the application title */
-        if (appDef.Title) {
-            var title = appDef.Title[0];
-            document.title = title;
-        }
-
-        /* process Map nodes */
-        if (appDef.MapSet) {
-            var mapSet = appDef.MapSet[0];
-            if (mapSet.MapGroup instanceof Array) {
-                for (var i=0; i<mapSet.MapGroup.length; i++) {
-                    var mapGroup = new Fusion.Lib.ApplicationDefinition.MapGroup(mapSet.MapGroup[i]);
-                    this.mapGroups[mapGroup.mapId] = mapGroup;
-                }
-            }
-        } else {
-          Fusion.reportError(new Fusion.Error(Fusion.Error.FATAL, 
-                        OpenLayers.i18n('appDefParseError')));
-        }
-        
-        /* process WIDGET sets */
-        if (appDef.WidgetSet) {
-            for (var i=0; i<appDef.WidgetSet.length; i++) {
-                var widgetSet = new Fusion.Lib.ApplicationDefinition.WidgetSet(appDef.WidgetSet[i]);
-                this.widgetSets.push(widgetSet);
-            }
-        } else {
-          Fusion.reportError(new Fusion.Error(Fusion.Error.FATAL, 
-                      OpenLayers.i18n('widgetSetParseError')));
-        }
-        
-        /* process extensions */
-        if (appDef.Extension) {
-            var extension = appDef.Extension[0];
-            /* process search definitions */
-            if (extension.SearchDefinitions instanceof Array) {
-                var categories = extension.SearchDefinitions[0];
-                if (categories.SearchCategory instanceof Array) {
-                    for (var i=0; i<categories.SearchCategory.length; i++) {
-                        var oCategory = {};
-                        var category = categories.SearchCategory[i];
-                        oCategory.id = category['@id'];
-                        oCategory.name = category['@name'];
-                        oCategory.layer = category.Layer ? category.Layer[0] : '';
-                        oCategory.searchDefinitions = [];
-                        this.searchCategories[oCategory.id] = oCategory;
-                        var defns = category.SearchDefinition;
-                        for (var k=0; k<defns.length; k++) {
-                            var defn = new Fusion.Lib.ApplicationDefinition.SearchDefinition(defns[k]);
-                            defn.category = oCategory;
-                            oCategory.searchDefinitions[defn.id] = defn;
-                            this.searchDefinitions[defn.id] = defn;
-                        }
-                    }
-                }
-            }
-            
-        }
-    },
-    
-    /**
-     * Function: create
-     *
-     * Create the application definition.  This actually triggers initializing
-     * every widget and container.
-     */
-    create: function() {
-        for (var i=0; i<this.widgetSets.length; i++) {
-            this.widgetSets[i].create(this);
-        }
-    },
-    
-    /**
-     * Function: getMapByName
-     *
-     * return a map widget with the given name
-     *
-     * Parameter: {String} name
-     *
-     * The map name to return
-     *
-     * Returns: {Object} a map object or null if not found.
-     */
-    getMapByName : function(name) {
-        var map = null;
-        for (var i=0; i<this.widgetSets.length; i++) {
-            map = this.widgetSets[i].getMapByName(name);
-            if (map) {
-                break;
-            }
-        }
-        return map;
-    },
-    
-    /**
-     * Function: getMapById
-     *
-     * return a map widget with the given id
-     *
-     * Parameter: {String} id
-     *
-     * The map id to return.  ID is distinct from map.name in that id is the 
-     * id of the HTML tag where the map widget is inserted.
-     *
-     * Returns: {Object} a map object or null if not found.
-     */
-    getMapById : function(id) {
-        var map = null;
-        for (var i=0; i<this.widgetSets.length; i++) {
-            map = this.widgetSets[i].mapWidget;
-            if (map.mapId == id) {
-                break;
-            }
-        }
-        return map;
-    },
-    
-    /**
-     * Function: getMapByIndice
-     *
-     * return the map widget at the given index
-     *
-     * Parameter: {String} indice
-     *
-     * The map indice to return
-     *
-     * Returns: {Object} a map object or null if not found.
-     */
-     getMapByIndice : function(indice) {
-         var map = null;
-         if (this.widgetSets.length > indice) {
-             map = this.widgetSets[indice].getMapWidget();
-         }
-         return map;
-     },
-     
-    /**
-     * Function: getMapGroup
-     *
-     * return the specified map group from the application definition
-     *
-     * Parameter: {String} mapgroup
-     *
-     * The id of the MapGroup to return
-     *
-     * Returns: {Object} a MapGroup appdef or null if not found.
-     */
-     getMapGroup : function(mapGroupId) {
-         return this.mapGroups[mapGroupId];
-     },
-     
-     /**
-      * Function getWidgetsByType
-      *
-      * returns an array of widgets by type.
-      *
-      * Parameter: {String} type
-      *
-      * the type of widget to get references to
-      *
-      * Returns: {Array} an array of widgets, which may be empty
-      */
-     getWidgetsByType: function(type) {
-         var widgets = [];
-         for (var i=0; i<this.widgetSets.length; i++) {
-             widgets = widgets.concat(this.widgetSets[i].getWidgetsByType(type));
-         }
-         return widgets;
-     }
-});
-
-/****************************************************************************
- * Class: Fusion.Lib.ApplicationDefinition.MapGroup
- *
- * Holds an internal representation of MapGroup objects as defined in the AppDef
- *
- */
-
-Fusion.Lib.ApplicationDefinition.MapGroup = OpenLayers.Class({
-    initialView: null,
-    maps: null,
-    
-    initialize: function(jsonNode) {
-        this.mapId = jsonNode['@id'][0];
-        this.maps = [];
-        /* parse InitialView */
-        if (jsonNode.InitialView) {
-            var iv = jsonNode.InitialView[0];
-            if (iv.CenterX && iv.CenterY && iv.Scale) {
-                this.setInitialView({x:parseFloat(iv.CenterX[0]),
-                                     y:parseFloat(iv.CenterY[0]),
-                                     scale:parseFloat(iv.Scale[0])});
-            } else if (iv.MinX && iv.MinY && iv.MaxX && iv.MaxY) {
-                this.setInitialView({minX:parseFloat(iv.MinX[0]),
-                                     minY:parseFloat(iv.MinY[0]),
-                                     maxX:parseFloat(iv.MaxX[0]),
-                                     maxY:parseFloat(iv.MaxY[0])});
-            } else {
-                //TODO: emit warning that the initial view was incomplete
-            }
-        }
-        /* parse maps */
-        if (jsonNode.Map instanceof Array) {
-            for (var i=0; i<jsonNode.Map.length; i++) {
-                var map = new Fusion.Lib.ApplicationDefinition.Map(jsonNode.Map[i]);
-                var links = {groups:[], layers:[]};
-                var mapEvents = {layerEvents:{},groupEvents:{}};
-                if (jsonNode.Map[i].Extension) {
-                    var extension = jsonNode.Map[i].Extension[0];
-                    if (extension.Links) {
-                        /* process Groups */
-                        if (extension.Links[0].Group instanceof Array) {
-                            for (var j=0; j<extension.Links[0].Group.length; j++) {
-                                var group = extension.Links[0].Group[j];
-                                links.groups.push({name:group.Name[0],url:group.Url[0]});
-                            }
-                        }
-                        if (extension.Links[0].Layer instanceof Array) {
-                            for (var j=0; j<extension.Links[0].Layer.length; j++) {
-                                var layer = extension.Links[0].Layer[j];
-                                links.layers.push({name:layer.Name[0],url:layer.Url[0]});
-                            }
-                        }
-                    }
-                    /* process layer events */
-                    //TODO: Should this be called MapEvents?
-                    if (extension.MapEvents) {
-                        if (extension.MapEvents[0].Layer instanceof Array) {
-                            for (var j=0; j<extension.MapEvents[0].Layer.length; j++) {
-                                var layer = extension.MapEvents[0].Layer[j];
-                                var layerObj = {};
-                                layerObj.name = layer.Name[0];
-                                layerObj.onEnable = [];
-                                if (layer.OnEnable instanceof Array) {
-                                    layerObj.onEnable = this.parseMapEventSubBlock(layer.OnEnable[0]);
-                                }
-                                layerObj.onDisable = [];
-                                if (layer.OnDisable instanceof Array) {
-                                    layerObj.onDisable = this.parseMapEventSubBlock(layer.OnDisable[0]);
-                                }
-                                mapEvents.layerEvents[layerObj.name] = layerObj;
-                            }
-                        }
-                        if (extension.MapEvents[0].Group instanceof Array) {
-                            for (var j=0; j<extension.MapEvents[0].Group.length; j++) {
-                                var group = extension.MapEvents[0].Group[j];
-                                var groupObj = {};
-                                groupObj.name = group.Name[0];
-                                groupObj.onEnable = [];
-                                if (layer.OnEnable instanceof Array) {
-                                    groupObj.onEnable = this.parseMapEventSubBlock(group.OnEnable[0]);
-                                }
-                                groupObj.onDisable = [];
-                                if (layer.OnDisable instanceof Array) {
-                                    groupObj.onDisable = this.parseMapEventSubBlock(group.OnDisable[0]);
-                                }
-                                mapEvents.groupEvents[groupObj.name] = groupObj;
-                            }
-                        }
-                    }
-                }
-                map.mapInfo = {links: links, mapEvents: mapEvents};
-                this.maps.push(map);
-            }
-        } else {
-            //TODO: do we need a warning that there are no layers in this map?
-        }
-    },
-    
-    parseMapEventSubBlock: function(block) {
-        var a = [];
-        if (block.Layer && block.Layer instanceof Array) {
-            for (var i=0; i<block.Layer.length; i++) {
-                var layer = block.Layer[i];
-                a.push({type: 'layer', name:layer.Name[0], enable: layer.Enable[0] == 'true' ? true : false});
-            }
-        }
-        if (block.Group && block.Group instanceof Array) {
-            for (var i=0; i<block.Group.length; i++) {
-                var group = block.Group[i];
-                a.push({type: 'group', name:group.Name[0], enable: group.Enable[0] == 'true' ? true : false});
-            }            
-        }
-        return a;
-    },
-    
-    getInitialView: function() {
-        return this.initialView;
-    },
-    
-    setInitialView: function(view) {
-        this.initialView = view;
-    }
-});
-
-/****************************************************************************
- * Class: Fusion.Lib.ApplicationDefinition.Map
- *
- * Holds an internal representation of Map objects as defined in the AppDef
- *
- */
-
-Fusion.Lib.ApplicationDefinition.Map = OpenLayers.Class({
-    type: null,
-    singleTile: false,
-    extension: null,
-    initialize: function(jsonNode) {
-        /* TODO: type can be any supported OpenLayers type */
-        this.type = jsonNode.Type[0];
-        if (jsonNode.SingleTile) {
-            var b = jsonNode.SingleTile[0].toLowerCase();
-            this.singleTile = (b == "true") ? true : false;
-        }
-        if (jsonNode.Extension) {
-            this.extension = jsonNode.Extension[0];
-        } else {
-            this.extension = {};
-        }
-        this.resourceId = this.extension.ResourceId ? this.extension.ResourceId[0] : '';
-        
-        var tagOptions = this.extension.Options;
-        this.layerOptions = {};
-        if (tagOptions && tagOptions[0]) {
-          for (var key in tagOptions[0]) {
-            this.layerOptions[key] = tagOptions[0][key][0];
-            if (this.layerOptions[key].toLowerCase() == 'true') {
-              this.layerOptions[key] = true;
-            } else if (this.layerOptions[key].toLowerCase() == 'false') {
-              this.layerOptions[key] = false;
-            }
-            if (key == 'maxExtent' || key == 'minExtent') {
-              this.layerOptions[key] = OpenLayers.Bounds.fromString(this.layerOptions[key]);
-            }
-          }
-        }
-        var tagParams = this.extension.Parameters;
-        this.layerParams = {};
-        if (tagParams && tagParams[0]) {
-          for (var key in tagParams[0]) {
-            this.layerParams[key] = tagParams[0][key][0];
-          }
-        }
-        
-        switch (this.type) {
-          case 'MapGuide':
-          case 'MapServer':
-            if ( !Fusion.Layers[this.type] ) {
-                  Fusion.require('layers/' + this.type + '/' + this.type + '.js');
-            }
-            break;
-          default:
-            if ( !Fusion.Layers.Generic ) {
-              Fusion.require('layers/Generic/Generic.js');
-            }
-            break;
-        }
-    }
-});
-
-/****************************************************************************
- * Class: Fusion.Lib.ApplicationDefinition.WidgetSet
- *
- * Holds an internal representation of WidgetSet objects as defined in the AppDef
- *
- */
-
-Fusion.Lib.ApplicationDefinition.WidgetSet = OpenLayers.Class({
-    containers: null,
-    containersByName: null,
-    widgetTags: null,
-    widgetTagsByName: null,
-    widgetInstances: null,
-    mapWidget: null,
-    mapId: null,
-    initialize: function(jsonNode) {
-        this.containers = [];
-        this.widgetTags = [];
-        this.widgetInstances = [];
-        this.widgetTagsByName = {};
-        this.containersByName = {};
-        /* process map widgets */
-        if (jsonNode.MapWidget) {
-            for (var i=0; i<jsonNode.MapWidget.length; i++) {
-                var widget = new Fusion.Lib.ApplicationDefinition.Widget(jsonNode.MapWidget[i]);
-                widget.widgetSet = this;
-                this.mapWidgetTag = widget;
-                this.mapId = jsonNode.MapWidget[i].MapId[0];
-            }
-        }
-        
-        /* process widgets */
-        if (jsonNode.Widget) {
-            for (var i=0; i<jsonNode.Widget.length; i++) {
-                var widget = new Fusion.Lib.ApplicationDefinition.Widget(jsonNode.Widget[i]);
-                widget.widgetSet = this;
-                this.widgetTags.push(widget);
-                this.widgetTagsByName[widget.name] = widget;
-            }
-        }
-        /* process containers */
-        if (jsonNode.Container) {
-            for (var i=0; i<jsonNode.Container.length; i++) {
-                var container = new Fusion.Lib.ApplicationDefinition.Container(jsonNode.Container[i]);
-                this.containers.push(container);
-                this.containersByName[container.name] = container;
-            }
-        }
-        
-    },
-    
-    /**
-     * Function: addWidgetInstance
-     *
-     * keep track of live widgets created in this widgetSet
-     *
-     * Parameter: {<Fusion.Widget>} widget
-     *
-     * the widget to add
-     */
-    addWidgetInstance: function(widget) {
-        this.widgetInstances.push(widget);
-    },
-    
-    /**
-     * Function: getMapWidget
-     *
-     * return the map widget for this widget set
-     *
-     * Returns: {<Fusion.Lib.Map>} a map widget or null
-     */
-    getMapWidget: function() {
-        return this.mapWidget;
-    },
-    
-    /**
-     * Function: create
-     *
-     * create all the things required by this widgetSet, including
-     * containers and widgets.
-     *
-     * Parameter: {<Fusion.Lib.ApplicationDefinition>} 
-     *
-     * the application definition that this widgetSet is part of
-     */
-    create: function(appDef) {
-
-        //allow over-ride of mapId via URL parameter
-        var mapGroup = null;
-        var paramMapId = Fusion.getQueryParam('mapid');
-        if (paramMapId.length>0) {
-          mapGroup = appDef.getMapGroup(paramMapId);
-          if (mapGroup) {
-            this.mapId = paramMapId;
-          } else {
-            Fusion.reportError(new Fusion.Error(Fusion.Error.WARNING, 
-              "can't find MapGroup: " + paramMapId + ' - reverting to default map'));
-          }
-        }
-        
-        if (!mapGroup) {
-          mapGroup = appDef.getMapGroup(this.mapId);
-        }
-        
-        //create the Map widget for this WidgetSet
-        this.mapWidget = new Fusion.Widget.Map(this.mapWidgetTag,mapGroup,this);
-        this.mapWidget.setMenu();
-        $(this.mapWidgetTag.name).widget = this.mapWidget;
-
-        //create all the other widgets for the widget set
-        for (var i=0; i<this.widgetTags.length; i++) {
-            this.widgetTags[i].create(this);
-        }
-
-        //create all the containers for the widget set
-        for (var i=0; i<this.containers.length; i++) {
-            this.containers[i].create(this);
-        }
-    },
-    /**
-     * Function: getMapByName
-     *
-     * return the map widget from this widget set if the map's name
-     * matches the requested name, or null.
-     *
-     * Parameter: {String} name
-     *
-     * The map name to check
-     *
-     * Returns: {Object} a map object or null.
-     */
-    getMapByName : function(name) {
-        var map = null;
-        if (this.mapWidget.getMapName() == name) {
-            map = this.mapWidget;
-        }
-        return map;
-    },
-    
-    /**
-     * Function getWidgetsByType
-     *
-     * returns an array of widgets by type.
-     *
-     * Parameter: {String} type
-     *
-     * the type of widget to get references to
-     *
-     * Returns: {Array} an array of widgets, which may be empty
-     */
-    getWidgetsByType: function(type) {
-        var widgets = [];
-        for (var i=0; i<this.widgetInstances.length; i++) {
-            if (this.widgetInstances[i].type == type) {
-                widgets.push(this.widgetInstances[i]);
-            }
-        }
-        return widgets;
-    },
-    
-    getWidgetByName: function(name) {
-        return this.widgetTagsByName[name];
-    },
-    
-    getContainerByName: function(name) {
-        return this.containersByName[name];
-    }
-});
-
-/****************************************************************************
- * Class: Fusion.Lib.ApplicationDefinition.Container
- *
- * Holds an internal representation of Container objects as defined in the AppDef
- *
- */
-
-Fusion.Lib.ApplicationDefinition.Container = OpenLayers.Class({
-    name: null,
-    type: null,
-    validPositions: ['top', 'left', 'bottom', 'right'],
-    position: 'top',
-    items: null,
-    initialize: function(jsonNode) {
-        this.type = jsonNode.Type[0];
-        this.name = jsonNode.Name[0];
-        var position = jsonNode.Position ? jsonNode.Position[0].toLowerCase() : this.position;
-        for (var i=0; i<this.validPositions.length; i++) {
-            if (this.validPositions[i] == position) {
-                this.position = position;
-                break;
-            }
-        }
-        this.items = [];
-        if (jsonNode.Item) {
-            for (var i=0; i<jsonNode.Item.length; i++) {
-                var item = new Fusion.Lib.ApplicationDefinition.Item(jsonNode.Item[i]);
-                this.items.push(item);
-            }
-        } else {
-            //TODO: is this a problem if there are no items?
-        }
-    },
-    
-    create: function(widgetSet) {
-        var container;
-        if (this.type == 'Toolbar' || this.type == 'Statusbar') {
-            if ($(this.name)) {
-                container = new Jx.Toolbar({parent: this.name, position: this.position});
-                $(this.name).container = container;
-                this.createWidgets(widgetSet, container);
-            }
-        } else if (this.type == 'Splitterbar') {
-            if ($(this.name)) {
-                container = new Jx.Splitter(this.name, {splitInto: this.items.length});
-                for (var i=0; i<this.items.length; i++) {
-                    container.elements[i].id = this.name + '_' + i;
-                }
-                $(this.name).container = container;
-                this.createWidgets(widgetSet, container);
-            }
-        }
-        if (container && container.domObj.jxLayout) {
-            container.domObj.jxLayout.resize({forceResize: true});
-        }
-    },
-    
-    createWidgets: function(widgetSet, container) {
-        for (var i=0; i<this.items.length; i++) {
-            this.items[i].create(widgetSet, container, this.name + '_' + i);
-        }
-    }
-    
-});
-
-/****************************************************************************
- * Class: Fusion.Lib.ApplicationDefinition.Widget
- *
- * Holds an internal representation of Widget objects as defined in the AppDef
- *
- */
-
-Fusion.Lib.ApplicationDefinition.Widget = OpenLayers.Class({
-    name: null,
-    type: null,
-    statusText: null,
-    location: null,
-    imageUrl: null,
-    imageClass: null,
-    tooltip: null,
-    label: null,
-    disabled: null,
-    extension: null,
-    initialize: function(jsonNode) {
-        if (jsonNode) {
-            this.type = jsonNode.Type[0];
-            this.name = jsonNode.Name ? jsonNode.Name[0] : '';
-            this.statusText = jsonNode.StatusText ? jsonNode.StatusText[0] : '';
-            this.statusText = OpenLayers.i18n(this.statusText);
-            //TODO: this may be an extension
-            this.location = jsonNode.Location ? jsonNode.Location[0] : 'widgets/';
-            if (this.location.slice(-1) != '/') {
-                this.location += '/';
-            }
-            this.imageUrl = jsonNode.ImageUrl ? jsonNode.ImageUrl[0] : '';
-            this.imageClass = jsonNode.ImageClass ? jsonNode.ImageClass[0] : '';
-            this.tooltip = jsonNode.Tooltip ? jsonNode.Tooltip[0] : '';
-            this.tooltip = OpenLayers.i18n(this.tooltip);
-            this.label = jsonNode.Label ? jsonNode.Label[0] : '';
-            this.label = OpenLayers.i18n(this.label);
-            this.disabled = jsonNode.Disabled ? (jsonNode.Disabled[0].toLowerCase() == 'true' ? true : false) : false;
-            
-            //console.log('Widget: ' + this.type + ', ' + this.name + ', ' + this.description);
-        
-            if (jsonNode.Extension) {
-                this.extension = jsonNode.Extension[0];
-            } else {
-                this.extension = {};
-            }
-            //require the widget code
-            if ( !Fusion.Widget[this.type] ) {
-              Fusion.require(this.location + this.type + '.js');
-            }
-        }
-    },
-    
-    getMapWidget: function() {
-        if (this.widgetSet) {
-            return this.widgetSet.getMapWidget();
-        } else {
-            return null;
-        }
-    },
-    
-    /**
-     * Function: create
-     *
-     * creates a new instance of the widget, optionally using a
-     * different name during instantiation to accomodate
-     * containers
-     *
-     * Parameter: name
-     *
-     * An optional name to use for the widget, overrides the
-     * original name temporarily if passed.
-     *
-     * Returns: an instance of the widget represented by this
-     * object.
-     */
-    create: function(widgetSet, widgetName) {
-        var widget = null;
-        this.widgetSet = widgetSet;
-        var oldName = this.name;
-        if (typeof widgetName == 'undefined') {
-            widgetName = this.name;
-        }
-        /* create the widget if the name is not null and the name
-         * is either an empty string (in the case of buttons in menus)
-         * or something exists in the dom with the right id
-         */
-        if (widgetName != null && (widgetName == '' || $(widgetName) != null)) {
-            this.name = widgetName;
-            widget = eval("new Fusion.Widget."+this.type+"(this)");
-            widgetSet.addWidgetInstance(widget);
-            if ($(this.name)) {
-                widget.id = this.name;
-                $(this.name).widget = widget;
-                if (widget.uiClass) {
-                    widget.setUiObject(new widget.uiClass({
-                        label: this.label,
-                        image: this.imageUrl,
-                        imageClass: this.imageClass,
-                        toggle: this.isExclusive
-                    }));
-                    if (widget.uiObj.addTo) {
-                        widget.uiObj.addTo($(this.name));
-                    }
-                    if (widget.uiObj.setEnabled) {
-                        widget.uiObj.setEnabled(widget.isEnabled());
-                        widget.registerForEvent(Fusion.Event.WIDGET_STATE_CHANGED, function() {
-                            widget.uiObj.setEnabled(widget.isEnabled());
-                        });
-                    }
-                }
-            }
-            this.name = oldName;
-        }
-        return widget;
-    }
-});
-
-/****************************************************************************
- * Class: Fusion.Lib.ApplicationDefinition.Item
- *
- * Holds an internal representation of Menu Item objects as defined in the AppDef
- *
- */
-
-Fusion.Lib.ApplicationDefinition.Item = OpenLayers.Class({
-    uniqueId: [0],
-    type: null,
-    initialize: function(jsonNode) {
-        this.type = jsonNode.Function[0];
-        switch(this.type) {
-            case 'Widget':
-                this.widgetName = jsonNode.Widget[0];
-                break;
-            case 'Flyout':
-                this.flyout = new Fusion.Lib.ApplicationDefinition.Flyout(jsonNode);
-                break;
-            case 'Separator':   
-                break;
-        }
-    },
-      
-    create: function(widgetSet, container, idx) {
-        switch(this.type) {
-            case 'Widget':
-                var widgetTag = widgetSet.getWidgetByName(this.widgetName);
-                if (widgetTag) {
-                    var name = 'FusionItem'+this.uniqueId[0];
-                    this.uniqueId[0]++;
-                    if (container instanceof Jx.Toolbar) {
-                        var widget = widgetTag.create(widgetSet, '');
-                        if (!widget.uiClass) {
-                            widget.uiClass = Jx.Toolbar.Item;
-                            widget.setUiObject(new widget.uiClass());
-                        } else if (widget.uiClass == Jx.Button || widget.uiClass == Jx.Button.Color || widget.uiClass == Jx.Menu) {
-                            widget.setUiObject(new widget.uiClass({
-                                label: widgetTag.label,
-                                image: widgetTag.imageUrl,
-                                imageClass: widgetTag.imageClass,
-                                toggle: widget.isExclusive
-                            }));                            
-                        }
-                        container.add(widget.uiObj);
-                        if (widget.uiObj.setEnabled) {
-                            widget.uiObj.setEnabled(widget.isEnabled());
-                            widget.registerForEvent(Fusion.Event.WIDGET_STATE_CHANGED, function() {
-                                widget.uiObj.setEnabled(widget.isEnabled());
-                            });
-                        }
-                    } else if (container instanceof Jx.Splitter) {
-                        var widget = widgetTag.create(widgetSet, idx);
-                    } else if (container instanceof Jx.Menu ||
-                               container instanceof Jx.Menu.Context ||
-                               container instanceof Jx.Menu.SubMenu) {
-                        var widget = widgetTag.create(widgetSet, '');
-                        if (!widget.uiClass || widget.uiClass == Jx.Button) {
-                            widget.uiClass = Jx.Menu.Item;
-                        } else if (widget.uiClass == Jx.Menu) {
-                            widget.uiClass = Jx.Menu.SubMenu;
-                        }
-                        widget.setUiObject(new widget.uiClass({
-                            label: widgetTag.label,
-                            image: widgetTag.imageUrl,
-                            imageClass: widgetTag.imageClass,
-                            toggle: widget.isExclusive
-                        }));
-                        container.add(widget.uiObj);
-                        if (widget.uiObj.setEnabled) {
-                            widget.uiObj.setEnabled(widget.isEnabled());
-                            widget.registerForEvent(Fusion.Event.WIDGET_STATE_CHANGED, function() {
-                                widget.uiObj.setEnabled(widget.isEnabled());
-                            });
-                        }
-                    }
-                } else {
-                  Fusion.reportError(new Fusion.Error(Fusion.Error.WARNING, 
-                    "can't find widget: " + this.widgetName));
-                 }
-                break;
-            case 'Flyout':
-                /* create a menu */
-                var menu;
-                var opt = {
-                    label: this.flyout.label,
-                    tooltip: this.flyout.tooltip,
-                    image: this.flyout.imageUrl,
-                    imageClass: this.flyout.imageClass
-                };
-                if (container instanceof Jx.Toolbar) {
-                    menu = new Jx.Menu(opt);
-                } else if (container instanceof Jx.Menu || 
-                           container instanceof Jx.Menu.Context || 
-                           container instanceof Jx.Menu.SubMenu) {
-                    menu = new Jx.Menu.SubMenu(opt);
-                }
-                container.add(menu);
-                this.flyout.create(widgetSet, menu);
-                
-                break;
-            case 'Separator':
-                if (container instanceof Jx.Toolbar) {
-                    container.add(new Jx.Toolbar.Separator());
-                } else if (container instanceof( Jx.Menu) || 
-                           container instanceof(Jx.Menu.SubMenu) ||
-                           container instanceof(Jx.Menu.Context)) {
-                    container.add(new Jx.Menu.Separator());
-                }
-                break;
-        }
-    }
-});
-
-/****************************************************************************
- * Class: Fusion.Lib.ApplicationDefinition.Flyout
- *
- * Holds an internal representation of Flyout objects as defined in the AppDef
- *
- */
-
-Fusion.Lib.ApplicationDefinition.Flyout = OpenLayers.Class({
-    label: null,
-    tooltip: null,
-    description: null,
-    imageUrl: null,
-    items: null,
-    
-    initialize: function(jsonNode) {
-        this.label = jsonNode.Label ? jsonNode.Label[0] : '';
-        this.tooltip = jsonNode.Tooltip ? jsonNode.Tooltip[0] : '';
-        this.description = jsonNode.Description ? jsonNode.Description[0] : '';
-        this.imageUrl = jsonNode.ImageUrl ? jsonNode.ImageUrl[0] : '';
-        this.items = [];
-        if (jsonNode.Item instanceof Array) {
-            for (var i=0; i<jsonNode.Item.length; i++) {
-                this.items.push(new Fusion.Lib.ApplicationDefinition.Item(jsonNode.Item[i]));
-            }
-        }
-    },
-    
-    create: function(widgetSet, menu) {
-        for (var i=0; i<this.items.length; i++) {
-            this.items[i].create(widgetSet, menu);
-        }
-    }
-    
-});
-
-/****************************************************************************
- * Class: Fusion.Lib.ApplicationDefinition.SearchDefinition
- *
- * Holds an internal representation of SearchDefinition objects as defined in the AppDef
- *
- */
-
-Fusion.Lib.ApplicationDefinition.SearchDefinition = OpenLayers.Class({
-    id: null,
-    name: null,
-    category: null,
-    parameters: null,
-    join: null,
-    rule: null,
-    
-    initialize: function(json) {
-        this.id = json['@id'];
-        this.name = json['@name'];
-        if (json.Join instanceof Array) {
-            this.join = new Fusion.Lib.ApplicationDefinition.SearchJoin(json.Join[0]);
-        }
-        this.parameters = [];
-        if (json.Parameter instanceof Array) {
-            for (var i=0; i<json.Parameter.length; i++) {
-                this.parameters.push(json.Parameter[i]['@name']);
-            }
-        }
+    getAppDef: function(){ 
+      var r = new Fusion.Lib.MGRequest.MGGetResourceContent(this.applicationDefinition); 
+      r.parameters.session = this.sessionId; 
+      r.parameters.format = 'application/json'; 
+      this.oBroker.dispatchRequest(r, 
+              OpenLayers.Function.bind(this.getAppDefCB, this)); 
+    },
+
+    getAppDefCB: function(xhr) {
+        var o;
+        eval("o="+xhr.responseText);
+        this.parseAppDef(o);
+        Fusion.setLoadState(Fusion.LOAD_WIDGETS);
+    },
+
+    /**
+     * Function: parseAppDef
+     *
+     * parse the ApplicationDefinition file into the appropriate Fusion objects
+     *
+     * Parameter: {XmlHttpRequest} xhr
+     *
+     * the XmlHttpRequest object
+     */
+    parseAppDef: function(json) {
+        var appDef = json.ApplicationDefinition;
+
+        /* Set the application title */
+        if (appDef.Title) {
+            var title = appDef.Title[0];
+            document.title = title;
+        }
+
+        /* process Map nodes */
+        if (appDef.MapSet) {
+            var mapSet = appDef.MapSet[0];
+            if (mapSet.MapGroup instanceof Array) {
+                for (var i=0; i<mapSet.MapGroup.length; i++) {
+                    var mapGroup = new Fusion.Lib.ApplicationDefinition.MapGroup(mapSet.MapGroup[i]);
+                    this.mapGroups[mapGroup.mapId] = mapGroup;
+                }
+            }
+        } else {
+          Fusion.reportError(new Fusion.Error(Fusion.Error.FATAL, 
+                        OpenLayers.i18n('appDefParseError')));
+        }
+        
+        /* process WIDGET sets */
+        if (appDef.WidgetSet) {
+            for (var i=0; i<appDef.WidgetSet.length; i++) {
+                var widgetSet = new Fusion.Lib.ApplicationDefinition.WidgetSet(appDef.WidgetSet[i]);
+                this.widgetSets.push(widgetSet);
+            }
+        } else {
+          Fusion.reportError(new Fusion.Error(Fusion.Error.FATAL, 
+                      OpenLayers.i18n('widgetSetParseError')));
+        }
+        
+        /* process extensions */
+        if (appDef.Extension) {
+            var extension = appDef.Extension[0];
+            /* process search definitions */
+            if (extension.SearchDefinitions instanceof Array) {
+                var categories = extension.SearchDefinitions[0];
+                if (categories.SearchCategory instanceof Array) {
+                    for (var i=0; i<categories.SearchCategory.length; i++) {
+                        var oCategory = {};
+                        var category = categories.SearchCategory[i];
+                        oCategory.id = category['@id'];
+                        oCategory.name = category['@name'];
+                        oCategory.layer = category.Layer ? category.Layer[0] : '';
+                        oCategory.searchDefinitions = [];
+                        this.searchCategories[oCategory.id] = oCategory;
+                        var defns = category.SearchDefinition;
+                        for (var k=0; k<defns.length; k++) {
+                            var defn = new Fusion.Lib.ApplicationDefinition.SearchDefinition(defns[k]);
+                            defn.category = oCategory;
+                            oCategory.searchDefinitions[defn.id] = defn;
+                            this.searchDefinitions[defn.id] = defn;
+                        }
+                    }
+                }
+            }
+            
+        }
+    },
+    
+    /**
+     * Function: create
+     *
+     * Create the application definition.  This actually triggers initializing
+     * every widget and container.
+     */
+    create: function() {
+        for (var i=0; i<this.widgetSets.length; i++) {
+            this.widgetSets[i].create(this);
+        }
+    },
+    
+    /**
+     * Function: getMapByName
+     *
+     * return a map widget with the given name
+     *
+     * Parameter: {String} name
+     *
+     * The map name to return
+     *
+     * Returns: {Object} a map object or null if not found.
+     */
+    getMapByName : function(name) {
+        var map = null;
+        for (var i=0; i<this.widgetSets.length; i++) {
+            map = this.widgetSets[i].getMapByName(name);
+            if (map) {
+                break;
+            }
+        }
+        return map;
+    },
+    
+    /**
+     * Function: getMapById
+     *
+     * return a map widget with the given id
+     *
+     * Parameter: {String} id
+     *
+     * The map id to return.  ID is distinct from map.name in that id is the 
+     * id of the HTML tag where the map widget is inserted.
+     *
+     * Returns: {Object} a map object or null if not found.
+     */
+    getMapById : function(id) {
+        var map = null;
+        for (var i=0; i<this.widgetSets.length; i++) {
+            map = this.widgetSets[i].mapWidget;
+            if (map.mapId == id) {
+                break;
+            }
+        }
+        return map;
+    },
+    
+    /**
+     * Function: getMapByIndice
+     *
+     * return the map widget at the given index
+     *
+     * Parameter: {String} indice
+     *
+     * The map indice to return
+     *
+     * Returns: {Object} a map object or null if not found.
+     */
+     getMapByIndice : function(indice) {
+         var map = null;
+         if (this.widgetSets.length > indice) {
+             map = this.widgetSets[indice].getMapWidget();
+         }
+         return map;
+     },
+     
+    /**
+     * Function: getMapGroup
+     *
+     * return the specified map group from the application definition
+     *
+     * Parameter: {String} mapgroup
+     *
+     * The id of the MapGroup to return
+     *
+     * Returns: {Object} a MapGroup appdef or null if not found.
+     */
+     getMapGroup : function(mapGroupId) {
+         return this.mapGroups[mapGroupId];
+     },
+     
+     /**
+      * Function getWidgetsByType
+      *
+      * returns an array of widgets by type.
+      *
+      * Parameter: {String} type
+      *
+      * the type of widget to get references to
+      *
+      * Returns: {Array} an array of widgets, which may be empty
+      */
+     getWidgetsByType: function(type) {
+         var widgets = [];
+         for (var i=0; i<this.widgetSets.length; i++) {
+             widgets = widgets.concat(this.widgetSets[i].getWidgetsByType(type));
+         }
+         return widgets;
+     }
+});
+
+/****************************************************************************
+ * Class: Fusion.Lib.ApplicationDefinition.MapGroup
+ *
+ * Holds an internal representation of MapGroup objects as defined in the AppDef
+ *
+ */
+
+Fusion.Lib.ApplicationDefinition.MapGroup = OpenLayers.Class({
+    initialView: null,
+    maps: null,
+    
+    initialize: function(jsonNode) {
+        this.mapId = jsonNode['@id'][0];
+        this.maps = [];
+        /* parse InitialView */
+        if (jsonNode.InitialView) {
+            var iv = jsonNode.InitialView[0];
+            if (iv.CenterX && iv.CenterY && iv.Scale) {
+                this.setInitialView({x:parseFloat(iv.CenterX[0]),
+                                     y:parseFloat(iv.CenterY[0]),
+                                     scale:parseFloat(iv.Scale[0])});
+            } else if (iv.MinX && iv.MinY && iv.MaxX && iv.MaxY) {
+                this.setInitialView({minX:parseFloat(iv.MinX[0]),
+                                     minY:parseFloat(iv.MinY[0]),
+                                     maxX:parseFloat(iv.MaxX[0]),
+                                     maxY:parseFloat(iv.MaxY[0])});
+            } else {
+                //TODO: emit warning that the initial view was incomplete
+            }
+        }
+        /* parse maps */
+        if (jsonNode.Map instanceof Array) {
+            for (var i=0; i<jsonNode.Map.length; i++) {
+                var map = new Fusion.Lib.ApplicationDefinition.Map(jsonNode.Map[i]);
+                var links = {groups:[], layers:[]};
+                var mapEvents = {layerEvents:{},groupEvents:{}};
+                if (jsonNode.Map[i].Extension) {
+                    var extension = jsonNode.Map[i].Extension[0];
+                    if (extension.Links) {
+                        /* process Groups */
+                        if (extension.Links[0].Group instanceof Array) {
+                            for (var j=0; j<extension.Links[0].Group.length; j++) {
+                                var group = extension.Links[0].Group[j];
+                                links.groups.push({name:group.Name[0],url:group.Url[0]});
+                            }
+                        }
+                        if (extension.Links[0].Layer instanceof Array) {
+                            for (var j=0; j<extension.Links[0].Layer.length; j++) {
+                                var layer = extension.Links[0].Layer[j];
+                                links.layers.push({name:layer.Name[0],url:layer.Url[0]});
+                            }
+                        }
+                    }
+                    /* process layer events */
+                    //TODO: Should this be called MapEvents?
+                    if (extension.MapEvents) {
+                        if (extension.MapEvents[0].Layer instanceof Array) {
+                            for (var j=0; j<extension.MapEvents[0].Layer.length; j++) {
+                                var layer = extension.MapEvents[0].Layer[j];
+                                var layerObj = {};
+                                layerObj.name = layer.Name[0];
+                                layerObj.onEnable = [];
+                                if (layer.OnEnable instanceof Array) {
+                                    layerObj.onEnable = this.parseMapEventSubBlock(layer.OnEnable[0]);
+                                }
+                                layerObj.onDisable = [];
+                                if (layer.OnDisable instanceof Array) {
+                                    layerObj.onDisable = this.parseMapEventSubBlock(layer.OnDisable[0]);
+                                }
+                                mapEvents.layerEvents[layerObj.name] = layerObj;
+                            }
+                        }
+                        if (extension.MapEvents[0].Group instanceof Array) {
+                            for (var j=0; j<extension.MapEvents[0].Group.length; j++) {
+                                var group = extension.MapEvents[0].Group[j];
+                                var groupObj = {};
+                                groupObj.name = group.Name[0];
+                                groupObj.onEnable = [];
+                                if (layer.OnEnable instanceof Array) {
+                                    groupObj.onEnable = this.parseMapEventSubBlock(group.OnEnable[0]);
+                                }
+                                groupObj.onDisable = [];
+                                if (layer.OnDisable instanceof Array) {
+                                    groupObj.onDisable = this.parseMapEventSubBlock(group.OnDisable[0]);
+                                }
+                                mapEvents.groupEvents[groupObj.name] = groupObj;
+                            }
+                        }
+                    }
+                }
+                map.mapInfo = {links: links, mapEvents: mapEvents};
+                this.maps.push(map);
+            }
+        } else {
+            //TODO: do we need a warning that there are no layers in this map?
+        }
+    },
+    
+    parseMapEventSubBlock: function(block) {
+        var a = [];
+        if (block.Layer && block.Layer instanceof Array) {
+            for (var i=0; i<block.Layer.length; i++) {
+                var layer = block.Layer[i];
+                a.push({type: 'layer', name:layer.Name[0], enable: layer.Enable[0] == 'true' ? true : false});
+            }
+        }
+        if (block.Group && block.Group instanceof Array) {
+            for (var i=0; i<block.Group.length; i++) {
+                var group = block.Group[i];
+                a.push({type: 'group', name:group.Name[0], enable: group.Enable[0] == 'true' ? true : false});
+            }            
+        }
+        return a;
+    },
+    
+    getInitialView: function() {
+        return this.initialView;
+    },
+    
+    setInitialView: function(view) {
+        this.initialView = view;
+    }
+});
+
+/****************************************************************************
+ * Class: Fusion.Lib.ApplicationDefinition.Map
+ *
+ * Holds an internal representation of Map objects as defined in the AppDef
+ *
+ */
+
+Fusion.Lib.ApplicationDefinition.Map = OpenLayers.Class({
+    type: null,
+    singleTile: false,
+    extension: null,
+    initialize: function(jsonNode) {
+        /* TODO: type can be any supported OpenLayers type */
+        this.type = jsonNode.Type[0];
+        if (jsonNode.SingleTile) {
+            var b = jsonNode.SingleTile[0].toLowerCase();
+            this.singleTile = (b == "true") ? true : false;
+        }
+        if (jsonNode.Extension) {
+            this.extension = jsonNode.Extension[0];
+        } else {
+            this.extension = {};
+        }
+        this.resourceId = this.extension.ResourceId ? this.extension.ResourceId[0] : '';
+        
+        var tagOptions = this.extension.Options;
+        this.layerOptions = {};
+        if (tagOptions && tagOptions[0]) {
+          for (var key in tagOptions[0]) {
+            this.layerOptions[key] = tagOptions[0][key][0];
+            if (this.layerOptions[key].toLowerCase() == 'true') {
+              this.layerOptions[key] = true;
+            } else if (this.layerOptions[key].toLowerCase() == 'false') {
+              this.layerOptions[key] = false;
+            }
+            if (key == 'maxExtent' || key == 'minExtent') {
+              this.layerOptions[key] = OpenLayers.Bounds.fromString(this.layerOptions[key]);
+            }
+          }
+        }
+        var tagParams = this.extension.Parameters;
+        this.layerParams = {};
+        if (tagParams && tagParams[0]) {
+          for (var key in tagParams[0]) {
+            this.layerParams[key] = tagParams[0][key][0];
+          }
+        }
+        
+        switch (this.type) {
+          case 'MapGuide':
+          case 'MapServer':
+            if ( !Fusion.Layers[this.type] ) {
+                  Fusion.require('layers/' + this.type + '/' + this.type + '.js');
+            }
+            break;
+          default:
+            if ( !Fusion.Layers.Generic ) {
+              Fusion.require('layers/Generic/Generic.js');
+            }
+            break;
+        }
+    }
+});
+
+/****************************************************************************
+ * Class: Fusion.Lib.ApplicationDefinition.WidgetSet
+ *
+ * Holds an internal representation of WidgetSet objects as defined in the AppDef
+ *
+ */
+
+Fusion.Lib.ApplicationDefinition.WidgetSet = OpenLayers.Class({
+    containers: null,
+    containersByName: null,
+    widgetTags: null,
+    widgetTagsByName: null,
+    widgetInstances: null,
+    mapWidget: null,
+    mapId: null,
+    initialize: function(jsonNode) {
+        this.containers = [];
+        this.widgetTags = [];
+        this.widgetInstances = [];
+        this.widgetTagsByName = {};
+        this.containersByName = {};
+        /* process map widgets */
+        if (jsonNode.MapWidget) {
+            for (var i=0; i<jsonNode.MapWidget.length; i++) {
+                var widget = new Fusion.Lib.ApplicationDefinition.Widget(jsonNode.MapWidget[i]);
+                widget.widgetSet = this;
+                this.mapWidgetTag = widget;
+                this.mapId = jsonNode.MapWidget[i].MapId[0];
+            }
+        }
+        
+        /* process widgets */
+        if (jsonNode.Widget) {
+            for (var i=0; i<jsonNode.Widget.length; i++) {
+                var widget = new Fusion.Lib.ApplicationDefinition.Widget(jsonNode.Widget[i]);
+                widget.widgetSet = this;
+                this.widgetTags.push(widget);
+                this.widgetTagsByName[widget.name] = widget;
+            }
+        }
+        /* process containers */
+        if (jsonNode.Container) {
+            for (var i=0; i<jsonNode.Container.length; i++) {
+                var container = new Fusion.Lib.ApplicationDefinition.Container(jsonNode.Container[i]);
+                this.containers.push(container);
+                this.containersByName[container.name] = container;
+            }
+        }
+        
+    },
+    
+    /**
+     * Function: addWidgetInstance
+     *
+     * keep track of live widgets created in this widgetSet
+     *
+     * Parameter: {<Fusion.Widget>} widget
+     *
+     * the widget to add
+     */
+    addWidgetInstance: function(widget) {
+        this.widgetInstances.push(widget);
+    },
+    
+    /**
+     * Function: getMapWidget
+     *
+     * return the map widget for this widget set
+     *
+     * Returns: {<Fusion.Lib.Map>} a map widget or null
+     */
+    getMapWidget: function() {
+        return this.mapWidget;
+    },
+    
+    /**
+     * Function: create
+     *
+     * create all the things required by this widgetSet, including
+     * containers and widgets.
+     *
+     * Parameter: {<Fusion.Lib.ApplicationDefinition>} 
+     *
+     * the application definition that this widgetSet is part of
+     */
+    create: function(appDef) {
+
+        //allow over-ride of mapId via URL parameter
+        var mapGroup = null;
+        var paramMapId = Fusion.getQueryParam('mapid');
+        if (paramMapId.length>0) {
+          mapGroup = appDef.getMapGroup(paramMapId);
+          if (mapGroup) {
+            this.mapId = paramMapId;
+          } else {
+            Fusion.reportError(new Fusion.Error(Fusion.Error.WARNING, 
+              "can't find MapGroup: " + paramMapId + ' - reverting to default map'));
+          }
+        }
+        
+        if (!mapGroup) {
+          mapGroup = appDef.getMapGroup(this.mapId);
+        }
+        
+        //create the Map widget for this WidgetSet
+        this.mapWidget = new Fusion.Widget.Map(this.mapWidgetTag,mapGroup,this);
+        this.mapWidget.setMenu();
+        $(this.mapWidgetTag.name).widget = this.mapWidget;
+
+        //create all the other widgets for the widget set
+        for (var i=0; i<this.widgetTags.length; i++) {
+            this.widgetTags[i].create(this);
+        }
+
+        //create all the containers for the widget set
+        for (var i=0; i<this.containers.length; i++) {
+            this.containers[i].create(this);
+        }
+    },
+    /**
+     * Function: getMapByName
+     *
+     * return the map widget from this widget set if the map's name
+     * matches the requested name, or null.
+     *
+     * Parameter: {String} name
+     *
+     * The map name to check
+     *
+     * Returns: {Object} a map object or null.
+     */
+    getMapByName : function(name) {
+        var map = null;
+        if (this.mapWidget.getMapName() == name) {
+            map = this.mapWidget;
+        }
+        return map;
+    },
+    
+    /**
+     * Function getWidgetsByType
+     *
+     * returns an array of widgets by type.
+     *
+     * Parameter: {String} type
+     *
+     * the type of widget to get references to
+     *
+     * Returns: {Array} an array of widgets, which may be empty
+     */
+    getWidgetsByType: function(type) {
+        var widgets = [];
+        for (var i=0; i<this.widgetInstances.length; i++) {
+            if (this.widgetInstances[i].type == type) {
+                widgets.push(this.widgetInstances[i]);
+            }
+        }
+        return widgets;
+    },
+    
+    getWidgetByName: function(name) {
+        return this.widgetTagsByName[name];
+    },
+    
+    getContainerByName: function(name) {
+        return this.containersByName[name];
+    }
+});
+
+/****************************************************************************
+ * Class: Fusion.Lib.ApplicationDefinition.Container
+ *
+ * Holds an internal representation of Container objects as defined in the AppDef
+ *
+ */
+
+Fusion.Lib.ApplicationDefinition.Container = OpenLayers.Class({
+    name: null,
+    type: null,
+    validPositions: ['top', 'left', 'bottom', 'right'],
+    position: 'top',
+    items: null,
+    initialize: function(jsonNode) {
+        this.type = jsonNode.Type[0];
+        this.name = jsonNode.Name[0];
+        var position = jsonNode.Position ? jsonNode.Position[0].toLowerCase() : this.position;
+        for (var i=0; i<this.validPositions.length; i++) {
+            if (this.validPositions[i] == position) {
+                this.position = position;
+                break;
+            }
+        }
+        this.items = [];
+        if (jsonNode.Item) {
+            for (var i=0; i<jsonNode.Item.length; i++) {
+                var item = new Fusion.Lib.ApplicationDefinition.Item(jsonNode.Item[i]);
+                this.items.push(item);
+            }
+        } else {
+            //TODO: is this a problem if there are no items?
+        }
+    },
+    
+    create: function(widgetSet) {
+        var container;
+        if (this.type == 'Toolbar' || this.type == 'Statusbar') {
+            if ($(this.name)) {
+                container = new Jx.Toolbar({parent: this.name, position: this.position});
+                $(this.name).container = container;
+                this.createWidgets(widgetSet, container);
+            }
+        } else if (this.type == 'Splitterbar') {
+            if ($(this.name)) {
+                container = new Jx.Splitter(this.name, {splitInto: this.items.length});
+                for (var i=0; i<this.items.length; i++) {
+                    container.elements[i].id = this.name + '_' + i;
+                }
+                $(this.name).container = container;
+                this.createWidgets(widgetSet, container);
+            }
+        }
+        if (container && container.domObj.jxLayout) {
+            container.domObj.jxLayout.resize({forceResize: true});
+        }
+    },
+    
+    createWidgets: function(widgetSet, container) {
+        for (var i=0; i<this.items.length; i++) {
+            this.items[i].create(widgetSet, container, this.name + '_' + i);
+        }
+    }
+    
+});
+
+/****************************************************************************
+ * Class: Fusion.Lib.ApplicationDefinition.Widget
+ *
+ * Holds an internal representation of Widget objects as defined in the AppDef
+ *
+ */
+
+Fusion.Lib.ApplicationDefinition.Widget = OpenLayers.Class({
+    name: null,
+    type: null,
+    statusText: null,
+    location: null,
+    imageUrl: null,
+    imageClass: null,
+    tooltip: null,
+    label: null,
+    disabled: null,
+    extension: null,
+    initialize: function(jsonNode) {
+        if (jsonNode) {
+            this.type = jsonNode.Type[0];
+            this.name = jsonNode.Name ? jsonNode.Name[0] : '';
+            this.statusText = jsonNode.StatusText ? jsonNode.StatusText[0] : '';
+            this.statusText = OpenLayers.i18n(this.statusText);
+            //TODO: this may be an extension
+            this.location = jsonNode.Location ? jsonNode.Location[0] : 'widgets/';
+            if (this.location.slice(-1) != '/') {
+                this.location += '/';
+            }
+            this.imageUrl = jsonNode.ImageUrl ? jsonNode.ImageUrl[0] : '';
+            this.imageClass = jsonNode.ImageClass ? jsonNode.ImageClass[0] : '';
+            this.tooltip = jsonNode.Tooltip ? jsonNode.Tooltip[0] : '';
+            this.tooltip = OpenLayers.i18n(this.tooltip);
+            this.label = jsonNode.Label ? jsonNode.Label[0] : '';
+            this.label = OpenLayers.i18n(this.label);
+            this.disabled = jsonNode.Disabled ? (jsonNode.Disabled[0].toLowerCase() == 'true' ? true : false) : false;
+            
+            //console.log('Widget: ' + this.type + ', ' + this.name + ', ' + this.description);
+        
+            if (jsonNode.Extension) {
+                this.extension = jsonNode.Extension[0];
+            } else {
+                this.extension = {};
+            }
+            //require the widget code
+            if ( !Fusion.Widget[this.type] ) {
+              Fusion.require(this.location + this.type + '.js');
+            }
+        }
+    },
+    
+    getMapWidget: function() {
+        if (this.widgetSet) {
+            return this.widgetSet.getMapWidget();
+        } else {
+            return null;
+        }
+    },
+    
+    /**
+     * Function: create
+     *
+     * creates a new instance of the widget, optionally using a
+     * different name during instantiation to accomodate
+     * containers
+     *
+     * Parameter: name
+     *
+     * An optional name to use for the widget, overrides the
+     * original name temporarily if passed.
+     *
+     * Returns: an instance of the widget represented by this
+     * object.
+     */
+    create: function(widgetSet, widgetName) {
+        var widget = null;
+        this.widgetSet = widgetSet;
+        var oldName = this.name;
+        if (typeof widgetName == 'undefined') {
+            widgetName = this.name;
+        }
+        /* create the widget if the name is not null and the name
+         * is either an empty string (in the case of buttons in menus)
+         * or something exists in the dom with the right id
+         */
+        if (widgetName != null && (widgetName == '' || $(widgetName) != null)) {
+            this.name = widgetName;
+            widget = eval("new Fusion.Widget."+this.type+"(this)");
+            widgetSet.addWidgetInstance(widget);
+            if ($(this.name)) {
+                widget.id = this.name;
+                $(this.name).widget = widget;
+                if (widget.uiClass) {
+                    widget.setUiObject(new widget.uiClass({
+                        label: this.label,
+                        image: this.imageUrl,
+                        imageClass: this.imageClass,
+                        toggle: this.isExclusive
+                    }));
+                    if (widget.uiObj.addTo) {
+                        widget.uiObj.addTo($(this.name));
+                    }
+                    if (widget.uiObj.setEnabled) {
+                        widget.uiObj.setEnabled(widget.isEnabled());
+                        widget.registerForEvent(Fusion.Event.WIDGET_STATE_CHANGED, function() {
+                            widget.uiObj.setEnabled(widget.isEnabled());
+                        });
+                    }
+                }
+            }
+            this.name = oldName;
+        }
+        return widget;
+    }
+});
+
+/****************************************************************************
+ * Class: Fusion.Lib.ApplicationDefinition.Item
+ *
+ * Holds an internal representation of Menu Item objects as defined in the AppDef
+ *
+ */
+
+Fusion.Lib.ApplicationDefinition.Item = OpenLayers.Class({
+    uniqueId: [0],
+    type: null,
+    initialize: function(jsonNode) {
+        this.type = jsonNode.Function[0];
+        switch(this.type) {
+            case 'Widget':
+                this.widgetName = jsonNode.Widget[0];
+                break;
+            case 'Flyout':
+                this.flyout = new Fusion.Lib.ApplicationDefinition.Flyout(jsonNode);
+                break;
+            case 'Multi':
+                this.multi = new Fusion.Lib.ApplicationDefinition.Multi(jsonNode);
+                break;
+            case 'Separator':   
+                break;
+        }
+    },
+      
+    create: function(widgetSet, container, idx) {
+        switch(this.type) {
+            case 'Widget':
+                var widgetTag = widgetSet.getWidgetByName(this.widgetName);
+                if (widgetTag) {
+                    var name = 'FusionItem'+this.uniqueId[0];
+                    this.uniqueId[0]++;
+                    if (container instanceof Jx.Toolbar) {
+                        var widget = widgetTag.create(widgetSet, '');
+                        if (!widget.uiClass) {
+                            widget.uiClass = Jx.Toolbar.Item;
+                            widget.setUiObject(new widget.uiClass());
+                        } else if (widget.uiClass == Jx.Button || widget.uiClass == Jx.Button.Color || widget.uiClass == Jx.Menu) {
+                            widget.setUiObject(new widget.uiClass({
+                                label: widgetTag.label,
+                                image: widgetTag.imageUrl,
+                                imageClass: widgetTag.imageClass,
+                                toggle: widget.isExclusive
+                            }));                            
+                        }
+                        container.add(widget.uiObj);
+                        if (widget.uiObj.setEnabled) {
+                            widget.uiObj.setEnabled(widget.isEnabled());
+                            widget.registerForEvent(Fusion.Event.WIDGET_STATE_CHANGED, function() {
+                                widget.uiObj.setEnabled(widget.isEnabled());
+                            });
+                        }
+                    } else if (container instanceof Jx.Splitter) {
+                        var widget = widgetTag.create(widgetSet, idx);
+                    } else if (container instanceof Jx.Menu ||
+                               container instanceof Jx.Menu.Context ||
+                               container instanceof Jx.Menu.SubMenu) {
+                        var widget = widgetTag.create(widgetSet, '');
+                        if (!widget.uiClass || widget.uiClass == Jx.Button) {
+                            widget.uiClass = Jx.Menu.Item;
+                        } else if (widget.uiClass == Jx.Menu) {
+                            widget.uiClass = Jx.Menu.SubMenu;
+                        }
+                        widget.setUiObject(new widget.uiClass({
+                            label: widgetTag.label,
+                            image: widgetTag.imageUrl,
+                            imageClass: widgetTag.imageClass,
+                            toggle: widget.isExclusive
+                        }));
+                        container.add(widget.uiObj);
+                        if (widget.uiObj.setEnabled) {
+                            widget.uiObj.setEnabled(widget.isEnabled());
+                            widget.registerForEvent(Fusion.Event.WIDGET_STATE_CHANGED, function() {
+                                widget.uiObj.setEnabled(widget.isEnabled());
+                            });
+                        }
+                    } else if (container instanceof Jx.Button.Multi) {
+                        var widget = widgetTag.create(widgetSet, '');
+                        widget.uiClass = Jx.Button;
+                        widget.setUiObject(new widget.uiClass({
+                            label: widgetTag.label,
+                            image: widgetTag.imageUrl,
+                            imageClass: widgetTag.imageClass,
+                            toggle: widget.isExclusive
+                        }));
+                        container.add(widget.uiObj);
+                        if (widget.uiObj.setEnabled) {
+                            widget.uiObj.setEnabled(widget.isEnabled());
+                            widget.registerForEvent(Fusion.Event.WIDGET_STATE_CHANGED, function() {
+                                widget.uiObj.setEnabled(widget.isEnabled());
+                            });
+                        }
+                    }
+                } else {
+                  Fusion.reportError(new Fusion.Error(Fusion.Error.WARNING, 
+                    "can't find widget: " + this.widgetName));
+                 }
+                break;
+            case 'Flyout':
+                /* create a menu */
+                var menu;
+                var opt = {
+                    label: this.flyout.label,
+                    tooltip: this.flyout.tooltip,
+                    image: this.flyout.imageUrl,
+                    imageClass: this.flyout.imageClass
+                };
+                if (container instanceof Jx.Toolbar) {
+                    menu = new Jx.Menu(opt);
+                } else if (container instanceof Jx.Menu || 
+                           container instanceof Jx.Menu.Context || 
+                           container instanceof Jx.Menu.SubMenu) {
+                    menu = new Jx.Menu.SubMenu(opt);
+                }
+                container.add(menu);
+                this.flyout.create(widgetSet, menu);
+                
+                break;
+            case 'Multi':
+                var multi;
+                var opt = {
+                    label: this.multi.label,
+                    tooltip: this.multi.tooltip,
+                    image: this.multi.imageUrl,
+                    imageClass: this.multi.imageClass
+                }
+                multi = new Jx.Button.Multi(opt);
+                container.add(multi);
+                this.multi.create(widgetSet, multi);
+                break;
+                
+            case 'Separator':
+                if (container instanceof Jx.Toolbar) {
+                    container.add(new Jx.Toolbar.Separator());
+                } else if (container instanceof( Jx.Menu) || 
+                           container instanceof(Jx.Menu.SubMenu) ||
+                           container instanceof(Jx.Menu.Context)) {
+                    container.add(new Jx.Menu.Separator());
+                }
+                break;
+        }
+    }
+});
+
+/****************************************************************************
+ * Class: Fusion.Lib.ApplicationDefinition.Flyout
+ *
+ * Holds an internal representation of Flyout objects as defined in the AppDef
+ *
+ */
+
+Fusion.Lib.ApplicationDefinition.Flyout = OpenLayers.Class({
+    label: null,
+    tooltip: null,
+    description: null,
+    imageUrl: null,
+    items: null,
+    
+    initialize: function(jsonNode) {
+        this.label = jsonNode.Label ? jsonNode.Label[0] : '';
+        this.tooltip = jsonNode.Tooltip ? jsonNode.Tooltip[0] : '';
+        this.description = jsonNode.Description ? jsonNode.Description[0] : '';
+        this.imageUrl = jsonNode.ImageUrl ? jsonNode.ImageUrl[0] : '';
+        this.items = [];
+        if (jsonNode.Item instanceof Array) {
+            for (var i=0; i<jsonNode.Item.length; i++) {
+                this.items.push(new Fusion.Lib.ApplicationDefinition.Item(jsonNode.Item[i]));
+            }
+        }
+    },
+    
+    create: function(widgetSet, menu) {
+        for (var i=0; i<this.items.length; i++) {
+            this.items[i].create(widgetSet, menu);
+        }
+    }
+    
+});
+
+/****************************************************************************
+ * Class: Fusion.Lib.ApplicationDefinition.Multi
+ *
+ * Holds an internal representation of Multi objects as defined in the AppDef
+ *
+ */
+
+Fusion.Lib.ApplicationDefinition.Multi = OpenLayers.Class({
+    label: null,
+    tooltip: null,
+    description: null,
+    imageUrl: null,
+    items: null,
+    
+    initialize: function(jsonNode) {
+        this.label = jsonNode.Label ? jsonNode.Label[0] : '';
+        this.tooltip = jsonNode.Tooltip ? jsonNode.Tooltip[0] : '';
+        this.description = jsonNode.Description ? jsonNode.Description[0] : '';
+        this.imageUrl = jsonNode.ImageUrl ? jsonNode.ImageUrl[0] : '';
+        this.items = [];
+        if (jsonNode.Item instanceof Array) {
+            for (var i=0; i<jsonNode.Item.length; i++) {
+                this.items.push(new Fusion.Lib.ApplicationDefinition.Item(jsonNode.Item[i]));
+            }
+        }
+    },
+    
+    create: function(widgetSet, multi) {
+        for (var i=0; i<this.items.length; i++) {
+            this.items[i].create(widgetSet, multi);
+        }
+    }
+    
+});
+
+/****************************************************************************
+ * Class: Fusion.Lib.ApplicationDefinition.SearchDefinition
+ *
+ * Holds an internal representation of SearchDefinition objects as defined in the AppDef
+ *
+ */
+
+Fusion.Lib.ApplicationDefinition.SearchDefinition = OpenLayers.Class({
+    id: null,
+    name: null,
+    category: null,
+    parameters: null,
+    join: null,
+    rule: null,
+    
+    initialize: function(json) {
+        this.id = json['@id'];
+        this.name = json['@name'];
+        if (json.Join instanceof Array) {
+            this.join = new Fusion.Lib.ApplicationDefinition.SearchJoin(json.Join[0]);
+        }
+        this.parameters = [];
+        if (json.Parameter instanceof Array) {
+            for (var i=0; i<json.Parameter.length; i++) {
+                this.parameters.push(json.Parameter[i]['@name']);
+            }
+        }
         this.reports = [];
         if (json.Report instanceof Array) {
             for (var i=0; i<json.Report.length; i++) {
@@ -1070,151 +1137,151 @@
               this.reports.push({'label':label, 'link':link});
             }
         }
-        var rule;
-        if (json.SearchAnd instanceof Array) {
-            this.rule = new Fusion.Lib.ApplicationDefinition.SearchRule('AND');
-            rule = json.SearchAnd[0];
-        } else if (json.SearchOr instanceof Array) {
-            this.rule = new Fusion.Lib.ApplicationDefinition.SearchRule('OR');
-            rule = json.SearchOr[0];
-        }
-        if (rule && rule.SearchCondition instanceof Array) {
-            for (var i=0; i<rule.SearchCondition.length; i++) {
-                this.rule.add(new Fusion.Lib.ApplicationDefinition.SearchCondition(rule.SearchCondition[i]));
-            }
-        }
-    },
-    
-    getJoinUrl: function(params) {
-        if (this.join) {
-            return '&joinlayer='+this.join.layer+'&joinpk='+this.join.primaryKey+'&joinfk='+this.join.foreignKey;
-        } else {
-            return '';
-        }
-    },
-    
-    getFilterUrl: function(params) {
-        return '&filter='+encodeURIComponent(this.rule.toString(params));
-    }
-});
-
-/****************************************************************************
- * Class: Fusion.Lib.ApplicationDefinition.SearchJoin
- *
- * Holds an internal representation of SearchJoin objects as defined in the AppDef
- *
- */
-
-Fusion.Lib.ApplicationDefinition.SearchJoin = OpenLayers.Class({
-    layer: null,
-    primaryKey: null,
-    foreignKey: null,
-    initialize: function(json) {
-        this.layer = json.Layer ? json.Layer[0] : '';
-        this.primaryKey = json.PrimaryKey ? json.PrimaryKey[0] : '';
-        this.foreignKey = json.ForeignKey ? json.ForeignKey[0] : '';
-    }
-});
-
-/****************************************************************************
- * Class: Fusion.Lib.ApplicationDefinition.SearchRule
- *
- * Holds an internal representation of SearchRule objects as defined in the AppDef
- *
- */
-
-Fusion.Lib.ApplicationDefinition.SearchRule = OpenLayers.Class({
-    type: null,
-    conditions: null,
-    initialize: function(type) {
-        this.type = type;
-        this.conditions = [];
-    },
-    
-    add: function(condition) {
-        this.conditions.push(condition);
-    },
-    
-    remove: function(condition) {
-        for (var i=0; i<this.conditions.length; i++) {
-            if (this.conditions[i] == condition) {
-                this.conditions.splice(i, 1);
-                break;
-            }
-        }
-    },
-    
-    toString: function(params) {
-        var conditions = [];
-        for (var i=0; i<this.conditions.length; i++) {
-            this.conditions[i].setParams(params);
-            var c = this.conditions[i].toString();
-            if (c != '') {
-                conditions.push(c);
-            }
-        }
-        return '(' + conditions.join(') ' + this.type + ' (') + ')';
-    }
-});
-
-/****************************************************************************
- * Class: Fusion.Lib.ApplicationDefinition.SearchCondition
- *
- * Holds an internal representation of SearchCondition objects as defined in the AppDef
- *
- */
-
-Fusion.Lib.ApplicationDefinition.SearchCondition = OpenLayers.Class({
-    column: null,
-    operator: null,
-    parameter: null,
-    quote: null,
-    value: null,
-    operators: {eq:'=', like:'like', lt:'<', lte:'<=', gt:'>', gte:'>=', neq:'<>'},
-    includeIfEmpty: false,
-
-    initialize: function(json) {
-        this.column = json.Column[0];
-        this.operator = this.operators[json.Operator[0].toLowerCase()];
-        this.parameter = json.Parameter[0];
-        this.quote = json['@quote'] ? json['@quote'] : '';
-        this.wildcard = json['@wildcard'] ? json['@wildcard'] : 'both';
-        this.caseSensitive = true;
-        if (json['@caseSensitive'] && json['@caseSensitive'] == 'false') {
-            this.caseSensitive = false;
-        }
-    },
-
-    setParams: function(p) {
-        if (p[this.parameter]) {
-            this.value = p[this.parameter];
-        } else {
-            this.value = '';
-        }
-    },
-
-    toString: function() {
-        var value = this.value ? this.value : '';
-        if (value == '' && !this.includeIfEmpty) {
-            return '';
-        }
-        var upper = '';
-        if (!this.caseSensitive) {
-            value = value.toUpperCase();
-            upper = 'Upper';
-        }
-        var prewildcard = '';
-        var prewildcard = '';
-        var postwildcard = '';
-        if (this.operator == 'like') {
-            if (this.wildcard == 'before' || this.wildcard == 'both') {
-                prewildcard = '*';
-            }
-            if (this.wildcard == 'after' || this.wildcard == 'both') {
-                postwildcard = '*';
-            }
-        }
-        var wildcard = this.operator == 'like' ? '*' : '';
-        return upper + '('+this.column + ') ' + this.operator + ' ' + this.quote + prewildcard + value + postwildcard + this.quote;
-    }
-});
+        var rule;
+        if (json.SearchAnd instanceof Array) {
+            this.rule = new Fusion.Lib.ApplicationDefinition.SearchRule('AND');
+            rule = json.SearchAnd[0];
+        } else if (json.SearchOr instanceof Array) {
+            this.rule = new Fusion.Lib.ApplicationDefinition.SearchRule('OR');
+            rule = json.SearchOr[0];
+        }
+        if (rule && rule.SearchCondition instanceof Array) {
+            for (var i=0; i<rule.SearchCondition.length; i++) {
+                this.rule.add(new Fusion.Lib.ApplicationDefinition.SearchCondition(rule.SearchCondition[i]));
+            }
+        }
+    },
+    
+    getJoinUrl: function(params) {
+        if (this.join) {
+            return '&joinlayer='+this.join.layer+'&joinpk='+this.join.primaryKey+'&joinfk='+this.join.foreignKey;
+        } else {
+            return '';
+        }
+    },
+    
+    getFilterUrl: function(params) {
+        return '&filter='+encodeURIComponent(this.rule.toString(params));
+    }
+});
+
+/****************************************************************************
+ * Class: Fusion.Lib.ApplicationDefinition.SearchJoin
+ *
+ * Holds an internal representation of SearchJoin objects as defined in the AppDef
+ *
+ */
+
+Fusion.Lib.ApplicationDefinition.SearchJoin = OpenLayers.Class({
+    layer: null,
+    primaryKey: null,
+    foreignKey: null,
+    initialize: function(json) {
+        this.layer = json.Layer ? json.Layer[0] : '';
+        this.primaryKey = json.PrimaryKey ? json.PrimaryKey[0] : '';
+        this.foreignKey = json.ForeignKey ? json.ForeignKey[0] : '';
+    }
+});
+
+/****************************************************************************
+ * Class: Fusion.Lib.ApplicationDefinition.SearchRule
+ *
+ * Holds an internal representation of SearchRule objects as defined in the AppDef
+ *
+ */
+
+Fusion.Lib.ApplicationDefinition.SearchRule = OpenLayers.Class({
+    type: null,
+    conditions: null,
+    initialize: function(type) {
+        this.type = type;
+        this.conditions = [];
+    },
+    
+    add: function(condition) {
+        this.conditions.push(condition);
+    },
+    
+    remove: function(condition) {
+        for (var i=0; i<this.conditions.length; i++) {
+            if (this.conditions[i] == condition) {
+                this.conditions.splice(i, 1);
+                break;
+            }
+        }
+    },
+    
+    toString: function(params) {
+        var conditions = [];
+        for (var i=0; i<this.conditions.length; i++) {
+            this.conditions[i].setParams(params);
+            var c = this.conditions[i].toString();
+            if (c != '') {
+                conditions.push(c);
+            }
+        }
+        return '(' + conditions.join(') ' + this.type + ' (') + ')';
+    }
+});
+
+/****************************************************************************
+ * Class: Fusion.Lib.ApplicationDefinition.SearchCondition
+ *
+ * Holds an internal representation of SearchCondition objects as defined in the AppDef
+ *
+ */
+
+Fusion.Lib.ApplicationDefinition.SearchCondition = OpenLayers.Class({
+    column: null,
+    operator: null,
+    parameter: null,
+    quote: null,
+    value: null,
+    operators: {eq:'=', like:'like', lt:'<', lte:'<=', gt:'>', gte:'>=', neq:'<>'},
+    includeIfEmpty: false,
+
+    initialize: function(json) {
+        this.column = json.Column[0];
+        this.operator = this.operators[json.Operator[0].toLowerCase()];
+        this.parameter = json.Parameter[0];
+        this.quote = json['@quote'] ? json['@quote'] : '';
+        this.wildcard = json['@wildcard'] ? json['@wildcard'] : 'both';
+        this.caseSensitive = true;
+        if (json['@caseSensitive'] && json['@caseSensitive'] == 'false') {
+            this.caseSensitive = false;
+        }
+    },
+
+    setParams: function(p) {
+        if (p[this.parameter]) {
+            this.value = p[this.parameter];
+        } else {
+            this.value = '';
+        }
+    },
+
+    toString: function() {
+        var value = this.value ? this.value : '';
+        if (value == '' && !this.includeIfEmpty) {
+            return '';
+        }
+        var upper = '';
+        if (!this.caseSensitive) {
+            value = value.toUpperCase();
+            upper = 'Upper';
+        }
+        var prewildcard = '';
+        var prewildcard = '';
+        var postwildcard = '';
+        if (this.operator == 'like') {
+            if (this.wildcard == 'before' || this.wildcard == 'both') {
+                prewildcard = '*';
+            }
+            if (this.wildcard == 'after' || this.wildcard == 'both') {
+                postwildcard = '*';
+            }
+        }
+        var wildcard = this.operator == 'like' ? '*' : '';
+        return upper + '('+this.column + ') ' + this.operator + ' ' + this.quote + prewildcard + value + postwildcard + this.quote;
+    }
+});



More information about the fusion-commits mailing list