--- /dev/null
+/* ***** BEGIN LICENSE BLOCK *****\r
+ * Copyright (c) 2008-2009 EADS DEFENCE AND SECURITY - All rights reserved.\r
+ * ximfmail is under the triple license MPL 1.1/GPL 2.0/LGPL 2.1.\r
+ *\r
+ *\r
+ * Redistribution and use, in source and binary forms, with or without modification,\r
+ * are permitted provided that the following conditons are met :\r
+ *\r
+ * 1. Redistributions of source code must retain the above copyright notice,\r
+ * 2. MPL 1.1/GPL 2.0/LGPL 2.1. license agreements must be attached\r
+ * in the redistribution of the source code.\r
+ * 3. Neither the names of the copyright holders nor the names of any contributors\r
+ * may be used to endorse or promote products derived from this software without specific\r
+ * prior written permission from EADS Defence and Security.\r
+ *\r
+ * Alternatively, the contents of this file may be used under the terms of\r
+ * either of the GNU General Public License Version 2 or later (the "GPL"),\r
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),\r
+ * in which case the provisions of the GPL or the LGPL are applicable instead\r
+ * of those above. If you wish to allow use of your version of this file only\r
+ * under the terms of either the GPL or the LGPL, and not to allow others to\r
+ * use your version of this file under the terms of the MPL, indicate your\r
+ * decision by deleting the provisions above and replace them with the notice\r
+ * and other provisions required by the GPL or the LGPL. If you do not delete\r
+ * the provisions above, a recipient may use your version of this file under\r
+ * the terms of any one of the MPL, the GPL or the LGPL.\r
+ *\r
+ * REMINDER :\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\r
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+ * EADS Defence and Security - 1 Boulevard Jean Moulin -\r
+ * ZAC de la Clef Saint Pierre - 78990 Elancourt - FRANCE (IDDN.FR.001.480012.002.S.P.2008.000.10000)\r
+ *\r
+ * Contributor(s):\r
+ * Copyright(c) Airbus Defence and Space 2014 - All rights reserved\r
+ * ***** END LICENSE BLOCK ***** */\r
+/**\r
+ * threaTree-ximfmail.js\r
+ * Add custom columns into message view folder with XIMF headers defined in rules of XIMF instance activated in user profile.\r
+ */\r
+var gConsole = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);\r
+var XimfThreadTreeDBViewObserver = {\r
+ // Components.interfaces.nsIObserver\r
+ observe: function(aMsgFolder, aTopic, aData){\r
+ gConsole.logStringMessage("ximfmail - XimfThreadTreeDBViewObserver:observe");\r
+ XimfThreadTree.getInstance().create();\r
+ }\r
+};\r
+/*\r
+ * Column handler template definition\r
+ */\r
+function XimfCustomColumnHandler(property){\r
+ // Properties\r
+ this.property = property;\r
+ this.isString = true;\r
+ // Functions\r
+ this.getSortStringForRow = function (hdr){\r
+ return (this.isString) ? hdr.getStringProperty(this.property) : "";\r
+ };\r
+ this.isString = function (){\r
+ return this.isString;\r
+ };\r
+ this.getCellProperties = function (row, col, props) {};\r
+ this.getRowProperties = function(row, props){};\r
+ this.getImageSrc = function (row, col){\r
+ return null;\r
+ };\r
+ this.getSortLongForRow = function(hdr) {\r
+ return (this.isString) ? 0 : new Number(hdr.getStringProperty(this.property)).value;\r
+ };\r
+ this.getCellText = function (row, col){\r
+ // get cell informations\r
+ var key = gDBView.getKeyAt(row);\r
+ var hdr = gDBView.db.GetMsgHdrForKey(key);\r
+ var value = hdr.getStringProperty(this.property);\r
+ // get ilk value if exists\r
+ var ilklabel = "";\r
+ if (value) {\r
+ try {\r
+ ilklabel = XimfThreadTree.getInstance().getIlkColumnArray()[this.property.toLowerCase()][value.toLowerCase()];\r
+ } catch(e) {\r
+ ilklabel = value;\r
+ }\r
+ if (ilklabel === undefined) {\r
+ ilklabel = value;\r
+ }\r
+ }\r
+ return ilklabel;\r
+ };\r
+};\r
+/*\r
+ * XimfThreadTree\r
+ * Custom Columns with XIMF headers\r
+ * Get XIMF headers in xml containers <ihm> of Ximfmail instances :\r
+ * <ximf:treeRcv>\r
+ * <ximf:headerRef>header-reference</ximf:headerRef>\r
+ * <ximf:headerRef>header-reference-other</ximf:headerRef>\r
+ * </ximf:treeRcv>\r
+ */\r
+var XimfThreadTree = (function(){\r
+ // private:\r
+ var instantiated;\r
+ var _chromeXslTreeRcv = "chrome://theme_ximfmail/content/threadTree-ximfmail.xsl";\r
+ var _ximfHdrArrayByID = [];\r
+ var _refAccountArray = [];\r
+ var _ximfIlilkCustomColumnArray = [];\r
+ // add DOM element to tree\r
+ function addColumn(domTreecol,idTreecol){\r
+ // istancedom_treecol is mofified by append jquery function is called\r
+ $("#threadCols").append(domTreecol);\r
+ var splitter_dom = document.createElement("splitter");\r
+ $(splitter_dom).attr("reftreecol",idTreecol);\r
+ $(splitter_dom).attr("class","tree-splitter");\r
+ $(splitter_dom).attr("ximfheadtree","1");\r
+ $("#threadCols").append(splitter_dom);\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:addColumn] add new ximf column to Dom - id = " + idTreecol);\r
+ };\r
+ // attach handler object to custom column. addColumnHandler that takes a column ID\r
+ function addColumnHandler(idTreecol){\r
+ if (gDBView){\r
+ gDBView.addColumnHandler(idTreecol, new XimfCustomColumnHandler(idTreecol.toLowerCase()));\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:addColumnHandler] load new XimfCustomColumnHandler for column " + idTreecol);\r
+ }\r
+ };\r
+ // remove DOM element from tree\r
+ function deleteColummn(idTreeCol){\r
+ for(var i = 0 ; i < _ximfHdrArrayByID.length ; ++i){\r
+ if(_ximfHdrArrayByID[i] === idTreeCol){\r
+ _ximfHdrArrayByID.splice(i,1);\r
+ $("#"+idTreeCol).remove();\r
+ $("splitter[reftreecol='"+idTreeCol+"']").remove();\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:deleteColummn] remove ximf column from Dom - id = " + idTreeCol);\r
+ }\r
+ }\r
+ };\r
+ // update Ximfmail column\r
+ function updateXimfHdrArrayByID(idToUpdate){\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:updateXimfHdrArrayByID] update Ximfmail column " + idToUpdate);\r
+ var isIdExist = false;\r
+ for(var i = 0 ; i < _ximfHdrArrayByID.length ; ++i){\r
+ if(_ximfHdrArrayByID[i] === idToUpdate){\r
+ isIdExist = true;\r
+ break;\r
+ }\r
+ }\r
+ if(!isIdExist){\r
+ _ximfHdrArrayByID.push(idToUpdate);\r
+ }\r
+ }\r
+ // set Ximf headers to display to Thunderbird to check for x-headers\r
+ function addCustomPreferences(preference){\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:updateColumnToHide] Set Ximf headers to display to Thunderbird pref : " + preference);\r
+ var xListHdr = "";\r
+ var prefList = [];\r
+ var prefBranch = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch(null);\r
+ try {\r
+ xListHdr = prefBranch.getCharPref(preference);\r
+ if((xListHdr) !== ""){\r
+ var reg=new RegExp("[ ]+", "g");\r
+ prefList=xListHdr.split(reg);\r
+ }\r
+ } catch(ex) {}\r
+ function isDataInArray(data,array){\r
+ for(var i=0; i<array.length; ++i){\r
+ if(data === array[i]){\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ };\r
+ // add only new headers\r
+ for (var i = 0; i < _ximfHdrArrayByID.length; i++) {\r
+ if (!isDataInArray(_ximfHdrArrayByID[i].toLowerCase(),prefList)){\r
+ if (xListHdr !== "") {\r
+ xListHdr += " ";\r
+ }\r
+ xListHdr += _ximfHdrArrayByID[i].toLowerCase();\r
+ }\r
+ }\r
+ prefBranch.setCharPref(preference, xListHdr);\r
+ };\r
+ // obsolete?\r
+ function updateColumnToHide(){\r
+ try{\r
+ if(_ximfHdrArrayByID.length <= 0 ) {\r
+ return;\r
+ }\r
+ if(gCurrentIdentity){\r
+ var prefList = gCurrentIdentity.getCharAttribute("ximfmail_context_DBHeaders");\r
+ if (prefList === undefined) {\r
+ return;\r
+ }\r
+ for(var i=0; i<_ximfHdrArrayByID.length; ++i){\r
+ if(prefList.lastIndexOf(_ximfHdrArrayByID[i]) !== -1){\r
+ $("treecol[id='"+_ximfHdrArrayByID[i]+"']").attr("hidden","true");\r
+ }\r
+ }\r
+ }\r
+ }catch(e){\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:updateColumnToHide ] " + e +"\nline : " + Error().lineNumber + " : "+ e + "\nfile : "+ Error().fileName);\r
+ }\r
+ };\r
+ // get ilk values from instance\r
+ function updateXimfIlkCustomColumnArray(currentInstance) {\r
+ try{\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:updateXimfIlkCustomColumnArray ] create ilk array for Ximf values of instance : "+currentInstance);\r
+ // get xml schema for instance\r
+ XimfCatalogFactory.getIntance(function(instance){\r
+ var dir = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);\r
+ var completePath = getFilePathInProfile("extensions/"+instance.getSchemaInstance(currentInstance));\r
+ dir.initWithPath( completePath );\r
+ if(!dir.exists()){\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:updateXimfIlkCustomColumnArray] Error on loading schema file : " + completePath);\r
+ return;\r
+ }\r
+ var objXML = GetXmlDocument(completePath);\r
+ var headers = objXML.getElementsByTagName("ximf:header");\r
+ // get xml dictionary parser\r
+ var urlDictionary = getFilePathInProfile("extensions/"+instance.getDictionaryInstance(currentInstance));\r
+ dir.initWithPath( urlDictionary );\r
+ if(!dir.exists()){\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:updateXimfIlkCustomColumnArray] Error on loading dictionary file : " + completePath);\r
+ return;\r
+ }\r
+ var dicoXML = GetXmlDocument(urlDictionary);\r
+ var dicoElements = dicoXML.getElementsByTagName("ximf:locale");\r
+ // get local lang\r
+ var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);\r
+ var refLang = prefs.getCharPref("general.useragent.locale");\r
+ if (!refLang) {\r
+ refLang = "fr";\r
+ }\r
+ var ilkEntities = null;\r
+ for(var idxLang=0 ; idxLang < dicoElements.length ; ++idxLang){\r
+ if(dicoElements[idxLang].getAttribute("lang") === refLang){\r
+ ilkEntities = dicoElements[idxLang].getElementsByTagName("ximf:ilk");\r
+ break;\r
+ }\r
+ }\r
+ // parse XML and get ilk values\r
+ for(var i=0 ; i < _ximfHdrArrayByID.length ; ++i){\r
+ var currentTreeColId = _ximfHdrArrayByID[i];\r
+ for(var idxH = 0 ; idxH < headers.length; ++idxH){\r
+ var attrHeaderList = headers[idxH].attributes;\r
+ var headerName = headers[idxH].getAttribute("headerName");\r
+ if(headerName.toLowerCase() === currentTreeColId.toLowerCase()){\r
+ var stringListElt = headers[idxH].getElementsByTagName("ximf:string");\r
+ var tmparray = new Array();\r
+ for(var j=0 ; j< stringListElt.length ; j++){\r
+ try{\r
+ // get values from instance headers\r
+ var sContent = stringListElt[j].getAttribute("content");\r
+ var sIlk = stringListElt[j].getAttribute("ilk");\r
+ // get ilk entity from instance dictionay\r
+ if(ilkEntities){\r
+ for(var idxIlk = 0 ; idxIlk < ilkEntities.length ; ++idxIlk){\r
+ if(ilkEntities[idxIlk].getAttribute("entity") === sIlk){\r
+ sIlk = ilkEntities[idxIlk].textContent;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ // push array\r
+ tmparray[sContent.toLowerCase()]=sIlk;\r
+ } catch(e){\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:updateXimfIlkCustomColumnArray ] " + e +"\nline : " + e.lineNumber + " : "+ e + "\nfile : "+ Error().fileName);\r
+ }\r
+ }\r
+ // save ilk values for an ximf header\r
+ if (tmparray) {\r
+ _ximfIlilkCustomColumnArray[headerName.toLowerCase()] = tmparray;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ });\r
+ return;\r
+ var dir = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);\r
+ var completePath = getFilePathInProfile("extensions/"+gXimfCatalog.getSchemaInstance(currentInstance));\r
+ dir.initWithPath( completePath );\r
+ if (!dir.exists()) {\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:updateXimfIlkCustomColumnArray] Error on loading schema file : " + completePath);\r
+ return;\r
+ }\r
+ var objXML = GetXmlDocument(completePath);\r
+ var headers = objXML.getElementsByTagName("ximf:header");\r
+ // get xml dictionary parser\r
+ var urlDictionary = getFilePathInProfile("extensions/"+gXimfCatalog.getDictionaryInstance(currentInstance));\r
+ dir.initWithPath( urlDictionary );\r
+ if(!dir.exists()){\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:updateXimfIlkCustomColumnArray] Error on loading dictionary file : " + completePath);\r
+ return;\r
+ }\r
+ var dicoXML = GetXmlDocument(urlDictionary);\r
+ var dicoElements = dicoXML.getElementsByTagName("ximf:locale");\r
+ // get local lang\r
+ var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);\r
+ var refLang = prefs.getCharPref("general.useragent.locale");\r
+ if (!refLang) {\r
+ refLang = "fr";\r
+ }\r
+ var ilkEntities = null;\r
+ for(var idxLang=0 ; idxLang < dicoElements.length ; ++idxLang){\r
+ if(dicoElements[idxLang].getAttribute("lang") === refLang){\r
+ ilkEntities = dicoElements[idxLang].getElementsByTagName("ximf:ilk");\r
+ break;\r
+ }\r
+ }\r
+ // parse XML and get ilk values\r
+ for(var i=0 ; i < _ximfHdrArrayByID.length ; ++i){\r
+ var currentTreeColId = _ximfHdrArrayByID[i];\r
+ for(var idxH = 0 ; idxH < headers.length; ++idxH){\r
+ var attrHeaderList = headers[idxH].attributes;\r
+ var headerName = headers[idxH].getAttribute("headerName");\r
+ if(headerName.toLowerCase() === currentTreeColId.toLowerCase()){\r
+ var stringListElt = headers[idxH].getElementsByTagName("ximf:string");\r
+ var tmparray = new Array();\r
+ for(var j=0 ; j< stringListElt.length ; j++){\r
+ try{\r
+ // get values from instance headers\r
+ var sContent = stringListElt[j].getAttribute("content");\r
+ var sIlk = stringListElt[j].getAttribute("ilk");\r
+ // get ilk entity from instance dictionay\r
+ if(ilkEntities){\r
+ for(var idxIlk = 0 ; idxIlk < ilkEntities.length ; ++idxIlk){\r
+ if(ilkEntities[idxIlk].getAttribute("entity") === sIlk){\r
+ sIlk = ilkEntities[idxIlk].textContent;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ // push array\r
+ tmparray[sContent.toLowerCase()]=sIlk;\r
+ }catch(e){\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:updateXimfIlkCustomColumnArray ] " + e +"\nline : " + e.lineNumber + " : "+ e + "\nfile : "+ Error().fileName);\r
+ }\r
+ }\r
+ // save ilk values for an ximf header\r
+ if (tmparray) {\r
+ _ximfIlilkCustomColumnArray[headerName.toLowerCase()] = tmparray;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }catch(e){\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:updateXimfIlkCustomColumnArray] " + e +"\nline : " + e.lineNumber + " : "+ e + "\nfile : "+ Error().fileName);\r
+ }\r
+ };\r
+ function init(){\r
+ // singleton here\r
+ return{\r
+ // create : create Ximf columns if don't exist and/or add handler on Ximf columns\r
+ // return true if success / false if failed\r
+ create : function(){\r
+ try{\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:create ] create begin - _ximfHdrArrayByID len : "+_ximfHdrArrayByID.length);\r
+ GetCurrentXimfUser();\r
+ if (!gCurrentIdentity){\r
+ return false;\r
+ }\r
+ var refIdentityKey = gCurrentIdentity.key;\r
+ // get existing Ximf columns\r
+ var currentlistID = $("#threadCols treecol[ximfheadtree='1']");\r
+ // check if Ximf columns of account already created\r
+ for(var i = 0 ; i < _refAccountArray.length ; ++i){\r
+ if(_refAccountArray[i] === refIdentityKey){\r
+ // account already updated for this session, don't do it again,\r
+ // handler Ximfmail columns headers must be fired\r
+ for(var idx =0 ; idx < currentlistID.length ; ++idx){\r
+ addColumnHandler(currentlistID[idx].id);\r
+ }\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:create ] account already updated for this session - handler Ximfmail columns");\r
+ return true;\r
+ }\r
+ }\r
+ _refAccountArray.push(refIdentityKey);\r
+ // get Ximfmail instance with headers to custom\r
+ var currentInstance = gCurrentIdentity.getCharAttribute("ximfmail_instance_treethread_ref");\r
+ var instancedom = CreateDOMWithXimfInstance(currentInstance,_chromeXslTreeRcv);\r
+ var istancedom_treecol = instancedom.childNodes;\r
+ // add new headers to tree\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:create ] " + istancedom_treecol.length + " elements in Ximfmail instance to custom");\r
+ for(var k = istancedom_treecol.length - 1 ; k >= 0 ; --k){\r
+ try{\r
+ var instanceId = $(istancedom_treecol[k]).attr("id");\r
+ var isCurrentIdInInstance = false;\r
+ for(var l = 0 ; l < currentlistID.length ; ++l){\r
+ if( instanceId === $(currentlistID[l]).attr("id")){\r
+ isCurrentIdInInstance = true;\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:create ] instance " + instanceId + " exists");\r
+ break;\r
+ }\r
+ }\r
+ if(!isCurrentIdInInstance){\r
+ updateXimfHdrArrayByID(instanceId);\r
+ // add DOM element to tree\r
+ addColumn(istancedom_treecol[k],instanceId);\r
+ // load handler\r
+ addColumnHandler(instanceId);\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:create ] instance " + instanceId + " created");\r
+ //updateColumnToHide(); ???\r
+ }\r
+ }catch(e){\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:create ] compute error - id = " + k + " : " + e);\r
+ }\r
+ }\r
+ // used by Thunderbird to check for x-headers\r
+ addCustomPreferences('mailnews.customDBHeaders');\r
+ // load ilk array for Ximf values of tree cells\r
+ updateXimfIlkCustomColumnArray(currentInstance);\r
+ // trace ilk array\r
+ var string = "";\r
+ for(xh in _ximfIlilkCustomColumnArray){\r
+ for(ilk in _ximfIlilkCustomColumnArray[xh]){\r
+ string += "["+ xh +"]["+ ilk +"]["+ _ximfIlilkCustomColumnArray[xh][ilk] + "]\n";\r
+ }\r
+ }\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:create ] array of ilk of ximf value" + string);\r
+ return true;\r
+ }catch(e){\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:create] " + e +"\nline : " + e.lineNumber + " : "+ e + "\nfile : "+ Error().fileName);\r
+ return false;\r
+ }\r
+ },\r
+ // delete all custom columns of XIMF headers\r
+ deleteXimfColummns : function(){\r
+ $("treecol[ximfheadtree='1']").remove();\r
+ $("splitter[ximfheadtree='1']").remove();\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:deleteXimfColummns ] delete all custom columns of XIMF headers");\r
+ },\r
+ // attach customColumnHandler for all columns of XIMF headers\r
+ addCustomColumnHandler : function(){\r
+ var currentlistID = $("#threadCols treecol[ximfheadtree='1']");\r
+ for(var i =0 ; i < currentlistID.length ; ++i){\r
+ addColumnHandler();\r
+ }\r
+ gConsole.logStringMessage("[ximfmail - XimfThreadTree:addCustomColumnHandler ] attach customColumnHandler for all columns of XIMF headers");\r
+ },\r
+ // get ilk array for Ximf values of tree cells\r
+ getIlkColumnArray : function(){\r
+ return _ximfIlilkCustomColumnArray;\r
+ },\r
+ //obsolete?\r
+ saveColumnToHide : function(){\r
+ var listID = $("#threadCols treecol[ximfheadtree='1']");\r
+ try{\r
+ if(gCurrentIdentity){\r
+ prefList = "";\r
+ for(var i=0; i<listID.length; ++i){\r
+ if(listID[i].getAttribute("hidden") === "true"){\r
+ if(prefList !== "") {\r
+ prefList +=",";\r
+ }\r
+ prefList += listID[i].id;\r
+ }\r
+ }\r
+ gCurrentIdentity.setCharAttribute("ximfmail_context_DBHeaders",prefList);\r
+ }\r
+ }catch(e){\r
+ gConsole.logStringMessage("[ximfmail - saveColumnToHide ] " + e +"\nline : " + Error().lineNumber + " : "+ e + "\nfile : "+ Error().fileName);\r
+ }\r
+ }\r
+ };\r
+ }\r
+ return{\r
+ getInstance : function(){\r
+ if(!instantiated){\r
+ instantiated = init();\r
+ }\r
+ return instantiated;\r
+ }\r
+ };\r
+})();
\ No newline at end of file