1 | var bitsMarkerRemap = { |
---|
2 | _object : null, |
---|
3 | _resource : null, |
---|
4 | _marker_exp : new RegExp("^"+bitsMarker.id_key+"\\D+\\d+$",""), |
---|
5 | |
---|
6 | get STRING() { return document.getElementById("bitsMarkerRemapString"); }, |
---|
7 | get DataSource() { return bitsObjectMng.DataSource; }, |
---|
8 | get Common() { return bitsObjectMng.Common; }, |
---|
9 | get XPath() { return bitsObjectMng.XPath; }, |
---|
10 | get Database() { return bitsObjectMng.Database; }, |
---|
11 | get gBrowser() { return bitsObjectMng.getBrowser();}, |
---|
12 | |
---|
13 | get SIDEBAR() { return window.top.document.getElementById("sidebar"); }, |
---|
14 | get CONTENT() { return window.top.document.getElementById("content"); }, |
---|
15 | |
---|
16 | get SIDEBAR_DOC() {try{return this.SIDEBAR.contentDocument;}catch(e){return undefined;}}, |
---|
17 | get SIDEBAR_WIN() {try{return this.SIDEBAR.contentWindow;}catch(e){return undefined;}}, |
---|
18 | get mcTreeHandler() {try{return this.SIDEBAR_WIN.mcTreeHandler;}catch(e){return undefined;}}, |
---|
19 | get mcMainService() {try{return this.SIDEBAR_WIN.mcMainService;}catch(e){return undefined;}}, |
---|
20 | get mcController() {try{return this.SIDEBAR_WIN.mcController;}catch(e){return undefined;}}, |
---|
21 | get mcPropertyView() {try{return this.SIDEBAR_WIN.mcPropertyView;}catch(e){return undefined;}}, |
---|
22 | get mcTreeViewModeService() {try{return this.SIDEBAR_WIN.mcTreeViewModeService;}catch(e){return undefined;}}, |
---|
23 | get bitsItemView() {try{return this.SIDEBAR_WIN.bitsItemView;}catch(e){return undefined;}}, |
---|
24 | |
---|
25 | get TREE_POPUP(){try{return this.SIDEBAR_DOC.getElementById("mcPopup");}catch(e){return undefined;}}, |
---|
26 | get TREE_MENU(){try{return this.SIDEBAR_DOC.getElementById("mcPopupRemap");}catch(e){return undefined;}}, |
---|
27 | |
---|
28 | get TREEOBJ_POPUP(){try{return this.SIDEBAR_DOC.getElementById("mcPopupObject");}catch(e){return undefined;}}, |
---|
29 | get TREEOBJ_MENU(){try{return this.SIDEBAR_DOC.getElementById("mcPopupObjectRemap");}catch(e){return undefined;}}, |
---|
30 | |
---|
31 | get ITEMTREE_POPUP(){try{return this.SIDEBAR_DOC.getElementById("bitsItemTreePopup");}catch(e){return undefined;}}, |
---|
32 | get ITEMTREE_MENU(){try{return this.SIDEBAR_DOC.getElementById("bitsItemTreePopupRemap");}catch(e){return undefined;}}, |
---|
33 | |
---|
34 | ///////////////////////////////////////////////////////////////////// |
---|
35 | load : function(aEvent){ |
---|
36 | try{this.TREE_POPUP.addEventListener("popupshowing",this.popupshowing_tree, false);}catch(e){} |
---|
37 | try{this.TREEOBJ_POPUP.addEventListener("popupshowing",this.popupshowing_treeobj, false);}catch(e){} |
---|
38 | try{this.ITEMTREE_POPUP.addEventListener("popupshowing",this.popupshowing_itemview, false);}catch(e){} |
---|
39 | }, |
---|
40 | |
---|
41 | ///////////////////////////////////////////////////////////////////// |
---|
42 | unload : function(aEvent){ |
---|
43 | try{this.TREE_POPUP.removeEventListener("popupshowing",this.popupshowing_tree, false);}catch(e){} |
---|
44 | try{this.TREEOBJ_POPUP.removeEventListener("popupshowing",this.popupshowing_treeobj, false);}catch(e){} |
---|
45 | try{this.ITEMTREE_POPUP.removeEventListener("popupshowing",this.popupshowing_itemview, false);}catch(e){} |
---|
46 | }, |
---|
47 | |
---|
48 | ///////////////////////////////////////////////////////////////////// |
---|
49 | popupshowing_tree : function(aEvent){ |
---|
50 | bitsMarkerRemap._popupshowing_tree(aEvent); |
---|
51 | }, |
---|
52 | _popupshowing_tree : function(aEvent){ |
---|
53 | this._object = null; |
---|
54 | this.TREE_MENU.hidden = true; |
---|
55 | this._resource = this.mcTreeHandler.resource; |
---|
56 | if(!this._resource) return; |
---|
57 | if(this.DataSource.getProperty(this._resource, "type") != "item") return; |
---|
58 | var object = this.getObjectFromResource(this._resource); |
---|
59 | if(!object) return; |
---|
60 | this.TREE_MENU.hidden = !this.isDispContextmenu(object); |
---|
61 | if(!this.TREE_MENU.hidden){ |
---|
62 | this._object = object; |
---|
63 | var parentRes = this.DataSource.findParentResource(this._resource); |
---|
64 | this._object.fid_title = this.DataSource.getProperty(parentRes, "title"); |
---|
65 | this._object.fid_style = this.DataSource.getProperty(parentRes, "style"); |
---|
66 | this._object.pfid_order = this.DataSource.getProperty(this._resource, "pfid_order"); |
---|
67 | if(this._object.pfid_order == "") this._object.pfid_order = 0; |
---|
68 | } |
---|
69 | }, |
---|
70 | |
---|
71 | ///////////////////////////////////////////////////////////////////// |
---|
72 | popupshowing_treeobj : function(aEvent){ |
---|
73 | bitsMarkerRemap._popupshowing_treeobj(aEvent); |
---|
74 | }, |
---|
75 | _popupshowing_treeobj : function(aEvent){ |
---|
76 | this._object = null; |
---|
77 | this.TREEOBJ_MENU.hidden = true; |
---|
78 | this._resource = this.mcTreeHandler.resource; |
---|
79 | if(!this._resource) return; |
---|
80 | if(this.DataSource.getProperty(this._resource, "type") != "item") return; |
---|
81 | var object = this.getObjectFromResource(this._resource); |
---|
82 | if(!object) return; |
---|
83 | this.TREEOBJ_MENU.hidden = !this.isDispContextmenu(object); |
---|
84 | if(!this.TREEOBJ_MENU.hidden){ |
---|
85 | this._object = object; |
---|
86 | var parentRes = this.DataSource.findParentResource(this._resource); |
---|
87 | this._object.fid_title = this.DataSource.getProperty(parentRes, "title"); |
---|
88 | this._object.fid_style = this.DataSource.getProperty(parentRes, "style"); |
---|
89 | this._object.pfid_order = this.DataSource.getProperty(this._resource, "pfid_order"); |
---|
90 | if(this._object.pfid_order == "") this._object.pfid_order = 0; |
---|
91 | } |
---|
92 | }, |
---|
93 | |
---|
94 | ///////////////////////////////////////////////////////////////////// |
---|
95 | popupshowing_itemview : function(aEvent){ |
---|
96 | bitsMarkerRemap._popupshowing_itemview(aEvent); |
---|
97 | }, |
---|
98 | _popupshowing_itemview : function(aEvent){ |
---|
99 | this._object = null; |
---|
100 | this._resource = null; |
---|
101 | var parentRes = this.mcTreeHandler.resource; |
---|
102 | this.ITEMTREE_MENU.hidden = true; |
---|
103 | var object = this.bitsItemView.object; |
---|
104 | if(!object) return; |
---|
105 | this.ITEMTREE_MENU.hidden = !this.isDispContextmenu(object); |
---|
106 | if(!this.ITEMTREE_MENU.hidden){ |
---|
107 | this._object = {}; |
---|
108 | for(var key in object){ |
---|
109 | this._object[key] = object[key]; |
---|
110 | } |
---|
111 | if(this._object.dbtype == bitsMarkingCollection._uncategorized.dbtype && this._object.pfid == 0){ |
---|
112 | if(!this._object.fid_title) this._object.fid_title = bitsMarkingCollection._uncategorized.title; |
---|
113 | if(!this._object.fid_style) this._object.fid_style = bitsMarkingCollection._uncategorized.style; |
---|
114 | } |
---|
115 | } |
---|
116 | }, |
---|
117 | |
---|
118 | ///////////////////////////////////////////////////////////////////// |
---|
119 | getObjectFromResource : function(aRes){ |
---|
120 | var oid = this.DataSource.getProperty(aRes, "id"); |
---|
121 | var pfid = this.DataSource.getProperty(aRes, "pfid"); |
---|
122 | var dbtype = this.DataSource.getProperty(aRes, "dbtype"); |
---|
123 | var objects = this.Database.getObject({oid:oid,pfid:pfid}, dbtype); |
---|
124 | if(!objects || objects.length == 0) |
---|
125 | return null; |
---|
126 | else |
---|
127 | return objects[0]; |
---|
128 | }, |
---|
129 | |
---|
130 | ///////////////////////////////////////////////////////////////////// |
---|
131 | isDispContextmenu : function(aObject){ |
---|
132 | if(aObject.oid_type != "text") return false; |
---|
133 | var marker_id = bitsMarker.id_key+aObject.dbtype+aObject.oid; |
---|
134 | var exists_doc = false; |
---|
135 | var marker_num = 0; |
---|
136 | for(var i=0;i<this.gBrowser.browsers.length;i++){ |
---|
137 | var contentDocument = this.gBrowser.browsers[i].contentDocument; |
---|
138 | var cur_uri = this.Common.getURLStringFromDocument(contentDocument); |
---|
139 | if(cur_uri.indexOf(aObject.con_url)==0){ |
---|
140 | exists_doc = !this.gBrowser.browsers[i].webProgress.isLoadingDocument; |
---|
141 | var nodesSnapshot = this.XPath.evaluate('//*[@id="'+marker_id+'"]',contentDocument); |
---|
142 | if(nodesSnapshot && nodesSnapshot.snapshotLength>0) marker_num += nodesSnapshot.snapshotLength; |
---|
143 | } |
---|
144 | } |
---|
145 | return (exists_doc && marker_num==0)?true:false; |
---|
146 | }, |
---|
147 | |
---|
148 | ///////////////////////////////////////////////////////////////////// |
---|
149 | reMap : function(aEvent){ |
---|
150 | if(!this._object) return; |
---|
151 | var findtext = this._object.oid_txt; |
---|
152 | var doc = this.gBrowser.contentDocument; |
---|
153 | var sel = doc.defaultView.getSelection(); |
---|
154 | sel.removeAllRanges(); |
---|
155 | var findRange = this._getFindRange(); |
---|
156 | findRange.caseSensitive = true; |
---|
157 | var docRange = doc.createRange(); |
---|
158 | docRange.selectNode(doc.body); |
---|
159 | var startRange = docRange.cloneRange(); |
---|
160 | var stopRange = docRange.cloneRange(); |
---|
161 | startRange.collapse(true); |
---|
162 | stopRange.collapse(false); |
---|
163 | var ranges = []; |
---|
164 | var result; |
---|
165 | while((result = findRange.Find(findtext, docRange, startRange, stopRange))){ |
---|
166 | if(result.endContainer != null && |
---|
167 | result.startContainer != null && |
---|
168 | result.endContainer.nodeType == Node.TEXT_NODE && |
---|
169 | result.startContainer.nodeType == Node.TEXT_NODE && |
---|
170 | !this._isNodeInputNodeOrChildOf(result.startContainer) && |
---|
171 | !this._isNodeInputNodeOrChildOf(result.endContainer)) { |
---|
172 | if(!((result.startContainer.parentNode && this._marker_exp.test(result.startContainer.parentNode.id)) || (result.endContainer.parentNode && this._marker_exp.test(result.endContainer.parentNode.id)))){ |
---|
173 | var obj = { |
---|
174 | startContainer : result.startContainer, |
---|
175 | startOffset : result.startOffset, |
---|
176 | endContainer : result.endContainer, |
---|
177 | endOffset : result.endOffset, |
---|
178 | collapsed : result.collapsed, |
---|
179 | commonAncestorContainer : result.commonAncestorContainer |
---|
180 | }; |
---|
181 | ranges.push(obj); |
---|
182 | sel.addRange(result); |
---|
183 | } |
---|
184 | } |
---|
185 | startRange = result; |
---|
186 | startRange.collapse(false); |
---|
187 | } |
---|
188 | |
---|
189 | var map = false; |
---|
190 | if(ranges.length==0){ |
---|
191 | this.Common.alert(this.STRING.getString("ALERT_FIND_RESULT")+"\n[ "+findtext+" ]"); |
---|
192 | }else if(ranges.length==1){ |
---|
193 | map = true; |
---|
194 | }else{ |
---|
195 | map = this.Common.confirm(this.STRING.getString("CONFIRM_FIND_RESULTS")+" [ "+ranges.length+" ]"); |
---|
196 | } |
---|
197 | if(map){ |
---|
198 | var style = this._object.fid_style; |
---|
199 | var dbtype = this._object.dbtype; |
---|
200 | var pfid_order = this._object.pfid_order; |
---|
201 | var connect = this.Database._dbConn[dbtype]; |
---|
202 | connect.executeSimpleSQL('update om_link set pfid_order=pfid_order+'+ranges.length+' where pfid_order>'+pfid_order); |
---|
203 | var aParName = null; |
---|
204 | var curRelIdx = -1; |
---|
205 | if(!this.bitsItemView || !this.bitsItemView.isChecked){ |
---|
206 | var f_pfid = undefined; |
---|
207 | var rtnFolder = this.Database.getFolder({fid:this._object.pfid},dbtype); |
---|
208 | if(rtnFolder && rtnFolder.length) f_pfid = rtnFolder[0].pfid; |
---|
209 | rtnFolder = undefined; |
---|
210 | aParName = this.DataSource.getID2About(this._object.pfid,f_pfid,dbtype); |
---|
211 | curRelIdx = this.DataSource.getRelativeIndex(this.Common.RDF.GetResource(aParName), this._resource); |
---|
212 | } |
---|
213 | sel.removeAllRanges(); |
---|
214 | var parser = new DOMParser(); |
---|
215 | var xmlSerializer = new XMLSerializer(); |
---|
216 | for(var i=0;i<ranges.length;i++){ |
---|
217 | var range = doc.createRange(); |
---|
218 | range.setStart(ranges[i].startContainer, ranges[i].startOffset); |
---|
219 | range.setEnd(ranges[i].endContainer, ranges[i].endOffset); |
---|
220 | var startContainer = range.startContainer; |
---|
221 | var startOffset = range.startOffset; |
---|
222 | var endContainer = range.endContainer; |
---|
223 | var endOffset = range.endOffset; |
---|
224 | var stXPath = this.XPath.getOffsetFromParentNode(startContainer,startOffset); |
---|
225 | var enXPath = this.XPath.getOffsetFromParentNode(endContainer,endOffset); |
---|
226 | try{ |
---|
227 | var hyperAnchor = bitsHyperAnchor._getAnchorURL({node:startContainer,offset:startOffset,style:style,prefix:"b",contents:range.toString()},{node:endContainer,offset:endOffset,prefix:"e",contents:range.toString()}); |
---|
228 | }catch(ex3){ |
---|
229 | try{ |
---|
230 | var hyperAnchor = bitsHyperAnchorDummy._getAnchorURL({node:startContainer,offset:startOffset,style:style,prefix:"b",contents:range.toString()},{node:endContainer,offset:endOffset,prefix:"e",contents:range.toString()}); |
---|
231 | }catch(ex3){ |
---|
232 | hyperAnchor = null; |
---|
233 | } |
---|
234 | } |
---|
235 | hyperAnchor = bitsAutocacheService.convertCacheURLToOriginalURL(hyperAnchor); |
---|
236 | var rObj = this.Database.newObject(); |
---|
237 | for(var key in rObj){ |
---|
238 | if(key == "oid") continue; |
---|
239 | if(this._object[key] != undefined) rObj[key] = this._object[key]; |
---|
240 | } |
---|
241 | rObj.bgn_dom = stXPath.xpath + "("+stXPath.offset+")" + "("+stXPath.type+")"; |
---|
242 | rObj.end_dom = enXPath.xpath + "("+enXPath.offset+")" + "("+enXPath.type+")"; |
---|
243 | if(!rObj.oid_property || rObj.oid_property == "") rObj.oid_property = "<PROPERTY></PROPERTY>"; |
---|
244 | var xmldoc = parser.parseFromString(rObj.oid_property,"text/xml"); |
---|
245 | if(xmldoc){ |
---|
246 | if(xmldoc.documentElement){ |
---|
247 | if(hyperAnchor){ |
---|
248 | var xmlnode = xmldoc.getElementsByTagName("HYPER_ANCHOR")[0]; |
---|
249 | if(!xmlnode) xmlnode = xmldoc.createElement("HYPER_ANCHOR"); |
---|
250 | if(xmlnode){ |
---|
251 | while(xmlnode.hasChildNodes()){ xmlnode.removeChild(xmlnode.lastChild); } |
---|
252 | xmlnode.appendChild(xmldoc.createTextNode(hyperAnchor)); |
---|
253 | xmldoc.documentElement.appendChild(xmlnode); |
---|
254 | } |
---|
255 | }else{ |
---|
256 | var xmlnode = xmldoc.getElementsByTagName("HYPER_ANCHOR")[0]; |
---|
257 | if(xmlnode) xmlnode.parentNode.removeChild(xmlnode); |
---|
258 | } |
---|
259 | } |
---|
260 | rObj.oid_property = xmlSerializer.serializeToString(xmldoc); |
---|
261 | xmldoc = undefined; |
---|
262 | } |
---|
263 | rObj.pfid_order = ++pfid_order; |
---|
264 | var rtn = this.Database.addObject(rObj,dbtype); |
---|
265 | if(!rtn) rObj = undefined; |
---|
266 | if(!rObj) continue; |
---|
267 | var con_doc = stXPath.node.ownerDocument; |
---|
268 | var rtnContent = bitsMarker.xPathMarker( |
---|
269 | con_doc, |
---|
270 | { |
---|
271 | start : rObj.bgn_dom, |
---|
272 | end : rObj.end_dom, |
---|
273 | context : this.Common.exceptCode(rObj.oid_txt.replace(/\s+$/mg,"").replace(/^\s+/mg,"")), |
---|
274 | con_url : this.Common.getURLStringFromDocument(con_doc) |
---|
275 | }, |
---|
276 | { |
---|
277 | id : rObj.oid, |
---|
278 | dbtype : dbtype, |
---|
279 | pfid : rObj.pfid, |
---|
280 | style : style |
---|
281 | } |
---|
282 | ); |
---|
283 | if(rtnContent){ |
---|
284 | if(this.bitsItemView && this.bitsItemView.isChecked) continue; |
---|
285 | this.DataSource.addItem(this.Database.makeObjectToItem(rObj), aParName, ++curRelIdx, dbtype); |
---|
286 | this.mcTreeHandler.TREE.builder.rebuild(); |
---|
287 | } |
---|
288 | } |
---|
289 | parser = undefined; |
---|
290 | xmlSerializer = undefined; |
---|
291 | if(this.Database.removeObject(this._object,dbtype)){ |
---|
292 | if(this._resource){ |
---|
293 | this.DataSource.deleteItem(this._resource); |
---|
294 | this.DataSource.flush(); |
---|
295 | this.mcTreeHandler.TREE.builder.rebuild(); |
---|
296 | } |
---|
297 | var records = []; |
---|
298 | var statement = connect.createStatement('select oid,pfid from om_link order by pfid_order'); |
---|
299 | var columnNames = []; |
---|
300 | var i; |
---|
301 | var k=statement.columnCount |
---|
302 | var col_name; |
---|
303 | for(i=0;i<k;i++){ |
---|
304 | columnNames.push(statement.getColumnName(i)); |
---|
305 | } |
---|
306 | try{ |
---|
307 | while(statement.executeStep()){ |
---|
308 | var row = {}; |
---|
309 | for(i=0;i<k;i++){ |
---|
310 | if(statement.getIsNull(i)){ |
---|
311 | row[columnNames[i]] = null; |
---|
312 | }else{ |
---|
313 | row[columnNames[i]] = statement.getUTF8String(i); |
---|
314 | } |
---|
315 | } |
---|
316 | records.push(row); |
---|
317 | } |
---|
318 | } |
---|
319 | finally { |
---|
320 | statement.reset(); |
---|
321 | statement = undefined; |
---|
322 | } |
---|
323 | if(records.length>0){ |
---|
324 | var result = true; |
---|
325 | connect.beginTransaction(); |
---|
326 | try{ |
---|
327 | var sql = 'update om_link set pfid_order=?1 where oid=?2 and pfid=?3'; |
---|
328 | var statement = connect.createStatement(sql); |
---|
329 | for(i=0,k=records.length;i<k;i++){ |
---|
330 | var pfid_order = i+1; |
---|
331 | this.Database._setStatementValue(statement,0,pfid_order); |
---|
332 | this.Database._setStatementValue(statement,1,records[i].oid); |
---|
333 | this.Database._setStatementValue(statement,2,records[i].pfid); |
---|
334 | statement.execute(); |
---|
335 | statement.reset(); |
---|
336 | } |
---|
337 | statement = undefined; |
---|
338 | }catch(e){ |
---|
339 | this._dump(e); |
---|
340 | result = false; |
---|
341 | }finally { |
---|
342 | if(connect.lastError){ |
---|
343 | this._dump(connect.lastErrorString+" ("+connect.lastError+")"); |
---|
344 | this._dump("sql="+sql); |
---|
345 | result = false; |
---|
346 | } |
---|
347 | } |
---|
348 | if(result){ |
---|
349 | connect.commitTransaction(); |
---|
350 | }else{ |
---|
351 | connect.rollbackTransaction(); |
---|
352 | } |
---|
353 | } |
---|
354 | } |
---|
355 | this.Common.alert(this.STRING.getString("ALERT_MAP_RESULT")); |
---|
356 | } |
---|
357 | sel.removeAllRanges(); |
---|
358 | }, |
---|
359 | |
---|
360 | ///////////////////////////////////////////////////////////////////// |
---|
361 | _getFindRange : function(){ |
---|
362 | var findRange = Components.classes["@mozilla.org/embedcomp/rangefind;1"].createInstance(); |
---|
363 | if(!findRange || !(findRange instanceof Components.interfaces.nsIFind)) return undefined; |
---|
364 | findRange.caseSensitive = false; |
---|
365 | findRange.findBackwards = false; |
---|
366 | return findRange; |
---|
367 | }, |
---|
368 | |
---|
369 | ///////////////////////////////////////////////////////////////////// |
---|
370 | _isWordCharacter : function(ch){ |
---|
371 | if(ch == null || typeof ch != "string" || ch.length != 1) return false; |
---|
372 | var code = ch.charCodeAt(0); |
---|
373 | return code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 97 && code <= 122 || code >= 138 && code <= 142 || code >= 154 && code <= 159 || code >= 192 && code <= 255; |
---|
374 | }, |
---|
375 | |
---|
376 | ///////////////////////////////////////////////////////////////////// |
---|
377 | _isNodeInputNodeOrChildOf : function(node){ |
---|
378 | if(node.nodeName.toUpperCase() == "INPUT") return true; |
---|
379 | if(node.parentNode != null) return this._isNodeInputNodeOrChildOf(node.parentNode); |
---|
380 | return false; |
---|
381 | }, |
---|
382 | |
---|
383 | ///////////////////////////////////////////////////////////////////// |
---|
384 | _dump : function(aString){ |
---|
385 | window.top.bitsMarkingCollection._dump(aString); |
---|
386 | }, |
---|
387 | } |
---|