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

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

Wired-Marker initial source code with minor adjustments.

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