1 /**
  2  * @ignore
  3  */
  4 var Ozone = Ozone ? Ozone : {};
  5 
  6 /**
  7  * @namespace
  8  * @since OWF 5.0
  9  */
 10 OWF = window.OWF ? window.OWF : {};
 11 
 12 (function(window, document, undefined) {
 13 
 14 	var WIDGET_READY_SERVICE_NAME = '_widgetReady',
 15 
 16         isReady = false,
 17 		readyList = [],
 18 		widget = Ozone.util.parseWindowNameData(),
 19 		eventingController,
 20 		dragAndDropController,
 21 		launchingController,
 22 		chromeController;
 23 
 24 	owfdojo.mixin(OWF, /** @lends OWF */ {
 25 
 26 		/**
 27 		 * The OWF.Eventing object manages the eventing for an individual widget
 28 		 * 
 29 		 * @namespace
 30 		 * @name OWF.Eventing
 31 		 */
 32 		Eventing: {},
 33 
 34 		/**
 35 		 * @namespace
 36 		 * @name OWF.RPC
 37 		 */
 38 		RPC: {},
 39 
 40 		/**
 41 		 * This object is used to create, retrieve, update and delete user preferences.
 42 		 * 
 43 		 * @namespace
 44 		 * @name OWF.Preferences
 45 		 */
 46 		Preferences: {},
 47 
 48 		/**
 49 		 * This object is used launch other widgets. 
 50 		 *
 51 		 * @namespace
 52 		 * @name OWF.Launcher
 53 		 */
 54 		Launcher: {},
 55 
 56 		/**
 57 		 * The OWF.DragAndDrop object manages the drag and drop for an individual widget.
 58 		 * 
 59 		 * @namespace
 60 		 * @name OWF.DragAndDrop
 61 		 */
 62 		DragAndDrop: {},
 63 
 64 		/**
 65 		 * This object allows a widget to modify the button contained in the widget header (the chrome). 
 66 		 *
 67 		 * @namespace
 68 		 * @name OWF.Chrome
 69 		 */
 70 		Chrome: {},
 71 
 72 		/**
 73 		 * Provides OWF utility methods for the widget developer 
 74 		 *
 75 		 * @namespace
 76 		 * @name OWF.Util
 77 		 */
 78 		Util: Ozone.util,
 79 
 80 		/**
 81 		 * 
 82 		 *
 83 		 * @namespace
 84 		 * @name OWF.Metrics
 85 		 */
 86 		Metrics: Ozone.metrics,
 87 
 88 		/**
 89 		 * Provides functions to log messages and objects
 90 		 * 
 91 		 * @namespace
 92 		 * @name OWF.Log
 93 		 */
 94 		Log: Ozone.log,
 95 
 96 		/**
 97 		 * Provides utility methods for localization
 98 		 *
 99 		 * @namespace
100 		 * @name OWF.Lang
101 		 */
102 		Lang: Ozone.lang,
103 		
104 		Version: Ozone.version,
105 
106 		/**
107 			Accepts a function that is executed when Ozone APIs are ready for use
108 			@param {Function} handler Function to execute when OWF APIs are ready
109 			@param {Object} scope The scope (this reference) in which the function is executed. If omitted, defaults to the browser window.
110 		*/
111 		ready: function(handler, scope) {
112 
113 			if(handler === undefined) {
114 				throw 'Error: no arguments passed';
115 				return;
116 			}
117 			
118 			if(typeof handler !== 'function') {
119 				throw 'Error: handler must be a function';
120 				return;
121 			}
122 
123 			isReady === true ? handler.call(scope) : readyList.push( {fn: handler, scope: scope} );
124 
125 		},
126 
127       /**
128        * This function should be called once the widget is ready and all initialization is completed.  This will send a
129        * message to the container which in turn may notify other widgets
130        */
131         notifyWidgetReady: function() {
132           //send a message to container that this widget is ready
133           gadgets.rpc.call('..', WIDGET_READY_SERVICE_NAME, null, OWF.getInstanceId());
134         },
135 
136 		/**
137 			Returns definition GUID of the widget. This is auto generated by OWF when the widget was brought in an OWF instance.
138 		*/
139 		getWidgetGuid : function() {
140 			return widget.guid;
141 		},
142 
143 		/**
144 			Returns instance GUID of the widget.
145 		*/
146 		getInstanceId : function() {
147 			return widget.id;
148 		},
149 
150         /**
151          * @description Returns the Widget Id
152          * @returns {String} The widgetId is a complex JSON encoded string which identifies a widget for Eventing.
153          *   Embedded in this string is the widget's uniqueId as the 'id' attribute.  There is other data is in the string
154          *   which is needed for Eventing and other APIs to function properly. This complex widgetId string may be used in
155          *   the <a href="./OWF.Eventing.html#.publish">OWF.Eventing.publish</a> function to designate a specific recipient for a message.
156          *   Additionally, once subscribed to a channel via <a href="./OWF.Eventing.html#.subscribe">OWF.Eventing.subscribe</a> during the
157          *   receipt of a message, the sender's widgetId is made available as the first argument to the handler function.
158          * @example
159          * //decode and retrieve the widget's unique id
160          * var complexIdString = OWF.getIframeId();
161          * var complexIdObj = owfdojo.toJson(complexIdString);
162          *
163          * //complexIdObj will look like
164          * // {
165          * //  //widget's uniqueId
166          * //  id:"49cd21f0-3110-8121-d905-18ffa81b442e"
167          * // }
168          *
169          * //get Widget's uniqueId
170          * alert('widget id = ' + complexIdObj.id);
171          */
172 		getIframeId : function() {
173 			return '{\"id\":\"' + widget.id + '\"}';
174 		},
175 
176 		/**
177 			Returns type of dashboard in which the widget is opened. [portal, desktop, accordion, tabbed]
178 		*/
179 		getDashboardLayout : function() {
180 			return widget.layout;
181 		},
182 
183 		/**
184 			Returns version of the widget.
185 		*/
186 		getVersion : function() {
187 			return widget.version;
188 		},
189 
190 		/**
191 			Returns URL of the widget.
192 		*/
193 		getUrl : function() {
194 			return widget.url;
195 		},
196 
197 		/**
198 			Returns an object containing information on the current OWF theme
199 			@returns {Object} Returns an object below: <br>
200 			{ <br>
201 				//name of the theme <br>
202 				themeName: 'theme-name', <br>
203 				<br>
204 				//describes color contrast of the theme.  This may be one of 3 values: <br>
205 				// 'standard' (colors provide no special contrast) <br>
206 				// 'black-on-white' (black on white color contrast) <br>
207 				// 'white-on-black' (white on black color contrast) <br>
208 				themeContrast: 'black-on-white', <br>
209 				<br>
210 				//this field is a number of the fontSize in pixels <br>
211 				themeFontSize: 12 <br>
212 			}
213 			@example
214 			var themeObj = OWF.getCurrentTheme();
215 		*/
216 		getCurrentTheme : function() {
217 			return widget.currentTheme;
218 		},
219 
220 		/**
221 			Returns the name of the Container the Widget is in
222 		*/
223 		getContainerName: function() {
224 			return widget.containerName;
225 		},
226 		
227 		/**
228 			Returns the version of the Container the Widget is in
229 		*/
230 		getContainerVersion: function() {
231 			return widget.containerVersion;
232 		},
233 
234 		/**
235 			Returns whether or not the dashboard in which the widget is opened is locked. 
236 		*/
237 		isDashboardLocked : function() {
238 			return widget.locked;
239 		},
240 
241 		/**
242 		Returns the URL of the Container the Widget is in
243 		*/
244 		getContainerUrl: function() {
245             //figure out from preference location
246 			var pref = widget.preferenceLocation;
247             return pref.substring(0, pref.length - 6);
248 		},
249 
250 		/**
251 			Gets all opened widgets on the current dashboard.
252 
253 			@param {Function} callback function to execute when opened widgets are retrieved from OWF. Function is passed an array of objects with the structure below: <br>
254 			{<br>
255 				id: 'instance guid of widget',<br>
256 				frameId: 'iframe id of widget',<br>
257 				widgetGuid: 'widget guid of the widget',<br>
258 				url: 'url of the widget',<br>
259 				name: 'name of the widget'<br>
260                 universalName: 'universal name of the widget'<br>
261 			}<br>
262 			@example
263 			OWF.getOpenedWidgets(function(openedWidgets) {
264 				
265 			});
266 		*/
267 		getOpenedWidgets: function(fn) {
268 			
269 			if(fn === undefined) {
270 				throw 'Error: no arguments passed';
271 				return;
272 			}
273 
274 			if(typeof fn !== 'function') {
275 				throw 'Error: fn must be a function';
276 				return;
277 			}
278 
279 			Ozone.eventing.getAllWidgets(fn);
280 		}
281 	});
282 
283 	// for backwards compatibility
284 	Ozone.Widget = OWF;
285 
286 	OWF._init = function(window, document, undefined) {
287 
288         if (OWF.relayFile != null) {
289           Ozone.eventing.Widget.widgetRelayURL = OWF.relayFile;
290         }
291 
292 		// Eventing API
293 		function initEventing() {
294 			for(var i = 0, methods = ['publish', 'subscribe', 'unsubscribe'] ; i < methods.length ; i++) {
295 				OWF.Eventing[ methods[i] ] = this[ methods[i] ];
296 			}
297 		}
298 
299 		// RPC/Directed Eventing API
300 		function initRPC() {
301 			OWF.RPC.registerFunctions = Ozone.eventing.registerFunctions;
302 			OWF.RPC.getWidgetProxy = Ozone.eventing.importWidget;
303 			OWF.RPC.handleDirectMessage = function(fn) {
304 				if(typeof fn !== 'function') {
305 					throw 'Error: fn must be a function';
306 					return;
307 				}
308 				Ozone.eventing.handleDirectMessage = fn;
309 			};
310 		}
311 
312 		// Preferences API
313 		function initPreferences() {
314 			for(var i in Ozone.pref.PrefServer) {
315 				if(typeof Ozone.pref.PrefServer[ i ] === 'function')
316 					OWF.Preferences[ i ] = Ozone.pref.PrefServer[ i ];
317 			}
318 		}
319 
320 		// Launching API
321 		function initLauncher() {
322 			OWF.Launcher.launch = launchingController.launchWidget;
323 			OWF.Launcher.getLaunchData = Ozone.launcher.WidgetLauncherUtils.getLaunchConfigData;
324 		}
325 
326 		// Drag and Drop API
327 		function initDragAndDrop() {
328 			OWF.DragAndDrop = {
329 				onDragStart: function(callback, scope) {
330 					dragAndDropController.addCallback('dragStart', owfdojo.hitch(scope, callback));
331 					return this;
332 				},
333 
334 				onDragStop: function(callback, scope) {
335 					dragAndDropController.addCallback('dragStop', owfdojo.hitch(scope, callback));
336 					return this;
337 				},
338 
339 				onDrop: function(callback, scope) {
340 					dragAndDropController.addCallback('dropReceive', owfdojo.hitch(scope, callback));
341 					return this;
342 				},
343 
344 				startDrag: function(cfg) {
345 					dragAndDropController.doStartDrag(cfg);
346 					return this;
347 				}
348 			};
349 
350 			for(var i = 0, methods = ['addDropZoneHandler', 'getDragStartData', 'getDropEnabled', 'setDropEnabled', 'isDragging', 'getFlashWidgetId', 'setFlashWidgetId'] ; i < methods.length ; i++) {
351 				
352 				OWF.DragAndDrop[ methods[i] ] = function( methodName ) {
353 					
354 					return function() {
355 						return dragAndDropController[methodName].apply(dragAndDropController, arguments);
356 					};
357 
358 				}( methods[i] );
359 			
360 			}
361 		}
362 
363 		// Chrome API
364 		function initChrome() {
365 			for(var i = 0, 
366 				methods = ['addHeaderButtons', 'addHeaderMenus', 'insertHeaderButtons', 'insertHeaderMenus',
367                     'isModified', 'listHeaderButtons', 'listHeaderMenus', 'removeHeaderButtons', 'removeHeaderMenus',
368                     'updateHeaderButtons', 'updateHeaderMenus', 'getTitle', 'setTitle'] ; i < methods.length ; i++) {
369 				OWF.Chrome[ methods[i] ] = chromeController[ methods[i] ];
370 			}
371 		}
372 
373 		eventingController = Ozone.eventing.Widget.getInstance(function() {
374 
375 			dragAndDropController = Ozone.dragAndDrop.WidgetDragAndDrop.getInstance({
376 				widgetEventingController: this
377 			});
378 			launchingController = Ozone.launcher.WidgetLauncher.getInstance();
379 			chromeController = Ozone.chrome.WidgetChrome.getInstance({
380 				widgetEventingController: this
381 			});
382 
383 			initEventing.call(this);
384 			initRPC();
385 			initPreferences();
386 			initLauncher();
387 			initDragAndDrop();
388 			initChrome();
389 
390 			Ozone.components.keys.createKeyEventSender(this);
391 
392 			// execute ready listeners
393 			isReady = true;
394 			for(var i = 0, len = readyList.length ; i < len ; i++) {
395 				readyList[i].fn.call(readyList[i].scope);
396 			}
397 
398 		});
399 
400 	};
401 
402 }(window, document));
403 
404 // --------------------------------------------------------------------------------------------------
405 // ------------------- Eventing ---------------------------------------------------------------------
406 // --------------------------------------------------------------------------------------------------
407 /**
408  * @name relayFile
409  * @memberOf OWF
410  * @description The location of the widget relay file.  The relay file should be defined
411  *   globally for the entire widget by setting OWF.relayFile to the relay file url, immediately after
412  *   including the widget bundle javascript.  If the relay is not defined at all it is assumed to be at
413  *   /[context]/js/eventing/rpc_relay.uncompressed.html. The relay file must be specified with full location details, but without a fully
414  *   qualified path. In the case where the relay is residing @ http://server/path/relay.html, the path used must be from the context root of the local
415  *   widget. In this case, it would be /path/relay.html.  Do not include the protocol.
416  * @since OWF 5.0.0
417  * @example
418  * <script type="text/javascript" src="../../js-min/owf-widget-min.js"></script>
419  * <script>
420  *       //The location is assumed to be at /[context]/js/eventing/rpc_relay.uncompressed.html if it is not
421  *       //set the path correctly below
422  *       OWF.relayFile = '/owf/js/eventing/rpc_relay.uncompressed.html';
423  *       //...
424  * </script>
425  *
426  */
427 
428 /**
429 	Subscribe to a named channel for a given function.
430 	@name subscribe
431 	@methodOf OWF.Eventing
432 
433 	@param {String} channelName The channel to subscribe to.
434 	@param {Function} handler The function you wish to subscribe.  This function will be called with three
435 		arguments: sender, msg, channel.
436 	@param {String} [handler.sender] The first argument passed to the handler function is the id of the sender of the message. See <a href="OWF.html#.getIframeId">OWF.getIframeId</a> for a description of this id.
437 	@param {Object} [handler.msg] The second argument passed to the handler function is the message itself.
438 	@param {String} [handler.channel] The third argument passed to the handler function is the channel the message was published on.
439 		
440 	@example
441 OWF.Eventing.subscribe("ClockChannel", this.update);
442 var update = function(sender, msg, channel) {
443 	document.getElementById('currentTime').innerHTML = msg;
444 }
445  */
446 
447 /**
448 	Unsubscribe to a named channel.
449 	@name unsubscribe
450 	@methodOf OWF.Eventing
451 
452 	@param {String} channelName The channel to unsubscribe to.
453 	
454 	@example
455 OWF.Eventing.unsubscribe("ClockChannel");
456  */
457 
458 /**
459 	Publishes a message to a given channel.
460 	@name publish
461 	@methodOf OWF.Eventing
462 
463 	@param {String} channelName The name of the channel to publish to
464 	@param {Object} message The message to publish to the channel.
465 	@param {String} [dest] The id of a particular destination.  Defaults to null which sends to all
466 		subscribers on the channel.  See <a href="OWF.html#.getIframeId">OWF.getIframeId</a>
467 		for a description of the id.
468 	
469 	@example
470 OWF.Eventing.publish("ClockChannel", currentTimeString);
471 */
472 
473 // --------------------------------------------------------------------------------------------------
474 // ------------------- RPC --------------------------------------------------------------------------
475 // --------------------------------------------------------------------------------------------------
476 
477 /**
478 	Register one or more functions to OWF to expose to other widgets.
479 	@name registerFunctions
480 	@methodOf OWF.RPC
481 
482 	@param {Object/Array} objs Object or an array of objects of following structure.<br />
483 		{<br />
484 			name: 'name of the function', <br />
485 			fn: function() {}, <br />
486 			scope: window //The scope (this reference) in which the function is executed. If omitted, defaults to the browser window.<br />
487 		}<br />
488 
489 	@example
490 Calculator = {
491 	add: function() {
492 		var args = arguments,
493 			val = 0;
494 		for(var i = 0, len = args.length; i < len; i++) {
495 			val += parseFloat(args[i]);
496 		}
497 		return val;
498 	},
499 	multiply: function() {
500 		var args = arguments,
501 			val = 1;
502 		for(var i = 0, len = args.length; i < len; i++) {
503 			val *= parseFloat(args[i]);
504 		}
505 		return val;
506 	}
507 };
508 OWF.RPC.registerFunctions([
509 	{
510 		name: 'add'
511 		fn: Calculator.add,
512 		scope: Calculator
513 	},
514 	{
515 		name: 'multiply'
516 		fn: Calculator.multiply,
517 		scope: Calculator
518 	}
519 ]);
520 */
521 
522 /**
523 	Gets a proxy object that contains methods exposed by other widget.
524 	@name getWidgetProxy
525 	@methodOf OWF.RPC
526 
527 	@param {String} instanceGuid instance guid of the widget to import
528 	@param {Function} callback function that will be executed if the widget is found opened on the current dashboard. The function is passed a proxy object as the first argument which will contain methods that were exposed by the widget. In addition, the proxy abject also has sendMessage method to send a direct message to the widget.
529 
530 	@example
531 OWF.RPC.getWidgetProxy('instanceGuid of widgetA', function(widgetA) {
532 
533 	widgetA.add(1,2,3, function(result) {
534 		console.log(result); // log the result
535 	})
536 
537 	widgetA.sendMessage('some secret message');
538 
539 });
540 */
541 
542 /**
543 	Register a function to be executed when a direct message is received from another widget.
544 	@name handleDirectMessage
545 	@methodOf OWF.RPC
546 
547 	@param {Function} fn function that will be executed when a direct message is received from another widget.
548 
549 	@example
550 OWF.RPC.handleDirectMessage(function(msg) {
551 	// do something with the message
552 });
553 */
554 
555 // --------------------------------------------------------------------------------------------------
556 // ------------------- Drag and Drop ----------------------------------------------------------------
557 // --------------------------------------------------------------------------------------------------
558 /**
559 	Use this method to set flex dom element id, so that drag and drop can be enabled in flex widgets.
560 	@name setFlashWidgetId
561 	@methodOf OWF.DragAndDrop
562 
563 	@param {String} id dom element id of flex widget
564 */
565 
566 /**
567 	Starts a drag.  The config object passed in describes the drag and contains the data to be passed to the drop.
568 	@name startDrag
569 	@methodOf OWF.DragAndDrop
570 
571 	@param {Object} cfg config object see below
572 	@param {String} cfg.dragDropLabel Name to be used as text for the dragDrop indicator
573 	@param {Object} cfg.dragDropData Data to be sent on a successful drag and drop.  This property is only sent to the
574 	successful recipient of the drag (the dropReceive event).  It will not be sent for other events.
575 	@param {Object} cfg.dragZone dom node which presents a dragZone which is associated with this drag.  This property is
576 	only saved and used locally to the widget to identify whether a dragZone is in fact the node as a dropZone.  It will not be
577 	sent to other events callbacks.
578 	@param {Object} cfg.* other custom properties may be specified, these will be passed along to event handlers
579 	
580 	@example
581 //add handler to text field for dragging
582 owfdojo.connect(document.getElementById('dragSource'), 'onmousedown', this, function(e) {
583 	e.preventDefault();
584 	var data = document.getElementById('InputChannel').value;
585 	if (data) {
586 		OWF.DragAndDrop.startDrag({
587 			dragDropLabel: data,
588 			dragDropData: data,
589 			dragZone:  document.getElementById('dragZone'),
590 			dragDropGroup: 'location'  //extra property to pass along
591 		});
592 	}
593 });
594 */
595 
596 
597 /**
598 	Adds a new drop zone to be managed.  The handler function defined in the cfg object will be called when
599 	a drop occurs over a dom node which matches the id or the className or is equal to or a child of the dropTarget node
600 	@name addDropZoneHandler
601 	@methodOf OWF.DragAndDrop
602 
603 	@param {Object} cfg config object see below
604 	@param {className} cfg.class class of the dropZone
605 	@param {String} cfg.id Id of the dropZone
606 	@param {Node} cfg.dropZone HTML node which represents the dropZone
607 	@param {Function} cfg.handler function to be called when a drop occurs over the dropZone.  A msg object will be passed in
608 
609 	@example
610 //Example cfg Object
611 {
612 	id: 'mygrid-1',
613 	className: 'mygridClass',
614 	dropZone: document.getElementById('dropZone'),
615 	handler: function(msg) {
616 		//some code here to handle the msg and respond
617 	}
618 }
619 
620 //Example usage of addDropZoneHandler which handles a drop that occurs over an Ext Grid and inserts new data into
621 //that grid based on the dragged data
622 OWF.DragAndDrop.addDropZoneHandler({
623 	//dom node of an Ext grid
624 	dropZone:grid.getView().scroller.dom,
625 
626 	//this function is called only when a drop occurs over the grid (i.e. the mouse was released over the grid)
627 	handler: (function(msg){
628 	
629 		var store = grid.getStore();
630 		var processedSelections = [];
631 		var errorMsg = null;
632 
633 		//loop through msg.dragDropData which is an array and check for dupes versus the destination store
634 		for (var i = 0; i < msg.dragDropData.length; i++) {
635 			//get data for one possible new record in the dragDropData
636 			var recData = msg.dragDropData[i];
637 
638 			//is it already in the dest Ext Store?
639 			if (store.findExact('id',recData.id) >= 0) {
640 				//found the record already in the store
641 			}
642 			else {
643 				//add new record based on the dragDropData
644 				var newRec = new store.recordType(recData);
645 				//calling an external function to decide whether to add the new rec
646 				var rs = displayPanel.validateRecordOnAdd(newRec);
647 				if (rs.success) {
648 					processedSelections.push(newRec);
649 				}
650 				else {
651 					errorMsg = rs.msg;
652 				}
653 			}
654 		}
655 
656 		if (errorMsg) {
657 			Ext.Msg.alert('Error', errorMsg);
658 		}
659 
660 		//actually insert into the store which adds it the new recs to the grid
661 		if (processedSelections.length > 0) {
662 			store.insert(0, processedSelections);
663 		}
664 
665 }).createDelegate(grid)});   //createDelegate is an Ext function which sets the scope of the callback
666 
667 */
668 
669 
670 /**
671 	Returns whether the a drop is enabled (this is only true when the mouse is over a drop zone)
672 	@name getDropEnabled
673 	@methodOf OWF.DragAndDrop
674 */
675 
676 /**
677 	Returns whether a drag is in progress
678 	@name isDragging
679 	@methodOf OWF.DragAndDrop
680 */
681 
682 /**
683 	Returns data sent when a drag was started
684 	@name getDragStartData
685 	@methodOf OWF.DragAndDrop
686 */
687 
688 /**
689 	Toggles the dragIndicator to indicate successful or unsuccessful drop
690 	@name setDropEnabled
691 	@methodOf OWF.DragAndDrop
692 
693 	@param {Boolean} dropEnabled true to enable a drop, false to indicate a unsuccessful drop
694 	
695 	@example
696 //attach mouseover callback to a particular area. If the mouse is here allow a drop
697 cmp.getView().scroller.on('mouseover',function(e,t,o) {
698 	if (cmp.dragging) {
699 		OWF.DragAndDrop.setDropEnabled(true);
700 	}
701 },this);
702 
703 //attach a mouse out callback to a particular area. If the mouse leaves disable drop
704 cmp.getView().scroller.on('mouseout',function(e,t,o) {
705 	if (cmp.dragging) {
706 		OWF.DragAndDrop.setDropEnabled(false);
707 	}
708 },this);
709    */
710 
711 
712 /**
713 	Executes the callback passed when a drag starts in any widget.
714 	@name onDragStart
715 	@methodOf OWF.DragAndDrop
716 	
717 	@param {Function} callback The function to execute as a callback.
718 	@param {Object} scope The scope (this reference) in which the function is executed. If omitted, defaults to the browser window.
719 
720 	@example
721 //example callback, highlights an Ext Grid when a drag occurs
722 OWF.DragAndDrop.onDragStart(function(sender, msg) {
723 	//get the Ext Grid
724 	var grid = this.getComponent(this.gridId);
725 
726 	//check custom dragDropGroup property to see if the drag is meant for this grid
727 	//if so highlight the grid by adding the ddOver class
728 	if (grid && msg != null && msg.dragDropGroup == 'users') {
729 		grid.getView().scroller.addClass('ddOver');
730 	}
731 }, this);
732 */
733 
734 /**
735 	Executes the callback passed when a drag stops in any widget.
736 	@name onDragStop
737 	@methodOf OWF.DragAndDrop
738 	
739 	@param {Function} callback The function to execute as a callback.
740 	@param {Object} scope The scope (this reference) in which the function is executed. If omitted, defaults to the browser window.
741 
742 	@example
743 
744 OWF.DragAndDrop.onDragStop(function(sender, msg) {
745 	// do something here
746 }, this);
747 */
748 
749 /**
750 	Executes the callback passed when a drop occurs in the widget. If one has multiple dropZones in a widget it is easier to use <a href="#addDropZoneHandler">addDropZoneHandler</a>
751 	@name onDrop
752 	@methodOf OWF.DragAndDrop
753 	
754 	@param {Function} callback The function to execute as a callback.
755 	@param {Object} scope The scope (this reference) in which the function is executed. If omitted, defaults to the browser window.
756 
757 	@example
758 
759 OWF.DragAndDrop.onDrop(function(sender, msg) {
760 	var data = msg.dragDropData;
761 
762 	// do something with the data here
763 }, this);
764 	*/
765 
766 // --------------------------------------------------------------------------------------------------
767 // ------------------- Launcher ---------------------------------------------------------------------
768 // --------------------------------------------------------------------------------------------------
769 
770 /**
771 	Launches a Widget based on the config.
772 	@name launch
773 	@methodOf OWF.Launcher
774 
775 	@param {Object} config object see example for structure
776 	@param {Function} callback a function to be called once after the launchWidget is executed
777 
778 	@example
779 OWF.Launcher.launch({
780     universalName: 'universal name of widget to launch',  //universalName or guid maybe identify the widget to be launched
781     guid: 'guid_of_widget_to_launch',
782     title: 'title to replace the widget title' the title will only be changed if the widget is opened.
783     titleRegex: optional regex used to replace the previous title with the new value of title
784     launchOnlyIfClosed: true,   //if true will only launch the widget if it is not already opened.
785                                 //if it is opened then the widget will be brought to focus
786     data: dataString            //initial launch data to be passed to a widget only if the widget is opened. This must be a string.
787 }, callback);
788  */
789 
790 /**
791 	Retrieves initial launch data for this widget if it is opened by another widget.  If launched via an intent, it will return the JSON string { intents: true }.
792 	@name getLaunchData
793 	@methodOf OWF.Launcher
794 
795 	@returns {Object} data object which contains initial launch data for the widget 
796 
797 	@example
798 var launchData = OWF.Launcher.getLaunchData();
799 if (launchData != null) {
800 	var data = Ozone.util.parseJson(launchData);  //in this example the data object has two fields: channel and message
801 	if (data != null) {
802 		//do something with the data
803 		OWF.Eventing.subscribe(data.channel, function() {});
804 	}
805 }
806 */
807 
808 // --------------------------------------------------------------------------------------------------
809 // ------------------- Chrome -----------------------------------------------------------------------
810 // --------------------------------------------------------------------------------------------------
811 
812 /**
813 	Checks to see if the Widget Chrome has already been modified.  This is useful when the widget iframe is reloaded.
814 	@name isModified
815 	@methodOf OWF.Chrome
816 
817 	@param {Object} cfg config object see below for properties
818 	@param {Function} cfg.callback The function which receives the results.
819 	This method will be passed an object which has following properties. <br>
820 	<br>
821 		{Boolean} success: true if the widget is currently opened on the dashboard, or else false. <br>
822 		{Boolean} modified: true if the widget chrome(header) is modified, or else false. <br>
823 	*
824 	@example
825 OWF.Chrome.isModified({
826 	callback: function(msg) {
827 		//msg will always be a json string
828 		var res = Ozone.util.parseJson(msg);
829 		if (res.success) {
830 			//if the chrome was never modified
831 			if (!res.modified) {
832 			   //do something, perhaps add buttons
833 			}
834 			//if we already modified the chrome
835 			else {
836 			  //do something or perhaps nothing if the buttons are already added
837 			}
838 		}
839 	}
840 });
841 */
842 
843 
844 /**
845 	Adds buttons to the Widget Chrome. Buttons are added after existing buttons.
846 	@name addHeaderButtons
847 	@methodOf OWF.Chrome
848 
849 	@param {Object} cfg config object see below for properties
850 	@param {Object[]} cfg.items an array of buttons configurations to add to the chrome.  See example for button configs
851 	@param {String} cfg.items[*].itemId itemId is a unique id among all buttons that are added.  It is a required property.  It is used for identification and defines the internal Eventing channel which is used to execute the handler function.  If itemId is not unique this may result in duplicate buttons which may not be able to be removed properly.
852 	@param {String} cfg.items[*].xtype xtype is ExtJS-like property used to determine the component to create.  Currently the Widget Chrome API only supports two xtype values: ‘button’ and ‘widgettool’.  xtype is an optional field, if it is omitted ‘widgettool’ is used.
853 	@param {String} cfg.items[*].type Used only for ‘widgettool’ buttons.  It determines the standard icon to be used.  For a complete list of types please see the ExtJS 4.x API documentation, <a href='http://docs.sencha.com/ext-js/4-0/#/api/Ext.panel.Tool-cfg-type'>http://docs.sencha.com/ext-js/4-0/#/api/Ext.panel.Tool-cfg-type</a>
854 	@param {String} cfg.items[*].icon This property defines the URL of the image to be used for the button.  If the URL is a relative path, it will be relative to the /owf context.  This is useful if the desired image is hosted by the OWF web server.  Otherwise a fully qualified URL should be used.  If type is being used to determine the image, the icon property is optional
855 	@param {String} cfg.items[*].text This property defines text to appear alongside the button.  This property is only used if the xtype is ‘button.’  ‘widgettool’ will not show text.
856 	@param {Object} cfg.items[*].tooltip This property defines a tooltip.  It has two important sub properties, title and text.  tooltip is only used when the xtype is ‘button’
857 	@param {Function} cfg.items[*].handler The handler attribute defines a function to be executed when the button is pressed. This function is executed using Widget Eventing API from inside the widget.  The internal channel name used is the itemId attribute. This function’s parameter list contains the standard parameters for an Eventing callback function.
858 	
859 	@example
860 OWF.Chrome.addHeaderButtons({
861 	items: [
862 		{
863 			xtype: 'button',
864 			//path to an image to use. this path should either be fully qualified or relative to the /owf context
865 			icon: './themes/common/images/skin/exclamation.png',
866 			text: 'Alert',
867 			itemId:'alert',
868 			tooltip:  {
869 			  text: 'Alert!'
870 			},
871 			handler: function(sender, data) {
872 				//widgetState is an already instantiated WidgetState Obj
873 				if (widgetState) {
874 					widgetState.getWidgetState({
875 						callback: function(state) {
876 							//check if the widget is visible
877 							if (!state.collapsed && !state.minimized && state.active) {
878 								//only render visual content, perhaps popup a message box if the widget is visible
879 								//otherwise it may not render correctly
880 							}
881 						}
882 					});
883 				}
884 			}
885 		},
886 		{
887 			xtype: 'widgettool',
888 			//path to an image to use. this path should either be fully qualified or relative to the /owf context
889 			icon: './themes/common/images/skin/information.png',
890 			itemId:'help',
891 			handler: function(sender, data) {
892 				alert('About Button Pressed');
893 			}
894 		},
895 		{
896 			//gear is a standard ext tool type
897 			type: 'gear',
898 			itemId:'gear',
899 			handler: function(sender, data) {
900 				alert('Utility Button Pressed');
901 			}
902 		}
903 	]
904 });
905    */
906 
907 /**
908 	Updates any existing buttons in the Widget Chrome based on the itemId.
909 	@name updateHeaderButtons
910 	@methodOf OWF.Chrome
911 
912 	@param {Object} cfg config object see below for properties
913 	@param {Object[]} cfg.items an array of buttons configurations to add to the chrome.  See example below for button configs
914 	@param {String} cfg.items[*].itemId itemId is a unique id among all buttons that are added.  It is a required property.  It is used for identification and defines the internal Eventing channel which is used to execute the handler function.  If itemId is not unique this may result in duplicate buttons which may not be able to be removed properly.
915 	@param {String} cfg.items[*].xtype xtype is ExtJS-like property used to determine the component to create.  Currently the Widget Chrome API only supports two xtype values: ‘button’ and ‘widgettool’.  xtype is an optional field, if it is omitted ‘widgettool’ is used.
916 	@param {String} cfg.items[*].type Used only for ‘widgettool’ buttons.  It determines the standard icon to be used.  For a complete list of types please see the ExtJS 4.x API documentation, <a href='http://docs.sencha.com/ext-js/4-0/#/api/Ext.panel.Tool-cfg-type'>http://docs.sencha.com/ext-js/4-0/#/api/Ext.panel.Tool-cfg-type</a>
917 	@param {String} cfg.items[*].icon This property defines the URL of the image to be used for the button.  If the URL is a relative path, it will be relative to the /owf context.  This is useful if the desired image is hosted by the OWF web server.  Otherwise a fully qualified URL should be used.  If type is being used to determine the image, the icon property is optional
918 	@param {String} cfg.items[*].text This property defines text to appear alongside the button.  This property is only used if the xtype is ‘button.’  ‘widgettool’ will not show text.
919 	@param {Object} cfg.items[*].tooltip This property defines a tooltip.  It has two important sub properties, title and text.  tooltip is only used when the xtype is ‘button’
920 	@param {Function} cfg.items[*].handler The handler attribute defines a function to be executed when the button is pressed. This function is executed using Widget Eventing API from inside the widget.  The internal channel name used is the itemId attribute. This function’s parameter list contains the standard parameters for an Eventing callback function.
921 		
922 	@example
923 OWF.Chrome.updateHeaderButtons({
924 	items: [
925 		{
926 			xtype: 'button',
927 			//path to an image to use. this path should either be fully qualified or relative to the /owf context
928 			icon: './themes/common/images/skin/exclamation.png',
929 			text: 'Alert',
930 			itemId:'alert',
931 			tooltip:  {
932 			  text: 'Alert!'
933 			},
934 			handler: function(sender, data) {
935 				//widgetState is an already instantiated WidgetState Obj
936 				if (widgetState) {
937 					widgetState.getWidgetState({
938 						callback: function(state) {
939 							//check if the widget is visible
940 							if (!state.collapsed && !state.minimized && state.active) {
941 								//only render visual content, perhaps popup a message box if the widget is visible
942 								//otherwise it may not render correctly
943 							}
944 						}
945 					});
946 				}
947 			}
948 		},
949 		{
950 			xtype: 'widgettool',
951 			//path to an image to use. this path should either be fully qualified or relative to the /owf context
952 			icon: './themes/common/images/skin/information.png',
953 			itemId:'help',
954 			handler: function(sender, data) {
955 				alert('About Button Pressed');
956 			}
957 		},
958 		{
959 			//gear is a standard ext tool type
960 			type: 'gear',
961 			itemId:'gear',
962 			handler: function(sender, data) {
963 				alert('Utility Button Pressed');
964 			}
965 		}
966 	]
967 });
968 */
969 
970 /**
971 	Inserts new buttons to the Widget Chrome.  Buttons are added to the same area as existing buttons.
972 	@name insertHeaderButtons
973 	@methodOf OWF.Chrome
974 
975 	@param {Object} cfg config object see below for properties
976 	@param {Number} [cfg.pos=0] 0-based index of where buttons will be added, among any pre-existing buttons.
977 	@param {Object[]} cfg.items an array of buttons configurations to insert to the chrome.  See example below for button configs
978 	@param {String} cfg.items[*].itemId itemId is a unique id among all buttons that are added.  It is a required property.  It is used for identification and defines the internal Eventing channel which is used to execute the handler function.  If itemId is not unique this may result in duplicate buttons which may not be able to be removed properly.
979 	@param {String} cfg.items[*].xtype xtype is ExtJS-like property used to determine the component to create.  Currently the Widget Chrome API only supports two xtype values: ‘button’ and ‘widgettool’.  xtype is an optional field, if it is omitted ‘widgettool’ is used.
980 	@param {String} cfg.items[*].type Used only for ‘widgettool’ buttons.  It determines the standard icon to be used.  For a complete list of types please see the ExtJS 4.x API documentation, <a href='http://docs.sencha.com/ext-js/4-0/#/api/Ext.panel.Tool-cfg-type'>http://docs.sencha.com/ext-js/4-0/#/api/Ext.panel.Tool-cfg-type</a>
981 	@param {String} cfg.items[*].icon This property defines the URL of the image to be used for the button.  If the URL is a relative path, it will be relative to the /owf context.  This is useful if the desired image is hosted by the OWF web server.  Otherwise a fully qualified URL should be used.  If type is being used to determine the image, the icon property is optional
982 	@param {String} cfg.items[*].text This property defines text to appear alongside the button.  This property is only used if the xtype is ‘button.’  ‘widgettool’ will not show text.
983 	@param {Object} cfg.items[*].tooltip This property defines a tooltip.  It has two important sub properties, title and text.  tooltip is only used when the xtype is ‘button’
984 	@param {Function} cfg.items[*].handler The handler attribute defines a function to be executed when the button is pressed. This function is executed using Widget Eventing API from inside the widget.  The internal channel name used is the itemId attribute. This function’s parameter list contains the standard parameters for an Eventing callback function.
985 	
986 	@example
987 OWF.Chrome.insertHeaderButtons({
988 	pos: 0,
989 	items: [
990 		{
991 			xtype: 'button',
992 			//path to an image to use. this path should either be fully qualified or relative to the /owf context
993 			icon: './themes/common/images/skin/exclamation.png',
994 			text: 'Alert',
995 			itemId:'alert',
996 			tooltip:  {
997 				text: 'Alert!'
998 			},
999 			handler: function(sender, data) {
1000 				//widgetState is an already instantiated WidgetState Obj
1001 				if (widgetState) {
1002 					widgetState.getWidgetState({
1003 						callback: function(state) {
1004 							//check if the widget is visible
1005 							if (!state.collapsed && !state.minimized && state.active) {
1006 								//only render visual content, perhaps popup a message box if the widget is visible
1007 								//otherwise it may not render correctly
1008 							}
1009 						}
1010 					});
1011 				}
1012 			}
1013 		},
1014 		{
1015 			xtype: 'widgettool',
1016 			//path to an image to use. this path should either be fully qualified or relative to the /owf context
1017 			icon: './themes/common/images/skin/information.png',
1018 			itemId:'help',
1019 			handler: function(sender, data) {
1020 				alert('About Button Pressed');
1021 			}
1022 		},
1023 			{
1024 			//gear is a standard ext tool type
1025 			type: 'gear',
1026 			itemId:'gear',
1027 			handler: function(sender, data) {
1028 				alert('Utility Button Pressed');
1029 			}
1030 		}
1031 	]
1032 });
1033 */
1034 
1035 /**
1036 	Removes existing buttons on the Widget Chrome based on itemId.
1037 	@name removeHeaderButtons
1038 	@methodOf OWF.Chrome
1039 
1040 	@param {Object} cfg config object see below for properties
1041 	@param {Object[]} cfg.items an array of buttons configurations to remove to the chrome.  Only itemId is required.
1042 	See example below for button configs
1043 	@param {String} cfg.items[*].itemId itemId is a unique id among all buttons that are added.  It is a required property.  It is used for identification and defines the internal Eventing channel which is used to execute the handler function.  If itemId is not unique this may result in duplicate buttons which may not be able to be removed properly.
1044 	
1045 	@example
1046 OWF.Chrome.removeHeaderButtons({
1047 		items:[
1048 			{
1049 				itemId:'alert'
1050 			},
1051 			{
1052 				itemId:'help'
1053 			},
1054 			{
1055 				itemId:'gear'
1056 			}
1057 		]
1058 });
1059 */
1060 
1061 /**
1062 	Lists all buttons that have been added to the widget chrome.
1063 	@name listHeaderButtons
1064 	@methodOf OWF.Chrome
1065 
1066 	@param {Object} cfg config object see below for properties
1067 	@param {Function} cfg.callback The function which receives the results.
1068 	
1069 	@example
1070 OWF.Chrome.listHeaderButtons({
1071 	callback: function(msg) {
1072 		//msg will always be a json string
1073 		var res = Ozone.util.parseJson(msg);
1074 		if (res.success) {
1075 			for (var i = 0; i < res.items.length; i++) {
1076 				// do something with the buttons
1077 			}
1078 		}
1079 	}
1080 });
1081 */
1082 
1083 /**
1084 	Adds menus to the Widget Chrome.  Menus are added after existing menus.
1085 	@name addHeaderMenus
1086 	@methodOf OWF.Chrome
1087 
1088 	@param {Object} cfg config object see below for properties
1089 	@param {Object[]} cfg.items an array of menu configurations to add to the chrome.  See example for menu configs
1090 	@param {String} cfg.items[*].parentId itemId is the itemId of the menu to which this configuration should be added as a sub-menu.  If omitted, the configuration will be added as a main menu on the menu toolbar.  
1091 	@param {String} cfg.items[*].itemId itemId is a unique id among all menus that are added.  It is a required property.  It is used for identification and defines the internal Eventing channel which is used to execute the handler function.  If itemId is not unique this may result in duplicate menus which may not be able to be removed properly.
1092 	@param {String} cfg.items[*].icon This property defines the URL of the image to be used for the menu.  If the URL is a relative path, it will be relative to the /owf context.  This is useful if the desired image is hosted by the OWF web server.  Otherwise a fully qualified URL should be used.  If type is being used to determine the image, the icon property is optional
1093 	@param {String} cfg.items[*].text This property defines text to appear alongside the menu.  
1094 	@param {Object} cfg.items[*].menu menu configuration object
1095 	@param {Object[]} cfg.items[*].menu.items an array of menu item configurations to add to the chrome.  See example for menu item configs
1096 	@param {String} cfg.items[*].menu.items[*].itemId itemId is a unique id among all menu items that are added.  It is a required property.  It is used for identification and defines the internal Eventing channel which is used to execute the handler function.
1097 	@param {String} cfg.items[*].menu.items[*].xtype xtype is used to specify the type of menu item to add.  This attribute should be omitted unless specifying a menuseparator. Setting this value to "menuseparator" adds a separator bar to a menu, used to divide logical groups of menu items. If specified, only xtype should be specified.  Generally you will add one of these by using "-" in your items config rather than creating one directly using xtype.  See example below for usage. 
1098 	@param {String} cfg.items[*].menu.items[*].icon This property defines the URL of the image to be used for the menu item.  If the URL is a relative path, it will be relative to the /owf context.  This is useful if the desired image is hosted by the OWF web server.  Otherwise a fully qualified URL should be used.  If type is being used to determine the image, the icon property is optional
1099 	@param {String} cfg.items[*].menu.items[*].text This property defines text to appear for the menu item. 
1100 	@param {Function} cfg.items[*].menu.items[*].handler The handler attribute defines a function to be executed when the menu item is clicked. This function is executed using Widget Eventing API from inside the widget.  The internal channel name used is the itemId attribute. This function's parameter list contains the standard parameters for an Eventing callback function.
1101 	@param {Object} cfg.items[*].menu.items[*].menu sub-menu configuration object.  See example for sub-menu config.
1102 	
1103 	@example
1104 OWF.Chrome.addHeaderMenus({
1105 	items: [
1106 		{
1107 			itemId:'regularMenu',
1108 			icon: './themes/common/images/skin/exclamation.png',
1109 			text: 'Regular Menu',
1110 			menu: {
1111 				items: [
1112 					{
1113 						itemId:'regularMenuItem1',
1114 						icon: './themes/common/images/skin/exclamation.png',
1115 						text: 'Regular Menu Item 1',
1116 						handler: function(sender, data) {
1117 							alert('You clicked the Regular Menu menu item.');
1118 						}
1119 					}
1120 				]
1121 			}
1122 		},
1123 		{
1124 			itemId:'snacks',
1125 			icon: './themes/common/images/skin/exclamation.png',
1126 			text: 'Menu with Sub-Menu',
1127 			menu: {
1128 				items: [
1129 					{
1130 						itemId:'fruits',
1131 						icon: './themes/common/images/skin/exclamation.png',
1132 						text: 'Fruits',
1133 						menu: {
1134 							items: [
1135 								{
1136 									itemId:'apple',
1137 									icon: './themes/common/images/skin/exclamation.png',
1138 									text: 'Apple',
1139 									handler: function(sender, data) {
1140 										alert('Your snack will be an Apple.');
1141 									}
1142 								},
1143 							   {
1144 								   xtype: 'menuseparator'
1145 							   },
1146 								{
1147 									itemId:'banana',
1148 									icon: './themes/common/images/skin/exclamation.png',
1149 									text: 'Banana',
1150 									handler: function(sender, data) {
1151 										alert('Your snack will be a Banana.');
1152 									}
1153 								}, {
1154 									itemId:'cherry',
1155 									icon: './themes/common/images/skin/exclamation.png',
1156 									text: 'Cherries',
1157 									handler: function(sender, data) {
1158 										alert('Your snack will be Cherries.');
1159 									}
1160 								}
1161 							]
1162 						}
1163 					},
1164 					'-', // another way to add a menu separator 
1165 					{
1166 						itemId:'cupcake',
1167 						icon: './themes/common/images/skin/exclamation.png',
1168 						text: 'Cupcake',
1169 						handler: function(sender, data) {
1170 							alert('Your snack will be a Cupcake.');
1171 						}
1172 					},
1173 					{
1174 						itemId:'chips',
1175 						icon: './themes/common/images/skin/exclamation.png',
1176 						text: 'Potato Chips',
1177 						handler: function(sender, data) {
1178 							alert('Your snack will be a Potato Chips.');
1179 						}
1180 					}
1181 				]
1182 			}
1183 		}
1184 	]
1185 });
1186 */
1187 
1188 /**
1189 	Updates any existing menus in the Widget Chrome based on the itemId.
1190 	@name updateHeaderMenus
1191 	@methodOf OWF.Chrome
1192 
1193 	@param {Object} cfg config object see below for properties
1194 	@param {Object[]} cfg.items an array of menu configurations to add to the chrome.  See example for menu configs
1195 	@param {String} cfg.items[*].itemId itemId is a unique id among all menus that are added.  It is a required property.  It is used for identification and defines the internal Eventing channel which is used to execute the handler function.  If itemId is not unique this may result in duplicate menus which may not be able to be removed properly.
1196 	@param {String} cfg.items[*].icon This property defines the URL of the image to be used for the menu.  If the URL is a relative path, it will be relative to the /owf context.  This is useful if the desired image is hosted by the OWF web server.  Otherwise a fully qualified URL should be used.  If type is being used to determine the image, the icon property is optional
1197 	@param {String} cfg.items[*].text This property defines text to appear alongside the menu.  
1198 	@param {Object} cfg.items[*].menu menu configuration object
1199 	@param {Object[]} cfg.items[*].menu.items an array of menu item configurations to add to the chrome.  See example for menu item configs
1200 	@param {String} cfg.items[*].menu.items[*].itemId itemId is a unique id among all menu items that are added.  It is a required property.  It is used for identification and defines the internal Eventing channel which is used to execute the handler function.
1201 	@param {String} cfg.items[*].menu.items[*].xtype xtype is used to specify the type of menu item to add.  This attribute should be omitted unless specifying a menuseparator. Setting this value to "menuseparator" adds a separator bar to a menu, used to divide logical groups of menu items. If specified, only xtype should be specified.  See example below for usage.
1202 	@param {String} cfg.items[*].menu.items[*].icon This property defines the URL of the image to be used for the menu item.  If the URL is a relative path, it will be relative to the /owf context.  This is useful if the desired image is hosted by the OWF web server.  Otherwise a fully qualified URL should be used.  If type is being used to determine the image, the icon property is optional
1203 	@param {String} cfg.items[*].menu.items[*].text This property defines text to appear for the menu item. 
1204 	@param {Function} cfg.items[*].menu.items[*].handler The handler attribute defines a function to be executed when the menu item is clicked. This function is executed using Widget Eventing API from inside the widget.  The internal channel name used is the itemId attribute. This function's parameter list contains the standard parameters for an Eventing callback function.
1205 	@param {Object} cfg.items[*].menu.items[*].menu sub-menu configuration object.  See example for sub-menu config.
1206 	
1207 	@example
1208 OWF.Chrome.updateHeaderMenus({
1209 	items:[
1210 		{
1211 			itemId:'regularMenu',
1212 			icon: './themes/common/images/skin/exclamation.png',
1213 			text: 'Regular Menu',
1214 			menu: {
1215 				items: [
1216 					{
1217 						itemId:'regularMenuItem1',
1218 						icon: './themes/common/images/skin/exclamation.png',
1219 						text: 'Regular Menu Item 1',
1220 						handler: function(sender, data) {
1221 							alert('You clicked the Regular Menu menu item.');
1222 						}
1223 					}
1224 				]
1225 			}
1226 		},
1227 		{
1228 			itemId:'snacks',
1229 			icon: './themes/common/images/skin/exclamation.png',
1230 			text: 'Menu with Sub-Menu',
1231 			menu: {
1232 				items: [
1233 					{
1234 						itemId:'fruits',
1235 						icon: './themes/common/images/skin/exclamation.png',
1236 						text: 'Fruits',
1237 						menu: {
1238 							items: [
1239 								{
1240 									itemId:'apple',
1241 									icon: './themes/common/images/skin/exclamation.png',
1242 									text: 'Apple',
1243 									handler: function(sender, data) {
1244 										alert('Your snack will be an Apple.');
1245 									}
1246 								},
1247 							   {
1248 								   xtype: 'menuseparator'
1249 							   },
1250 								{
1251 									itemId:'banana',
1252 									icon: './themes/common/images/skin/exclamation.png',
1253 									text: 'Banana',
1254 									handler: function(sender, data) {
1255 										alert('Your snack will be a Banana.');
1256 									}
1257 								}, {
1258 									itemId:'cherry',
1259 									icon: './themes/common/images/skin/exclamation.png',
1260 									text: 'Cherries',
1261 									handler: function(sender, data) {
1262 										alert('Your snack will be Cherries.');
1263 									}
1264 								}
1265 							]
1266 						}
1267 					},
1268 					'-', // another way to add a menu separator 
1269 					{
1270 						itemId:'cupcake',
1271 						icon: './themes/common/images/skin/exclamation.png',
1272 						text: 'Cupcake',
1273 						handler: function(sender, data) {
1274 							alert('Your snack will be a Cupcake.');
1275 						}
1276 					},
1277 					{
1278 						itemId:'chips',
1279 						icon: './themes/common/images/skin/exclamation.png',
1280 						text: 'Potato Chips',
1281 						handler: function(sender, data) {
1282 							alert('Your snack will be a Potato Chips.');
1283 						}
1284 					}
1285 				]
1286 			}
1287 		}
1288 	]
1289 });
1290 */
1291 
1292 /**
1293 	Inserts new menus into the Widget Chrome. Menus are added to the same area as existing menus.
1294 	@name insertHeaderMenus
1295 	@methodOf OWF.Chrome
1296 
1297 	@param {Object} cfg config object see below for properties
1298 	@param {Number} [cfg.pos=0] 0-based index of where menus will be added, among any pre-existing menus.
1299 	@param {Object[]} cfg.items an array of menu configurations to add to the chrome.  See example for menu configs
1300 	@param {String} cfg.items[*].parentId itemId is the itemId of the menu to which this configuration should be added as a sub-menu.  If omitted, the configuration will be added as a main menu on the menu toolbar.  
1301 	@param {String} cfg.items[*].itemId itemId is a unique id among all menus that are added.  It is a required property.  It is used for identification and defines the internal Eventing channel which is used to execute the handler function.  If itemId is not unique this may result in duplicate menus which may not be able to be removed properly.
1302 	@param {String} cfg.items[*].icon This property defines the URL of the image to be used for the menu.  If the URL is a relative path, it will be relative to the /owf context.  This is useful if the desired image is hosted by the OWF web server.  Otherwise a fully qualified URL should be used.  If type is being used to determine the image, the icon property is optional
1303 	@param {String} cfg.items[*].text This property defines text to appear alongside the menu.  This property is only used if the xtype is ‘menu.’  ‘widgettool’ will not show text.
1304 	@param {Object} cfg.items[*].menu menu configuration object
1305 	@param {Object[]} cfg.items[*].menu.items an array of menu item configurations to add to the chrome.  See example for menu item configs
1306 	@param {String} cfg.items[*].menu.items[*].itemId itemId is a unique id among all menu items that are added.  It is a required property.  It is used for identification and defines the internal Eventing channel which is used to execute the handler function.
1307 	@param {String} cfg.items[*].menu.items[*].xtype xtype is used to specify the type of menu item to add.  This attribute should be omitted unless specifying a menuseparator. Setting this value to "menuseparator" adds a separator bar to a menu, used to divide logical groups of menu items. If specified, only xtype should be specified.  See example below for usage.
1308 	@param {String} cfg.items[*].menu.items[*].icon This property defines the URL of the image to be used for the menu item.  If the URL is a relative path, it will be relative to the /owf context.  This is useful if the desired image is hosted by the OWF web server.  Otherwise a fully qualified URL should be used.  If type is being used to determine the image, the icon property is optional
1309 	@param {String} cfg.items[*].menu.items[*].text This property defines text to appear for the menu item. 
1310 	@param {Function} cfg.items[*].menu.items[*].handler The handler attribute defines a function to be executed when the menu item is clicked. This function is executed using Widget Eventing API from inside the widget.  The internal channel name used is the itemId attribute. This function's parameter list contains the standard parameters for an Eventing callback function.
1311 	@param {Object} cfg.items[*].menu.items[*].menu sub-menu configuration object.  See example for sub-menu config.
1312 	
1313 	@example
1314 OWF.Chrome.insertHeaderMenus({
1315 		pos: 0,
1316 		items: [{
1317 		 itemId:'insertedMenu',
1318 			icon: './themes/common/images/skin/exclamation.png',
1319 			text: 'Inserted Menu',
1320 			menu: {
1321 				items: [
1322 					{
1323 						itemId:'insertedMenuItem1',
1324 						icon: './themes/common/images/skin/exclamation.png',
1325 						text: 'Inserted Menu Item 1',
1326 						handler: function(sender, data) {
1327 							alert('You clicked the Inserted Menu menu item.');
1328 						}
1329 					},
1330 					{
1331 						xtype: 'menuseparator'
1332 					},
1333 					{
1334 						itemId:'insertedMenuItem2',
1335 						icon: './themes/common/images/skin/exclamation.png',
1336 						text: 'Inserted Menu Item 2',
1337 						handler: function(sender, data) {
1338 							alert('You clicked the Inserted Menu menu item.');
1339 						}
1340 					},
1341 					'-', // another way to add a menu separator 
1342 					{
1343 						itemId:'insertedMenuItem3',
1344 						icon: './themes/common/images/skin/exclamation.png',
1345 						text: 'Inserted Menu Item 3',
1346 						handler: function(sender, data) {
1347 							alert('You clicked the Inserted Menu menu item.');
1348 						}
1349 					}
1350 				]
1351 			}
1352 		}]
1353 });
1354 */
1355 
1356 /**
1357 	Removes existing menus on the Widget Chrome based on itemId.
1358 	@name removeHeaderMenus
1359 	@methodOf OWF.Chrome
1360 
1361 	@param {Object} cfg config object see below for properties
1362 	@param {Object[]} cfg.items an array of objects containing itemIds for the menus to remove from the chrome.
1363 	  See example below for button configs
1364 	
1365 	@example
1366 OWF.Chrome.removeHeaderMenus({
1367 	items: [{
1368 		itemId: 'regularMenu'
1369 	}]
1370 });
1371 */
1372 
1373 /**
1374 	Lists all menus that have been added to the widget chrome.
1375 	@name listHeaderMenus
1376 	@methodOf OWF.Chrome
1377 
1378 	@param {Object} cfg config object see below for properties
1379 	@param {Function} cfg.callback The function which receives the results.
1380 	
1381 	@example
1382 OWF.Chrome.listHeaderMenus({
1383 	callback: function(msg) {
1384 		//msg will always be a json string
1385 		var res = Ozone.util.parseJson(msg);
1386 		if (res.success) {
1387 			for (var i = 0; i < res.items.length; i++) {
1388 				// do something with the menus
1389 			}
1390 		}
1391 	}
1392 });
1393 	*/
1394 
1395 /**
1396   *
1397   *	@name getTitle
1398   * @methodOf OWF.Chrome
1399   * @description Gets the Widget's Title from the Chrome
1400   * @param {Object} cfg config object see below for properties
1401   * @param {Function} cfg.callback The function which receives the results.
1402   *
1403   * @example
1404   *    OWF.Chrome.getTitle({
1405   *     callback: function(msg) {
1406   *         //msg will always be a json string
1407   *         var res = Ozone.util.parseJson(msg);
1408   *         if (res.success) {
1409   *
1410   *           //do something with title
1411   *           // res.title
1412   *         }
1413   *     }
1414   *   });
1415   */
1416 
1417 /**
1418   *	@name setTitle
1419   * @methodOf OWF.Chrome
1420   * @description Sets the Widget's Title in the Chrome
1421   * @param {Object} cfg config object see below for properties
1422   * @param {String} cfg.title The string which will replace the widget title
1423   * @param {Function} cfg.callback The function which receives the results.
1424   *
1425   * @example
1426   *    OWF.Chrome.setTitle({
1427   *     title: 'new title',
1428   *     callback: function(msg) {
1429   *         //msg will always be a json string
1430   *         var res = Ozone.util.parseJson(msg);
1431   *         if (res.success) {
1432   *           //get title back for confirmation
1433   *           // res.title
1434   *
1435   *         }
1436   *     }
1437   *   });
1438   */
1439 
1440 // --------------------------------------------------------------------------------------------------
1441 // ------------------- Preferences ------------------------------------------------------------------
1442 // --------------------------------------------------------------------------------------------------
1443 
1444 /**
1445 	Get the url for the Preference Server
1446 	@name getUrl
1447 	@methodOf OWF.Preferences
1448 
1449 	@returns {String} url
1450  */
1451 
1452 /**
1453 	Sets the url for the Preference Server
1454 	@name setUrl
1455 	@methodOf OWF.Preferences
1456 
1457 	@param {String} url
1458 	@returns void
1459  */
1460 
1461 /**
1462  * @name getDashboard
1463  * @methodOf OWF.Preferences
1464  * @description Gets the dashboard with the specified id
1465  * @param {Object} cfg config object see below for properties
1466  * @param {String} cfg.dashboardId Unigue dashbard identifier
1467  * @param {Function} cfg.onSuccess Callback function to capture the success result. Callback parameter is json representation of a dashboard.
1468  * This method will be passed the dashboard object which has the following properties:<br>
1469  * <br>
1470  *     {Boolean} alteredByAdmin: true if altered by an administrator<br>
1471  *     {Date} createdDate: date dashboard was created<br>
1472  *     {Boolean} isGroupDashboard: true if dashboard is a group dashboard<br>
1473  *     {Boolean} isdefault: true if this is a default dashboard<br>
1474  *     {String} name: name of dashboard<br>
1475  *     {Object} user: the dashoard owner.  Has the following properties:<br>
1476  *         {String} userId: unique user identifier<br>
1477  *     {Object} createdBy: dashboard creator.  Has the following properties:<br>
1478  *         {String} userId: unique user identifier<br>
1479  *         {String} userRealName: user's name<br>
1480  *     {Date} editedDate: date dashboard was last edited<br>
1481  *     {Array} groups:  groups dashboard is assigned to<br>
1482  *     {String} description: description of dashboard<br>
1483  *     {String} guid: uniqued dashboard identifier<br>
1484  *     {String} layoutConfig: Holds the various containers and panes on a dashboard and the widgets inside of the panes, including the widget states.
1485  *     This parameter provides an EXT JS style configuration used to layout the supported pane types in an OWF dashboard along. Each
1486  *     internal definition can hold nested panes in an items array, widgets in a widgets array, and default values for those widgets in a defaultValues array.
1487  *     Panes can have the following parameters:<br>
1488  *     <ul style="list-style-type:none">
1489  *        <li>{String} xtype: container|accordionpane|desktoppane|fitpane|portalpane|tabbedpane|dashboardsplitter</li>
1490  *        <li>{Number} flex: 1 if for a pane; 3 for a container<li>
1491  *        <li>{String} htmlText: in pixels (e.g., 300px) or percent (e.g., 100%) or "variable"; valid if nested in a horizontally/vertically split pane</li>
1492  *        <li>{String} cls: left|right if nested in a horizontally split pane; top|bottom if nested in a vertically split pane; vbox|hbox if xtype is container</li>
1493  *        <li>{Array} items: an array of 2 nested pane configurations along with a possible dashboardspliiter for vbox and hbox containers; empty otherwise</li>
1494  *        <li>{String} paneType: accordionpane|desktoppane|fitpane|portalpane|tabbedpane; valid if xtype is not container</li>
1495  *        <li>{Array} layout: valid only for container xtype.  Includes the following elements:</li>
1496  *        <ul style="list-style-type:none">
1497  *           <li>{String} type: vbox|hbox</li>
1498  *           <li>{String} align: stretch</li>
1499  *        </ul>
1500  *        <li>{Array} widgets: array of widget state objects.  Each has the following properties:</li>
1501  *        <ul style="list-style-type:none">
1502  *           <li>{String} widgetGuid: unique widget identifier</li>
1503  *           <li>{Number} width: width of widget in pixels</li>
1504  *           <li>{Number} zIndex: in pixels</li>
1505  *           <li>{String} region: containing region on dashboard.  Dashboard type specific.</li>
1506  *           <li>{Boolean} pinned: true if widget is pinned open</li>
1507  *           <li>{String} buttonId: identifier of button that opens widget</li>
1508  *           <li>{Number} height: height of widget in pixels</li>
1509  *           <li>{Number} columnPos: position of widget in a column</li>
1510  *           <li>{String} name: widget name</li>
1511  *           <li>{Number} statePosition</li>
1512  *           <li>{Boolean} active: true if this widget is the active (has focus) widget</li>
1513  *           <li>{String} uniqueId: unique widget identifier on dashboard</li>
1514  *           <li>{Boolean} minimized: true if widget is minimized</li>
1515  *           <li>{Boolean} buttonOpened: true if button launched widget is opened</li>
1516  *           <li>{Boolean} collapsed: true if widget is collapsed</li>
1517  *           <li>{Number} y: y-axis position in pixels</li>
1518  *           <li>{Number} x: x-axis position in pixels</li>
1519  *           <li>{Boolean} maximized: true if widget is maximized</li>
1520  *        </ul>
1521  *        <li>{String} defaultSettings: JSON string of default settings which varies by pane type; not valid for containers</li>
1522  *     </ul>
1523  * <br>
1524  * @param {Function} [cfg.onFailure] Callback to execute if there is an error (optional, a default alert provided). Callback parameter is an error string.
1525  * @example
1526  *
1527  * var onSuccess = function(dashboard) {
1528  *     alert(dashboard.name);
1529  * };
1530  *
1531  * var onFailure = function(error) {
1532      *     alert(error);
1533  * };
1534  *
1535  * Ozone.Preferences.getDashboard({
1536  *     dashboardId:'917b4cd0-ecbd-410b-afd9-42d150c26426',
1537  *     onSuccess:onSuccess,
1538  *     onFailure:onFailure
1539  * });
1540  */
1541 
1542 
1543  /**
1544    * @name getDefaultDashboard
1545    * @methodOf OWF.Preferences
1546    * @description Gets the user's default dashboard
1547    * @param {Object} cfg config object see below for properties
1548    * @param {Function} cfg.onSuccess Callback function to capture the success result. Callback parameter is json representation of a Dashboard.
1549    * This method will be passed the dashboard object which has the following properties:<br>
1550    * <br>
1551    *     {Boolean} alteredByAdmin: true if altered by an administrator<br>
1552    *     {Date} createdDate: date dashboard was created<br>
1553    *     {Boolean} isGroupDashboard: true if dashboard is a group dashboard<br>
1554    *     {Boolean} isdefault: true if this is a default dashboard<br>
1555    *     {String} name: name of dashboard<br>
1556    *     {Object} user: the dashoard owner.  Has the following properties:<br>
1557    *         {String} userId: unique user identifier<br>
1558    *     {Object} createdBy: dashboard creator.  Has the following properties:<br>
1559    *         {String} userId: unique user identifier<br>
1560    *         {String} userRealName: user's name<br>
1561    *     {Date} editedDate: date dashboard was last edited<br>
1562    *     {Array} groups:  groups dashboard is assigned to<br>
1563    *     {String} description: description of dashboard<br>
1564    *     {String} guid: uniqued dashboard identifier<br>
1565    *     {String} layoutConfig: Holds the various containers and panes on a dashboard and the widgets inside of the panes, including the widget states.
1566    *     This parameter provides an EXT JS style configuration used to layout the supported pane types in an OWF dashboard along. Each
1567    *     internal definition can hold nested panes in an items array, widgets in a widgets array, and default values for those widgets in a defaultValues array.
1568    *     Panes can have the following parameters:<br>
1569    *     <ul style="list-style-type:none">
1570    *        <li>{String} xtype: container|accordionpane|desktoppane|fitpane|portalpane|tabbedpane|dashboardsplitter</li>
1571    *        <li>{Number} flex: 1 if for a pane; 3 for a container<li>
1572    *        <li>{String} htmlText: in pixels (e.g., 300px) or percent (e.g., 100%) or "variable"; valid if nested in a horizontally/vertically split pane</li>
1573    *        <li>{String} cls: left|right if nested in a horizontally split pane; top|bottom if nested in a vertically split pane; vbox|hbox if xtype is container</li>
1574    *        <li>{Array} items: an array of 2 nested pane configurations along with a possible dashboardspliiter for vbox and hbox containers; empty otherwise</li>
1575    *        <li>{String} paneType: accordionpane|desktoppane|fitpane|portalpane|tabbedpane; valid if xtype is not container</li>
1576    *        <li>{Array} layout: valid only for container xtype.  Includes the following elements:</li>
1577    *        <ul style="list-style-type:none">
1578    *           <li>{String} type: vbox|hbox</li>
1579    *           <li>{String} align: stretch</li>
1580    *        </ul>
1581    *        <li>{Array} widgets: array of widget state objects.  Each has the following properties:</li>
1582    *        <ul style="list-style-type:none">
1583    *           <li>{String} widgetGuid: unique widget identifier</li>
1584    *           <li>{Number} width: width of widget in pixels</li>
1585    *           <li>{Number} zIndex: in pixels</li>
1586    *           <li>{String} region: containing region on dashboard.  Dashboard type specific.</li>
1587    *           <li>{Boolean} pinned: true if widget is pinned open</li>
1588    *           <li>{String} buttonId: identifier of button that opens widget</li>
1589    *           <li>{Number} height: height of widget in pixels</li>
1590    *           <li>{Number} columnPos: position of widget in a column</li>
1591    *           <li>{String} name: widget name</li>
1592    *           <li>{Number} statePosition</li>
1593    *           <li>{Boolean} active: true if this widget is the active (has focus) widget</li>
1594    *           <li>{String} uniqueId: unique widget identifier on dashboard</li>
1595    *           <li>{Boolean} minimized: true if widget is minimized</li>
1596    *           <li>{Boolean} buttonOpened: true if button launched widget is opened</li>
1597    *           <li>{Boolean} collapsed: true if widget is collapsed</li>
1598    *           <li>{Number} y: y-axis position in pixels</li>
1599    *           <li>{Number} x: x-axis position in pixels</li>
1600    *           <li>{Boolean} maximized: true if widget is maximized</li>
1601    *        </ul>
1602    *        <li>{String} defaultSettings: JSON string of default settings which varies by pane type; not valid for containers</li>
1603    *     </ul>
1604    * <br>
1605    * @param {Function} [cfg.onFailure] Callback to execute if there is an error (optional, a default alert provided). Callback parameter is an error string.
1606    * @example
1607    *
1608    * var onSuccess = function(dashboard) {
1609    *     alert(dashboard.name);
1610    * };
1611    *
1612    * var onFailure = function(error) {
1613        *     alert(error);
1614    * };
1615    *
1616    * Ozone.Preferences.getDashboard({
1617    *     onSuccess:onSuccess,
1618    *     onFailure:onFailure
1619    * });
1620    */
1621 /**
1622  * @name setDefaultDashboard
1623  * @methodOf OWF.Preferences
1624  * @description Sets the user's default dashboard
1625  * @param {Object} cfg config object see below for properties
1626  * @param {String} cfg.dashboardId Unigue dashbard identifier
1627  * @param {Boolean} cfg.isDefault true to set as default dashboard
1628  * @param {Function} cfg.onSuccess Callback function to capture the success result. Callback parameter is json representation of a Dashboard.
1629  * This method will be passed the dashboard object which has the following properties:<br>
1630  * <br>
1631  *     {Boolean} alteredByAdmin: true if altered by an administrator<br>
1632  *     {Date} createdDate: date dashboard was created<br>
1633  *     {Boolean} isGroupDashboard: true if dashboard is a group dashboard<br>
1634  *     {Boolean} isdefault: true if this is a default dashboard<br>
1635  *     {String} name: name of dashboard<br>
1636  *     {Object} user: the dashoard owner.  Has the following properties:<br>
1637  *         {String} userId: unique user identifier<br>
1638  *     {Object} createdBy: dashboard creator.  Has the following properties:<br>
1639  *         {String} userId: unique user identifier<br>
1640  *         {String} userRealName: user's name<br>
1641  *     {Date} editedDate: date dashboard was last edited<br>
1642  *     {Array} groups:  groups dashboard is assigned to<br>
1643  *     {String} description: description of dashboard<br>
1644  *     {String} guid: uniqued dashboard identifier<br>
1645  *     {String} layoutConfig: Holds the various containers and panes on a dashboard and the widgets inside of the panes, including the widget states.
1646  *     This parameter provides an EXT JS style configuration used to layout the supported pane types in an OWF dashboard along. Each
1647  *     internal definition can hold nested panes in an items array, widgets in a widgets array, and default values for those widgets in a defaultValues array.
1648  *     Panes can have the following parameters:<br>
1649  *     <ul style="list-style-type:none">
1650  *        <li>{String} xtype: container|accordionpane|desktoppane|fitpane|portalpane|tabbedpane|dashboardsplitter</li>
1651  *        <li>{Number} flex: 1 if for a pane; 3 for a container<li>
1652  *        <li>{String} htmlText: in pixels (e.g., 300px) or percent (e.g., 100%) or "variable"; valid if nested in a horizontally/vertically split pane</li>
1653  *        <li>{String} cls: left|right if nested in a horizontally split pane; top|bottom if nested in a vertically split pane; vbox|hbox if xtype is container</li>
1654  *        <li>{Array} items: an array of 2 nested pane configurations along with a possible dashboardspliiter for vbox and hbox containers; empty otherwise</li>
1655  *        <li>{String} paneType: accordionpane|desktoppane|fitpane|portalpane|tabbedpane; valid if xtype is not container</li>
1656  *        <li>{Array} layout: valid only for container xtype.  Includes the following elements:</li>
1657  *        <ul style="list-style-type:none">
1658  *           <li>{String} type: vbox|hbox</li>
1659  *           <li>{String} align: stretch</li>
1660  *        </ul>
1661  *        <li>{Array} widgets: array of widget state objects.  Each has the following properties:</li>
1662  *        <ul style="list-style-type:none">
1663  *           <li>{String} widgetGuid: unique widget identifier</li>
1664  *           <li>{Number} width: width of widget in pixels</li>
1665  *           <li>{Number} zIndex: in pixels</li>
1666  *           <li>{String} region: containing region on dashboard.  Dashboard type specific.</li>
1667  *           <li>{Boolean} pinned: true if widget is pinned open</li>
1668  *           <li>{String} buttonId: identifier of button that opens widget</li>
1669  *           <li>{Number} height: height of widget in pixels</li>
1670  *           <li>{Number} columnPos: position of widget in a column</li>
1671  *           <li>{String} name: widget name</li>
1672  *           <li>{Number} statePosition</li>
1673  *           <li>{Boolean} active: true if this widget is the active (has focus) widget</li>
1674  *           <li>{String} uniqueId: unique widget identifier on dashboard</li>
1675  *           <li>{Boolean} minimized: true if widget is minimized</li>
1676  *           <li>{Boolean} buttonOpened: true if button launched widget is opened</li>
1677  *           <li>{Boolean} collapsed: true if widget is collapsed</li>
1678  *           <li>{Number} y: y-axis position in pixels</li>
1679  *           <li>{Number} x: x-axis position in pixels</li>
1680  *           <li>{Boolean} maximized: true if widget is maximized</li>
1681  *        </ul>
1682  *        <li>{String} defaultSettings: JSON string of default settings which varies by pane type; not valid for containers</li>
1683  *     </ul>
1684  * <br>
1685  * @param {Function} [cfg.onFailure] Callback to execute if there is an error (optional, a default alert provided). Callback parameter is an error string.
1686  * @example
1687  *
1688  * var onSuccess = function(dashboard) {
1689  *     alert(dashboard.name);
1690  * };
1691  *
1692  * var onFailure = function(error) {
1693  *     alert(error);
1694  * };
1695  *
1696  * OWF.Preferences.setDefaultDashboard({
1697  *     dashboardId:'917b4cd0-ecbd-410b-afd9-42d150c26426',
1698  *     isDefault:true,
1699  *     onSuccess:onSuccess,
1700  *     onFailure:onFailure
1701  * });
1702  */
1703 
1704 /**
1705  * @name createOrUpdateDashboard
1706  * @methodOf OWF.Preferences
1707  * @description Saves changes to a new or existing dashboard
1708  * @param {Object} cfg config object see below for properties
1709  * @param {Object} cfg.json The encoded JSON object representing the dashboard.
1710  * The dashboard object has the following properties:<br>
1711  * <br>
1712  *     {Boolean} alteredByAdmin: true if altered by an administrator<br>
1713  *     {Date} createdDate: date dashboard was created<br>
1714  *     {Boolean} isGroupDashboard: true if dashboard is a group dashboard<br>
1715  *     {String} layout: layout of dashboard<br>
1716  *     {Boolean} isdefault: true if this is a default dashboard<br>
1717  *     {String} name: name of dashboard<br>
1718  *     {Number} columnCount: number of columns if dashboard is a portal type<br>
1719  *     {Object} user: the dashoard owner.  Has the following properties:<br>
1720  *         {String} userId: unique user identifier<br>
1721  *     {List} EDashboardLayoutList: list of dashboard types<br>
1722  *     {String} defaultSettings: JSON string of default settings which varies by dashboard type<br>
1723  *     {Object} createdBy: dashboard creator.  Has the following properties:<br>
1724  *         {String} userId: unique user identifier<br>
1725  *         {String} userRealName: user's name<br>
1726  *     {Date} editedDate: date dashboard was last edited<br>
1727  *     {Array} groups:  groups dashboard is assigned to<br>
1728  *     {String} description: description of dashboard<br>
1729  *     {String} guid: uniqued dashboard identifier<br>
1730  *     {String} layoutConfig: Holds the various containers and panes on a dashboard and the widgets inside of the panes, including the widget states.
1731  *     This parameter provides an EXT JS style configuration used to layout the supported pane types in an OWF dashboard along. Each
1732  *     internal definition can hold nested panes in an items array, widgets in a widgets array, and default values for those widgets in a defaultValues array.
1733  *     Panes can have the following parameters:<br>
1734  *     <ul style="list-style-type:none">
1735  *        <li>{String} xtype: container|accordionpane|desktoppane|fitpane|portalpane|tabbedpane|dashboardsplitter</li>
1736  *        <li>{Number} flex: 1 if for a pane; 3 for a container<li>
1737  *        <li>{String} htmlText: in pixels (e.g., 300px) or percent (e.g., 100%) or "variable"; valid if nested in a horizontally/vertically split pane</li>
1738  *        <li>{String} cls: left|right if nested in a horizontally split pane; top|bottom if nested in a vertically split pane; vbox|hbox if xtype is container</li>
1739  *        <li>{Array} items: an array of 2 nested pane configurations along with a possible dashboardspliiter for vbox and hbox containers; empty otherwise</li>
1740  *        <li>{String} paneType: accordionpane|desktoppane|fitpane|portalpane|tabbedpane; valid if xtype is not container</li>
1741  *        <li>{Array} layout: valid only for container xtype.  Includes the following elements:</li>
1742  *        <ul style="list-style-type:none">
1743  *           <li>{String} type: vbox|hbox</li>
1744  *           <li>{String} align: stretch</li>
1745  *        </ul>
1746  *        <li>{Array} widgets: array of widget state objects.  Each has the following properties:</li>
1747  *        <ul style="list-style-type:none">
1748  *           <li>{String} widgetGuid: unique widget identifier</li>
1749  *           <li>{Number} width: width of widget in pixels</li>
1750  *           <li>{Number} zIndex: in pixels</li>
1751  *           <li>{String} region: containing region on dashboard.  Dashboard type specific.</li>
1752  *           <li>{Boolean} pinned: true if widget is pinned open</li>
1753  *           <li>{String} buttonId: identifier of button that opens widget</li>
1754  *           <li>{Number} height: height of widget in pixels</li>
1755  *           <li>{Number} columnPos: position of widget in a column</li>
1756  *           <li>{String} name: widget name</li>
1757  *           <li>{Number} statePosition</li>
1758  *           <li>{Boolean} active: true if this widget is the active (has focus) widget</li>
1759  *           <li>{String} uniqueId: unique widget identifier on dashboard</li>
1760  *           <li>{Boolean} minimized: true if widget is minimized</li>
1761  *           <li>{Boolean} buttonOpened: true if button launched widget is opened</li>
1762  *           <li>{Boolean} collapsed: true if widget is collapsed</li>
1763  *           <li>{Number} y: y-axis position in pixels</li>
1764  *           <li>{Number} x: x-axis position in pixels</li>
1765  *           <li>{Boolean} maximized: true if widget is maximized</li>
1766  *        </ul>
1767  *        <li>{String} defaultSettings: JSON string of default settings which varies by pane type; not valid for containers</li>
1768  *     </ul>
1769  * <br>
1770  * @param {Boolean} cfg.saveAsNew A Boolean indicating whether the entity being saved is new.
1771  * @param {Function} cfg.onSuccess Callback function to capture the success result. Callback parameter is json representation of a Dashboard.
1772  * This method will be passed the dashboard object which has the following properties:<br>
1773  * <br>
1774  *     {Boolean} alteredByAdmin: true if altered by an administrator<br>
1775  *     {Date} createdDate: date dashboard was created<br>
1776  *     {Boolean} isGroupDashboard: true if dashboard is a group dashboard<br>
1777  *     {Boolean} isdefault: true if this is a default dashboard<br>
1778  *     {String} name: name of dashboard<br>
1779  *     {Object} user: the dashoard owner.  Has the following properties:<br>
1780  *         {String} userId: unique user identifier<br>
1781  *     {Object} createdBy: dashboard creator.  Has the following properties:<br>
1782  *         {String} userId: unique user identifier<br>
1783  *         {String} userRealName: user's name<br>
1784  *     {Date} editedDate: date dashboard was last edited<br>
1785  *     {Array} groups:  groups dashboard is assigned to<br>
1786  *     {String} description: description of dashboard<br>
1787  *     {String} guid: uniqued dashboard identifier<br>
1788  *     {String} layoutConfig: Holds the various containers and panes on a dashboard and the widgets inside of the panes, including the widget states.
1789  *     This parameter provides an EXT JS style configuration used to layout the supported pane types in an OWF dashboard along. Each
1790  *     internal definition can hold nested panes in an items array, widgets in a widgets array, and default values for those widgets in a defaultValues array.
1791  *     Panes can have the following parameters:<br>
1792  *     <ul style="list-style-type:none">
1793  *        <li>{String} xtype: container|accordionpane|desktoppane|fitpane|portalpane|tabbedpane|dashboardsplitter</li>
1794  *        <li>{Number} flex: 1 if for a pane; 3 for a container<li>
1795  *        <li>{String} htmlText: in pixels (e.g., 300px) or percent (e.g., 100%) or "variable"; valid if nested in a horizontally/vertically split pane</li>
1796  *        <li>{String} cls: left|right if nested in a horizontally split pane; top|bottom if nested in a vertically split pane; vbox|hbox if xtype is container</li>
1797  *        <li>{Array} items: an array of 2 nested pane configurations along with a possible dashboardspliiter for vbox and hbox containers; empty otherwise</li>
1798  *        <li>{String} paneType: accordionpane|desktoppane|fitpane|portalpane|tabbedpane; valid if xtype is not container</li>
1799  *        <li>{Array} layout: valid only for container xtype.  Includes the following elements:</li>
1800  *        <ul style="list-style-type:none">
1801  *           <li>{String} type: vbox|hbox</li>
1802  *           <li>{String} align: stretch</li>
1803  *        </ul>
1804  *        <li>{Array} widgets: array of widget state objects.  Each has the following properties:</li>
1805  *        <ul style="list-style-type:none">
1806  *           <li>{String} widgetGuid: unique widget identifier</li>
1807  *           <li>{Number} width: width of widget in pixels</li>
1808  *           <li>{Number} zIndex: in pixels</li>
1809  *           <li>{String} region: containing region on dashboard.  Dashboard type specific.</li>
1810  *           <li>{Boolean} pinned: true if widget is pinned open</li>
1811  *           <li>{String} buttonId: identifier of button that opens widget</li>
1812  *           <li>{Number} height: height of widget in pixels</li>
1813  *           <li>{Number} columnPos: position of widget in a column</li>
1814  *           <li>{String} name: widget name</li>
1815  *           <li>{Number} statePosition</li>
1816  *           <li>{Boolean} active: true if this widget is the active (has focus) widget</li>
1817  *           <li>{String} uniqueId: unique widget identifier on dashboard</li>
1818  *           <li>{Boolean} minimized: true if widget is minimized</li>
1819  *           <li>{Boolean} buttonOpened: true if button launched widget is opened</li>
1820  *           <li>{Boolean} collapsed: true if widget is collapsed</li>
1821  *           <li>{Number} y: y-axis position in pixels</li>
1822  *           <li>{Number} x: x-axis position in pixels</li>
1823  *           <li>{Boolean} maximized: true if widget is maximized</li>
1824  *        </ul>
1825  *        <li>{String} defaultSettings: JSON string of default settings which varies by pane type; not valid for containers</li>
1826  *     </ul>
1827  * <br>
1828  * @param {Function} [cfg.onFailure] Callback to execute if there is an error (optional, a default alert provided). Callback parameter is an error string.
1829  * @param {Boolean} [cfg.async] Async true or false defaults to true
1830  * @example
1831  *
1832  * var onSuccess = function(dashboard) {
1833  *   alert(dashboard.name);
1834  * };
1835  *
1836  * var onFailure = function(error) {
1837  *   alert(error);
1838  * };
1839  *
1840  * var dashboard = {
1841  *   alteredByAdmin: 'false',
1842  *   createdDate: '04/18/2012 11:29 AM EDT',
1843  *   isGroupDashboard: false,
1844  *   isdefault: false,
1845  *   locked: false,
1846  *   name: 'My Dashboard',
1847  *   user: {
1848  *     userId: 'testAdmin1',
1849  *   },
1850  *   createdBy: {
1851  *     userId: 'testAdmin1',
1852  *     userRealName: 'Test Admin 1'
1853  *   },
1854  *   editedDate: '04/18/2012 11:29 AM EDT',
1855  *   groups: [],
1856  *   description: 'This is my dashboard',
1857  *   guid: guid.util.guid(),
1858  *   layoutConfig: {
1859  *       xtype: "desktoppane", 
1860  *       flex: 1, 
1861  *       height: "100%", 
1862  *       items: [
1863  *       ], 
1864  *       paneType: "desktoppane", 
1865  *       widgets: [{
1866  *               widgetGuid: "ec5435cf-4021-4f2a-ba69-dde451d12551", 
1867  *               uniqueId: guid.util.guid(), 
1868  *               dashboardGuid: "6d7219cb-b485-ace5-946b-0affa1f227a3", 
1869  *               paneGuid: guid.util.guid(), 
1870  *               name: "Channel Listener", 
1871  *               active: false, 
1872  *               x: 50, 
1873  *               y: 66, 
1874  *               minimized: false, 
1875  *               maximized: false, 
1876  *               pinned: false, 
1877  *               collapsed: false, 
1878  *               columnPos: 0, 
1879  *               buttonId: null, 
1880  *               buttonOpened: false, 
1881  *               region: "none", 
1882  *               statePosition: 1, 
1883  *               intentConfig: null, 
1884  *               singleton: false, 
1885  *               floatingWidget: false, 
1886  *               background: false, 
1887  *               zIndex: 19050, 
1888  *               height: 440, 
1889  *               width: 540
1890  *           }
1891  *       ], 
1892  *       defaultSettings: {
1893  *           widgetStates: {
1894  *               "ec5435cf-4021-4f2a-ba69-dde451d12551": {
1895  *                   x: 50, 
1896  *                   y: 66, 
1897  *                   height: 440, 
1898  *                   width: 540, 
1899  *                   timestamp: 1349809747336
1900  *                }
1901  *           }
1902  *       }
1903  *      }
1904  * };
1905  *
1906  * OWF.Preferences.createOrUpdateDashboard({
1907  *   json: dashboard,
1908  *   saveAsNew: true,
1909  *   onSuccess: onSuccess,
1910  *   onFailure: onFailure,
1911  *   async: true
1912  * });
1913  */
1914 
1915 /**
1916  * @name cloneDashboard
1917  * @methodOf OWF.Preferences
1918  * @description Copies an existing dashboard and saves it as new
1919  * @param {Object} cfg config object see below for properties
1920  * @param {Object} cfg.json The encoded JSON object representing the dashboard.
1921  * The dashboard object has the following properties:<br>
1922  * <br>
1923  *     {Boolean} alteredByAdmin: true if altered by an administrator<br>
1924  *     {Date} createdDate: date dashboard was created<br>
1925  *     {Boolean} isGroupDashboard: true if dashboard is a group dashboard<br>
1926  *     {Boolean} isdefault: true if this is a default dashboard<br>
1927  *     {String} name: name of dashboard<br>
1928  *     {Object} user: the dashoard owner.  Has the following properties:<br>
1929  *         {String} userId: unique user identifier<br>
1930  *     {Object} createdBy: dashboard creator.  Has the following properties:<br>
1931  *         {String} userId: unique user identifier<br>
1932  *         {String} userRealName: user's name<br>
1933  *     {Date} editedDate: date dashboard was last edited<br>
1934  *     {Array} groups:  groups dashboard is assigned to<br>
1935  *     {String} description: description of dashboard<br>
1936  *     {String} guid: uniqued dashboard identifier<br>
1937  *     {String} layoutConfig: Holds the various containers and panes on a dashboard and the widgets inside of the panes, including the widget states.
1938  *     This parameter provides an EXT JS style configuration used to layout the supported pane types in an OWF dashboard along. Each
1939  *     internal definition can hold nested panes in an items array, widgets in a widgets array, and default values for those widgets in a defaultValues array.
1940  *     Panes can have the following parameters:<br>
1941  *     <ul style="list-style-type:none">
1942  *        <li>{String} xtype: container|accordionpane|desktoppane|fitpane|portalpane|tabbedpane|dashboardsplitter</li>
1943  *        <li>{Number} flex: 1 if for a pane; 3 for a container<li>
1944  *        <li>{String} htmlText: in pixels (e.g., 300px) or percent (e.g., 100%) or "variable"; valid if nested in a horizontally/vertically split pane</li>
1945  *        <li>{String} cls: left|right if nested in a horizontally split pane; top|bottom if nested in a vertically split pane; vbox|hbox if xtype is container</li>
1946  *        <li>{Array} items: an array of 2 nested pane configurations along with a possible dashboardspliiter for vbox and hbox containers; empty otherwise</li>
1947  *        <li>{String} paneType: accordionpane|desktoppane|fitpane|portalpane|tabbedpane; valid if xtype is not container</li>
1948  *        <li>{Array} layout: valid only for container xtype.  Includes the following elements:</li>
1949  *        <ul style="list-style-type:none">
1950  *           <li>{String} type: vbox|hbox</li>
1951  *           <li>{String} align: stretch</li>
1952  *        </ul>
1953  *        <li>{Array} widgets: array of widget state objects.  Each has the following properties:</li>
1954  *        <ul style="list-style-type:none">
1955  *           <li>{String} widgetGuid: unique widget identifier</li>
1956  *           <li>{Number} width: width of widget in pixels</li>
1957  *           <li>{Number} zIndex: in pixels</li>
1958  *           <li>{String} region: containing region on dashboard.  Dashboard type specific.</li>
1959  *           <li>{Boolean} pinned: true if widget is pinned open</li>
1960  *           <li>{String} buttonId: identifier of button that opens widget</li>
1961  *           <li>{Number} height: height of widget in pixels</li>
1962  *           <li>{Number} columnPos: position of widget in a column</li>
1963  *           <li>{String} name: widget name</li>
1964  *           <li>{Number} statePosition</li>
1965  *           <li>{Boolean} active: true if this widget is the active (has focus) widget</li>
1966  *           <li>{String} uniqueId: unique widget identifier on dashboard</li>
1967  *           <li>{Boolean} minimized: true if widget is minimized</li>
1968  *           <li>{Boolean} buttonOpened: true if button launched widget is opened</li>
1969  *           <li>{Boolean} collapsed: true if widget is collapsed</li>
1970  *           <li>{Number} y: y-axis position in pixels</li>
1971  *           <li>{Number} x: x-axis position in pixels</li>
1972  *           <li>{Boolean} maximized: true if widget is maximized</li>
1973  *        </ul>
1974  *        <li>{String} defaultSettings: JSON string of default settings which varies by pane type; not valid for containers</li>
1975  *     </ul>
1976  * <br>
1977  * @param {Function} cfg.onSuccess Callback function to capture the success result. Callback parameter is json representation of a Dashboard.
1978  * This method will be passed the dashboard object which has the following properties:<br>
1979  * <br>
1980  *     {Boolean} alteredByAdmin: true if altered by an administrator<br>
1981  *     {Date} createdDate: date dashboard was created<br>
1982  *     {Boolean} isGroupDashboard: true if dashboard is a group dashboard<br>
1983  *     {Boolean} isdefault: true if this is a default dashboard<br>
1984  *     {String} name: name of dashboard<br>
1985  *     {Object} user: the dashoard owner.  Has the following properties:<br>
1986  *         {String} userId: unique user identifier<br>
1987  *     {Object} createdBy: dashboard creator.  Has the following properties:<br>
1988  *         {String} userId: unique user identifier<br>
1989  *         {String} userRealName: user's name<br>
1990  *     {Date} editedDate: date dashboard was last edited<br>
1991  *     {Array} groups:  groups dashboard is assigned to<br>
1992  *     {String} description: description of dashboard<br>
1993  *     {String} guid: uniqued dashboard identifier<br>
1994  *     {String} layoutConfig: Holds the various containers and panes on a dashboard and the widgets inside of the panes, including the widget states.
1995  *     This parameter provides an EXT JS style configuration used to layout the supported pane types in an OWF dashboard along. Each
1996  *     internal definition can hold nested panes in an items array, widgets in a widgets array, and default values for those widgets in a defaultValues array.
1997  *     Panes can have the following parameters:<br>
1998  *     <ul style="list-style-type:none">
1999  *        <li>{String} xtype: container|accordionpane|desktoppane|fitpane|portalpane|tabbedpane|dashboardsplitter</li>
2000  *        <li>{Number} flex: 1 if for a pane; 3 for a container<li>
2001  *        <li>{String} htmlText: in pixels (e.g., 300px) or percent (e.g., 100%) or "variable"; valid if nested in a horizontally/vertically split pane</li>
2002  *        <li>{String} cls: left|right if nested in a horizontally split pane; top|bottom if nested in a vertically split pane; vbox|hbox if xtype is container</li>
2003  *        <li>{Array} items: an array of 2 nested pane configurations along with a possible dashboardspliiter for vbox and hbox containers; empty otherwise</li>
2004  *        <li>{String} paneType: accordionpane|desktoppane|fitpane|portalpane|tabbedpane; valid if xtype is not container</li>
2005  *        <li>{Array} layout: valid only for container xtype.  Includes the following elements:</li>
2006  *        <ul style="list-style-type:none">
2007  *           <li>{String} type: vbox|hbox</li>
2008  *           <li>{String} align: stretch</li>
2009  *        </ul>
2010  *        <li>{Array} widgets: array of widget state objects.  Each has the following properties:</li>
2011  *        <ul style="list-style-type:none">
2012  *           <li>{String} widgetGuid: unique widget identifier</li>
2013  *           <li>{Number} width: width of widget in pixels</li>
2014  *           <li>{Number} zIndex: in pixels</li>
2015  *           <li>{String} region: containing region on dashboard.  Dashboard type specific.</li>
2016  *           <li>{Boolean} pinned: true if widget is pinned open</li>
2017  *           <li>{String} buttonId: identifier of button that opens widget</li>
2018  *           <li>{Number} height: height of widget in pixels</li>
2019  *           <li>{Number} columnPos: position of widget in a column</li>
2020  *           <li>{String} name: widget name</li>
2021  *           <li>{Number} statePosition</li>
2022  *           <li>{Boolean} active: true if this widget is the active (has focus) widget</li>
2023  *           <li>{String} uniqueId: unique widget identifier on dashboard</li>
2024  *           <li>{Boolean} minimized: true if widget is minimized</li>
2025  *           <li>{Boolean} buttonOpened: true if button launched widget is opened</li>
2026  *           <li>{Boolean} collapsed: true if widget is collapsed</li>
2027  *           <li>{Number} y: y-axis position in pixels</li>
2028  *           <li>{Number} x: x-axis position in pixels</li>
2029  *           <li>{Boolean} maximized: true if widget is maximized</li>
2030  *        </ul>
2031  *        <li>{String} defaultSettings: JSON string of default settings which varies by pane type; not valid for containers</li>
2032  *     </ul>
2033  * <br>
2034  * @param {Function} [cfg.onFailure] Callback to execute if there is an error (optional, a default alert provided). Callback parameter is an error string.
2035  * @example
2036  *
2037  * var onSuccess = function(dashboard) {
2038  *   alert(dashboard.name);
2039  * };
2040  *
2041  * var onFailure = function(error) {
2042  *   alert(error);
2043  * };
2044  *
2045  * var dashboard = {
2046  *   alteredByAdmin: 'false',
2047  *   createdDate: '04/18/2012 11:29 AM EDT',
2048  *   isGroupDashboard: false,
2049  *   isdefault: false,
2050  *   name: 'My Dashboard',
2051  *   user: {
2052  *     userId: 'testAdmin1',
2053  *   },
2054  *   createdBy: {
2055  *     userId: 'testAdmin1',
2056  *     userRealName: 'Test Admin 1'
2057  *   },
2058  *   editedDate: '04/18/2012 11:29 AM EDT',
2059  *   groups: [],
2060  *   description: 'This is my dashboard',
2061  *   guid: guid.util.guid(),
2062  * };
2063  *
2064  * OWF.Preferences.cloneDashboard({
2065  *   json: dashboard,
2066  *   onSuccess: onSuccess,
2067  *   onFailure: onFailure
2068  * });
2069  */
2070 
2071 
2072 /**
2073 	@description Saves changes to existing dashboards
2074 	@name updateAndDeleteDashboards
2075 	@methodOf OWF.Preferences
2076 
2077 	@param {Object} cfg config object see below for properties
2078 	@param {Array} cfg.viewsToUpdate array of JSON objects containing the view guid and data to be updated
2079 	@param {Array} cfg.viewGuidsToDelete array of guids of views to be deleted
2080 	@param {Boolean} cfg.updateOrder flag to update order
2081 	@param {Function} cfg.onSuccess callback function to capture the success result
2082 	@param {Function} [cfg.onFailure] callback to execute if there is an error (optional, a default alert provided)
2083  */
2084 
2085 /**
2086  * @name deleteDashboard
2087  * @methodOf OWF.Preferences
2088  * @description Deletes the dashboard with the specified id
2089  * @param {Object} cfg config object see below for properties
2090  * @param {String} cfg.dashboardId Unigue dashbard identifier
2091  * @param {Function} cfg.onSuccess Callback function to capture the success result. Callback parameter is json representation of a Dashboard.
2092  * This method will be passed the dashboard object which has the following properties:<br>
2093  * <br>
2094  *     {Boolean} alteredByAdmin: true if altered by an administrator<br>
2095  *     {Date} createdDate: date dashboard was created<br>
2096  *     {Boolean} isGroupDashboard: true if dashboard is a group dashboard<br>
2097  *     {Boolean} isdefault: true if this is a default dashboard<br>
2098  *     {String} name: name of dashboard<br>
2099  *     {Object} user: the dashoard owner.  Has the following properties:<br>
2100  *         {String} userId: unique user identifier<br>
2101  *     {Object} createdBy: dashboard creator.  Has the following properties:<br>
2102  *         {String} userId: unique user identifier<br>
2103  *         {String} userRealName: user's name<br>
2104  *     {Date} editedDate: date dashboard was last edited<br>
2105  *     {Array} groups:  groups dashboard is assigned to<br>
2106  *     {String} description: description of dashboard<br>
2107  *     {String} guid: uniqued dashboard identifier<br>
2108  *     {String} layoutConfig: Holds the various containers and panes on a dashboard and the widgets inside of the panes, including the widget states.
2109  *     This parameter provides an EXT JS style configuration used to layout the supported pane types in an OWF dashboard along. Each
2110  *     internal definition can hold nested panes in an items array, widgets in a widgets array, and default values for those widgets in a defaultValues array.
2111  *     Panes can have the following parameters:<br>
2112  *     <ul style="list-style-type:none">
2113  *        <li>{String} xtype: container|accordionpane|desktoppane|fitpane|portalpane|tabbedpane|dashboardsplitter</li>
2114  *        <li>{Number} flex: 1 if for a pane; 3 for a container<li>
2115  *        <li>{String} htmlText: in pixels (e.g., 300px) or percent (e.g., 100%) or "variable"; valid if nested in a horizontally/vertically split pane</li>
2116  *        <li>{String} cls: left|right if nested in a horizontally split pane; top|bottom if nested in a vertically split pane; vbox|hbox if xtype is container</li>
2117  *        <li>{Array} items: an array of 2 nested pane configurations along with a possible dashboardspliiter for vbox and hbox containers; empty otherwise</li>
2118  *        <li>{String} paneType: accordionpane|desktoppane|fitpane|portalpane|tabbedpane; valid if xtype is not container</li>
2119  *        <li>{Array} layout: valid only for container xtype.  Includes the following elements:</li>
2120  *        <ul style="list-style-type:none">
2121  *           <li>{String} type: vbox|hbox</li>
2122  *           <li>{String} align: stretch</li>
2123  *        </ul>
2124  *        <li>{Array} widgets: array of widget state objects.  Each has the following properties:</li>
2125  *        <ul style="list-style-type:none">
2126  *           <li>{String} widgetGuid: unique widget identifier</li>
2127  *           <li>{Number} width: width of widget in pixels</li>
2128  *           <li>{Number} zIndex: in pixels</li>
2129  *           <li>{String} region: containing region on dashboard.  Dashboard type specific.</li>
2130  *           <li>{Boolean} pinned: true if widget is pinned open</li>
2131  *           <li>{String} buttonId: identifier of button that opens widget</li>
2132  *           <li>{Number} height: height of widget in pixels</li>
2133  *           <li>{Number} columnPos: position of widget in a column</li>
2134  *           <li>{String} name: widget name</li>
2135  *           <li>{Number} statePosition</li>
2136  *           <li>{Boolean} active: true if this widget is the active (has focus) widget</li>
2137  *           <li>{String} uniqueId: unique widget identifier on dashboard</li>
2138  *           <li>{Boolean} minimized: true if widget is minimized</li>
2139  *           <li>{Boolean} buttonOpened: true if button launched widget is opened</li>
2140  *           <li>{Boolean} collapsed: true if widget is collapsed</li>
2141  *           <li>{Number} y: y-axis position in pixels</li>
2142  *           <li>{Number} x: x-axis position in pixels</li>
2143  *           <li>{Boolean} maximized: true if widget is maximized</li>
2144  *        </ul>
2145  *        <li>{String} defaultSettings: JSON string of default settings which varies by pane type; not valid for containers</li>
2146  *     </ul>
2147  * <br>
2148  * @param {Function} [cfg.onFailure] Callback to execute if there is an error (optional, a default alert provided). Callback parameter is an error string.
2149  * @example
2150  *
2151  * var onSuccess = function(dashboard) {
2152  *     alert(dashboard.name);
2153  * };
2154  *
2155  * var onFailure = function(error) {
2156      *     alert(error);
2157  * };
2158  *
2159  * OWF.Preferences.deleteDashboard({
2160  *     dashboardId:'917b4cd0-ecbd-410b-afd9-42d150c26426',
2161  *     onSuccess:onSuccess,
2162  *     onFailure:onFailure
2163  * });
2164  */
2165 
2166 /**
2167  * @name findDashboards
2168  * @methodOf OWF.Preferences
2169  * @description Returns all dashboards for the logged in user.
2170  * @param {Object} cfg config object see below for properties
2171  * @param {Function} cfg.onSuccess Callback function to capture the success result.
2172  * This method is passed an object having the following properties:<br>
2173  * <br>
2174  *     {Boolean} success: true if dashboards found<br>
2175  *     {Number} results: number of dashboards found<br>
2176  *     {Array} data: array of dashboards objects found.  Dashboard object has the following properties:<br>
2177  *     <br>
2178  *         {Boolean} alteredByAdmin: true if altered by an administrator<br>
2179  *         {Date} createdDate: date dashboard was created<br>
2180  *         {Boolean} isGroupDashboard: true if dashboard is a group dashboard<br>
2181  *         {Boolean} isdefault: true if this is a default dashboard<br>
2182  *         {String} name: name of dashboard<br>
2183  *         {Object} user: the dashoard owner.  Has the following properties:<br>
2184  *             {String} userId: unique user identifier<br>
2185  *         {Object} createdBy: dashboard creator.  Has the following properties:<br>
2186  *             {String} userId: unique user identifier<br>
2187  *             {String} userRealName: user's name<br>
2188  *         {Date} editedDate: date dashboard was last edited<br>
2189  *         {Array} groups:  groups dashboard is assigned to<br>
2190  *         {String} description: description of dashboard<br>
2191  *         {String} guid: uniqued dashboard identifier<br>
2192  *     {String} layoutConfig: Holds the various containers and panes on a dashboard and the widgets inside of the panes, including the widget states.
2193  *     This parameter provides an EXT JS style configuration used to layout the supported pane types in an OWF dashboard along. Each
2194  *     internal definition can hold nested panes in an items array, widgets in a widgets array, and default values for those widgets in a defaultValues array.
2195  *     Panes can have the following parameters:<br>
2196  *     <ul style="list-style-type:none">
2197  *        <li>{String} xtype: container|accordionpane|desktoppane|fitpane|portalpane|tabbedpane|dashboardsplitter</li>
2198  *        <li>{Number} flex: 1 if for a pane; 3 for a container<li>
2199  *        <li>{String} htmlText: in pixels (e.g., 300px) or percent (e.g., 100%) or "variable"; valid if nested in a horizontally/vertically split pane</li>
2200  *        <li>{String} cls: left|right if nested in a horizontally split pane; top|bottom if nested in a vertically split pane; vbox|hbox if xtype is container</li>
2201  *        <li>{Array} items: an array of 2 nested pane configurations along with a possible dashboardspliiter for vbox and hbox containers; empty otherwise</li>
2202  *        <li>{String} paneType: accordionpane|desktoppane|fitpane|portalpane|tabbedpane; valid if xtype is not container</li>
2203  *        <li>{Array} layout: valid only for container xtype.  Includes the following elements:</li>
2204  *        <ul style="list-style-type:none">
2205  *           <li>{String} type: vbox|hbox</li>
2206  *           <li>{String} align: stretch</li>
2207  *        </ul>
2208  *        <li>{Array} widgets: array of widget state objects.  Each has the following properties:</li>
2209  *        <ul style="list-style-type:none">
2210  *           <li>{String} widgetGuid: unique widget identifier</li>
2211  *           <li>{Number} width: width of widget in pixels</li>
2212  *           <li>{Number} zIndex: in pixels</li>
2213  *           <li>{String} region: containing region on dashboard.  Dashboard type specific.</li>
2214  *           <li>{Boolean} pinned: true if widget is pinned open</li>
2215  *           <li>{String} buttonId: identifier of button that opens widget</li>
2216  *           <li>{Number} height: height of widget in pixels</li>
2217  *           <li>{Number} columnPos: position of widget in a column</li>
2218  *           <li>{String} name: widget name</li>
2219  *           <li>{Number} statePosition</li>
2220  *           <li>{Boolean} active: true if this widget is the active (has focus) widget</li>
2221  *           <li>{String} uniqueId: unique widget identifier on dashboard</li>
2222  *           <li>{Boolean} minimized: true if widget is minimized</li>
2223  *           <li>{Boolean} buttonOpened: true if button launched widget is opened</li>
2224  *           <li>{Boolean} collapsed: true if widget is collapsed</li>
2225  *           <li>{Number} y: y-axis position in pixels</li>
2226  *           <li>{Number} x: x-axis position in pixels</li>
2227  *           <li>{Boolean} maximized: true if widget is maximized</li>
2228  *        </ul>
2229  *        <li>{String} defaultSettings: JSON string of default settings which varies by pane type; not valid for containers</li>
2230  *     </ul>
2231  *     <br>
2232  * <br>
2233  * @param {Function} [cfg.onFailure] Callback to execute if there is an error (optional, a default alert provided). Callback parameter is an error string.
2234  * @example
2235  *
2236  * var onSuccess = function(obj) {
2237  *     alert(obj.results);
2238  *     if (obj.results > 0) {
2239  *         for (var i = 0; i < obj.results; i++) {
2240  *             alert(obj.data[i].name);
2241  *         }
2242  *     }
2243  * };
2244  *
2245  * var onFailure = function(error) {
2246  *     alert(error);
2247  * };
2248  *
2249  * OWF.Preferences.findDashboards({
2250  *     onSuccess:onSuccess,
2251  *     onFailure:onFailure
2252  * });
2253  */
2254 
2255 /**
2256  * @name findDashboardsByType
2257  * @methodOf OWF.Preferences
2258  * @deprecated Deprecated starting with OWF 7. Dashboards no longer have a specific type. This function is stubbed 
2259  * to return success with 0 results until removal.
2260  * @description Returns all dashboards for the logged in user filtered by the type of dashboard.
2261  * @param {Object} cfg config object see below for properties
2262  * @param {String} cfg.type A string representing the type of dashboard. If using built in dashboard types, this would include desktop, tabbed, portal, and accordion.
2263  * @param {Function} cfg.onSuccess Callback function to capture the success result.
2264  * This method is passed an object having the following properties:<br>
2265  * <br>
2266  *     {Boolean} success: true if dashboards found<br>
2267  *     {Number} results: number of dashboards found<br>
2268  *     {Array} data: an empty array<br>
2269  *     
2270  * <br>
2271  * @param {Function} [cfg.onFailure] Callback to execute if there is an error (optional, a default alert provided). Callback parameter is an error string.
2272  * @example
2273  *
2274  * var onSuccess = function(obj) {
2275  *     alert(obj.results);
2276  *     if (obj.results > 0) {
2277  *         for (var i = 0; i < obj.results; i++) {
2278  *             alert(obj.data[i].name);
2279  *         }
2280  *     }
2281  * };
2282  *
2283  * var onFailure = function(error) {
2284  *     alert(error);
2285  * };
2286  *
2287  * OWF.Preferences.findDashboardsByType({
2288  *     type:'desktop',
2289  *     onSuccess:onSuccess,
2290  *     onFailure:onFailure
2291  * });
2292  */
2293 
2294 /**
2295 	@description Gets the widget with the specified id
2296 	@name getWidget
2297 	@methodOf OWF.Preferences
2298 
2299 	@param {Object} cfg config object see below for properties
2300 	@param {String} cfg.widgetId The unique identifier (normally a guid) for the widget.
2301 	@param {Function} cfg.onSuccess Callback function to capture the success result. Callback is passed the following object as a parameter: {id:Number, namespace:String, value:Object, path:String}
2302 	This method is passed an object having the following properties:<br>
2303 	<br>
2304 		{Number} id: database pk identifier<br>
2305 		{String} namespace: "widget"<br>
2306 		{Object} value: widget object having the following properties:<br>
2307 		<br>
2308 		    {Boolean} editable: true if widget can be edited<br>
2309 		    {Boolean} visible: true if widget is visible<br>
2310 		    {Number} position<br>
2311 		    {String} userId: widget owner identifier<br>
2312 		    {String} userRealName: widget owner name<br>
2313 		    {String} namespace: widget name<br>
2314 		    {String} url: url of widget application<br>
2315 		    {String} headerIcon: url of widget header icon<br>
2316 		    {String} image: url of widget image<br>
2317 		    {String} smallIconUrl: url of widget's small icon<br>
2318 		    {String} largeIconUrl: url of widget's large icon<br>
2319 		    {Number} width: width of the widget in pixels<br>
2320 		    {Number} height: height of the widget in pixels<br>
2321 		    {Number} x: x-axis position<br>
2322 		    {Number} y: y-axis position<br>
2323 		    {Boolean} minimized: true if widget is minimized<br>
2324 		    {Boolean} maximized: true if widget is maximized<br>
2325 		    {String} widgetVersion: widget version<br>
2326 		    {Array} tags: array of tag strings<br>
2327 		    {Boolean} definitionVisible: true if definition is visible<br>
2328 		    {Boolean} singleton: true if widget is a singleton<br>
2329 		    {Boolean} background: true if widget runs in the background<br>
2330 		    {Array} allRequired: array of all widgets required by this widget<br>
2331 		    {Array} directRequired: array of all widgets directly required by this widget<br>
2332 		    {Array} widgetTypes: array of widget types this widget belongs to<br>
2333 		<br>
2334 		{String} path: unnique widget identifier<br>
2335 	<br>
2336 	@param {Function} [cfg.onFailure] Callback to execute if there is an error (optional, a default alert provided). Callback parameter is an error string.
2337 	
2338 	@example	
2339 var onSuccess = function(obj) {
2340 	if (obj.value) {
2341 		alert(obj.value.namespace);
2342 	}
2343 };
2344 
2345 var onFailure = function(error) {
2346 	alert(error);
2347 };
2348 
2349 OWF.Preferences.getWidget({
2350 	widgetId:'ea5435cf-4021-4f2a-ba69-dde451d12551',
2351 	onSuccess:onSuccess,
2352 	onFailure:onFailure
2353 });
2354 */
2355 
2356 /**
2357 	@description Gets all widgets for a given user.
2358 	@name findWidgets
2359 	@methodOf OWF.Preferences
2360 
2361 	@param {Object} cfg config object see below for properties
2362 	@param {Boolean} [cfg.userOnly] boolean flag that determines whether to only return widgets assigned to the user (excluding widgets to which the user only has access via their assigned groups)
2363 	@param {Object} [cfg.searchParams] object containing search parameters
2364 	@param {String} [cfg.searchParams.widgetName] name of widget '%' are wildcards
2365 	@param {String} [cfg.searchParams.widgetNameExactMatch] true or false to match the name exactly. defaults to false
2366 	@param {String} [cfg.searchParams.widgetVersion] version of widget '%' are wildcards
2367 	@param {String} [cfg.searchParams.widgetGuid] guid of widget '%' are wildcards
2368 	@param {Function} cfg.onSuccess callback function to capture the success result.
2369 	This method is passed an array of objects having the following properties:<br>
2370 	<br>
2371 		{Number} id: database pk identifier<br>
2372 		{String} namespace: "widget"<br>
2373 		{Object} value: widget object having the following properties:<br>
2374 		<br>
2375 		    {Boolean} editable: true if widget can be edited<br>
2376 		    {Boolean} visible: true if widget is visible<br>
2377 		    {Number} position<br>
2378 		    {String} userId: widget owner identifier<br>
2379 		    {String} userRealName: widget owner name<br>
2380 		    {String} namespace: widget name<br>
2381 		    {String} url: url of widget application<br>
2382 		    {String} headerIcon: url of widget header icon<br>
2383 		    {String} image: url of widget image<br>
2384 		    {String} smallIconUrl: url of widget's small icon<br>
2385 		    {String} largeIconUrl: url of widget's large icon<br>
2386 		    {Number} width: width of the widget in pixels<br>
2387 		    {Number} height: height of the widget in pixels<br>
2388 		    {Number} x: x-axis position<br>
2389 		    {Number} y: y-axis position<br>
2390 		    {Boolean} minimized: true if widget is minimized<br>
2391 		    {Boolean} maximized: true if widget is maximized<br>
2392 		    {String} widgetVersion: widget version<br>
2393 		    {Array} tags: array of tag strings<br>
2394 		    {Boolean} definitionVisible: true if definition is visible<br>
2395 		    {Boolean} singleton: true if widget is a singleton<br>
2396 		    {Boolean} background: true if widget runs in the background<br>
2397 		    {Array} allRequired: array of all widgets required by this widget<br>
2398 		    {Array} directRequired: array of all widgets directly required by this widget<br>
2399 		    {Array} widgetTypes: array of widget types this widget belongs to<br>
2400 		<br>
2401 		{String} path: unnique widget identifier<br>
2402 	<br>
2403 	@param {Function} [cfg.onFailure] callback to execute if there is an error (optional, a default alert provided).  This callback is called with two parameters: a error message string, and optionally a status code
2404 	
2405 	@example
2406 var onSuccess = function(widgets) {
2407 	if (widgets.length > 0) {
2408 		alert(widgets[0].value.namespace);
2409 	}
2410 };
2411 
2412 var onFailure = function(error, status) {
2413 	alert(error);
2414 };
2415 
2416 OWF.Preferences.findWidgets({
2417 	onSuccess:onSuccess,
2418 	onFailure:onFailure
2419 });
2420 */
2421 
2422 /**
2423 	@description Saves changes to existing widgets
2424 	@name updateAndDeleteWidgets
2425 	@methodOf OWF.Preferences
2426 
2427 	@param {Object} cfg config object see below for properties
2428 	@param {Array} cfg.widgetsToUpdate array of JSON objects containing the widget guid and data to be updated
2429 	@param {Array} cfg.widgetGuidsToDelete array of guids of widgets to be deleted
2430 	@param {Boolean} cfg.updateOrder flag to update order
2431 	@param {Function} cfg.onSuccess callback function to capture the success result
2432 	@param {Function} [cfg.onFailure] callback to execute if there is an error (optional, a default alert provided)
2433  */
2434 
2435 /**
2436 	@description Retrieves the user preference for the provided name and namespace
2437 	@name getUserPreference
2438 	@methodOf OWF.Preferences
2439 
2440 	@param {Object} cfg config object see below for properties
2441 	@param {String} cfg.namespace The namespace of the requested user preference
2442 	@param {String} cfg.name The name of the requested user preference
2443 	@param {Function} cfg.onSuccess The function to be called if the user preference is successfully retrieved from
2444 	the database.  This function takes a single argument, which is a JSON object.  If a preference is found, the
2445 	complete JSON structure as shown below will be returned.  If it is not found this function be passed an empty JSON object.
2446 	@example
2447 The following is an example of a complete preference object passed to the onSuccess
2448 function:
2449 {
2450 	"value":"true",
2451 	"path":"militaryTime",
2452 	"user":
2453 	{
2454 		"userId":"testAdmin1"
2455 	},
2456 	"namespace":"com.mycompany.AnnouncingClock"
2457 }
2458 		@param {Function} [cfg.onFailure] This parameter is optional. If this function is not specified a default error 
2459 		message will be displayed.This function is called if an error occurs on preference retrieval.  It is not
2460 		called if the preference is simply missing.
2461 		This function should accept two arguments:<br>
2462 		<br>
2463 		error: String<br>
2464 		The error message<br>
2465 		<br>
2466 		Status: The numeric HTTP Status code (if applicable)<br>
2467 		401: You are not authorized to access this entity.<br>
2468 		500: An unexpected error occurred.<br>
2469 		404: The user preference was not found.<br>
2470 		400: The requested entity failed to pass validation.<br>
2471 		
2472 		@example
2473 The following shows how to make a call to getUserPreference:
2474 function onSuccess(pref){
2475 	alert(Ozone.util.toString(pref.value));
2476 }
2477 
2478 function onFailure(error,status){
2479 	alert('Error ' + error);
2480 	alert(status);
2481 }
2482 
2483 // The following code calls getUserPreference with the above defined onSuccess and
2484 // onFailure callbacks.
2485 OWF.Preferences.getUserPreference({
2486 	namespace:'com.company.widget', 
2487 	name:'First President',
2488 	onSuccess:onSuccess, 
2489 	onFailure:onFailure
2490 });
2491 */
2492 
2493 /**
2494 	@description Checks for the existence of a user preference for a given namespace and name
2495 	@name doesUserPreferenceExist
2496 	@methodOf OWF.Preferences
2497 
2498 	@param {Object} cfg config object see below for properties
2499 	@param {String} cfg.namespace The namespace of the requested user
2500 	@param {String} cfg.name The name of the requested user
2501 	@param {Function} cfg.onSuccess The callback function that is called if a preference successfully return from the database.
2502 	This method is passed an object having the following properties:<br>
2503 	<br>
2504 		{Number} statusCode: status code<br>
2505 		{Boolean} preferenceExist: true if preference exists<br>
2506 	<br>
2507     @param {Function} [cfg.onFailure] The callback function that is called if there was
2508     an error looking up the preference.  This function is <em>not</em> called
2509     if the preference simply does not exist
2510 	
2511 	@example
2512 var onSuccess = function(obj) {
2513 	if (obj.statusCode = 200) {
2514 		alert(obj.preferenceExist);
2515 	}
2516 };
2517 
2518 var onFailure = function(error) {
2519 	alert(error);
2520 };
2521 
2522 OWF.Preferences.doesUserPreferenceExist({
2523 	namespace:'foo.bar.0',
2524 	name:'test path entry 0',
2525 	onSuccess:onSuccess,
2526 	onFailure:onFailure
2527 });
2528 */
2529 
2530 /**
2531 	@description retrieves the current user logged into the system
2532 	@name getCurrentUser
2533 	@methodOf OWF.Preferences
2534 
2535 	@param {Object} cfg config object see below for properties
2536 	@param {Function} cfg.onSuccess The callback function that is called for a successful retrieval of the user logged in.
2537 	This method is passed an object having the following properties:<br>
2538 	<br>
2539 		{String} currentUserName: user name<br>
2540 		{String} currentUser: user real name<br>
2541 		{Date} currentUserPrevLogin: previous login date<br>
2542 		{Number} currentId: database pk index<br>
2543 	<br>
2544 	@param {Function} cfg.[onFailure] The callback function that is called when the system is unable to retrieve the current user logged in. Callback parameter is an error string.
2545 	
2546 	@example
2547 var onSuccess = function(obj) {
2548 	if (obj) {
2549 		alert(obj.currentUser);
2550 	}
2551 };
2552 
2553 var onFailure = function(error) {
2554 	alert(error);
2555 };
2556 
2557 OWF.Preferences.getCurrentUser({
2558 	onSuccess:onSuccess,
2559 	onFailure:onFailure
2560 });
2561 */
2562 
2563 /**
2564 	@description For retrieving the OWF system server version
2565 	@name getServerVersion
2566 	@methodOf OWF.Preferences
2567 
2568 	@param {Object} cfg config object see below for properties
2569 	@param {Function} cfg.onSuccess The callback function that is called for successfully retrieving the server version of the OWF system.
2570 	This method is passed an object having the following properties:<br>
2571 	<br>
2572 		{String} {serverVersion: server version<br>
2573 	<br>
2574 	@param {Function} [cfg.onFailure] The callback function that is called when the system fails to retrieve the server version of the OWF system. Callback parameter is an error string.
2575 	@example
2576 	
2577 var onSuccess = function(obj) {
2578 	if (obj) {
2579 		alert(obj.serverVersion);
2580 	}
2581 };
2582 
2583 var onFailure = function(error) {
2584 	alert(error);
2585 };
2586 
2587 OWF.Preferences.getServerVersion({
2588 	onSuccess:onSuccess,
2589 	onFailure:onFailure
2590 });
2591 */
2592 
2593 /**
2594 	@description Creates or updates a user preference for the provided namespace and name.
2595 	@name setUserPreference
2596 	@methodOf OWF.Preferences
2597 
2598 	@param {Object} cfg config object see below for properties
2599 	@param {String} cfg.namespace  The namespace of the user preference
2600 	@param {String} cfg.name The name of the user preference
2601 	@param {String} cfg.value  The value of the user preference. The value can be any string including JSON.
2602 	@param {Function} cfg.onSuccess The function to be called if the user preference is successfully updated in
2603 	the database.
2604 	
2605 	@example
2606 The following is an example of a complete preference object passed to the onSuccess function:
2607 {
2608 	"value":"true",
2609 	"path":"militaryTime",
2610 	"user": {
2611 		"userId":"testAdmin1"
2612 	},
2613 	"namespace":"com.mycompany.AnnouncingClock"
2614 }
2615 		@param {Function} [cfg.onFailure] The function to be called if the user preference cannot be stored in the database.
2616 		If this function is not specified a default error message will be displayed. This function is passed
2617 		back the following parameters:<br>
2618 		<br>
2619 		error: String<br>
2620 		The error message<br>
2621 		<br>
2622 		Status: The HTTP Status code<br>
2623 		401: You are not authorized to access this entity.<br>
2624 		500: An unexpected error occurred.<br>
2625 		404: The requested entity was not found.<br>
2626 		400: The requested entity failed to pass validation.<br>
2627 		
2628 		@example
2629 function onSuccess(pref){
2630 	alert(pref.value);
2631 }
2632 
2633 function onFailure(error,status){
2634 	alert('Error ' + error);
2635 	alert(status);
2636 }
2637 
2638 var text = 'George Washington';
2639 OWF.Preferences.setUserPreference({
2640 	namespace:'com.company.widget',
2641 	name:'First President',
2642 	value:text,
2643 	onSuccess:onSuccess,
2644 	onFailure:onFailure
2645 });
2646 */
2647 
2648 /**
2649 	Deletes a user preference with the provided namespace and name.
2650 	@name deleteUserPreference
2651 	@methodOf OWF.Preferences
2652 
2653 	@param {Object} cfg config object see below for properties
2654 	@param {String} cfg.namespace The namespace of the user preference
2655 	@param {String} cfg.name The name of the user preference
2656 	@param {Function} cfg.onSuccess The function to be called if the user preference is successfully deleted from the database.
2657 	@example
2658 The following is an example of a complete preference object passed to the onSuccess
2659 function:
2660 
2661 {
2662 	"value":"true",
2663 	"path":"militaryTime",
2664 	"user":
2665 	{
2666 		"userId":"testAdmin1"
2667 	},
2668 	"namespace":"com.mycompany.AnnouncingClock"
2669 }
2670 		@param {Function} [cfg.onFailure] The function to be called if the user preference cannot be deleted from the
2671 		database or if the preference does not exist. If this function is not specified a default error message will be
2672 		displayed. This function is passed back the following parameters: <br>
2673 		<br>
2674 		error: String <br>
2675 		The error message <br>
2676 		<br>
2677 		Status: The HTTP Status code<br>
2678 		<br>
2679 		401: You are not authorized to access this entity.<br>
2680 		500: An unexpected error occurred.<br>
2681 		404: The user preference was not found.<br>
2682 		400: The requested entity failed to pass validation. <br>
2683 		<br>
2684 		@example
2685 function onSuccess(pref){
2686 	alert(pref.value);
2687 }
2688 
2689 function onFailure(error,status){
2690 	alert('Error ' + error);
2691 	alert(status);
2692 }
2693 
2694 OWF.Preferences.deleteUserPreference({
2695 	namespace:'com.company.widget',
2696 	name:'First President',
2697 	onSuccess:onSuccess,
2698 	onFailure:onFailure
2699 });
2700  */
2701 
2702 /**
2703 	This method informs a widget developer if their widget is running from the OWF or from a direct URL call.
2704 	@name isRunningInOWF
2705 	@methodOf OWF.Util
2706 
2707 	@returns  boolean true if the widget is inside OWF, false otherwise.
2708  */
2709 
2710 /**
2711  @name isInContainer
2712  @methodOf OWF.Util
2713  * @description This method informs a widget developer if their widget is running
2714  * in a Container, like OWF
2715  *
2716  * @returns  boolean true if the widget is inside a container, false otherwise.
2717  *
2718  */
2719 
2720 /**
2721 	Returns a globally unique identifier (guid).
2722 	@name guid
2723 	@methodOf OWF.Util
2724 
2725 	@returns  boolean true if the widget is inside OWF, false otherwise.
2726  */
2727 
2728 /**
2729 	This method returns flash/flex dom element from dom.
2730 	@name getFlashApp
2731 	@methodOf OWF.Util
2732 	
2733 	@param {String} id id of the flex dom element
2734 
2735 	@returns  flash/flex object from dom
2736  */
2737 
2738  /**
2739 	Basic logging capability - meant to be called by other methods which transform or validate data.
2740 	@name logMetric
2741 	@methodOf OWF.Metrics
2742 	@since OWF 3.8.0
2743 
2744 	@param {String} userId
2745 	@param {String} userName
2746 	@param {String} metricSite Identifier, potentially URL, for source of metric - typically OWF instance
2747 	@param {String} componentName    
2748 	@param {String} componentId 
2749 	@param {String} componentInstanceId
2750 	@param {String} metricTypeId String describing metric - recommend package name construct
2751 	@param {String} metricData Any additional data for metric - do any necessary validation appropriate to metricTypeId before sending through 
2752  */
2753 
2754 /**
2755  * @description Logs a set of metrics to the server all at once.  All
2756  * metrics passed into a call to this function will be logged in a single
2757  * HTTP request, instead of one request per metric
2758  * @name logBatchMetrics
2759  * @methodOf OWF.Metrics
2760  * @since OWF 6.0
2761  *
2762  * @param {Array} metrics 
2763  * @param {String} metrics[*].userId
2764  * @param {String} metrics[*].userName
2765  * @param {Number} metrics[*].metricTime The time at which is metric was collected (in UNIX time)
2766  * @param {String} metrics[*].site Identifier, potentially URL, for source of metric - typically OWF instance
2767  * @param {String} metrics[*].component
2768  * @param {String} metrics[*].componentId 
2769  * @param {String} metrics[*].instanceId
2770  * @param {String} metrics[*].metricTypeId String describing metric - recommend package name construct
2771  * @param {String} metrics[*].widgetData Any additional data for metric - do any necessary validation appropriate to metricTypeId before sending through 
2772  * @param {String} metrics[*].userAgent Should be set to the user-agent string of the browser
2773  */
2774 
2775 /**
2776 	Log view of widget - see calls in dashboards.
2777 	@name logWidgetRender
2778 	@methodOf OWF.Metrics
2779 	@since OWF 3.8.0
2780 	
2781 	@param {String} userId     - see Ozone.metrics.logMetric userId
2782 	@param {String} userName   - see Ozone.metrics.logMetric userName
2783 	@param {String} metricSite - see Ozone.metrics.logMetric metricSite
2784 	@param {Object} widget   
2785  */
2786 
2787 /**
2788 	Get a logger by name, if the logger has not already been created it will be created.
2789 	@name getLogger
2790 	@methodOf OWF.Log
2791 	@since OWF 3.8.0
2792 	@param {String} loggerName
2793  */
2794 
2795 /**
2796 	Enable/Disable logging for the OWF application.
2797 	@name setEnabled
2798 	@methodOf OWF.Log
2799 	@since OWF 3.8.0
2800 	@param {Boolean} enabled true will enable logging false will disable
2801  */
2802 
2803 /**
2804 	Get OWF's default logger
2805 	@name getDefaultLogger
2806 	@methodOf OWF.Log
2807 	@since OWF 3.8.0
2808  */
2809 
2810 /**
2811 	Launch the log window pop-up, this will re-launch the window in the event it has been closed.
2812 	@name launchPopupAppender
2813 	@methodOf OWF.Log
2814 	@since OWF 3.8.0
2815  */
2816 
2817 /**
2818 	Gets the language that is currently being used by OWF.
2819 	@name getLanguage
2820 	@methodOf OWF.Lang
2821 
2822 	@returns {String} Returns the ISO 639-1 language code for the language that is currently being used by OWF.
2823  */
2824