1 /**
  2  * Copyright (C) 2005-2010 Alfresco Software Limited.
  3  *
  4  * This file is part of Alfresco
  5  *
  6  * Alfresco is free software: you can redistribute it and/or modify
  7  * it under the terms of the GNU Lesser General Public License as published by
  8  * the Free Software Foundation, either version 3 of the License, or
  9  * (at your option) any later version.
 10  *
 11  * Alfresco is distributed in the hope that it will be useful,
 12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 14  * GNU Lesser General Public License for more details.
 15  *
 16  * You should have received a copy of the GNU Lesser General Public License
 17  * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
 18  */
 19  
 20 /**
 21  * Sites Module
 22  * 
 23  * @namespace Alfresco.module
 24  * @class .description
 25 */
 26 (function()
 27 {
 28    /**
 29     * YUI Library aliases
 30     */
 31    var Dom = YAHOO.util.Dom,
 32       Event = YAHOO.util.Event;
 33 
 34    /**
 35     * Alfresco Slingshot aliases
 36     */
 37    var $html = Alfresco.util.encodeHTML;
 38 
 39    Alfresco.module.Sites = function(htmlId)
 40    {
 41       return Alfresco.module.Sites.superclass.constructor.call(this, "Alfresco.module.Sites", htmlId, ["button", "menu", "container"]);
 42    };
 43 
 44    YAHOO.extend(Alfresco.module.Sites, Alfresco.component.Base,
 45    {
 46       /**
 47        * Object container for initialization options
 48        *
 49        * @property options
 50        * @type object
 51        */
 52       options:
 53       {
 54          /**
 55           * Current siteId.
 56           * 
 57           * @property siteId
 58           * @type string
 59           * @default ""
 60           */
 61          siteId: "",
 62 
 63          /**
 64           * Current site title.
 65           * 
 66           * @property siteTitle
 67           * @type string
 68           * @default ""
 69           */
 70          siteTitle: "",
 71          
 72          /**
 73           * Favourite sites
 74           * 
 75           * @property favouriteSites
 76           * @type object
 77           * @default {}
 78           */
 79          favouriteSites: {}
 80       },
 81       
 82       /**
 83        * Fired by YUI when parent element is available for scripting.
 84        *
 85        * @method onReady
 86        */
 87       onReady: function Sites_onReady()
 88       {
 89          // Notifications that the favourite sites have been updated
 90          YAHOO.Bubbling.on("favouriteSiteAdded", this.onFavouriteSiteAdded, this);
 91          YAHOO.Bubbling.on("favouriteSiteRemoved", this.onFavouriteSiteRemoved, this);
 92          YAHOO.Bubbling.on("siteDeleted", this.onSiteDeleted, this);
 93 
 94          this.preferencesService = new Alfresco.service.Preferences();
 95 
 96          var templateUrl = Alfresco.constants.URL_SERVICECONTEXT + "modules/header/sites",
 97             dataObj =
 98             {
 99                htmlid: this.id
100             };
101          
102          if (this.options.siteId !== "")
103          {
104             dataObj.siteId = this.options.siteId;
105          }
106          
107          Alfresco.util.Ajax.request(
108          {
109             url: templateUrl,
110             dataObj: dataObj,
111             successCallback:
112             {
113                fn: this.onTemplateLoaded,
114                scope: this
115             },
116             failureMessage: "Could not load module template from '" + templateUrl + "'.",
117             scope: this,
118             execScripts: true
119          });
120       },
121       
122       /**
123        * Event callback when dialog template has been loaded
124        *
125        * @method onTemplateLoaded
126        * @param response {object} Server response from load template XHR request
127        */
128       onTemplateLoaded: function Sites_onTemplateLoaded(response)
129       {
130          // Inject the template from the XHR request into a new DIV element
131          var containerDiv = document.createElement("div");
132          containerDiv.innerHTML = response.serverResponse.responseText;
133          document.body.insertBefore(containerDiv, document.body.firstChild);
134 
135          this.widgets.sitesButton = new YAHOO.widget.Button(this.id,
136          {
137             type: "menu",
138             menu: this.id + "-sites-menu",
139             lazyloadmenu: false
140          });
141       },
142       
143       /**
144        * Show the Create Site dialog
145        *
146        * @method showCreateSite
147        */
148       showCreateSite: function Sites_showCreateSite()
149       {
150          Alfresco.module.getCreateSiteInstance().show();
151       },
152       
153       /**
154        * Favourite Site has been added
155        *
156        * @method onFavouriteSiteAdded
157        * @param layer {object} Event fired
158        * @param args {array} Event parameters (depends on event type)
159        */
160       onFavouriteSiteAdded: function Sites_onFavouriteSiteAdded(layer, args)
161       {
162          var obj = args[1];
163          if (obj && obj.shortName !== null)
164          {
165             this.options.favouriteSites[obj.shortName] = obj.title;
166             this._renderFavouriteSites();
167          }
168       },
169 
170       /**
171        * Favourite Site has been removed
172        *
173        * @method onFavouriteSiteAdded
174        * @param layer {object} Event fired
175        * @param args {array} Event parameters (depends on event type)
176        */
177       onFavouriteSiteRemoved: function Sites_onFavouriteSiteRemoved(layer, args)
178       {
179          var obj = args[1];
180          if (obj && obj.shortName !== null)
181          {
182             if (obj.shortName in this.options.favouriteSites)
183             {
184                delete this.options.favouriteSites[obj.shortName];
185                this._renderFavouriteSites();
186             }
187          }
188       },
189 
190       /**
191        * Site has been deleted - maybe remove from favourites menu
192        *
193        * @method onSiteDeleted
194        * @param layer {object} Event fired
195        * @param args {array} Event parameters (depends on event type)
196        */
197       onSiteDeleted: function Sites_onSiteDeleted(layer, args)
198       {
199          var obj = args[1];
200          if (obj && obj.site !== null)
201          {
202             if (obj.site.shortName in this.options.favouriteSites)
203             {
204                delete this.options.favouriteSites[obj.site.shortName];
205                this._renderFavouriteSites();
206             }
207          }
208       },
209 
210       /**
211        * Renders favourite sites into menu
212        *
213        * @method renderFavouriteSites
214        * @private
215        */
216       _renderFavouriteSites: function Sites__renderFavouriteSites()
217       {
218          var sites = [], site, sitesMenu = this.widgets.sitesButton.getMenu(), sitesGroup, i, ii;
219          
220          // Create a sorted list of our current favourites
221          for (site in this.options.favouriteSites)
222          {
223             if (this.options.favouriteSites.hasOwnProperty(site))
224             {
225                sites.push(site);
226             }
227          }
228          sites.sort();
229 
230          sitesGroup = sitesMenu.getItemGroups()[0];
231          for (i = 0, ii = sitesGroup.length; i < ii; i++)
232          {
233             sitesMenu.removeItem(0, 0, true);
234          }
235          
236          Dom.setStyle(this.id + "-favouritesContainer", "display", sites.length > 0 ? "block" : "none");
237          Dom.setStyle(this.id + "-favouriteSites", "display", sites.length > 0 ? "block" : "none");
238 
239          for (i = 0, ii = sites.length; i < ii; i++)
240          {
241             sitesMenu.addItem(
242             {
243                text: $html(this.options.favouriteSites[sites[i]]),
244                url: Alfresco.util.uriTemplate("sitedashboardpage",
245                {
246                   site: sites[i]
247                })
248             }, 0);
249          }
250          
251          // Show/hide "Add to favourites" menu item if we're in a site
252          if (this.options.siteId.length !== 0)
253          {
254             Dom.setStyle(this.id + "-addFavourite", "display", this.options.siteId in this.options.favouriteSites ? "none" : "block");
255          }
256          
257          sitesMenu.render();
258       },
259 
260       /**
261        * Adds the current site as a favourite
262        *
263        * @method addAsFavourite
264        */
265       addAsFavourite: function Sites_addAsFavourite()
266       {
267          var site =
268          {
269             shortName: this.options.siteId,
270             title: this.options.siteTitle
271          },
272             me = this;
273 
274          var responseConfig =
275          {
276             failureCallback:
277             {
278                fn: function(event, obj)
279                {
280                   Alfresco.util.PopupManager.displayPrompt(
281                   {
282                      text: me.msg("message.save.failure")
283                   });
284                },
285                scope: this
286             },
287             successCallback:
288             {
289                fn: function(event, obj)
290                {
291                   YAHOO.Bubbling.fire("favouriteSiteAdded", obj.site);
292                },
293                scope: this,
294                obj:
295                {
296                   site: site
297                }
298             }
299          };
300 
301          this.preferencesService.set(Alfresco.service.Preferences.FAVOURITE_SITES + "." + site.shortName, true, responseConfig);
302       }      
303    });
304 })();
305 /**
306  * Dummy instance to load optional YUI components early.
307  * Use fake "null" id, which is tested later in onComponentsLoaded()
308 */
309 var moduleSites = new Alfresco.module.Sites("null");