source: DASISH/t5.6/client/chrome/markingcollection/content/markingcollection/treeproject.js @ 2709

Last change on this file since 2709 was 2709, checked in by sroth, 11 years ago

Wired-Marker initial source code with minor adjustments.

  • Property svn:executable set to *
File size: 98.6 KB
Line 
1var bitsTreeProjectService = {
2        _openurl : "",
3        _doc     : null,
4        _loaddoc : null,
5        _url     : "",
6        _fileid  : "",
7        _oid     : null,
8        _savehtml : [],
9        _applytimer  : null,
10
11        _caseSensitive_exp : new RegExp("[A-Z]{2,}",""),
12        _marker_exp : new RegExp("^"+bitsMarker.id_key+"\\D+\\d+$",""),
13
14        appDataDir  : null,
15        appDataURL  : "",
16        appDataSTRING : "",
17        appDataURLExp : null,
18        appDataAddSTRING : "_files",
19        zipApp : null,
20        zipAppScript : null,
21        _title2obj : {},
22
23/////////////////////////////////////////////////////////////////////
24        get STRING() { return document.getElementById("MarkingCollectionOverlayString"); },
25
26        get DataSource() { return window.top.bitsObjectMng.DataSource; },
27        get Common()     { return window.top.bitsObjectMng.Common;     },
28        get Database()   { return window.top.bitsObjectMng.Database;   },
29        get XML()        { return window.top.bitsObjectMng.XML;        },
30        get XPath()      { return window.top.bitsObjectMng.XPath;      },
31        get gBrowser()   { return window.top.bitsObjectMng.getBrowser();},
32
33        get MAINWINDOW() { return window.top.document.getElementById("main-window"); },
34        get SIDEBAR() { return window.top.document.getElementById("sidebar"); },
35        get CONTENT() { return window.top.document.getElementById("content"); },
36
37        get SIDEBAR_DOC() {try{return this.SIDEBAR.contentDocument;}catch(e){return undefined;}},
38        get SIDEBAR_WIN() {try{return this.SIDEBAR.contentWindow;}catch(e){return undefined;}},
39        get mcTreeHandler() {try{return this.SIDEBAR_WIN.mcTreeHandler;}catch(e){return undefined;}},
40        get mcMainService() {try{return this.SIDEBAR_WIN.mcMainService;}catch(e){return undefined;}},
41        get mcController() {try{return this.SIDEBAR_WIN.mcController;}catch(e){return undefined;}},
42        get mcPropertyView() {try{return this.SIDEBAR_WIN.mcPropertyView;}catch(e){return undefined;}},
43        get mcTreeViewModeService() {try{return this.SIDEBAR_WIN.mcTreeViewModeService;}catch(e){return undefined;}},
44        get bitsItemView() {try{return this.SIDEBAR_WIN.bitsItemView;}catch(e){return undefined;}},
45
46        get TREE_POPUP(){try{return this.SIDEBAR_DOC.getElementById("mcPopup");}catch(e){return undefined;}},
47        get TREE_LISTVIEWMENU(){try{return this.SIDEBAR_DOC.getElementById("mcPopupViewMenu");}catch(e){return undefined;}},
48        get TREE_INDEXMENU(){try{return this.SIDEBAR_DOC.getElementById("mcPopupProjectIndexMenu");}catch(e){return undefined;}},
49        get TREE_DOCUMENTMENU(){try{return this.SIDEBAR_DOC.getElementById("mcPopupProjectDocumentsMenu");}catch(e){return undefined;}},
50        get TREE_DICTIONARYMENU(){try{return this.SIDEBAR_DOC.getElementById("mcPopupProjectDictionaryMenu");}catch(e){return undefined;}},
51
52        get xmldoc(){ return this._xmldoc; },
53
54/////////////////////////////////////////////////////////////////////
55        init : function(){
56                try{
57                        this.gBrowser.addEventListener("pageshow", bitsTreeProjectService.pageshow, false);
58                }catch(ex){
59                        this._dump("bitsTreeProjectService.init():"+ex);
60                }
61        },
62
63/////////////////////////////////////////////////////////////////////
64        done : function(){
65                try{
66                        this.gBrowser.removeEventListener("pageshow", bitsTreeProjectService.pageshow, false);
67                }catch(ex){
68                        this._dump("bitsTreeProjectService.done():"+ex);
69                }
70        },
71
72/////////////////////////////////////////////////////////////////////
73        pageshow : function(aEvent){
74                bitsTreeProjectService._pageshow(aEvent);
75        },
76
77/////////////////////////////////////////////////////////////////////
78        _pageshow : function(aEvent){
79                var self = this;
80                var doc = aEvent.target;
81                if(doc.location.protcol == "chrome:" || doc.location.protcol == "about:") return;
82                if(!doc.body) return;
83                if(doc.contentType != "text/plain") return;
84                var pre = doc.body.getElementsByTagName("pre")[0];
85                if(!pre || pre.style.cssText != "") return;
86                var textplain_display = nsPreferences.copyUnicharPref("wiredmarker.textplain.display","usually");
87                if(textplain_display == "usually") return;
88                setTimeout(function(){
89                        if(textplain_display == "confirm" && !self.Common.confirm(self.STRING.getString("CONFIRM_BROWSER_TO_FIT_TEXT"))) return;
90                        var title = doc.title!=""?doc.title:doc.location.toString();
91                        var textContent = pre.textContent.replace(/(\x0D\x0A|\x0D|\x0A)/g,"<br>$1");
92                        var textContent_Arr = textContent.split("<br>");
93                        var cDoc = doc;
94                        try{
95                                while(cDoc.body.lastChild){ cDoc.body.removeChild(cDoc.body.lastChild); }
96                                cDoc.body.appendChild(cDoc.createElement("pre"));
97                                if(cDoc.body.lastChild){
98                                        var span = cDoc.body.lastChild;
99                                        span.style.whiteSpace = "normal";
100                                        var backgroundColor = nsPreferences.copyUnicharPref("wiredmarker.textplain.background_color");
101                                        var fontFamily = nsPreferences.copyUnicharPref("wiredmarker.textplain.font.name");
102                                        var fontSize = nsPreferences.getIntPref("wiredmarker.textplain.font.size");
103                                        if(backgroundColor) span.style.backgroundColor = backgroundColor;
104                                        if(fontFamily) span.style.fontFamily = fontFamily;
105                                        if(fontSize) span.style.fontSize = fontSize+'pt';
106                                        var i;
107                                        for(i=0;i<textContent_Arr.length;i++){
108                                                span.appendChild(cDoc.createTextNode(textContent_Arr[i]));
109                                                var elem_br = cDoc.createElement("br");
110                                                elem_br.setAttribute("id",bitsMarker.id_key+"dummy_br");
111                                                span.appendChild(elem_br);
112                                        }
113                                }
114                                var urlString = self.Common.getURLStringFromDocument(cDoc);
115                                var info = bitsAutocacheService.getSaveCacheInfo(urlString);
116                                var rtn = bitsMarkingCollection.marking(cDoc,(info?info.URL:undefined));
117                        }catch(e){
118                                self.Common.alert(e);
119                        }
120                },0);
121        },
122
123/////////////////////////////////////////////////////////////////////
124        load : function(aEvent){
125                var popup = this.TREE_POPUP;
126                if(!popup) return;
127                popup.addEventListener("popupshowing",this.popupshowing_tree, false);
128        },
129
130/////////////////////////////////////////////////////////////////////
131        unload : function(aEvent){
132                var popup = this.TREE_POPUP;
133                if(!popup) return;
134                popup.removeEventListener("popupshowing",this.popupshowing_tree, false);
135        },
136
137/////////////////////////////////////////////////////////////////////
138        popupshowing_tree : function(aEvent){
139                bitsTreeProjectService._popupshowing_tree(aEvent);
140        },
141
142        _popupshowing_tree : function(aEvent){
143                var aRes = null;
144                var type = null;
145                if(this.mcTreeHandler && this.mcTreeHandler.resource) aRes = this.mcTreeHandler.resource;
146                if(aRes) type = this.DataSource.getProperty(aRes,"type");
147                var contextmenu_type = nsPreferences.copyUnicharPref("wiredmarker.contextmenu.type","");
148                if(this.TREE_LISTVIEWMENU.hasAttribute("hidden") || contextmenu_type == "simple"){
149                        this.TREE_INDEXMENU.setAttribute("hidden","true");
150                        this.TREE_DOCUMENTMENU.setAttribute("hidden","true");
151                        this.TREE_DICTIONARYMENU.setAttribute("hidden","true");
152                }else if(type && type == "localfolder"){
153                        this.TREE_DOCUMENTMENU.setAttribute("hidden","true");
154                        this.TREE_DICTIONARYMENU.setAttribute("hidden","true");
155                }else{
156                        this.TREE_INDEXMENU.removeAttribute("hidden");
157                        this.TREE_DOCUMENTMENU.removeAttribute("hidden");
158                        this.TREE_DICTIONARYMENU.removeAttribute("hidden");
159                }
160        },
161
162/////////////////////////////////////////////////////////////////////
163        click : function(aEvent){},
164
165/////////////////////////////////////////////////////////////////////
166        blur : function(aEvent){},
167
168/////////////////////////////////////////////////////////////////////
169        onPopupShowing : function(aEvent){},
170
171/////////////////////////////////////////////////////////////////////
172        onPopupHiding : function(aEvent){},
173
174/////////////////////////////////////////////////////////////////////
175        onCommand : function(aEvent){},
176
177/////////////////////////////////////////////////////////////////////
178        setWaitCursor : function(aValue){
179                var menu_MainBits = window.top.document.getElementById("bitsExtensionsMainMenu");
180                var menu_ToolsBits = window.top.document.getElementById("bitsExtensionsToolsMenu");
181                var menu_BookmarksBits = window.top.document.getElementById("bitsExtensionsBookmarksMenu");
182                var elems = this.SIDEBAR_DOC.getElementsByTagName("*");
183                var i;
184                if(aValue){
185                        if(menu_MainBits) menu_MainBits.setAttribute("disabled","true");
186                        if(menu_ToolsBits) menu_ToolsBits.setAttribute("disabled","true");
187                        if(menu_BookmarksBits) menu_BookmarksBits.setAttribute("disabled","true");
188                        for(i=0;i<elems.length;i++){
189                                try{
190                                        if(elems[i].hasAttribute("disabled") && elems[i].disabled){
191                                                elems[i].setAttribute("disabled_prev","true");
192                                        }else{
193                                                elems[i].setAttribute("disabled","true");
194                                        }
195                                }catch(e){this._dump("setWaitCursor("+aValue+"):"+e);}
196                                try{elems[i].setAttribute("wait-cursor","true");}catch(e){this._dump("setWaitCursor("+aValue+"):"+e);}
197                        }
198                }else{
199                        if(menu_MainBits) menu_MainBits.removeAttribute("disabled");
200                        if(menu_ToolsBits) menu_ToolsBits.removeAttribute("disabled");
201                        if(menu_BookmarksBits) menu_BookmarksBits.removeAttribute("disabled");
202                        for(i=0;i<elems.length;i++){
203                                try{elems[i].removeAttribute("wait-cursor");}catch(e){this._dump("setWaitCursor("+aValue+"):"+e);}
204                                try{
205                                        if(elems[i].hasAttribute("disabled_prev")){
206                                                elems[i].removeAttribute("disabled_prev");
207                                        }else{
208                                                elems[i].removeAttribute("disabled");
209                                        }
210                                }catch(e){this._dump("setWaitCursor("+aValue+"):"+e);}
211                        }
212                }
213        },
214
215/////////////////////////////////////////////////////////////////////
216        updateFolderProperty : function(aRes,aProperty,aOptions){
217                var changed = false;
218                var fid = this.DataSource.getProperty(aRes,"id");
219                var dbtype = this.DataSource.getProperty(aRes,"dbtype");
220                var folders = this.Database.getFolderFormID(fid, dbtype);
221                if(folders && folders.length>0){
222                        if(aProperty != undefined){
223                                var parser = new DOMParser();
224                                var xmldoc;
225                                if(folders[0].fid_property){
226                                        xmldoc = parser.parseFromString(folders[0].fid_property, "text/xml");
227                                }
228                                if(!xmldoc) xmldoc = parser.parseFromString("<PROPERTY/>", "text/xml");
229                                parser = undefined;
230                                if(aProperty.icon != undefined){
231                                        var icon_elem;
232                                        this.DataSource.setProperty(aRes,"icon",aProperty.icon);
233                                        icon_elem = xmldoc.getElementsByTagName("ICON")[0];
234                                        if(icon_elem){
235                                                while(icon_elem.hasChildNodes()){ icon_elem.removeChild(icon_elem.lastChild); }
236                                        }else{
237                                                icon_elem = xmldoc.createElement("ICON");
238                                                xmldoc.documentElement.appendChild(icon_elem);
239                                        }
240                                        icon_elem.appendChild(xmldoc.createTextNode(aProperty.icon));
241                                }
242                                if(aProperty.contextmenu != undefined){
243                                        var contextmenu_elem;
244                                        this.DataSource.setProperty(aRes,"contextmenu",aProperty.contextmenu);
245                                        contextmenu_elem = xmldoc.getElementsByTagName("CONTEXTMENU")[0];
246                                        if(contextmenu_elem){
247                                                while(contextmenu_elem.hasChildNodes()){ contextmenu_elem.removeChild(contextmenu_elem.lastChild); }
248                                        }else{
249                                                contextmenu_elem = xmldoc.createElement("CONTEXTMENU");
250                                                xmldoc.documentElement.appendChild(contextmenu_elem);
251                                        }
252                                        contextmenu_elem.appendChild(xmldoc.createTextNode(aProperty.contextmenu));
253                                }
254                                if(aProperty.propertyOverlay != undefined){
255                                        var propertyOverlay_elem;
256                                        propertyOverlay_elem = xmldoc.getElementsByTagName("PROPERTYOVERLAY")[0];
257                                        if(propertyOverlay_elem){
258                                                while(propertyOverlay_elem.hasChildNodes()){ propertyOverlay_elem.removeChild(propertyOverlay_elem.lastChild); }
259                                        }else{
260                                                propertyOverlay_elem = xmldoc.createElement("PROPERTYOVERLAY");
261                                                xmldoc.documentElement.appendChild(propertyOverlay_elem);
262                                        }
263                                        propertyOverlay_elem.appendChild(xmldoc.createTextNode(aProperty.propertyOverlay));
264                                }
265                                var s = new XMLSerializer();
266                                folders[0].fid_property = s.serializeToString(xmldoc);
267                                s = undefined;
268                        }
269                        if(aOptions != undefined){
270                                if(aOptions.fid_style != undefined)  folders[0].fid_style  = aOptions.fid_style;
271                                if(aOptions.fid_mode != undefined)  folders[0].fid_mode  = aOptions.fid_mode;
272                                if(aOptions.pfid_order != undefined) folders[0].pfid_order = aOptions.pfid_order;
273                        }
274                        delete folders[0].dbtype;
275                        changed = this.Database.updateFolder(folders[0],dbtype);
276                }
277                return changed;
278        },
279
280/////////////////////////////////////////////////////////////////////
281        createFolders : function(aEvent){
282                var curIdx = this.mcTreeHandler.TREE.currentIndex;
283                var curRes = null;
284                if(curIdx>=0){
285                        if(!this.mcTreeHandler.TREE.view.isContainer(curIdx)) return;
286                        curRes = this.mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx);
287                        if(!this.mcTreeHandler.TREE.view.isContainerOpen(curIdx)) this.mcTreeHandler.TREE.view.toggleOpenState(curIdx);
288                }else{
289                        curRes = this.Common.RDF.GetResource(this.mcTreeHandler.TREE.ref);
290                }
291                var title = this.DataSource.getProperty(curRes,"title");
292                var style = this.DataSource.getProperty(curRes,"style");
293                var editmode = "0";
294                if(title != ""){
295                        title = "New Project Folder ["+title+"]";
296                }else{
297                        title = "New Project Folder";
298                }
299                if(editmode == "") editmode = "0";
300                if(!style || style==""){
301                        var styleIdx = nsPreferences.getIntPref("wiredmarker.folderstyleindex",1);
302                        if(styleIdx>8) styleIdx = 1;
303                        style = bitsMarker.PRESET_STYLES[styleIdx];
304                        nsPreferences.setIntPref("wiredmarker.folderstyleindex",styleIdx);
305                }
306                //プロゞェクトフォルダ
307                var newRes = this.mcMainService.createGroupFolder(title,curRes.Value,undefined,"","",editmode);
308                this.mcController.rebuildLocal();
309                bitsMarkingCollection.reOrder(curRes);
310                var newIdx = this.mcTreeHandler.TREE.builderView.getIndexOfResource(newRes);
311                this.mcTreeHandler.TREE.view.selection.select(newIdx);
312                this.mcTreeHandler.TREE.focus();
313                if(!this.mcTreeHandler.TREE.view.isContainerOpen(newIdx)) this.mcTreeHandler.TREE.view.toggleOpenState(newIdx);
314                var fid_mode = 0x0002;
315                this.updateFolderProperty(newRes,{icon:"chrome://markingcollection/skin/project.png",contextmenu:"mcPopupProjectMainMenu"},{fid_mode : fid_mode });
316                this.DataSource.setProperty(newRes,"editmode",fid_mode.toString());
317                //ドキュメントフォルダ
318                var newRes_Docs = this.mcMainService.createGroupFolder("Documents",newRes.Value,undefined,"","",editmode);
319                this.mcController.rebuildLocal();
320                bitsMarkingCollection.reOrder(newRes);
321                fid_mode = 0x0002;
322                this.updateFolderProperty(newRes_Docs,{icon:"chrome://markingcollection/skin/documents.png",contextmenu:"mcPopupProjectDocumentsMenu"},{fid_mode : fid_mode});
323                this.DataSource.setProperty(newRes_Docs,"editmode",fid_mode.toString());
324                //蟞曞フォルダ
325                var newRes_Dic = this.mcMainService.createGroupFolder("Dictionary",newRes.Value,undefined,"","",editmode);
326                this.mcController.rebuildLocal();
327                bitsMarkingCollection.reOrder(newRes);
328                fid_mode = 0x0002;
329                this.updateFolderProperty(newRes_Dic,{icon:"chrome://markingcollection/skin/dictionary.png",contextmenu:"mcPopupProjectDictionaryMenu"},{fid_mode : fid_mode});
330                this.DataSource.setProperty(newRes_Dic,"editmode",fid_mode.toString());
331                //HAフォルダ
332                var newRes_Anchor = this.mcMainService.createGroupFolder("Anchor",newRes.Value,undefined,style,"",editmode);
333                this.mcController.rebuildLocal();
334                bitsMarkingCollection.reOrder(newRes);
335                fid_mode = 0x0000;
336                this.updateFolderProperty(newRes_Anchor,{icon:"chrome://markingcollection/skin/hyperanchor.png",contextmenu:"mcPopupProjectAnchorMenu"});
337                this.DataSource.setProperty(newRes_Anchor,"editmode",fid_mode.toString());
338                var result = this.mcController.property(newRes);
339                if(result){
340                        bitsMarkingCollection.reOrder(curRes);
341                }else{
342                        this.mcTreeHandler.remove(undefined,undefined,true);
343                }
344                var newIdx = this.mcTreeHandler.TREE.builderView.getIndexOfResource(newRes);
345                this.mcController.rebuildLocal();
346                var selectIdx = newIdx;
347                if(selectIdx<0) selectIdx = curIdx;
348                this.mcTreeHandler.TREE.currentIndex = selectIdx;
349                if(!this.mcTreeHandler.TREE.view.selection.isSelected(this.mcTreeHandler.TREE.currentIndex)) this.mcTreeHandler.TREE.view.selection.select(this.mcTreeHandler.TREE.currentIndex);
350                this.mcTreeHandler.TREE.focus();
351                this.mcTreeHandler.TREE.treeBoxObject.ensureRowIsVisible(selectIdx);
352                this.mcPropertyView.dispProperty(this.mcTreeHandler.object);
353        },
354
355/////////////////////////////////////////////////////////////////////
356        createDocumentsFolder : function(aEvent){
357                var curIdx = this.mcTreeHandler.TREE.currentIndex;
358                var curRes = null;
359                if(curIdx>=0){
360                        if(!this.mcTreeHandler.TREE.view.isContainer(curIdx)) return;
361                        curRes = this.mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx);
362                        if(!this.mcTreeHandler.TREE.view.isContainerOpen(curIdx)) this.mcTreeHandler.TREE.view.toggleOpenState(curIdx);
363                }else{
364                        curRes = this.Common.RDF.GetResource(this.mcTreeHandler.TREE.ref);
365                }
366                var title = this.DataSource.getProperty(curRes,"title");
367                var style = this.DataSource.getProperty(curRes,"style");
368                var editmode = "0";
369                if(title != ""){
370                        title = "New Documents Folder ["+title+"]";
371                }else{
372                        title = "New Documents Folder";
373                }
374                if(editmode == "") editmode = "0";
375                var fid_mode = 0x0002;
376                //ドキュメントフォルダ
377                var newRes = this.mcMainService.createGroupFolder(title,curRes.Value,undefined,"","",editmode);
378                this.mcController.rebuildLocal();
379                bitsMarkingCollection.reOrder(newRes);
380                var newIdx = this.mcTreeHandler.TREE.builderView.getIndexOfResource(newRes);
381                this.mcTreeHandler.TREE.view.selection.select(newIdx);
382                this.mcTreeHandler.TREE.focus();
383                if(!this.mcTreeHandler.TREE.view.isContainerOpen(newIdx)) this.mcTreeHandler.TREE.view.toggleOpenState(newIdx);
384                this.updateFolderProperty(newRes,
385                        {
386                                icon        : "chrome://markingcollection/skin/documents.png",
387                                contextmenu : "mcPopupProjectDocumentsMenu"
388                        },
389                        { fid_mode : fid_mode }
390                );
391                this.DataSource.setProperty(newRes,"editmode",fid_mode.toString());
392                var result = this.mcController.property(newRes);
393                if(result){
394                        bitsMarkingCollection.reOrder(curRes);
395                }else{
396                        this.mcTreeHandler.remove(undefined,undefined,true);
397                }
398                var newIdx = this.mcTreeHandler.TREE.builderView.getIndexOfResource(newRes);
399                this.mcController.rebuildLocal();
400                var selectIdx = newIdx;
401                if(selectIdx<0) selectIdx = curIdx;
402                this.mcTreeHandler.TREE.currentIndex = selectIdx;
403                if(!this.mcTreeHandler.TREE.view.selection.isSelected(this.mcTreeHandler.TREE.currentIndex)) this.mcTreeHandler.TREE.view.selection.select(this.mcTreeHandler.TREE.currentIndex);
404                this.mcTreeHandler.TREE.focus();
405                this.mcTreeHandler.TREE.treeBoxObject.ensureRowIsVisible(selectIdx);
406                this.mcPropertyView.dispProperty(this.mcTreeHandler.object);
407        },
408
409/////////////////////////////////////////////////////////////////////
410        createDictionaryFolder : function(aEvent){
411                var curIdx = this.mcTreeHandler.TREE.currentIndex;
412                var curRes = null;
413                if(curIdx>=0){
414                        if(!this.mcTreeHandler.TREE.view.isContainer(curIdx)) return;
415                        curRes = this.mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx);
416                        if(!this.mcTreeHandler.TREE.view.isContainerOpen(curIdx)) this.mcTreeHandler.TREE.view.toggleOpenState(curIdx);
417                }else{
418                        curRes = this.Common.RDF.GetResource(this.mcTreeHandler.TREE.ref);
419                }
420                var title = this.DataSource.getProperty(curRes,"title");
421                var style = this.DataSource.getProperty(curRes,"style");
422                var editmode = "0";
423                if(title != ""){
424                        title = "New Dictionary Folder ["+title+"]";
425                }else{
426                        title = "New Dictionary Folder";
427                }
428                if(editmode == "") editmode = "0";
429                if(!style || style==""){
430                        var styleIdx = nsPreferences.getIntPref("wiredmarker.folderstyleindex",1);
431                        if(styleIdx>8) styleIdx = 1;
432                        style = bitsMarker.PRESET_STYLES[styleIdx];
433                        nsPreferences.setIntPref("wiredmarker.folderstyleindex",styleIdx);
434                }
435                var fid_mode = 0x0000;
436                //蟞曞フォルダ
437                var newRes = this.mcMainService.createGroupFolder(title,curRes.Value,undefined,style,"",editmode);
438                this.mcController.rebuildLocal();
439                bitsMarkingCollection.reOrder(newRes);
440                var newIdx = this.mcTreeHandler.TREE.builderView.getIndexOfResource(newRes);
441                this.mcTreeHandler.TREE.view.selection.select(newIdx);
442                this.mcTreeHandler.TREE.focus();
443                if(!this.mcTreeHandler.TREE.view.isContainerOpen(newIdx)) this.mcTreeHandler.TREE.view.toggleOpenState(newIdx);
444                this.updateFolderProperty(newRes,
445                        {
446                                icon            : "chrome://markingcollection/skin/dictionary.png",
447                                contextmenu     : "mcPopupProjectDictionaryMenu",
448                        },
449                        {fid_mode : fid_mode}
450                );
451                this.DataSource.setProperty(newRes,"editmode",fid_mode.toString());
452                var result = this.mcController.property(newRes);
453                if(result){
454                        bitsMarkingCollection.reOrder(curRes);
455                }else{
456                        this.mcTreeHandler.remove(undefined,undefined,true);
457                }
458                var newIdx = this.mcTreeHandler.TREE.builderView.getIndexOfResource(newRes);
459                this.mcController.rebuildLocal();
460                var selectIdx = newIdx;
461                if(selectIdx<0) selectIdx = curIdx;
462                this.mcTreeHandler.TREE.currentIndex = selectIdx;
463                if(!this.mcTreeHandler.TREE.view.selection.isSelected(this.mcTreeHandler.TREE.currentIndex)) this.mcTreeHandler.TREE.view.selection.select(this.mcTreeHandler.TREE.currentIndex);
464                this.mcTreeHandler.TREE.focus();
465                this.mcTreeHandler.TREE.treeBoxObject.ensureRowIsVisible(selectIdx);
466                this.mcPropertyView.dispProperty(this.mcTreeHandler.object);
467        },
468
469/////////////////////////////////////////////////////////////////////
470        readDocumentFromFolder : function(aEvent){
471                try{
472                        var mcTreeHandler = null;
473                        if(this.mcTreeHandler) mcTreeHandler = this.mcTreeHandler;
474                        if(!mcTreeHandler) return;
475                        var aRes = mcTreeHandler.resource;
476                        if(!aRes) return;
477                        this.readDocuments(this.getReadFolder());
478                }catch(e){
479                        this._dump("bitsTreeProjectService.readDocumentFromFolder():"+e);
480                        if(this._progressWindow && !this._progressWindow.closed) this._progressWindow.close();
481                        this._progressWindow = null;
482                }
483        },
484
485/////////////////////////////////////////////////////////////////////
486        readDocumentFromFile : function(aEvent){
487                try{
488                        var mcTreeHandler = null;
489                        if(this.mcTreeHandler) mcTreeHandler = this.mcTreeHandler;
490                        if(!mcTreeHandler) return;
491                        var aRes = mcTreeHandler.resource;
492                        if(!aRes) return;
493                        this.readDocuments(this.getReadFiles());
494                }catch(e){
495                        this._dump("bitsTreeProjectService.readDocumentFromFile():"+e);
496                        if(this._progressWindow && !this._progressWindow.closed) this._progressWindow.close();
497                        this._progressWindow = null;
498                }
499        },
500
501/////////////////////////////////////////////////////////////////////
502        readDocuments : function(urls){
503                try{
504                        if(!urls || urls.length==0) return;
505                        var curIdx = this.mcTreeHandler.TREE.currentIndex;
506                        var aRes =  this.mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx);
507                        if(!this.mcTreeHandler.TREE.view.isContainerOpen(curIdx)) this.mcTreeHandler.TREE.view.toggleOpenState(curIdx);
508                        var fid = this.DataSource.getProperty(aRes, "id");
509                        var fid_style = this.DataSource.getProperty(aRes, "style");
510                        var dbtype = this.DataSource.getProperty(aRes, "dbtype");
511                        var pfid = this.DataSource.getProperty(aRes, "pfid");
512                        var param = {
513                                fid       : fid,
514                                fid_style : fid_style,
515                                dbtype    : dbtype,
516                                resource  : aRes,
517                                pfid      : pfid
518                        };
519                        if(!this._progressWindow){
520                                var x = screen.width;
521                                var y = screen.height;
522                                this._progressWindow = window.openDialog(
523                                        "chrome://markingcollection/content/progress.xul",
524                                        "myProgress", "chrome,centerscreen,alwaysRaised,dependent=yes,left="+x+",top="+y, 
525                                        {status: this.STRING.getString("MSG_READING_DOCUMENTS") + "... [ "+ urls.length + " ]"});
526                        }
527                        if(this._progressWindow && !this._progressWindow.closed) this._progressWindow.focus();
528                        var self = this;
529                        setTimeout(function(){ self._readDocuments(param,urls); },100);
530                        bitsAutocacheService._refreshFlag = false;
531                        if(this.bitsItemView && this.bitsItemView.isChecked) this.bitsItemView._refreshFlag = false;
532                        bitsArticleNavigation.stopObserver();
533                        this.setWaitCursor(true);
534                }catch(e){
535                        this._dump("bitsTreeProjectService.readDocuments():"+e);
536                        if(this._progressWindow && !this._progressWindow.closed) this._progressWindow.close();
537                        this._progressWindow = null;
538                }
539        },
540
541/////////////////////////////////////////////////////////////////////
542        _readDocuments : function(aParam,aUrls){
543                try{
544                        var i;
545                        for(i=0;i<10 && aUrls.length>0;i++){
546                                var url = aUrls.shift();
547                                this._addURLText(aParam,url);
548                        }
549                        if(aUrls.length>0){
550                                var self = this;
551                                setTimeout(function(){ self._readDocuments(aParam,aUrls); },100);
552                                if(this._progressWindow && !this._progressWindow.closed && this._progressWindow.setStatus) this._progressWindow.setStatus(this.STRING.getString("MSG_READING_DOCUMENTS") + "... [ "+ aUrls.length + " ]");
553                        }else{
554                                if(this._progressWindow && !this._progressWindow.closed) this._progressWindow.close();
555                                this._progressWindow = null;
556                                bitsAutocacheService._refreshFlag = true;
557                                bitsAutocacheService.refresh();
558                                if(this.bitsItemView && this.bitsItemView.isChecked){
559                                        this.bitsItemView._refreshFlag = true;
560                                        this.bitsItemView.refresh();
561                                }else if(this.mcTreeViewModeService){
562                                        this.DataSource.flush();
563                                }
564                                bitsArticleNavigation.startObserver();
565                                this.setWaitCursor(false);
566                        }
567                }catch(e){
568                        this._dump("bitsTreeProjectService._readDocuments():"+e);
569                }
570        },
571
572/////////////////////////////////////////////////////////////////////
573        _addURLText : function(aParam, aURLString){
574                try{
575                        var rtn = false;
576                        var url = aURLString;
577                        var doc_url = url;
578                        var con_url = url;
579                        var parentID = aParam.fid;
580                        var style = aParam.fid_style;
581                        var dbtype = aParam.dbtype;
582                        var resource = aParam.resource;
583                        var pfid_order = this.Database.getMaxOrderFormPID(parentID);
584                        var rObj = this.Database.newObject(undefined,dbtype);
585                        if(rObj){
586                                rObj.pfid = parentID;
587                                rObj.doc_url = bitsAutocacheService.convertCacheURLToOriginalURL(doc_url);
588                                rObj.doc_title = rObj.doc_url;
589                                rObj.con_url = bitsAutocacheService.convertCacheURLToOriginalURL(con_url);
590                                rObj.oid_title = decodeURIComponent(this.Common.getFileName(url));
591                                if(rObj.oid_title == "") rObj.oid_title = decodeURIComponent(url);
592                                rObj.doc_title = rObj.oid_title;
593                                rObj.oid_mode = "0";
594                                try{ rObj.oid_type = this.Common.MIME.getTypeFromURI(this.Common.convertURLToObject(url)); }catch(e){ rObj.oid_type=null; }
595                                if(!rObj.oid_type) rObj.oid_type = "url";
596                                rObj.oid_txt = bitsAutocacheService.convertCacheURLToOriginalURL(url);
597                                rObj.oid_date = bitsAutocacheService.getURLTimeStampFormatDate(doc_url);
598                                rObj.pfid_order = ++pfid_order;
599                                rtn = this.Database.addObject(rObj,dbtype);
600                                if(rtn){
601                                        if(this.bitsItemView && this.bitsItemView.isChecked){
602                                        }else if(this.mcTreeViewModeService){
603                                                var newDCitem = this.Common.newItem();
604                                                newDCitem.id = rObj.oid;
605                                                newDCitem.about = this.DataSource.getAbout(rObj.oid,rObj.pfid,dbtype);
606                                                newDCitem.pfid = rObj.pfid;
607                                                newDCitem.type = "item";
608                                                newDCitem.title = rObj.oid_title;
609                                                newDCitem.editmode = rObj.oid_mode;
610                                                newDCitem.uri = rObj.doc_url;
611                                                newDCitem.date = rObj.oid_date;
612                                                newDCitem.dbtype = dbtype;
613                                                if(url.indexOf("file://") == 0){
614                                                        newDCitem.title = rObj.oid_title;
615                                                }else{
616                                                        newDCitem.icon = this.Database.getFavicon(rObj.doc_url,dbtype);
617                                                }
618                                                var aParName = this.DataSource.getID2About(parentID,aParam.pfid,dbtype);
619                                                var newRes = this.DataSource.addItem(newDCitem, aParName, -1, dbtype);
620                                        }
621                                }
622                                rObj = undefined;
623                        }
624                }catch(ex){
625                        bitsMarkingCollection._dump("bitsMarkingCollection.addURLText():"+ex);
626                }
627                return rtn;
628        },
629
630/////////////////////////////////////////////////////////////////////
631        _getDictionaryDir : function(aDBtype){
632                if(aDBtype == undefined) return undefined;
633                var dir = this.Common.getExtensionDir().clone();
634                dir.append("dictionary");
635                dir.append(aDBtype);
636                return dir;
637        },
638
639/////////////////////////////////////////////////////////////////////
640        _getDictionaryFile : function(aID,aDBtype){
641                bitsMarkingCollection._dump("CALLED _getDictionaryFile():");
642                if(aID == undefined || aDBtype == undefined) return undefined;
643                var file = this._getDictionaryDir(aDBtype);
644                if(!file) return undefined;
645                file.append(aID+".xml");
646                return file;
647        },
648
649/////////////////////////////////////////////////////////////////////
650        _createDictionaryXML : function(){
651                var parser = new DOMParser();
652                var xmldoc = parser.parseFromString("<DICTIONARY/>", "text/xml");
653                parser = undefined;
654                if(xmldoc && xmldoc.documentElement.nodeName == "parsererror") xmldoc = undefined;
655                return xmldoc;
656        },
657
658/////////////////////////////////////////////////////////////////////
659        _getDictionaryXML : function(aID,aDBtype){
660                if(aID == undefined || aDBtype == undefined) return undefined;
661                var file = this._getDictionaryFile(aID,aDBtype);
662                var content = this.readFile(file);
663                if(!content || content == "") return undefined;
664                var parser = new DOMParser();
665                var xmldoc = parser.parseFromString(content, "text/xml");
666                parser = undefined;
667                if(xmldoc && xmldoc.documentElement.nodeName == "parsererror") xmldoc = undefined;
668                return xmldoc;
669        },
670
671/////////////////////////////////////////////////////////////////////
672        _putDictionaryXML : function(aID,aDBtype,aXMLDoc){
673                if(aID == undefined || aDBtype == undefined || aXMLDoc == undefined) return undefined;
674                var file = this._getDictionaryFile(aID,aDBtype);
675                var s = new XMLSerializer();
676                var content = s.serializeToString(aXMLDoc);
677                s = undefined;
678                return this.writeFile(file,content);
679        },
680
681/////////////////////////////////////////////////////////////////////
682        makeDictionary : function(aEvent){
683                var mcTreeHandler = null;
684                if(this.mcTreeHandler) mcTreeHandler = this.mcTreeHandler;
685                if(!mcTreeHandler) return undefined;
686                var aRes = mcTreeHandler.resource;
687                if(!aRes) return undefined;
688                if(this._makeDictionary(aRes)){
689                        this.Common.alert(this.STRING.getString("SUCCEEDED_DICTIONARY_UPDATE"));
690                }else{
691                        this.Common.alert(this.STRING.getString("ALERT_DICTIONARY_UPDATE"));
692                }
693        },
694
695/////////////////////////////////////////////////////////////////////
696        _makeDictionary : function(aRes){
697                var fid = this.DataSource.getProperty(aRes, "id");
698                var dbtype = this.DataSource.getProperty(aRes, "dbtype");
699                var fid_title = this.DataSource.getProperty(aRes, "title");
700                var fid_style = this.DataSource.getProperty(aRes, "style");
701                var fid_note = "";
702                var folders = this.Database.getFolder({fid:fid},dbtype);
703                if(folders){
704                        if(folders[0].fid_property && folders[0].fid_property != ""){
705                                try{
706                                        var parser = new DOMParser();
707                                        var xmldoc = parser.parseFromString(folders[0].fid_property, "text/xml");
708                                        parser = undefined;
709                                }catch(ex){}
710                                if(xmldoc && xmldoc.documentElement.nodeName == "parsererror") xmldoc = undefined;
711                                if(xmldoc){
712                                        var elems = xmldoc.getElementsByTagName("TAG");
713                                        if(elems && elems.length>0) fid_title = elems[0].textContent;
714                                        elems = undefined;
715                                        elems = xmldoc.getElementsByTagName("NOTE");
716                                        if(elems && elems.length>0) fid_note = elems[0].textContent;
717                                        elems = undefined;
718                                        xmldoc = undefined;
719                                }
720                        }
721                }
722                var xmldoc = this._getDictionaryXML(fid,dbtype);
723                if(!xmldoc) xmldoc = this._createDictionaryXML();
724                if(!xmldoc) return undefined;
725                /* TITLE゚レメント䜜成 */
726                var titleElem = xmldoc.createTextNode(fid_title);
727                var elems = xmldoc.documentElement.getElementsByTagName("TITLE");
728                if(elems && elems.length > 0){
729                        if(elems[0].hasChildNodes()){
730                                elems[0].replaceChild(titleElem,elems[0].firstChild);
731                        }else{
732                                elems[0].appendChild(titleElem);
733                        }
734                }else{
735                        var elem = xmldoc.createElement("TITLE");
736                        if(elem){
737                                elem.appendChild(titleElem);
738                                xmldoc.documentElement.appendChild(elem);
739                        }
740                }
741                /* NOTE゚レメント䜜成 */
742                var noteElem = xmldoc.createTextNode(fid_note);
743                var elems = xmldoc.documentElement.getElementsByTagName("NOTE");
744                if(elems && elems.length > 0){
745                        if(elems[0].hasChildNodes()){
746                                elems[0].replaceChild(noteElem,elems[0].firstChild);
747                        }else{
748                                elems[0].appendChild(noteElem);
749                        }
750                }else{
751                        var elem = xmldoc.createElement("NOTE");
752                        if(elem){
753                                elem.appendChild(noteElem);
754                                xmldoc.documentElement.appendChild(elem);
755                        }
756                }
757                /* STYLE゚レメント䜜成 */
758                var styleElem = xmldoc.createTextNode(fid_style);
759                var elems = xmldoc.documentElement.getElementsByTagName("STYLE");
760                if(elems && elems.length > 0){
761                        if(elems[0].hasChildNodes()){
762                                elems[0].replaceChild(styleElem,elems[0].firstChild);
763                        }else{
764                                elems[0].appendChild(styleElem);
765                        }
766                }else{
767                        var elem = xmldoc.createElement("STYLE");
768                        if(elem){
769                                elem.appendChild(styleElem);
770                                xmldoc.documentElement.appendChild(elem);
771                        }
772                }
773                /* TERMS゚レメント䜜成 */
774                var terms;
775                var elems = xmldoc.documentElement.getElementsByTagName("TERMS");
776                if(elems && elems.length > 0){
777                        terms = elems[0];
778                }else{
779                        terms = xmldoc.createElement("TERMS");
780                        if(terms) xmldoc.documentElement.appendChild(terms);
781                }
782                if(!terms) return undefined;
783                var i;
784                var termhash = {};
785                var elems = terms.getElementsByTagName("TERM");
786                for(i=0;i<elems.length;i++){
787                        if(!elems[i].textContent) continue;
788                        termhash[elems[i].textContent.toLowerCase()] = i;
789                }
790                var objs = this.Database.getObject({pfid:fid},dbtype);
791                if(objs){
792                        for(i=0;i<objs.length;i++){
793                                var term = objs[i].oid_title.replace(/^\s*/mg,"").replace(/\s*$/mg,"");
794                                var key = term.toLowerCase();
795                                if(termhash[key] != undefined) continue;
796                                termhash[key] = i;
797                                var elem = xmldoc.createElement("TERM");
798                                if(!this._caseSensitive_exp.test(term)) term = term.toLowerCase();
799                                var termElem = xmldoc.createTextNode(term);
800                                if(!elem || !termElem) continue;
801                                elem.setAttribute("date",objs[i].oid_date);
802                                terms.appendChild(elem);
803                                elem.appendChild(termElem);
804                        }
805                }
806                if(this._putDictionaryXML(fid,dbtype,xmldoc)){
807                        return xmldoc;
808                }else{
809                        return undefined;
810                }
811        },
812
813/////////////////////////////////////////////////////////////////////
814        applyDictionary : function(aEvent){
815                var mcTreeHandler = null;
816                if(this.mcTreeHandler) mcTreeHandler = this.mcTreeHandler;
817                if(!mcTreeHandler) return;
818                var aRes = mcTreeHandler.resource;
819                if(!aRes) return;
820
821                var doc = this.gBrowser.contentDocument;
822                var doc_url = this.Common.getURLStringFromDocument(doc);
823                if(!bitsAutocacheService.isMarking(doc_url)) return undefined;
824
825                var dbtype = this.DataSource.getProperty(aRes, "dbtype");
826                this._oid = this.Database._oidIdentify(dbtype,bitsObjectMng.Common.getTimeStamp());
827
828                if(!this._progressWindow){
829                        var x = screen.width;
830                        var y = screen.height;
831                        this._progressWindow = window.openDialog(
832                                "chrome://markingcollection/content/progress_determined.xul",
833                                "myProgress", "chrome,centerscreen,alwaysRaised,dependent=yes,left="+x+",top="+y, 
834                                {status: "Loading Dictionary..."});
835                }
836                if(this._progressWindow && !this._progressWindow.closed){
837                        if(this._progressWindow.setStatus) this._progressWindow.setStatus("Loading Dictionary...");
838                        this._progressWindow.focus();
839                }
840                var self = this;
841                if(this._applytimer) clearTimeout(this._applytimer);
842                this._applytimer = setTimeout(function(){ self._applyDictionaryReadingXMLDictionary(doc,aRes); },1000);
843                this.setWaitCursor(true);
844        },
845
846/////////////////////////////////////////////////////////////////////
847        _applyDictionaryReadingXMLDictionary : function(doc,aRes){
848                var xmldocs = [];
849                var i,j;
850                var foldResList = this.DataSource.flattenResources(aRes, 1, true);
851                for(i=0;i<foldResList.length;i++){
852                        var fid = this.DataSource.getProperty(foldResList[i], "id");
853                        var style = this.DataSource.getProperty(foldResList[i], "style");
854                        var dbtype = this.DataSource.getProperty(foldResList[i], "dbtype");
855                        var xmldoc = this._getDictionaryXML(fid,dbtype);
856                        if(!xmldoc){
857                                var title = this.DataSource.getProperty(foldResList[i], "title");
858                                if(this.Common.confirm("[ "+title+" ]\n"+this.STRING.getString("CONFIRM_DICTIONARY_UPDATE"))) xmldoc = this._makeDictionary(foldResList[i]);
859                        }
860                        if(xmldoc) xmldocs.push({doc:xmldoc,fid:fid,dbtype:dbtype,style:style});
861                }
862                var selection = doc.defaultView.getSelection();
863                if(!selection) return;
864                selection.removeAllRanges();
865                if(this._progressWindow && !this._progressWindow.closed){
866                        if(this._progressWindow.setStatus) this._progressWindow.setStatus("Sort Dictionary...");
867                        this._progressWindow.focus();
868                }
869                var self = this;
870                this._applytimer = setTimeout(function(){ self._applyDictionaryLoadingDictionary(doc,xmldocs); },1000);
871        },
872
873/////////////////////////////////////////////////////////////////////
874        _applyDictionaryLoadingDictionary : function(doc,xmldocs){
875                var rangeCount = 0;
876                var termhash = {};
877                var termarray = [];
878                var j;
879                while(xmldocs && xmldocs.length>0){
880                        var xmldocobj = xmldocs.shift();
881                        var xmldoc = xmldocobj.doc;
882                        /* TERMS゚レメント䜜成 */
883                        var terms = xmldoc.documentElement.getElementsByTagName("TERMS")[0];
884                        if(!terms){
885                                terms = xmldoc.createElement("TERMS");
886                                if(terms) xmldoc.documentElement.appendChild(terms);
887                        }
888                        if(!terms) continue;
889                        var elems = terms.getElementsByTagName("TERM");
890                        if(elems.length == 0) continue;
891                        for(j=0;j<elems.length;j++){
892                                if(!elems[j].textContent) continue;
893                                if(elems[j].hasAttribute("delete")) continue;
894                                if(elems[j].hasAttribute("exception")) continue;
895                                var key = elems[j].textContent.toLowerCase();
896                                if(termhash[key] != undefined) continue;
897                                termhash[key] = j;
898                                termarray.push({
899                                        term : elems[j].textContent,
900                                        obj  : xmldocobj,
901                                });
902                        }
903                }
904                termhash = undefined;
905                if(termarray.length>0){
906                        termarray.sort(
907                                function(a,b){
908                                        if(a.term.length>b.term.length) return -1;
909                                        if(a.term.length<b.term.length) return 1;
910                                        return 0;
911                                }
912                        );
913                        if(this._progressWindow && !this._progressWindow.closed){
914                                if(this._progressWindow.setProgress) this._progressWindow.setProgress(0);
915                                if(this._progressWindow.setStatus) this._progressWindow.setStatus(this.STRING.getString("MSG_DOCUMENTATION_TO_MATCH_THE_DICTIONARY") + "... [ 0% ], Remaining term:[ "+ termarray.length + " ], Meet term:[ "+ rangeCount + " ]");
916                                if(this._progressWindow.setCallback) this._progressWindow.setCallback(this._applyDictionaryCancel);
917                                this._progressWindow.focus();
918                        }
919                        var self = this;
920                        this._applytimer = setTimeout(function(){ self._applyDictionary(doc,termarray,termarray.length); },100);
921                        bitsAutocacheService._refreshFlag = false;
922                        if(this.bitsItemView && this.bitsItemView.isChecked) this.bitsItemView._refreshFlag = false;
923                        bitsArticleNavigation.stopObserver();
924                }else{
925                        if(this._progressWindow && !this._progressWindow.closed) this._progressWindow.close();
926                        this._progressWindow = null;
927                        this.setWaitCursor(false);
928                }
929        },
930
931/////////////////////////////////////////////////////////////////////
932        _applyDictionaryCancel : function(aEvent){
933                var self = bitsTreeProjectService;
934                if(self._applytimer) clearTimeout(self._applytimer);
935                self._applytimer = null;
936                if(self._progressWindow && !self._progressWindow.closed) self._progressWindow.close();
937                self._progressWindow = null;
938                bitsAutocacheService._refreshFlag = true;
939                bitsAutocacheService.refresh();
940                if(self.bitsItemView && self.bitsItemView.isChecked){
941                        self.bitsItemView._refreshFlag = true;
942                        self.bitsItemView.refresh();
943                }else if(self.mcTreeViewModeService){
944                        self.mcTreeViewModeService.rebuild();
945                }
946                bitsArticleNavigation.startObserver();
947                self.setWaitCursor(false);
948        },
949
950/////////////////////////////////////////////////////////////////////
951        _applyDictionary : function(aDoc,aTermArray,aMaxTerm,aRangeCount){
952                var self = this;
953                if(aRangeCount == undefined) aRangeCount = 0;
954                if(aTermArray.length == 0 || !this._applytimer){
955                        if(this._progressWindow && !this._progressWindow.closed) this._progressWindow.close();
956                        this._progressWindow = null;
957                        setTimeout(function(){
958                                self.Common.alert("Term has [ "+ aRangeCount + " ] matches.");
959                                if(self.bitsItemView && self.bitsItemView.isChecked){
960                                        self.bitsItemView._refreshFlag = true;
961                                        self.bitsItemView.refresh();
962                                }else if(self.mcTreeViewModeService){
963                                        bitsMarkingCollection._dump("bitsTreeProjectService._applyDictionary(1)");
964                                        self.mcTreeViewModeService.rebuild();
965                                        bitsMarkingCollection._dump("bitsTreeProjectService._applyDictionary(2)");
966                                }
967                        },100);
968                        bitsAutocacheService._refreshFlag = true;
969                        bitsAutocacheService.refresh();
970                        var url = this.Common.getURLStringFromDocument(aDoc);
971                        setTimeout(function(){
972                                var rtn= bitsAutocacheService.selectRowFromURL(url);
973                                if(!rtn) setTimeout(function(){ bitsAutocacheService.selectRowFromURL(url); },2000);
974                        },500);
975                        bitsArticleNavigation.startObserver();
976                        this.setWaitCursor(false);
977                        return;
978                }
979                var maxcnt = aMaxTerm>=20 ? parseInt(aMaxTerm/20) : aMaxTerm;
980                if(maxcnt>100) maxcnt = 100;
981                var doc = aDoc;
982                var findRange = this._getFindRange();
983                var j;
984                for(j=0;j<maxcnt && aTermArray.length>0;j++){
985                        var termobj = aTermArray.shift();
986                        var findtext = termobj.term;
987                        findRange.caseSensitive = this._caseSensitive_exp.test(findtext);
988                        var docRange = doc.createRange();
989                        docRange.selectNode(doc.body);
990                        var startRange = docRange.cloneRange();
991                        var stopRange = docRange.cloneRange();
992                        startRange.collapse(true);
993                        stopRange.collapse(false);
994                        var rangeCount = 0;
995                        var result;
996                        while((result = findRange.Find(findtext, docRange, startRange, stopRange))){
997                                if(result.endContainer != null &&
998                                         result.startContainer != null &&
999                                         result.endContainer.nodeType == Node.TEXT_NODE &&
1000                                         result.startContainer.nodeType == Node.TEXT_NODE &&
1001                                         !this._isNodeInputNodeOrChildOf(result.startContainer) &&
1002                                         !this._isNodeInputNodeOrChildOf(result.endContainer)) {
1003                                        var startChar = null;
1004                                        if(result.startOffset > 0) startChar = result.startContainer.nodeValue.charAt(result.startOffset - 1);
1005                                        var endChar = result.endContainer.nodeValue.charAt(result.endOffset);
1006                                        if(!this._isWordCharacter(startChar) && !this._isWordCharacter(endChar)){
1007                                                if(!((result.startContainer.parentNode && this._marker_exp.test(result.startContainer.parentNode.id)) || (result.endContainer.parentNode && this._marker_exp.test(result.endContainer.parentNode.id)))){
1008                                                        var rtn = this._addSelectedText(
1009                                                                aDoc,
1010                                                                {
1011                                                                        fid       : termobj.obj.fid,
1012                                                                        fid_style : termobj.obj.style,
1013                                                                        dbtype    : termobj.obj.dbtype
1014                                                                },result);
1015                                                        if(rtn && rtn[0].id){
1016                                                                var elem = aDoc.getElementById(rtn[0].id);
1017                                                                if(elem){
1018                                                                        result.selectNode(elem);
1019                                                                        rangeCount++;
1020                                                                }
1021                                                        }
1022                                                }else{
1023                                                }
1024                                        }else{
1025                                        }
1026                                }
1027                                startRange = result;
1028                                startRange.collapse(false);
1029                        }
1030                        if(rangeCount>0){
1031                                aRangeCount += rangeCount;
1032                                break;
1033                        }
1034                }
1035                this._applytimer = setTimeout(function(){ self._applyDictionary(aDoc,aTermArray,aMaxTerm,aRangeCount); },100);
1036                if(this._progressWindow && !this._progressWindow.closed){
1037                        var p = (aMaxTerm-aTermArray.length)/aMaxTerm;
1038                        if(this._progressWindow.setProgress) this._progressWindow.setProgress( parseInt(p*100) );
1039                        if(this._progressWindow.setStatus) this._progressWindow.setStatus(this.STRING.getString("MSG_DOCUMENTATION_TO_MATCH_THE_DICTIONARY") + "... [ "+ parseInt(p*100) + "% ], Remaining term:[ "+ aTermArray.length + " ], Meet term:[ "+ aRangeCount + " ]");
1040                }
1041        },
1042
1043/////////////////////////////////////////////////////////////////////
1044        _addSelectedText : function(aDoc, aParName, aRange){
1045                try{
1046                        var parentID = aParName.fid;
1047                        var style = aParName.fid_style;
1048                        var dbtype = aParName.dbtype;
1049                        var pfid_order = this.Database.getMaxOrderFormPID(parentID);
1050                        var doc_url = this.Common.getURLStringFromDocument(aDoc);
1051                        bitsAutocacheService.createCache(doc_url);
1052                        var rtnContent = null;
1053                        var parser = new DOMParser();
1054                        var rtnNewObj = [];
1055                        var r;
1056                        var range = aRange.cloneRange();
1057                        if(range.startContainer.nodeType != range.startContainer.TEXT_NODE || range.endContainer.nodeType != range.endContainer.TEXT_NODE){
1058                                var docRange = range.cloneRange();
1059                                var startRange = range.cloneRange();
1060                                var stopRange = range.cloneRange();
1061                                startRange.collapse(true)
1062                                stopRange.collapse(false)
1063                                var xContext = range.toString().replace(/^\s*/g,"").replace(/\s*$/g,"");
1064                                var findRange = bitsMarker._getFindRange();
1065                                var result = findRange.Find(xContext, docRange, startRange, stopRange);
1066                                if(result) range = result.cloneRange();
1067                        }
1068                        var context = range.toString();
1069                        var startContainer = range.startContainer;
1070                        var startOffset = range.startOffset;
1071                        var endContainer = range.endContainer;
1072                        var endOffset = range.endOffset;
1073                        var stXPath = this.XPath.getOffsetFromParentNode(startContainer,startOffset);
1074                        var enXPath = this.XPath.getOffsetFromParentNode(endContainer,endOffset);
1075                        try{
1076                                var hyperAnchor = bitsHyperAnchor._getAnchorURL({node:startContainer,offset:startOffset,style:style,prefix:"b",contents:range.toString()},{node:endContainer,offset:endOffset,prefix:"e",contents:range.toString()});
1077                        }catch(ex3){
1078                                try{
1079                                        var hyperAnchor = bitsHyperAnchorDummy._getAnchorURL({node:startContainer,offset:startOffset,style:style,prefix:"b",contents:range.toString()},{node:endContainer,offset:endOffset,prefix:"e",contents:range.toString()});
1080                                }catch(ex3){ hyperAnchor = null; }
1081                        }
1082                        if(hyperAnchor) hyperAnchor = bitsAutocacheService.convertCacheURLToOriginalURL(hyperAnchor);
1083                        var con_url = this.Common.getURLStringFromDocument(stXPath.node.ownerDocument);
1084                        var rObj = {};
1085                        rObj.pfid = parentID;
1086                        rObj.doc_url = bitsAutocacheService.convertCacheURLToOriginalURL(doc_url);
1087                        rObj.con_url = bitsAutocacheService.convertCacheURLToOriginalURL(con_url);
1088                        rObj.doc_title = this.gBrowser.contentDocument.title?this.gBrowser.contentDocument.title:rObj.doc_url;
1089                        rObj.bgn_dom = stXPath.xpath + "("+stXPath.offset+")" + "("+stXPath.type+")";
1090                        rObj.end_dom = enXPath.xpath + "("+enXPath.offset+")" + "("+enXPath.type+")";
1091                        rObj.oid_title = this.Common.exceptCode(context.replace(/[\r\n\t]+/mg," ").replace(/\s{2,}/mg," "));
1092                        rObj.oid_txt = this.Common.exceptCode(context.replace(/\s+$/mg,"").replace(/^\s+/mg,""));
1093                        rObj.oid_date = bitsAutocacheService.getURLTimeStampFormatDate(doc_url);
1094                        rObj.oid_mode = "0";
1095                        rObj.con_doc = stXPath.node.ownerDocument;
1096                        var frame_name;
1097                        if(doc_url != con_url){
1098                                var win = this.gBrowser.contentWindow;
1099                                if(win.frames != null){
1100                                        var i;
1101                                        for(i=0;i<win.frames.length;i++){
1102                                                if(this.Common.getURLStringFromDocument(win.frames[i].document) != con_url) continue;
1103                                                frame_name = win.frames[i].name;
1104                                                break;
1105                                        }
1106                                }
1107                        }
1108                        rObj.oid_type = "text";
1109                        if(hyperAnchor || frame_name){
1110                                var xmldoc = parser.parseFromString("<PROPERTY/>","text/xml");
1111                                if(xmldoc && xmldoc.documentElement.nodeName == "parsererror") xmldoc = undefined;
1112                                if(xmldoc){
1113                                        if(xmldoc.documentElement){
1114                                                if(frame_name){
1115                                                        var xmlnode = xmldoc.createElement("FRAME_NAME");
1116                                                        if(xmlnode){
1117                                                                xmlnode.appendChild(xmldoc.createTextNode(frame_name));
1118                                                                xmldoc.documentElement.appendChild(xmlnode);
1119                                                        }
1120                                                }
1121                                                if(hyperAnchor){
1122                                                        var xmlnode = xmldoc.createElement("HYPER_ANCHOR");
1123                                                        if(xmlnode){
1124                                                                xmlnode.appendChild(xmldoc.createTextNode(hyperAnchor));
1125                                                                xmldoc.documentElement.appendChild(xmlnode);
1126                                                        }
1127                                                }
1128                                        }
1129                                        var s = new XMLSerializer();
1130                                        rObj.oid_property = s.serializeToString(xmldoc);
1131                                        s = undefined;
1132                                }
1133                        }
1134                        rtnNewObj.unshift(rObj);
1135                        parser = undefined;
1136                        for(r=0;r<rtnNewObj.length;r++){
1137                                var rObj = this.Database.newObject(this._oid);
1138                                for(var key in rtnNewObj[r]){
1139                                        if(key == "oid") continue;
1140                                        if(key == "con_doc") continue;
1141                                        rObj[key] = rtnNewObj[r][key];
1142                                }
1143                                rObj.pfid_order = ++pfid_order;
1144                                this._oid = parseInt(rObj.oid)-1;
1145                                var rtn = this.Database.addObject(rObj,dbtype);
1146                                if(!rtn) rObj = undefined;
1147                                if(!rObj) continue;
1148                                try{
1149                                        rtnContent = bitsMarker.xPathMarker(
1150                                                rtnNewObj[r].con_doc,
1151                                                {
1152                                                        start   : rObj.bgn_dom,
1153                                                        end     : rObj.end_dom,
1154                                                        context : rObj.oid_txt,
1155                                                        con_url : this.Common.getURLStringFromDocument(rtnNewObj[r].con_doc)
1156                                                },
1157                                                {
1158                                                        id     : rObj.oid,
1159                                                        dbtype : dbtype,
1160                                                        pfid   : rObj.pfid,
1161                                                        style  : style
1162                                                }
1163                                        );
1164                                        if(!rtnContent){
1165                                                var rtn = this.Database.removeObject(rObj,dbtype);
1166                                        }
1167                                }catch(ex2){
1168                                        bitsMarkingCollection._dump("bitsTreeProjectService._addSelectedText():"+ex2);
1169                                        rtnContent = null;
1170                                }
1171                        }
1172                }catch(e){
1173                        bitsMarkingCollection._dump("bitsTreeProjectService._addSelectedText():"+e);
1174                        rtnContent = null;
1175                }
1176                return rtnContent;
1177        },
1178
1179/////////////////////////////////////////////////////////////////////
1180        _getFindRange : function(){
1181                var findRange = Components.classes["@mozilla.org/embedcomp/rangefind;1"].createInstance();
1182                if(!findRange || !(findRange instanceof Components.interfaces.nsIFind)) return undefined;
1183                findRange.caseSensitive = false;
1184                findRange.findBackwards = false;
1185                return findRange;
1186        },
1187
1188/////////////////////////////////////////////////////////////////////
1189        _isWordCharacter : function(ch){
1190                if(ch == null ||  typeof ch != "string" || ch.length != 1) return false;
1191                var code = ch.charCodeAt(0);
1192                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;
1193        },
1194
1195/////////////////////////////////////////////////////////////////////
1196        _isNodeInputNodeOrChildOf : function(node){
1197                if(node.nodeName.toUpperCase() == "INPUT") return true;
1198                if(node.parentNode != null) return this._isNodeInputNodeOrChildOf(node.parentNode);
1199                return false;
1200        },
1201
1202/////////////////////////////////////////////////////////////////////
1203        readDictionary : function(aEvent){
1204                try{
1205                        var mcTreeHandler = null;
1206                        if(this.mcTreeHandler) mcTreeHandler = this.mcTreeHandler;
1207                        if(!mcTreeHandler) return;
1208                        var aRes = mcTreeHandler.resource;
1209                        if(!aRes) return;
1210                        var file = this.getReadFile();
1211                        if(file){
1212                                var text_content = null;
1213                                var r_xmldoc = null;
1214                                try{ var mimetype = this.Common.MIME.getTypeFromFile(file); }catch(e){ mimetype=null; }
1215                                if(mimetype == "text/plain"){
1216                                        text_content = this.readFile(file);
1217                                }else if(mimetype == "text/xml"){
1218                                        text_content = this.readFile(file);
1219                                        var parser = new DOMParser();
1220                                        r_xmldoc = parser.parseFromString(text_content, "text/xml");
1221                                        parser = undefined;
1222                                        if(r_xmldoc && r_xmldoc.documentElement.nodeName == "parsererror") r_xmldoc = undefined;
1223                                        if(!r_xmldoc){
1224                                                this.Common.alert("Read Error!!["+file.path+"]");
1225                                                return;
1226                                        }
1227                                }else{
1228                                        this.Common.alert("Unknown MIME Type!");
1229                                        return;
1230                                }
1231                                var fid = this.DataSource.getProperty(aRes, "id");
1232                                var fid_style = this.DataSource.getProperty(aRes, "style");
1233                                var dbtype = this.DataSource.getProperty(aRes, "dbtype");
1234                                var xmldoc = this._getDictionaryXML(fid,dbtype);
1235                                if(!xmldoc) xmldoc = this._createDictionaryXML();
1236                                if(!xmldoc) return;
1237                                var terms = xmldoc.documentElement.getElementsByTagName("TERMS")[0];
1238                                if(!terms){
1239                                        terms = xmldoc.createElement("TERMS");
1240                                        if(terms) xmldoc.documentElement.appendChild(terms);
1241                                }
1242                                var elems = terms.getElementsByTagName("TERM");
1243                                if(r_xmldoc){
1244                                }else if(text_content){
1245                                        var dd = new Date;
1246                                        dd.setTime(file.lastModifiedTime);
1247                                        var y = dd.getFullYear();
1248                                        var m = dd.getMonth() + 1; if(m < 10) m = "0" + m;
1249                                        var d = dd.getDate();      if(d < 10) d = "0" + d;
1250                                        var h = dd.getHours();     if(h < 10) h = "0" + h;
1251                                        var i = dd.getMinutes();   if(i < 10) i = "0" + i;
1252                                        var s = dd.getSeconds();   if(s < 10) s = "0" + s;
1253                                        var date =  m.toString() + "/" + d.toString() + "/" + y.toString() + " " + h.toString() + ":" + i.toString() + ":" + s.toString();
1254                                        var text_arr = text_content.replace(/\x0D\x0A|\x0D|\x0A/g,"\n").split("\n");
1255                                        if(!this._progressWindow){
1256                                                var x = screen.width;
1257                                                var y = screen.height;
1258                                                this._progressWindow = window.openDialog(
1259                                                        "chrome://markingcollection/content/progress_determined.xul",
1260                                                        "myProgress", "chrome,centerscreen,alwaysRaised,dependent=yes,left="+x+",top="+y, 
1261                                                        {
1262                                                                status   : this.STRING.getString("MSG_READING_DICTIONARY") + "...",
1263                                                                progress : 0,
1264                                                                callback : function(aEvent){ self._readDictionaryCancel(aRes,xmldoc);}
1265                                                        });
1266                                        }
1267                                        var self = this;
1268                                        if(this._progressWindow && !this._progressWindow.closed) this._progressWindow.focus();
1269                                        if(this._applytimer) clearTimeout(this._applytimer);
1270                                        this._applytimer = setTimeout(function(){ self._readDictionaryLoadXMLDictionary(aRes,xmldoc,elems,text_arr,date); },0);
1271                                        this.setWaitCursor(true);
1272                                }
1273                        }
1274                }catch(e){
1275                        this._dump("bitsTreeProjectService.readDictionary():"+e);
1276                }
1277        },
1278
1279/////////////////////////////////////////////////////////////////////
1280        _readDictionaryCancel : function(aRes,aXMLDoc){
1281                var self = bitsTreeProjectService;
1282                if(self._applytimer) clearTimeout(self._applytimer);
1283                self._applytimer = null;
1284                var fid = self.DataSource.getProperty(aRes, "id");
1285                var dbtype = self.DataSource.getProperty(aRes, "dbtype");
1286                self._putDictionaryXML(fid,dbtype,aXMLDoc);
1287                if(self._progressWindow && !self._progressWindow.closed) self._progressWindow.close();
1288                self._progressWindow = null;
1289                this.setWaitCursor(false);
1290        },
1291
1292/////////////////////////////////////////////////////////////////////
1293        _readDictionaryLoadXMLDictionary : function(aRes,aXMLDoc,aTermElems,aTermArray,aDateString,aTermHash,aIndex){
1294                var self = this;
1295                if(aXMLDoc == undefined) return;
1296                if(aTermHash == undefined) aTermHash = {};
1297                if(aIndex == undefined) aIndex = 0;
1298                var i = aIndex;
1299                for(;i<aIndex+50 && i<aTermElems.length;i++){
1300                        if(!aTermElems[i].textContent) continue;
1301                        if(this._caseSensitive_exp.test(aTermElems[i].textContent)){
1302                                aTermHash[aTermElems[i].textContent] = i+1;
1303                        }else{
1304                                aTermHash[aTermElems[i].textContent.toLowerCase()] = i+1;
1305                        }
1306                }
1307                aIndex = i;
1308                if(aIndex<aTermElems.length){
1309                        this._applytimer = setTimeout(function(){ self._readDictionaryLoadXMLDictionary(aRes,aXMLDoc,aTermElems,aTermArray,aDateString,aTermHash,aIndex); },0);
1310                        return;
1311                }else{
1312                        if(this._progressWindow && !this._progressWindow.closed){
1313                                if(this._progressWindow.setStatus) this._progressWindow.setStatus(this.STRING.getString("MSG_READING_DICTIONARY") + "... [ 0% ][ "+ aTermArray.length + " ]");
1314                        }
1315                        this._applytimer = setTimeout(function(){ self._readDictionary(aTermArray,aTermHash,aDateString,aRes,aXMLDoc,aTermArray.length); },0);
1316                }
1317        },
1318
1319/////////////////////////////////////////////////////////////////////
1320        _readDictionary : function(aTermArray,aTermHash,aDateString,aRes,aXMLDoc,aMaxTerm){
1321                var terms = aXMLDoc.documentElement.getElementsByTagName("TERMS")[0];
1322                if(!terms) return;
1323                var i,j;
1324                for(i=0,j=0;i<50 && j<250 && aTermArray.length>0;j++){
1325                        var term = aTermArray.shift();
1326                        term = term.replace(/^\s*/mg,"").replace(/\s*$/mg,"");
1327                        var key;
1328                        if(this._caseSensitive_exp.test(term)){
1329                                key = term;
1330                        }else{
1331                                key = term.toLowerCase();
1332                        }
1333                        if(aTermHash[key] != undefined) continue;
1334                        i++;
1335                        aTermHash[key] = i;
1336                        var elem = aXMLDoc.createElement("TERM");
1337                        if(!this._caseSensitive_exp.test(term)) term = term.toLowerCase();
1338                        var termElem = aXMLDoc.createTextNode(term);
1339                        if(!elem || !termElem) continue;
1340                        elem.setAttribute("date",aDateString);
1341                        terms.appendChild(elem);
1342                        elem.appendChild(termElem);
1343                }
1344                var self = this;
1345                if(aTermArray.length == 0){
1346                        var fid = this.DataSource.getProperty(aRes, "id");
1347                        var dbtype = this.DataSource.getProperty(aRes, "dbtype");
1348                        this._putDictionaryXML(fid,dbtype,aXMLDoc);
1349                        if(this._progressWindow && !this._progressWindow.closed) this._progressWindow.close();
1350                        this._progressWindow = null;
1351                        setTimeout(function(){ self.Common.alert(self.STRING.getString("SUCCEEDED_READING_DICTIONARY")); },100);
1352                        this.setWaitCursor(false);
1353                        return;
1354                }
1355                this._applytimer = setTimeout(function(){ self._readDictionary(aTermArray,aTermHash,aDateString,aRes,aXMLDoc,aMaxTerm); },0);
1356                if(this._progressWindow && !this._progressWindow.closed){
1357                        var p = (aMaxTerm-aTermArray.length)/aMaxTerm;
1358                        if(this._progressWindow.setProgress) this._progressWindow.setProgress( parseInt(p*100) );
1359                        if(this._progressWindow.setStatus) this._progressWindow.setStatus(this.STRING.getString("MSG_READING_DICTIONARY") + "... [ "+ parseInt(p*100) + "% ][ "+ aTermArray.length + " ]");
1360                }
1361        },
1362
1363/////////////////////////////////////////////////////////////////////
1364        saveDictionary : function(aEvent){
1365                var mcTreeHandler = null;
1366                if(this.mcTreeHandler) mcTreeHandler = this.mcTreeHandler;
1367                if(!mcTreeHandler) return;
1368                var aRes = mcTreeHandler.resource;
1369                if(!aRes) return;
1370                var fid = this.DataSource.getProperty(aRes, "id");
1371                var title = this.DataSource.getProperty(aRes, "title");
1372                var dbtype = this.DataSource.getProperty(aRes, "dbtype");
1373                var xmldoc = this._getDictionaryXML(fid,dbtype);
1374                if(!xmldoc){
1375                        var title = this.DataSource.getProperty(aRes, "title");
1376                        if(this.Common.confirm("[ "+title+" ]\n"+this.STRING.getString("CONFIRM_DICTIONARY_UPDATE"))) xmldoc = this._makeDictionary(aRes);
1377                }
1378                if(!xmldoc) return;
1379                var dataArray = null;
1380                var terms = xmldoc.documentElement.getElementsByTagName("TERMS")[0];
1381                if(terms){
1382                        var i;
1383                        var termhash = {};
1384                        var elems = terms.getElementsByTagName("TERM");
1385                        if(elems.length>0) dataArray = [];
1386                        for(i=0;i<elems.length;i++){
1387                                if(elems[i].hasAttribute("exception")) continue;
1388                                if(!elems[i].textContent) continue;
1389                                if(termhash[elems[i].textContent]) continue;
1390                                termhash[elems[i].textContent] = true;
1391                                dataArray.push(elems[i].textContent);
1392                        }
1393                }
1394                if(dataArray){
1395                        var file = this.getSaveFile(title);
1396                        if(file){
1397                                this.writeFile(file,dataArray.join("\n")+"\n");
1398                                this.Common.alert(this.STRING.getString("SUCCEEDED_DICTIONARY_SAVE"));
1399                        }
1400                        dataArray = undefined;
1401                }else{
1402                        this.Common.alert(this.STRING.getString("ALERT_DICTIONARY_NO_TERMS"));
1403                }
1404        },
1405
1406/////////////////////////////////////////////////////////////////////
1407        mngDictionary : function(aEvent){
1408                var mcTreeHandler = null;
1409                if(this.mcTreeHandler) mcTreeHandler = this.mcTreeHandler;
1410                if(!mcTreeHandler) return;
1411                var aRes = mcTreeHandler.resource;
1412                if(!aRes) return;
1413                var fid = this.DataSource.getProperty(aRes, "id");
1414                var style = this.DataSource.getProperty(aRes, "style");
1415                var title = this.DataSource.getProperty(aRes, "title");
1416                var dbtype = this.DataSource.getProperty(aRes, "dbtype");
1417                var xmldoc = this._getDictionaryXML(fid,dbtype);
1418                if(!xmldoc && this.Common.confirm("[ "+title+" ]\n"+this.STRING.getString("CONFIRM_DICTIONARY_UPDATE"))) xmldoc = this._makeDictionary(aRes);
1419                if(!xmldoc){
1420                        this.Common.alert(this.STRING.getString("ALERT_DICTIONARY_UPDATE"));
1421                        return;
1422                }
1423                var result = {
1424                        accept    : false,
1425                        fid       : fid,
1426                        fid_style : style,
1427                        fid_title : title,
1428                        dbtype    : dbtype,
1429                        xmldoc    : xmldoc,
1430                };
1431                window.openDialog("chrome://markingcollection/content/treeprojectDicMngDialog.xul", "", "chrome,centerscreen,modal", result);
1432                if(result.accept){
1433                        this._putDictionaryXML(fid,dbtype,result.xmldoc);
1434                }
1435        },
1436
1437/////////////////////////////////////////////////////////////////////
1438        getFolder : function(){
1439                if(!this.mcTreeHandler) return undefined;
1440                var curIdx = this.mcTreeHandler.TREE.currentIndex;
1441                if(curIdx<0) return undefined;
1442                if(!this.mcTreeHandler.TREE.view.isContainer(curIdx)) return undefined;
1443                var aRes = this.mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx);
1444                var fid = this.DataSource.getProperty(aRes,"id");
1445                var dbtype = this.DataSource.getProperty(aRes,"dbtype");
1446                var folder;
1447                if(fid != "0"){
1448                        var foldres = this.Database.getFolderFormID(fid,dbtype);
1449                        if(foldres) folder = foldres[0];
1450                }else{
1451                        folder = {fid:fid,dbtype:dbtype,fid_title:this.DataSource.getProperty(aRes,"title"),fid_property:""};
1452                }
1453                return folder;
1454        },
1455
1456/////////////////////////////////////////////////////////////////////
1457        displayIndex : function(aEvent,aXSLPath){
1458        bitsMarkingCollection._dump("CALLED displayIndex():");
1459                aEvent.stopPropagation();
1460                var xmlContent = this.createXML(aXSLPath);
1461                if(!xmlContent) return;
1462                bitsTreeListService._fileid = this.Common.getTimeStamp();
1463                var file = bitsTreeListService.getTreeListDir();
1464                file.append(bitsTreeListService._fileid+".xml");
1465                if(file.exists()) file.remove(false);
1466                file.create(file.NORMAL_FILE_TYPE, 0666);
1467                var ostream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
1468                ostream.init(file, 2, 0x200, false);
1469                this.Common.UNICODE.charset = "UTF-8";
1470                xmlContent = this.Common.UNICODE.ConvertFromUnicode(xmlContent);
1471                ostream.write(xmlContent, xmlContent.length);
1472                ostream.close();
1473                var cur_uri = this.Common.getURLStringFromDocument(this.gBrowser.contentDocument);
1474                var basedir = bitsTreeListService.getBaseDir();
1475                var res_uri = this.Common.convertFilePathToURL(basedir.path);
1476                if(cur_uri.indexOf(res_uri)>=0) bitsTreeListService._doc = this.gBrowser.contentDocument;
1477                var url = this.Common.convertFilePathToURL(file.path);
1478                var loadFlag = false;
1479                if(this.gBrowser.browsers.length == 1 && res_uri != "" && cur_uri != res_uri){
1480                        loadFlag = true;
1481                }else if(cur_uri == res_uri){
1482                        loadFlag = false;
1483                }else{
1484                        loadFlag = true;
1485                        for(var i=0;i<this.gBrowser.browsers.length;i++){
1486                                var doc = this.gBrowser.browsers[i].contentDocument;
1487                                var cur_uri = this.Common.getURLStringFromDocument(doc);
1488                                if(cur_uri.indexOf(res_uri)>=0){
1489                                        loadFlag = false;
1490                                        this.gBrowser.tabContainer.selectedIndex = i;
1491                                        break;
1492                                }
1493                        }
1494                }
1495                this.Common.loadURL(url,loadFlag);
1496                bitsTreeListService._openurl = url;
1497                if(bitsTreeListService._openurl != ""){
1498                        var remove_dir = this.Common.convertURLToFile(this.Common.getBaseHref(bitsTreeListService._openurl));
1499                        window.top.bitsMarkingCollection._removefile.push(remove_dir);
1500                        if(this.mcTreeViewModeService) this.mcTreeViewModeService._openlist[url] = loadFlag;
1501                }
1502        },
1503
1504/////////////////////////////////////////////////////////////////////
1505        saveIndex : function(aEvent){
1506        bitsMarkingCollection._dump("CALLED saveIndex():");
1507                aEvent.stopPropagation();
1508                var savedir = this.getSaveFolder();
1509                if(!savedir) return;
1510                var xmlContent =this.createXML();
1511                if(!xmlContent) return;
1512                if(!this._folder) return;
1513                var file = savedir.clone();
1514                file.append(this._folder.fid_title+".xml");
1515                if(file.exists()){
1516                        var filecnt;
1517                        for(filecnt=1;;filecnt++){
1518                                file = savedir.clone();
1519                                file.append(this._folder.fid_title+"("+filecnt+")"+".xml");
1520                                if(!file.exists()) break;
1521                        }
1522                }
1523                file.create(file.NORMAL_FILE_TYPE, 0666);
1524                var ostream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
1525                ostream.init(file, 2, 0x200, false);
1526                this.Common.UNICODE.charset = "UTF-8";
1527                xmlContent = this.Common.UNICODE.ConvertFromUnicode(xmlContent);
1528                ostream.write(xmlContent, xmlContent.length);
1529                ostream.close();
1530                var msg = this.STRING.getString("SUCCEEDED_INDEX") + "\n";
1531                msg += file.path;
1532                var prompts = this.Common.PROMPT;
1533                var flags = prompts.BUTTON_TITLE_OK + prompts.BUTTON_POS_0_DEFAULT;
1534                var button = prompts.confirmEx(window, this.STRING.getString("APP_TITLE"), msg, flags, "", "", "", null, {});
1535        },
1536
1537/////////////////////////////////////////////////////////////////////
1538        createXML : function(aXSLPath){
1539                this._folder = undefined;
1540                var folder = this.getFolder();
1541                if(!folder) return;
1542                this._folder = folder;
1543                this.createTITLE2OBJ(folder);
1544                if(!this._title2obj) return "";
1545                var aContent = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
1546                var stylesheet;
1547                if(aXSLPath && aXSLPath.match(/^file:/)){
1548                        stylesheet = this.Common.readFile(this.Common.convertURLToFile(aXSLPath));
1549                }else if(aXSLPath && aXSLPath.match(/^chrome:\/\/markingcollection\/content\//)){
1550                        var xslURL = this.Common.convertURLToObject(aXSLPath);
1551                        stylesheet = bitsTreeListService.loadText(xslURL);
1552                }else{
1553                        var xslURL = this.Common.convertURLToObject("chrome://markingcollection/content/treeindex_standard.xsl");
1554                        stylesheet = bitsTreeListService.loadText(xslURL);
1555                }
1556                if(stylesheet && stylesheet != ""){
1557                        var type = "xsl";
1558                        aContent += '<?xml-stylesheet type="text/'+type+'" href="#treeindex"?>\n';
1559                }
1560                aContent += '<!DOCTYPE WM_INDEX_LIST';
1561                aContent += '[\n';
1562                aContent += '  <!ATTLIST xsl:stylesheet id ID #REQUIRED>\n';
1563                aContent += ']';
1564                aContent += '>\n<WM_INDEX_LIST>\n';
1565                if(stylesheet && stylesheet != "") aContent += stylesheet+'\n';
1566                aContent += "</WM_INDEX_LIST>\n";
1567                if(!this.createXMLDoc(aContent)) return "";
1568                this._xmldoc.documentElement.setAttribute("title",folder.fid_title);
1569                var url2icon = {};
1570                var title_arr = [];
1571                var title;
1572                var tcnt;
1573                var ocnt;
1574                var kcnt;
1575                for(title in this._title2obj){
1576                        title_arr.push(title);
1577                }
1578                title_arr.sort(function(a,b){
1579                        if(a.toUpperCase() == b.toUpperCase()) return 0;
1580                        if(a.toUpperCase() >  b.toUpperCase()) return 1;
1581                        if(a.toUpperCase() <  b.toUpperCase()) return -1;
1582                });
1583                try{
1584                        var indexsnode = this._xmldoc.createElement("INDEXS");
1585                        this._xmldoc.documentElement.appendChild(indexsnode);
1586                }catch(e){}
1587                for(tcnt=0;tcnt<title_arr.length;tcnt++){
1588                        title = title_arr[tcnt];
1589                        try{
1590                                indexsnode.appendChild(this._xmldoc.createTextNode("\n  "));
1591                        }catch(e){}
1592                        try{
1593                                var indexnode = this._xmldoc.createElement("INDEX");
1594                                indexsnode.appendChild(indexnode);
1595                        }catch(e){}
1596                        try{
1597                                indexnode.appendChild(this._xmldoc.createTextNode("\n    "));
1598                                var titlenode = this._xmldoc.createElement("TITLE");
1599                                titlenode.appendChild(this._xmldoc.createTextNode(title));
1600                                indexnode.appendChild(titlenode);
1601                        }catch(e){}
1602                        var urlhash = {};
1603                        for(ocnt=0;ocnt<this._title2obj[title].length;ocnt++){
1604                                try{
1605                                        var obj = this._title2obj[title][ocnt];
1606                                        var objkey;
1607                                        if(obj && obj.oid_property){
1608                                                try{
1609                                                        var parser = new DOMParser();
1610                                                        var xmldoc = parser.parseFromString(obj.oid_property, "text/xml");
1611                                                        parser = undefined;
1612                                                        if(this._xmldoc && this._xmldoc.documentElement.nodeName == "parsererror") xmldoc = undefined;
1613                                                        if(xmldoc){
1614                                                                var objkeys = ["NOTE","HYPER_ANCHOR"];
1615                                                                for(kcnt=0;kcnt<objkeys.length;kcnt++){
1616                                                                        objkey = objkeys[kcnt].toUpperCase();
1617                                                                        var elem = xmldoc.getElementsByTagName(objkey)[0];
1618                                                                        if(!elem) continue;
1619                                                                        obj[objkey] = elem.textContent;
1620                                                                }
1621                                                        }
1622                                                }catch(e){}
1623                                        }
1624                                        if(obj && obj.doc_url){
1625                                                if(urlhash[obj.doc_url] == undefined) urlhash[obj.doc_url] = [];
1626                                                urlhash[obj.doc_url].push(obj);
1627                                        }
1628                                }catch(e){}
1629                        }
1630                        var urlarr = [];
1631                        var url;
1632                        for(url in urlhash){
1633                                urlarr.push(url);
1634                        }
1635                        if(urlarr.length>0){
1636                                try{
1637                                        indexnode.appendChild(this._xmldoc.createTextNode("\n    "));
1638                                        var urlsnode = this._xmldoc.createElement("URLS");
1639                                        indexnode.appendChild(urlsnode);
1640                                        urlarr.sort(function(a,b){
1641                                                if(a.toUpperCase() == b.toUpperCase()) return 0;
1642                                                if(a.toUpperCase() >  b.toUpperCase()) return 1;
1643                                                if(a.toUpperCase() <  b.toUpperCase()) return -1;
1644                                        });
1645                                        for(ocnt=0;ocnt<urlarr.length;ocnt++){
1646                                                url = urlarr[ocnt];
1647                                                urlsnode.appendChild(this._xmldoc.createTextNode("\n      "));
1648                                                var urlnode = this._xmldoc.createElement("URL");
1649                                                urlsnode.appendChild(urlnode);
1650                                                urlnode.appendChild(this._xmldoc.createTextNode("\n        "));
1651                                                var docurlnode = this._xmldoc.createElement("DOCUMENT_URL");
1652                                                docurlnode.appendChild(this._xmldoc.createTextNode(url));
1653                                                urlnode.appendChild(docurlnode);
1654                                                if(url2icon[url]){
1655                                                        urlnode.appendChild(this._xmldoc.createTextNode("\n        "));
1656                                                        var iconnode = this._xmldoc.createElement("FAVICON");
1657                                                        iconnode.appendChild(this._xmldoc.createTextNode(url2icon[url]));
1658                                                        urlnode.appendChild(iconnode);
1659                                                }
1660                                                urlnode.appendChild(this._xmldoc.createTextNode("\n        "));
1661                                                var objsnode = this._xmldoc.createElement("OBJECTS");
1662                                                urlnode.appendChild(objsnode);
1663                                                for(kcnt=0;kcnt<urlhash[url].length;kcnt++){
1664                                                        var obj = urlhash[url][kcnt];
1665                                                        if(kcnt == 0){
1666                                                                urlnode.appendChild(this._xmldoc.createTextNode("\n        "));
1667                                                                var docurlnode = this._xmldoc.createElement("DOCUMENT_TITLE");
1668                                                                docurlnode.appendChild(this._xmldoc.createTextNode(obj.doc_title));
1669                                                                urlnode.appendChild(docurlnode);
1670                                                        }
1671                                                        objsnode.appendChild(this._xmldoc.createTextNode("\n          "));
1672                                                        var objnode = this._xmldoc.createElement("OBJECT");
1673                                                        objsnode.appendChild(objnode);
1674                                                        for(objkey in obj){
1675                                                                objnode.appendChild(this._xmldoc.createTextNode("\n            "));
1676                                                                var keynode = this._xmldoc.createElement(objkey.toUpperCase());
1677                                                                keynode.appendChild(this._xmldoc.createTextNode(obj[objkey]));
1678                                                                objnode.appendChild(keynode);
1679                                                        }
1680                                                        if(obj && obj.doc_url){
1681                                                                if(url2icon[obj.doc_url]){
1682                                                                        objnode.appendChild(this._xmldoc.createTextNode("\n            "));
1683                                                                        var iconnode = this._xmldoc.createElement("ICON");
1684                                                                        iconnode.appendChild(this._xmldoc.createTextNode(url2icon[obj.doc_url]));
1685                                                                        objnode.appendChild(iconnode);
1686                                                                }
1687                                                        }
1688                                                        objnode.appendChild(this._xmldoc.createTextNode("\n          "));
1689                                                }
1690                                                objsnode.appendChild(this._xmldoc.createTextNode("\n        "));
1691                                                urlnode.appendChild(this._xmldoc.createTextNode("\n      "));
1692                                        }
1693                                        urlsnode.appendChild(this._xmldoc.createTextNode("\n    "));
1694                                }catch(e){}
1695                        }
1696                        try{
1697                                indexnode.appendChild(this._xmldoc.createTextNode("\n  "));
1698                        }catch(e){}
1699                }
1700                try{
1701                        indexsnode.appendChild(this._xmldoc.createTextNode("\n"));
1702                        this._xmldoc.documentElement.appendChild(this._xmldoc.createTextNode("\n"));
1703                }catch(e){}
1704                return this.xmlSerializer();
1705        },
1706
1707/////////////////////////////////////////////////////////////////////
1708        createTITLE2OBJ : function(aFolder){
1709                this._title2obj = undefined;
1710                var title2obj = {};
1711                var pos = 0;
1712                var key;
1713                var object;
1714                var fid2style = {};
1715                var contResList = this._getAllObject(aFolder);
1716                if(contResList.length>0){
1717                        var ocnt;
1718                        for(ocnt=0;ocnt<contResList.length;ocnt++){
1719                                if(!contResList[ocnt].bgn_dom) continue;
1720                                var title = contResList[ocnt].oid_title;
1721                                title = title.replace(/^\s+/mg,"").replace(/\s+$/mg,"");
1722                                var oid = contResList[ocnt].oid;
1723                                var dbtype = contResList[ocnt].dbtype;
1724                                var pfid = contResList[ocnt].pfid;
1725                                var objects = this.Database.getObjectWithProperty({oid:oid},dbtype);
1726                                if(!objects) continue;
1727                                object = objects[0];
1728                                if(title2obj[title] == undefined) title2obj[title] = [];
1729                                pos = title2obj[title].length;
1730                                title2obj[title][pos] = {};
1731                                for(key in object){
1732                                        title2obj[title][pos][key] = object[key];
1733                                }
1734                                var i=0;
1735                                if(object.oid_type.match(/^image\/(.+)$/)){
1736                                        var blob = this.Database.getObjectBLOB(object.oid,dbtype);
1737                                        if(blob && blob.length>0 && blob[0].length>0){
1738                                                var images = String.fromCharCode.apply(String, blob[0]);
1739                                                var image_b64 = btoa(images); // base64 encoding
1740                                                image_b64 = 'data:' + object.oid_type + ';base64,' + image_b64;
1741                                                title2obj[title][pos].oid_img  = image_b64;
1742                                                /* システムで管理しおいるむメヌゞの堎合 */
1743                                                var blobFile = this.Database.getObjectBLOBFile(object.oid,dbtype);
1744                                                var blobUrl = this.Common.convertFilePathToURL(blobFile.path);
1745                                                if(object.doc_url == blobUrl) title2obj[title][pos].doc_url = image_b64;
1746                                                if(object.con_url == blobUrl) title2obj[title][pos].con_url = image_b64;
1747                                        }
1748                                }
1749                                if(fid2style[pfid] == undefined){
1750                                        var folders = this.Database.getFolderFormID(pfid,dbtype);
1751                                        if(folders && folders.length>0) fid2style[pfid] = folders[0].fid_style.replace(/([:;\(,])\s+/mg,"$1");
1752                                }
1753                                if(fid2style[pfid] != undefined) title2obj[title][pos].fid_style = fid2style[pfid];
1754                        }
1755                }
1756                contResList = undefined;
1757                this._title2obj = title2obj;
1758        },
1759
1760/////////////////////////////////////////////////////////////////////
1761        readFile : function(aFile){
1762                if(!aFile || !aFile.exists()) return undefined;
1763                try {
1764                        var istream = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
1765                        istream.init(aFile, 1, 0, false);
1766                        var sstream = Components.classes['@mozilla.org/scriptableinputstream;1'].createInstance(Components.interfaces.nsIScriptableInputStream);
1767                        sstream.init(istream);
1768                        var content = sstream.read(sstream.available());
1769                        sstream.close();
1770                        istream.close();
1771                        content = this.Common.convertToUnicode(content,"UTF-8");
1772                        return content;
1773                }catch(ex){
1774                        this._dump("bitsTreeProjectService ERROR: readFile():" + ex);
1775                        return undefined;
1776                }
1777        },
1778
1779/////////////////////////////////////////////////////////////////////
1780        writeFile : function(aFile, aContent){
1781                try {
1782                        if(!aFile.parent.exists()) aFile.parent.create(aFile.DIRECTORY_TYPE, 0777);
1783                        if(aFile.exists()) aFile.remove(false);
1784                        aFile.create(aFile.NORMAL_FILE_TYPE, 0666);
1785                        var content = this.Common.convertFormUnicode(aContent,"UTF-8");
1786                        var ostream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
1787                        ostream.init(aFile, 2, 0x200, false);
1788                        ostream.write(content, content.length);
1789                        ostream.close();
1790                        return true;
1791                }catch(ex){
1792                        this._dump("bitsTreeProjectService ERROR: Failed to write file: " + aFile.path + "["+ ex + "]");
1793                        return false;
1794                }
1795        },
1796
1797/////////////////////////////////////////////////////////////////////
1798        createXMLDoc : function(aContent){
1799                var parser = new DOMParser();
1800                this._xmldoc = parser.parseFromString(aContent, "text/xml");
1801                parser = undefined;
1802                if(this._xmldoc && this._xmldoc.documentElement.nodeName == "parsererror"){
1803                        this._xmldoc = undefined;
1804                }
1805                return this._xmldoc;
1806        },
1807
1808/////////////////////////////////////////////////////////////////////
1809        xmlSerializer : function(){
1810                if(!this._xmldoc) return "";
1811                var s = new XMLSerializer();
1812                var aContent = s.serializeToString(this._xmldoc);
1813                s = undefined;
1814                return aContent;
1815        },
1816
1817/////////////////////////////////////////////////////////////////////
1818        validateFileName : function(aFileName){
1819                var re = /[\/]+/g;
1820                if (navigator.appVersion.indexOf("Windows") != -1) {
1821                        re = /[\\\/\|]+/g;
1822                        aFileName = aFileName.replace(/[\"]+/g, "'");
1823                        aFileName = aFileName.replace(/[\*\:\?]+/g, " ");
1824                        aFileName = aFileName.replace(/[\<]+/g, "(");
1825                        aFileName = aFileName.replace(/[\>]+/g, ")");
1826                        aFileName = aFileName.replace(/[\"\?!~`]+/g, "");
1827                        aFileName = aFileName.replace(/[\*\&]+/g, "+");
1828                        aFileName = aFileName.replace(/[\\\/\|\:;]+/g, "-");
1829                        aFileName = aFileName.replace(/[\<]+/g, "(");
1830                        aFileName = aFileName.replace(/[\>]+/g, ")");
1831                        aFileName = aFileName.replace(/[\s]+/g, "_");
1832                        aFileName = aFileName.replace(/[%]+/g, "@");
1833                }else if (navigator.appVersion.indexOf("Macintosh") != -1)
1834                        re = /[\:\/]+/g;
1835                return aFileName.replace(re, "_");
1836        },
1837
1838/////////////////////////////////////////////////////////////////////
1839        getReadFileFromFolder : function (aFolder){
1840                var result = [];
1841                try{
1842                        var entries = aFolder.directoryEntries;
1843                        while(entries.hasMoreElements()){
1844                                var entry = entries.getNext();
1845                                entry.QueryInterface(Components.interfaces.nsIFile);
1846                                if(entry.isDirectory()){
1847                                        result = result.concat(this.getReadFileFromFolder(entry));
1848                                }else{
1849                                        try{ var mimetype = this.Common.MIME.getTypeFromFile(entry); }catch(e){ mimetype = undefined; }
1850                                        if(!mimetype) continue;
1851                                        if(mimetype != "text/plain" && mimetype != "text/html" && mimetype != "application/pdf") continue;
1852                                        var arg = this.Common.convertFilePathToURL(entry.QueryInterface(Components.interfaces.nsILocalFile).path);
1853                                        result.push(arg);
1854                                }
1855                        }
1856                }catch(e){
1857                        this._dump("bitsTreeProjectService.getReadFileFromFolder():aFolder=["+aFolder+"]");
1858                        this._dump("bitsTreeProjectService.getReadFileFromFolder():"+e);
1859                }
1860                return result;
1861        },
1862
1863/////////////////////////////////////////////////////////////////////
1864        getReadFolder : function (aDefaultFolder){
1865                var result = undefined;
1866                try{
1867                        var picker = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
1868                        picker.init(window, "Selected Folder", picker.modeGetFolder);
1869                        if(aDefaultFolder) picker.displayDirectory = aDefaultFolder;
1870                        var showResult = picker.show();
1871                        if(showResult == picker.returnOK) result = this.getReadFileFromFolder(picker.file);
1872                }catch(e){
1873                        result = undefined;
1874                        this._dump("bitsTreeProjectService.getReadFolder():"+e);
1875                }
1876                return result;
1877        },
1878
1879/////////////////////////////////////////////////////////////////////
1880        getReadFiles : function (){
1881                var result = undefined;
1882                try{
1883                        var picker = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
1884                        picker.init(window, "Selected Files", picker.modeOpenMultiple);
1885                        picker.appendFilter("HTML File or Text File or PDF File","*.htm; *.html; *.txt; *.pdf");
1886                        picker.appendFilters(picker.filterHTML | picker.filterText);
1887                        picker.appendFilter("PDF File","*.pdf");
1888                        picker.filterIndex = 0;
1889                        var showResult = picker.show();
1890                        if(showResult == picker.returnOK){
1891                                var files = picker.files;
1892                                result = [];
1893                                while (files.hasMoreElements()){
1894                                        var arg = this.Common.convertFilePathToURL(files.getNext().QueryInterface(Components.interfaces.nsILocalFile).path);
1895                                        result.push(arg);
1896                                }
1897                        }
1898                }catch(e){
1899                        result = undefined;
1900                        this._dump("bitsTreeProjectService.getReadFiles():"+e);
1901                        if(e.message=="Component returned failure code: 0x80520001 (NS_ERROR_FILE_UNRECOGNIZED_PATH) [nsIFilePicker.show]"){
1902                                if(this.Common.confirm(this.STRING.getString("CONFIRM_READING_DOCUMENTS_SELECT_OVER"))) result = this.getReadFolder((picker&&picker.displayDirectory?picker.displayDirectory:undefined));
1903                        }
1904                }
1905                return result;
1906        },
1907
1908/////////////////////////////////////////////////////////////////////
1909        getReadFile : function (){
1910                var picker = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
1911                var result = undefined;
1912                try{
1913                        picker.init(window, "Selected File", picker.modeOpen);
1914                        picker.appendFilters(picker.filterText);
1915                        picker.filterIndex = 0;
1916                        var showResult = picker.show();
1917                        if(showResult == picker.returnOK || showResult == picker.returnReplace) result = picker.file;
1918                }catch(e){
1919                        result = undefined;
1920                        this.Common.alert(e);
1921                }
1922                return result;
1923        },
1924
1925/////////////////////////////////////////////////////////////////////
1926        getSaveFile : function (aTitle){
1927                var picker = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
1928                var result = null;
1929                try{
1930                        var title = "Selected Save File";
1931                        if(aTitle) title += " ["+aTitle+"]";
1932                        picker.init(window, title, picker.modeSave);
1933                        picker.defaultExtension = ".txt";
1934                        if(aTitle) picker.defaultString  = aTitle + picker.defaultExtension;
1935                        picker.appendFilters(picker.filterText);
1936                        var showResult = picker.show();
1937                        if(showResult == picker.returnOK){
1938                                result = picker.file;
1939                        }else if(showResult == picker.returnReplace){
1940                                if(picker.file.exists()) picker.file.remove(false);
1941                                result = picker.file;
1942                        }
1943                }catch(e){
1944                        result = null;
1945                        this.Common.alert(e);
1946                }
1947                return result;
1948        },
1949
1950/////////////////////////////////////////////////////////////////////
1951        getSaveFolder : function (aTitle){
1952                var picker = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
1953                var result = null;
1954                try{
1955                        var title = "Selected Save Folder";
1956                        if(aTitle) title += " ["+aTitle+"]";
1957                        picker.init(window, title, picker.modeGetFolder);
1958                        if(aTitle) picker.defaultString  = aTitle;
1959                        var showResult = picker.show();
1960                        if(showResult == picker.returnOK){
1961                                result = picker.file;
1962                        }else if(showResult == picker.returnReplace){
1963                                if(picker.file.exists()) picker.file.remove(false);
1964                                result = picker.file;
1965                        }
1966                }catch(e){
1967                        result = null;
1968                        this.Common.alert(e);
1969                }
1970                return result;
1971        },
1972
1973/////////////////////////////////////////////////////////////////////
1974        getTemplateDir : function(){},
1975
1976/////////////////////////////////////////////////////////////////////
1977        createMenu : function(aParentNode,aEntry){},
1978
1979/////////////////////////////////////////////////////////////////////
1980        loadText : function(aURI){},
1981
1982/////////////////////////////////////////////////////////////////////
1983        _getZipEntry : function(aZipEntry){
1984                return escape(aZipEntry);
1985        },
1986
1987/////////////////////////////////////////////////////////////////////
1988        addEntryDirectory : function(aZipWriter,aDir,aParentPath){
1989                var LANG = this.Common.getLang();
1990                var entries = aDir.directoryEntries;
1991                while(entries.hasMoreElements()){
1992                        var pDir = entries.getNext().QueryInterface(Components.interfaces.nsILocalFile);
1993                        if(!pDir.isDirectory()) continue;
1994                        var entryName = (aParentPath?aParentPath+"/":"") + pDir.leafName;
1995                        aZipWriter.addEntryDirectory(this._getZipEntry(entryName), pDir.lastModifiedTime, false);
1996                        this.addEntryDirectory(aZipWriter, pDir, entryName);
1997                }
1998        },
1999
2000/////////////////////////////////////////////////////////////////////
2001        addEntryFile : function(aZipWriter,aDir,aParentPath){
2002                var entries = aDir.directoryEntries;
2003                while(entries.hasMoreElements()){
2004                        var pDir = entries.getNext().QueryInterface(Components.interfaces.nsILocalFile);
2005                        var entryName = (aParentPath?aParentPath+"/":"") + pDir.leafName;
2006                        if(pDir.isDirectory()){
2007                                this.addEntryFile(aZipWriter, pDir, entryName);
2008                        }else{
2009                                aZipWriter.addEntryFile(this._getZipEntry(entryName), Components.interfaces.nsIZipWriter.COMPRESSION_DEFAULT, pDir, false);
2010                        }
2011                }
2012        },
2013
2014/////////////////////////////////////////////////////////////////////
2015        saveFile : function(aEvent){
2016                try{
2017                        aEvent.preventDefault();
2018                        aEvent.stopPropagation();
2019                        this._savehtml.length = 0;
2020                        this._savehtml = [];
2021                        var contentWindow = null;
2022                        var mcTreeHandler = null;
2023                        if(bitsMarkingCollection._contentWindow) contentWindow = bitsMarkingCollection._contentWindow;
2024                        if(contentWindow && contentWindow.mcTreeHandler) mcTreeHandler = contentWindow.mcTreeHandler;
2025                        if(!mcTreeHandler) return;
2026                        var curIdx = mcTreeHandler.TREE.currentIndex;
2027                        if(curIdx<0) return;
2028                        var aRes = null;
2029                        if(!mcTreeHandler.TREE.view.isContainer(curIdx)) return;
2030                        aRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx);
2031                        var fid = this.DataSource.getProperty(aRes,"id");
2032                        var dbtype = this.DataSource.getProperty(aRes,"dbtype");
2033                        if(fid != "0"){
2034                                var foldres = this.Database.getFolderFormID(fid,dbtype);
2035                                if(foldres) this._saveFile(foldres[0]);
2036                        }else{
2037                                this._saveFile({fid:fid,dbtype:dbtype,fid_title:this.DataSource.getProperty(aRes,"title"),fid_property:""});
2038                        }
2039                }catch(ex){
2040                        this.Common.alert("bitsTreeProjectService.saveFile():"+ex);
2041                }
2042        },
2043
2044
2045/////////////////////////////////////////////////////////////////////
2046        _saveFile : function(aFolder){
2047        bitsMarkingCollection._dump("CALLED _saveFile():");
2048                try{
2049                        var saveFolder = this.getSaveFolder(aFolder.fid_title);
2050                        if(!saveFolder) return;
2051                        var tmpDir = window.top.bitsMarkingCollection.getTmpDir().clone();
2052                        tmpDir.append(this.STRING.getString("APP_TITLE"));
2053                        tmpDir.createUnique(tmpDir.DIRECTORY_TYPE, 0777);
2054                        tmpDir.append(this._getZipEntry(this.validateFileName(aFolder.fid_title)));
2055                        if(tmpDir.exists()) tmpDir.remove(true);
2056                        if(!tmpDir.exists()) tmpDir.create(tmpDir.DIRECTORY_TYPE, 0777);
2057                        var file = tmpDir.clone();
2058                        file.append(this._getZipEntry(this.validateFileName(aFolder.fid_title))+".xml");
2059                        var leafName = unescape(file.leafName);
2060                        var filename = this.Common.splitFileName(leafName)[0];
2061                        this.appDataSTRING = this.appDataAddSTRING;
2062                        var aContent = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
2063                        var aURL = this.Common.convertURLToObject("chrome://markingcollection/content/treeexport.xsl");
2064                        var stylesheet = bitsTreeListService.loadText(aURL);
2065                        if(stylesheet && stylesheet != ""){
2066                                var type = "xsl";
2067                                aContent += '<?xml-stylesheet type="text/'+type+'" href="#treeexport"?>\n';
2068                        }
2069                        aContent += '<!DOCTYPE LIST';
2070                        aContent += '[\n';
2071                        aContent += '  <!ATTLIST xsl:stylesheet id ID #REQUIRED>\n';
2072                        aContent += ']';
2073                        aContent += '>\n<LIST title="'+ this.xmlEncode(aFolder.fid_title) +'">\n';
2074                        if(stylesheet && stylesheet != "") aContent += stylesheet+'\n';
2075                        aContent += "</LIST>\n";
2076                        this.createXMLDoc(aContent);
2077                        bitsTreeProjectService.createID2OBJ(aFolder);
2078                        bitsTreeProjectService.createXML(aFolder,this.xmldoc.documentElement);
2079                        aContent = "";
2080                        if(this._savehtml.length>0){
2081                                var elem = this.xmldoc.createElement("BASENAME");
2082                                var elemT = this.xmldoc.createTextNode(filename);
2083                                if(elem && elemT){
2084                                        elem.appendChild(elemT);
2085                                        this.xmldoc.documentElement.appendChild(elem)
2086                                }
2087                        }
2088                        aContent = this.xmlSerializer();
2089                        this.Common.writeFile(file, aContent, "UTF-8");
2090                        var savePath = null;
2091                        if(this._savehtml.length>0){
2092                                savePath = file.parent.clone();
2093                                savePath.append(this.appDataSTRING);
2094                                if(savePath.exists()) savePath.remove(true);
2095                                savePath.create(savePath.DIRECTORY_TYPE, 0777);
2096                                var i;
2097                                for(i=0;i<this._savehtml.length;i++){
2098                                        var htmlfile = this.Common.convertURLToFile(this._savehtml[i]);
2099                                        if(!htmlfile.exists()) continue;
2100                                        var htmlpath2 = htmlfile.parent.clone();
2101                                        var htmlpath1 = htmlpath2.parent.clone();
2102                                        var copypath1 = savePath.clone();
2103                                        copypath1.append(htmlpath1.leafName);
2104                                        if(!copypath1.exists()) copypath1.create(copypath1.DIRECTORY_TYPE, 0777);
2105                                        var copyfile1 = copypath1.clone();
2106                                        copyfile1.append(".info");
2107                                        if(!copyfile1.exists()){
2108                                                var htmlfile1 = htmlpath1.clone();
2109                                                htmlfile1.append(".info");
2110                                                if(htmlfile1.exists()) htmlfile1.copyTo(copypath1,htmlfile1.leafName);
2111                                                htmlfile1 = undefined;
2112                                        }
2113                                        copyfile1 = undefined;
2114                                        var copypath2 = copypath1.clone();
2115                                        copypath2.append(htmlpath2.leafName);
2116                                        if(copypath2.exists()) continue;
2117                                        htmlpath2.copyTo(copypath1,htmlpath2.leafName);
2118                                        var urlinfo = copypath2.clone();
2119                                        urlinfo.append(".urlinfo");
2120                                        if(urlinfo.exists()){
2121                                                var content = this.Common.readFile(urlinfo);
2122                                                if(content && content != ""){
2123                                                        var content_arr = content.split("\n");
2124                                                        var j,k;
2125                                                        for(j=0;j<content_arr.length;j++){
2126                                                                var url_arr = content_arr[j].split("\t");
2127                                                                for(k=0;k<url_arr.length;k++){
2128                                                                        if(url_arr[k].match(this.appDataURLExp)) url_arr[k] = url_arr[k].replace(this.appDataURLExp, this.appDataSTRING);
2129                                                                }
2130                                                                content_arr[j] = url_arr.join("\t");
2131                                                        }
2132                                                        content = content_arr.join("\n");
2133                                                        this.Common.writeFile(urlinfo, content, "UTF-8");
2134                                                }
2135                                        }
2136                                        urlinfo = undefined;
2137                                        htmlfile = undefined;
2138                                        htmlpath2 = undefined;
2139                                        htmlpath2 = undefined;
2140                                        copypath1 = undefined;
2141                                        copypath2 = undefined;
2142                                }
2143                        }
2144                        try{
2145                                var nsIZipWriter = Components.interfaces.nsIZipWriter;
2146                                var zipWriter = Components.classes["@mozilla.org/zipwriter;1"].createInstance(nsIZipWriter);
2147                        }catch(e){}
2148                        var zipFile;
2149                        if(zipWriter){
2150                                var parent = tmpDir.parent.clone();
2151                                zipFile = saveFolder.clone();
2152                                zipFile.append(filename+".zip");
2153                                if(zipFile.exists()){
2154                                        var filecnt;
2155                                        for(filecnt=1;;filecnt++){
2156                                                zipFile = saveFolder.clone();
2157                                                zipFile.append(filename+"("+filecnt+")"+".zip");
2158                                                if(!zipFile.exists()) break;
2159                                        }
2160                                }
2161                                if(!zipFile.exists()) zipFile.create(zipFile.NORMAL_FILE_TYPE, 0664);
2162                                zipWriter.open(zipFile, 0x04 | 0x08 | 0x20);
2163                                this.addEntryDirectory(zipWriter, parent);
2164                                this.addEntryFile(zipWriter, parent);
2165                                zipWriter.close();
2166                                if(parent.exists()) parent.remove(true);
2167                        }else if(this.zipApp){
2168                                try{
2169                                        var LANG = this.Common.getLang();
2170                                        var args = [];
2171                                        if(this.zipAppScript) args.push(this.Common.convertFormUnicode(this.zipAppScript.path,LANG));
2172                                        if(navigator.platform == "Win32") args.push("//Nologo");
2173                                        zipFile = saveFolder.clone();
2174                                        zipFile.append(filename+".zip");
2175                                        if(zipFile.exists()){
2176                                                var filecnt;
2177                                                for(filecnt=1;;filecnt++){
2178                                                        zipFile = saveFolder.clone();
2179                                                        zipFile.append(filename+"("+filecnt+")"+".zip");
2180                                                        if(!zipFile.exists()) break;
2181                                                }
2182                                        }
2183                                        args.push(this.Common.convertFormUnicode(zipFile.path,LANG));
2184                                        if(navigator.platform == "Win32"){
2185                                                args.push(this.Common.convertFormUnicode(tmpDir.path,LANG));
2186                                        }else{
2187                                                args.push("-r");
2188                                                args.push(this.Common.convertFormUnicode(tmpDir.path,LANG));
2189                                        }
2190                                        var proc = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
2191                                        proc.init(this.zipApp);
2192                                        proc.run(true, args, args.length);
2193                                        if(tmpDir.parent.exists()) tmpDir.parent.remove(true);
2194                                }catch(ex2){
2195                                        this.Common.alert("bitsTreeProjectService._saveFile():"+ex2);
2196                                        if(zipFile && zipFile.exists()) zipFile.remove(true);
2197                                        var parent = tmpDir.parent.clone();
2198                                        zipFile = saveFolder.clone();
2199                                        zipFile.append(tmpDir.leafName);
2200                                        if(zipFile.exists()){
2201                                                var filecnt;
2202                                                for(filecnt=1;;filecnt++){
2203                                                        zipFile = saveFolder.clone();
2204                                                        zipFile.append(tmpDir.leafName+"("+filecnt+")");
2205                                                        if(!zipFile.exists()) break;
2206                                                }
2207                                        }
2208                                        tmpDir.moveTo(saveFolder,zipFile.leafName);
2209                                        if(parent.exists()) parent.remove(true);
2210                                }
2211                        }else{
2212                                var parent = tmpDir.parent.clone();
2213                                zipFile = saveFolder.clone();
2214                                zipFile.append(unescape(tmpDir.leafName));
2215                                if(zipFile.exists()){
2216                                        var filecnt;
2217                                        for(filecnt=1;;filecnt++){
2218                                                zipFile = saveFolder.clone();
2219                                                zipFile.append(unescape(tmpDir.leafName)+"("+filecnt+")");
2220                                                if(!zipFile.exists()) break;
2221                                        }
2222                                }
2223                                tmpDir.moveTo(saveFolder,zipFile.leafName);
2224                                if(parent.exists()) parent.remove(true);
2225                        }
2226                        var msg = this.STRING.getString("SUCCEEDED_EXPORT") + "\n";
2227                        if(zipFile && zipFile.exists()){
2228                                msg += zipFile.path;
2229                        }else{
2230                                msg += saveFolder.path;
2231                        }
2232                        var prompts = this.Common.PROMPT;
2233                        var flags = prompts.BUTTON_TITLE_OK + prompts.BUTTON_POS_0_DEFAULT;
2234                        var button = prompts.confirmEx(window, bitsTreeProjectService.STRING.getString("APP_TITLE"), msg, flags, "", "", "", null, {});
2235                }catch(ex){
2236                        this.Common.alert("bitsTreeProjectService._saveFile():"+ex);
2237                }
2238        },
2239
2240/////////////////////////////////////////////////////////////////////
2241        getBaseDir : function(){
2242                var dir  = window.top.bitsMarkingCollection.getExtensionDir().clone();
2243                dir.append("treelist");
2244                if(!dir.exists()) dir.create(dir.DIRECTORY_TYPE, 0700);
2245                return dir;
2246        },
2247
2248/////////////////////////////////////////////////////////////////////
2249        getTreeListDir : function(){
2250                var dir  = this.getBaseDir().clone();
2251                dir.append(this._fileid);
2252                if(!dir.exists()) dir.create(dir.DIRECTORY_TYPE, 0700);
2253                return dir;
2254        },
2255
2256/////////////////////////////////////////////////////////////////////
2257        xmlEncode : function(aString){
2258                return aString.replace(/&/mg,"&amp;").replace(/</mg,"&lt;").replace(/>/mg,"&gt;").replace(/\"/mg,"&quot;");
2259        },
2260
2261/////////////////////////////////////////////////////////////////////
2262        _getAllObject : function(aFolder){
2263                var rtn = [];
2264                var Foldres = this.Database.getFolderFormPID(aFolder.fid,aFolder.dbtype,false);
2265                if(Foldres){
2266                        var aocnt;
2267                        for(aocnt=0;aocnt<Foldres.length;aocnt++){
2268                                rtn = rtn.concat(this._getAllObject(Foldres[aocnt]));
2269                        }
2270                }
2271                var Objects = this.Database.getObjectFormPID(aFolder.fid,aFolder.dbtype,false);
2272                if(Objects) rtn = rtn.concat(Objects);
2273                return rtn;
2274        },
2275
2276/////////////////////////////////////////////////////////////////////
2277        _getAllFolder : function(aFolder){
2278                var rtn = [];
2279                var Foldres = this.Database.getFolderFormPID(aFolder.fid,aFolder.dbtype,false);
2280                if(Foldres){
2281                        var aocnt;
2282                        for(aocnt=0;aocnt<Foldres.length;aocnt++){
2283                                rtn.push(Foldres[aocnt]);
2284                                rtn = rtn.concat(this._getAllFolder(Foldres[aocnt]));
2285                        }
2286                }
2287                return rtn;
2288        },
2289
2290/////////////////////////////////////////////////////////////////////
2291        _getAllChild : function(aFolder){
2292                var rtn = [];
2293                var Foldres = this.Database.getFolderFormPID(aFolder.fid,aFolder.dbtype,false);
2294                if(Foldres){
2295                        Foldres.sort(function(a,b){ return a.pfid_order - b.pfid_order; });
2296                        rtn = rtn.concat(Foldres);
2297                }
2298                var Objects = this.Database.getObjectFormPID(aFolder.fid,aFolder.dbtype,false);
2299                if(Objects){
2300                        Objects.sort(function(a,b){ return a.pfid_order - b.pfid_order; });
2301                        rtn = rtn.concat(Objects);
2302                }
2303                return rtn;
2304        },
2305
2306/////////////////////////////////////////////////////////////////////
2307        createID2OBJ : function(aFolder){
2308                var title2obj = {};
2309                var fid2style = {};
2310                var contResList = this._getAllObject(aFolder);
2311                if(contResList.length>0){
2312                        var ocnt;
2313                        for(ocnt=0;ocnt<contResList.length;ocnt++){
2314                                var oid = contResList[ocnt].oid;
2315                                if(title2obj[title] != undefined) continue;
2316                                var dbtype = contResList[ocnt].dbtype;
2317                                var objects = this.Database.getObjectWithProperty({oid:oid},dbtype);
2318                                if(!objects) continue;
2319                                title2obj[title] = {};
2320                                var i=0;
2321                                if(objects[i].oid_type.match(/^image\/(.+)$/)){
2322                                        var blob = this.Database.getObjectBLOB(objects[i].oid,dbtype);
2323                                        if(blob && blob.length>0 && blob[0].length>0){
2324                                                var images = String.fromCharCode.apply(String, blob[0]);
2325                                                var image_b64 = btoa(images); // base64 encoding
2326                                                image_b64 = 'data:' + objects[i].oid_type + ';base64,' + image_b64;
2327                                                title2obj[title].img  = image_b64;
2328                                                /* システムで管理しおいるむメヌゞの堎合 */
2329                                                var blobFile = this.Database.getObjectBLOBFile(objects[i].oid,dbtype);
2330                                                var blobUrl = this.Common.convertFilePathToURL(blobFile.path);
2331                                                if(objects[i].doc_url == blobUrl) objects[i].doc_url = image_b64;
2332                                                if(objects[i].con_url == blobUrl) objects[i].con_url = image_b64;
2333                                        }
2334                                }
2335                                if(window.top.bitsScrapPartySaveService){
2336                                        if(objects[i].doc_url.match(this.appDataURLExp)){
2337                                                this._savehtml.push(objects[i].doc_url);
2338                                                objects[i].doc_url = objects[i].doc_url.replace(this.appDataURLExp, this.appDataSTRING);
2339                                        }
2340                                        if(objects[i].con_url.match(this.appDataURLExp)){
2341                                                objects[i].con_url = objects[i].con_url.replace(this.appDataURLExp, this.appDataSTRING);
2342                                        }
2343                                }
2344                                title2obj[title].text = objects[i].oid_txt;
2345                                title2obj[title].uri = objects[i].doc_url;
2346                                title2obj[title].uri_title = objects[i].doc_title;
2347                                title2obj[title].con_url = objects[i].con_url;
2348                                title2obj[title].type = objects[i].oid_type;
2349                                title2obj[title].st = objects[i].bgn_dom;
2350                                title2obj[title].en = objects[i].end_dom;
2351                                if(objects[i].oid_property && objects[i].oid_property != "") title2obj[title].property = objects[i].oid_property;
2352                                title2obj[title].dbtype = objects[i].dbtype;
2353                                title2obj[title].date = objects[i].oid_date;
2354                                title2obj[title].mode = objects[i].oid_mode;
2355                                if(fid2style[objects[i].pfid] == undefined){
2356                                        var folders = this.Database.getFolderFormID(objects[i].pfid,dbtype);
2357                                        if(folders && folders.length>0) fid2style[objects[i].pfid] = folders[0].fid_style.replace(/([:;\(,])\s+/mg,"$1");
2358                                }
2359                                if(fid2style[objects[i].pfid] != undefined) title2obj[title].style = fid2style[objects[i].pfid];
2360                        }
2361                }
2362                contResList = undefined;
2363                this.title2obj = title2obj;
2364        },
2365
2366/////////////////////////////////////////////////////////////////////
2367        createTextNode : function(aString,aParentNode){
2368                if(aString && aString != ""){
2369                        var elemS = this.xmldoc.createTextNode(aString);
2370                        if(elemS) aParentNode.appendChild(elemS);
2371                }
2372        },
2373
2374/////////////////////////////////////////////////////////////////////
2375        createElement : function(aTagName,aString,aParentNode,aTab){
2376                if(!aTagName || !aParentNode) return;
2377                if(aTab && aTab != ""){
2378                        var elemT = this.xmldoc.createTextNode(aTab);
2379                        if(elemT) aParentNode.appendChild(elemT);
2380                }
2381                var elem = this.xmldoc.createElement(aTagName);
2382                if(elem){
2383                        if(aString){
2384                                if(aString != ""){
2385                                        var elemS = this.xmldoc.createTextNode(aString);
2386                                        if(elemS) elem.appendChild(elemS);
2387                                }
2388                        }else{
2389                                var elemR = this.xmldoc.createTextNode("\n");
2390                                if(elemR) elem.appendChild(elemR);
2391                        }
2392                        aParentNode.appendChild(elem)
2393                        var elemR = this.xmldoc.createTextNode("\n");
2394                        if(elemR) aParentNode.appendChild(elemR);
2395                }
2396                return elem;
2397        },
2398
2399/////////////////////////////////////////////////////////////////////
2400        createXMLObject : function(aObject,aParentNode,aDepth){
2401                var title2obj = this.title2obj;
2402                if(aDepth == undefined) aDepth = 0;
2403                var aTab = "";
2404                for(var i=0;i<=aDepth;i++){
2405                        aTab += "  ";
2406                }
2407                var oid = aObject.oid;
2408                var alink = "";
2409                var structure = "";
2410                var hyperAnchor = "";
2411                var disp_image_size_x = "";
2412                var disp_image_size_y = "";
2413                var disp_image_size = "";
2414                var out_property = [];
2415                var xmldoc;
2416                var structureElem;
2417                if(aObject.oid_property && aObject.oid_property != ""){
2418                        try{
2419                                var parser = new DOMParser();
2420                                xmldoc = parser.parseFromString(aObject.oid_property, "text/xml");
2421                                parser = undefined;
2422                        }catch(ex){}
2423                        if(xmldoc && xmldoc.documentElement.nodeName == "parsererror"){
2424                                title2obj[title].property = "";
2425                                xmldoc = undefined;
2426                        }
2427                        if(xmldoc){
2428                                var xmlnode = xmldoc.getElementsByTagName("LINK")[0];
2429                                if(xmlnode) alink = xmlnode.textContent;
2430                                /* STRUCTURE内のデヌタはxhtmlで栌玍されおいる為、そのたた出力する */
2431                                xmlnode = xmldoc.getElementsByTagName("STRUCTURE")[0];
2432                                if(xmlnode && xmlnode.hasChildNodes()){
2433                                        structureElem = xmlnode.cloneNode(true);
2434                                }
2435                                xmlnode = xmldoc.getElementsByTagName("IMG_LIST_DISP_SIZE")[0];
2436                                if(xmlnode){
2437                                        disp_image_size = xmlnode.textContent;
2438                                        if(disp_image_size.match(/^(\d+),(\d+)$/mg)){
2439                                                disp_image_size_x = RegExp.$1;
2440                                                disp_image_size_y = RegExp.$2;
2441                                        }
2442                                }
2443                                xmlnode = xmldoc.getElementsByTagName("NOTE")[0];
2444                                if(xmlnode){
2445                                        out_property["NOTE"] = {};
2446                                        out_property["NOTE"].type  = "text";
2447                                        out_property["NOTE"].value = xmlnode.textContent;
2448                                }
2449                                xmlnode = xmldoc.getElementsByTagName("HYPER_ANCHOR")[0];
2450                                if(xmlnode) hyperAnchor = xmlnode.textContent;
2451                        }
2452                }
2453                var oNode = this.createElement("OBJECT",undefined,aParentNode,aTab+"  ");
2454                this.createElement("OID_TITLE",aObject.oid_title,oNode,aTab+"    ");
2455                if(out_property["NOTE"]) this.createElement("OID_NOTE",out_property["NOTE"].value,oNode,aTab+"    ");
2456                var tag;
2457                for(tag in out_property){
2458                        if(typeof out_property[tag] == "function") continue;
2459                        this.createElement("OID_PROPERTY_"+ tag,out_property[tag].value,oNode,aTab+"    ");
2460                }
2461                if(disp_image_size_x && disp_image_size_y){
2462                        this.createElement("OID_IMG_DISP_WIDTH",disp_image_size_x,oNode,aTab+"    ");
2463                        this.createElement("OID_IMG_DISP_HEIGHT",disp_image_size_x,oNode,aTab+"    ");
2464                }
2465                if(title2obj[title].img) this.createElement("OID_IMG",title2obj[title].img,oNode,aTab+"    ");
2466                if(title2obj[title].uri) this.createElement("DOC_URL",title2obj[title].uri,oNode,aTab+"    ");
2467                if(title2obj[title].uri_title) this.createElement("DOC_TITLE",title2obj[title].uri_title,oNode,aTab+"    ");
2468                if(title2obj[title].st) this.createElement("BGN_DOM",title2obj[title].st,oNode,aTab+"    ");
2469                if(title2obj[title].en) this.createElement("END_DOM",title2obj[title].en,oNode,aTab+"    ");
2470                if(title2obj[title].con_url) this.createElement("CON_URL",title2obj[title].con_url,oNode,aTab+"    ");
2471                if(title2obj[title].type) this.createElement("OID_TYPE",title2obj[title].type,oNode,aTab+"    ");
2472                if(title2obj[title].date) this.createElement("OID_DATE",title2obj[title].date,oNode,aTab+"    ");
2473                if(title2obj[title].mode) this.createElement("OID_MODE",title2obj[title].mode,oNode,aTab+"    ");
2474                if(alink != "") this.createElement("OID_LINK",alink,oNode,aTab+"    ");
2475                if(structureElem){
2476                        var elem = this.createElement("OID_STRUCTURE","",oNode,aTab+"    ");
2477                        var i;
2478                        for(i=0;i<structureElem.childNodes.length;i++){
2479                                elem.appendChild(structureElem.childNodes[i].cloneNode(true));
2480                        }
2481                }
2482                if(title2obj[title].text) this.createElement("OID_TXT",title2obj[title].text,oNode,aTab+"    ");
2483                if(title2obj[title].property) this.createElement("OID_PROPERTY",title2obj[title].property,oNode,aTab+"    ");
2484                if(title2obj[title].dbtype) this.createElement("OID_DBTYPE",title2obj[title].dbtype,oNode,aTab+"    ");
2485                if(hyperAnchor != ""){
2486                        this.createElement("HYPER_ANCHOR",hyperAnchor,oNode,aTab+"    ");
2487                }else if(title2obj[title].con_url && title2obj[title].st){
2488                        var text = title2obj[title].con_url + '#hyperanchor:' + this.xmlEncode(title2obj[title].st);
2489                        if(title2obj[title].en) text += "&" + this.xmlEncode(title2obj[title].en);
2490                        if(title2obj[title].style) text += "&" + this.xmlEncode(title2obj[title].style);
2491                        this.createElement("HYPER_ANCHOR",text,oNode,aTab+"    ");
2492                }
2493                this.createTextNode(aTab+"  ",oNode);
2494        },
2495
2496/////////////////////////////////////////////////////////////////////
2497        _dump : function(aString){
2498                window.top.bitsMarkingCollection._dump(aString);
2499        },
2500
2501};
Note: See TracBrowser for help on using the repository browser.