home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 December / PCWorld_2005-12_cd.bin / komunikace / netscape / nsb-install-8-0.exe / chrome / toolkit.jar / content / global / nsWidgetStateManager.js < prev    next >
Text File  |  2005-09-26  |  11KB  |  362 lines

  1.  
  2. var wsm;
  3.  
  4. // For panels displayed inside the main dialog, this value will be the child iframe
  5. // window. For panels displayed in sub-dialogs, those launched by panels of the main
  6. // dialog, this will be the sub dialog window. 
  7. var gCurrentWindow = null;
  8.  
  9. function nsWidgetStateManager (aFrameID)
  10. {
  11.  
  12.   this.dataManager = {
  13.     /** Persisted Data Hash Table
  14.      *  Page_ID -> Element_ID -> Property -> Value
  15.      **/
  16.     pageData: { },
  17.  
  18.     setPageData: function (aPageTag, aDataObject)
  19.     {
  20.       this.pageData[aPageTag] = aDataObject;
  21.     },
  22.  
  23.     getPageData: function (aPageTag)
  24.     {
  25.       if (!(aPageTag in this.pageData))
  26.         this.pageData[aPageTag] = { };
  27.  
  28.       if (!('elementIDs' in this.pageData[aPageTag]))
  29.         this.pageData[aPageTag].elementIDs = new Object();
  30.  
  31.       if (!('userData' in this.pageData[aPageTag]))
  32.         this.pageData[aPageTag].userData = new Object();
  33.  
  34.       return this.pageData[aPageTag];
  35.     },
  36.  
  37.     setItemData: function (aPageTag, aItemID, aDataObject)
  38.     {
  39.       if (!(aPageTag in this.pageData))
  40.         this.pageData[aPageTag] = new Object();
  41.       
  42.       this.pageData[aPageTag].elementIDs[aItemID] = aDataObject;
  43.     },
  44.  
  45.     getItemData: function (aPageTag, aItemID)
  46.     {
  47.       if (!(aItemID in this.pageData[aPageTag].elementIDs))
  48.         this.pageData[aPageTag].elementIDs[aItemID] = new Object();
  49.       return this.pageData[aPageTag].elementIDs[aItemID];
  50.     }
  51.   }
  52.  
  53.   this.contentID    = aFrameID;
  54.  
  55.   wsm               = this;
  56.  
  57.   /** Element Handlers
  58.    *  Provides default get and set handler functions for supported
  59.    *  widgets. Clients can override or add new widgets.
  60.    **/
  61.   this.handlers     = {
  62.     menulist:
  63.       {  get: wsm.get_Menulist,    set: wsm.set_Menulist      },
  64.     radiogroup:
  65.       {  get: wsm.get_Radiogroup,  set: wsm.set_Radiogroup    },
  66.     checkbox:
  67.       {  get: wsm.get_Checkbox,    set: wsm.set_Checkbox      },
  68.     textbox:
  69.       {  get: wsm.get_Textbox,     set: wsm.set_Textbox       },
  70.     listitem:
  71.       {  get: wsm.get_Listitem,    set: wsm.set_Listitem      },
  72.     data:
  73.       {  get: wsm.get_Data,        set: wsm.set_Data          },
  74.     default_handler:
  75.       {  get: wsm.get_Default,     set: wsm.set_Default       }
  76.   }
  77.  
  78.   // extra attributes to scan and save.
  79.   this.attributes   = [];
  80. }
  81.  
  82. nsWidgetStateManager.prototype =
  83. {
  84.   get contentArea ()
  85.   {
  86.     return window.frames[this.contentID];
  87.   },
  88.  
  89.   savePageData: function (aPageTag, aWindow)
  90.   {
  91.     gCurrentWindow = aWindow || this.contentArea;
  92.       
  93.     if (!(aPageTag in this.dataManager.pageData))
  94.       return;
  95.  
  96.     if ("GetFields" in gCurrentWindow) {
  97.       // save page data based on user supplied function in content area
  98.       var dataObject = gCurrentWindow.GetFields();
  99.       if (dataObject)        
  100.         this.dataManager.pageData[aPageTag].userData = dataObject;
  101.     }
  102.  
  103.     // Automatic element retrieval. This is done in two ways.
  104.     // 1) if an element id array is present in the document, this is
  105.     //    used to build a list of elements to persist. <-- performant
  106.     // 2) otherwise, all elements with "wsm_persist" set to true
  107.     //    are persisted <-- non-performant.
  108.     var elements;
  109.     if ("_elementIDs" in gCurrentWindow) {
  110.       elements = [];
  111.  
  112.       // MERC: since the Anonymous Mode checkbox sits outside of the prefs frame,
  113.       // it does not get added to the list of prefs to save to file.
  114.       // So we have to do it manually.  Make sure we only add on the
  115.       // privacy page (i.e. a page that contains kiosk checkbox).
  116.       var pageData = this.dataManager.getPageData(aPageTag);
  117.       for (var oneElemID in pageData.elementIDs) {
  118.         if (oneElemID == "toggleAnonMode") {
  119.           gCurrentWindow._elementIDs[gCurrentWindow._elementIDs.length] = "toggleAnonMode";
  120.           break;
  121.         }
  122.       }
  123.       // MERC
  124.  
  125.       for (var i = 0; i < gCurrentWindow._elementIDs.length; i++) {
  126.         var elt = gCurrentWindow.document.getElementById(gCurrentWindow._elementIDs[i]);
  127.         if (elt)
  128.           elements[elements.length] = elt;
  129.         else {
  130.           // see bug #40329. People forget this too often, and it breaks Prefs
  131.           dump("*** FIX ME: '_elementIDs' in '" + gCurrentWindow.location.href.split('/').pop() +
  132.                "' contains a reference to a non-existent element ID '" +
  133.           gCurrentWindow._elementIDs[i] + "'.\n");
  134.         }
  135.       }
  136.     }
  137.     else 
  138.       elements = gCurrentWindow.document.getElementsByAttribute("wsm_persist", "true");
  139.  
  140.     for (var ii = 0; ii < elements.length; ii++) {
  141.       var elementID   = elements[ii].id;
  142.       var elementType = elements[ii].localName;
  143.  
  144.       // persist attributes
  145.       var get_Func = (elementType in this.handlers) ?
  146.       this.handlers[elementType].get :
  147.       this.handlers.default_handler.get;
  148.       this.dataManager.setItemData(aPageTag, elementID, get_Func(elementID));
  149.     }
  150.   },
  151.  
  152.   setPageData: function (aPageTag, aWindow)
  153.   {
  154.     gCurrentWindow = aWindow || this.contentArea;
  155.  
  156.     var pageData = this.dataManager.getPageData(aPageTag);
  157.     if ("SetFields" in gCurrentWindow)
  158.       gCurrentWindow.SetFields(pageData.userData)
  159.  
  160.     if (!('elementIDs' in pageData))
  161.       return;
  162.  
  163.     for (var elementID in pageData.elementIDs) {
  164.       var element = gCurrentWindow.document.getElementById(elementID);
  165.       if (element) {
  166.         var elementType = element.localName;
  167.         var set_Func = (elementType in this.handlers) ?
  168.           this.handlers[elementType].set :
  169.           this.handlers.default_handler.set;
  170.         set_Func(elementID, pageData.elementIDs[elementID]);
  171.       }
  172.     }
  173.   },
  174.  
  175.  
  176.   /** Widget Get/Set Function Implementations
  177.    *  These can be overridden by the client.
  178.    **/
  179.   generic_Set: function (aElement, aDataObject)
  180.   {
  181.     if (aElement) {
  182.       for (var property in aDataObject) {
  183.         if (property == "localname")
  184.           continue;
  185.         if (!aDataObject[property] && typeof aDataObject[property] == "boolean")
  186.           aElement.removeAttribute(property);
  187.         else
  188.           aElement.setAttribute(property, aDataObject[property]);
  189.       }
  190.       
  191.       if (!aElement.getAttribute("disabled","true"))
  192.         aElement.removeAttribute("disabled");
  193.     }
  194.   },
  195.  
  196.   generic_Get: function (aElement)
  197.   {
  198.     if (aElement) {
  199.       var dataObject = new Object();
  200.       var wsmAttributes = aElement.getAttribute("wsm_attributes");
  201.       var attributes = wsm.attributes;              // make a copy
  202.       if (wsmAttributes != "")
  203.         attributes.push(wsmAttributes.split(" "));  // modify the copy
  204.  
  205.       for (var i = 0; i < attributes.length; i++)
  206.         dataObject[attributes[i]] = aElement.getAttribute(attributes[i]);
  207.  
  208.       dataObject.localname = aElement.localName;
  209.       return dataObject;
  210.     }
  211.     return null;
  212.   },
  213.  
  214.   // <menulist>
  215.   set_Menulist: function (aElementID, aDataObject)
  216.   {
  217.     var element = gCurrentWindow.document.getElementById(aElementID);
  218.     // set all generic properties
  219.     wsm.generic_Set(element, aDataObject);
  220.     // set menulist specific properties
  221.     if ("value" in aDataObject) {
  222.       try {
  223.         element.value = aDataObject.value;
  224.       }
  225.       catch (ex) {
  226.         dump(aElementID + ", ex: " + ex + "\n");
  227.       }
  228.     }
  229.   },
  230.  
  231.   get_Menulist: function (aElementID)
  232.   {
  233.     var element     = gCurrentWindow.document.getElementById(aElementID);
  234.     // retrieve all generic attributes
  235.     var dataObject  = wsm.generic_Get(element);
  236.     // retrieve all menulist specific attributes
  237.     if (dataObject) {
  238.       dataObject.value = element.getAttribute("value");
  239.       return dataObject;
  240.     }
  241.     return null;
  242.   },
  243.  
  244.   // <radiogroup>
  245.   set_Radiogroup: function (aElementID, aDataObject)
  246.   {
  247.     var element = gCurrentWindow.document.getElementById(aElementID);
  248.     wsm.generic_Set(element, aDataObject);
  249.     if ("value" in aDataObject)
  250.       element.selectedItem = element.getElementsByAttribute("value", aDataObject.value)[0];
  251.     if ("disabled" in aDataObject)
  252.       element.disabled = aDataObject.disabled;
  253.   },
  254.  
  255.   get_Radiogroup: function (aElementID)
  256.   {
  257.     var element = gCurrentWindow.document.getElementById(aElementID);
  258.     var dataObject = wsm.generic_Get(element);
  259.     if (dataObject) {
  260.       dataObject.value = element.getAttribute("value");
  261.       return dataObject;
  262.     }
  263.     return null;
  264.   },
  265.  
  266.   // <textbox>
  267.   set_Textbox: function (aElementID, aDataObject)
  268.   {
  269.     var element = gCurrentWindow.document.getElementById(aElementID);
  270.     wsm.generic_Set(element, aDataObject);
  271.   },
  272.  
  273.   get_Textbox: function (aElementID)
  274.   {
  275.     var element = gCurrentWindow.document.getElementById(aElementID);
  276.     var dataObject = wsm.generic_Get(element);
  277.     if (dataObject) {
  278.       dataObject.value = element.value;
  279.       return dataObject;
  280.     }
  281.     return null;
  282.   },
  283.  
  284.   // <checkbox>
  285.   set_Checkbox: function (aElementID, aDataObject)
  286.   {
  287.     var element = gCurrentWindow.document.getElementById(aElementID);
  288.     // Set generic properites. 
  289.     wsm.generic_Set(element, aDataObject);
  290.     // Handle reversed boolean values.
  291.     if ("checked" in aDataObject && element.hasAttribute("reversed"))
  292.       element.checked = !aDataObject.checked; 
  293.   },
  294.  
  295.   get_Checkbox: function (aElementID)
  296.   {
  297.     var element = gCurrentWindow.document.getElementById(aElementID);
  298.     var dataObject = wsm.generic_Get(element);
  299.     if (dataObject) {
  300.       var checked = element.checked;
  301.       dataObject.checked = element.getAttribute("reversed") == "true" ? !checked : checked;
  302.       return dataObject;
  303.     }
  304.     return null;
  305.   },
  306.  
  307.   // <listitem>
  308.   set_Listitem: function (aElementID, aDataObject)
  309.   {
  310.     var element = gCurrentWindow.document.getElementById(aElementID);
  311.     wsm.generic_Set(element, aDataObject);
  312.   },
  313.  
  314.   get_Listitem: function (aElementID)
  315.   {
  316.     var element = gCurrentWindow.document.getElementById(aElementID);
  317.     var dataObject = wsm.generic_Get(element);
  318.     if (dataObject) {
  319.       if (element.getAttribute("type") == "checkbox")
  320.         dataObject.checked = element.checked;
  321.       return dataObject;
  322.     }
  323.     return null;
  324.   },
  325.  
  326.   // <data>
  327.   set_Data: function (aElementID, aDataObject)
  328.   {
  329.     var element = gCurrentWindow.document.getElementById(aElementID);
  330.     wsm.generic_Set(element, aDataObject);
  331.     if ("value" in aDataObject)
  332.       element.setAttribute("value", aDataObject.value);
  333.   },
  334.  
  335.   get_Data: function (aElementID)
  336.   {
  337.     var element = gCurrentWindow.document.getElementById(aElementID);
  338.     var dataObject = wsm.generic_Get(element);
  339.     if (dataObject) {
  340.       dataObject.value = element.getAttribute("value");
  341.       return dataObject;
  342.     }
  343.     return null;
  344.   },
  345.  
  346.   // <default>
  347.   set_Default: function (aElementID, aDataObject)
  348.   {
  349.     var element = gCurrentWindow.document.getElementById(aElementID);
  350.     wsm.generic_Set(element, aDataObject);
  351.   },
  352.  
  353.   get_Default: function (aElementID)
  354.   {
  355.     var element = gCurrentWindow.document.getElementById(aElementID);
  356.     var dataObject = wsm.generic_Get(element);
  357.     return dataObject ? dataObject : null;
  358.   }
  359. }
  360.  
  361.  
  362.