www/include/scripts/linkitems-2.js

Code
Comments
Other
Rev Date Author Line
6291 11 Jun 13 nicklas 1 /* $Id $
6291 11 Jun 13 nicklas 2   ------------------------------------------------------------------
6291 11 Jun 13 nicklas 3   Copyright (C) 2013 Nicklas Nordborg
6291 11 Jun 13 nicklas 4
6291 11 Jun 13 nicklas 5   This file is part of BASE - BioArray Software Environment.
6291 11 Jun 13 nicklas 6   Available at http://base.thep.lu.se/
6291 11 Jun 13 nicklas 7
6291 11 Jun 13 nicklas 8   BASE is free software; you can redistribute it and/or
6291 11 Jun 13 nicklas 9   modify it under the terms of the GNU General Public License
6291 11 Jun 13 nicklas 10   as published by the Free Software Foundation; either version 3
6291 11 Jun 13 nicklas 11   of the License, or (at your option) any later version.
6291 11 Jun 13 nicklas 12
6291 11 Jun 13 nicklas 13   BASE is distributed in the hope that it will be useful,
6291 11 Jun 13 nicklas 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
6291 11 Jun 13 nicklas 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6291 11 Jun 13 nicklas 16   GNU General Public License for more details.
6291 11 Jun 13 nicklas 17
6291 11 Jun 13 nicklas 18   You should have received a copy of the GNU General Public License
6291 11 Jun 13 nicklas 19   along with BASE. If not, see <http://www.gnu.org/licenses/>.
6291 11 Jun 13 nicklas 20   ------------------------------------------------------------------
6291 11 Jun 13 nicklas 21
6291 11 Jun 13 nicklas 22   @author Nicklas
6291 11 Jun 13 nicklas 23   @since 3.3
6291 11 Jun 13 nicklas 24 */
7419 03 Nov 17 nicklas 25 'use strict';
6291 11 Jun 13 nicklas 26
6291 11 Jun 13 nicklas 27 var Link = function()
6291 11 Jun 13 nicklas 28 {
6291 11 Jun 13 nicklas 29   var link = {};
6291 11 Jun 13 nicklas 30   var internal = {};
6291 11 Jun 13 nicklas 31   
6291 11 Jun 13 nicklas 32   // Action value for items removed from the list
6291 11 Jun 13 nicklas 33   link.REMOVE = -1;
6291 11 Jun 13 nicklas 34   // Action value for items already in the list
6291 11 Jun 13 nicklas 35   link.EXISTING = 0;
6291 11 Jun 13 nicklas 36   // Action value for items added to the list
6291 11 Jun 13 nicklas 37   link.ADD = 1;
6291 11 Jun 13 nicklas 38   
6291 11 Jun 13 nicklas 39   /**
6291 11 Jun 13 nicklas 40     Add a new section with optional initial items to a list.
6291 11 Jun 13 nicklas 41     The section parameter is an object with the 'itemType'
6291 11 Jun 13 nicklas 42     property set to an ITEM value and optionally a 'name' property
6291 11 Jun 13 nicklas 43     if a header is desired.
6291 11 Jun 13 nicklas 44     
6291 11 Jun 13 nicklas 45     @param list The id or <select> list object
6291 11 Jun 13 nicklas 46     @param section A section object
6291 11 Jun 13 nicklas 47     @param initialItems Optional array with initial item data
6291 11 Jun 13 nicklas 48     @param initialAction Action value for items added to the list,
6291 11 Jun 13 nicklas 49       if not specified, 0 is assumed
6291 11 Jun 13 nicklas 50    */
6291 11 Jun 13 nicklas 51   link.addSection = function(list, section, initialItems, initialAction)
6291 11 Jun 13 nicklas 52   {
6291 11 Jun 13 nicklas 53     list = Doc.element(list);
6291 11 Jun 13 nicklas 54     list.numSections = list.numSections ? 1 : list.numSections+1;
6291 11 Jun 13 nicklas 55     var itemType = section.itemType;
6291 11 Jun 13 nicklas 56     
6291 11 Jun 13 nicklas 57     // Add a section header if a section name is specified
6291 11 Jun 13 nicklas 58     if (section.name)
6291 11 Jun 13 nicklas 59     {
6291 11 Jun 13 nicklas 60       var option = new Option('› '+section.name, itemType);
6291 11 Jun 13 nicklas 61       option.className = 'selectoptionheader';
6291 11 Jun 13 nicklas 62       option.section = section;
6291 11 Jun 13 nicklas 63       list[list.length] = option;
6291 11 Jun 13 nicklas 64     }
6291 11 Jun 13 nicklas 65     
6291 11 Jun 13 nicklas 66     // Add initial items to the section
6291 11 Jun 13 nicklas 67     if (initialItems)
6291 11 Jun 13 nicklas 68     {
6291 11 Jun 13 nicklas 69       if (!initialAction) initialAction = Link.EXISTING;
6291 11 Jun 13 nicklas 70       for (var i = 0; i < initialItems.length; i++)
6291 11 Jun 13 nicklas 71       {
6291 11 Jun 13 nicklas 72         var item = initialItems[i];
6291 11 Jun 13 nicklas 73         // Initialize item data
6291 11 Jun 13 nicklas 74         item.itemType = itemType;
6291 11 Jun 13 nicklas 75         item.action = initialAction;
6291 11 Jun 13 nicklas 76         item.originalValue = item.value;
6291 11 Jun 13 nicklas 77         
6291 11 Jun 13 nicklas 78         // Create new <select> option
6291 11 Jun 13 nicklas 79         var option = new Option(item.name, item.itemType+'.'+item.id);
6291 11 Jun 13 nicklas 80         // cross-reference link
6291 11 Jun 13 nicklas 81         option.item = item;
6291 11 Jun 13 nicklas 82         item.option = option;
6291 11 Jun 13 nicklas 83         
6291 11 Jun 13 nicklas 84         list[list.length] = option;
6291 11 Jun 13 nicklas 85         list.knownItems[list.knownItems.length] = item;
6291 11 Jun 13 nicklas 86         list.itemsById[item.itemType+'.'+item.id] = item;
6291 11 Jun 13 nicklas 87       }
6291 11 Jun 13 nicklas 88     }
6291 11 Jun 13 nicklas 89   }
6291 11 Jun 13 nicklas 90   
6291 11 Jun 13 nicklas 91   /**
6291 11 Jun 13 nicklas 92     Add an item to the list
6291 11 Jun 13 nicklas 93   */
6291 11 Jun 13 nicklas 94   link.addItem = function(list, itemType, item)
6291 11 Jun 13 nicklas 95   {
6291 11 Jun 13 nicklas 96     list = Doc.element(list);
6291 11 Jun 13 nicklas 97     
6291 11 Jun 13 nicklas 98     var existing = list.itemsById[itemType+'.'+item.id];
6291 11 Jun 13 nicklas 99     if (!existing)
6291 11 Jun 13 nicklas 100     {
6412 04 Feb 14 nicklas 101       // New item (cloning is needed in case 'item' is created from another window)
6412 04 Feb 14 nicklas 102       item = { 'id': item.id, 
6412 04 Feb 14 nicklas 103         'name': item.name,
6412 04 Feb 14 nicklas 104         'itemType': itemType,
6412 04 Feb 14 nicklas 105         'action': link.ADD,
6412 04 Feb 14 nicklas 106         'value': item.value,
7030 25 Nov 15 nicklas 107         'originalValue': item.originalValue != undefined ? item.originalValue : item.value
6412 04 Feb 14 nicklas 108         };
6291 11 Jun 13 nicklas 109       
6305 09 Aug 13 nicklas 110       var option = new Option(item.name, item.itemType+'.'+item.id, true, true);
6291 11 Jun 13 nicklas 111       option.item = item;
6291 11 Jun 13 nicklas 112       item.option = option;
6291 11 Jun 13 nicklas 113       
6291 11 Jun 13 nicklas 114       var insertIndex = internal.getInsertIndex(list, itemType);
6291 11 Jun 13 nicklas 115       Forms.addListOption(list, insertIndex, option);      
6291 11 Jun 13 nicklas 116       list.knownItems[list.knownItems.length] = item;
6291 11 Jun 13 nicklas 117       list.itemsById[item.itemType+'.'+item.id] = item;
6291 11 Jun 13 nicklas 118     }
6291 11 Jun 13 nicklas 119     else if (existing.option)
6291 11 Jun 13 nicklas 120     {
6291 11 Jun 13 nicklas 121       // Selected item is already in the list
6291 11 Jun 13 nicklas 122       // No change, except marking it as selected
6291 11 Jun 13 nicklas 123       existing.option.selected = true;
6291 11 Jun 13 nicklas 124     }
6291 11 Jun 13 nicklas 125     else
6291 11 Jun 13 nicklas 126     {
6291 11 Jun 13 nicklas 127       // Selected item is known, but not in the list
6291 11 Jun 13 nicklas 128       existing.action++;
6300 19 Jun 13 nicklas 129       existing.value = item.value;
6291 11 Jun 13 nicklas 130       
6305 09 Aug 13 nicklas 131       var option = new Option(existing.name, existing.itemType+'.'+existing.id, true, true);
6291 11 Jun 13 nicklas 132       option.item = existing;
6291 11 Jun 13 nicklas 133       existing.option = option;
6291 11 Jun 13 nicklas 134
6291 11 Jun 13 nicklas 135       var insertIndex = internal.getInsertIndex(list, itemType);
6291 11 Jun 13 nicklas 136       Forms.addListOption(list, insertIndex, option);
6291 11 Jun 13 nicklas 137     }
6291 11 Jun 13 nicklas 138   }
6291 11 Jun 13 nicklas 139   
6291 11 Jun 13 nicklas 140   /**
6294 13 Jun 13 nicklas 141     Remove selected items from the list.
6294 13 Jun 13 nicklas 142     @param list The ID or element of the list to remove items from
6294 13 Jun 13 nicklas 143     @param addToList The ID or element of another list that the removed
6294 13 Jun 13 nicklas 144       items should be added to
6291 11 Jun 13 nicklas 145   */
6294 13 Jun 13 nicklas 146   link.removeSelected = function(list, addToList)
6291 11 Jun 13 nicklas 147   {
6291 11 Jun 13 nicklas 148     list = Doc.element(list);
6294 13 Jun 13 nicklas 149     var sorted = 0;
6294 13 Jun 13 nicklas 150     if (addToList)
6294 13 Jun 13 nicklas 151     {
6294 13 Jun 13 nicklas 152       addToList = Doc.element(addToList);
6294 13 Jun 13 nicklas 153       sorted = Data.get(addToList, 'is-sorted');
6294 13 Jun 13 nicklas 154     }
6294 13 Jun 13 nicklas 155     
6291 11 Jun 13 nicklas 156     for (var i = 0; i < list.length; i++)
6291 11 Jun 13 nicklas 157     {
6291 11 Jun 13 nicklas 158       var item = list[i].item;
6291 11 Jun 13 nicklas 159       if (list[i].selected && item && item.id)
6291 11 Jun 13 nicklas 160       {
6294 13 Jun 13 nicklas 161         if (addToList)
6294 13 Jun 13 nicklas 162         {
6294 13 Jun 13 nicklas 163           var option = new Option(item.name, item.id, false, true);
6294 13 Jun 13 nicklas 164           var insertIndex = sorted ? Forms.getInsertIndexOfSortedList(addToList, option.text) : addToList.length;
6294 13 Jun 13 nicklas 165           Forms.addListOption(addToList, insertIndex, option);
6294 13 Jun 13 nicklas 166         }
6291 11 Jun 13 nicklas 167         item.action--;
6880 21 Apr 15 nicklas 168         item.value = item.originalValue;
6291 11 Jun 13 nicklas 169         item.option = null;
7030 25 Nov 15 nicklas 170         Events.sendCustomEvent(list, 'base-removed', list[i]);
6291 11 Jun 13 nicklas 171         list[i--] = null;
6291 11 Jun 13 nicklas 172       }
7419 03 Nov 17 nicklas 173     }
6291 11 Jun 13 nicklas 174   }
6291 11 Jun 13 nicklas 175   
6291 11 Jun 13 nicklas 176   /**
6294 13 Jun 13 nicklas 177     Remove all items from the given list
6294 13 Jun 13 nicklas 178     @param list The ID or element of the list to remove items from
6294 13 Jun 13 nicklas 179    */
6294 13 Jun 13 nicklas 180   link.removeAll = function(list)
6294 13 Jun 13 nicklas 181   {
6294 13 Jun 13 nicklas 182     list = Doc.element(list);
6294 13 Jun 13 nicklas 183     for (var i = 0; i < list.length; i++)
6294 13 Jun 13 nicklas 184     {
6294 13 Jun 13 nicklas 185       var item = list[i].item;
6294 13 Jun 13 nicklas 186       if (item && item.id)
6294 13 Jun 13 nicklas 187       {
6294 13 Jun 13 nicklas 188         item.action--;
6880 21 Apr 15 nicklas 189         item.value = item.originalValue;
6294 13 Jun 13 nicklas 190         item.option = null;
6294 13 Jun 13 nicklas 191       }
6294 13 Jun 13 nicklas 192     }
6294 13 Jun 13 nicklas 193     list.length = 0;
6294 13 Jun 13 nicklas 194   }
6294 13 Jun 13 nicklas 195   
6294 13 Jun 13 nicklas 196   /**
6291 11 Jun 13 nicklas 197     Event handler for removing selected items from a list.
6291 11 Jun 13 nicklas 198     The ID of the selection list should be specified in 
6294 13 Jun 13 nicklas 199     'data-list-id' attribute. Optionally, the removed
6294 13 Jun 13 nicklas 200     items can be added to another list by setting
6294 13 Jun 13 nicklas 201     the 'data-remove-to' attribute to the ID of the other list.
6291 11 Jun 13 nicklas 202    */
6291 11 Jun 13 nicklas 203   link.removeOnClick = function(event)
6291 11 Jun 13 nicklas 204   {
6291 11 Jun 13 nicklas 205     var listId = Data.get(event.currentTarget, 'list-id');
6294 13 Jun 13 nicklas 206     var moveToListId = Data.get(event.currentTarget, 'remove-to');
6294 13 Jun 13 nicklas 207     link.removeSelected(listId || event.currentTarget, moveToListId);
6291 11 Jun 13 nicklas 208   }
6291 11 Jun 13 nicklas 209   
6291 11 Jun 13 nicklas 210   /**
6291 11 Jun 13 nicklas 211     Event handler that opens a popup for selecting items to add to a
6291 11 Jun 13 nicklas 212     list. The ID of the selection list should be specified
6291 11 Jun 13 nicklas 213     in 'data-list-id' attribute, and the type of items to
6291 11 Jun 13 nicklas 214     select should be specified in 'data-item-type' attribute.
6291 11 Jun 13 nicklas 215   */
6291 11 Jun 13 nicklas 216   link.addOnClick = function(event)
6291 11 Jun 13 nicklas 217   {
6291 11 Jun 13 nicklas 218     var listId = Data.get(event.currentTarget, 'list-id');
6291 11 Jun 13 nicklas 219     var itemType = Data.get(event.currentTarget, 'item-type');
6291 11 Jun 13 nicklas 220     var exclude = Data.get(event.currentTarget, 'exclude');
6306 13 Aug 13 nicklas 221     var filter = Data.get(event.currentTarget, 'filter');
6291 11 Jun 13 nicklas 222
6300 19 Jun 13 nicklas 223     var listItems = link.getIdsInList(listId, itemType);
6291 11 Jun 13 nicklas 224     if (exclude) listItems[listItems.length] = exclude;
6291 11 Jun 13 nicklas 225     var url = '&exclude='+listItems.join(',');
6306 13 Aug 13 nicklas 226     if (filter) url += filter;
6291 11 Jun 13 nicklas 227     Dialogs.selectItem(itemType, listId, 1, url);
6291 11 Jun 13 nicklas 228   }
6291 11 Jun 13 nicklas 229   
6291 11 Jun 13 nicklas 230   /**
6291 11 Jun 13 nicklas 231     Export all ADD and REMOVE actions to hidden input fields in the same form
6291 11 Jun 13 nicklas 232     as the list is part of. The hidden form fields are named as '+ITEMTYPE' and
6291 11 Jun 13 nicklas 233     '-ITEMTYPE' where '+' are for added items and '-' for removed items.
6291 11 Jun 13 nicklas 234     The value of each hidden field is a comma separated list of the ID values.
6320 11 Sep 13 nicklas 235     @param list The id or list element
6320 11 Sep 13 nicklas 236     @param actionPrefix Force the given prefix instead of auto-selecting '+' or '-'
6291 11 Jun 13 nicklas 237   */
6320 11 Sep 13 nicklas 238   link.exportActions = function(list, actionPrefix)
6291 11 Jun 13 nicklas 239   {
6291 11 Jun 13 nicklas 240     list = Doc.element(list);
6291 11 Jun 13 nicklas 241     var frm = list.form;
6291 11 Jun 13 nicklas 242     
6291 11 Jun 13 nicklas 243     for (var i = 0; i < list.knownItems.length; i++)
6291 11 Jun 13 nicklas 244     {
6291 11 Jun 13 nicklas 245       var item = list.knownItems[i];
6300 19 Jun 13 nicklas 246       
6322 11 Sep 13 nicklas 247       if (item.action != 0 || item.value != item.originalValue)
6291 11 Jun 13 nicklas 248       {
6320 11 Sep 13 nicklas 249         var prefix = actionPrefix ? actionPrefix : (item.action < 0 ? '-' : '+');
6320 11 Sep 13 nicklas 250         var actionKey = prefix + item.itemType;
6291 11 Jun 13 nicklas 251         if (!frm[actionKey])
6291 11 Jun 13 nicklas 252         {
6389 07 Jan 14 nicklas 253           Forms.addHidden(frm, actionKey, item.id);
6291 11 Jun 13 nicklas 254         }
6291 11 Jun 13 nicklas 255         else
6291 11 Jun 13 nicklas 256         {
6291 11 Jun 13 nicklas 257           frm[actionKey].value += ','+item.id;
6291 11 Jun 13 nicklas 258         }
6322 11 Sep 13 nicklas 259         if (item.value != undefined)
6300 19 Jun 13 nicklas 260         {
6300 19 Jun 13 nicklas 261           var valueKey = item.itemType+'.'+item.id;
6300 19 Jun 13 nicklas 262           if (!frm[valueKey])
6300 19 Jun 13 nicklas 263           {
6389 07 Jan 14 nicklas 264             Forms.addHidden(frm, valueKey, item.value);
6300 19 Jun 13 nicklas 265           }
6300 19 Jun 13 nicklas 266           else
6300 19 Jun 13 nicklas 267           {
6300 19 Jun 13 nicklas 268             frm[valueKey].value = item.value;
6300 19 Jun 13 nicklas 269           }
6300 19 Jun 13 nicklas 270         }
6291 11 Jun 13 nicklas 271       }
6291 11 Jun 13 nicklas 272     }
6291 11 Jun 13 nicklas 273   }
6291 11 Jun 13 nicklas 274   
6291 11 Jun 13 nicklas 275   /**
6291 11 Jun 13 nicklas 276     Event handler for the 'base-selected' event sent by popup windows used
6291 11 Jun 13 nicklas 277     for selecting items.The event.detail object should contain the the following
6291 11 Jun 13 nicklas 278     properties: 'itemType', 'id' and 'name'.
6291 11 Jun 13 nicklas 279   */
6291 11 Jun 13 nicklas 280   link.onSelected = function(event)
6291 11 Jun 13 nicklas 281   {
6291 11 Jun 13 nicklas 282     link.addItem(event.currentTarget, event.detail.itemType, event.detail);
6291 11 Jun 13 nicklas 283   }
6291 11 Jun 13 nicklas 284   
6291 11 Jun 13 nicklas 285   /**
6291 11 Jun 13 nicklas 286     Get an array with the ID values of all items
6291 11 Jun 13 nicklas 287     in the list.
6291 11 Jun 13 nicklas 288     @param list The ID or element of a selection list
6291 11 Jun 13 nicklas 289     @param itemType Required, the type of items to get the id for
6291 11 Jun 13 nicklas 290   */
6300 19 Jun 13 nicklas 291   link.getIdsInList = function(list, itemType)
6291 11 Jun 13 nicklas 292   {
6291 11 Jun 13 nicklas 293     list = Doc.element(list);
6291 11 Jun 13 nicklas 294     var ids = [];
6291 11 Jun 13 nicklas 295     for (var i = 0; i < list.length; i++)
6291 11 Jun 13 nicklas 296     {
6291 11 Jun 13 nicklas 297       var item = list[i].item;
6291 11 Jun 13 nicklas 298       if (item && item.itemType == itemType && item.id)
6291 11 Jun 13 nicklas 299       {
6291 11 Jun 13 nicklas 300         ids[ids.length] = item.id;
6291 11 Jun 13 nicklas 301       }
6291 11 Jun 13 nicklas 302     }
6291 11 Jun 13 nicklas 303     return ids;
6291 11 Jun 13 nicklas 304   }
6291 11 Jun 13 nicklas 305   
6291 11 Jun 13 nicklas 306   /**
6291 11 Jun 13 nicklas 307     Get the index where an item of the given type should be inserted into
6291 11 Jun 13 nicklas 308     the list.
6291 11 Jun 13 nicklas 309   */
6291 11 Jun 13 nicklas 310   internal.getInsertIndex = function(list, itemType)
6291 11 Jun 13 nicklas 311   {
6291 11 Jun 13 nicklas 312     list = Doc.element(list);
6291 11 Jun 13 nicklas 313     if (list.numSections == 1) return list.length;
6291 11 Jun 13 nicklas 314
6291 11 Jun 13 nicklas 315     var insertIndex = -1;
6291 11 Jun 13 nicklas 316     for (var i = 0; i < list.length; i++)
6291 11 Jun 13 nicklas 317     {
6291 11 Jun 13 nicklas 318       var itemOrSection = list[i].item || list[i].section;
6291 11 Jun 13 nicklas 319       if (itemOrSection && itemOrSection.itemType == itemType)
6291 11 Jun 13 nicklas 320       {
6291 11 Jun 13 nicklas 321         insertIndex = i+1;
6291 11 Jun 13 nicklas 322       }
6291 11 Jun 13 nicklas 323       else if (insertIndex >= 0)
6291 11 Jun 13 nicklas 324       {
6291 11 Jun 13 nicklas 325         return insertIndex;
6291 11 Jun 13 nicklas 326       }
6291 11 Jun 13 nicklas 327     }
6291 11 Jun 13 nicklas 328     return list.length;
6291 11 Jun 13 nicklas 329   }
6291 11 Jun 13 nicklas 330   
6291 11 Jun 13 nicklas 331   /**
6291 11 Jun 13 nicklas 332     Element initializer method that add event handler to 'add' and 'remove'
6291 11 Jun 13 nicklas 333     buttons as well as the link container itself.
6291 11 Jun 13 nicklas 334   */
6291 11 Jun 13 nicklas 335   internal.addLinkHandlers = function(element, autoInit)
6291 11 Jun 13 nicklas 336   {
6291 11 Jun 13 nicklas 337     if (autoInit == 'add-link')
6291 11 Jun 13 nicklas 338     {
6291 11 Jun 13 nicklas 339       Buttons.addClickHandler(element, Link.addOnClick);
6291 11 Jun 13 nicklas 340     }
6291 11 Jun 13 nicklas 341     else if (autoInit == 'remove-link')
6291 11 Jun 13 nicklas 342     {
6291 11 Jun 13 nicklas 343       Buttons.addClickHandler(element, link.removeOnClick);
6291 11 Jun 13 nicklas 344     }
6291 11 Jun 13 nicklas 345     else if (autoInit == 'link-container')
6291 11 Jun 13 nicklas 346     {
6291 11 Jun 13 nicklas 347       internal.initializeLinkContainer(element);
6291 11 Jun 13 nicklas 348       Events.addEventHandler(element, 'base-selected', link.onSelected);
6291 11 Jun 13 nicklas 349       Events.addEventHandler(element, 'dblclick', link.removeOnClick);
6291 11 Jun 13 nicklas 350     }
6291 11 Jun 13 nicklas 351   }
6291 11 Jun 13 nicklas 352   
6291 11 Jun 13 nicklas 353   /**
6291 11 Jun 13 nicklas 354     Initialize the link container by reading data from
6291 11 Jun 13 nicklas 355     the 'data-initial-items' attribute. This should be
6291 11 Jun 13 nicklas 356     an array with 'section' objects, each one defining the
6291 11 Jun 13 nicklas 357     properties: 'itemType', 'name' (optional), 'items' (=array
6291 11 Jun 13 nicklas 358     of initial items; optional)
6291 11 Jun 13 nicklas 359    */
6291 11 Jun 13 nicklas 360   internal.initializeLinkContainer = function(list)
6291 11 Jun 13 nicklas 361   {
6291 11 Jun 13 nicklas 362     list.knownItems = [];
6291 11 Jun 13 nicklas 363     list.itemsById = [];
6291 11 Jun 13 nicklas 364     
6291 11 Jun 13 nicklas 365     var sections = Data.json(list, 'initial-items');
6291 11 Jun 13 nicklas 366     if (!sections) return;
6291 11 Jun 13 nicklas 367     
6291 11 Jun 13 nicklas 368     var initialAction = Data.int(list, 'initial-action', Link.EXISTING);
6291 11 Jun 13 nicklas 369     for (var s = 0; s < sections.length; s++)
6291 11 Jun 13 nicklas 370     {
6291 11 Jun 13 nicklas 371       var section = sections[s];
6291 11 Jun 13 nicklas 372       link.addSection(list, section, section.items, initialAction);
6291 11 Jun 13 nicklas 373     }
6291 11 Jun 13 nicklas 374   }
6291 11 Jun 13 nicklas 375   
6291 11 Jun 13 nicklas 376   
6291 11 Jun 13 nicklas 377   Doc.addElementInitializer(internal.addLinkHandlers);
6291 11 Jun 13 nicklas 378
6291 11 Jun 13 nicklas 379   return link;
6291 11 Jun 13 nicklas 380 }();