Author: [email protected]
Date: Mon Aug 22 11:58:33 2011
New Revision: 1335

Log:
[AMDATUOPENSOCIAL-92] The User preferences placeholders (__UP_..._) were not 
respected in the gadget metadatafields. Added this to the Shindig container 
impl. Also added initial implementation of user prefs dialog.

Modified:
   
trunk/amdatu-opensocial/opensocial-dashboard/src/main/resources/jsp/dashboard.js.jsp
   
trunk/amdatu-opensocial/opensocial-dashboard/src/main/resources/static/js/jquery.dashboard.js
   
trunk/amdatu-opensocial/opensocial-dashboard/src/main/resources/static/js/lib/jquery.dashboard.min.js
   
trunk/amdatu-opensocial/opensocial-gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/OpenSocialContainer.java
   
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigOpenSocialContainerImpl.java
   
trunk/amdatu-opensocial/opensocial-shindig/src/main/resources/features/shindig.container/shindig-container.js

Modified: 
trunk/amdatu-opensocial/opensocial-dashboard/src/main/resources/jsp/dashboard.js.jsp
==============================================================================
--- 
trunk/amdatu-opensocial/opensocial-dashboard/src/main/resources/jsp/dashboard.js.jsp
        (original)
+++ 
trunk/amdatu-opensocial/opensocial-dashboard/src/main/resources/jsp/dashboard.js.jsp
        Mon Aug 22 11:58:33 2011
@@ -179,6 +179,12 @@
       }
     });
 
