Changeset 2731


Ignore:
Timestamp:
03/22/13 10:52:12 (11 years ago)
Author:
sroth
Message:

Modifications of sidebar top to fit DASISH outfit.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • DASISH/t5.6/client/trunk/chrome/markingcollection/content/markingcollection/tree.js

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