1 /* See license.txt for terms of usage */
  2 
  3 define([
  4 ],
  5 function() {
  6 
  7 // ********************************************************************************************* //
  8 // Constants
  9 
 10 const ident = {
 11     frame: 0,
 12     boxModel: 1,
 13     imageMap: 2,
 14     proxyElt: 3
 15 };
 16 
 17 // ********************************************************************************************* //
 18 // Implementation
 19 
 20 var HighlighterCache =
 21 {
 22     ident: ident,
 23 
 24     highlighters: {
 25         frameArr: [],
 26         boxModelArr: [],
 27         proxyEltArr: []
 28     },
 29 
 30     get: function(type)
 31     {
 32         var node;
 33         var hl = this.highlighters;
 34 
 35         switch (type)
 36         {
 37             case ident.boxModel:
 38                 if (hl.boxModelArr.length === 1)
 39                 {
 40                     node = hl.boxModelArr[0];
 41                     if (!node.parentElement)
 42                         return node;
 43                 }
 44             break;
 45             case ident.frame:
 46                 if (hl.frameArr.length === 1)
 47                 {
 48                     node = hl.frameArr[0];
 49                     if (!node.parentElement)
 50                         return node;
 51                 }
 52             break;
 53             case ident.proxyElt:
 54                 if (hl.proxyEltArr.length === 1)
 55                 {
 56                     node = hl.proxyEltArr[0];
 57                     if (!node.parentElement)
 58                         return node;
 59                 }
 60             break;
 61         }
 62     },
 63 
 64     add: function(node)
 65     {
 66         switch (node.ident)
 67         {
 68             case ident.boxModel:
 69                 this.highlighters.boxModelArr.push(node);
 70             break;
 71             case ident.frame:
 72                 this.highlighters.frameArr.push(node);
 73             break;
 74             case ident.proxyElt:
 75                 this.highlighters.proxyEltArr.push(node);
 76             break;
 77         }
 78     },
 79 
 80     clear: function()
 81     {
 82         clearBoxModelCache(this.highlighters.boxModelArr);
 83 
 84         clearCache(this.highlighters.frameArr);
 85         clearCache(this.highlighters.proxyEltArr);
 86 
 87         this.highlighters.boxModelArr = [];
 88         this.highlighters.frameArr = [];
 89         this.highlighters.proxyEltArr = [];
 90     }
 91 };
 92 
 93 // ********************************************************************************************* //
 94 // Helpers
 95 
 96 function clearCache(arr)
 97 {
 98     try
 99     {
100         var i, highlighter;
101         for (i = arr.length - 1; i >= 0; i--)
102         {
103             highlighter = arr[i];
104 
105             if (highlighter && highlighter.parentNode)
106                 highlighter.parentNode.removeChild(highlighter);
107         }
108     }
109     catch (err)
110     {
111         FBTrace.sysout("highlighterCache.clearCache; EXCEPTION " + err, err);
112     }
113 }
114 
115 function clearBoxModelCache(arr)
116 {
117     try
118     {
119         var node;
120         for (var i = arr.length - 1; i >= 0; i--)
121         {
122             var names = ["lines", "offset", "parent"];
123             for (var j=0; j<names.length; j++)
124             {
125                 var name = names[j];
126                 if (name === "lines")
127                 {
128                     var lineNames = ["bottom", "left", "top", "right"];
129                     for (var k=0; k<lineNames.length; k++)
130                     {
131                         var lineName = lineNames[k];
132                         node = arr[i].lines[lineName];
133 
134                         if (node && node.parentNode)
135                             node.parentNode.removeChild(node);
136                     }
137                 }
138                 else
139                 {
140                     node = arr[i][name];
141                     if (node && node.parentNode)
142                         node.parentNode.removeChild(node);
143                 }
144             }
145         }
146     }
147     catch (err)
148     {
149         FBTrace.sysout("clearBoxModelCache.clearCache; EXCEPTION " + err, err);
150     }
151 }
152 
153 // ********************************************************************************************* //
154 // Registration
155 
156 return HighlighterCache;
157 
158 // ********************************************************************************************* //
159 });
160