+    $('.widget').live('editSettings',function(e, obj){
+      var ifrgadget = obj.widget.WidgetIfrGadget;
+      var id = obj.widget.id;
+      shindig.container.handleOpenUserPrefsDialog(id);
+    });
+
     $('.newgadget').live('click', function() {
       var uri = document.getElementById('newgadgeturi').value;
       var catId = $('.selectcategory.selected').attr("id");

Modified: 
trunk/amdatu-opensocial/opensocial-dashboard/src/main/resources/static/js/jquery.dashboard.js
==============================================================================
--- 
trunk/amdatu-opensocial/opensocial-dashboard/src/main/resources/static/js/jquery.dashboard.js
       (original)
+++ 
trunk/amdatu-opensocial/opensocial-dashboard/src/main/resources/static/js/jquery.dashboard.js
       Mon Aug 22 11:58:33 2011
@@ -435,7 +435,7 @@
       };
       widget.openSettings = function() {
         dashboard.log('entering openSettings function',1);
-        widget.element.find('.' + 
opts.widgetContentClass).load(widget.editurl);
+        widget.element.trigger("editSettings", {"widget":widget});
       };
 
       // called when widget is initialized

Modified: 
trunk/amdatu-opensocial/opensocial-dashboard/src/main/resources/static/js/lib/jquery.dashboard.min.js
==============================================================================
--- 
trunk/amdatu-opensocial/opensocial-dashboard/src/main/resources/static/js/lib/jquery.dashboard.min.js
       (original)
+++ 
trunk/amdatu-opensocial/opensocial-dashboard/src/main/resources/static/js/lib/jquery.dashboard.min.js
       Mon Aug 22 11:58:33 2011
@@ -1 +1 @@
-(function(a){a.fn.dashboard=function(m){var k={};var f;var 
j;k.layout;k.element=this;k.id=this.attr("id");k.widgets={};k.widgetsToAdd={};k.widgetCategories={};k.initialized=false;k.serialize=function(){k.log("entering
 serialize function",1);var o='{"layout": "'+k.layout.id+'", "data" : [';var 
n=0;if(a("."+b.columnClass).length==0){k.log(b.columnClass+" class not 
found",5)}a("."+b.columnClass).each(function(){a(this).children().each(function(){if(a(this).hasClass(b.widgetClass)){if(n>0){o+=","}o+=(k.getWidget(a(this).attr("id"))).serialize();n++}})});o+="]}";return
 o};k.log=function(o,p){if(p>=b.debuglevel&&typeof console!="undefined"){var 
n="";if(p==1){n="INFO"}if(p==2){n="EVENT"}if(p==3){n="WARNING"}if(p==5){n="ERROR"}console.log(n+"
 - "+o)}};k.setLayout=function(n){if(n!=null){k.log("entering setLayout 
function with layout "+n.id,1)}else{k.log("entering setLayout function with 
layout null",1)}k.layout=n;f.remove();if(k.layout!=null){if(typeof 
b.layoutClass!="undefined"){t!
 
his.element.find("."+b.layoutClass).addClass(k.layout.classname)}else{this.element.html(k.layout.html)}}a("."+b.columnClass).sortable({connectWith:a("."+b.columnClass),opacity:b.opacity,handle:"."+b.widgetHeaderClass,over:function(o,p){a(this).addClass("selectedcolumn")},out:function(o,p){a(this).removeClass("selectedcolumn")},receive:function(p,q){var
 
o=k.getWidget(q.item.attr("id"));o.column=e(a(this).attr("class"));k.log("dashboardStateChange
 event thrown for widget 
"+o.id,2);k.element.trigger("dashboardStateChange",{stateChange:"widgetMoved",widget:o});k.log("widgetDropped
 event thrown for widget 
"+o.id,2);o.element.trigger("widgetDropped",{widget:o})},deactivate:function(p,q){k.log("Widget
 is dropped: check if the column is now empty.",1);var 
o=a(this).children().length;if(o==0){k.log("adding the empty text to the 
column",1);a(this).html('<div 
class="emptycolumn">'+b.emptyColumnHtml+"</div>")}else{if(o==2){a(this).find(".emptycolumn").remove()}}},start:function(o,p){p.!
 item.find("."+b.widgetTitleClass).addClass("noclick")},stop:fu!
 nction(o
,p){setTimeout(function(){p.item.find("."+b.widgetTitleClass).removeClass("noclick")},300)}});g();k.log("dashboardLayoutLoaded
 event thrown",2);k.element.trigger("dashboardLayoutLoaded")};function 
g(){k.log("entering fixSortableColumns 
function",1);a(".nonsortablecolumn").removeClass("nonsortablecolumn").addClass(b.columnClass);a("."+b.columnClass).filter(function(){return
 
a(this).css("display")=="none"}).addClass("nonsortablecolumn").removeClass(b.columnClass)}function
 e(o){k.log("entering getColumnIdentifier function",1);var q;var p=o.split(" 
");for(var 
n=0;n<p.length;n++){if(p[n].indexOf(b.columnPrefix)===0){q=p[n]}}return 
q.replace(b.columnPrefix,"")}k.loadLayout=function(){k.log("entering loadLayout 
function",1);if(typeof 
b.json_data.url!="undefined"&&b.json_data.url.length>0){k.log("Getting JSON 
feed : 
"+b.json_data.url,1);a.getJSON(b.json_data.url,function(p){if(p==null){alert("Unable
 to get json. If you are using chrome: there is an issue with loading json with 
local!
  files. It works on a server :-)",5);return}var o=(typeof 
k.layout!="undefined")?k.layout:c(p.layout);k.setLayout(o);k.loadWidgets(p.data)})}else{var
 n=(typeof 
k.layout!="undefined")?k.layout:c(json.layout);k.setLayout(n);k.loadWidgets(b.json_data.data)}};k.addWidget=function(r,p){k.log("entering
 addWidget function",1);var q=r.id;if(typeof 
k.widgets[q]!="undefined"&&a("#"+q).length>0){var 
n=a("#"+q);p=k.widgets[q].column;n.appendTo(p)}else{k.log("Applying template : 
"+b.widgetTemplate,1);if(a("#"+b.widgetTemplate).length==0){k.log('Template 
"'+b.widgetTemplate+" not found",5)}var 
o=tmpl(a("#"+b.widgetTemplate).html(),r);var 
n=a(o);n.appendTo(p);k.widgets[q]=h({id:q,element:n,column:r.column,url:(typeof 
r.url!="undefined"?r.url:null),editurl:r.editurl,title:r.title,open:r.open,metadata:r.metadata})}k.log("widgetAdded
 event thrown for widget 
"+q,2);k.widgets[q].element.trigger("widgetAdded",{widget:k.widgets[q]});if(k.initialized){k.log("dashboardStateChange
 event thrown for !
 widget "+q,2);k.element.trigger("dashboardStateChange",{stateC!
 hange:"w
idgetAdded",widget:n})}};k.loadWidgets=function(n){k.log("entering loadWidgets 
function",1);k.element.find("."+b.columnClass).empty();a(n).each(function(){var 
o=this.column;k.addWidget(this,k.element.find("."+b.columnPrefix+o))});a("#tempdashboard").find("."+b.widgetClass).each(function(){var
 
o=k.element.find("."+b.columnClass+":first");a(this).appendTo(o);k.getWidget(a(this).attr("id")).column=o.attr("id")});a("#tempdashboard").remove();a("."+b.columnClass).each(function(){if(a(this).children().length==0){a(this).html('<div
 
class="emptycolumn">'+b.emptyColumnHtml+"</div>")}});k.initialized=true};k.init=function(){k.log("entering
 init function",1);k.loadLayout()};k.getWidget=function(o){k.log("entering 
getWidget function",1);var n=k.widgets[o];if(typeof n!="undefined"){return 
n}else{return null}};var b=a.extend({},a.fn.dashboard.defaults,m);var 
l=a.extend({},a.fn.dashboard.defaults.addWidgetSettings,m.addWidgetSettings);var
 d=a.extend({},a.fn.dashboard.defaults.editLayoutSet!
 tings,m.editLayoutSettings);var 
f=a(b.loadingHtml).appendTo(k.element);function h(n){k.log("entering widget 
constructor",1);n=a.extend({},a.fn.dashboard.widget.defaults,n);n.openContent=function(){n.element.find(".widgetOpen").hide();n.element.find(".widgetClose").show();k.log("entering
 openContent 
function",1);n.open=true;if(!n.loaded){if(this.url!=""&&this.url!=null&&typeof 
this.url!="undefined"){a(b.loadingHtml).appendTo(n.element.find("."+b.widgetContentClass));k.log("widgetShow
 event thrown for widget 
"+n.id,2);n.element.trigger("widgetShow",{widget:n});n.element.find("."+b.widgetContentClass).load(this.url,function(p,o,q){if(o=="error"){n.element.find("."+b.widgetContentClass).html(b.widgetNotFoundHtml)}n.loaded=true;k.log("widgetLoaded
 event thrown for widget 
"+n.id,2);n.element.trigger("widgetLoaded",{widget:n})})}else{k.log("widgetShow 
event thrown for widget 
"+n.id,2);n.element.trigger("widgetShow",{widget:n});k.log("widgetLoaded event 
thrown",2);n.element.trigger!
 ("widgetLoaded",{widget:n})}}else{k.log("widgetShow event thro!
 wn for w
idget 
"+n.id,2);n.element.trigger("widgetShow",{widget:n})}if(k.initialized){k.log("dashboardStateChange
 event thrown for widget 
"+n.id,2);k.element.trigger("dashboardStateChange",{stateChange:"widgetOpened",widget:n})}};n.refreshContent=function(){k.log("entering
 refreshContent 
function",1);n.loaded=false;if(n.open){n.openContent()}};n.setTitle=function(o){k.log("entering
 setTitle 
function",1);n.title=o;n.element.find("."+b.widgetTitleClass).html(o);if(k.initialized){k.log("dashboardStateChange
 event thrown for widget 
"+n.id,2);k.element.trigger("dashboardStateChange",{stateChange:"titleChanged",widget:n})}};n.closeContent=function(){k.log("entering
 closeContent function",1);n.open=false;k.log("widgetHide event thrown for 
widget 
"+n.id,2);n.element.trigger("widgetHide",{widget:n});n.element.find(".widgetOpen").show();n.element.find(".widgetClose").hide();k.log("dashboardStateChange
 event thrown for widget 
"+n.id,2);k.element.trigger("dashboardStateChange",{stateChange:"widg!
 etClosed",widget:n})};n.addMetadataValue=function(o,p){k.log("entering 
addMetadataValue function",1);if(typeof 
n.metadata=="undefined"){n.metadata={}}n.metadata[o]=p;k.log("dashboardStateChange
 event thrown for widget 
"+n.id,2);k.element.trigger("dashboardStateChange",{stateChange:"metadataChanged",widget:n})};n.openMenu=function(){k.log("entering
 openMenu 
function",1);n.element.find("."+b.menuClass).show()};n.closeMenu=function(){k.log("entering
 closeMenu 
function",1);n.element.find("."+b.menuClass).hide()};n.remove=function(){k.log("entering
 remove function",1);n.element.remove();k.log("widgetDeleted event thrown for 
widget 
"+n.id,2);n.element.trigger("widgetDeleted",{widget:n});k.log("dashboardStateChange
 event thrown for widget 
"+n.id,2);k.element.trigger("dashboardStateChange",{stateChange:"widgetRemoved",widget:n})};n.serialize=function(){k.log("entering
 serialize function",1);var q='{"title" : "'+n.title+'", "id" : "'+n.id+'", 
"column" : "'+n.column+'","editurl" : "'!
 +n.editurl+'","open" : '+n.open+',"url" : "'+n.url+'"';if(type!
 of n.met
adata!="undefined"){q+=',"metadata":{';var s=n.metadata;var o=0;for(var p in 
s){if(o>0){q+=","}q+='"'+p+'":"'+s[p]+'"';o++}q+="}"}q+="}";return 
q};n.openFullscreen=function(){k.log("entering openFullscreen 
function",1);n.fullscreen=true;var p=a("."+b.columnClass);p.hide();var o=a('<ul 
id="fullscreen_'+k.id+'"></ul>');o.appendTo(k.element);n.element.parent().attr("id","placeholder");n.element.appendTo(o)};n.closeFullscreen=function(){k.log("entering
 closeFullscreen function",1);n.fullscreen=false;var 
o=a("#placeholder");n.element.appendTo(o);a("#fullscreen_"+k.id).remove();var 
p=a("."+b.columnClass);p.show()};n.openSettings=function(){k.log("entering 
openSettings 
function",1);n.element.find("."+b.widgetContentClass).load(n.editurl)};if(n.open){n.openContent()}n.initialized=true;k.log("widgetInitialized
 event thrown",2);n.element.trigger("widgetInitialized",{widget:n});return 
n}function c(p){k.log("entering getLayout function",1);var n=null;var 
o=null;if(typeof b.layouts!="und!
 
efined"){a.each(b.layouts,function(q,r){if(q==0){o=r}if(r.id==p){n=r}})}if(n==null){n=o}return
 n}a("#"+k.id+" .menutrigger").live("click",function(){k.log("widgetOpenMenu 
event thrown for widget "+h.id,2);var 
n=k.getWidget(a(this).closest("."+b.widgetClass).attr("id"));n.element.trigger("widgetOpenMenu",{widget:n});return
 false});a("#"+k.id+" 
."+b.widgetFullScreenClass).live("click",function(o){k.log("widgetCloseMenu 
event thrown for widget "+h.id,2);var 
n=k.getWidget(a(this).closest("."+b.widgetClass).attr("id"));n.element.trigger("widgetCloseMenu",{widget:n});if(n.fullscreen){k.log("widgetCloseFullScreen
 event thrown for widget 
"+n.id,2);n.element.trigger("widgetCloseFullScreen",{widget:n})}else{k.log("widgetOpenFullScreen
 event thrown for widget 
"+n.id,2);n.element.trigger("widgetOpenFullScreen",{widget:n})}return 
false});a("#"+k.id+" .controls 
li").live("click",function(o){k.log("widgetCloseMenu event thrown for widget 
"+h.id,2);var n=k.getWidget(a(this).closest("."+b.w!
 idgetClass).attr("id"));n.element.trigger("widgetCloseMenu",{w!
 idget:n}
);k.log(a(this).attr("class")+" event thrown for widget "+h.id,2);var 
n=k.getWidget(a(this).closest("."+b.widgetClass).attr("id"));n.element.trigger(a(this).attr("class"),{widget:n});return
 false});a("#"+k.id+" 
."+b.widgetClass).live("widgetCloseMenu",function(n,p){k.log("Closing menu 
"+a(this).attr("id"),1);p.widget.closeMenu()});a("#"+k.id+" 
."+b.widgetClass).live("widgetOpenMenu",function(n,p){k.log("Opening menu 
"+a(this).attr("id"),1);p.widget.openMenu()});a("#"+k.id+" 
."+b.widgetClass).live("widgetDelete",function(n,p){if(confirm(b.deleteConfirmMessage)){k.log("Removing
 widget "+a(this).attr("id"),1);p.widget.remove()}});a("#"+k.id+" 
."+b.widgetClass).live("widgetRefresh",function(n,p){p.widget.refreshContent()});a("#"+k.id+"
 
."+b.widgetClass).live("widgetSetTitle",function(n,p){p.widget.setTitle(p.title)});a("#"+k.id+"
 ."+b.widgetClass).live("widgetClose",function(n,p){k.log("Closing widget 
"+a(this).attr("id"),1);p.widget.closeContent()});a("#"+k.id+" ."+b.widgetClas!
 s).live("widgetOpen",function(n,p){k.log("Opening widget 
"+a(this).attr("id"),1);p.widget.openContent()});a("#"+k.id+" 
."+b.widgetClass).live("widgetShow",function(){a(this).find("."+b.widgetContentClass).show()});a("#"+k.id+"
 
."+b.widgetClass).live("widgetHide",function(){a(this).find("."+b.widgetContentClass).hide()});a("#"+k.id+"
 ."+b.widgetClass).live("widgetAddMetadataValue",function(n,p){k.log("Changing 
metadata for widget "+a(this).attr("id")+", metadata name: "+p.name+", value: 
"+p.value,1);p.widget.addMetadataValue(p.name,p.value)});a("#"+k.id+" 
."+b.widgetTitleClass).live("click",function(o){k.log("Click on the header 
detected for widget 
"+a(this).attr("id"),1);if(!a(this).hasClass("noclick")){var 
n=k.getWidget(a(this).closest("."+b.widgetClass).attr("id"));if(n.open){k.log("widgetClose
 event thrown for widget 
"+n,2);n.element.trigger("widgetClose",{widget:n})}else{k.log("widgetOpen event 
thrown for widget "+n,2);n.element.trigger("widgetOpen",{widget:n})}}return !
 false});a("#"+k.id+" ."+b.widgetHeaderClass).live("mouseover",!
 function
(){a(this).find("."+b.iconsClass).removeClass("hidden")});a("#"+k.id+" 
."+b.widgetHeaderClass).live("mouseout",function(){a(this).find("."+b.iconsClass).addClass("hidden")});a("body").click(function(){a("."+b.menuClass).hide()});a("#"+k.id+"
 
."+b.widgetClass).live("widgetOpenFullScreen",function(n,p){p.widget.openFullscreen()});a("."+b.widgetClass).live("widgetCloseFullScreen",function(n,p){p.widget.closeFullscreen()});a("#"+k.id+"
 
."+b.widgetClass).live("widgetEdit",function(n,p){p.widget.openSettings()});if(a("#"+l.dialogId).length==0){k.log("Unable
 to find 
"+l.dialogId,5)}a("#"+l.dialogId).dialog({autoOpen:false,height:514,width:750,modal:true,buttons:{Cancel:function(){a(this).dialog("close")}},close:function(){}});if(a("#"+d.dialogId).length==0){k.log("Unable
 to find 
"+d.dialogId,5)}a("#"+d.dialogId).dialog({autoOpen:false,height:300,width:600,modal:true});a("."+d.openDialogClass).live("click",function(){k.log("dashboardOpenLayoutDialog
 event thrown",2);k.element.trigge!
 r("dashboardOpenLayoutDialog");return 
false});k.element.live("dashboardOpenLayoutDialog",function(){k.log("Opening 
dialog "+d.dialogId,1);a("#"+d.dialogId).dialog("open");var 
n=a("#"+d.dialogId).find("."+d.layoutClass);n.empty();if(n.children().length==0){k.log("Number
 of layouts : 
"+b.layouts.length,1);a.each(b.layouts,function(o,p){k.log("Applying template : 
"+d.layoutTemplate,1);if(a("#"+d.layoutTemplate).length==0){k.log('Template 
"'+d.layoutTemplate+" not 
found",5)}n.append(tmpl(a("#"+d.layoutTemplate).html(),p))})}a("."+d.selectLayoutClass).removeClass(d.selectedLayoutClass);a("#"+k.layout.id).addClass(d.selectedLayoutClass);i()});k.element.live("dashboardStateChange",function(){if(typeof
 
b.stateChangeUrl!="undefined"&&b.stateChangeUrl!=null&&b.stateChangeUrl!=""){a.ajax({type:"POST",url:b.stateChangeUrl,data:{dashboard:k.element.attr("id"),settings:k.serialize()},success:function(n){if(n=="NOK"||n.indexOf("<response>NOK</response>")!=-1){k.log("dashboardSaveFailed
 ev!
 ent thrown",2);k.element.trigger("dashboardSaveFailed")}else{k!
 .log("da
shboardSuccessfulSaved event 
thrown",2);k.element.trigger("dashboardSuccessfulSaved")}},error:function(n,p,o){k.log("dashboardSaveFailed
 event 
thrown",2);k.element.trigger("dashboardSaveFailed")},dataType:"text"})}});k.element.live("dashboardCloseLayoutDialog",function(){a("#"+d.dialogId).dialog("close")});function
 i(){if(a("."+d.selectLayoutClass).length==0){k.log("Unable to find 
"+d.selectLayoutClass,5)}a("."+d.selectLayoutClass).bind("click",function(q){var
 o=k.layout;k.log("dashboardCloseLayoutDialog event 
thrown",2);k.element.trigger("dashboardCloseLayoutDialog");var 
p=c(a(this).attr("id"));k.layout=p;if(typeof 
b.layoutClass!="undefined"){k.element.find("."+b.layoutClass).removeClass(o.classname).addClass(p.classname);g();if(a("."+b.columnClass).length==0){k.log("Unable
 to find 
"+b.columnClass,5)}k.element.find(".nonsortablecolumn").each(function(){a(this).children().appendTo(k.element.find("."+b.columnClass+":first"));a(".emptycolumn").remove();a("."+b.columnClass).eac!
 h(function(){if(a(this).children().length==0){a(this).html('<div 
class="emptycolumn">'+b.emptyColumnHtml+"</div>")}})})}else{var n=a('<div 
style="display:none" 
id="tempdashboard"></div>');n.appendTo(a("body"));k.element.children().appendTo(n);k.init()}k.log("dashboardChangeLayout
 event thrown",2);k.element.trigger("dashboardLayoutChanged")});return 
false}a("."+l.selectCategoryClass).live("click",function(){k.log("addWidgetDialogSelectCategory
 event 
thrown",2);k.element.trigger("addWidgetDialogSelectCategory",{category:a(this)});return
 
false});k.element.live("addWidgetDialogSelectCategory",function(o,n){a("."+l.selectCategoryClass).removeClass(l.selectedCategoryClass);a("#"+l.dialogId).find("."+l.widgetClass).empty();a(n.category).addClass(l.selectedCategoryClass);url=k.widgetCategories[a(n.category).attr("id")];k.log("Getting
 JSON feed : 
"+url,1);a.getJSON(url,{cache:true},function(p){if(p.data==0){k.log("Empty data 
returned",3)}a.each(p.data,function(r,s){k.widgetsToAdd[s.!
 id]=s;k.log("Applying template : "+l.widgetTemplate,1);if(a("#!
 "+l.widg
etTemplate).length==0){k.log('Template "'+l.widgetTemplate+" not found",5)}var 
q=tmpl(a("#"+l.widgetTemplate).html(),s);a("#"+l.dialogId).find("."+l.widgetClass).append(q)})});k.log("addWidgetDialogWidgetsLoaded
 event 
thrown",2);k.element.trigger("addWidgetDialogWidgetsLoaded")});a("."+l.addWidgetClass).live("click",function(){var
 
n=k.widgetsToAdd[a(this).attr("id").replace("addwidget","")];k.log("dashboardAddWidget
 event 
thrown",2);k.element.trigger("dashboardAddWidget",{widget:n});k.log("dashboardCloseWidgetDialog
 event thrown",2);k.element.trigger("dashboardCloseWidgetDialog");return 
false});a("."+l.openDialogClass).live("click",function(){k.log("dashboardOpenWidgetDialog
 event thrown",2);k.element.trigger("dashboardOpenWidgetDialog");return 
false});k.element.live("dashboardCloseWidgetDialog",function(){a("#"+l.dialogId).dialog("close")});k.element.live("dashboardOpenWidgetDialog",function(){a("#"+l.dialogId).find("."+l.categoryClass).empty();a("#"+l.dialogId).find("."+l.!
 widgetClass).empty();k.log("Opening dialog 
"+l.dialogId,1);a("#"+l.dialogId).dialog("open");k.log("Getting JSON feed : 
"+l.widgetDirectoryUrl,1);a.getJSON(l.widgetDirectoryUrl,function(n){if(n.category==0){k.log("Empty
 data 
returned",3)}a.each(n.category,function(p,q){k.widgetCategories[q.id]=q.url;k.log("Applying
 template : 
"+l.categoryTemplate,1);if(a("#"+l.categoryTemplate).length==0){k.log('Template 
"'+l.categoryTemplate+" not found",5)}var 
o=tmpl(a("#"+l.categoryTemplate).html(),q);a("#"+l.dialogId).find("."+l.categoryClass).append(o)});k.log("addWidgetDialogCategoriesLoaded
 event 
thrown",2);k.element.trigger("addWidgetDialogCategoriesLoaded");k.log("addWidgetDialogSelectCategory
 event 
thrown",2);k.element.trigger("addWidgetDialogSelectCategory",{category:a("#"+l.dialogId).find("."+l.categoryClass+">li:first")})})});return
 k};a.fn.dashboard.defaults={debuglevel:3,json_data:{},loadingHtml:'<div 
class="loading"><img alt="Loading, please wait" src="../themes/default/loadi!
 ng.gif" /><p>Loading...</p></div>',emptyColumnHtml:"Drag your !
 widgets 
here",widgetTemplate:"widgettemplate",columnPrefix:"column-",opacity:"0.2",deleteConfirmMessage:"Are
 you sure you want to delete this widget?",widgetNotFoundHtml:"The content of 
this widget is not available anymore. You may remove this 
widget.",columnClass:"column",widgetClass:"widget",menuClass:"controls",widgetContentClass:"widgetcontent",widgetTitleClass:"widgettitle",widgetHeaderClass:"widgetheader",widgetFullScreenClass:"widgetopenfullscreen",iconsClass:"icons",stateChangeUrl:"",addWidgetSettings:{openDialogClass:"openaddwidgetdialog",addWidgetClass:"addwidget",selectCategoryClass:"selectcategory",selectedCategoryClass:"selected",categoryClass:"categories",widgetClass:"widgets",dialogId:"addwidgetdialog",categoryTemplate:"categorytemplate",widgetTemplate:"addwidgettemplate"},editLayoutSettings:{dialogId:"editLayout",layoutClass:"layoutselection",selectLayoutClass:"layoutchoice",selectedLayoutClass:"selected",openDialogClass:"editlayout",layoutTemplate:"selectlayouttempl!
 
ate"}};a.fn.dashboard.widget={defaults:{open:true,fullscreen:false,loaded:false,url:"",metadata:{}}}})(jQuery);(function(){var
 b={};this.tmpl=function a(e,d){var 
c=!/\W/.test(e)?b[e]=b[e]||a(document.getElementById(e).innerHTML):new 
Function("obj","var 
p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+e.replace(/[\r\t\n]/g,"
 
").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return
 p.join('');");return d?c(d):c}})();
\ No newline at end of file
+(function(a){a.fn.dashboard=function(m){var k={};var f;var 
j;k.layout;k.element=this;k.id=this.attr("id");k.widgets={};k.widgetsToAdd={};k.widgetCategories={};k.initialized=false;k.serialize=function(){k.log("entering
 serialize function",1);var o='{"layout": "'+k.layout.id+'", "data" : [';var 
n=0;if(a("."+b.columnClass).length==0){k.log(b.columnClass+" class not 
found",5)}a("."+b.columnClass).each(function(){a(this).children().each(function(){if(a(this).hasClass(b.widgetClass)){if(n>0){o+=","}o+=(k.getWidget(a(this).attr("id"))).serialize();n++}})});o+="]}";return
 o};k.log=function(o,p){if(p>=b.debuglevel&&typeof console!="undefined"){var 
n="";if(p==1){n="INFO"}if(p==2){n="EVENT"}if(p==3){n="WARNING"}if(p==5){n="ERROR"}console.log(n+"
 - "+o)}};k.setLayout=function(n){if(n!=null){k.log("entering setLayout 
function with layout "+n.id,1)}else{k.log("entering setLayout function with 
layout null",1)}k.layout=n;f.remove();if(k.layout!=null){if(typeof 
b.layoutClass!="undefined"){t!
 
his.element.find("."+b.layoutClass).addClass(k.layout.classname)}else{this.element.html(k.layout.html)}}a("."+b.columnClass).sortable({connectWith:a("."+b.columnClass),opacity:b.opacity,handle:"."+b.widgetHeaderClass,over:function(o,p){a(this).addClass("selectedcolumn")},out:function(o,p){a(this).removeClass("selectedcolumn")},receive:function(p,q){var
 
o=k.getWidget(q.item.attr("id"));o.column=e(a(this).attr("class"));k.log("dashboardStateChange
 event thrown for widget 
"+o.id,2);k.element.trigger("dashboardStateChange",{stateChange:"widgetMoved",widget:o});k.log("widgetDropped
 event thrown for widget 
"+o.id,2);o.element.trigger("widgetDropped",{widget:o})},deactivate:function(p,q){k.log("Widget
 is dropped: check if the column is now empty.",1);var 
o=a(this).children().length;if(o==0){k.log("adding the empty text to the 
column",1);a(this).html('<div 
class="emptycolumn">'+b.emptyColumnHtml+"</div>")}else{if(o==2){a(this).find(".emptycolumn").remove()}}},start:function(o,p){p.!
 item.find("."+b.widgetTitleClass).addClass("noclick")},stop:fu!
 nction(o
,p){setTimeout(function(){p.item.find("."+b.widgetTitleClass).removeClass("noclick")},300)}});g();k.log("dashboardLayoutLoaded
 event thrown",2);k.element.trigger("dashboardLayoutLoaded")};function 
g(){k.log("entering fixSortableColumns 
function",1);a(".nonsortablecolumn").removeClass("nonsortablecolumn").addClass(b.columnClass);a("."+b.columnClass).filter(function(){return
 
a(this).css("display")=="none"}).addClass("nonsortablecolumn").removeClass(b.columnClass)}function
 e(o){k.log("entering getColumnIdentifier function",1);var q;var p=o.split(" 
");for(var 
n=0;n<p.length;n++){if(p[n].indexOf(b.columnPrefix)===0){q=p[n]}}return 
q.replace(b.columnPrefix,"")}k.loadLayout=function(){k.log("entering loadLayout 
function",1);if(typeof 
b.json_data.url!="undefined"&&b.json_data.url.length>0){k.log("Getting JSON 
feed : 
"+b.json_data.url,1);a.getJSON(b.json_data.url,function(p){if(p==null){alert("Unable
 to get json. If you are using chrome: there is an issue with loading json with 
local!
  files. It works on a server :-)",5);return}var o=(typeof 
k.layout!="undefined")?k.layout:c(p.layout);k.setLayout(o);k.loadWidgets(p.data)})}else{var
 n=(typeof 
k.layout!="undefined")?k.layout:c(json.layout);k.setLayout(n);k.loadWidgets(b.json_data.data)}};k.addWidget=function(r,p){k.log("entering
 addWidget function",1);var q=r.id;if(typeof 
k.widgets[q]!="undefined"&&a("#"+q).length>0){var 
n=a("#"+q);p=k.widgets[q].column;n.appendTo(p)}else{k.log("Applying template : 
"+b.widgetTemplate,1);if(a("#"+b.widgetTemplate).length==0){k.log('Template 
"'+b.widgetTemplate+" not found",5)}var 
o=tmpl(a("#"+b.widgetTemplate).html(),r);var 
n=a(o);n.appendTo(p);k.widgets[q]=h({id:q,element:n,column:r.column,url:(typeof 
r.url!="undefined"?r.url:null),editurl:r.editurl,title:r.title,open:r.open,metadata:r.metadata})}k.log("widgetAdded
 event thrown for widget 
"+q,2);k.widgets[q].element.trigger("widgetAdded",{widget:k.widgets[q]});if(k.initialized){k.log("dashboardStateChange
 event thrown for !
 widget "+q,2);k.element.trigger("dashboardStateChange",{stateC!
 hange:"w
idgetAdded",widget:n})}};k.loadWidgets=function(n){k.log("entering loadWidgets 
function",1);k.element.find("."+b.columnClass).empty();a(n).each(function(){var 
o=this.column;k.addWidget(this,k.element.find("."+b.columnPrefix+o))});a("#tempdashboard").find("."+b.widgetClass).each(function(){var
 
o=k.element.find("."+b.columnClass+":first");a(this).appendTo(o);k.getWidget(a(this).attr("id")).column=o.attr("id")});a("#tempdashboard").remove();a("."+b.columnClass).each(function(){if(a(this).children().length==0){a(this).html('<div
 
class="emptycolumn">'+b.emptyColumnHtml+"</div>")}});k.initialized=true};k.init=function(){k.log("entering
 init function",1);k.loadLayout()};k.getWidget=function(o){k.log("entering 
getWidget function",1);var n=k.widgets[o];if(typeof n!="undefined"){return 
n}else{return null}};var b=a.extend({},a.fn.dashboard.defaults,m);var 
l=a.extend({},a.fn.dashboard.defaults.addWidgetSettings,m.addWidgetSettings);var
 d=a.extend({},a.fn.dashboard.defaults.editLayoutSet!
 tings,m.editLayoutSettings);var 
f=a(b.loadingHtml).appendTo(k.element);function h(n){k.log("entering widget 
constructor",1);n=a.extend({},a.fn.dashboard.widget.defaults,n);n.openContent=function(){n.element.find(".widgetOpen").hide();n.element.find(".widgetClose").show();k.log("entering
 openContent 
function",1);n.open=true;if(!n.loaded){if(this.url!=""&&this.url!=null&&typeof 
this.url!="undefined"){a(b.loadingHtml).appendTo(n.element.find("."+b.widgetContentClass));k.log("widgetShow
 event thrown for widget 
"+n.id,2);n.element.trigger("widgetShow",{widget:n});n.element.find("."+b.widgetContentClass).load(this.url,function(p,o,q){if(o=="error"){n.element.find("."+b.widgetContentClass).html(b.widgetNotFoundHtml)}n.loaded=true;k.log("widgetLoaded
 event thrown for widget 
"+n.id,2);n.element.trigger("widgetLoaded",{widget:n})})}else{k.log("widgetShow 
event thrown for widget 
"+n.id,2);n.element.trigger("widgetShow",{widget:n});k.log("widgetLoaded event 
thrown",2);n.element.trigger!
 ("widgetLoaded",{widget:n})}}else{k.log("widgetShow event thro!
 wn for w
idget 
"+n.id,2);n.element.trigger("widgetShow",{widget:n})}if(k.initialized){k.log("dashboardStateChange
 event thrown for widget 
"+n.id,2);k.element.trigger("dashboardStateChange",{stateChange:"widgetOpened",widget:n})}};n.refreshContent=function(){k.log("entering
 refreshContent 
function",1);n.loaded=false;if(n.open){n.openContent()}};n.setTitle=function(o){k.log("entering
 setTitle 
function",1);n.title=o;n.element.find("."+b.widgetTitleClass).html(o);if(k.initialized){k.log("dashboardStateChange
 event thrown for widget 
"+n.id,2);k.element.trigger("dashboardStateChange",{stateChange:"titleChanged",widget:n})}};n.closeContent=function(){k.log("entering
 closeContent function",1);n.open=false;k.log("widgetHide event thrown for 
widget 
"+n.id,2);n.element.trigger("widgetHide",{widget:n});n.element.find(".widgetOpen").show();n.element.find(".widgetClose").hide();k.log("dashboardStateChange
 event thrown for widget 
"+n.id,2);k.element.trigger("dashboardStateChange",{stateChange:"widg!
 etClosed",widget:n})};n.addMetadataValue=function(o,p){k.log("entering 
addMetadataValue function",1);if(typeof 
n.metadata=="undefined"){n.metadata={}}n.metadata[o]=p;k.log("dashboardStateChange
 event thrown for widget 
"+n.id,2);k.element.trigger("dashboardStateChange",{stateChange:"metadataChanged",widget:n})};n.openMenu=function(){k.log("entering
 openMenu 
function",1);n.element.find("."+b.menuClass).show()};n.closeMenu=function(){k.log("entering
 closeMenu 
function",1);n.element.find("."+b.menuClass).hide()};n.remove=function(){k.log("entering
 remove function",1);n.element.remove();k.log("widgetDeleted event thrown for 
widget 
"+n.id,2);n.element.trigger("widgetDeleted",{widget:n});k.log("dashboardStateChange
 event thrown for widget 
"+n.id,2);k.element.trigger("dashboardStateChange",{stateChange:"widgetRemoved",widget:n})};n.serialize=function(){k.log("entering
 serialize function",1);var q='{"title" : "'+n.title+'", "id" : "'+n.id+'", 
"column" : "'+n.column+'","editurl" : "'!
 +n.editurl+'","open" : '+n.open+',"url" : "'+n.url+'"';if(type!
 of n.met
adata!="undefined"){q+=',"metadata":{';var s=n.metadata;var o=0;for(var p in 
s){if(o>0){q+=","}q+='"'+p+'":"'+s[p]+'"';o++}q+="}"}q+="}";return 
q};n.openFullscreen=function(){k.log("entering openFullscreen 
function",1);n.fullscreen=true;var p=a("."+b.columnClass);p.hide();var o=a('<ul 
id="fullscreen_'+k.id+'"></ul>');o.appendTo(k.element);n.element.parent().attr("id","placeholder");n.element.appendTo(o)};n.closeFullscreen=function(){k.log("entering
 closeFullscreen function",1);n.fullscreen=false;var 
o=a("#placeholder");n.element.appendTo(o);a("#fullscreen_"+k.id).remove();var 
p=a("."+b.columnClass);p.show()};n.openSettings=function(){k.log("entering 
openSettings 
function",1);n.element.trigger("editSettings",{widget:n})};if(n.open){n.openContent()}n.initialized=true;k.log("widgetInitialized
 event thrown",2);n.element.trigger("widgetInitialized",{widget:n});return 
n}function c(p){k.log("entering getLayout function",1);var n=null;var 
o=null;if(typeof b.layouts!="undefined"){a.e!
 
ach(b.layouts,function(q,r){if(q==0){o=r}if(r.id==p){n=r}})}if(n==null){n=o}return
 n}a("#"+k.id+" .menutrigger").live("click",function(){k.log("widgetOpenMenu 
event thrown for widget "+h.id,2);var 
n=k.getWidget(a(this).closest("."+b.widgetClass).attr("id"));n.element.trigger("widgetOpenMenu",{widget:n});return
 false});a("#"+k.id+" 
."+b.widgetFullScreenClass).live("click",function(o){k.log("widgetCloseMenu 
event thrown for widget "+h.id,2);var 
n=k.getWidget(a(this).closest("."+b.widgetClass).attr("id"));n.element.trigger("widgetCloseMenu",{widget:n});if(n.fullscreen){k.log("widgetCloseFullScreen
 event thrown for widget 
"+n.id,2);n.element.trigger("widgetCloseFullScreen",{widget:n})}else{k.log("widgetOpenFullScreen
 event thrown for widget 
"+n.id,2);n.element.trigger("widgetOpenFullScreen",{widget:n})}return 
false});a("#"+k.id+" .controls 
li").live("click",function(o){k.log("widgetCloseMenu event thrown for widget 
"+h.id,2);var n=k.getWidget(a(this).closest("."+b.widgetClass).!
 attr("id"));n.element.trigger("widgetCloseMenu",{widget:n});k.!
 log(a(th
is).attr("class")+" event thrown for widget "+h.id,2);var 
n=k.getWidget(a(this).closest("."+b.widgetClass).attr("id"));n.element.trigger(a(this).attr("class"),{widget:n});return
 false});a("#"+k.id+" 
."+b.widgetClass).live("widgetCloseMenu",function(n,p){k.log("Closing menu 
"+a(this).attr("id"),1);p.widget.closeMenu()});a("#"+k.id+" 
."+b.widgetClass).live("widgetOpenMenu",function(n,p){k.log("Opening menu 
"+a(this).attr("id"),1);p.widget.openMenu()});a("#"+k.id+" 
."+b.widgetClass).live("widgetDelete",function(n,p){if(confirm(b.deleteConfirmMessage)){k.log("Removing
 widget "+a(this).attr("id"),1);p.widget.remove()}});a("#"+k.id+" 
."+b.widgetClass).live("widgetRefresh",function(n,p){p.widget.refreshContent()});a("#"+k.id+"
 
."+b.widgetClass).live("widgetSetTitle",function(n,p){p.widget.setTitle(p.title)});a("#"+k.id+"
 ."+b.widgetClass).live("widgetClose",function(n,p){k.log("Closing widget 
"+a(this).attr("id"),1);p.widget.closeContent()});a("#"+k.id+" 
."+b.widgetClass).live("wid!
 getOpen",function(n,p){k.log("Opening widget 
"+a(this).attr("id"),1);p.widget.openContent()});a("#"+k.id+" 
."+b.widgetClass).live("widgetShow",function(){a(this).find("."+b.widgetContentClass).show()});a("#"+k.id+"
 
."+b.widgetClass).live("widgetHide",function(){a(this).find("."+b.widgetContentClass).hide()});a("#"+k.id+"
 ."+b.widgetClass).live("widgetAddMetadataValue",function(n,p){k.log("Changing 
metadata for widget "+a(this).attr("id")+", metadata name: "+p.name+", value: 
"+p.value,1);p.widget.addMetadataValue(p.name,p.value)});a("#"+k.id+" 
."+b.widgetTitleClass).live("click",function(o){k.log("Click on the header 
detected for widget 
"+a(this).attr("id"),1);if(!a(this).hasClass("noclick")){var 
n=k.getWidget(a(this).closest("."+b.widgetClass).attr("id"));if(n.open){k.log("widgetClose
 event thrown for widget 
"+n,2);n.element.trigger("widgetClose",{widget:n})}else{k.log("widgetOpen event 
thrown for widget "+n,2);n.element.trigger("widgetOpen",{widget:n})}}return 
false});a("#!
 "+k.id+" ."+b.widgetHeaderClass).live("mouseover",function(){a!
 (this).f
ind("."+b.iconsClass).removeClass("hidden")});a("#"+k.id+" 
."+b.widgetHeaderClass).live("mouseout",function(){a(this).find("."+b.iconsClass).addClass("hidden")});a("body").click(function(){a("."+b.menuClass).hide()});a("#"+k.id+"
 
."+b.widgetClass).live("widgetOpenFullScreen",function(n,p){p.widget.openFullscreen()});a("."+b.widgetClass).live("widgetCloseFullScreen",function(n,p){p.widget.closeFullscreen()});a("#"+k.id+"
 
."+b.widgetClass).live("widgetEdit",function(n,p){p.widget.openSettings()});if(a("#"+l.dialogId).length==0){k.log("Unable
 to find 
"+l.dialogId,5)}a("#"+l.dialogId).dialog({autoOpen:false,height:514,width:750,modal:true,buttons:{Cancel:function(){a(this).dialog("close")}},close:function(){}});if(a("#"+d.dialogId).length==0){k.log("Unable
 to find 
"+d.dialogId,5)}a("#"+d.dialogId).dialog({autoOpen:false,height:300,width:600,modal:true});a("."+d.openDialogClass).live("click",function(){k.log("dashboardOpenLayoutDialog
 event thrown",2);k.element.trigger("dashboard!
 OpenLayoutDialog");return 
false});k.element.live("dashboardOpenLayoutDialog",function(){k.log("Opening 
dialog "+d.dialogId,1);a("#"+d.dialogId).dialog("open");var 
n=a("#"+d.dialogId).find("."+d.layoutClass);n.empty();if(n.children().length==0){k.log("Number
 of layouts : 
"+b.layouts.length,1);a.each(b.layouts,function(o,p){k.log("Applying template : 
"+d.layoutTemplate,1);if(a("#"+d.layoutTemplate).length==0){k.log('Template 
"'+d.layoutTemplate+" not 
found",5)}n.append(tmpl(a("#"+d.layoutTemplate).html(),p))})}a("."+d.selectLayoutClass).removeClass(d.selectedLayoutClass);a("#"+k.layout.id).addClass(d.selectedLayoutClass);i()});k.element.live("dashboardStateChange",function(){if(typeof
 
b.stateChangeUrl!="undefined"&&b.stateChangeUrl!=null&&b.stateChangeUrl!=""){a.ajax({type:"POST",url:b.stateChangeUrl,data:{dashboard:k.element.attr("id"),settings:k.serialize()},success:function(n){if(n=="NOK"||n.indexOf("<response>NOK</response>")!=-1){k.log("dashboardSaveFailed
 event thrown",!
 2);k.element.trigger("dashboardSaveFailed")}else{k.log("dashbo!
 ardSucce
ssfulSaved event 
thrown",2);k.element.trigger("dashboardSuccessfulSaved")}},error:function(n,p,o){k.log("dashboardSaveFailed
 event 
thrown",2);k.element.trigger("dashboardSaveFailed")},dataType:"text"})}});k.element.live("dashboardCloseLayoutDialog",function(){a("#"+d.dialogId).dialog("close")});function
 i(){if(a("."+d.selectLayoutClass).length==0){k.log("Unable to find 
"+d.selectLayoutClass,5)}a("."+d.selectLayoutClass).bind("click",function(q){var
 o=k.layout;k.log("dashboardCloseLayoutDialog event 
thrown",2);k.element.trigger("dashboardCloseLayoutDialog");var 
p=c(a(this).attr("id"));k.layout=p;if(typeof 
b.layoutClass!="undefined"){k.element.find("."+b.layoutClass).removeClass(o.classname).addClass(p.classname);g();if(a("."+b.columnClass).length==0){k.log("Unable
 to find 
"+b.columnClass,5)}k.element.find(".nonsortablecolumn").each(function(){a(this).children().appendTo(k.element.find("."+b.columnClass+":first"));a(".emptycolumn").remove();a("."+b.columnClass).each(function()!
 {if(a(this).children().length==0){a(this).html('<div 
class="emptycolumn">'+b.emptyColumnHtml+"</div>")}})})}else{var n=a('<div 
style="display:none" 
id="tempdashboard"></div>');n.appendTo(a("body"));k.element.children().appendTo(n);k.init()}k.log("dashboardChangeLayout
 event thrown",2);k.element.trigger("dashboardLayoutChanged")});return 
false}a("."+l.selectCategoryClass).live("click",function(){k.log("addWidgetDialogSelectCategory
 event 
thrown",2);k.element.trigger("addWidgetDialogSelectCategory",{category:a(this)});return
 
false});k.element.live("addWidgetDialogSelectCategory",function(o,n){a("."+l.selectCategoryClass).removeClass(l.selectedCategoryClass);a("#"+l.dialogId).find("."+l.widgetClass).empty();a(n.category).addClass(l.selectedCategoryClass);url=k.widgetCategories[a(n.category).attr("id")];k.log("Getting
 JSON feed : 
"+url,1);a.getJSON(url,{cache:true},function(p){if(p.data==0){k.log("Empty data 
returned",3)}a.each(p.data,function(r,s){k.widgetsToAdd[s.id]=s;k.log(!
 "Applying template : "+l.widgetTemplate,1);if(a("#"+l.widgetTe!
 mplate).
length==0){k.log('Template "'+l.widgetTemplate+" not found",5)}var 
q=tmpl(a("#"+l.widgetTemplate).html(),s);a("#"+l.dialogId).find("."+l.widgetClass).append(q)})});k.log("addWidgetDialogWidgetsLoaded
 event 
thrown",2);k.element.trigger("addWidgetDialogWidgetsLoaded")});a("."+l.addWidgetClass).live("click",function(){var
 
n=k.widgetsToAdd[a(this).attr("id").replace("addwidget","")];k.log("dashboardAddWidget
 event 
thrown",2);k.element.trigger("dashboardAddWidget",{widget:n});k.log("dashboardCloseWidgetDialog
 event thrown",2);k.element.trigger("dashboardCloseWidgetDialog");return 
false});a("."+l.openDialogClass).live("click",function(){k.log("dashboardOpenWidgetDialog
 event thrown",2);k.element.trigger("dashboardOpenWidgetDialog");return 
false});k.element.live("dashboardCloseWidgetDialog",function(){a("#"+l.dialogId).dialog("close")});k.element.live("dashboardOpenWidgetDialog",function(){a("#"+l.dialogId).find("."+l.categoryClass).empty();a("#"+l.dialogId).find("."+l.widgetClass)!
 .empty();k.log("Opening dialog 
"+l.dialogId,1);a("#"+l.dialogId).dialog("open");k.log("Getting JSON feed : 
"+l.widgetDirectoryUrl,1);a.getJSON(l.widgetDirectoryUrl,function(n){if(n.category==0){k.log("Empty
 data 
returned",3)}a.each(n.category,function(p,q){k.widgetCategories[q.id]=q.url;k.log("Applying
 template : 
"+l.categoryTemplate,1);if(a("#"+l.categoryTemplate).length==0){k.log('Template 
"'+l.categoryTemplate+" not found",5)}var 
o=tmpl(a("#"+l.categoryTemplate).html(),q);a("#"+l.dialogId).find("."+l.categoryClass).append(o)});k.log("addWidgetDialogCategoriesLoaded
 event 
thrown",2);k.element.trigger("addWidgetDialogCategoriesLoaded");k.log("addWidgetDialogSelectCategory
 event 
thrown",2);k.element.trigger("addWidgetDialogSelectCategory",{category:a("#"+l.dialogId).find("."+l.categoryClass+">li:first")})})});return
 k};a.fn.dashboard.defaults={debuglevel:3,json_data:{},loadingHtml:'<div 
class="loading"><img alt="Loading, please wait" 
src="../themes/default/loading.gif" /><p!
 >Loading...</p></div>',emptyColumnHtml:"Drag your widgets here!
 ",widget
Template:"widgettemplate",columnPrefix:"column-",opacity:"0.2",deleteConfirmMessage:"Are
 you sure you want to delete this widget?",widgetNotFoundHtml:"The content of 
this widget is not available anymore. You may remove this 
widget.",columnClass:"column",widgetClass:"widget",menuClass:"controls",widgetContentClass:"widgetcontent",widgetTitleClass:"widgettitle",widgetHeaderClass:"widgetheader",widgetFullScreenClass:"widgetopenfullscreen",iconsClass:"icons",stateChangeUrl:"",addWidgetSettings:{openDialogClass:"openaddwidgetdialog",addWidgetClass:"addwidget",selectCategoryClass:"selectcategory",selectedCategoryClass:"selected",categoryClass:"categories",widgetClass:"widgets",dialogId:"addwidgetdialog",categoryTemplate:"categorytemplate",widgetTemplate:"addwidgettemplate"},editLayoutSettings:{dialogId:"editLayout",layoutClass:"layoutselection",selectLayoutClass:"layoutchoice",selectedLayoutClass:"selected",openDialogClass:"editlayout",layoutTemplate:"selectlayouttemplate"}};a.fn.!
 
dashboard.widget={defaults:{open:true,fullscreen:false,loaded:false,url:"",metadata:{}}}})(jQuery);(function(){var
 b={};this.tmpl=function a(e,d){var 
c=!/\W/.test(e)?b[e]=b[e]||a(document.getElementById(e).innerHTML):new 
Function("obj","var 
p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+e.replace(/[\r\t\n]/g,"
 
").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return
 p.join('');");return d?c(d):c}})();
\ No newline at end of file

Modified: 
trunk/amdatu-opensocial/opensocial-gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/OpenSocialContainer.java
==============================================================================
--- 
trunk/amdatu-opensocial/opensocial-gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/OpenSocialContainer.java
   (original)
+++ 
trunk/amdatu-opensocial/opensocial-gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/OpenSocialContainer.java
   Mon Aug 22 11:58:33 2011
@@ -15,9 +15,9 @@
  */
 package org.amdatu.opensocial.gadgetmanagement;
 
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * This interface facilitates the decoupling of gadget management with the 
actual OpenSocial implementation.
@@ -35,7 +35,12 @@
     /**
      * Key under which the AppData are stored in the properties of the user 
using UserAdmin.
      */
-    String APP_DATA = "org.amdatu.opensocial.shindig.persistence.appdata";
+    String APP_DATA = "org.amdatu.opensocial.shindig.persistence.appdata";
+    
+    /**
+     * App id prefix under which the UserPrefs are stored for a specific 
application in AppData.
+     */
+    String USER_PREFS_PREFIX = APP_DATA + ".userprefs.";
 
     /**
      * Name of the property in AppData used to store registered gadgets 
(gadgets to display in

Modified: 
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigOpenSocialContainerImpl.java
==============================================================================
--- 
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigOpenSocialContainerImpl.java
  (original)
+++ 
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigOpenSocialContainerImpl.java
  Mon Aug 22 11:58:33 2011
@@ -46,12 +46,19 @@
 import org.apache.shindig.common.crypto.BlobCrypterException;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.util.Utf8UrlCoder;
+import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.UserPrefs;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.LocaleSpec;
 import org.apache.shindig.gadgets.spec.MessageBundle;
+import org.apache.shindig.gadgets.spec.UserPref;
 import org.apache.shindig.gadgets.variables.Substitutions;
+import org.apache.shindig.gadgets.variables.UserPrefSubstituter;
 import org.osgi.framework.Constants;
 import org.osgi.service.log.LogService;
+import org.osgi.service.useradmin.Role;
+import org.osgi.service.useradmin.User;
+import org.osgi.service.useradmin.UserAdmin;
 
 /**
  * Shindig implementation of the OpenSocialContainer interface.
@@ -75,7 +82,8 @@
     private volatile LogService m_logService;
     private volatile TokenProvider m_tokenProvider;
     private volatile Component m_component;
-    private volatile DependencyManager m_dependencyManager;
+    private volatile DependencyManager m_dependencyManager;
+    private volatile UserAdmin m_userAdmin;
 
     /**
      * The init() method is invoked by the Felix dependency manager.
@@ -86,7 +94,13 @@
             "(&(" + Tenant.TENANT_ID_SERVICEPROPERTY + "=" + m_tenant.getId() 
+ ")(" + Constants.OBJECTCLASS
                 + "=" + TokenProvider.class.getName() + "))";
         m_component.add(m_dependencyManager.createServiceDependency()
-                .setService(TokenProvider.class, 
tenantFilter).setRequired(true).setInstanceBound(true));
+                .setService(TokenProvider.class, 
tenantFilter).setRequired(true).setInstanceBound(true));
+        
+        String tenantFilter2 =
+            "(&(" + Tenant.TENANT_ID_SERVICEPROPERTY + "=" + m_tenant.getId() 
+ ")(" + Constants.OBJECTCLASS
+                + "=" + UserAdmin.class.getName() + "))";
+        m_component.add(m_dependencyManager.createServiceDependency()
+            .setService(UserAdmin.class, 
tenantFilter2).setRequired(true).setInstanceBound(true));
 
         m_logService.log(LogService.LOG_INFO, getClass().getName() + " service 
initialized");
     }
@@ -128,7 +142,7 @@
         }
         return null;
     }
-
+    
     public Map<String, String> getGadgetSpec(final HttpServletRequest request, 
final String gadgetUrl) {
         Map<String, String> gadgetSpec = new HashMap<String, String>();
         try {
@@ -157,10 +171,22 @@
                     bundle = new MessageBundle(locales.get(locale), 
messageXML);
                     substituter = new Substitutions();
                     substituter.addSubstitutions(Substitutions.Type.MESSAGE, 
bundle.getMessages());
-                    spec = spec.substitute(substituter);
-                }
+                    spec = spec.substitute(substituter);
+                }
+                
+                // Replace user preferences (syntax: __UP_<pref>__)
+                final UserPrefs prefs = loadUserPrefs(spec, getUser(request));
+                GadgetContext context = new GadgetContext() {
+                    public UserPrefs getUserPrefs() {
+                        return prefs;
+                    }
+                };
+                Substitutions substituter = new Substitutions();
+                UserPrefSubstituter userPrefSubs =  new UserPrefSubstituter();
+                userPrefSubs.addSubstitutions(substituter, context, spec);
+                spec = spec.substitute(substituter);
     
-                // Copy attributes
+                // Copy attributes __UP_title__
                 gadgetSpec.put("title", spec.getModulePrefs().getTitle());
                 gadgetSpec.put("description", 
spec.getModulePrefs().getDescription());
                 gadgetSpec.put("author", spec.getModulePrefs().getAuthor());
@@ -187,7 +213,38 @@
         }
         return null;
     }
-
+    
+    private User getUser(final HttpServletRequest request) {
+        String viewer = getViewer(request);
+        if (viewer != null && !"anonymous".equals(viewer)) {
+            Role userRole = m_userAdmin.getRole(viewer);
+            if (userRole.getType() == Role.USER) {
+                return (User) userRole;
+            }
+        }
+        return null;
+    }
+    
+    private UserPrefs loadUserPrefs(GadgetSpec spec, final User user) {
+        // Default userpref values, when there are no user specific userprefs 
stored (yet)
+        Map<String, UserPref> defaultUserPrefs = spec.getUserPrefs();
+        
+        // First build the userprefs with the default values
+        Map<String, String> userPrefMap = new HashMap<String, String>();
+        for (String name : defaultUserPrefs.keySet()) {
+            userPrefMap.put(name, 
defaultUserPrefs.get(name).getDefaultValue());
+        }
+        
+        // TODO: overrule default values with user specific user preferences
+        if (user != null) {
+            Object userPrefs = user.getProperties().get(USER_PREFS_PREFIX + 
"." + spec.getUrl().toString());
+            if (userPrefs != null) {
+                
+            }
+        }
+        return new UserPrefs(userPrefMap);    
+    }
+    
     // Returns the preferred locale in this order:
     // 1 Locale that matches country & language of preferred locale
     // 2 Locale that matches language of preferred locale
@@ -291,7 +348,7 @@
                         new 
InputStreamReader(inputConnection.getInputStream(), Charset.forName("UTF-8")));
                 String inputLine;
                 while ((inputLine = reader.readLine()) != null) {
-                    xml += inputLine;
+                    xml += inputLine + System.getProperty("line.separator");
                 }
                 m_logService.log(LogService.LOG_DEBUG, "Retrieving gadgetspec 
'" + url + "' took "
                     + (System.currentTimeMillis() - time) + " ms");

Modified: 
trunk/amdatu-opensocial/opensocial-shindig/src/main/resources/features/shindig.container/shindig-container.js
==============================================================================
--- 
trunk/amdatu-opensocial/opensocial-shindig/src/main/resources/features/shindig.container/shindig-container.js
       (original)
+++ 
trunk/amdatu-opensocial/opensocial-shindig/src/main/resources/features/shindig.container/shindig-container.js
       Mon Aug 22 11:58:33 2011
@@ -880,6 +880,7 @@
   }
 };
 
+
 /**
  * Renders all gadgets in the container.
  */
@@ -950,4 +951,20 @@
 /**
  * Default container.
  */
-shindig.container = new shindig.IfrContainer();
\ No newline at end of file
+shindig.container = new shindig.IfrContainer();
+
+// TODO: implement
+shindig.Container.prototype.getGadgetFromId = function(serviceName) {
+  for (var i = 0; i < this.gadgets_.length; i++) {
+    if (this.gadgets_[i].serviceName = serviceName) {
+      return this.gadgets_[i];
+    }
+  }
+  return null;
+};
+
+shindig.IfrContainer.prototype.handleOpenUserPrefsDialog = function(id) {
+  //var gadget = shindig.container.getGadgetFromId(id);
+  //gadget.handleOpenUserPrefsDialog();
+  alert("this function is not yet implemented");
+};
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits

Reply via email to