source: DASISH/t5.6/client/branches/webannotator-basic-current-xsd/chrome/markingcollection/content/markingcollection/tree.js @ 5703

Last change on this file since 5703 was 5703, checked in by stephanie.roth@snd.gu.se, 10 years ago

Initial commit of current status quo from GitHub. TODO: Adjust client code to work with updated xsd file.

  • Property svn:executable set to *
File size: 179.7 KB
Line 
1var mcTreeHandler = {
2    get TREE() {
3        return document.getElementById("mcTree");
4    },
5    get TREE_POPUP() {
6        return document.getElementById("mcToolbarRootFolderButton");
7    },
8    get POPUP() {
9        return document.getElementById("mcPopup");
10    },
11    get POPUP_FOLDER() {
12        return document.getElementById("mcPopupFolder");
13    },
14    get POPUP_OBJECT() {
15        return document.getElementById("mcPopupObject");
16    },
17    get DataSource() {
18        return window.top.bitsObjectMng.DataSource;
19    },
20    get Common() {
21        return window.top.bitsObjectMng.Common;
22    },
23    get XPath() {
24        return window.top.bitsObjectMng.XPath;
25    },
26    get Database() {
27        return window.top.bitsObjectMng.Database;
28    },
29    get gBrowser() {
30        return window.top.bitsObjectMng.getBrowser();
31    },
32    get resource() {
33        try {
34            if (this.TREE.view.selection.count < 1 || this.TREE.currentIndex < 0)
35                return null;
36            else
37                return this.TREE.builderView.getResourceAtIndex(this.TREE.currentIndex);
38        } catch (ex) {
39            _dump(ex);
40            return null;
41        }
42    },
43    get object() {
44        var rValue;
45        var obj = null;
46        var res = this.resource;
47        if (res) {
48            var id = this.DataSource.getProperty(res, "id");
49            var dbtype = this.DataSource.getProperty(res, "dbtype");
50            var rValue;
51            if (this.DataSource.isContainer(res)) {
52                rValue = this.Database.getFolderFormID(id, dbtype);
53                if (!rValue) {
54                    rValue = [];
55                    rValue[0] = {
56                        fid: id,
57                        fid_title: this.DataSource.getProperty(res, "title"),
58                        dbtype: dbtype,
59                        fid_mode: this.DataSource.getProperty(res, "editmode")
60                    };
61                }
62            } else {
63                rValue = mcTreeHandler.Database.getObjectFormID(id, dbtype);
64            }
65        }
66        if (rValue && rValue.length > 0)
67            obj = rValue[0];
68        return obj;
69    },
70    autoCollapse: false,
71    progressWindow: null,
72    init: function(isContainer) {
73        try {
74            this.TREE.setAttribute("ref", this.DataSource.ABOUT_ROOT);
75            this.TREE.database.AddDataSource(this.DataSource.data);
76            this.autoCollapse = nsPreferences.getBoolPref("wiredmarker.tree.autoCollapse", false);
77            if (isContainer)
78                document.getElementById("mcTreeRule").setAttribute("iscontainer", true);
79            this.TREE.builder.rebuild();
80
81            this.TREE_POPUP.setAttribute("ref", this.DataSource.ABOUT_ROOT);
82            this.TREE_POPUP.database.AddDataSource(this.DataSource.data);
83            this.TREE_POPUP.builder.rebuild();
84        } catch (ex) {
85        }
86    },
87    done: function() {
88        this.DataSource.flush();
89        var dsEnum = this.TREE.database.GetDataSources();
90        while (dsEnum.hasMoreElements()) {
91            var ds = dsEnum.getNext().QueryInterface(Components.interfaces.nsIRDFDataSource);
92            this.TREE.database.RemoveDataSource(ds);
93        }
94    },
95    pageshow: function() {
96        try {
97            var selectIdx = mcTreeHandler.TREE.currentIndex;
98            mcTreeHandler.TREE.builder.rebuild();
99            if (selectIdx >= 0) {
100                mcTreeHandler.TREE.currentIndex = selectIdx;
101                if (!mcTreeHandler.TREE.view.selection.isSelected(mcTreeHandler.TREE.currentIndex))
102                    mcTreeHandler.TREE.view.selection.select(mcTreeHandler.TREE.currentIndex);
103                mcTreeHandler.TREE.focus();
104            }
105        } catch (ex) {
106        }
107    },
108    onPopuphidden: function(aEvent) {
109        var self = mcTreeHandler;
110        var resource = self.resource;
111        if (resource) {
112            var contextmenu = self.DataSource.getProperty(resource, "contextmenu");
113            var menu = document.getElementById(contextmenu);
114            if (menu)
115                menu.setAttribute("hidden", "true");
116        }
117    },
118    onMousedown: function(aEvent) {
119        mcTreeImageTooltip.onMousedown(aEvent);
120        mcItemView.onTreeClick(aEvent);
121        if (aEvent.button == 2) {
122            if (bitsSearchAcross.getIndex() == mcTreeHandler.TREE.currentIndex) {
123                mcTreeHandler.TREE.removeAttribute("contextmenu");
124                return;
125            }
126            var contextmenu_mode = nsPreferences.copyUnicharPref("wiredmarker.contextmenu.mode");
127            if (contextmenu_mode == "legacy") {
128                mcTreeHandler.TREE.setAttribute("contextmenu", this.POPUP.id);
129                this.POPUP.removeEventListener("popuphidden", mcTreeHandler.onPopuphidden, false);
130                var resource = this.resource;
131                if (resource) {
132                    var contextmenu = this.DataSource.getProperty(resource, "contextmenu");
133                    if (contextmenu != undefined && contextmenu != "") {
134                        var menu = document.getElementById(contextmenu);
135                        if (menu)
136                            menu.removeAttribute("hidden");
137                        this.POPUP.addEventListener("popuphidden", mcTreeHandler.onPopuphidden, false);
138                    }
139                }
140            } else {
141                var resource = this.resource;
142                if (this.DataSource.isContainer(resource)) {
143                    mcTreeHandler.TREE.setAttribute("contextmenu", this.POPUP_FOLDER.id);
144                    this.POPUP_FOLDER.removeEventListener("popuphidden", mcTreeHandler.onPopuphidden, false);
145                    if (resource) {
146                        var contextmenu = this.DataSource.getProperty(resource, "contextmenu");
147                        if (contextmenu != undefined && contextmenu != "") {
148                            var menu = document.getElementById(contextmenu);
149                            if (menu)
150                                menu.removeAttribute("hidden");
151                            this.POPUP_FOLDER.addEventListener("popuphidden", mcTreeHandler.onPopuphidden, false);
152                        }
153                    }
154                } else {
155                    mcTreeHandler.TREE.setAttribute("contextmenu", this.POPUP_OBJECT.id);
156                    this.POPUP_OBJECT.removeEventListener("popuphidden", mcTreeHandler.onPopuphidden, false);
157                    if (resource) {
158                        var contextmenu = this.DataSource.getProperty(resource, "contextmenu");
159                        if (contextmenu != undefined && contextmenu != "") {
160                            var menu = document.getElementById(contextmenu);
161                            if (menu)
162                                menu.removeAttribute("hidden");
163                            this.POPUP_OBJECT.addEventListener("popuphidden", mcTreeHandler.onPopuphidden, false);
164                        }
165                    }
166                }
167            }
168        } else {
169            mcTreeHandler.TREE.removeAttribute("contextmenu");
170        }
171    },
172    onMouseup: function(aEvent) {
173    },
174    onMousemove: function(aEvent) {
175        var param = {
176            tree: mcTreeHandler.TREE
177        };
178        try {
179            var row = {};
180            var col = {};
181            var childElt = {};
182            param.tree.treeBoxObject.getCellAt(aEvent.clientX, aEvent.clientY, row, col, childElt);
183            if (!row.value || !col.value || !childElt.value || childElt.value != "text") {
184            } else {
185                param.row = row;
186                param.col = col;
187                param.childElt = childElt;
188                if (mcTreeImageTooltip.tooltipRow != row.value) {
189                    var curRes = param.tree.builderView.getResourceAtIndex(row.value);
190                    var id = this.DataSource.getProperty(curRes, "id");
191                    var dbtype = this.DataSource.getProperty(curRes, "dbtype");
192                    var rtnObj = this.Database.getObject({oid: id}, dbtype);
193                    if (rtnObj)
194                        param.obj = rtnObj[0];
195                }
196            }
197        } catch (e) {
198        }
199        mcTreeImageTooltip.onMousemove(aEvent, param);
200    },
201    onMouseout: function(aEvent) {
202        mcTreeImageTooltip.onMouseout(aEvent);
203    },
204    onClick: function(aEvent, aType) {
205        var curIdx = this.TREE.currentIndex;
206        if (bitsSearchAcross.getIndex() == curIdx) {
207            mcPropertyView.dispProperty();
208            return;
209        }
210        if (curIdx >= 0)
211            mcPropertyView.dispProperty(mcTreeHandler.object);
212        var res = (mcTreeHandler.TREE.view.selection.count >= 1 && mcTreeHandler.TREE.currentIndex >= 0) ? mcTreeHandler.resource : null;
213        if (aEvent.button == 2) {
214            window.top.bitsScrapPartyAddonService.eventListener(aEvent, 1, res);
215            aEvent.stopPropagation();
216            return;
217        }
218        if (aEvent.button != 0 && aEvent.button != 1) {
219            window.top.bitsScrapPartyAddonService.eventListener(aEvent, 1, res);
220            aEvent.stopPropagation();
221            return;
222        }
223        var row = {};
224        var col = {};
225        var obj = {};
226        this.TREE.treeBoxObject.getCellAt(aEvent.clientX, aEvent.clientY, row, col, obj);
227        if (!obj.value || obj.value == "twisty")
228            return;
229        if (this.TREE.view.isContainer(curIdx)) {
230            var curRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx);
231            var source = this.DataSource.getProperty(curRes, "source");
232            if (source != "")
233                mcController.open(this.resource, aEvent.button == 1 || aEvent.ctrlKey || aEvent.shiftKey);
234        } else {
235            if (aType < 2 && aEvent.button != 1)
236                return;
237            mcController.open(this.resource, aEvent.button == 1 || aEvent.ctrlKey || aEvent.shiftKey);
238        }
239        window.top.bitsScrapPartyAddonService.eventListener(aEvent, 1, res);
240    },
241    onKeyDown: function(aEvent) {
242    },
243    onKeyUp: function(aEvent) {
244    },
245    onKeyPress: function(aEvent) {
246        switch (aEvent.keyCode) {
247            case aEvent.DOM_VK_RETURN :
248                if (this.TREE.view.isContainer(this.TREE.currentIndex))
249                    return;
250                mcController.open(this.resource, aEvent.ctrlKey || aEvent.shiftKey);
251                break;
252            case aEvent.DOM_VK_DELETE :
253                if (bitsSearchAcross.getIndex() == mcTreeHandler.TREE.currentIndex)
254                    return;
255                if (!(aEvent.ctrlKey || aEvent.shiftKey)) {
256                    aEvent.preventDefault();
257                    var res = mcTreeHandler.resource;
258                    if (!res)
259                        return;
260                    var id = this.DataSource.getProperty(res, "id");
261                    var type = this.DataSource.getProperty(res, "type");
262                    if (type == "localfolder")
263                        return;
264                    if (type == window.top.bitsMarkingCollection._uncategorized.dbtype)
265                        return;
266                    var refRootfolder = nsPreferences.copyUnicharPref("wiredmarker.rootfolder", "");
267                    if (refRootfolder == id)
268                        return;
269                    this.remove(aEvent);
270                }
271                break;
272            case aEvent.DOM_VK_F2 :
273                mcController.property(this.resource);
274                break;
275            default:
276                break;
277        }
278    },
279    onDblClick: function(aEvent) {
280        if (aEvent.originalTarget.localName != "treechildren" || aEvent.button != 0)
281            return;
282        if (this.TREE.view.isContainer(this.TREE.currentIndex))
283            return;
284        if (aEvent.button == 2) {
285            aEvent.stopPropagation();
286            return;
287        }
288        mcController.open(this.resource, aEvent.ctrlKey || aEvent.shiftKey);
289        return;
290    },
291    existsFolderTitle: function(aRes, aTitle) {
292        var i;
293        var len;
294        var contResList = this.DataSource.flattenResources(aRes, 1, false);
295        for (i = 0, len = contResList.length; i < len; i++) {
296            if (aRes.Value == contResList[i].Value)
297                continue;
298            if (this.DataSource.getProperty(contResList[i], "title") == aTitle)
299                return true;
300        }
301        return false;
302    },
303    create: function(pIdx) {
304        var curIdx = pIdx;
305        var curRes = null;
306        if (pIdx >= 0) {
307            if (!mcTreeHandler.TREE.view.isContainer(curIdx))
308                return;
309            curRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx);
310            if (!mcTreeHandler.TREE.view.isContainerOpen(curIdx))
311                mcTreeHandler.TREE.view.toggleOpenState(curIdx);
312        } else {
313            curRes = this.Common.RDF.GetResource(mcTreeHandler.TREE.ref);
314        }
315        var title = this.DataSource.getProperty(curRes, "title");
316        var style = this.DataSource.getProperty(curRes, "style");
317        var editmode = "0";
318        if (title != "") {
319            title = "New Folder [" + title + "]";
320        } else {
321            title = "New Folder";
322        }
323        if (editmode == "")
324            editmode = "0";
325        if (!style || style == "") {
326            var styleIdx = nsPreferences.getIntPref("wiredmarker.folderstyleindex", 1);
327            if (styleIdx > 8)
328                styleIdx = 1;
329            style = bitsMarker.PRESET_STYLES[styleIdx];
330            nsPreferences.setIntPref("wiredmarker.folderstyleindex", styleIdx);
331        }
332        if (this.existsFolderTitle(curRes, title)) {
333            var newTitle;
334            var cnt = 1;
335            do {
336                newTitle = title + "(" + (++cnt) + ")";
337            } while (this.existsFolderTitle(curRes, newTitle));
338            title = newTitle;
339        }
340        var newRes = mcMainService.createGroupFolder(title, curRes.Value, undefined, style, "", editmode);
341        mcController.rebuildLocal();
342        window.top.bitsMarkingCollection.reOrder(curRes);
343        var newIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(newRes);
344        mcTreeHandler.TREE.view.selection.select(newIdx);
345        mcTreeHandler.TREE.focus();
346        var result = mcController.property(newRes);
347        if (result) {
348            window.top.bitsMarkingCollection.reOrder(curRes);
349        } else {
350            mcTreeHandler.remove(undefined, undefined, true);
351        }
352        var newIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(newRes);
353        mcController.rebuildLocal();
354        var selectIdx = newIdx;
355        if (selectIdx < 0)
356            selectIdx = pIdx;
357        mcTreeHandler.TREE.currentIndex = selectIdx;
358        if (!mcTreeHandler.TREE.view.selection.isSelected(mcTreeHandler.TREE.currentIndex))
359            mcTreeHandler.TREE.view.selection.select(mcTreeHandler.TREE.currentIndex);
360        mcTreeHandler.TREE.focus();
361        mcTreeHandler.TREE.treeBoxObject.ensureRowIsVisible(selectIdx);
362        mcPropertyView.dispProperty(mcTreeHandler.object);
363    },
364    removeFolder: function(aEvent) {
365        if (!mcController.confirmRemovingFor(this.resource))
366            return false;
367        if (aEvent)
368            window.top.bitsScrapPartyAddonService.eventListener(aEvent, 0, this.resource);
369        var aMode = this.DataSource.getProperty(this.resource, "dbtype");
370        if (!this.Database.beginTransaction(aMode))
371            return false;
372        var curIdx = this.TREE.currentIndex;
373        var curRes = this.TREE.builderView.getResourceAtIndex(curIdx);
374        this._removeFolder(curRes);
375        this.Database.endTransaction(aMode);
376        mcController.rebuildLocal();
377        mcItemView.onTreeClick();
378        if (aEvent)
379            window.top.bitsScrapPartyAddonService.eventListener(aEvent, 1, this.resource);
380    },
381    _removeFolder: function(aRes) {
382        if (!aRes)
383            return [];
384        var curRes = aRes;
385        try {
386            this._removeAll(curRes);
387            var delObj = [];
388            var foldResList = this.DataSource.flattenResources(curRes, 1, true);
389            for (i = foldResList.length - 1; i >= 0; i--) {
390                var pRes = this.DataSource.findParentResource(foldResList[i]);
391                if (!this.DataSource.data.ArcLabelsOut(foldResList[i]).hasMoreElements() || this.Common.RDFCU.indexOf(this.DataSource.data, pRes, foldResList[i]) < 0)
392                    continue;
393                delObj.push({
394                    id: this.DataSource.getProperty(foldResList[i], "id"),
395                    dbtype: this.DataSource.getProperty(foldResList[i], "dbtype")
396                });
397                this.Common.RDFC.Init(this.DataSource.data, pRes);
398                this.Common.RDFC.RemoveElement(foldResList[i], true);
399            }
400            var rmIDs = [];
401            var addIDs = [];
402            var depth = 0;
403            do {
404                addIDs = this.DataSource.cleanUpIsolation();
405                rmIDs = rmIDs.concat(addIDs);
406            } while (addIDs.length > 0 && ++depth < 100);
407            this.DataSource.flush();
408            for (var i = 0; i < delObj.length; i++) {
409                this.Database.removeFolder(delObj[i].id, delObj[i].dbtype, false);
410            }
411        } catch (e) {
412            _dump("mcTreeHandler._removeFolder():" + e);
413        }
414    },
415    removeAllFolder: function(aEvent) {
416        if (!mcController.confirmRemovingFor(this.resource))
417            return false;
418        if (aEvent)
419            window.top.bitsScrapPartyAddonService.eventListener(aEvent, 0, this.resource);
420        var aMode = this.DataSource.getProperty(this.resource, "dbtype");
421        if (!this.Database.beginTransaction(aMode))
422            return false;
423        var curRes = this.TREE.builderView.getResourceAtIndex(this.TREE.currentIndex);
424        try {
425            var delObj = [];
426            var foldResList = this.DataSource.flattenResources(curRes, 1, false);
427            var i, j;
428            for (i = foldResList.length - 1; i >= 0; i--) {
429                if (foldResList[i].Value == curRes.Value)
430                    continue;
431                this._removeAll(foldResList[i]);
432            }
433            var foldResList = this.DataSource.flattenResources(curRes, 1, true);
434            for (i = foldResList.length - 1; i >= 0; i--) {
435                if (foldResList[i].Value == curRes.Value)
436                    continue;
437                var pRes = this.DataSource.findParentResource(foldResList[i]);
438                if (!this.DataSource.data.ArcLabelsOut(foldResList[i]).hasMoreElements() || this.Common.RDFCU.indexOf(this.DataSource.data, pRes, foldResList[i]) < 0)
439                    continue;
440                delObj.push({
441                    id: this.DataSource.getProperty(foldResList[i], "id"),
442                    dbtype: this.DataSource.getProperty(foldResList[i], "dbtype")
443                });
444                this.Common.RDFC.Init(this.DataSource.data, pRes);
445                this.Common.RDFC.RemoveElement(foldResList[i], true);
446            }
447            var rmIDs = [];
448            var addIDs = [];
449            var depth = 0;
450            do {
451                addIDs = this.DataSource.cleanUpIsolation();
452                rmIDs = rmIDs.concat(addIDs);
453            } while (addIDs.length > 0 && ++depth < 100);
454            this.DataSource.flush();
455            for (var i = 0; i < delObj.length; i++) {
456                this.Database.removeFolder(delObj[i].id, delObj[i].dbtype, false);
457            }
458        } catch (e) {
459            _dump("mcTreeHandler.removeAllFolder():" + e);
460        }
461        this.Database.endTransaction(aMode);
462        mcController.rebuildLocal();
463        if (aEvent)
464            window.top.bitsScrapPartyAddonService.eventListener(aEvent, 1, this.resource);
465    },
466    removeAll: function(aEvent) {
467        if (!mcController.confirmRemovingFor(this.resource))
468            return false;
469        if (aEvent)
470            window.top.bitsScrapPartyAddonService.eventListener(aEvent, 0, this.resource);
471        var aMode = this.DataSource.getProperty(this.resource, "dbtype");
472        if (!this.Database.beginTransaction(aMode))
473            return false;
474        var curRes = this.TREE.builderView.getResourceAtIndex(this.TREE.currentIndex);
475        this._removeAll(curRes);
476        this.Database.endTransaction(aMode);
477        mcController.rebuildLocal();
478        if (aEvent)
479            window.top.bitsScrapPartyAddonService.eventListener(aEvent, 1, this.resource);
480    },
481    _removeAll: function(aRes) {
482        if (!aRes)
483            return false;
484        var curRes = aRes;
485        try {
486            var delObj = [];
487            var foldResList = this.DataSource.flattenResources(curRes, 1, true);
488            var i, j;
489            for (i = foldResList.length - 1; i >= 0; i--) {
490                var pfid = this.DataSource.getProperty(foldResList[i], "id");
491                var contResList = this.DataSource.flattenResources(foldResList[i], 2, false);
492                this.Common.RDFC.Init(this.DataSource.data, foldResList[i]);
493                for (j = 0; j < contResList.length; j++) {
494                    if (!this.DataSource.data.ArcLabelsOut(contResList[j]).hasMoreElements() || this.Common.RDFCU.indexOf(this.DataSource.data, foldResList[i], contResList[j]) < 0)
495                        continue;
496                    delObj.push({
497                        pfid: pfid,
498                        id: this.DataSource.getProperty(contResList[j], "id"),
499                        dbtype: this.DataSource.getProperty(contResList[j], "dbtype"),
500                        source: this.DataSource.getProperty(contResList[j], "source")
501                    });
502                    this.Common.RDFC.RemoveElement(contResList[j], true);
503                }
504            }
505            var rmIDs = [];
506            var addIDs = [];
507            var depth = 0;
508            do {
509                addIDs = this.DataSource.cleanUpIsolation();
510                rmIDs = rmIDs.concat(addIDs);
511            } while (addIDs.length > 0 && ++depth < 100);
512            this.DataSource.flush();
513            var match_exp = new RegExp("^" + bitsMarker.id_key + ".+$", "m");
514            for (var i = 0; i < delObj.length; i++) {
515                this.Database.removeObject({oid: delObj[i].id, pfid: delObj[i].pfid}, delObj[i].dbtype, false);
516                if (delObj[i].source.match(match_exp))
517                    bitsMarker.unmarkerWindow(delObj[i].source);
518            }
519        } catch (e) {
520            _dump("mcTreeHandler.removeAll():" + e);
521            return false;
522        }
523        return true;
524    },
525    remove: function(aEvent, pRes, pConfirm, aTransaction) {
526        if (pConfirm == undefined)
527            pConfirm = false;
528        if (aTransaction == undefined)
529            aTransaction = true;
530        if (pRes == undefined && this.TREE.view.selection.count == 0)
531            return false;
532        if (!pConfirm)
533            if (!mcController.confirmRemovingFor(this.resource))
534                return false;
535        if (aEvent)
536            window.top.bitsScrapPartyAddonService.eventListener(aEvent, 0, this.resource);
537        var resList = [];
538        var parList = [];
539        if (this.TREE.view.selection.count > 1) {
540            var idxList = this.getSelection(false, 2);
541            if (idxList.length < 1)
542                return false;
543            if (this.validateMultipleSelection(idxList) == false)
544                return false;
545            var i;
546            for (i = 0; i < idxList.length; i++) {
547                resList.push(this.TREE.builderView.getResourceAtIndex(idxList[i]));
548                parList.push(this.getParentResource(idxList[i]));
549            }
550        } else {
551            var curRes;
552            var parRes;
553            if (pRes == undefined) {
554                var curIdx = this.TREE.currentIndex;
555                curRes = this.TREE.builderView.getResourceAtIndex(curIdx);
556                parRes = this.getParentResource(curIdx);
557            } else {
558                curRes = pRes;
559                parRes = this.DataSource.findParentResource(pRes);
560            }
561            resList.push(curRes);
562            parList.push(parRes);
563            var match_exp = new RegExp("^" + bitsMarker.id_key + ".+$", "m");
564            var source = this.DataSource.getProperty(curRes, "source");
565            if (source.match(match_exp))
566                bitsMarker.unmarkerWindow(source);
567            var id = this.DataSource.getProperty(curRes, "id");
568            var dbtype = this.DataSource.getProperty(curRes, "dbtype");
569            var pfid = this.DataSource.getProperty(curRes, "pfid");
570            var about = this.DataSource.getID2About(id, pfid, dbtype);
571            if (curRes.Value != about) {
572                var res = mcTreeDNDHandler.Common.RDF.GetResource(about);
573                resList.push(res);
574                parList.push(this.DataSource.findParentResource(res));
575                var source = this.DataSource.getProperty(res, "source");
576                if (source.match(match_exp))
577                    bitsMarker.unmarkerWindow(source);
578            }
579            if (aTransaction)
580                if (!this.Database.beginTransaction(dbtype))
581                    return false;
582            if (this.DataSource.isContainer(curRes)) {
583                this.Database.removeFolder(id, dbtype, false);
584            } else {
585                this.Database.removeObject({oid: id, pfid: pfid}, dbtype, false);
586            }
587            if (aTransaction)
588                this.Database.endTransaction(dbtype);
589        }
590        var rmIDs = mcController.removeInternal(resList, parList, false);
591        if (aTransaction)
592            mcPropertyView.dispProperty(mcTreeHandler.object);
593        this.isEdit = true;
594        if (aEvent)
595            window.top.bitsScrapPartyAddonService.eventListener(aEvent, 1, this.resource);
596        return true;
597    },
598    replacedURL: function(aEvent) {
599        var curIdx = this.TREE.currentIndex;
600        var curRes = this.TREE.builderView.getResourceAtIndex(curIdx);
601        var parRes = this.getParentResource(curIdx);
602        var id = this.DataSource.getProperty(curRes, "id");
603        var dbtype = this.DataSource.getProperty(curRes, "dbtype");
604        if (!this.DataSource.isContainer(curRes))
605            return;
606        var folderFilterHash = {};
607        var tmpFolderFilter = nsPreferences.copyUnicharPref("wiredmarker.filter.folder", "");
608        var tmpFolderFilterArr = tmpFolderFilter.split("\t");
609        var i;
610        for (i = 0; i < tmpFolderFilterArr.length; i++) {
611            if (!tmpFolderFilterArr[i].match(/^(\d+):(\d+):(.+)$/))
612                continue;
613            var filter_fid = RegExp.$1;
614            var filter_casesensitive = RegExp.$2;
615            var filter_keyword = RegExp.$3;
616            folderFilterHash[filter_fid] = new RegExp(filter_keyword, (filter_casesensitive == 1) ? "mg" : "img");
617        }
618        tmpFolderFilterArr = undefined;
619        tmpFolderFilter = undefined;
620        var prompts = this.Common.PROMPT;
621        var flags = prompts.STD_YES_NO_BUTTONS + prompts.BUTTON_POS_1_DEFAULT;
622        var button = prompts.confirmEx(window, mcMainService.STRING.getString("CONFIRM_REPLACED_TITLE"), mcMainService.STRING.getString("CONFIRM_REPLACED_TARGET"), flags, "", "", "", null, {});
623        var contResList = [];
624        if (button == 0) {
625            var folderList = this.DataSource.flattenResources(curRes, 1, true);
626            for (var i = 0; i < folderList.length; i++) {
627                var fid = this.DataSource.getProperty(folderList[i], "id");
628                var rtn = this.Database.getObject({pfid: fid}, dbtype);
629                if (!rtn)
630                    continue;
631                if (folderFilterHash[fid])
632                    rtn = rtn.filter(function(element, index, array) {
633                        return folderFilterHash[fid].test(element.oid_title);
634                    });
635                contResList = contResList.concat(rtn);
636            }
637        } else {
638            var rtn = this.Database.getObject({pfid: id}, dbtype);
639            if (rtn) {
640                if (folderFilterHash[fid])
641                    rtn = rtn.filter(function(element, index, array) {
642                        return folderFilterHash[fid].test(element.oid_title);
643                    });
644                contResList = contResList.concat(rtn);
645            }
646        }
647        if (contResList.length == 0) {
648            this.Common.alert(mcMainService.STRING.getString("ALERT_REPLACED_URL"), mcMainService.STRING.getString("CONFIRM_REPLACED_TITLE"));
649            return;
650        }
651        var result = {};
652        result.res = curRes;
653        result.list = contResList;
654        result.accept = false;
655        result.objArr = null;
656        result.callback = this._replacedURL_CB;
657        if (this._replacedURL_window && !this._replacedURL_window.closed)
658            this._replacedURL_window.close();
659        this._replacedURL_window = window.openDialog("chrome://markingcollection/content/replacedURL.xul", "", "chrome,centerscreen,alwaysRaised=yes,dependent=yes", result);
660    },
661    _replacedURL_CB: function(aResult) {
662        var self = mcTreeHandler;
663        if (aResult.accept) {
664            if (!self.progressWindow) {
665                var x = screen.width;
666                var y = screen.height;
667                self.progressWindow = window.openDialog(
668                        "chrome://markingcollection/content/progress.xul",
669                        "myProgress", "chrome,centerscreen,alwaysRaised,dependent=yes,left=" + x + ",top=" + y,
670                        {status: mcMainService.STRING.getString("MSG_REPLACED_URL") + "..."});
671            }
672            if (self.progressWindow && !self.progressWindow.closed) {
673                if (aResult.objArr.length > 0) {
674                    if (self.progressWindow.setStatus)
675                        self.progressWindow.setStatus(mcMainService.STRING.getString("MSG_REPLACED_URL") + "... [ " + aResult.objArr.length + " ]");
676                    self.progressWindow.focus();
677                    setTimeout(function() {
678                        mcTreeHandler._replacedURL(aResult.objArr);
679                    }, 0);
680                } else {
681                    if (self.progressWindow && !self.progressWindow.closed)
682                        self.progressWindow.close();
683                    self.progressWindow = null;
684                }
685            }
686        }
687        if (self._replacedURL_window && !self._replacedURL_window.closed)
688            self._replacedURL_window.close();
689        self._replacedURL_window = null;
690    },
691    _replacedURL: function(aObjArr) {
692        if (this.progressWindow && !this.progressWindow.closed) {
693            if (aObjArr.length > 0) {
694                if (this.progressWindow.setStatus)
695                    this.progressWindow.setStatus(mcMainService.STRING.getString("MSG_REPLACED_URL") + "... [ " + aObjArr.length + " ]");
696                this.progressWindow.focus();
697            } else {
698                if (this.progressWindow && !this.progressWindow.closed)
699                    this.progressWindow.close();
700                this.progressWindow = null;
701            }
702        }
703        if (aObjArr.length <= 0) {
704            mcTreeViewModeService.rebuild();
705            return;
706        }
707
708        var obj = aObjArr.shift();
709        var dbtype = obj.dbtype;
710        delete obj.dbtype;
711        if (obj.fid_style != undefined)
712            delete obj.fid_style;
713        if (obj.fid_title != undefined)
714            delete obj.fid_title;
715        if (obj.folder_order != undefined)
716            delete obj.folder_order;
717        var rtn = this.Database.updateObject(obj, dbtype);
718
719        setTimeout(function() {
720            mcTreeHandler._replacedURL(aObjArr);
721        }, 0);
722    },
723    getParentResource: function(aIdx) {
724        var parIdx = this.TREE.builderView.getParentIndex(aIdx);
725        if (parIdx == -1)
726            return this.TREE.resource;
727        else
728            return this.TREE.builderView.getResourceAtIndex(parIdx);
729    },
730    getSelection: function(idx2res, rule) {
731        var ret = [];
732        var rc;
733        var i;
734        for (rc = 0; rc < this.TREE.view.selection.getRangeCount(); rc++) {
735            var start = {}, end = {};
736            this.TREE.view.selection.getRangeAt(rc, start, end);
737            for (i = start.value; i <= end.value; i++) {
738                if (rule == 1 && !this.TREE.view.isContainer(i))
739                    continue;
740                if (rule == 2 && this.TREE.view.isContainer(i))
741                    continue;
742                ret.push(idx2res ? this.TREE.builderView.getResourceAtIndex(i) : i);
743            }
744        }
745        return ret;
746    },
747    validateMultipleSelection: function(aIdxList) {
748        if (aIdxList.length != this.TREE.view.selection.count) {
749            this.Common.alert(mcMainService.STRING.getString("ERROR_MULTIPLE_SELECTION"));
750            return false;
751        }
752        return true;
753    },
754    toggleFolder: function(aIdx) {
755        if (!aIdx)
756            aIdx = this.TREE.currentIndex;
757        this.TREE.view.toggleOpenState(aIdx);
758        if (this.autoCollapse)
759            this.collapseFoldersBut(aIdx);
760    },
761    toggleAllFolders: function(forceClose) {
762        var willOpen = true;
763        var i;
764        for (i = 0; i < this.TREE.view.rowCount; i++) {
765            if (!this.TREE.view.isContainer(i))
766                continue;
767            if (this.TREE.view.isContainerOpen(i)) {
768                willOpen = false;
769                break;
770            }
771        }
772        if (forceClose)
773            willOpen = false;
774        if (willOpen) {
775            for (i = 0; i < this.TREE.view.rowCount; i++) {
776                if (this.TREE.view.isContainer(i) && !this.TREE.view.isContainerOpen(i))
777                    this.TREE.view.toggleOpenState(i);
778            }
779        } else {
780            for (i = this.TREE.view.rowCount - 1; i >= 0; i--) {
781                if (this.TREE.view.isContainer(i) && this.TREE.view.isContainerOpen(i))
782                    this.TREE.view.toggleOpenState(i);
783            }
784        }
785    },
786    openAllFolders: function() {
787        var i;
788        for (i = 0; i < this.TREE.view.rowCount; i++) {
789            if (this.TREE.view.isContainer(i) && !this.TREE.view.isContainerOpen(i))
790                this.TREE.view.toggleOpenState(i);
791        }
792    },
793    collapseFoldersBut: function(curIdx) {
794        var ascIdxList = {};
795        ascIdxList[curIdx] = true;
796        while (curIdx >= 0) {
797            curIdx = this.TREE.builderView.getParentIndex(curIdx);
798            ascIdxList[curIdx] = true;
799        }
800        var i;
801        for (i = this.TREE.view.rowCount - 1; i >= 0; i--) {
802            if (!ascIdxList[i] && this.TREE.view.isContainer(i) && this.TREE.view.isContainerOpen(i)) {
803                this.TREE.view.toggleOpenState(i);
804            }
805        }
806    },
807};
808
809var mcController = {
810    _pageshow_elem_id: "",
811    _pageshow_elem_dbtype: "",
812    _pageshow_id: "",
813    get DataSource() {
814        return window.top.bitsObjectMng.DataSource;
815    },
816    get Common() {
817        return window.top.bitsObjectMng.Common;
818    },
819    get XPath() {
820        return window.top.bitsObjectMng.XPath;
821    },
822    get Database() {
823        return window.top.bitsObjectMng.Database;
824    },
825    get gBrowser() {
826        return window.top.bitsObjectMng.getBrowser();
827    },
828    get isTreeContext() {
829        return document.popupNode.nodeName == "treechildren";
830    },
831    onPopupShowing: function(aEvent) {
832        if (aEvent.originalTarget.localName != "popup")
833            return;
834        var res = mcTreeHandler.resource;
835        if (!res) {
836            aEvent.preventDefault();
837            return;
838        }
839        var viewmode = mcTreeViewModeService.viewmode;
840        var id = this.DataSource.getProperty(res, "id");
841        var type = this.DataSource.getProperty(res, "type");
842        var title = this.DataSource.getProperty(res, "title");
843        var source = this.DataSource.getProperty(res, "source");
844        var dbtype = this.DataSource.getProperty(res, "dbtype");
845        if (type == window.top.bitsMarkingCollection._uncategorized.dbtype)
846            type = 'localfolder';
847        var hidePopupRemoveFolder = false;
848        var contFolderList = [];
849        var contItemList = [];
850        var existsObject = false;
851        if (type.indexOf("folder") >= 0) {
852            contFolderList = this.DataSource.flattenResources(res, 1, false);
853            contItemList = this.DataSource.flattenResources(res, 2, true);
854            var folderList = this.DataSource.flattenResources(res, 1, true);
855            for (var i = 0; i < folderList.length; i++) {
856                var fid = this.DataSource.getProperty(folderList[i], "id");
857                if (!this.Database.existsObject({pfid: fid}, dbtype))
858                    continue;
859                existsObject = true;
860                break;
861            }
862            var refRootfolder = nsPreferences.copyUnicharPref("wiredmarker.rootfolder", "");
863            if (refRootfolder == id)
864                hidePopupRemoveFolder = true;
865        }
866        var contextmenu_type = nsPreferences.copyUnicharPref("wiredmarker.contextmenu.type", "");
867        try {
868            document.getElementById("mcPopupOpen").hidden = type.indexOf("folder") >= 0;
869            document.getElementById("mcPopupOpenNewTab").hidden = type.indexOf("folder") >= 0;
870            document.getElementById("mcPopupOpenAllItems").hidden = true;
871            document.getElementById("mcPopupOpenSeparator").hidden = (document.getElementById("mcPopupOpen").hidden && document.getElementById("mcPopupOpenAllItems").hidden);
872            document.getElementById("mcPopupCreates").hidden = type.indexOf("folder") < 0;
873            document.getElementById("mcPopupRemoveContents").hidden = type.indexOf("folder") >= 0;
874            document.getElementById("mcPopupRemoves").hidden = type == "item" || (contFolderList.length <= 1 && type == "localfolder");
875            document.getElementById("mcPopupRemoveAllFolder").hidden = type == "item" || contFolderList.length <= 1;
876            document.getElementById("mcPopupRemoveFolder").hidden = type != "folder" || hidePopupRemoveFolder;
877            document.getElementById("mcPopupRemoveAllContents").hidden = contItemList.length == 0;
878            document.getElementById("mcPopupEditReplacedURL").hidden = type.indexOf("folder") < 0 || !existsObject || contextmenu_type == "simple";
879            document.getElementById("mcPopupViewMenu").hidden = type.indexOf("folder") < 0;
880            document.getElementById("mcPopupRootFolder").hidden = true;
881            document.getElementById("mcPopupFilter").hidden = type.indexOf("folder") < 0 || contextmenu_type == "simple";
882            document.getElementById("mcPopupFilterSeparator").hidden = !document.getElementById("mcPopupRootFolder").hidden || document.getElementById("mcPopupFilter").hidden || contextmenu_type == "simple";
883            document.getElementById("mcPopupExport").hidden = type.indexOf("folder") < 0;
884            document.getElementById("mcPopupTemplateFolder").hidden = type != "folder";
885            document.getElementById("mcPopupImportTag").hidden = type != "folder" || contextmenu_type == "simple";
886            document.getElementById("mcPopupFolderAutoOpenSeparator").hidden = !document.getElementById("mcPopupRootFolder").hidden || mcItemView.isChecked;
887            document.getElementById("mcPopupFolderAutoOpenSeparator").hidden = type != "folder" || mcItemView.isChecked;
888            ;
889            document.getElementById("mcPopupFolderAutoOpen").hidden = type != "folder" || mcItemView.isChecked;
890            document.getElementById("mcPopupAddonMenu").hidden = !(type.indexOf("folder") == 0 && window.top.bitsScrapPartyAddonService.existsAddon(true) && contFolderList.length <= 1 && !existsObject) || contextmenu_type == "simple";
891            document.getElementById("mcPopupHyperAnchorCopyToClipboard").hidden = type.indexOf("folder") >= 0;
892            document.getElementById("mcPopupHyperAnchorCopyFormatSetting").hidden = type.indexOf("folder") >= 0;
893            document.getElementById("mcPopupHyperAnchorCopyFormatToClipboard").hidden = type.indexOf("folder") >= 0;
894            if (!document.getElementById("mcPopupRootFolder").hidden) {
895                var index = mcTreeHandler.TREE.currentIndex;
896                var res = mcTreeHandler.TREE.builderView.getResourceAtIndex(index);
897                var baseID = this.DataSource.getProperty(res, "id");
898                var rootfolder = nsPreferences.copyUnicharPref("wiredmarker.rootfolder", "");
899                if (baseID == rootfolder) {
900                    document.getElementById("mcPopupRootFolder").setAttribute("checked", true);
901                } else {
902                    document.getElementById("mcPopupRootFolder").removeAttribute("checked");
903                }
904            }
905            if (!document.getElementById("mcPopupFilter").hidden) {
906                if (mcTreeFolderFilterService.isUseFilter(res))
907                    document.getElementById("mcPopupFilter").setAttribute("checked", true);
908                else
909                    document.getElementById("mcPopupFilter").removeAttribute("checked");
910            }
911            if (!document.getElementById("mcPopupFolderAutoOpen").hidden) {
912                var folderautoopen = nsPreferences.getBoolPref("wiredmarker.folderautoopen", true);
913                if (folderautoopen) {
914                    document.getElementById("mcPopupFolderAutoOpen").removeAttribute("checked");
915                } else {
916                    document.getElementById("mcPopupFolderAutoOpen").setAttribute("checked", true);
917                }
918            }
919            document.getElementById("mcPopupFolderRemoveAllContents").hidden = contItemList.length == 0;
920            document.getElementById("mcPopupFolderRemoveFolder").hidden = type != "folder" || hidePopupRemoveFolder;
921            window.top.bitsScrapPartyAddonService.eventListener(aEvent, 1, res);
922        } catch (ex) {
923            _dump(ex)
924        }
925    },
926    onPopupHiding: function(aEvent) {
927        if (aEvent.originalTarget.localName != "popup")
928            return;
929        var res = mcTreeHandler.resource;
930        if (!res) {
931            aEvent.preventDefault();
932            return;
933        }
934        try {
935            window.top.bitsScrapPartyAddonService.eventListener(aEvent, 1, res);
936        } catch (ex) {
937            _dump(ex)
938        }
939    },
940    copy: function(aMode) {
941        var aRes = mcTreeHandler.resource;
942        if (!aRes)
943            return;
944        if (!aMode)
945            aMode = 'copy';
946        var id = this.DataSource.getProperty(aRes, "id");
947        if (!id)
948            return;
949        switch (this.DataSource.getProperty(aRes, "type")) {
950            case "folder" :
951            case "item" :
952                var id = this.DataSource.getProperty(aRes, "id");
953                var dbtype = this.DataSource.getProperty(aRes, "dbtype");
954                window.top.bitsMetaCapture.copyToClipBoard(id, dbtype, aMode);
955                break;
956            default :
957                break;
958        }
959    },
960    open: function(aRes, tabbed) {
961        if (!aRes)
962            aRes = mcTreeHandler.resource;
963        if (!aRes)
964            return;
965        var id = this.DataSource.getProperty(aRes, "id");
966        if (!id)
967            return;
968        switch (this.DataSource.getProperty(aRes, "type")) {
969            case "folder" :
970            case "item" :
971                var id = this.DataSource.getProperty(aRes, "id");
972                var pfid = this.DataSource.getProperty(aRes, "pfid");
973                var dbtype = this.DataSource.getProperty(aRes, "dbtype");
974                var aObject = this.Database.getObject({oid: id, pfid: pfid}, dbtype)[0];
975                this.Common.loadFromObject(aObject, tabbed);
976                break;
977            default :
978                this.Common.loadURL(mcMainService.baseURL + "data/" + id + "/index.html", tabbed || mcMainService.prefs.tabsOpen);
979        }
980    },
981    openAllInTabs: function(aRes) {
982        if (!aRes)
983            aRes = mcTreeHandler.resource;
984        if (!aRes)
985            return;
986        var resList = this.DataSource.flattenResources(aRes, 2, true);
987        resList.forEach(
988                function(res) {
989                    var uri = window.top.bitsObjectMng.DataSource.getProperty(res, "uri");
990                    window.top.bitsObjectMng.Common.loadURL(uri, true);
991                }
992        );
993    },
994    property: function(aRes) {
995        if (!aRes)
996            aRes = mcTreeHandler.resource;
997        if (!aRes)
998            return;
999        var id = this.DataSource.getProperty(aRes, "id");
1000        if (!id)
1001            return;
1002        var result = {};
1003        var regexp = new RegExp("^" + this.DataSource.ABOUT_ITEM + "(\\d+)$");
1004        aRes.Value.match(regexp);
1005        id = RegExp.$1;
1006        var old_style = this.DataSource.getProperty(aRes, "style");
1007        window.openDialog("chrome://markingcollection/content/property.xul", "", "chrome,centerscreen,modal", id, result);
1008        if (result.accept) {
1009            try {
1010                this.DataSource.flush();
1011                this.rebuildLocal();
1012                if (this.DataSource.isContainer(aRes)) {
1013                    var fid = this.DataSource.getProperty(aRes, "id");
1014                    var dbtype = this.DataSource.getProperty(aRes, "dbtype");
1015                    var style = this.DataSource.getProperty(aRes, "style");
1016                    var title = this.DataSource.getProperty(aRes, "title");
1017                    if (fid == "0" && dbtype == window.top.bitsMarkingCollection._uncategorized.dbtype) {
1018                        nsPreferences.setUnicharPref("wiredmarker.uncategorized.style", style);
1019                        nsPreferences.setUnicharPref("wiredmarker.uncategorized.title", title);
1020                    } else {
1021                        if (this.Database.updateFolder({fid: fid, fid_style: style}, dbtype))
1022                            this.DataSource.setProperty(aRes, "style", style);
1023                    }
1024                    var doc_url = this.Common.getURLStringFromDocument(this.gBrowser.contentDocument);
1025                    var contResList = this.Database.getObject({pfid: fid, doc_url: doc_url}, dbtype);
1026                    if (contResList) {
1027                        var i;
1028                        for (i = 0; i < contResList.length; i++) {
1029                            var source = bitsMarker.id_key + contResList[i].dbtype + contResList[i].oid;
1030                            mcTreeDNDHandler.Common.changeNodeStyleFromID(source, style, fid, contResList[i].oid, contResList[i].dbtype);
1031                        }
1032                    }
1033                    this.DataSource.flush();
1034                    mcTreeCssService.init();
1035                    this.rebuildLocal();
1036                    mcPropertyView.dispProperty(mcTreeHandler.object);
1037                    if (mcItemView.isChecked)
1038                        mcItemView.onTreeClick();
1039                } else {
1040                    mcPropertyView.dispProperty(mcTreeHandler.object);
1041                }
1042            } catch (ex) {
1043                _dump("property():[" + ex + "]");
1044            }
1045        }
1046        return result.accept;
1047    },
1048    removeInternal: function(aResList, aParResList, aBypassConfirm) {
1049        var rmIDs = [];
1050        for (var i = 0; i < aResList.length; i++) {
1051            var id = this.DataSource.getProperty(aResList[i], "id");
1052            var dbtype = this.DataSource.getProperty(aResList[i], "dbtype");
1053            var pfid = this.DataSource.getProperty(aResList[i], "pfid");
1054            if (!this.DataSource.exists(aResList[i]) || this.DataSource.getRelativeIndex(aParResList[i], aResList[i]) < 0) {
1055                _dump("ERROR: Failed to remove resource.\n" + aResList[i].Value);
1056                continue;
1057            }
1058            rmIDs = rmIDs.concat(this.DataSource.deleteItemDescending(aResList[i], aParResList[i]));
1059            this.DataSource.setID2About(id, pfid, undefined, dbtype);
1060        }
1061        this.DataSource.flush();
1062        return rmIDs;
1063    },
1064    confirmRemovingFor: function(aRes) {
1065        try {
1066            if (this.DataSource.isContainer(aRes) || mcMainService.prefs.confirmDelete) {
1067                return this.Common.confirm(mcMainService.STRING.getString("CONFIRM_DELETE"));
1068            }
1069            return true;
1070        } catch (e) {
1071            return false;
1072        }
1073    },
1074    rebuildLocal: function() {
1075        var currentIndex = mcTreeHandler.TREE.currentIndex;
1076        mcTreeHandler.TREE.builder.rebuild();
1077        if (currentIndex >= 0) {
1078            mcTreeHandler.TREE.currentIndex = currentIndex;
1079            if (!mcTreeHandler.TREE.view.selection.isSelected(mcTreeHandler.TREE.currentIndex))
1080                mcTreeHandler.TREE.view.selection.select(mcTreeHandler.TREE.currentIndex);
1081            mcTreeHandler.TREE.focus();
1082            mcTreeHandler.TREE.treeBoxObject.ensureRowIsVisible(currentIndex);
1083            mcPropertyView.dispProperty(mcTreeHandler.object);
1084        }
1085    },
1086};
1087
1088var mcMainService = {
1089    get STRING() {
1090        return document.getElementById("mcMainString");
1091    },
1092    get DataSource() {
1093        return window.top.bitsObjectMng.DataSource;
1094    },
1095    get Common() {
1096        return window.top.bitsObjectMng.Common;
1097    },
1098    get XPath() {
1099        return window.top.bitsObjectMng.XPath;
1100    },
1101    get Database() {
1102        return window.top.bitsObjectMng.Database;
1103    },
1104    get gBrowser() {
1105        return window.top.bitsObjectMng.getBrowser();
1106    },
1107    baseURL: "",
1108    prefs: {},
1109    _init: false,
1110    init: function(aEvent) {
1111        try {
1112            if (!window.top.bitsObjectMng) {
1113                setTimeout(function() {
1114                    mcMainService.init(aEvent);
1115                }, 1000);
1116                return;
1117            }
1118        } catch (ex) {
1119            setTimeout(function() {
1120                mcMainService.init(aEvent);
1121            }, 1000);
1122            return;
1123        }
1124        try {
1125            window.top.bitsMarkingCollection._contentWindow = document.defaultView;
1126            this.initPrefs();
1127            this.DataSource.init();
1128            mcTreeHandler.init(false);
1129            mcTreeDNDHandler.init();
1130            mcTreeMultiDocumentService.init();
1131            mcItemView.init();
1132            mcTreeRootFolder.init();
1133            mcTreeViewModeService.init();
1134            mcTreeCssService.init();
1135            bitsTreeDate.init(aEvent);
1136            mcTreeTemplateFolder.init();
1137            mcTreeImageTooltip.init();
1138            mcTreeFavoriteFolder.init();
1139            try {
1140                this.gBrowser.addEventListener("pageshow", mcTreeHandler.pageshow, false);
1141                window.top.addEventListener("focus", mcDatabaseUpdate.rebuild, false);
1142            } catch (ex2) {
1143                _dump2("mcMainService.init():" + ex2);
1144            }
1145            this.Common.addPrefListener(mcDatabaseObserver);
1146            var clone = top.document.getElementById("mciconimage");
1147            if (!clone) {
1148                var sidebartitle = top.document.getElementById("sidebar-title");
1149                var sidebarthrobber = top.document.getElementById("sidebar-throbber");
1150                clone = sidebarthrobber.cloneNode(false);
1151                /* clone.setAttribute("src","chrome://markingcollection/skin/icon_16.gif"); */
1152                /* DASISH icon set as src (icon shown in top area of left sidebar */
1153                clone.setAttribute("src", "chrome://markingcollection/skin/annotator-skin/alphatransparent/dasish_header_logo.png");
1154                clone.setAttribute("id", "mciconimage");
1155                clone.setAttribute("crop", "end");
1156                sidebartitle.parentNode.setAttribute("style", "background: #d4dde5");
1157                sidebartitle.parentNode.insertBefore(clone, sidebartitle);
1158            }
1159            var viewmode = mcTreeViewModeService.viewmode;
1160            if (viewmode == "each")
1161                mcTreeHandler.openAllFolders();
1162            if (window.top.bitsScrapPartyAddonService && window.top.bitsScrapPartyAddonService.existsAddon()) {
1163                var addon_info_arr = window.top.bitsScrapPartyAddonService.getAddonInfo();
1164                if (addon_info_arr && addon_info_arr.length > 0) {
1165                    var i;
1166                    for (i = 0; i < addon_info_arr.length; i++) {
1167                        if (!addon_info_arr[i].side_toolbar)
1168                            continue;
1169                        if (!addon_info_arr[i].side_toolbar.attrs.xul)
1170                            continue;
1171                        try {
1172                            var xul = document.getElementsByTagName(addon_info_arr[i].side_toolbar.attrs.xul)[0].cloneNode(false);
1173                            delete addon_info_arr[i].side_toolbar.attrs.xul;
1174                            var j;
1175                            for (j = xul.attributes.length - 1; j >= 0; j--) {
1176                                xul.removeAttribute(xul.attributes[j].name);
1177                            }
1178                            var event_attr = [];
1179                            var key;
1180                            for (key in addon_info_arr[i].side_toolbar.attrs) {
1181                                if (key.match(/^on([A-Za-z]+)$/)) {
1182                                    event_attr[RegExp.$1] = addon_info_arr[i].side_toolbar.attrs[key];
1183                                } else {
1184                                    xul.setAttribute(key, addon_info_arr[i].side_toolbar.attrs[key]);
1185                                }
1186                            }
1187                            var pxul = document.getElementById("mcToolbarAddonHBox");
1188                            pxul.appendChild(xul);
1189                            for (key in event_attr) {
1190                                //xul.addEventListener(key,eval(event_attr[key]),false);
1191                            }
1192                        } catch (ex_xul) {
1193                            continue;
1194                        }
1195                    }
1196                }
1197                try {
1198                    window.top.bitsScrapPartyAddonService.eventListener(aEvent, 1, undefined);
1199                } catch (ex) {
1200                    _dump2(ex)
1201                }
1202            }
1203            try {
1204                if (nsPreferences.getBoolPref("wiredmarker.debug", false))
1205                    document.getElementById("mcToolbarMenuButton").removeAttribute("hidden");
1206            } catch (e) {
1207            }
1208            try {
1209                mcTreeViewModeService.rebuild();
1210            } catch (ex2) {
1211                _dump2("mcMainService.init():" + ex2);
1212            }
1213            mcDatabaseUpdate.init();
1214            mcItemView.disp();
1215        } catch (ex) {
1216            this.Common.alert("mcMainService.init():" + ex);
1217        }
1218    },
1219    initPrefs: function() {
1220        this.prefs.confirmDelete = window.top.bitsObjectMng.Common.getBoolPref("wiredmarker.confirmDelete", true);
1221        this.prefs.tabsOpen = window.top.bitsObjectMng.Common.getBoolPref("wiredmarker.tabs.open", false);
1222        this.prefs.tabsOpenSource = window.top.bitsObjectMng.Common.getBoolPref("wiredmarker.tabs.openSource", false);
1223    },
1224    refresh: function() {
1225        mcTreeHandler.done();
1226        mcTreeDNDHandler.quit();
1227        this.init();
1228    },
1229    done: function(aEvent) {
1230        try {
1231            mcItemView.done();
1232            mcTreeRdfRebuildItem.done();
1233            this.Common.removePrefListener(mcDatabaseObserver);
1234            this.gBrowser.removeEventListener("pageshow", mcTreeHandler.pageshow, false);
1235            window.top.removeEventListener("focus", mcDatabaseUpdate.rebuild, false);
1236            var mciconimage = top.document.getElementById("mciconimage");
1237            if (mciconimage)
1238                mciconimage.parentNode.removeChild(mciconimage);
1239            mcTreeHandler.done();
1240            mcTreeDNDHandler.quit();
1241            mcTreeViewModeService.done();
1242            mcTreeTemplateFolder.done();
1243            mcTreeImageTooltip.done();
1244            try {
1245                window.top.bitsScrapPartyAddonService.eventListener(aEvent, 1, undefined);
1246            } catch (ex2) {
1247                _dump(ex)
1248            }
1249            window.top.bitsObjectMng.DataSource.done();
1250        } catch (ex) {
1251            this.Common.alert('done():' + ex);
1252        }
1253        try {
1254            window.top.bitsMarkingCollection._contentWindow = null;
1255        } catch (e) {
1256        }
1257    },
1258    locate: function(aRes) {
1259        if (aRes.Value == window.top.bitsObjectMng.DataSource.ABOUT_ROOT)
1260            return;
1261        var resList = [aRes];
1262        var i;
1263        for (i = 0; i < 32; i++) {
1264            aRes = window.top.bitsObjectMng.DataSource.findParentResource(aRes);
1265            if (aRes.Value == window.top.bitsObjectMng.DataSource.ABOUT_ROOT)
1266                break;
1267            resList.unshift(aRes);
1268        }
1269        for (i = 0; i < resList.length; i++) {
1270            var idx = mcTreeHandler.TREE.builderView.getIndexOfResource(resList[i]);
1271            if (!mcTreeHandler.TREE.view.isContainerOpen(idx))
1272                mcTreeHandler.TREE.view.toggleOpenState(idx);
1273        }
1274        mcTreeHandler.TREE.treeBoxObject.ensureRowIsVisible(idx);
1275        mcTreeHandler.TREE.view.selection.select(idx);
1276        mcTreeHandler.TREE.focus();
1277        mcPropertyView.dispProperty(mcTreeHandler.object);
1278    },
1279    createGroupFolder: function(pTitle, pTarResName, pGroup, pStyle, pSource, pEditMode, pIndex) {
1280        var tarRes = this.Common.RDF.GetResource(pTarResName);
1281        var pPID = this.DataSource.getProperty(tarRes, "id");
1282        var dbtype = this.DataSource.getProperty(tarRes, "dbtype");
1283        var folder = this.Database.getFolderFormID(pPID, dbtype);
1284        var newFolder = this.Database.newFolder();
1285        newFolder.fid_title = pTitle;
1286        newFolder.fid_style = pStyle;
1287        newFolder.pfid = "" + pPID;
1288        newFolder.fid_mode = "" + pEditMode;
1289        if (!this.Database.addFolder(newFolder, dbtype))
1290            return null;
1291        var newItem = this.Common.newItem();
1292        newItem.id = newFolder.fid;
1293        newItem.about = this.DataSource.getAbout(newFolder.fid, newFolder.pfid, dbtype);
1294        newItem.pfid = pPID;
1295        newItem.title = pTitle;
1296        newItem.type = "folder";
1297        newItem.style = pStyle;
1298        newItem.source = pSource;
1299        newItem.cssrule = 'css_' + dbtype + '_' + newFolder.fid;
1300        newItem.dbtype = dbtype;
1301        if (pIndex)
1302            newItem.index = pIndex;
1303        if (pEditMode) {
1304            newItem.editmode = pEditMode;
1305        } else {
1306            newItem.editmode = "false";
1307        }
1308//0.299*R + 0.587*G + 0.114*B
1309        var tarResName, tarRelIdx;
1310        tarResName = pTarResName;
1311        try {
1312            var cont = window.top.bitsObjectMng.DataSource.getContainer(tarResName, false);
1313            tarRelIdx = cont.GetCount();
1314        } catch (ex) {
1315            tarRelIdx = -1;
1316        }
1317        var newRes = window.top.bitsObjectMng.DataSource.addItem(newItem, tarResName, tarRelIdx, dbtype);
1318        if (newRes && newRes.Value) {
1319            window.top.bitsObjectMng.DataSource.flush();
1320            window.top.bitsObjectMng.DataSource.createEmptySeq(newRes.Value);
1321        }
1322        return newRes;
1323    },
1324    openPrefWindow: function() {
1325        window.top.bitsMarkingCollection.openPrefWindow();
1326    },
1327};
1328
1329var mcTreeDNDHandler = {
1330    row: 0,
1331    orient: 0,
1332    modAlt: false,
1333    modShift: false,
1334    modCtrl: false,
1335    modMeta: false,
1336    _dataTransfer: null, //3.1以降
1337
1338    folderAutoOpenRow: -1,
1339    rangeParent: null,
1340    originalTarget: null,
1341    get DataSource() {
1342        return window.top.bitsObjectMng.DataSource;
1343    },
1344    get Common() {
1345        return window.top.bitsObjectMng.Common;
1346    },
1347    get XPath() {
1348        return window.top.bitsObjectMng.XPath;
1349    },
1350    get Database() {
1351        return window.top.bitsObjectMng.Database;
1352    },
1353    get gBrowser() {
1354        return window.top.bitsObjectMng.getBrowser();
1355    },
1356    onDragDrop: function(aEvent) {
1357        mcTreeDNDHandler.getModifiers(aEvent);
1358        this.nsDragAndDrop_drop(aEvent, mcTreeDNDHandler.dragDropObserver);
1359        aEvent.stopPropagation();
1360    },
1361    nsDragAndDrop_drop: function(aEvent, aDragDropObserver) {
1362        if (!("onDrop" in aDragDropObserver))
1363            return;
1364        if (!nsDragAndDrop.checkCanDrop(aEvent, aDragDropObserver))
1365            return;
1366        if (nsDragAndDrop.mDragSession.canDrop) {
1367            var flavourSet = aDragDropObserver.getSupportedFlavours();
1368            var transferData = mcTreeDNDHandler.nsTransferable_get(flavourSet, nsDragAndDrop.getDragData, true);
1369            var multiple = "canHandleMultipleItems" in aDragDropObserver && aDragDropObserver.canHandleMultipleItems;
1370            var dropData = multiple ? transferData : transferData.first.first;
1371            aDragDropObserver.onDrop(aEvent, dropData, nsDragAndDrop.mDragSession);
1372        }
1373        aEvent.stopPropagation();
1374    },
1375    nsTransferable_get: function(aFlavourSet, aRetrievalFunc, aAnyFlag) {
1376        if (!aRetrievalFunc)
1377            throw "No data retrieval handler provided!";
1378        var supportsArray = aRetrievalFunc(aFlavourSet);
1379        var dataArray = [];
1380        var count = supportsArray.Count();
1381        for (var i = 0; i < count; i++) {
1382            var trans = supportsArray.GetElementAt(i);
1383            if (!trans)
1384                continue;
1385            trans = trans.QueryInterface(Components.interfaces.nsITransferable);
1386            var data = {};
1387            var length = {};
1388            var currData = null;
1389            if (aAnyFlag) {
1390                var flavour = {};
1391                try {
1392                    trans.getAnyTransferData(flavour, data, length);
1393                    if (data && flavour) {
1394                        var selectedFlavour = aFlavourSet.flavourTable[flavour.value];
1395                        if (selectedFlavour)
1396                            dataArray[i] = FlavourToXfer(data.value, length.value, selectedFlavour);
1397                    }
1398                } catch (ex) {
1399                    _dump2("nsTransferable_get(" + i + "):" + ex);
1400                    continue;
1401                }
1402            } else {
1403                var firstFlavour = aFlavourSet.flavours[0];
1404                trans.getTransferData(firstFlavour, data, length);
1405                if (data && firstFlavour)
1406                    dataArray[i] = FlavourToXfer(data.value, length.value, firstFlavour);
1407            }
1408        }
1409        return new TransferDataSet(dataArray);
1410    },
1411    dragDropObserver: {
1412        onDragStart: function(event, transferData, action) {
1413            try {
1414                mcTreeImageTooltip.hidePopup()
1415            } catch (ex) {
1416            }
1417            try {
1418                if (event.originalTarget.localName != "treechildren")
1419                    return;
1420                var curIdx = mcTreeHandler.TREE.currentIndex;
1421                var res = mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx);
1422                var source = mcTreeDNDHandler.DataSource.getProperty(res, "source");
1423                var editmode = mcTreeDNDHandler.DataSource.getProperty(res, "editmode");
1424                var curPar = mcTreeHandler.getParentResource(curIdx);
1425                var p_source = window.top.bitsObjectMng.DataSource.getProperty(curPar, "source");
1426                transferData.data = new TransferData();
1427                transferData.data.addDataForFlavour("moz/rdfitem", res.Value);
1428            } catch (ex) {
1429                _dump("dragDropObserver.onDragStart():" + ex);
1430            }
1431        },
1432        getSupportedFlavours: function() {
1433            var flavours = new FlavourSet();
1434            flavours.appendFlavour("moz/rdfitem");
1435            flavours.appendFlavour("text/x-moz-url");
1436            flavours.appendFlavour("text/html");
1437            flavours.appendFlavour("text/xml");
1438            flavours.appendFlavour("application/x-moz-url");
1439            flavours.appendFlavour("application/x-moz-file", "nsIFile");
1440            flavours.appendFlavour("text/unicode");
1441            flavours.appendFlavour("wired-marker/folder");
1442            flavours.appendFlavour("wired-marker/object");
1443            return flavours;
1444        },
1445        onDragOver: function(event, flavour, session) {
1446        },
1447        onDragExit: function(event, session) {
1448        },
1449        onDrop: function(event, transferData, session) {
1450        },
1451    },
1452    builderObserver: {
1453        canDrop: function(index, orient) {
1454            var XferDataSet = null;
1455            var XferData = null;
1456            var doraggedData = null;
1457            var XferDataType = null;
1458            var info = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
1459            var app_version = parseFloat(info.version);
1460            if (app_version < 3.1) {
1461                try {
1462                    XferDataSet = nsTransferable.get(mcTreeDNDHandler.dragDropObserver.getSupportedFlavours(), nsDragAndDrop.getDragData, true);
1463                    XferData = XferDataSet.first.first;
1464                    doraggedData = XferData.data;
1465                    XferDataType = XferData.flavour.contentType;
1466                } catch (ex) {
1467                }
1468            } else {
1469                try {
1470                    if (mcTreeDNDHandler._dataTransfer) {
1471                        var dataTransfer = mcTreeDNDHandler._dataTransfer;
1472                        XferData = {};
1473                        var supportedTypes = ["moz/rdfitem", "wired-marker/object", "text/x-moz-url", "text/url-list", "text/plain", "application/x-moz-file"];
1474                        var types = dataTransfer.types;
1475                        types = supportedTypes.filter(function(value) {
1476                            return types.contains(value);
1477                        });
1478                        if (types.length) {
1479                            XferData.data = dataTransfer.getData(types[0]);
1480                            XferData.flavour = {contentType: types[0]};
1481                            if (!XferData.data)
1482                                XferData.data = dataTransfer.mozGetDataAt(types[0], 0);
1483                        }
1484                        if (XferData.data) {
1485                            doraggedData = XferData.data;
1486                            XferDataType = XferData.flavour.contentType;
1487                        }
1488                    }
1489                } catch (ex) {
1490                    XferData = undefined;
1491                    doraggedData = undefined;
1492                    XferDataType = undefined;
1493                }
1494            }
1495            try {
1496                var res = (index == -1) ? [mcTreeHandler.TREE.ref, 0] : mcTreeDNDHandler.getTarget(index, orient);
1497                var curRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(index);
1498                var editmode = window.top.bitsObjectMng.DataSource.getProperty(curRes, "editmode");
1499                var dbtype = window.top.bitsObjectMng.DataSource.getProperty(curRes, "dbtype");
1500                if (dbtype == "")
1501                    return false;
1502                if (res[0] == mcTreeHandler.TREE.ref && !(editmode & 0x1000))
1503                    return false;
1504                if (mcTreeHandler.TREE.currentIndex >= 0 && XferDataType == "moz/rdfitem") {
1505                    var srcRes = mcTreeHandler.resource;
1506                    var d_editmode = window.top.bitsObjectMng.DataSource.getProperty(srcRes, "editmode");
1507                    if (res[0] != mcTreeHandler.TREE.ref && (d_editmode & 0x1000))
1508                        return false;
1509                    if (res[0] != mcTreeHandler.TREE.ref && ((editmode & 0x1000) && (d_editmode & 0x1000)))
1510                        return false;
1511                } else {
1512                    if (editmode & 0x1000) {
1513                        if (XferDataType == "text/x-moz-url" || XferDataType == "application/x-moz-file") {
1514                            var url;
1515                            var aFile;
1516                            if (XferDataType == "text/x-moz-url") {
1517                                url = doraggedData.split("\n")[0];
1518                                aFile = mcTreeHandler.Common.convertURLToFile(url);
1519                            } else if (XferDataType == "application/x-moz-file") {
1520                                aFile = doraggedData;
1521                                url = mcTreeDNDHandler.Common.convertFilePathToURL(aFile.path);
1522                            }
1523                            if (!aFile || !aFile.exists() || !url)
1524                                return false;
1525                            var splitFileName = mcTreeHandler.Common.splitFileName(url);
1526                            if (splitFileName[1].toLowerCase() != "xml" && splitFileName[1].toLowerCase() != "zip")
1527                                return false;
1528                        } else {
1529                            return false;
1530                        }
1531                    } else if (index > 0 && orient < 0) {
1532                        var prevRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(index - 1);
1533                        var prevEditmode = window.top.bitsObjectMng.DataSource.getProperty(prevRes, "editmode");
1534                        if (prevEditmode & 0x1000)
1535                            return false;
1536                    }
1537                }
1538                if (index != -1 && !mcTreeHandler.TREE.view.isContainer(index) && orient == 0)
1539                    return false;
1540                window.top.bitsScrapPartyAddonService.builderViewObserver.canDrop(index, orient, mcTreeHandler.TREE);
1541                return true;
1542            } catch (ex) {
1543                return false;
1544            }
1545        },
1546        onDrop: function(row, orient) {
1547            var XferDataSet = null;
1548            var XferData = null;
1549            var doraggedData = null;
1550            var XferDataType = null;
1551            var info = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
1552            var app_version = parseFloat(info.version);
1553            if (app_version < 3.1) {
1554                try {
1555                    XferDataSet = nsTransferable.get(mcTreeDNDHandler.dragDropObserver.getSupportedFlavours(), nsDragAndDrop.getDragData, true);
1556                    XferData = XferDataSet.first.first;
1557                    doraggedData = XferData.data;
1558                    XferDataType = XferData.flavour.contentType;
1559                } catch (ex) {
1560                }
1561            } else {
1562                try {
1563                    if (mcTreeDNDHandler._dataTransfer) {
1564                        var dataTransfer = mcTreeDNDHandler._dataTransfer;
1565                        XferData = {};
1566                        var supportedTypes = ["moz/rdfitem", "wired-marker/object", "text/x-moz-url", "text/url-list", "text/plain", "application/x-moz-file"];
1567                        var types = dataTransfer.types;
1568                        types = supportedTypes.filter(function(value) {
1569                            return types.contains(value);
1570                        });
1571                        if (types.length) {
1572                            XferData.data = dataTransfer.getData(types[0]);
1573                            XferData.flavour = {contentType: types[0]};
1574                            if (!XferData.data)
1575                                XferData.data = dataTransfer.mozGetDataAt(types[0], 0);
1576                        }
1577                        if (XferData.data) {
1578                            doraggedData = XferData.data;
1579                            XferDataType = XferData.flavour.contentType;
1580                        }
1581                    }
1582                } catch (ex) {
1583                }
1584            }
1585            var state;
1586//                      try{
1587            if (XferDataType == "moz/rdfitem") {
1588                if (mcTreeHandler.TREE.currentIndex >= 0 && mcTreeHandler.TREE.currentIndex != row && window.top.bitsScrapPartyMergeService) {
1589                    var srcRes = mcTreeHandler.resource;
1590                    var dstRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(row);
1591                    var param = {
1592                        tree: mcTreeHandler.TREE,
1593                        srcRes: srcRes,
1594                        dstRes: dstRes,
1595                        modCtrl: mcTreeDNDHandler.modCtrl,
1596                        modAlt: mcTreeDNDHandler.modAlt,
1597                        modShift: mcTreeDNDHandler.modShift,
1598                        modMeta: mcTreeDNDHandler.modMeta
1599                    };
1600                    var mergeRtn = window.top.bitsScrapPartyMergeService.mergeResource(param);
1601                    if (mergeRtn) {
1602                        window.top.bitsScrapPartyAddonService.builderViewObserver.onDrop(row, orient, mcTreeHandler.TREE, XferDataSet);
1603                        return;
1604                    }
1605                    if (window.top.bitsScrapPartyMergeService.cancel) {
1606                        window.top.bitsScrapPartyAddonService.builderViewObserver.onDrop(row, orient, mcTreeHandler.TREE, XferDataSet);
1607                        mcTreeViewModeService.rebuild();
1608                        return;
1609                    }
1610                    var src_dbtype = mcTreeDNDHandler.DataSource.getProperty(srcRes, "dbtype");
1611                    var dst_dbtype = mcTreeDNDHandler.DataSource.getProperty(dstRes, "dbtype");
1612                    if (src_dbtype == window.top.bitsMarkingCollection._uncategorized.dbtype || dst_dbtype == window.top.bitsMarkingCollection._uncategorized.dbtype || mcTreeDNDHandler.modShift) {
1613                        mcTreeDNDHandler.modShift = true;
1614                        mcTreeDNDHandler.move(row, orient);
1615                    } else {
1616                        if (mcTreeDNDHandler.modCtrl || mcTreeDNDHandler.modMeta) {
1617                            mcTreeDNDHandler.copy(row, orient);
1618                        } else {
1619                            mcTreeDNDHandler.move(row, orient);
1620                        }
1621                    }
1622                } else {
1623                    if (mcTreeDNDHandler.modCtrl || mcTreeDNDHandler.modMeta) {
1624                        mcTreeDNDHandler.copy(row, orient);
1625                    } else {
1626                        mcTreeDNDHandler.move(row, orient);
1627                    }
1628                }
1629            } else if (XferDataType == "wired-marker/object" && XferData) {
1630                var dstRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(row);
1631                var type = mcTreeHandler.DataSource.getProperty(dstRes, "type");
1632                if (!(type & 0x1000) && mcTreeHandler.TREE.currentIndex >= 0 && mcTreeHandler.TREE.currentIndex != row && window.top.bitsScrapPartyMergeService) {
1633                    var srcRes = mcTreeHandler.resource;
1634                    var mergeRtn = mcItemView.mergeObject(srcRes, dstRes);
1635                    if (mergeRtn)
1636                        return;
1637                    var src_dbtype = mcTreeDNDHandler.DataSource.getProperty(srcRes, "dbtype");
1638                    if (!src_dbtype || src_dbtype == "") {
1639                        if (mcItemView.isChecked) {
1640                            var object = mcItemView.object;
1641                            if (object.dbtype)
1642                                src_dbtype = object.dbtype;
1643                        }
1644                    }
1645                    if (!src_dbtype || src_dbtype == "")
1646                        return;
1647                    var dst_dbtype = mcTreeDNDHandler.DataSource.getProperty(dstRes, "dbtype");
1648                    if (src_dbtype == window.top.bitsMarkingCollection._uncategorized.dbtype || dst_dbtype == window.top.bitsMarkingCollection._uncategorized.dbtype || mcTreeDNDHandler.modShift) {
1649                        mcItemView.moveObject(dstRes, true);
1650                    } else {
1651                        if (mcItemView.modCtrl || mcItemView.modMeta) {
1652                            mcItemView.copyObject(dstRes);
1653                        } else {
1654                            mcItemView.moveObject(dstRes, mcItemView.modShift);
1655                        }
1656                    }
1657                }
1658            } else if (XferDataType == "application/x-moz-file" && XferData) {
1659                if (XferData.data instanceof Components.interfaces.nsIFile) {
1660                    var urlString = mcTreeDNDHandler.Common.convertFilePathToURL(XferData.data.path);
1661                    state = mcTreeDNDHandler.capture(urlString, row, orient);
1662                }
1663            } else if (XferData && XferData.data) {
1664                if (
1665                        mcTreeDNDHandler.originalTarget &&
1666                        mcTreeDNDHandler.originalTarget.nodeName == "IMG" &&
1667                        mcTreeDNDHandler.originalTarget.hasAttribute('oid') &&
1668                        mcTreeDNDHandler.originalTarget.hasAttribute('dbtype') &&
1669                        mcTreeDNDHandler.originalTarget.hasAttribute('pfid')) {
1670                    var oid = mcTreeDNDHandler.originalTarget.getAttribute('oid');
1671                    var dbtype = mcTreeDNDHandler.originalTarget.getAttribute('dbtype');
1672                    var pfid = mcTreeDNDHandler.originalTarget.getAttribute('pfid');
1673                    var dstRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(row);
1674                    var dst_fid = mcTreeDNDHandler.DataSource.getProperty(dstRes, "id");
1675                    var dst_dbtype = mcTreeDNDHandler.DataSource.getProperty(dstRes, "dbtype");
1676                    var dst_style = mcTreeDNDHandler.DataSource.getProperty(dstRes, "style");
1677                    if (dst_fid == pfid && dst_dbtype == dbtype)
1678                        return;
1679                    var srcObjects = mcTreeDNDHandler.Database.getObject({oid: oid, pfid: pfid}, dbtype);
1680                    var mergeRtn = window.top.bitsTreeListService.mergeObject({fid: dst_fid, dbtype: dst_dbtype}, srcObjects[0]);
1681                    if (mergeRtn)
1682                        return;
1683                    var rtnObj = null;
1684                    if (dbtype == window.top.bitsMarkingCollection._uncategorized.dbtype || mcTreeDNDHandler.modShift) {
1685                        rtnObj = window.top.bitsTreeListService.moveObject({fid: dst_fid, dbtype: dst_dbtype, fid_style: dst_style}, srcObjects[0], true);
1686                    } else {
1687                        rtnObj = window.top.bitsTreeListService.copyObject({fid: dst_fid, dbtype: dst_dbtype, fid_style: dst_style}, srcObjects[0]);
1688                    }
1689                    if (rtnObj) {
1690                        setTimeout(function() {
1691                            try {
1692                                mcTreeHandler.TREE.currentIndex = row;
1693                                if (!mcTreeHandler.TREE.view.selection.isSelected(mcTreeHandler.TREE.currentIndex))
1694                                    mcTreeHandler.TREE.view.selection.select(mcTreeHandler.TREE.currentIndex);
1695                                mcPropertyView.dispProperty(mcTreeHandler.object);
1696                                var viewmode = mcTreeViewModeService.viewmode;
1697                                if (mcItemView.isChecked) {
1698                                    mcItemView._bitsItemView.onTreeClick({viewmode: viewmode, fid: dst_fid, dbtype: dst_dbtype, res: dstRes});
1699                                } else {
1700                                    var f_pfid = undefined;
1701                                    var rtnFolder = mcTreeDNDHandler.Database.getFolder({fid: pfid}, dbtype);
1702                                    if (rtnFolder && rtnFolder.length)
1703                                        f_pfid = rtnFolder[0].pfid;
1704                                    rtnFolder = undefined;
1705                                    if (dbtype == window.top.bitsMarkingCollection._uncategorized.dbtype || mcTreeDNDHandler.modShift) {
1706                                        var srcPRes = mcTreeDNDHandler.Common.RDF.GetResource(mcTreeDNDHandler.DataSource.getID2About(pfid, f_pfid, dbtype));
1707                                        var srcAbout = mcTreeDNDHandler.DataSource.getID2About(oid, pfid, dbtype);
1708                                        var srcRes = mcTreeDNDHandler.Common.RDF.GetResource(srcAbout);
1709                                        if (mcTreeDNDHandler.DataSource.moveItem(srcRes, srcPRes, dstRes, -1)) {
1710                                            mcTreeDNDHandler.DataSource.setProperty(srcRes, "dbtype", dst_dbtype);
1711                                            mcTreeDNDHandler.DataSource.setProperty(srcRes, "pfid", dst_fid);
1712                                            mcTreeDNDHandler.DataSource.setProperty(srcRes, "id", rtnObj.oid);
1713                                            mcTreeDNDHandler.DataSource.setID2About(oid, pfid, undefined, dbtype);
1714                                            mcTreeDNDHandler.DataSource.setID2About(rtnObj.oid, dst_fid, srcRes.Value, dst_dbtype);
1715                                            mcTreeDNDHandler.changeNodeStyle(srcRes);
1716                                        }
1717                                    } else {
1718                                        mcTreeDNDHandler.DataSource.addItem(mcTreeDNDHandler.Database.makeObjectToItem(rtnObj), dstRes.Value, -1, dst_dbtype);
1719                                    }
1720                                    mcTreeDNDHandler.DataSource.flush();
1721                                    mcTreeCssService.init();
1722                                    mcController.rebuildLocal();
1723                                }
1724                                window.top.bitsTreeListService.reload(mcTreeDNDHandler.originalTarget.ownerDocument);
1725                                mcTreeDNDHandler.originalTarget = null;
1726                            } catch (e) {
1727                                _dump2(e);
1728                            }
1729                        }, 0);
1730                    }
1731                } else {
1732                    state = mcTreeDNDHandler.capture(XferData.data, row, orient);
1733                }
1734            }
1735//                      }catch(ex){_dump2("onDrop():"+ex);}
1736            mcController.rebuildLocal();
1737            window.top.bitsScrapPartyAddonService.builderViewObserver.onDrop(row, orient, mcTreeHandler.TREE, XferDataSet, state);
1738        },
1739        onToggleOpenState: function(aRow) {
1740        },
1741        onCycleHeader: function() {
1742        },
1743        onSelectionChanged: function() {
1744        },
1745        onCycleCell: function(aRow, pColID) {
1746        },
1747        isEditable: function() {
1748        },
1749        onSetCellText: function() {
1750        },
1751        onPerformAction: function() {
1752        },
1753        onPerformActionOnRow: function() {
1754        },
1755        onPerformActionOnCell: function(aAction, aRow, aColID) {
1756        },
1757    },
1758    getModifiers: function(aEvent) {
1759        this.modAlt = aEvent.altKey;
1760        this.modShift = aEvent.shiftKey;
1761        this.modCtrl = aEvent.ctrlKey;
1762        this.modMeta = aEvent.metaKey;
1763    },
1764    setDataTransfer: function(aEvent) {
1765        try {
1766            if (aEvent.dataTransfer)
1767                this._dataTransfer = aEvent.dataTransfer;
1768        } catch (e) {
1769        }
1770    },
1771    onMousedown: function(aEvent) {
1772        try {
1773            mcTreeDNDHandler.rangeParent = aEvent.rangeParent;
1774        } catch (ex) {
1775        }
1776        try {
1777            mcTreeDNDHandler.originalTarget = aEvent.originalTarget;
1778        } catch (ex) {
1779        }
1780    },
1781    init: function() {
1782        this.gBrowser.addEventListener("mousedown", this.onMousedown, false);
1783    },
1784    quit: function() {
1785        try {
1786            this.gBrowser.removeEventListener("mousedown", this.onMousedown, false);
1787        } catch (ex) {
1788        }
1789    },
1790    move: function(aRow, aOrient) {
1791        this.row = aRow;
1792        this.orient = aOrient;
1793        this.rowRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(aRow);
1794        (mcTreeHandler.TREE.view.selection.count == 1) ? this.moveSingle() : this.moveMultiple();
1795    },
1796    moveSingle: function() {
1797        var curIdx = mcTreeHandler.TREE.currentIndex;
1798        var curRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx);
1799
1800        var id = this.DataSource.getProperty(curRes, "id");
1801        var dbtype = this.DataSource.getProperty(curRes, "dbtype");
1802        var pfid = this.DataSource.getProperty(curRes, "pfid");
1803        var about = this.DataSource.getID2About(id, pfid, dbtype);
1804        var curRes = mcTreeDNDHandler.Common.RDF.GetResource(about);
1805        var curPar = this.DataSource.findParentResource(curRes);
1806        var tarRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(this.row);
1807        var tarPar = (this.orient == 0) ? tarRes : mcTreeHandler.getParentResource(this.row);
1808        this.moveAfterChecking(curRes, curPar, tarRes, tarPar);
1809        window.top.bitsObjectMng.DataSource.flush();
1810    },
1811    moveMultiple: function() {
1812        var idxList = mcTreeHandler.getSelection(false, 2);
1813        if (mcTreeHandler.validateMultipleSelection(idxList) == false)
1814            return;
1815        var i = 0;
1816        var curResList = [];
1817        var curParList = [];
1818        var tarResList = [];
1819        var tarParList = [];
1820        for (i = 0; i < idxList.length; i++) {
1821            curResList.push(mcTreeHandler.TREE.builderView.getResourceAtIndex(idxList[i]));
1822            curParList.push(mcTreeHandler.getParentResource(idxList[i]));
1823            tarResList.push(mcTreeHandler.TREE.builderView.getResourceAtIndex(this.row));
1824            tarParList.push((this.orient == 0) ? tarResList[i] : mcTreeHandler.getParentResource(this.row));
1825        }
1826        if (this.orient == 1) {
1827            for (i = idxList.length - 1; i >= 0; i--) {
1828                this.moveAfterChecking(curResList[i], curParList[i], tarResList[i], tarParList[i]);
1829            }
1830        } else {
1831            for (i = 0; i < idxList.length; i++) {
1832                this.moveAfterChecking(curResList[i], curParList[i], tarResList[i], tarParList[i]);
1833            }
1834        }
1835        window.top.bitsObjectMng.DataSource.flush();
1836    },
1837    moveAfterChecking: function(curRes, curPar, tarRes, tarPar) {
1838        var curAbsIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(curRes);
1839        var curRelIdx = this.DataSource.getRelativeIndex(curPar, curRes);
1840        var tarRelIdx = this.DataSource.getRelativeIndex(tarPar, tarRes);
1841        if (this.orient == 0) {
1842            if (curAbsIdx == this.row)
1843                return;
1844        } else {
1845            if (this.orient == 1)
1846                tarRelIdx++;
1847            if (curPar.Value == tarPar.Value && tarRelIdx > curRelIdx)
1848                tarRelIdx--;
1849            if (this.orient == 1 &&
1850                    mcTreeHandler.TREE.view.isContainer(this.row) &&
1851                    mcTreeHandler.TREE.view.isContainerOpen(this.row) &&
1852                    mcTreeHandler.TREE.view.isContainerEmpty(this.row) == false) {
1853                if (curAbsIdx == this.row)
1854                    return;
1855                tarPar = tarRes;
1856                tarRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(this.row + 1);
1857                tarRelIdx = 1;
1858            }
1859            if (curPar.Value == tarPar.Value && curRelIdx == tarRelIdx)
1860                return;
1861        }
1862        if (curAbsIdx >= 0 && mcTreeHandler.TREE.view.isContainer(curAbsIdx)) {
1863            var tmpIdx = this.row;
1864            var tmpRes = tarRes;
1865            while (tmpRes.Value != mcTreeHandler.TREE.ref && tmpIdx != -1) {
1866                tmpRes = mcTreeHandler.getParentResource(tmpIdx);
1867                tmpIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(tmpRes);
1868                if (tmpRes.Value == curRes.Value)
1869                    return;
1870            }
1871        }
1872        var rtn = false;
1873        var tar_pfid = this.DataSource.getProperty(tarPar, "id");
1874        var tar_dbtype = this.DataSource.getProperty(tarPar, "dbtype");
1875        var cur_dbtype = this.DataSource.getProperty(curRes, "dbtype");
1876        var cur_pfid = this.DataSource.getProperty(curRes, "pfid");
1877        var rtnFolder = null;
1878        var rtnObject = null;
1879        var pfid_order = 0;
1880        if (this.DataSource.isContainer(this.rowRes)) {
1881            var tmp_fid = this.DataSource.getProperty(this.rowRes, "id");
1882            rtnFolder = this.Database.getFolderFormID(tmp_fid, tar_dbtype);
1883            if (rtnFolder && rtnFolder.length)
1884                pfid_order = rtnFolder[0].pfid_order;
1885        } else {
1886            var tmp_oid = this.DataSource.getProperty(this.rowRes, "id");
1887            rtnObject = this.Database.getObject({oid: tmp_oid, pfid: tar_pfid}, tar_dbtype);
1888            if (rtnObject && rtnObject.length)
1889                pfid_order = rtnObject[0].pfid_order;
1890        }
1891        if (this.orient >= 0)
1892            pfid_order = parseFloat(parseFloat(pfid_order) + parseFloat(this.orient));
1893        if (curAbsIdx >= 0 && mcTreeHandler.TREE.view.isContainer(curAbsIdx)) {
1894            var fid = this.DataSource.getProperty(curRes, "id");
1895            if (cur_dbtype == tar_dbtype) {
1896                rtn = this.Database.updateFolder({fid: fid, pfid: tar_pfid, pfid_order: pfid_order}, tar_dbtype);
1897                if (rtn) {
1898                    this.DataSource.setProperty(curRes, "pfid", tar_pfid);
1899                    this.DataSource.setProperty(curRes, "pfid_order", pfid_order);
1900                    this.DataSource.setID2About(fid, cur_pfid, undefined, cur_dbtype);
1901                    this.DataSource.setID2About(fid, tar_pfid, curRes.Value, tar_dbtype);
1902                }
1903            } else {
1904                this.moveFolder(curRes, curPar, tarPar, tarRelIdx);
1905                return;
1906            }
1907        } else {
1908            var oid = this.DataSource.getProperty(curRes, "id");
1909            if (tar_pfid != cur_pfid) {
1910                rtn = !this.Database.existsObject({oid: oid, pfid: tar_pfid}, tar_dbtype);
1911            } else {
1912                rtn = true;
1913            }
1914            if (!rtn) {
1915                rtn = this.Common.confirm(mcMainService.STRING.getString("CONFIRM_COPYOBJECT_OVERWRITE"));
1916                if (rtn) {
1917                    var contResList = this.DataSource.flattenResources(tarPar, 2, false);
1918                    var i;
1919                    for (i = 0; i < contResList.length; i++) {
1920                        if (contResList[i].Value == curRes.Value)
1921                            continue;
1922                        var del_oid = this.DataSource.getProperty(contResList[i], "id");
1923                        if (del_oid != oid)
1924                            continue;
1925                        mcTreeHandler.remove(undefined, contResList[i], true, false);
1926                    }
1927                }
1928            }
1929            if (rtn) {
1930                if (cur_dbtype == tar_dbtype) {
1931                    if (cur_pfid != tar_pfid) {
1932                        rtn = this.Database.updateObject({oid: oid, pfid: tar_pfid, pfid_old: cur_pfid, pfid_order: pfid_order}, tar_dbtype);
1933                        if (rtn) {
1934                            this.DataSource.setProperty(curRes, "pfid", tar_pfid);
1935                            this.DataSource.setProperty(curRes, "pfid_order", pfid_order);
1936                            this.DataSource.setID2About(oid, cur_pfid, undefined, cur_dbtype);
1937                            this.DataSource.setID2About(oid, tar_pfid, curRes.Value, tar_dbtype);
1938                        }
1939                    }
1940                } else {
1941                    this.moveObject(curRes, curPar, tarPar, tarRelIdx);
1942                    return;
1943                }
1944            }
1945        }
1946        if (rtn) {
1947            rtn = this.DataSource.moveItem(curRes, curPar, tarPar, tarRelIdx);
1948            if (rtn) {
1949                if (this.DataSource.isContainer(this.Common.RDF.GetResource(curRes.Value))) {
1950                } else {
1951                    mcTreeDNDHandler.changeNodeStyle(curRes);
1952                }
1953                window.top.bitsMarkingCollection.reOrder(tarPar);
1954                var selectIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(this.Common.RDF.GetResource(curRes.Value));
1955                if (selectIdx >= 0) {
1956                    mcTreeHandler.TREE.currentIndex = selectIdx;
1957                    if (!mcTreeHandler.TREE.view.selection.isSelected(mcTreeHandler.TREE.currentIndex))
1958                        mcTreeHandler.TREE.view.selection.select(mcTreeHandler.TREE.currentIndex);
1959                    mcTreeHandler.TREE.focus();
1960                    mcTreeHandler.TREE.treeBoxObject.ensureRowIsVisible(selectIdx);
1961                    mcPropertyView.dispProperty(mcTreeHandler.object);
1962                }
1963            } else {
1964                mcTreeViewModeService.rebuild();
1965            }
1966        }
1967    },
1968    moveFolder: function(curRes, curPar, tarPar, tarRelIdx) {
1969        var rtn = false;
1970        var modShift = this.modShift;
1971        var tar_dbtype = this.DataSource.getProperty(tarPar, "dbtype");
1972        var cur_dbtype = this.DataSource.getProperty(curPar, "dbtype");
1973        var aTransaction = true;
1974        if (!aTransaction) {
1975            this.Database.beginTransaction(tar_dbtype);
1976            this.Database.beginTransaction(cur_dbtype);
1977        }
1978        var addPar;
1979        var moveRes = null;
1980        var moveFids = [];
1981        var fid2newfid = [];
1982        var moveID = parseInt(this.DataSource.identify(this.Common.getTimeStamp()));
1983        var i, j;
1984        var fldResList = this.DataSource.flattenResources(curRes, 1, true);
1985        for (i = 0; i < fldResList.length; i++) {
1986            addParAbout = null;
1987            var tmp_fid = this.DataSource.getProperty(fldResList[i], "id");
1988            if (this.Database._idExists(tar_dbtype, tmp_fid, aTransaction)) {
1989                fid2newfid["" + tmp_fid] = "" + moveID;
1990                moveID = parseInt(moveID) + 1;
1991            } else {
1992                fid2newfid["" + tmp_fid] = "" + tmp_fid;
1993            }
1994            var tmp_dbtype = this.DataSource.getProperty(fldResList[i], "dbtype");
1995            var moveFolder = this.Database.getFolderFormID(tmp_fid, tmp_dbtype, aTransaction);
1996            if (!moveFolder || moveFolder.length == 0)
1997                break;
1998            moveFolder = moveFolder[0];
1999            delete moveFolder.dbtype;
2000            if (fid2newfid["" + moveFolder.fid])
2001                moveFolder.fid = fid2newfid["" + moveFolder.fid];
2002            moveFids.push(moveFolder);
2003            if (curRes.Value == fldResList[i].Value) {
2004                moveFolder.pfid = this.DataSource.getProperty(tarPar, "id");
2005                addParAbout = tarPar.Value;
2006            } else if (fid2newfid["" + moveFolder.pfid]) {
2007                moveFolder.pfid = fid2newfid["" + moveFolder.pfid];
2008            }
2009            rtn = this.Database.addFolder(moveFolder, tar_dbtype, aTransaction);
2010            if (rtn) {
2011                if (!addParAbout) {
2012                    var fid = moveFolder.pfid;
2013                    var f_pfid = undefined;
2014                    var rtnFolder = this.Database.getFolder({fid: moveFolder.pfid}, tar_dbtype);
2015                    if (rtnFolder && rtnFolder.length)
2016                        f_pfid = rtnFolder[0].pfid;
2017                    rtnFolder = undefined;
2018                    addParAbout = this.DataSource.getID2About(moveFolder.pfid, f_pfid, tar_dbtype);
2019                }
2020                var newItem = this.Common.newItem();
2021                newItem.id = moveFolder.fid;
2022                newItem.about = this.DataSource.getAbout(moveFolder.fid, moveFolder.pfid, tar_dbtype);
2023                newItem.pfid = moveFolder.pfid;
2024                newItem.title = moveFolder.fid_title;
2025                newItem.type = "folder";
2026                newItem.style = moveFolder.fid_style;
2027                newItem.source = "";
2028                newItem.cssrule = 'css_' + tar_dbtype + '_' + moveFolder.fid;
2029                newItem.dbtype = tar_dbtype;
2030                newItem.editmode = moveFolder.fid_mode;
2031                newItem.icon = this.DataSource.getProperty(fldResList[i], "icon");
2032                newItem.addon_id = this.DataSource.getProperty(fldResList[i], "addon_id");
2033                var tarRelIdx = -1;
2034                try {
2035                    var cont = this.DataSource.getContainer(addParAbout, false);
2036                    tarRelIdx = cont.GetCount();
2037                } catch (ex) {
2038                }
2039                var newRes = this.DataSource.addItem(newItem, addParAbout, tarRelIdx, tar_dbtype);
2040                if (newRes && newRes.Value) {
2041                    this.DataSource.createEmptySeq(newRes.Value);
2042                    if (!moveRes)
2043                        moveRes = newRes;
2044                }
2045            } else {//倱敗した堎合
2046                if (moveRes)
2047                    mcTreeHandler._removeFolder(moveRes);
2048                break;
2049            }
2050        }
2051        if (mcItemView.isChecked) {
2052            var objResList = [];
2053            if (rtn) {
2054                var tmp_fid = this.DataSource.getProperty(curRes, "id");
2055                var tmp_dbtype = this.DataSource.getProperty(curRes, "dbtype");
2056                objResList = window.top.bitsTreeExportService._getAllObject({fid: tmp_fid, dbtype: tmp_dbtype});
2057                for (i = 0; i < objResList.length; i++) {
2058                    var moveObject = objResList[i];
2059                    var folder = {
2060                        fid: fid2newfid["" + moveObject.pfid],
2061                        dbtype: tar_dbtype
2062                    };
2063                    rtn = bitsItemView._moveObject(folder, moveObject, modShift);
2064                    if (!rtn) {
2065                        if (moveRes)
2066                            mcTreeHandler._removeFolder(moveRes);
2067                        break;
2068                    }
2069                }
2070            }
2071        } else {
2072            var objResList = this.DataSource.flattenResources(curRes, 2, true);
2073            if (rtn) {
2074                for (i = 0; i < objResList.length; i++) {
2075                    var tmp_oid = this.DataSource.getProperty(objResList[i], "id");
2076                    var tmp_dbtype = this.DataSource.getProperty(objResList[i], "dbtype");
2077                    var moveObject = null;
2078                    var moveObjects = this.Database.getObjectFormID(tmp_oid, tmp_dbtype, aTransaction);
2079                    if (!moveObjects || moveObjects.length == 0)
2080                        break;
2081                    for (j = 0; j < moveObjects.length; j++) {
2082                        if (fid2newfid["" + moveObjects[j].pfid] == undefined)
2083                            continue;
2084                        moveObject = moveObjects[j];
2085                    }
2086                    if (!moveObject)
2087                        continue;
2088                    delete moveObject.dbtype;
2089                    delete moveObject.fid_style;
2090                    delete moveObject.fid_title;
2091                    delete moveObject.folder_order;
2092                    if (this.Database._idExists(tar_dbtype, moveObject.oid, aTransaction)) {
2093                        moveObject.oid = "" + moveID;
2094                        moveID = parseInt(moveID) + 1;
2095                    }
2096                    if (fid2newfid["" + moveObject.pfid])
2097                        moveObject.pfid = fid2newfid["" + moveObject.pfid];
2098                    rtn = this.Database.addObject(moveObject, tar_dbtype, aTransaction);
2099                    if (rtn) {
2100                        var objAddParAbout = null;
2101                        if (!objAddParAbout) {
2102                            var fid = moveFolder.pfid;
2103                            var f_pfid = undefined;
2104                            var rtnFolder = this.Database.getFolder({fid: moveObject.pfid}, tar_dbtype);
2105                            if (rtnFolder && rtnFolder.length)
2106                                f_pfid = rtnFolder[0].pfid;
2107                            rtnFolder = undefined;
2108                            objAddParAbout = this.DataSource.getID2About(moveObject.pfid, f_pfid, tar_dbtype);
2109                        }
2110                        var newItem = this.Common.newItem();
2111                        newItem.id = moveObject.oid;
2112                        newItem.about = this.DataSource.getAbout(moveObject.oid, moveObject.pfid, tar_dbtype);
2113                        newItem.pfid = moveObject.pfid;
2114                        newItem.type = "item";
2115                        newItem.source = this.DataSource.getProperty(objResList[i], "source");
2116                        newItem.title = moveObject.oid_title;
2117                        newItem.editmode = moveObject.oid_mode;
2118                        newItem.uri = moveObject.doc_url;
2119                        newItem.dbtype = tar_dbtype;
2120                        newItem.icon = this.DataSource.getProperty(objResList[i], "icon");
2121                        var tarRelIdx = -1;
2122                        try {
2123                            var cont = this.DataSource.getContainer(objAddParAbout, false);
2124                            tarRelIdx = cont.GetCount();
2125                        } catch (ex) {
2126                        }
2127                        var newRes = this.DataSource.addItem(newItem, objAddParAbout, tarRelIdx, tar_dbtype);
2128                    } else {//倱敗した堎合
2129                        if (moveRes)
2130                            mcTreeHandler._removeFolder(moveRes);
2131                        break;
2132                    }
2133                }
2134            }
2135            if (rtn && modShift) {
2136                rtn = true;
2137                if (rtn) {
2138                    //Shiftキヌが抌されおいる堎合、移動元のDBからデヌタを削陀
2139                    for (i = objResList.length - 1; i >= 0; i--) {
2140                        var tmp_oid = this.DataSource.getProperty(objResList[i], "id");
2141                        var tmp_dbtype = this.DataSource.getProperty(objResList[i], "dbtype");
2142                        var tmp_pfid = this.DataSource.getProperty(objResList[i], "pfid");
2143                        rtn = this.Database.removeObject({oid: tmp_oid, pfid: tmp_pfid}, tmp_dbtype, aTransaction);
2144                        if (!rtn)
2145                            break;
2146                        this.DataSource.deleteItem(objResList[i]);
2147                        this.DataSource.setID2About(tmp_oid, tmp_pfid, undefined, tmp_dbtype);
2148                    }
2149                    if (rtn) {
2150                        for (i = fldResList.length - 1; i >= 0; i--) {
2151                            var tmp_fid = this.DataSource.getProperty(fldResList[i], "id");
2152                            var tmp_dbtype = this.DataSource.getProperty(fldResList[i], "dbtype");
2153                            var tmp_pfid = this.DataSource.getProperty(fldResList[i], "pfid");
2154                            rtn = this.Database.removeFolder(tmp_fid, tmp_dbtype, aTransaction);
2155                            if (!rtn)
2156                                break;
2157                            this.DataSource.deleteItem(fldResList[i]);
2158                            this.DataSource.setID2About(tmp_fid, tmp_pfid, undefined, tmp_dbtype);
2159                        }
2160                    }
2161                }
2162            }
2163        }
2164        if (!aTransaction) {
2165            this.Database.endTransaction(tar_dbtype);
2166            this.Database.endTransaction(cur_dbtype);
2167        }
2168        if (tarPar)
2169            window.top.bitsMarkingCollection.reOrder(tarPar);
2170        this.DataSource.flush();
2171        mcTreeCssService.init();
2172        mcController.rebuildLocal();
2173    },
2174    moveObject: function(curRes, curPar, tarPar, tarRelIdx) {
2175        var rtn = false;
2176        var modShift = this.modShift;
2177        var tar_fid = this.DataSource.getProperty(tarPar, "id");
2178        var tar_dbtype = this.DataSource.getProperty(tarPar, "dbtype");
2179        var moveRes = null;
2180        var moveFids = [];
2181        var moveID = parseInt(this.DataSource.identify(this.Common.getTimeStamp()));
2182        var i;
2183        var cur_oid = this.DataSource.getProperty(curRes, "id");
2184        var cur_dbtype = this.DataSource.getProperty(curRes, "dbtype");
2185        var cur_pfid = this.DataSource.getProperty(curRes, "pfid");
2186        var moveObject = this.Database.getObjectWithProperty({oid: cur_oid, pfid: cur_pfid}, cur_dbtype);
2187        if (!moveObject || moveObject.length == 0) {
2188            this.DataSource.flush();
2189            mcTreeCssService.init();
2190            mcController.rebuildLocal();
2191            return;
2192        }
2193        var blob = this.Database.getObjectBLOB(cur_oid, cur_dbtype);
2194        moveObject = moveObject[0];
2195        delete moveObject.dbtype;
2196        delete moveObject.fid_style;
2197        if (!modShift) {
2198            moveObject.oid = "" + moveID;
2199            moveID = parseInt(moveID) + 1;
2200            moveObject.pfid = this.DataSource.getProperty(tarPar, "id");
2201        }
2202        if (cur_dbtype == window.top.bitsMarkingCollection._uncategorized.dbtype || tar_dbtype == window.top.bitsMarkingCollection._uncategorized.dbtype) {
2203            moveObject.pfid = tar_fid;
2204        }
2205        rtn = this.Database.addObject(moveObject, tar_dbtype);
2206        if (rtn) {
2207            if (blob)
2208                this.Database.updateObjectBLOB(moveObject.oid, blob[0], tar_dbtype);
2209            if (!modShift) {
2210                var newItem = this.Common.newItem();
2211                newItem.id = moveObject.oid;
2212                newItem.about = this.DataSource.getAbout(moveObject.oid, moveObject.pfid, tar_dbtype);
2213                newItem.pfid = moveObject.pfid;
2214                newItem.type = "item";
2215                newItem.source = this.DataSource.getProperty(curRes, "source");
2216                newItem.title = moveObject.oid_title;
2217                newItem.editmode = moveObject.oid_mode;
2218                newItem.uri = moveObject.doc_url;
2219                newItem.dbtype = tar_dbtype;
2220                newItem.icon = this.DataSource.getProperty(curRes, "icon");
2221                var tarRelIdx = -1;
2222                try {
2223                    var cont = this.DataSource.getContainer(tarPar.Value, false);
2224                    tarRelIdx = cont.GetCount();
2225                } catch (ex) {
2226                }
2227                var newRes = this.DataSource.addItem(newItem, tarPar.Value, tarRelIdx, tar_dbtype);
2228            }
2229        }
2230        if (rtn && modShift) {
2231            var f_pfid = undefined;
2232            var rtnFolder = this.Database.getFolder({fid: cur_pfid}, cur_dbtype);
2233            if (rtnFolder && rtnFolder.length)
2234                f_pfid = rtnFolder[0].pfid;
2235            rtnFolder = undefined;
2236            var curPar = this.Common.RDF.GetResource(this.DataSource.getID2About(cur_pfid, f_pfid, cur_dbtype));
2237            var contResList = this.DataSource.flattenResources(curPar, 2, false);
2238            var i;
2239            for (var i = 0; i < contResList.length; i++) {
2240                if (contResList[i].Value == curRes.Value)
2241                    continue;
2242                var oid = this.DataSource.getProperty(contResList[i], "id");
2243                if (oid != cur_oid)
2244                    continue;
2245                curRes = contResList[i];
2246                break;
2247            }
2248            rtn = this.DataSource.moveItem(curRes, curPar, tarPar, tarRelIdx);
2249            if (rtn)
2250                rtn = this.Database.removeObject({oid: cur_oid, pfid: cur_pfid}, cur_dbtype);
2251            if (rtn) {
2252                this.DataSource.setProperty(curRes, "dbtype", tar_dbtype);
2253                this.DataSource.setProperty(curRes, "pfid", tar_fid);
2254                this.DataSource.setProperty(curRes, "id", moveObject.oid);
2255                this.DataSource.setID2About(cur_oid, cur_pfid, undefined, cur_dbtype);
2256                this.DataSource.setID2About(moveObject.oid, tar_fid, curRes.Value, tar_dbtype);
2257            }
2258            mcTreeDNDHandler.changeNodeStyle(curRes);
2259        }
2260        if (tarPar)
2261            window.top.bitsMarkingCollection.reOrder(tarPar);
2262        this.DataSource.flush();
2263        mcTreeCssService.init();
2264        mcController.rebuildLocal();
2265    },
2266    copy: function(aRow, aOrient) {
2267        this.row = aRow;
2268        this.orient = aOrient;
2269        this.rowRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(aRow);
2270        (mcTreeHandler.TREE.view.selection.count == 1) ? this.copySingle() : this.copyMultiple();
2271    },
2272    copySingle: function() {
2273        var curIdx = mcTreeHandler.TREE.currentIndex;
2274        var curRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx);
2275        var curPar = mcTreeHandler.getParentResource(curIdx);
2276        var tarRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(this.row);
2277        var tarPar = (this.orient == 0) ? tarRes : mcTreeHandler.getParentResource(this.row);
2278        this.copyAfterChecking(curRes, curPar, tarRes, tarPar);
2279        this.DataSource.flush();
2280        mcController.rebuildLocal();
2281    },
2282    copyMultiple: function() {
2283        var idxList = mcTreeHandler.getSelection(false, 2);
2284        if (mcTreeHandler.validateMultipleSelection(idxList) == false)
2285            return;
2286        var i = 0;
2287        var curResList = [];
2288        var curParList = [];
2289        var tarResList = [];
2290        var tarParList = [];
2291        for (i = 0; i < idxList.length; i++) {
2292            curResList.push(mcTreeHandler.TREE.builderView.getResourceAtIndex(idxList[i]));
2293            curParList.push(mcTreeHandler.getParentResource(idxList[i]));
2294            tarResList.push(mcTreeHandler.TREE.builderView.getResourceAtIndex(this.row));
2295            tarParList.push((this.orient == 0) ? tarResList[i] : mcTreeHandler.getParentResource(this.row));
2296        }
2297        if (this.orient == 1) {
2298            for (i = idxList.length - 1; i >= 0; i--) {
2299                this.copyAfterChecking(curResList[i], curParList[i], tarResList[i], tarParList[i]);
2300            }
2301        } else {
2302            for (i = 0; i < idxList.length; i++) {
2303                this.copyAfterChecking(curResList[i], curParList[i], tarResList[i], tarParList[i]);
2304            }
2305        }
2306        this.DataSource.flush();
2307        mcController.rebuildLocal();
2308    },
2309    copyAfterChecking: function(curRes, curPar, tarRes, tarPar) {
2310        var curAbsIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(curRes);
2311        var curRelIdx = window.top.bitsObjectMng.DataSource.getRelativeIndex(curPar, curRes);
2312        var tarRelIdx = window.top.bitsObjectMng.DataSource.getRelativeIndex(tarPar, tarRes);
2313        var tar_dbtype = this.DataSource.getProperty(tarPar, "dbtype");
2314        var cur_dbtype = this.DataSource.getProperty(curPar, "dbtype");
2315        if (cur_dbtype != tar_dbtype) {
2316            if (mcTreeHandler.TREE.view.isContainer(curAbsIdx)) {
2317                this.moveFolder(curRes, curPar, tarPar, tarRelIdx);
2318            } else {
2319                this.moveObject(curRes, curPar, tarPar, tarRelIdx);
2320            }
2321            return;
2322        }
2323        if (mcTreeHandler.TREE.view.isContainer(curAbsIdx))
2324            return;
2325        if (this.orient == 0) {
2326            if (curAbsIdx == this.row)
2327                return;
2328        } else {
2329            if (this.orient == 1)
2330                tarRelIdx++;
2331            if (curPar.Value == tarPar.Value && tarRelIdx > curRelIdx)
2332                tarRelIdx--;
2333            if (this.orient == 1 &&
2334                    mcTreeHandler.TREE.view.isContainer(this.row) &&
2335                    mcTreeHandler.TREE.view.isContainerOpen(this.row) &&
2336                    mcTreeHandler.TREE.view.isContainerEmpty(this.row) == false) {
2337                if (curAbsIdx == this.row)
2338                    return;
2339                tarPar = tarRes;
2340                tarRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(this.row + 1);
2341                tarRelIdx = 1;
2342            }
2343            if (curPar.Value == tarPar.Value && curRelIdx == tarRelIdx)
2344                return;
2345        }
2346        if (mcTreeHandler.TREE.view.isContainer(curAbsIdx)) {
2347            var tmpIdx = this.row;
2348            var tmpRes = tarRes;
2349            while (tmpRes.Value != mcTreeHandler.TREE.ref && tmpIdx != -1) {
2350                tmpRes = mcTreeHandler.getParentResource(tmpIdx);
2351                tmpIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(tmpRes);
2352                if (tmpRes.Value == curRes.Value)
2353                    return;
2354            }
2355        }
2356        var rtn = false;
2357        var pfid = this.DataSource.getProperty(tarPar, "id");
2358        var dbtype = this.DataSource.getProperty(tarPar, "dbtype");
2359        var oid = this.DataSource.getProperty(curRes, "id");
2360        rtn = this.Database.existsObject({oid: oid, pfid: pfid}, dbtype);
2361        if (rtn) {
2362            this.Common.alert(mcMainService.STRING.getString("ALERT_COPYOBJECT_EXISTS"));
2363            return;
2364        }
2365        var newDCitem = this.Common.newItem();
2366        newDCitem.id = oid;
2367        newDCitem.about = this.DataSource.getAbout(oid, pfid, this.DataSource.getProperty(curRes, "dbtype"));
2368        newDCitem.pfid = pfid;
2369        newDCitem.type = this.DataSource.getProperty(curRes, "type");
2370        newDCitem.source = this.DataSource.getProperty(curRes, "source");
2371        newDCitem.title = this.DataSource.getProperty(curRes, "title");
2372        newDCitem.editmode = this.DataSource.getProperty(curRes, "editmode");
2373        newDCitem.uri = this.DataSource.getProperty(curRes, "uri");
2374        newDCitem.source = this.DataSource.getProperty(curRes, "source");
2375        newDCitem.dbtype = this.DataSource.getProperty(curRes, "dbtype");
2376        var pfid_order = 0;
2377        if (this.DataSource.isContainer(this.rowRes)) {
2378            var tmp_fid = this.DataSource.getProperty(this.rowRes, "id");
2379            var rtnFolder = mcTreeDNDHandler.Database.getFolderFormID(tmp_fid, newDCitem.dbtype);
2380            if (rtnFolder && rtnFolder.length)
2381                pfid_order = rtnFolder[0].pfid_order;
2382        } else {
2383            var tmp_oid = this.DataSource.getProperty(this.rowRes, "id");
2384            var rtnObject = mcTreeDNDHandler.Database.getObject({oid: tmp_oid, pfid: pfid}, newDCitem.dbtype);
2385            if (rtnObject && rtnObject.length)
2386                pfid_order = rtnObject[0].pfid_order;
2387        }
2388        if (this.orient >= 0)
2389            pfid_order = parseFloat(parseFloat(pfid_order) + parseFloat(this.orient));
2390        rtn = mcTreeDNDHandler.Database.addLink({oid: oid, pfid: pfid, pfid_order: pfid_order}, newDCitem.dbtype);
2391        if (rtn) {
2392            var newRes = this.DataSource.addItem(newDCitem, tarPar.Value, tarRelIdx, newDCitem.dbtype);
2393            if (newRes) {
2394                this.DataSource.setProperty(newRes, "id", oid); //Treeに远加埌、idを倉曎する。
2395                this.DataSource.flush();
2396            }
2397            var selectIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(newRes);
2398            if (selectIdx >= 0) {
2399                mcTreeHandler.TREE.currentIndex = selectIdx;
2400                if (!mcTreeHandler.TREE.view.selection.isSelected(mcTreeHandler.TREE.currentIndex))
2401                    mcTreeHandler.TREE.view.selection.select(mcTreeHandler.TREE.currentIndex);
2402                mcTreeHandler.TREE.focus();
2403                mcTreeHandler.TREE.treeBoxObject.ensureRowIsVisible(selectIdx);
2404                mcPropertyView.dispProperty(mcTreeHandler.object);
2405            }
2406        } else {
2407            mcTreeViewModeService.rebuild();
2408        }
2409    },
2410    capture: function(aXferString, aRow, aOrient) {
2411        var aXferStringArr = aXferString.split("\n");
2412        var url = aXferStringArr[0];
2413        var url_title = aXferStringArr[1];
2414        if (!url_title || url == url_title)
2415            url_title = "";
2416        var basedir = window.top.bitsTreeListService.getBaseDir();
2417        var res_uri = this.Common.convertFilePathToURL(basedir.path);
2418        if (url.indexOf(res_uri) >= 0)
2419            return;
2420        if (this.originalTarget && this.originalTarget.nodeName == "IMG" && this.originalTarget.hasAttribute('oid') && this.originalTarget.hasAttribute('dbtype'))
2421            return;
2422        var win = window.top.bitsObjectMng.Common.getFocusedWindow();
2423        var sel = win.getSelection();
2424        var isSelected = false;
2425        try {
2426            isSelected = (sel.anchorNode === sel.focusNode && sel.anchorOffset == sel.focusOffset) ? false : true;
2427            if (isSelected && aXferStringArr.length != 1)
2428                isSelected = false;
2429            if (isSelected && win.document.contentType == "application/pdf")
2430                isSelected = false;
2431        } catch (ex) {
2432        }
2433        var isEntire = (url == top.window._content.location.href);
2434        var res = (aRow == -1) ? [mcTreeHandler.TREE.ref, 0] : this.getTarget(aRow, aOrient);
2435        var newResArr;
2436        if (this.modAlt && isEntire) {
2437        } else if (isSelected) {
2438            newResArr = window.top.bitsMarkingCollection.addSelectedText(res[0], res[1], aRow);
2439        } else {
2440            if (url.indexOf("http://") == 0 ||
2441                    url.indexOf("https://") == 0 ||
2442                    url.indexOf("ftp://") == 0 ||
2443                    url.indexOf("file://") == 0) {
2444                var importFlag = false;
2445                var splitFileName = this.Common.splitFileName(url);
2446                if (splitFileName[1].toLowerCase() == "xml" || splitFileName[1].toLowerCase() == "zip")
2447                    importFlag = mcXmlImportService.loadFile(res[0], res[1], aRow, url);
2448                if (!importFlag && !mcXmlImportService.isExportFile) {
2449                    if (this.originalTarget) {
2450                        //既にTargetが蚭定されおいる堎合、カレントのドキュメントのものかをチェック
2451                        if (this.originalTarget.ownerDocument != this.gBrowser.contentDocument) {
2452                            var win = this.gBrowser.contentWindow;
2453                            if (win.frames != null) {
2454                                var i;
2455                                for (i = 0; i < win.frames.length; i++) {
2456                                    if (this.originalTarget.ownerDocument == win.frames[i].document)
2457                                        break;
2458                                }
2459                                if (i >= win.frames.length)
2460                                    this.originalTarget = null;
2461                            } else {
2462                                this.originalTarget = null;
2463                            }
2464                        }
2465                    }
2466                    var tmpOriginalTarget = this.originalTarget;
2467                    while (tmpOriginalTarget && (tmpOriginalTarget.nodeName != "A" && tmpOriginalTarget.nodeName != "IMG")) {
2468                        tmpOriginalTarget = tmpOriginalTarget.parentNode;
2469                    }
2470                    if (tmpOriginalTarget)
2471                        this.originalTarget = tmpOriginalTarget;
2472                    newResArr = window.top.bitsMarkingCollection.addURLText(res[0], res[1], aRow, aXferString, this.originalTarget);
2473                }
2474            } else {
2475                isSelected = false;
2476                try {
2477                    isSelected = (sel.anchorNode === sel.focusNode && sel.anchorOffset == sel.focusOffset) ? false : true;
2478                } catch (ex) {
2479                }
2480                if (isSelected && win.document.contentType == "application/pdf")
2481                    isSelected = false;
2482                if (isSelected) {
2483                    newResArr = window.top.bitsMarkingCollection.addSelectedText(res[0], res[1], aRow);
2484                } else {
2485                    setTimeout(function() {
2486                        var rtn = window.top.bitsMarkingCollection.addPDFText(res[0], res[1], aRow, aXferString);
2487                        if (!rtn)
2488                            window.top.bitsMarkingCollection.Common.alert(mcMainService.STRING.getString("ERROR_INVALID_URL") + "\n" + url);
2489                    }, 0);
2490                }
2491            }
2492        }
2493        return {isSelected: isSelected, resArr: newResArr};
2494    },
2495    loadHTML: function(aEvent) {
2496        var doc = window.top.bitsMarkingCollection.BROWSER.contentDocument;
2497        var url = mcTreeDNDHandler.Common.getURLStringFromDocument(doc);
2498        var title = doc.title;
2499        var icon = "";
2500        var links = doc.getElementsByTagName("link");
2501        if (links && links.length > 0) {
2502            for (var i = 0; i < links.length; i++) {
2503                if (links[i].rel.toLowerCase() == "shortcut icon" || links[i].rel.toLowerCase() == "icon") {
2504                    icon = links[i].href;
2505                    break;
2506                }
2507            }
2508        }
2509        if (icon == "" && (url.indexOf("http://") == 0 || url.indexOf("https://") == 0)) {
2510            var root = mcTreeDNDHandler.Common.getRootHref(url);
2511            root += "/favicon.ico";
2512            var xmlhttp = new XMLHttpRequest();
2513            if (xmlhttp) {
2514                xmlhttp.open("GET", root, false);
2515                xmlhttp.send(null);
2516                if (xmlhttp.status == 200)
2517                    icon = root;
2518            }
2519        }
2520        if (title)
2521            mcTreeDNDHandler.DataSource.setProperty(mcTreeDNDHandler._oRes, "title", title);
2522        if (icon)
2523            mcTreeDNDHandler.DataSource.setProperty(mcTreeDNDHandler._oRes, "icon", icon);
2524        if (title || icon) {
2525            mcTreeDNDHandler.DataSource.flush();
2526            mcTreeHandler.TREE.builder.rebuild();
2527            var dbtype = mcTreeDNDHandler.DataSource.getProperty(mcTreeDNDHandler._oRes, "dbtype");
2528            var oid_property = "";
2529            var obj = mcTreeDNDHandler.Database.getObjectFormID(mcTreeDNDHandler._oID, dbtype);
2530            if (obj && obj.length > 0)
2531                oid_property = obj[0].oid_property;
2532            if (icon)
2533                oid_property += "<ICON>" + icon + "</ICON>";
2534            mcTreeDNDHandler.Database.updateObject({oid: mcTreeDNDHandler._oID, oid_title: title, oid_property: oid_property}, dbtype);
2535        }
2536        window.top.bitsMarkingCollection.BROWSER.removeEventListener("load", mcTreeDNDHandler.loadHTML, true);
2537        window.top.bitsMarkingCollection.BROWSER.loadURI("about:blank");
2538        if (title || icon)
2539            mcTreeViewModeService.rebuild();
2540    },
2541    getIconFromURL: function(aUrl, aRes) {
2542        var uri = aUrl;
2543        var xmlhttp = null;
2544        xmlhttp = new XMLHttpRequest();
2545        if (xmlhttp) {
2546            xmlhttp.onreadystatechange = function() {
2547                if (xmlhttp.readyState == 4) {
2548                    if (xmlhttp.status == 200) {
2549                        var contentType = xmlhttp.getResponseHeader("Content-Type");
2550                        var id = mcTreeDNDHandler.DataSource.getProperty(aRes, "id");
2551                        var dbtype = mcTreeDNDHandler.DataSource.getProperty(aRes, "id");
2552                        var type = "url";
2553                        var ext = "txt";
2554                        if (contentType.match(/^image\/(\S+)/)) {
2555                            type = "image";
2556                            ext = RegExp.$1;
2557                        } else if (contentType.match(/^text\/(\S+)/)) {
2558                            ext = RegExp.$1;
2559                            ext = ext.replace(/[^A-Za-z0-9]+$/mg, "");
2560                        }
2561                        mcTreeDNDHandler.Database.updateObject({oid: id, oid_txt: ext}, dbtype);
2562                        var bytes = [];
2563                        var filestream = xmlhttp.responseText;
2564                        for (var i = 0; i < filestream.length; i++) {
2565                            bytes[i] = filestream.charCodeAt(i) & 0xff;
2566                        }
2567                        var file = window.top.bitsMarkingCollection.getExtensionDir().clone();
2568                        file.append("data");
2569                        if (!file.exists())
2570                            file.create(file.DIRECTORY_TYPE, 0700);
2571                        file.append(id + "." + ext);
2572                        if (type == "image") {
2573                            if (file.exists())
2574                                file.remove(false);
2575                            file.create(file.NORMAL_FILE_TYPE, 0666);
2576                            var ostream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
2577                            ostream.init(file, 2, 0x200, false);
2578                            ostream.write(String.fromCharCode.apply(String, bytes), bytes.length);
2579                            ostream.close();
2580                            mcTreeDNDHandler.DataSource.setProperty(aRes, "icon", mcTreeDNDHandler.Common.convertFilePathToURL(file.path));
2581                            mcTreeDNDHandler.DataSource.flush();
2582                            mcTreeHandler.TREE.builder.rebuild();
2583                            mcTreeDNDHandler.Database.updateObjectBLOB(id, bytes, dbtype);
2584                        }
2585                    } else {
2586                        _dump("mcTreeDNDHandler.getIconFromURL():status=[" + xmlhttp.status + "]");
2587                    }
2588                }
2589            };
2590            xmlhttp.open("GET", uri, true);
2591            xmlhttp.overrideMimeType('text/plain; charset=x-user-defined');
2592            xmlhttp.send(null);
2593        }
2594    },
2595    parseHTML: function(text) {
2596        try {
2597            var createHTMLDocument = function() {
2598                var xsl = (new DOMParser()).parseFromString(
2599                        ['<?xml version="1.0"?>',
2600                            '<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">',
2601                            '<output method="html"/>',
2602                            '</stylesheet>'].join("\n"), "text/xml");
2603                var xsltp = new XSLTProcessor();
2604                xsltp.importStylesheet(xsl);
2605                var doc = xsltp.transformToDocument(document.implementation.createDocument("", "", null));
2606                return doc;
2607            };
2608            var doc = createHTMLDocument();
2609            var range = doc.createRange();
2610            doc.appendChild(doc.createElement("html"));
2611            range.selectNodeContents(doc.documentElement);
2612            doc.documentElement.appendChild(range.createContextualFragment(text));
2613            return doc;
2614        } catch (ex) {
2615            _dump("mcTreeDNDHandler.parseHTML():" + ex);
2616            return null;
2617        }
2618    },
2619    changeNodeStyle: function(pRes) {
2620        var id = this.DataSource.getProperty(pRes, "id");
2621        var pfid = this.DataSource.getProperty(pRes, "pfid");
2622        var dbtype = this.DataSource.getProperty(pRes, "dbtype");
2623        var source = this.DataSource.getProperty(pRes, "source");
2624        if (!source)
2625            source = bitsMarker.id_key + dbtype + id;
2626        var parentRes = this.DataSource.findParentResource(pRes);
2627        var style = this.DataSource.getProperty(parentRes, "style");
2628        this.Common.changeNodeStyleFromID(source, style, pfid, id, dbtype);
2629        this.DataSource.setProperty(pRes, "source", bitsMarker.id_key + dbtype + id);
2630    },
2631    getTarget: function(aRow, aOrient) {
2632        var tarRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(aRow);
2633        var tarPar = (aOrient == 0) ? tarRes : mcTreeHandler.getParentResource(aRow);
2634        var tarRelIdx = window.top.bitsObjectMng.DataSource.getRelativeIndex(tarPar, tarRes);
2635        if (aOrient == 1)
2636            tarRelIdx++;
2637        if (aOrient == 1 &&
2638                mcTreeHandler.TREE.view.isContainer(aRow) &&
2639                mcTreeHandler.TREE.view.isContainerOpen(aRow) &&
2640                mcTreeHandler.TREE.view.isContainerEmpty(aRow) == false) {
2641            tarPar = tarRes;
2642            tarRelIdx = 1;
2643        }
2644        return [tarPar.Value, tarRelIdx];
2645    },
2646};
2647
2648/////////////////////////////////////////////////////////////////////
2649/////////////////////////////////////////////////////////////////////
2650var mcTreeCssService = {
2651    get DataSource() {
2652        return window.top.bitsObjectMng.DataSource;
2653    },
2654    get Common() {
2655        return window.top.bitsObjectMng.Common;
2656    },
2657    get XPath() {
2658        return window.top.bitsObjectMng.XPath;
2659    },
2660    get Database() {
2661        return window.top.bitsObjectMng.Database;
2662    },
2663    get gBrowser() {
2664        return window.top.bitsObjectMng.getBrowser();
2665    },
2666    init: function() {
2667        try {
2668            if (document.styleSheets.length <= 1)
2669                return;
2670            mcTreeHandler.TREE.treeBoxObject.clearStyleAndImageCaches();
2671            var styleSheet = document.styleSheets[1];
2672            for (var i = styleSheet.cssRules.length - 1; i >= 0; i--) {
2673                styleSheet.deleteRule(i);
2674            }
2675            var useid = {};
2676            var i;
2677            var listRes = this.DataSource.flattenResources(this.Common.RDF.GetResource(this.DataSource.ABOUT_ROOT), 1, true);
2678            for (i = 0; i < listRes.length; i++) {
2679                if (listRes[i].Value == this.DataSource.ABOUT_ROOT)
2680                    continue;
2681                var id = this.DataSource.getProperty(listRes[i], "id");
2682                var dbtype = this.DataSource.getProperty(listRes[i], "dbtype");
2683                var style = this.DataSource.getProperty(listRes[i], "style");
2684                var style_id = 'css_' + dbtype + '_' + id;
2685                this.DataSource.setProperty(listRes[i], "cssrule", style_id);
2686                if (useid[style_id])
2687                    continue;
2688                useid[style_id] = style;
2689                styleSheet.insertRule("treechildren::-moz-tree-cell(" + style_id + "){ " + style + " }", styleSheet.cssRules.length);
2690                styleSheet.insertRule("treechildren::-moz-tree-cell-text(" + style_id + "){ " + style + " }", styleSheet.cssRules.length);
2691            }
2692            listRes = undefined;
2693            window.top.bitsContextMenu.rebuildCSS();
2694        } catch (ex) {
2695            _dump("mcTreeCssService.init():" + ex);
2696        }
2697    },
2698};
2699
2700/////////////////////////////////////////////////////////////////////
2701/////////////////////////////////////////////////////////////////////
2702var mcTreeMultiDocumentService = {
2703    get BUTTON() {
2704        return document.getElementById("mcToolbarMultiDocumentButton");
2705    },
2706    get DataSource() {
2707        return window.top.bitsObjectMng.DataSource;
2708    },
2709    get Common() {
2710        return window.top.bitsObjectMng.Common;
2711    },
2712    get Database() {
2713        return window.top.bitsObjectMng.Database;
2714    },
2715    get gBrowser() {
2716        return window.top.bitsObjectMng.getBrowser();
2717    },
2718    init: function() {
2719        var multidocument = nsPreferences.getBoolPref("wiredmarker.multidocument", false);
2720        if (this.BUTTON)
2721            this.BUTTON.setAttribute("checked", multidocument);
2722    },
2723    onClick: function(aEvent) {
2724        var multidocument = this.BUTTON.getAttribute("checked");
2725        if (!multidocument || multidocument == "false") {
2726            multidocument = true;
2727        } else {
2728            multidocument = false;
2729        }
2730        this.BUTTON.setAttribute("checked", multidocument);
2731        nsPreferences.setBoolPref("wiredmarker.multidocument", multidocument);
2732        mcPropertyView.dispProperty(mcTreeHandler.object);
2733        aEvent.stopPropagation();
2734    },
2735};
2736
2737/////////////////////////////////////////////////////////////////////
2738/////////////////////////////////////////////////////////////////////
2739var mcTreeViewModeService = {
2740    _select: false,
2741    _openlist: [],
2742    dbupdateTimer: null,
2743    get BUTTON() {
2744        return document.getElementById("mcToolbarViewModeButton");
2745    },
2746    get SINGLE() {
2747        return document.getElementById("mcToolbarViewModeItemSingle");
2748    },
2749    get ALL() {
2750        return document.getElementById("mcToolbarViewModeItemAll");
2751    },
2752    get EACH() {
2753        return document.getElementById("mcToolbarViewModeItemEach");
2754    },
2755    get TITLE() {
2756        return window.top.document.getElementById("sidebar-title");
2757    },
2758    get PROGRESS() {
2759        return document.getElementById("mcToolbarProgressmeter");
2760    },
2761    get DataSource() {
2762        return window.top.bitsObjectMng.DataSource;
2763    },
2764    get Common() {
2765        return window.top.bitsObjectMng.Common;
2766    },
2767    get Database() {
2768        return window.top.bitsObjectMng.Database;
2769    },
2770    get gBrowser() {
2771        return window.top.bitsObjectMng.getBrowser();
2772    },
2773    get viewmode() {
2774        var viewmode = "all";
2775        if (mcTreeViewModeService.EACH && mcTreeViewModeService.EACH.getAttribute("checked")) {
2776            viewmode = "each";
2777        } else if (mcTreeViewModeService.SINGLE && mcTreeViewModeService.SINGLE.getAttribute("checked")) {
2778            viewmode = "single";
2779        } else if (!mcTreeViewModeService.ALL) {
2780            viewmode = nsPreferences.copyUnicharPref("wiredmarker.viewmode", "all");
2781        }
2782        return viewmode;
2783    },
2784    init: function() {
2785        var viewmode = nsPreferences.copyUnicharPref("wiredmarker.viewmode", "all");
2786        switch (viewmode) {
2787            case "each" :
2788                this.EACH.setAttribute("checked", true);
2789                break;
2790            case "single" :
2791                this.SINGLE.setAttribute("checked", true);
2792                break;
2793            default :
2794                this.ALL.setAttribute("checked", true);
2795                break;
2796        }
2797        this.gBrowser.addEventListener("pageshow", this.pageshow, false);
2798        this.gBrowser.addEventListener("select", this.select, false);
2799        this.gBrowser.addEventListener("click", this.click, false);
2800        if (this.dbupdateTimer)
2801            clearTimeout(this.dbupdateTimer);
2802    },
2803    done: function() {
2804        this.gBrowser.removeEventListener("pageshow", this.pageshow, false);
2805        this.gBrowser.removeEventListener("select", this.select, false);
2806        this.gBrowser.removeEventListener("click", this.click, false);
2807        var viewmode = this.viewmode;
2808        if (viewmode == "each")
2809            viewmode = "all";
2810        nsPreferences.setUnicharPref("wiredmarker.viewmode", viewmode);
2811        if (this.dbupdateTimer)
2812            clearTimeout(this.dbupdateTimer);
2813    },
2814    pageshow: function(aEvent) {
2815        try {
2816            if (mcTreeViewModeService.gBrowser.contentDocument == aEvent.target) {
2817                var pageshow_url = mcTreeViewModeService.Common.getURLStringFromDocument(aEvent.target);
2818                if (mcTreeViewModeService._openlist[pageshow_url] == undefined && mcTreeViewModeService.viewmode == "single") {
2819                    mcTreeViewModeService.rebuild();
2820                }
2821            }
2822        } catch (e) {
2823        }
2824    },
2825    select: function(aEvent) {
2826        try {
2827            if (!mcTreeViewModeService)
2828                return;
2829            if (!mcTreeViewModeService._select) {
2830                mcTreeViewModeService._select = true;
2831                return;
2832            }
2833            var url = mcTreeViewModeService.Common.getURLStringFromDocument(mcTreeViewModeService.gBrowser.contentDocument);
2834            if (url.indexOf("chrome:") < 0 && url.indexOf("about:") < 0 && mcTreeViewModeService._openlist[url] == undefined) {
2835                if (mcTreeViewModeService.viewmode == "single")
2836                    mcTreeViewModeService.rebuild();
2837            }
2838            mcTreeViewModeService._select = false;
2839        } catch (ex) {
2840        }
2841    },
2842    dbupdate: function() {
2843        if (mcTreeViewModeService.dbupdateTimer)
2844            clearTimeout(mcTreeViewModeService.dbupdateTimer);
2845        var rtnUpdate = false;
2846        if (!rtnUpdate)
2847            rtnUpdate = mcTreeViewModeService.Database._updateCheck(mcTreeViewModeService.Database._defaultMode);
2848        if (rtnUpdate)
2849            mcTreeViewModeService.rebuild();
2850        mcTreeViewModeService.dbupdateTimer = setTimeout(mcTreeViewModeService.dbupdate, 1000)
2851    },
2852    click: function(aEvent) {
2853        var parent = aEvent.rangeParent;
2854        var offset = aEvent.rangeOffset;
2855        try {
2856            if (!bitsMarker)
2857                return;
2858        } catch (ex) {
2859            return;
2860        }
2861        var match_exp = new RegExp("^" + bitsMarker.id_key + "\\D+(\\d+)$", "m");
2862        var click_oid = "";
2863        while (parent) {
2864            if (parent.id && parent.id.match(match_exp)) {
2865                var dbtype = parent.getAttribute("dbtype");
2866                match_exp = new RegExp("^" + bitsMarker.id_key + dbtype + "(\\d+)$", "m");
2867                if (match_exp.test(parent.id)) {
2868                    click_oid = RegExp.$1;
2869                    break;
2870                }
2871            }
2872            parent = parent.parentNode;
2873        }
2874        if (!parent || click_oid == "")
2875            return;
2876        mcTreeViewModeService.selectTreeObject(click_oid, parent.getAttribute("dbtype"), parent.getAttribute("pfid"));
2877    },
2878    selectTreeObject: function(aOID, aDBTYPE, aPFID) {
2879        var click_oid = aOID;
2880        var click_dbtype = aDBTYPE;
2881        var click_pfid = aPFID;
2882        if (mcItemView.isChecked) {
2883            var f_pfid = undefined;
2884            var rtnFolder = this.Database.getFolder({fid: click_pfid}, click_dbtype);
2885            if (rtnFolder && rtnFolder.length)
2886                f_pfid = rtnFolder[0].pfid;
2887            rtnFolder = undefined;
2888            var About = this.DataSource.getID2About(click_pfid, f_pfid, click_dbtype);
2889            try {
2890                var searchRes = this.Common.RDF.GetResource(About);
2891                if (searchRes) {
2892                    var resArr = [];
2893                    var parentRes = searchRes;
2894                    do {
2895                        parentRes = this.DataSource.findParentResource(parentRes);
2896                        if (parentRes)
2897                            resArr.push(parentRes);
2898                    } while (parentRes && parentRes.Value != this.DataSource.ABOUT_ROOT);
2899                    for (var i = resArr.length - 1; i >= 0; i--) {
2900                        var selectIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(resArr[i]);
2901                        if (selectIdx >= 0 && !mcTreeHandler.TREE.view.isContainerOpen(selectIdx))
2902                            mcTreeHandler.TREE.view.toggleOpenState(selectIdx);
2903                    }
2904                    var selectIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(searchRes);
2905                    if (selectIdx >= 0) {
2906                        mcTreeHandler.TREE.currentIndex = selectIdx;
2907                        if (!mcTreeHandler.TREE.view.selection.isSelected(mcTreeHandler.TREE.currentIndex))
2908                            mcTreeHandler.TREE.view.selection.select(mcTreeHandler.TREE.currentIndex);
2909                        mcTreeHandler.TREE.treeBoxObject.ensureRowIsVisible(selectIdx);
2910                        if (bitsTreeDate && bitsTreeDate.isChecked) {
2911                            bitsTreeDate.onSelect({
2912                                oid: click_oid,
2913                                dbtype: click_dbtype
2914                            });
2915                        } else {
2916                            mcItemView.onTreeClick();
2917                        }
2918                        setTimeout(function() {
2919                            mcItemView.setSelection(click_oid, click_dbtype);
2920                        }, 0);
2921                    }
2922                }
2923            } catch (e) {
2924            }
2925        } else {
2926            var searchIdx = -1;
2927            var searchRes = null;
2928            var searchRes1 = null;
2929            var listRes2 = this.DataSource.flattenResources(this.Common.RDF.GetResource(this.DataSource.ABOUT_ROOT), 2, true);
2930            for (var j = 0; j < listRes2.length; j++) {
2931                var id = this.DataSource.getProperty(listRes2[j], "id");
2932                if (id == click_oid) {
2933                    if (!searchRes1)
2934                        searchRes1 = listRes2[j];
2935                    searchIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(listRes2[j]);
2936                    if ((mcTreeHandler.TREE.currentIndex > -1 && mcTreeHandler.TREE.currentIndex < searchIdx) || searchIdx < 0) {
2937                        searchRes = listRes2[j];
2938                        break;
2939                    }
2940                }
2941            }
2942            if (!searchRes && searchRes1)
2943                searchRes = searchRes1;
2944            if (searchRes) {
2945                var resArr = [];
2946                var parentRes = searchRes;
2947                do {
2948                    parentRes = this.DataSource.findParentResource(parentRes);
2949                    if (parentRes)
2950                        resArr.push(parentRes);
2951                } while (parentRes && parentRes.Value != this.DataSource.ABOUT_ROOT);
2952                var i;
2953                for (i = resArr.length - 1; i >= 0; i--) {
2954                    var selectIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(resArr[i]);
2955                    if (selectIdx >= 0 && !mcTreeHandler.TREE.view.isContainerOpen(selectIdx))
2956                        mcTreeHandler.TREE.view.toggleOpenState(selectIdx);
2957                }
2958                var selectIdx = mcTreeHandler.TREE.builderView.getIndexOfResource(searchRes);
2959                if (selectIdx >= 0) {
2960                    mcTreeHandler.TREE.currentIndex = selectIdx;
2961                    if (!mcTreeHandler.TREE.view.selection.isSelected(mcTreeHandler.TREE.currentIndex))
2962                        mcTreeHandler.TREE.view.selection.select(mcTreeHandler.TREE.currentIndex);
2963                    mcTreeHandler.TREE.focus();
2964                    mcTreeHandler.TREE.treeBoxObject.ensureRowIsVisible(selectIdx);
2965                    mcPropertyView.dispProperty(mcTreeHandler.object);
2966                }
2967            }
2968        }
2969        var doc = this.gBrowser.contentDocument;
2970        var selection = doc.defaultView.getSelection();
2971        if (selection) {
2972            if (selection.rangeCount) {
2973                var range = selection.getRangeAt(0);
2974                if (range.startContainer != range.endContainer || range.startOffset != range.endOffset) {
2975                    doc.defaultView.focus();
2976                }
2977            }
2978        }
2979    },
2980    changeTitle: function() {
2981        var label = "";
2982        var viewmode = mcTreeViewModeService.viewmode;
2983        switch (viewmode) {
2984            case "each" :
2985                label = this.EACH.getAttribute("label");
2986                break;
2987            case "single" :
2988                label = this.SINGLE.getAttribute("label");
2989                break;
2990            default :
2991                label = this.ALL.getAttribute("label");
2992                break;
2993        }
2994        var rootfolder = nsPreferences.copyUnicharPref("wiredmarker.rootfolder", "");
2995        var title = "";
2996        var foldres;
2997        if (rootfolder && rootfolder != "")
2998            foldres = this.Database.getFolderFormID(rootfolder);
2999        if (foldres)
3000            title = foldres[0].fid_title;
3001        if (title == "")
3002            title = mcMainService.STRING.getString("DEFAULT_FOLDER");
3003        var button_title = mcMainService.STRING.getString("APP_DISP_TITLE");
3004
3005        // DASISH modification
3006        // this.TITLE.setAttribute("value",button_title + " [ " + title + " ]");
3007        this.TITLE.setAttribute("value", "My Annotations");
3008        this.TITLE.setAttribute("style", "font-size: 1.2em; text-align: center; margin: 2pt 28pt 2pt 0;");
3009
3010        this.BUTTON.setAttribute("label", label + " ");
3011    },
3012    onClick: function(aEvent) {
3013        var viewmode = aEvent.target.value;
3014        if (mcTreeViewModeService.dbupdateTimer)
3015            clearTimeout(mcTreeViewModeService.dbupdateTimer);
3016        if (viewmode == "each")
3017            mcTreeHandler.TREE.setAttribute("ref", this.DataSource.ABOUT_ROOT); //暫定凊理
3018        this.rebuild();
3019        if (viewmode == "each")
3020            mcTreeHandler.openAllFolders();
3021        aEvent.stopPropagation();
3022    },
3023    rebuild: function() {
3024        try {
3025            var currentTreeIndex = mcTreeHandler.TREE.currentIndex;
3026            var currentTreeRes = null;
3027            if (currentTreeIndex >= 0)
3028                currentTreeRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(currentTreeIndex);
3029            var firstVisibleRow = mcTreeHandler.TREE.treeBoxObject.getFirstVisibleRow();
3030            var lastVisibleRow = mcTreeHandler.TREE.treeBoxObject.getLastVisibleRow();
3031            this.changeTitle();
3032            var resEnum = this.DataSource.data.GetAllResources();
3033            while (resEnum.hasMoreElements()) {
3034                var aRes = resEnum.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
3035                if (aRes.Value != this.DataSource.ABOUT_ROOT)
3036                    this.DataSource.removeResource(aRes);
3037            }
3038            var dsEnum = mcTreeHandler.TREE.database.GetDataSources();
3039            while (dsEnum.hasMoreElements()) {
3040                var ds = dsEnum.getNext().QueryInterface(Components.interfaces.nsIRDFDataSource);
3041                mcTreeHandler.TREE.database.RemoveDataSource(ds);
3042            }
3043            mcTreeHandler.TREE.treeBoxObject.clearStyleAndImageCaches();
3044            mcTreeHandler.TREE.builder.rebuild();
3045            if (mcTreeViewModeService.viewmode == "each") {
3046                window.top.bitsMarkingCollection.rebuildRdf(mcTreeViewModeService.rebuildCallback);
3047            } else {
3048                try {
3049                    window.top.bitsMarkingCollection.rebuildRdf();
3050                } catch (ex) {
3051                    _dump("mcTreeViewModeService.rebuild(1):" + ex);
3052                }
3053                this.DataSource.refresh();
3054                mcTreeCssService.init();
3055                mcTreeHandler.TREE.database.AddDataSource(this.DataSource.data);
3056                mcTreeHandler.TREE.builder.rebuild();
3057                mcTreeRootFolder.rebuild();
3058                if (currentTreeIndex < 0)
3059                    currentTreeIndex = 0;
3060                try {
3061                    var selectRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(currentTreeIndex);
3062                } catch (ex2) {
3063                    selectRes = null;
3064                }
3065                if (!selectRes)
3066                    currentTreeIndex = 0;
3067                if (firstVisibleRow <= currentTreeIndex && currentTreeIndex <= lastVisibleRow && currentTreeRes) {
3068                    var idx = mcTreeHandler.TREE.builderView.getIndexOfResource(currentTreeRes);
3069                    if (idx >= 0)
3070                        mcTreeHandler.TREE.currentIndex = idx;
3071                }
3072                if (!mcTreeHandler.TREE.view.selection.isSelected(mcTreeHandler.TREE.currentIndex))
3073                    mcTreeHandler.TREE.view.selection.select(mcTreeHandler.TREE.currentIndex);
3074                mcTreeHandler.TREE.treeBoxObject.ensureRowIsVisible(currentTreeIndex);
3075                if (firstVisibleRow >= 0)
3076                    mcTreeHandler.TREE.treeBoxObject.scrollToRow(firstVisibleRow);
3077                mcPropertyView.dispProperty(mcTreeHandler.object);
3078                this.showShortcutKey();
3079                setTimeout(function() {
3080                    mcTreeRdfRebuildItem.init();
3081                }, 0);
3082                return;
3083            }
3084        } catch (ex) {
3085            _dump("mcTreeViewModeService.rebuild():" + ex);
3086        }
3087    },
3088    showShortcutKey: function() {
3089        var elem = document.getElementById("mcTreeColShortcut");
3090        var show_shortcut = nsPreferences.getBoolPref("wiredmarker.shortcut.tree_disp", true);
3091        if (show_shortcut) {
3092            if (elem)
3093                elem.removeAttribute("hidden");
3094            var resAllFolder = this.DataSource.flattenResources(this.Common.RDF.GetResource(this.DataSource.ABOUT_ROOT), 1, true);
3095            var rcnt;
3096            for (rcnt = 0; rcnt < resAllFolder.length; rcnt++) {
3097                var fRes = resAllFolder[rcnt];
3098                if (fRes.Value == this.DataSource.ABOUT_ROOT)
3099                    continue;
3100                var fid = this.DataSource.getProperty(fRes, "id");
3101                var dbtype = this.DataSource.getProperty(fRes, "dbtype");
3102                var type = this.DataSource.getProperty(fRes, "type");
3103                if (!fid || !dbtype || type == "localfolder")
3104                    continue;
3105                var acceltext = window.top.bitsShortcutService.getAcceltext(fid, dbtype);
3106                if (!acceltext)
3107                    acceltext = "";
3108                this.DataSource.setProperty(fRes, "shortcut", acceltext);
3109            }
3110            this.DataSource.flush();
3111        } else {
3112            if (elem)
3113                elem.setAttribute("hidden", "true");
3114        }
3115    },
3116    rebuildCallback: function(aStatus) {
3117        switch (aStatus.status) {
3118            case 0:
3119                mcTreeViewModeService.PROGRESS.setAttribute("value", "0%");
3120                mcTreeViewModeService.PROGRESS.removeAttribute("hidden");
3121                break;
3122            case 1:
3123            case 2:
3124            case 3:
3125                mcTreeViewModeService.PROGRESS.removeAttribute("hidden");
3126                mcTreeViewModeService.PROGRESS.setAttribute("value", aStatus.value + "%");
3127                break;
3128            case 4:
3129                var dsEnum = mcTreeHandler.TREE.database.GetDataSources();
3130                while (dsEnum.hasMoreElements()) {
3131                    var ds = dsEnum.getNext().QueryInterface(Components.interfaces.nsIRDFDataSource);
3132                    mcTreeHandler.TREE.database.RemoveDataSource(ds);
3133                }
3134                mcTreeViewModeService.DataSource.refresh();
3135                mcTreeHandler.TREE.database.AddDataSource(mcTreeViewModeService.DataSource.data);
3136                mcTreeCssService.init();
3137                mcTreeHandler.TREE.builder.rebuild();
3138                mcTreeRootFolder.rebuild();
3139                mcPropertyView.dispProperty(mcTreeHandler.object);
3140                mcTreeHandler.openAllFolders();
3141                mcTreeViewModeService.PROGRESS.setAttribute("hidden", "true");
3142                break;
3143            default:
3144                break;
3145        }
3146    },
3147};
3148
3149/////////////////////////////////////////////////////////////////////
3150var mcTreeImageTooltip = {
3151    get tooltipRow() {
3152        return window.top.bitsImageTooltip.tooltipRow;
3153    },
3154    init: function() {
3155        window.top.bitsImageTooltip.init();
3156    },
3157    done: function() {
3158        window.top.bitsImageTooltip.done();
3159    },
3160    onMousedown: function(aEvent) {
3161        window.top.bitsImageTooltip.onMousedown(aEvent);
3162    },
3163    onMouseout: function(aEvent) {
3164        window.top.bitsImageTooltip.onMouseout(aEvent);
3165    },
3166    hidePopup: function() {
3167        window.top.bitsImageTooltip.hidePopup();
3168    },
3169    onMousemove: function(aEvent, aParam) {
3170        window.top.bitsImageTooltip.onMousemove(aEvent, aParam);
3171    },
3172};
3173
3174/////////////////////////////////////////////////////////////////////
3175var mcTreeRdfRebuildItem = {
3176    _init: false,
3177    timerid: null,
3178    rdfdoc: null,
3179    nsResolver: null,
3180    xmlNode: null,
3181    progressWindow: null,
3182    folderFilterHash: {},
3183    resOpenFolder: [],
3184    resLoadFolder: [],
3185    resAllFolder: [],
3186    itemObjects: [],
3187    viewmode: "",
3188    get DataSource() {
3189        return window.top.bitsObjectMng.DataSource;
3190    },
3191    get Common() {
3192        return window.top.bitsObjectMng.Common;
3193    },
3194    get Database() {
3195        return window.top.bitsObjectMng.Database;
3196    },
3197    get gBrowser() {
3198        return window.top.bitsObjectMng.getBrowser();
3199    },
3200    get uriRDF() {
3201        return "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
3202    },
3203    get uriNS1() {
3204        return "http://www.bits.cc/Wired-Marker/wiredmarker-rdf#";
3205    },
3206    init: function() {
3207        try {
3208            this.unsetTreeEvent();
3209            if (mcItemView.isChecked) {
3210                this.setTreeEvent();
3211                if (bitsTreeDate.isChecked) {
3212                    bitsTreeDate.onSelectTab();
3213                } else {
3214                    mcItemView.onTreeClick();
3215                }
3216                return;
3217                ;
3218            }
3219            this._init = true;
3220            if (this.timerid)
3221                clearTimeout(this.timerid);
3222            this.timerid = null;
3223            this.viewmode = mcTreeViewModeService.viewmode;
3224            this.doc_url = this.Common.getURLStringFromDocument(this.gBrowser.contentDocument);
3225            if (this.progressWindow && !this.progressWindow.closed)
3226                this.progressWindow.close();
3227            this.progressWindow = null;
3228            if (!this.progressWindow) {
3229                var x = screen.width;
3230                var y = screen.height;
3231            }
3232            var i;
3233            this.rdfdoc = null;
3234            this.nsResolver = null;
3235            this.xmlNode = null;
3236            var aRdfFile = this.DataSource.file.clone();
3237            var rdf = this.Common.convertToUnicode(this.Common.readFile(aRdfFile), "UTF-8");
3238            if (rdf && rdf != "") {
3239                var parser = new DOMParser();
3240                this.rdfdoc = parser.parseFromString(rdf, "text/xml");
3241                parser = undefined;
3242                if (this.rdfdoc)
3243                    this.nsResolver = this.rdfdoc.createNSResolver(this.rdfdoc.ownerDocument == null ? this.rdfdoc.documentElement : this.rdfdoc.ownerDocument.documentElement);
3244                rdf = undefined;
3245            }
3246            this.resOpenFolder.length = 0;
3247            this.resLoadFolder = [];
3248            this.resAllFolder.length = 0;
3249            this.itemObjects.length = 0;
3250            if (mcTreeHandler.TREE.view) {
3251                for (i = 0; i < mcTreeHandler.TREE.view.rowCount; i++) {
3252                    if (mcTreeHandler.TREE.view.isContainer(i) && mcTreeHandler.TREE.view.isContainerOpen(i)) {
3253                        var res = mcTreeHandler.TREE.builderView.getResourceAtIndex(i);
3254                        this.resOpenFolder.push(res);
3255                    }
3256                }
3257            }
3258            this.resAllFolder = this.DataSource.flattenResources(this.Common.RDF.GetResource(this.DataSource.ABOUT_ROOT), 1, true);
3259            this.timerid = setTimeout(function() {
3260                mcTreeRdfRebuildItem.exec();
3261            }, 0);
3262            this.folderFilterHash = {};
3263            var tmpFolderFilter = nsPreferences.copyUnicharPref("wiredmarker.filter.folder", "");
3264            var tmpFolderFilterArr = tmpFolderFilter.split("\t");
3265            var i;
3266            for (i = 0; i < tmpFolderFilterArr.length; i++) {
3267                if (!tmpFolderFilterArr[i].match(/^(\d+):(\d+):(.+)$/))
3268                    continue;
3269                var filter_fid = RegExp.$1;
3270                var filter_casesensitive = RegExp.$2;
3271                var filter_keyword = RegExp.$3;
3272                this.folderFilterHash[filter_fid] = new RegExp(filter_keyword, (filter_casesensitive == 1) ? "mg" : "img");
3273            }
3274            tmpFolderFilterArr = undefined;
3275            tmpFolderFilter = undefined;
3276            if (this.progressWindow && !this.progressWindow.closed) {
3277                if (this.resOpenFolder.length > 0 || this.resAllFolder.length > 0) {
3278                    if (this.progressWindow.setStatus)
3279                        this.progressWindow.setStatus(mcMainService.STRING.getString("MSG_LOADING_SCRAP") + "... [ " + (this.resOpenFolder.length + this.resAllFolder.length) + " ]");
3280                } else {
3281                    if (this.progressWindow && !this.progressWindow.closed)
3282                        this.progressWindow.close();
3283                    this.progressWindow = null;
3284                }
3285            }
3286        } catch (e) {
3287            _dump("mcTreeRdfRebuildItem.init():" + e);
3288        }
3289    },
3290    exec: function() {
3291        try {
3292            var fRes = null;
3293            if (this.resOpenFolder.length > 0) {
3294                fRes = this.resOpenFolder.shift();
3295            } else if (this.resAllFolder.length > 0) {
3296                fRes = this.resAllFolder.shift();
3297            }
3298            if (this.progressWindow && !this.progressWindow.closed) {
3299                if (fRes) {
3300                    var title = this.DataSource.getProperty(fRes, "title");
3301                    if (this.progressWindow.setStatus)
3302                        this.progressWindow.setStatus(mcMainService.STRING.getString("MSG_LOADING_SCRAP") + "... [ " + (this.resOpenFolder.length + this.resAllFolder.length + 1) + " ]");
3303                }
3304            }
3305            if (!fRes) {
3306                this.done();
3307                return;
3308            }
3309            if (this.itemObjects)
3310                this.itemObjects.length = 0;
3311            this.itemObjects = [];
3312            if (this.resLoadFolder[fRes.Value] == undefined) {
3313                var j;
3314                var fid = this.DataSource.getProperty(fRes, "id");
3315                var dbtype = this.DataSource.getProperty(fRes, "dbtype");
3316                if (fid && dbtype) {
3317                    if (this.viewmode == "all") {
3318                        this.itemObjects = this.Database.getObjectFormPID(fid, dbtype);
3319                    } else {
3320                        this.itemObjects = this.Database.getObject({pfid: fid, doc_url: this.doc_url}, dbtype);
3321                    }
3322                }
3323                if (this.itemObjects && this.itemObjects.length > 0 && this.folderFilterHash[fid]) {
3324                    var newObj = [];
3325                    for (j = 0; j < this.itemObjects.length; j++) {
3326                        var obj = this.itemObjects[j];
3327                        if (this.folderFilterHash[obj.pfid] && !obj.oid_title.match(this.folderFilterHash[obj.pfid]))
3328                            continue;
3329                        newObj.push(obj);
3330                    }
3331                    this.itemObjects = newObj;
3332                }
3333                if (this.itemObjects && this.itemObjects.length > 0) {
3334                    this.xmlNode = null;
3335                    if (this.rdfdoc && this.nsResolver) {
3336                        var xPathXML = this.rdfdoc.evaluate('//RDF:Seq[@RDF:about="' + fRes.Value + '"]', this.rdfdoc, this.nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
3337                        if (xPathXML && xPathXML.singleNodeValue)
3338                            this.xmlNode = xPathXML.singleNodeValue;
3339                    }
3340                    if (this.xmlNode) {
3341                        this.timerid = setTimeout(function() {
3342                            mcTreeRdfRebuildItem.execItem(fRes);
3343                        }, 0);
3344                        return;
3345                    }
3346                } else {
3347                    if (!this.itemObjects)
3348                        this.itemObjects = [];
3349                }
3350                this.resLoadFolder[fRes.Value] = "";
3351            }
3352            this.timerid = setTimeout(function() {
3353                mcTreeRdfRebuildItem.exec();
3354            }, 0);
3355        } catch (e) {
3356            _dump("mcTreeRdfRebuildItem.exec():" + e);
3357        }
3358    },
3359    execItem: function(fRes) {
3360        try {
3361            if (!this.itemObjects || this.itemObjects.length == 0) {
3362                if (this.DataSource.file.exists()) {
3363                    var s = new XMLSerializer();
3364                    var rdfstr = s.serializeToString(this.rdfdoc);
3365                    this.Common.writeFile(this.DataSource.file.clone(), rdfstr + "\n", "UTF-8");
3366                    this.DataSource.refresh();
3367                } else {
3368                    this.done();
3369                    return;
3370                }
3371                this.resLoadFolder[fRes.Value] = "";
3372                this.timerid = setTimeout(function() {
3373                    mcTreeRdfRebuildItem.exec();
3374                }, 0);
3375                return;
3376            }
3377            var EXECNUM = 10;
3378            var i;
3379            for (i = 0; i < EXECNUM && this.itemObjects.length > 0; i++) {
3380                var item = this.Database.makeObjectToItem(this.itemObjects.shift());
3381                var itemKey;
3382                var xmlItem = this.rdfdoc.createElementNS(this.uriRDF, "RDF:Description");
3383                for (itemKey in item) {
3384                    if (itemKey == "about") {
3385                        xmlItem.setAttributeNS(this.uriRDF, "RDF:" + itemKey, item[itemKey]);
3386                    } else if (itemKey == "list") {
3387                        continue;
3388                    } else {
3389                        xmlItem.setAttributeNS(this.uriNS1, "NS1:" + itemKey, item[itemKey]);
3390                    }
3391                }
3392                this.xmlNode.appendChild(this.rdfdoc.createTextNode("  "));
3393                var xmlList = this.rdfdoc.createElementNS(this.uriRDF, "RDF:li");
3394                xmlList.setAttributeNS(this.uriRDF, "RDF:resource", item.about);
3395                this.xmlNode.appendChild(xmlList);
3396                this.xmlNode.appendChild(this.rdfdoc.createTextNode("\n  "));
3397                this.rdfdoc.documentElement.appendChild(this.rdfdoc.createTextNode("  "));
3398                this.rdfdoc.documentElement.appendChild(xmlItem);
3399                this.rdfdoc.documentElement.appendChild(this.rdfdoc.createTextNode("\n"));
3400            }
3401            this.timerid = setTimeout(function() {
3402                mcTreeRdfRebuildItem.execItem(fRes);
3403            }, 0);
3404        } catch (e) {
3405            _dump("mcTreeRdfRebuildItem.execItem():" + e);
3406        }
3407    },
3408    done: function() {
3409        try {
3410            if (this.DataSource.file.exists()) {
3411                var box = mcTreeHandler.TREE.boxObject;
3412                box.QueryInterface(Components.interfaces.nsITreeBoxObject);
3413                var fvRow = box.getFirstVisibleRow();
3414                try {
3415                    var fvRes = mcTreeHandler.TREE.builderView.getResourceAtIndex(fvRow);
3416                    var resEnum = this.DataSource.data.GetAllResources();
3417                    while (resEnum.hasMoreElements()) {
3418                        var aRes = resEnum.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
3419                        if (aRes.Value != this.DataSource.ABOUT_ROOT)
3420                            this.DataSource.removeResource(aRes);
3421                    }
3422                    var dsEnum = mcTreeHandler.TREE.database.GetDataSources();
3423                    while (dsEnum.hasMoreElements()) {
3424                        var ds = dsEnum.getNext().QueryInterface(Components.interfaces.nsIRDFDataSource);
3425                        mcTreeHandler.TREE.database.RemoveDataSource(ds);
3426                    }
3427                    mcTreeHandler.TREE.treeBoxObject.clearStyleAndImageCaches();
3428                    mcTreeHandler.TREE.builder.rebuild();
3429                    var s = new XMLSerializer();
3430                    var rdfstr = s.serializeToString(this.rdfdoc);
3431                    this.Common.writeFile(this.DataSource.file.clone(), rdfstr + "\n", "UTF-8");
3432                    this.DataSource.refresh();
3433                    mcTreeCssService.init();
3434                    mcTreeHandler.TREE.database.AddDataSource(this.DataSource.data);
3435                    mcTreeHandler.TREE.builder.rebuild();
3436                    mcTreeRootFolder.rebuild();
3437                    fvRow = mcTreeHandler.TREE.builderView.getIndexOfResource(this.Common.RDF.GetResource(fvRes.Value));
3438                    box.scrollToRow(fvRow);
3439                } catch (e) {
3440                }
3441                this.setTreeEvent();
3442            }
3443        } catch (ex) {
3444            _dump("mcTreeRdfRebuildItem.done():" + ex);
3445        }
3446        if (this.progressWindow && !this.progressWindow.closed)
3447            this.progressWindow.close();
3448        this.progressWindow = null;
3449        if (this.timerid)
3450            clearTimeout(this.timerid);
3451        this.timerid = null;
3452        this.rdfdoc = null;
3453        this.nsResolver = null;
3454        this.xmlNode = null;
3455        this.resOpenFolder.length = 0;
3456        this.resLoadFolder = [];
3457        this.resAllFolder.length = 0;
3458        this.itemObjects.length = 0;
3459    },
3460    setTreeEvent: function() {
3461        mcTreeHandler.TREE.onmousedown = function(e) {
3462            mcTreeHandler.onMousedown(e);
3463        }
3464        mcTreeHandler.TREE.onmouseup = function(e) {
3465            mcTreeHandler.onMouseup(e);
3466        }
3467        mcTreeHandler.TREE.onmousemove = function(e) {
3468            mcTreeHandler.onMousemove(e);
3469        }
3470        mcTreeHandler.TREE.onmouseout = function(e) {
3471            mcTreeHandler.onMouseout(e);
3472        }
3473        mcTreeHandler.TREE.ondblclick = function(e) {
3474            mcTreeHandler.onDblClick(e);
3475        }
3476        mcTreeHandler.TREE.onkeydown = function(e) {
3477            mcTreeHandler.onKeyDown(e);
3478        }
3479        mcTreeHandler.TREE.onkeyup = function(e) {
3480            mcTreeHandler.onKeyUp(e);
3481        }
3482        mcTreeHandler.TREE.onkeypress = function(e) {
3483            mcTreeHandler.onKeyPress(e);
3484        }
3485        mcTreeHandler.TREE.onclick = function(e) {
3486            mcTreeRdfRebuildItem.onclick(e);
3487        }
3488        var info = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
3489        var app_version = parseFloat(info.version);
3490        if (app_version < 3.1) {
3491            mcTreeHandler.TREE.addEventListener("draggesture", mcTreeRdfRebuildItem.onOldDraggesture, false);
3492            mcTreeHandler.TREE.addEventListener("dragover", mcTreeRdfRebuildItem.onOldDragover, false);
3493            mcTreeHandler.TREE.addEventListener("dragdrop", mcTreeRdfRebuildItem.onOldDragdrop, false);
3494            mcTreeHandler.TREE.addEventListener("dragexit", mcTreeRdfRebuildItem.onOldDragexit, false);
3495        } else {
3496            mcTreeHandler.TREE.addEventListener("dragstart", mcTreeRdfRebuildItem.onDragEvents, false);
3497            mcTreeHandler.TREE.addEventListener("drag", mcTreeRdfRebuildItem.onDragEvents, false);
3498            mcTreeHandler.TREE.addEventListener("dragend", mcTreeRdfRebuildItem.onDragEvents, false);
3499            mcTreeHandler.TREE.addEventListener("dragenter", mcTreeRdfRebuildItem.onDropEvents, false);
3500            mcTreeHandler.TREE.addEventListener("dragover", mcTreeRdfRebuildItem.onDropEvents, false);
3501            mcTreeHandler.TREE.addEventListener("dragleave", mcTreeRdfRebuildItem.onDropEvents, false);
3502            mcTreeHandler.TREE.addEventListener("drop", mcTreeRdfRebuildItem.onDropEvents, false);
3503        }
3504    },
3505    unsetTreeEvent: function() {
3506        mcTreeHandler.TREE.onmousedown = null;
3507        mcTreeHandler.TREE.onmouseup = null;
3508        mcTreeHandler.TREE.onmousemove = null;
3509        mcTreeHandler.TREE.onmouseout = null;
3510        mcTreeHandler.TREE.ondblclick = null;
3511        mcTreeHandler.TREE.onkeydown = null;
3512        mcTreeHandler.TREE.onkeyup = null;
3513        mcTreeHandler.TREE.onkeypress = null;
3514        mcTreeHandler.TREE.onclick = null;
3515        var info = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
3516        var app_version = parseFloat(info.version);
3517        if (app_version < 3.1) {
3518            mcTreeHandler.TREE.removeEventListener("draggesture", mcTreeRdfRebuildItem.onOldDraggesture, false);
3519            mcTreeHandler.TREE.removeEventListener("dragover", mcTreeRdfRebuildItem.onOldDragover, false);
3520            mcTreeHandler.TREE.removeEventListener("dragdrop", mcTreeRdfRebuildItem.onOldDragdrop, false);
3521            mcTreeHandler.TREE.removeEventListener("dragexit", mcTreeRdfRebuildItem.onOldDragexit, false);
3522        } else {
3523            mcTreeHandler.TREE.removeEventListener("dragstart", mcTreeRdfRebuildItem.onDragEvents, false);
3524            mcTreeHandler.TREE.removeEventListener("drag", mcTreeRdfRebuildItem.onDragEvents, false);
3525            mcTreeHandler.TREE.removeEventListener("dragend", mcTreeRdfRebuildItem.onDragEvents, false);
3526            mcTreeHandler.TREE.removeEventListener("dragenter", mcTreeRdfRebuildItem.onDropEvents, false);
3527            mcTreeHandler.TREE.removeEventListener("dragover", mcTreeRdfRebuildItem.onDropEvents, false);
3528            mcTreeHandler.TREE.removeEventListener("dragleave", mcTreeRdfRebuildItem.onDropEvents, false);
3529            mcTreeHandler.TREE.removeEventListener("drop", mcTreeRdfRebuildItem.onDropEvents, false);
3530        }
3531    },
3532    onclick: function(e) {
3533        mcTreeHandler.onClick(e, 2);
3534    },
3535/////////////////////////////////////////////////////////////////////
3536// Drag & Drop Old Callback functions
3537/////////////////////////////////////////////////////////////////////
3538    onOldDraggesture: function(e) {
3539        mcTreeDNDHandler.getModifiers(e);
3540        nsDragAndDrop.startDrag(e, mcTreeDNDHandler.dragDropObserver);
3541        e.stopPropagation();
3542    },
3543    onOldDragover: function(e) {
3544        nsDragAndDrop.dragOver(e, mcTreeDNDHandler.dragDropObserver);
3545        e.stopPropagation();
3546    },
3547    onOldDragdrop: function(e) {
3548        mcTreeDNDHandler.setDataTransfer(e);
3549        nsDragAndDrop.drop(e, mcTreeDNDHandler.dragDropObserver);
3550        e.stopPropagation();
3551    },
3552    onOldDragexit: function(e) {
3553        nsDragAndDrop.dragExit(e, mcTreeDNDHandler.dragDropObserver);
3554        e.stopPropagation();
3555    },
3556/////////////////////////////////////////////////////////////////////
3557// Drag & Drop New Callback functions
3558/////////////////////////////////////////////////////////////////////
3559    onDragEvents: function(aEvent) {
3560        switch (aEvent.type) {
3561            case "dragstart":
3562                mcTreeRdfRebuildItem.onDragStart(aEvent);
3563                break;
3564            case "drag":
3565                break;
3566            case "dragend":
3567                break;
3568        }
3569    },
3570    onDragStart: function(aEvent) {
3571        try {
3572            mcTreeImageTooltip.hidePopup()
3573        } catch (ex) {
3574        }
3575        try {
3576            if (aEvent.originalTarget.localName != "treechildren")
3577                return;
3578            mcTreeDNDHandler.getModifiers(aEvent);
3579            var curIdx = mcTreeHandler.TREE.currentIndex;
3580            var res = mcTreeHandler.TREE.builderView.getResourceAtIndex(curIdx);
3581            var curPar = mcTreeHandler.getParentResource(curIdx);
3582            var p_source = window.top.bitsObjectMng.DataSource.getProperty(curPar, "source");
3583            var transferData = aEvent.dataTransfer;
3584            transferData.setData("moz/rdfitem", res.Value);
3585        } catch (ex) {
3586            _dump("mcTreeRdfRebuildItem.onDragStart():" + ex);
3587        }
3588    },
3589    onDropEvents: function(aEvent) {
3590        switch (aEvent.type) {
3591            case "dragenter":
3592            case "dragover":
3593                aEvent.preventDefault();
3594                break;
3595            case "drop":
3596                mcTreeDNDHandler.setDataTransfer(aEvent);
3597                aEvent.preventDefault();
3598                break;
3599        }
3600    },
3601};
3602
3603/////////////////////////////////////////////////////////////////////
3604var mcItemView = {
3605    get _bitsItemView() {
3606        return bitsItemView;
3607    },
3608    get _bitsItemViewToolbar() {
3609        return document.getElementById("bitsItemViewToolbar");
3610    },
3611    get modAlt() {
3612        return this._bitsItemView.modAlt;
3613    },
3614    get modShift() {
3615        return this._bitsItemView.modShift;
3616    },
3617    get modCtrl() {
3618        return this._bitsItemView.modCtrl;
3619    },
3620    get modMeta() {
3621        return this._bitsItemView.modMeta;
3622    },
3623    get isChecked() {
3624        return this._bitsItemView.isChecked;
3625    },
3626    get object() {
3627        return this._bitsItemView.object;
3628    },
3629    get TREE() {
3630        return this._bitsItemView.TREE;
3631    },
3632    get POPUP() {
3633        return document.getElementById("mcPopupFolder");
3634    },
3635    get CONTEXTMENU() {
3636        return document.getElementById("mcPopupFolderItemViewMenu");
3637    },
3638    get FAVICON_POPUP() {
3639        return document.getElementById("mcPopupFolderItemViewFaviconMenupopup");
3640    },
3641    get ITEM_POPUP() {
3642        return document.getElementById("mcPopupFolderItemViewItemMenupopup");
3643    },
3644    get idMENUITEM() {
3645        return "mcPopupFolderItem_";
3646    },
3647    init: function(aEvent) {
3648        this._bitsItemView.init(aEvent);
3649        if (this._bitsItemView.isChecked) {
3650            this.CONTEXTMENU.removeAttribute("hidden");
3651            if (this._bitsItemViewToolbar && mcTreeViewModeService.BUTTON)
3652                this._bitsItemViewToolbar.appendChild(mcTreeViewModeService.BUTTON);
3653            this.initMenu(aEvent);
3654            var contextmenu_mode = nsPreferences.copyUnicharPref("wiredmarker.contextmenu.mode");
3655            if (contextmenu_mode != "legacy") {
3656                this.POPUP.addEventListener("popupshowing", this.popupMenu, false);
3657                this.FAVICON_POPUP.addEventListener("command", this.commandMenuFavicon, false);
3658                this.ITEM_POPUP.addEventListener("command", this.commandMenuItem, false);
3659            }
3660        } else {
3661            this.CONTEXTMENU.setAttribute("hidden", "true");
3662        }
3663    },
3664    initMenu: function(aEvent) {
3665        var contextmenu_mode = nsPreferences.copyUnicharPref("wiredmarker.contextmenu.mode");
3666        if (contextmenu_mode == "legacy") {
3667            if (this._bitsItemView.VTTB)
3668                this._bitsItemView.VTTB.removeAttribute("hidden");
3669        } else {
3670            if (this._bitsItemView.VTTB)
3671                this._bitsItemView.VTTB.setAttribute("hidden", "true");
3672            if (this._bitsItemView.VTTB && this.FAVICON_POPUP && !this.FAVICON_POPUP.hasChildNodes()) {
3673                var menuitems = this._bitsItemView.VTTB.getElementsByTagName("menuitem");
3674                for (var i = 0; i < menuitems.length; i++) {
3675                    var menuitem = document.createElement("menuitem");
3676                    menuitem.setAttribute("type", "radio");
3677                    menuitem.setAttribute("label", menuitems[i].getAttribute("label"));
3678                    menuitem.setAttribute("id", this.idMENUITEM + menuitems[i].id);
3679                    menuitem.setAttribute("target_id", menuitems[i].id);
3680                    this.FAVICON_POPUP.appendChild(menuitem);
3681                }
3682            }
3683            if (this._bitsItemView.TREE && this.ITEM_POPUP && !this.ITEM_POPUP.hasChildNodes()) {
3684                var treecols = this._bitsItemView.TREE.getElementsByTagName("treecol");
3685                for (var i = 0; i < treecols.length; i++) {
3686                    if (treecols[i].hasAttribute("ignoreincolumnpicker") && treecols[i].getAttribute("ignoreincolumnpicker") == "true")
3687                        continue;
3688                    var menuitem = document.createElement("menuitem");
3689                    menuitem.setAttribute("type", "checkbox");
3690                    menuitem.setAttribute("label", treecols[i].getAttribute("label"));
3691                    menuitem.setAttribute("id", this.idMENUITEM + treecols[i].id);
3692                    menuitem.setAttribute("target_id", treecols[i].id);
3693                    this.ITEM_POPUP.appendChild(menuitem);
3694                }
3695            }
3696        }
3697    },
3698    getElementById: function(id) {
3699        return document.getElementById(this.idMENUITEM + id);
3700    },
3701    popupMenu: function(aEvent) {
3702        mcItemView._popupMenu(aEvent);
3703    },
3704    _popupMenu: function(aEvent) {
3705        if (this._bitsItemView.VTTB && this.FAVICON_POPUP && this.FAVICON_POPUP.hasChildNodes()) {
3706            var menuitems = this._bitsItemView.VTTB.getElementsByTagName("menuitem");
3707            for (var i = 0; i < menuitems.length; i++) {
3708                if (!menuitems[i].hasAttribute("checked") || menuitems[i].getAttribute("checked") == "false")
3709                    continue;
3710                try {
3711                    this.getElementById(menuitems[i].id).setAttribute("checked", "true");
3712                } catch (e) {
3713                }
3714                break;
3715            }
3716        }
3717        if (this._bitsItemView.TREE && this.ITEM_POPUP && this.ITEM_POPUP.hasChildNodes()) {
3718            var treecols = this._bitsItemView.TREE.getElementsByTagName("treecol");
3719            for (var i = 0; i < treecols.length; i++) {
3720                try {
3721                    if (treecols[i].hasAttribute("hidden") && treecols[i].getAttribute("hidden") == "true") {
3722                        this.getElementById(treecols[i].id).removeAttribute("checked");
3723                    } else {
3724                        this.getElementById(treecols[i].id).setAttribute("checked", "true");
3725                    }
3726                } catch (e) {
3727                }
3728            }
3729        }
3730    },
3731    commandMenuFavicon: function(aEvent) {
3732        mcItemView._commandMenuFavicon(aEvent);
3733    },
3734    _commandMenuFavicon: function(aEvent) {
3735        if (!aEvent.target.id.match(new RegExp("^" + this.idMENUITEM + "(.+$)")))
3736            return;
3737        var id = aEvent.target.getAttribute("target_id");
3738        var menuitem = this._bitsItemView.VTTB.ownerDocument.getElementById(id);
3739        if (menuitem) {
3740            menuitem.setAttribute("checked", "true");
3741            this._bitsItemView.onViewTypePopupCommand({target: menuitem});
3742        }
3743    },
3744    commandMenuItem: function(aEvent) {
3745        mcItemView._commandMenuItem(aEvent);
3746    },
3747    _commandMenuItem: function(aEvent) {
3748        if (!aEvent.target.id.match(new RegExp("^" + this.idMENUITEM + "(.+$)")))
3749            return;
3750        var id = aEvent.target.getAttribute("target_id");
3751        var treecol = this._bitsItemView.TREE.ownerDocument.getElementById(id);
3752        if (treecol) {
3753            if (aEvent.target.hasAttribute("checked")) {
3754                treecol.removeAttribute("hidden");
3755            } else {
3756                treecol.setAttribute("hidden", "true");
3757            }
3758        }
3759    },
3760    done: function(aEvent) {
3761        this._bitsItemView.done(aEvent);
3762        if (this._bitsItemView.isChecked) {
3763            var contextmenu_mode = nsPreferences.copyUnicharPref("wiredmarker.contextmenu.mode");
3764            if (contextmenu_mode != "legacy") {
3765                this.POPUP.removeEventListener("popupshowing", this.popupMenu, false);
3766                this.FAVICON_POPUP.removeEventListener("command", this.commandMenuFavicon, false);
3767                this.ITEM_POPUP.removeEventListener("command", this.commandMenuItem, false);
3768            }
3769        }
3770    },
3771    disp: function() {
3772        this._bitsItemView.disp();
3773    },
3774    onButtonClick: function(aEvent) {
3775        this._bitsItemView.onButtonClick(aEvent);
3776    },
3777    onTreeClick: function(aEvent) {
3778        var aRes = mcTreeHandler.resource;
3779        if (aRes) {
3780            var fid = mcTreeHandler.DataSource.getProperty(aRes, "id");
3781            var dbtype = mcTreeHandler.DataSource.getProperty(aRes, "dbtype");
3782            var viewmode = mcTreeViewModeService.viewmode;
3783            this._bitsItemView.onTreeClick({viewmode: viewmode, fid: fid, dbtype: dbtype, res: aRes});
3784        } else {
3785            this._bitsItemView.onTreeClick();
3786        }
3787    },
3788    setSelection: function(aOID, aDBTYPE) {
3789        this._bitsItemView.setSelection(aOID, aDBTYPE);
3790    },
3791    mergeObject: function(srcRes, dstRes) {
3792        var src_title;
3793        var dst_title;
3794        if (srcRes)
3795            src_title = mcTreeHandler.DataSource.getProperty(srcRes, "title");
3796        if (dstRes)
3797            dst_title = mcTreeHandler.DataSource.getProperty(dstRes, "title");
3798        if (src_title != dst_title)
3799            return 0;
3800        var fid = mcTreeHandler.DataSource.getProperty(dstRes, "id");
3801        var dbtype = mcTreeHandler.DataSource.getProperty(dstRes, "dbtype");
3802        return this._bitsItemView.mergeObject({fid: fid, dbtype: dbtype});
3803    },
3804    copyObject: function(aRes) {
3805        var fid = mcTreeHandler.DataSource.getProperty(aRes, "id");
3806        var dbtype = mcTreeHandler.DataSource.getProperty(aRes, "dbtype");
3807        var style = mcTreeHandler.DataSource.getProperty(aRes, "style");
3808        this._bitsItemView.copyObject({fid: fid, dbtype: dbtype, fid_style: style});
3809
3810    },
3811    moveObject: function(aRes, aModShift) {
3812        var srcRes = mcTreeHandler.resource;
3813        var fid = mcTreeHandler.DataSource.getProperty(aRes, "id");
3814        var dbtype = mcTreeHandler.DataSource.getProperty(aRes, "dbtype");
3815        var style = mcTreeHandler.DataSource.getProperty(aRes, "style");
3816        var rtn = this._bitsItemView.moveObject({fid: fid, dbtype: dbtype, fid_style: style}, aModShift);
3817        if (srcRes) {
3818            setTimeout(function() {
3819                var fid = mcTreeHandler.DataSource.getProperty(srcRes, "id");
3820                var dbtype = mcTreeHandler.DataSource.getProperty(srcRes, "dbtype");
3821                var viewmode = mcTreeViewModeService.viewmode;
3822                mcItemView._bitsItemView.onTreeClick({viewmode: viewmode, fid: fid, dbtype: dbtype, res: srcRes});
3823            }, 0);
3824        }
3825
3826    },
3827    refresh: function() {
3828        this._bitsItemView.refresh();
3829    }
3830};
3831
3832
3833/////////////////////////////////////////////////////////////////////
3834var mcDatabaseUpdate = {
3835    _rebuild_time: 0,
3836    _rebuild: false,
3837    get gBrowser() {
3838        return window.top.bitsObjectMng.getBrowser();
3839    },
3840    init: function(aEvent) {
3841        mcDatabaseUpdate._rebuild_time = parseInt(window.top.bitsObjectMng.Common.getTimeStamp());
3842        mcDatabaseUpdate._rebuild = false;
3843    },
3844    rebuild: function(aEvent) {
3845        if (!mcDatabaseUpdate._rebuild)
3846            return;
3847        mcTreeViewModeService.rebuild();
3848//              mcDatabaseUpdate.gBrowser.reload();
3849        mcDatabaseUpdate._rebuild = false;
3850    },
3851};
3852
3853/////////////////////////////////////////////////////////////////////
3854var mcDatabaseObserver = {
3855    timerid: null,
3856    domain: 'wiredmarker', //"objectmng.xxx"ずいう名前の蚭定が倉曎された堎合党おで凊理を行う
3857    observe: function(aSubject, aTopic, aPrefstring) {
3858        try {
3859            if (aTopic == 'nsPref:changed') {
3860                switch (aPrefstring) {
3861                    case "wiredmarker.last_update":
3862                        var inittime = window.top.bitsObjectMng.DataSource.inittime;
3863                        var value = nsPreferences.copyUnicharPref(aPrefstring, "");
3864                        var arr = value.split("\t");
3865                        if (inittime != arr[2]) {
3866                            if (mcDatabaseObserver.timerid)
3867                                clearTimeout(mcDatabaseObserver.timerid);
3868                            mcDatabaseObserver.timerid = setTimeout(function() {
3869                                mcDatabaseObserver.timerid = null;
3870                                mcDatabaseUpdate._rebuild = true;
3871                            }, 1000);
3872                        }
3873                        window.top.bitsAutocacheService.refresh();
3874                        bitsTreeDate.refresh();
3875                        window.top.bitsTreeListService.reload();
3876                        setTimeout(function() {
3877                            bitsSearchAcross.search();
3878                        }, 1000);
3879                        break;
3880                    case "wiredmarker.rebuild_addon_msg":
3881                        setTimeout(
3882                                function() {
3883                                    if (!mcDatabaseUpdate._rebuild) {
3884                                        mcDatabaseUpdate._rebuild = true;
3885                                        mcDatabaseUpdate.rebuild();
3886                                    }
3887                                    if (mcItemView.isChecked)
3888                                        mcItemView.refresh();
3889                                }, 0);
3890                        window.top.bitsAutocacheService.refresh();
3891                        break;
3892                    case "wiredmarker.shortcut.tree_disp":
3893                        mcTreeViewModeService.showShortcutKey();
3894                        break;
3895                    case "wiredmarker.contextmenu.mode":
3896                        mcItemView.initMenu();
3897                        break;
3898                    default:
3899                        break;
3900                }
3901            }
3902        } catch (ex) {
3903            window.top.bitsObjectMng.Common.alert("mcDatabaseObserver:" + ex);
3904        }
3905    }
3906};
3907
3908/////////////////////////////////////////////////////////////////////
3909function showConsole() {
3910    window.open("chrome://global/content/console.xul", "_blank", "chrome,extrachrome,menubar,resizable,scrollbars,status,toolbar");
3911}
3912
3913/////////////////////////////////////////////////////////////////////
3914// JavaScript コン゜ヌルにテキストを衚瀺する
3915/////////////////////////////////////////////////////////////////////
3916function _dump(aString) {
3917    if (nsPreferences.getBoolPref("wiredmarker.debug", false))
3918        window.dump(aString + "\n");
3919}
3920function _dump2(aString) {
3921    if (!nsPreferences.getBoolPref("wiredmarker.debug", false))
3922        return;
3923    var dumpString = new String(aString);
3924    var aConsoleService = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
3925    aConsoleService.logStringMessage(dumpString);
3926    window.dump(aString + "\n");
3927}
Note: See TracBrowser for help on using the repository browser.