source: DASISH/t5.6/client/trunk/chrome/markingcollection/content/markingcollection/objectmng.js @ 4356

Last change on this file since 4356 was 4356, checked in by sroth, 10 years ago

Added function call of DELETE request to MPI REST server.

File size: 188.9 KB
Line 
1var bitsObjectMng = {
2        uri       : "",
3        _index_arr : null,
4/////////////////////////////////////////////////////////////////////
5        get STRING(){ return document.getElementById("ObjectManagerOverlayString"); },
6        get NS_OBJECTMANAGEMENT(){
7                return "http://www.bits.cc/Wired-Marker/wiredmarker-rdf#"
8        },
9        get editmodeid(){
10                return "bitsExtentionEditMode";
11        },
12        get isEdit(){
13                var doc = bitsObjectMng.getBrowser().contentDocument;
14                var elem_edit = doc.getElementById(bitsObjectMng.editmodeid);
15                return elem_edit?true:false;
16        },
17        set isEdit(pValue){
18                var doc = bitsObjectMng.getBrowser().contentDocument;
19                var elem_edit = doc.getElementById(bitsObjectMng.editmodeid);
20                if(!elem_edit){
21                        var elem_body = doc.body;
22                        elem_edit = doc.createElement("span");
23                        elem_edit.setAttribute("id",bitsObjectMng.editmodeid);
24                        elem_body.appendChild(elem_edit);
25                }
26                return;
27        },
28/////////////////////////////////////////////////////////////////////
29        init : function(){
30                bitsObjectMng.DataSource.init();
31        },
32/////////////////////////////////////////////////////////////////////
33        done : function(){
34                bitsObjectMng.DataSource.save(bitsObjectMng.getBrowser().contentDocument);
35                bitsObjectMng.DataSource.done();
36        },
37
38/////////////////////////////////////////////////////////////////////
39        load : function(event){
40                bitsObjectMng.DataSource.load(event);
41        },
42
43/////////////////////////////////////////////////////////////////////
44        save : function(event){
45                bitsObjectMng.DataSource.save(event);
46        },
47
48/////////////////////////////////////////////////////////////////////
49        saveload : function(event){
50                bitsObjectMng.DataSource.saveload(event);
51        },
52
53/////////////////////////////////////////////////////////////////////
54        getBrowser : function(){
55                return gBrowser;
56        },
57
58/////////////////////////////////////////////////////////////////////
59        _dump : function(aString){
60                if(nsPreferences.getBoolPref("wiredmarker.debug", false)){
61                        window.dump(bitsObjectMng.Common.convertFormUnicode(aString,"UTF-8")+"\n");
62                        var dumpString = new String(aString);
63                        var aConsoleService = Components.classes["@mozilla.org/consoleservice;1"]
64                                              .getService(Components.interfaces.nsIConsoleService);
65                        aConsoleService.logStringMessage(dumpString);
66                }
67        },
68
69/////////////////////////////////////////////////////////////////////
70        _dump2 : function(aString){
71                if(nsPreferences.getBoolPref("wiredmarker.debug", false)){
72                        var dumpString = new String(aString);
73                        var aConsoleService = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
74                        aConsoleService.logStringMessage(dumpString);
75                        window.dump(aString+"\n");
76                }
77        },
78
79/////////////////////////////////////////////////////////////////////
80/////////////////////////////////////////////////////////////////////
81        Common : {
82
83                get RDF()     { return Components.classes['@mozilla.org/rdf/rdf-service;1'].getService(Components.interfaces.nsIRDFService); },
84                get RDFC()    { return Components.classes['@mozilla.org/rdf/container;1'].getService(Components.interfaces.nsIRDFContainer); },
85                get RDFCU()   { return Components.classes['@mozilla.org/rdf/container-utils;1'].getService(Components.interfaces.nsIRDFContainerUtils); },
86                get DIR()     { return Components.classes['@mozilla.org/file/directory_service;1'].getService(Components.interfaces.nsIProperties); },
87                get IO()      { return Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService); },
88                get UNICODE(){ return Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].getService(Components.interfaces.nsIScriptableUnicodeConverter); },
89                get WINDOW()  { return Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator); },
90                get PROMPT()  { return Components.classes['@mozilla.org/embedcomp/prompt-service;1'].getService(Components.interfaces.nsIPromptService); },
91                get PREF()    { return Components.classes['@mozilla.org/preferences;1'].getService(Components.interfaces.nsIPrefBranch); },
92                get JSSSL()   { return Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Components.interfaces.mozIJSSubScriptLoader); },
93                get ENV()     { return Components.classes["@mozilla.org/process/environment;1"].getService(Components.interfaces.nsIEnvironment); },
94                get FAVICON(){ return Components.classes["@mozilla.org/browser/favicon-service;1"].getService(Components.interfaces.nsIFaviconService); },
95                get MIME()    { return Components.classes["@mozilla.org/mime;1"].getService(Components.interfaces.nsIMIMEService); },
96                get STORAGE(){ return Components.classes["@mozilla.org/storage/service;1"].getService(Components.interfaces.mozIStorageService); },
97                get DNS()     { return Components.classes['@mozilla.org/network/dns-service;1'].getService(Components.interfaces.nsIDNSService); },
98                get FONT()    { return Components.classes['@mozilla.org/gfx/fontenumerator;1'].getService(Components.interfaces.nsIFontEnumerator); },
99
100/////////////////////////////////////////////////////////////////////
101                newItem : function(aID){
102                        return {
103                                id          : aID || "",
104                                type        : "",
105                                title       : "",
106                                chars       : "",
107                                comment     : "" ,
108                                icon        : "",
109                                source      : "",
110                                uri         : "",
111                                style       : "",
112                                cssrule     : "",
113                                editmode    : "",
114                                pfid        : "",
115                                pfid_order  : "",
116                                dbtype      : "",
117                                addon_id    : "",
118                                contextmenu : "",
119                                shortcut    : ""
120                        };
121                },
122
123/////////////////////////////////////////////////////////////////////
124                getExtensionDir : function(){
125                        var dir;
126                        try{
127                                var isDefault = this.PREF.getBoolPref("objectmng.data.default");
128                                dir = this.PREF.getComplexValue("objectmng.data.path", Components.interfaces.nsIPrefLocalizedString).data;
129                                dir = this.convertPathToFile(dir);
130                        }catch(ex){
131                                isDefault = true;
132                        }
133                        if(isDefault){
134                                dir = this.DIR.get("ProfD", Components.interfaces.nsIFile);
135                                dir.append("ObjectManagement");
136                                if(!dir.exists()){
137                                        dir = this.DIR.get("ProfD", Components.interfaces.nsIFile);
138                                        dir.append(bitsObjectMng.STRING.getString("APP_TITLE"));
139                                }
140                        }
141                        if(!dir.exists()) dir.create(dir.DIRECTORY_TYPE, 0700);
142                        return dir;
143                },
144
145/////////////////////////////////////////////////////////////////////
146                getContentDir : function(){
147                        var dir = this.getExtensionDir().clone();
148                        dir.append("data");
149                        if(!dir.exists()) dir.create(dir.DIRECTORY_TYPE, 0700);
150                        return dir;
151                },
152
153/////////////////////////////////////////////////////////////////////
154                getUser : function(){
155                        try{
156                                var user = this.ENV.get("USER");
157                                if(!user || user == "") user = this.ENV.get("USERNAME");
158                        }catch(ex){}
159                        return user;
160                },
161
162/////////////////////////////////////////////////////////////////////
163                getHostname : function(){
164                        try{
165                                var user = this.ENV.get("HOSTNAME");
166                                if(!user || user == "") user = this.ENV.get("COMPUTERNAME");
167                        }catch(ex){}
168                        return user;
169                },
170
171/////////////////////////////////////////////////////////////////////
172                getLang : function(){
173                        var LANG = "Shift_jis";
174                        try{
175                                var lang = this.ENV.get("LANG");
176                                if(lang && lang != "" && lang.match(/^ja_JP\.(.+)$/)) LANG = RegExp.$1;
177                        }catch(ex){}
178                        return LANG;
179                },
180
181/////////////////////////////////////////////////////////////////////
182                alert : function(aMsg,aTitle,aWindow){
183                        if(aTitle == undefined) aTitle = bitsObjectMng.STRING.getString("APP_DISP_TITLE");
184                        if(aWindow == undefined) aWindow = window;
185                        this.PROMPT.alert(aWindow, aTitle, aMsg);
186                },
187
188/////////////////////////////////////////////////////////////////////
189                confirm : function(aMsg,aTitle,aFlag,aCheckMsg,aCheckState,aWindow){
190                        var prompts = this.PROMPT;
191                        if(aTitle == undefined) aTitle = bitsObjectMng.STRING.getString("APP_DISP_TITLE");
192                        if(aFlag == undefined) aFlag = prompts.STD_YES_NO_BUTTONS + prompts.BUTTON_POS_1_DEFAULT;
193                        if(aCheckState == undefined) aCheckState = {value: false};
194                        if(aWindow == undefined) aWindow = window;
195                        var button = prompts.confirmEx(aWindow, aTitle, aMsg, aFlag, "", "", "", aCheckMsg, aCheckState);
196                        return button==0?true:false;
197                },
198
199/////////////////////////////////////////////////////////////////////
200                prompt : function(aMsg,aTitle,aInput,aCheckMsg,aCheckState,aWindow){
201                        var prompts = this.PROMPT;
202                        if(aTitle == undefined) aTitle = bitsObjectMng.STRING.getString("APP_DISP_TITLE");
203                        if(aInput == undefined) aInput = {value: ""};
204                        if(aCheckState == undefined) aCheckState = {value: false};
205                        if(aWindow == undefined) aWindow = window;
206                        var result = prompts.prompt(aWindow, aTitle, aMsg, aInput, aCheckMsg, aCheckState);
207                        if(result){
208                                return {input:aInput.value,check:aCheckState.value};
209                        }else{
210                                return undefined;
211                        }
212                },
213
214/////////////////////////////////////////////////////////////////////
215                removeDirSafety : function(aDir, check){
216                        var file;
217                        var rtn = true;
218                        try{
219                                if(check && !aDir.leafName.match(/^\d{14}$/)) return;
220                                var fileEnum = aDir.directoryEntries;
221                                while(fileEnum.hasMoreElements()){
222                                        file = fileEnum.getNext().QueryInterface(Components.interfaces.nsIFile);
223                                        if(file.isFile()) file.remove(false);
224                                }
225                                file = aDir;
226                                if(aDir.isDirectory()) aDir.remove(false);
227                        }catch(ex){
228                                bitsObjectMng._dump("ObjectManagement ERROR: Failed to remove file '" + file.leafName + "'.\n" + ex);
229                                rtn = false;
230                        }
231                        return rtn;
232                },
233
234/////////////////////////////////////////////////////////////////////
235                getElemOffsetHeight : function(elem,height){
236                        if(!elem) return 0;
237                        if(!height) height = 0;
238                        if(height < elem.offsetHeight) height = elem.offsetHeight;
239                        for(var i=0;i<elem.childNodes.length;i++){
240                                var c_elem = elem.childNodes[i];
241                                if(c_elem.firstChild){
242                                        height = this.getElemOffsetHeight(c_elem,height);
243                                }else{
244                                        if(height < c_elem.offsetHeight) height = c_elem.offsetHeight;
245                                }
246                        }
247                        return height;
248                },
249
250/////////////////////////////////////////////////////////////////////
251                getElementById : function(pElemId){
252                        try {
253                                if(!pElemId || pElemId=="") return null;
254                                var DOC = [];
255                                if(gBrowser.contentWindow.frames){
256                                        for(var wincnt=0;wincnt<gBrowser.contentWindow.frames.length;wincnt++){
257                                                DOC.push(gBrowser.contentWindow.frames[wincnt].document);
258                                        }
259                                }
260                                DOC.push(gBrowser.contentDocument);
261                                var elem = null;
262                                var i;
263                                var doc;
264                                for(i=0;i<DOC.length;i++){
265                                        doc = DOC[i];
266                                        if(!doc) continue;
267                                        elem = doc.getElementById(pElemId);
268                                        if(elem) break;
269                                }
270                                return elem;
271                        }catch(ex){
272                                this._dump("bitsObjectMng.Common.getElementById():"+ex);
273                        }
274                },
275
276/////////////////////////////////////////////////////////////////////
277                changeNodeStyleFromID : function(aSource,aStyle,pPfid,aID,aDBType){
278                        if(!aID) return;
279                        for(var i=0;i<gBrowser.browsers.length;i++){
280                                var contentDocument = gBrowser.browsers[i].contentDocument;
281                                var contentWindow = gBrowser.browsers[i].contentWindow;
282                                var i;
283                                var DOC = [];
284                                if(contentWindow.frames){
285                                        for(var wincnt=0;wincnt<contentWindow.frames.length;wincnt++){
286                                                DOC.push(contentWindow.frames[wincnt].document);
287                                        }
288                                }
289                                DOC.push(contentDocument);
290                                for(var j=0;j<DOC.length;j++){
291                                        var doc = DOC[j];
292                                        var xPathResult = bitsObjectMng.XPath.evaluate('//*[@id="'+aSource+'"]', doc);
293                                        for(var k=0;k<xPathResult.snapshotLength;k++){
294                                                var node = xPathResult.snapshotItem(k);
295                                                if(aID && aDBType) node.setAttribute("id",bitsMarker.id_key+aDBType+aID);
296                                                if(pPfid) node.setAttribute("pfid",pPfid);
297                                                if(aDBType) node.setAttribute("dbtype",aDBType);
298                                                if(aStyle){
299                                                        node.setAttribute("style",aStyle);
300                                                }else{
301                                                        node.removeAttribute("style");
302                                                }
303                                                if(aStyle && xPathResult.snapshotLength>1){
304                                                        if(k==0){
305                                                                node.style.borderRight = "";
306                                                        }else if(k==(xPathResult.snapshotLength-1)){
307                                                                node.style.borderLeft = "";
308                                                        }else{
309                                                                node.style.borderLeft = "";
310                                                                node.style.borderRight = "";
311                                                        }
312                                                }
313                                        }
314                                }
315                                DOC = undefined;
316                        }
317                },
318
319/////////////////////////////////////////////////////////////////////
320                doTopElement : function(pElemId,aStyle,aID,aDBType){
321                        if(!pElemId || pElemId=="") return false;
322                        var elem = this.getElementById(pElemId);
323                        var rtnObj = null;
324                        if(!elem && aID){
325                                var DOC = [];
326                                if(gBrowser.contentWindow.frames){
327                                        for(var wincnt=0;wincnt<gBrowser.contentWindow.frames.length;wincnt++){
328                                                DOC.push(gBrowser.contentWindow.frames[wincnt].document);
329                                        }
330                                }
331                                DOC.push(gBrowser.contentDocument);
332                                rtnObj = bitsObjectMng.Database.getObjectFormID(aID,aDBType);
333                                if(rtnObj){
334                                        for(var cnt=0;cnt<rtnObj.length;cnt++){
335                                                var rObj = rtnObj[cnt];
336                                                var doc = null;
337                                                for(var i=0;i<DOC.length;i++){
338                                                        if(rObj.con_url == bitsAutocacheService.convertCacheURLToOriginalURL(this.getURLStringFromDocument(DOC[i]))){
339                                                                doc = DOC[i];
340                                                                break;
341                                                        }
342                                                }
343                                                if(doc) bitsMarker.xPathMarker(doc,{start:rObj.bgn_dom,end:rObj.end_dom,context:rObj.oid_txt,con_url:rObj.con_url}, { id:rObj.oid, dbtype:rObj.dbtype, pfid:rObj.pfid, style:rObj.fid_style });
344                                        }
345                                }
346                                elem = this.getElementById(pElemId);
347                        }
348                        if(!elem) return false;
349                        var xPathResult = bitsObjectMng.XPath.evaluate('//*[@id="'+elem.id+'"]', elem.ownerDocument);
350                        var k;
351                        var node;
352                        var y_offs = -1;
353                        var y_offs_temp;
354                        var y_offs_elem = null;
355                        for(k=0;k<xPathResult.snapshotLength;k++){
356                                node = xPathResult.snapshotItem(k);
357                                y_offs_temp = this.getPageOffsetTop(node);
358                                if(y_offs == -1 || y_offs > y_offs_temp){
359                                        y_offs = y_offs_temp;
360                                        y_offs_elem = node;
361                                }
362                        }
363                        if(y_offs_elem) elem = y_offs_elem;
364                        if(y_offs < 0) y_offs = this.getPageOffsetTop( elem );
365                        var height = this.getElemOffsetHeight( elem );
366                        if(height>0){
367                                y_offs -= 15;
368                        }else{
369                                if(elem.offsetHeight == 0) y_offs -= 15;
370                        }
371                        if(aStyle) this.changeNodeStyleFromID(pElemId,aStyle,(rtnObj && rtnObj.pdif)?rtnObj.pfid:undefined,aDBType);
372                        var doc = elem.ownerDocument;
373                        var win = doc.defaultView;
374                        win.scroll( win.pageXOffset, y_offs );
375                        return true;
376                },
377
378/////////////////////////////////////////////////////////////////////
379                doTopElementIMG : function(aID,aDBType){
380                        try{
381                                if(!aID || aID=="") return false;
382                                var elem = null;
383                                var rtnObj = null;
384                                if(!elem && aID){
385                                        var DOC = [];
386                                        if(gBrowser.contentWindow.frames){
387                                                for(var wincnt=0;wincnt<gBrowser.contentWindow.frames.length;wincnt++){
388                                                        DOC.push(gBrowser.contentWindow.frames[wincnt].document);
389                                                }
390                                        }
391                                        DOC.push(gBrowser.contentDocument);
392                                        var doc = null;
393                                        rtnObj = bitsObjectMng.Database.getObjectFormID(aID,aDBType);
394                                        if(rtnObj){
395                                                var cnt;
396                                                var i;
397                                                var rObj;
398                                                for(cnt=0;cnt<rtnObj.length;cnt++){
399                                                        rObj = rtnObj[cnt];
400                                                        for(i=0;i<DOC.length;i++){
401                                                                if(rObj.con_url == bitsAutocacheService.convertCacheURLToOriginalURL(this.getURLStringFromDocument(DOC[i]))){
402                                                                        doc = DOC[i];
403                                                                        break;
404                                                                }
405                                                        }
406                                                        if(doc) break;
407                                                }
408                                        }
409                                        if(doc){
410                                                var aXPath = {};
411                                                rObj.bgn_dom.match(/(.+)\(([0-9]+)\)\(([0-9]+)\)/);
412                                                aXPath.startPath   = RegExp.$1;
413                                                aXPath.startOffset = RegExp.$2;
414                                                aXPath.startType   = RegExp.$3;
415                                                rObj.end_dom.match(/(.+)\(([0-9]+)\)\(([0-9]+)\)/);
416                                                aXPath.endPath   = RegExp.$1;
417                                                aXPath.endOffset = RegExp.$2;
418                                                aXPath.endType   = RegExp.$3;
419                                                if(rObj.bgn_dom != rObj.end_dom){
420                                                        var startNode = bitsObjectMng.XPath.getCurrentNodeFromXPath(doc,aXPath.startPath,aXPath.startOffset,aXPath.startType);
421                                                        if(!startNode || !startNode.node) return false;
422                                                        var endNode = bitsObjectMng.XPath.getCurrentNodeFromXPath(doc,aXPath.endPath,aXPath.endOffset,aXPath.endType);
423                                                        if(!endNode || !endNode.node) return false;
424                                                        var range = doc.createRange();
425                                                        try{
426                                                                range.setStart(startNode.node, startNode.offset);
427                                                                range.setEnd(endNode.node, endNode.offset);
428                                                        }catch(e){
429                                                                bitsObjectMng._dump("bitsObjectMng.Common.doTopElementIMG():"+e);
430                                                                return false;
431                                                        }
432                                                        var nodeWalker = doc.createTreeWalker(range.commonAncestorContainer,NodeFilter.SHOW_ELEMENT,null,false);
433                                                        if(nodeWalker){
434                                                                var txtNode=nodeWalker.nextNode();
435                                                                for(;txtNode;txtNode = nodeWalker.nextNode()){
436                                                                        if(!range) continue;
437                                                                        if(this.rangeCompareNode(range,txtNode) == 0) continue;
438                                                                        if(this.rangeCompareNode(range,txtNode) == 1) break;
439                                                                        if(txtNode.nodeName != "IMG") continue;
440                                                                        if(txtNode.src != rObj.oid_txt) continue;
441                                                                        elem = txtNode;
442                                                                        break;
443                                                                }
444                                                        }
445                                                }else{
446                                                        var startNode = bitsObjectMng.XPath.getCurrentNodeFromXPath(doc,aXPath.startPath,aXPath.startOffset,aXPath.startType);
447                                                        if(!startNode || !startNode.node) return false;
448                                                        elem = startNode.node;
449                                                }
450                                        }
451                                }
452                                if(!elem) return false;
453                                var y_offs = this.getPageOffsetTop( elem );
454                                var height = elem.offsetHeight;
455                                if(height>0){
456                                        y_offs -= 15;
457                                }else{
458                                        if(elem.offsetHeight == 0) y_offs -= 15;
459                                }
460                                var doc = elem.ownerDocument;
461                                var win;
462                                if(doc) win = doc.defaultView;
463                                if(win) win.scroll( win.pageXOffset, y_offs );
464                                return true;
465                        }catch(ex){
466                                this._dump("bitsObjectMng.Common.doTopElementIMG():"+ex);
467                        }
468                },
469
470/////////////////////////////////////////////////////////////////////
471                pageshow : function(aDoc){
472                        var tab = gBrowser.selectedTab;
473                        if(!tab || !tab.hasAttribute("Wired-Marker:oid") || !tab.hasAttribute("Wired-Marker:pfid") || !tab.hasAttribute("Wired-Marker:dbtype")) return;
474
475                        var oid = tab.getAttribute("Wired-Marker:oid");
476                        var pfid = tab.getAttribute("Wired-Marker:pfid");
477                        var source = tab.getAttribute("Wired-Marker:source");
478                        var dbtype = tab.getAttribute("Wired-Marker:dbtype");
479                        var style = tab.getAttribute("Wired-Marker:style");
480
481                        var aObject = bitsObjectMng.Database.getObject({oid:oid,pfid:pfid}, dbtype)[0];
482                        if(aObject){
483                                if(aObject.doc_url != aObject.con_url && aObject.doc_url == bitsAutocacheService.convertCacheURLToOriginalURL(this.getURLStringFromDocument(aDoc))){
484                                        var frame_name;
485                                        var frame_id;
486                                        var parser = new DOMParser();
487                                        var xmldoc = parser.parseFromString(aObject.oid_property,"text/xml");
488                                        if(xmldoc){
489                                                try{frame_name = xmldoc.getElementsByTagName("FRAME_NAME")[0].textContent;}catch(e){}
490                                        }
491                                        if(frame_name){
492                                                var win = aDoc.defaultView;
493                                                if(win.frames != null){
494                                                        var loadFlag = false;
495                                                        var i;
496                                                        for(i=0;i<win.frames.length;i++){
497                                                                if(win.frames[i].name != frame_name) continue;
498                                                                if(bitsAutocacheService.convertCacheURLToOriginalURL(this.getURLStringFromDocument(win.frames[i].document)) == aObject.con_url) break;
499                                                                win.frames[i].document.location = aObject.con_url;
500                                                                loadFlag = true;
501                                                                break;
502                                                        }
503                                                        if(!loadFlag && frame_id){
504                                                                var nodes = bitsObjectMng.XPath.evaluate('//*[@id="'+frame_id+'"]',doc);
505                                                                if(nodes && nodes.snapshotLength == 1){
506                                                                        frame_name = nodes.snapshotItem(0).name;
507                                                                        for(i=0;i<win.frames.length;i++){
508                                                                                if(win.frames[i].name != frame_name) continue;
509                                                                                if(bitsAutocacheService.convertCacheURLToOriginalURL(this.getURLStringFromDocument(win.frames[i].document)) == aObject.con_url) break;
510                                                                                win.frames[i].document.location = aObject.con_url;
511                                                                                loadFlag = true;
512                                                                                break;
513                                                                        }
514                                                                }
515                                                        }
516                                                        if(loadFlag){
517                                                                var tab = gBrowser.selectedTab;
518                                                                if(tab){
519                                                                        tab.setAttribute("Wired-Marker:oid",id);
520                                                                        tab.setAttribute("Wired-Marker:pfid",pfid);
521                                                                        tab.setAttribute("Wired-Marker:dbtype",dbtype);
522                                                                        tab.setAttribute("Wired-Marker:style",style);
523                                                                        if(source) tab.setAttribute("Wired-Marker:source",source);
524                                                                }
525                                                                return;
526                                                        }
527                                                }
528                                        }
529                                }
530                        }
531                        var rtn = false;
532                        if(source){
533                                rtn = this.doTopElement(source,style,oid,dbtype);
534                        }else{
535                                rtn = this.doTopElementIMG(oid,dbtype)
536                        }
537//bitsObjectMng._dump("pageshow():rtn=["+rtn+"]");
538                        if(rtn){
539                                tab.removeAttribute("Wired-Marker:oid");
540                                tab.removeAttribute("Wired-Marker:pfid");
541                                tab.removeAttribute("Wired-Marker:source");
542                                tab.removeAttribute("Wired-Marker:dbtype");
543                                tab.removeAttribute("Wired-Marker:style");
544                                var self = this;
545                                setTimeout(function(){
546                                        if(source){
547                                                rtn = self.doTopElement(source,style,oid,dbtype);
548                                        }else{
549                                                rtn = self.doTopElementIMG(oid,dbtype)
550                                        }
551                                },2000);
552                        }
553                },
554
555/////////////////////////////////////////////////////////////////////
556                loadFromObject : function(aObject, tabbed){
557                        var doc = gBrowser.contentDocument;
558                        var source;
559                        if(!aObject.oid_type.match(/^image\/(.+)$/)) source = bitsMarker.id_key+aObject.dbtype+aObject.oid;
560                        var id = aObject.oid;
561                        var pfid = aObject.pfid;
562                        var style = aObject.fid_style;
563                        var cur_uri = this.getURLStringFromDocument(doc);
564                        var res_uri = aObject.doc_url;
565                        var dbtype = aObject.dbtype;
566                        var location_hash = "";
567                        var logical_page = "";
568                        var physical_page = "";
569                        if(aObject && aObject.oid_property){
570                                try{
571                                        var parser = new DOMParser();
572                                        var xmldoc = parser.parseFromString(aObject.oid_property,"text/xml");
573                                        parser = undefined;
574                                        if(xmldoc){
575                                                var xmlnode = xmldoc.getElementsByTagName("LOCATION_HASH")[0];
576                                                if(xmlnode) location_hash = xmlnode.textContent;
577                                                if(aObject.oid_type.match(/^application\/pdf$/)){
578                                                        var xmlnode = xmldoc.getElementsByTagName("LOGICAL_PAGE")[0];
579                                                        if(xmlnode) logical_page = xmlnode.textContent;
580                                                        var xmlnode = xmldoc.getElementsByTagName("PHYSICAL_PAGE")[0];
581                                                        if(xmlnode) physical_page = xmlnode.textContent;
582                                                }
583                                                xmldoc = undefined;
584                                        }
585                                }catch(e){
586                                        location_hash = "";
587                                }
588                        }
589                        var loadFlag = false;
590                        if(tabbed) loadFlag = tabbed;
591                        if(!tabbed){
592                                if(gBrowser.browsers.length == 1 && res_uri != "" && cur_uri != res_uri){
593                                        loadFlag = true;
594                                }else if(cur_uri == res_uri){
595                                        loadFlag = false;
596                                        if(location_hash) doc.location.hash = location_hash;
597                                }else{
598                                        loadFlag = true;
599                                        var i;
600                                        for(i=0;i<gBrowser.browsers.length;i++){
601                                                var doc = gBrowser.browsers[i].contentDocument;
602                                                var cur_uri = bitsAutocacheService.convertCacheURLToOriginalURL(this.getURLStringFromDocument(doc));
603                                                if(cur_uri == res_uri){
604                                                        loadFlag = false;
605                                                        gBrowser.tabContainer.selectedIndex = i;
606                                                        if(location_hash) doc.location.hash = location_hash;
607                                                        break;
608                                                }
609                                        }
610                                }
611                        }
612                        var pdf_hash = "";
613                        if(aObject.oid_type.match(/^application\/pdf$/)){
614                                if(logical_page != "" || physical_page != "") pdf_hash = "page="+logical_page; //+'&search="'+aObject.oid_title+'"';
615                                if(!loadFlag && pdf_hash != ""){
616                                        var doc = gBrowser.contentDocument;
617                                        doc.location.hash = pdf_hash;
618                                        gBrowser.reload(true);
619                                        return;
620                                }
621                        }
622                        var source_elem = this.getElementById(source);
623//bitsObjectMng._dump("loadFromObject(1):loadFlag=["+loadFlag+"]");
624//bitsObjectMng._dump("loadFromObject(1):source_elem=["+source_elem+"]");
625                        if(loadFlag){
626                                if(location_hash){
627                                        res_uri += "#" + location_hash;
628                                }else if(pdf_hash){
629                                        res_uri += "#" + pdf_hash;
630                                }
631                                var tab = this.loadURL(res_uri,tabbed);
632                                if(tab){
633                                        tab.setAttribute("Wired-Marker:oid",id);
634                                        tab.setAttribute("Wired-Marker:pfid",pfid);
635                                        tab.setAttribute("Wired-Marker:dbtype",dbtype);
636                                        tab.setAttribute("Wired-Marker:style",style);
637                                        if(source) tab.setAttribute("Wired-Marker:source",source);
638                                }
639                                return;
640                        }
641                        var rtn = false;
642                        if(!source_elem){
643                                if(source && source != ""){
644                                        rtn = this.doTopElement(source,style,id,dbtype);
645                                }else{
646                                        rtn = this.doTopElementIMG(id,dbtype);
647                                }
648                        }
649//bitsObjectMng._dump("loadFromObject(1):rtn=["+rtn+"]");
650                        if(!rtn){
651                                try{
652                                        if(aObject){
653                                                if(aObject.doc_url != aObject.con_url && aObject.doc_url == bitsAutocacheService.convertCacheURLToOriginalURL(this.getURLStringFromDocument(doc))){
654                                                        var frame_name;
655                                                        var frame_id;
656                                                        var xmldoc;
657                                                        var parser = new DOMParser();
658                                                        if(aObject.oid_property) xmldoc = parser.parseFromString(aObject.oid_property,"text/xml");
659                                                        parser = undefined;
660                                                        if(xmldoc){
661                                                                try{
662                                                                        var xmlnode = xmldoc.getElementsByTagName("FRAME_NAME")[0];
663                                                                        if(xmlnode) frame_name = xmlnode.textContent;
664                                                                        var xmlnode = xmldoc.getElementsByTagName("FRAME_ID")[0];
665                                                                        if(xmlnode) frame_id = xmlnode.textContent;
666                                                                }catch(e){}
667                                                        }
668//bitsObjectMng._dump("loadFromObject():frame_name=["+frame_name+"]");
669//bitsObjectMng._dump("loadFromObject():frame_id=["+frame_id+"]");
670                                                        if(frame_name){
671                                                                var win = doc.defaultView;
672                                                                if(win.frames != null){
673                                                                        var loadFlag = false;
674                                                                        var i;
675                                                                        for(i=0;i<win.frames.length;i++){
676                                                                                if(win.frames[i].name != frame_name) continue;
677                                                                                if(bitsAutocacheService.convertCacheURLToOriginalURL(this.getURLStringFromDocument(win.frames[i].document)) == aObject.con_url) break;
678                                                                                win.frames[i].document.location = aObject.con_url;
679                                                                                loadFlag = true;
680                                                                                break;
681                                                                        }
682//bitsObjectMng._dump("loadFromObject(2):loadFlag=["+loadFlag+"]");
683                                                                        if(!loadFlag && frame_id){
684                                                                                var nodes = bitsObjectMng.XPath.evaluate('//*[@id="'+frame_id+'"]',doc);
685//bitsObjectMng._dump("loadFromObject(2):nodes=["+nodes+"]["+(nodes?nodes.snapshotLength:0)+"]");
686                                                                                if(nodes && nodes.snapshotLength == 1){
687                                                                                        frame_name = nodes.snapshotItem(0).name;
688//bitsObjectMng._dump("loadFromObject():frame_name=["+frame_name+"]");
689                                                                                        for(i=0;i<win.frames.length;i++){
690//bitsObjectMng._dump("loadFromObject():win.frames["+i+"].name=["+win.frames[i].name+"]");
691                                                                                                if(win.frames[i].name != frame_name) continue;
692                                                                                                if(bitsAutocacheService.convertCacheURLToOriginalURL(this.getURLStringFromDocument(win.frames[i].document)) == aObject.con_url) break;
693                                                                                                win.frames[i].document.location = aObject.con_url;
694                                                                                                loadFlag = true;
695                                                                                                break;
696                                                                                        }
697                                                                                }
698                                                                        }
699//bitsObjectMng._dump("loadFromObject(3):loadFlag=["+loadFlag+"]");
700                                                                        if(loadFlag){
701                                                                                var tab = gBrowser.selectedTab;
702                                                                                if(tab){
703                                                                                        tab.setAttribute("Wired-Marker:oid",id);
704                                                                                        tab.setAttribute("Wired-Marker:pfid",pfid);
705                                                                                        tab.setAttribute("Wired-Marker:dbtype",dbtype);
706                                                                                        tab.setAttribute("Wired-Marker:style",style);
707                                                                                        if(source) tab.setAttribute("Wired-Marker:source",source);
708                                                                                }
709                                                                                return;
710                                                                        }
711                                                                }
712                                                        }
713                                                }
714                                        }
715                                }catch(e){}
716                                if(source && source != ""){
717                                        this.doTopElement(source,style,id,dbtype);
718                                }else{
719                                        this.doTopElementIMG(id,dbtype);
720                                }
721                        }
722                },
723
724/////////////////////////////////////////////////////////////////////
725                loadURL : function(aURL, tabbed){
726                        var win = this.WINDOW.getMostRecentWindow("navigator:browser");
727                        var browser = win.document.getElementById("content");
728                        if(tabbed) browser.selectedTab = browser.addTab('about:blank');
729                        browser.loadURI(aURL);
730                        return browser.selectedTab;
731                },
732
733/////////////////////////////////////////////////////////////////////
734                getTimeStamp : function(advance){
735                        var dd = new Date;
736                        if(advance) dd.setTime(dd.getTime() + 100000 * advance);
737                        var y = dd.getFullYear();
738                        var m = dd.getMonth() + 1; if(m < 10) m = "0" + m;
739                        var d = dd.getDate();      if(d < 10) d = "0" + d;
740                        var h = dd.getHours();     if(h < 10) h = "0" + h;
741                        var i = dd.getMinutes();   if(i < 10) i = "0" + i;
742                        var s = dd.getSeconds();   if(s < 10) s = "0" + s;
743                        return y.toString() + m.toString() + d.toString() + h.toString() + i.toString() + s.toString();
744                },
745
746/////////////////////////////////////////////////////////////////////
747                getFormatDate : function(){
748                        var dd = new Date;
749                        var y = dd.getFullYear();
750                        var m = dd.getMonth() + 1; if(m < 10) m = "0" + m;
751                        var d = dd.getDate();      if(d < 10) d = "0" + d;
752                        var h = dd.getHours();     if(h < 10) h = "0" + h;
753                        var i = dd.getMinutes();   if(i < 10) i = "0" + i;
754                        var s = dd.getSeconds();   if(s < 10) s = "0" + s;
755                        return  m.toString() + "/" + d.toString() + "/" + y.toString() + " " + h.toString() + ":" + i.toString() + ":" + s.toString();
756                },
757
758/////////////////////////////////////////////////////////////////////
759                formatFileSize : function(aBytes){
760                        if(aBytes > 1000 * 1000){
761                                return this.divideBy100( Math.round( aBytes / 1024 / 1024 * 100 ) ) + " MB";
762                        }else if( aBytes == 0 ){
763                                return "0 KB";
764                        }else{
765                                var kbytes = Math.round( aBytes / 1024 );
766                                return (kbytes == 0 ? 1 : kbytes) + " KB";
767                        }
768                },
769
770/////////////////////////////////////////////////////////////////////
771                divideBy100 : function(aInt){
772                        if(aInt % 100 == 0){
773                                return aInt / 100 + ".00";
774                        }else if(aInt % 10 == 0){
775                                return aInt / 100 + "0";
776                        }else{
777                                return aInt / 100;
778                        }
779                },
780
781/////////////////////////////////////////////////////////////////////
782                getRootHref : function(aURLSpec){
783                        var url = Components.classes['@mozilla.org/network/standard-url;1'].createInstance(Components.interfaces.nsIURL);
784                        url.spec = aURLSpec;
785                        return url.scheme + "://" + url.host + "/";
786                },
787
788/////////////////////////////////////////////////////////////////////
789                getBaseHref : function(sURI){
790                        try{
791                                var pos, base;
792                                base = ((pos = sURI.indexOf("?"))     != -1) ? sURI.substring(0, pos)   : sURI;
793                                base = ((pos = base.indexOf("#"))     != -1) ? base.substring(0, pos)   : base;
794                                base = ((pos = base.lastIndexOf("/")) != -1) ? base.substring(0, ++pos) : base;
795                                return base;
796                        }catch(e){
797                                bitsObjectMng._dump(bitsObjectMng.Common.getBaseHref.caller);
798                                throw new Error("bitsObjectMng.Common.getBaseHref():"+e);
799                        }
800                },
801
802/////////////////////////////////////////////////////////////////////
803                getFileName : function(aURI){
804                        var pos, name;
805                        name = ((pos = aURI.indexOf("?"))     != -1) ? aURI.substring(0, pos) : aURI;
806                        name = ((pos = name.indexOf("#"))     != -1) ? name.substring(0, pos) : name;
807                        name = ((pos = name.lastIndexOf("/")) != -1) ? name.substring(++pos)  : name;
808                        return name;
809                },
810
811/////////////////////////////////////////////////////////////////////
812                getFilesize : function(aFile){
813                        if(!aFile) return 0;
814                        if(aFile.isDirectory()){
815                                var size = 0;
816                                var entries = aFile.directoryEntries;
817                                while(entries.hasMoreElements()){
818                                        var entry = entries.getNext().QueryInterface(Components.interfaces.nsILocalFile);
819                                        if(!entry.isDirectory()){
820                                                size += this.getFilesize(entry);
821                                        }else if(entry.isDirectory() && !entry.leafName.match(/^\./)){
822                                                size += this.getFilesize(entry);
823                                        }
824                                }
825                                return size;
826                        }else{
827                                return aFile.fileSize;
828                        }
829                },
830
831/////////////////////////////////////////////////////////////////////
832                hasDirChilds : function(aDir){
833                        if(!aDir) return 0;
834                        if(aDir.isDirectory()){
835                                var size = 0;
836                                var entries = aDir.directoryEntries;
837                                while(entries.hasMoreElements()){
838                                        var entry = entries.getNext().QueryInterface(Components.interfaces.nsILocalFile);
839                                        if(!entry.isDirectory()){
840                                                return true;
841                                        }else if(entry.isDirectory() && !entry.leafName.match(/^\./)){
842                                                return true;
843                                        }
844                                }
845                                return false;
846                        }else{
847                                return true;
848                        }
849                },
850
851/////////////////////////////////////////////////////////////////////
852                copyDirChilds : function(aSrcDir,aDistDir){
853                        try{
854                                if(!aSrcDir || !aDistDir || !aSrcDir.exists()) return false;
855                                if(!aDistDir.exists()) aDistDir.create(aDistDir.DIRECTORY_TYPE, 0777);
856                                if(aSrcDir.isDirectory()){
857                                        var size = 0;
858                                        var entries = aSrcDir.directoryEntries;
859                                        while(entries.hasMoreElements()){
860                                                var entry = entries.getNext().QueryInterface(Components.interfaces.nsILocalFile);
861                                                if(!entry.isDirectory()){
862                                                        var target = aDistDir.clone();
863                                                        target.append(entry.leafName);
864                                                        if(target.exists()) target.remove(true);
865                                                        try{
866                                                                var istream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
867                                                                istream.init(entry, -1, -1, false);
868                                                                var bstream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);
869                                                                bstream.setInputStream(istream);
870                                                                var bytes = bstream.readBytes(bstream.available());
871                                                                var stream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
872                                                                stream.init(target, 0x04 | 0x08 | 0x20, 664, 0); // write, create, truncate
873                                                                stream.write(bytes, bytes.length);
874                                                                if(stream instanceof Components.interfaces.nsISafeOutputStream){
875                                                                        stream.finish();
876                                                                }else{
877                                                                        stream.close();
878                                                                }
879                                                        }catch(e){
880                                                                bitsObjectMng._dump("bitsObjectMng.Common.copyDirChilds():entry=["+entry.path+"]");
881                                                                bitsObjectMng._dump("bitsObjectMng.Common.copyDirChilds():target=["+target.path+"]["+ target.path.length +"]");
882                                                                bitsObjectMng._dump("bitsObjectMng.Common.copyDirChilds():"+e);
883                                                        }
884                                                }else if(entry.isDirectory() && !entry.leafName.match(/^\./)){
885                                                        var cloneDir = aDistDir.clone();
886                                                        cloneDir.append(entry.leafName);
887                                                        if(!this.copyDirChilds(entry.clone(),cloneDir)) return false;
888                                                }
889                                        }
890                                }else{
891                                        aSrcDir.copyTo(aDistDir,aSrcDir.leafName);
892                                }
893                                return true;
894                        }catch(e){
895                                throw new Error("bitsObjectMng.Common.copyDirChilds():"+e);
896                                return false;
897                        }
898                },
899
900/////////////////////////////////////////////////////////////////////
901                splitFileName : function(aFileName){
902                        var pos = aFileName.lastIndexOf(".");
903                        var ret = [];
904                        if(pos != -1){
905                                ret[0] = aFileName.substring(0, pos);
906                                ret[1] = aFileName.substring(pos + 1, aFileName.length);
907                        }else{
908                                ret[0] = aFileName;
909                                ret[1] = "";
910                        }
911                        return ret;
912                },
913
914/////////////////////////////////////////////////////////////////////
915                validateFileName : function(aFileName){
916                        aFileName = aFileName.replace(/[\"\?!~`]+/g, "");
917                        aFileName = aFileName.replace(/[\*\&]+/g, "+");
918                        aFileName = aFileName.replace(/[\\\/\|\:;]+/g, "-");
919                        aFileName = aFileName.replace(/[\<]+/g, "(");
920                        aFileName = aFileName.replace(/[\>]+/g, ")");
921                        aFileName = aFileName.replace(/[\s]+/g, "_");
922                        aFileName = aFileName.replace(/[%]+/g, "@");
923                        return aFileName;
924                },
925
926/////////////////////////////////////////////////////////////////////
927                resolveURL : function(aBaseURL, aRelURL){
928                        try{
929                                var baseURLObj = this.convertURLToObject(aBaseURL);
930                                return baseURLObj.resolve(aRelURL);
931                        }catch(ex){
932                                bitsObjectMng._dump("ObjectManagement ERROR: Failed to resolve URL.[" + aBaseURL + "][" + aRelURL + "]");
933                                return aRelURL;
934                        }
935                },
936
937/////////////////////////////////////////////////////////////////////
938                crop : function(aString, aMaxLength){
939                        return aString.length > aMaxLength ? aString.substring(0, aMaxLength) + "..." : aString;
940                },
941
942/////////////////////////////////////////////////////////////////////
943                readFile : function(aFile){
944                        try{
945                                var istream = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
946                                istream.init(aFile, 1, 0, false);
947                                var sstream = Components.classes['@mozilla.org/scriptableinputstream;1'].createInstance(Components.interfaces.nsIScriptableInputStream);
948                                sstream.init(istream);
949                                var content = sstream.read(sstream.available());
950                                sstream.close();
951                                istream.close();
952                                return content;
953                        }catch(ex){
954                                bitsObjectMng._dump("ObjectManagement ERROR: readFile():" + ex);
955                                return false;
956                        }
957                },
958
959/////////////////////////////////////////////////////////////////////
960                writeFile : function(aFile, aContent, aChars){
961                        if(aFile.exists()) aFile.remove(false);
962                        try{
963                                aFile.create(aFile.NORMAL_FILE_TYPE, 0666);
964                                this.UNICODE.charset = aChars;
965                                aContent = this.UNICODE.ConvertFromUnicode(aContent);
966                                var ostream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
967                                ostream.init(aFile, 2, 0x200, false);
968                                ostream.write(aContent, aContent.length);
969                                ostream.close();
970                        }catch(ex){
971                                bitsObjectMng._dump("ObjectManagement ERROR: Failed to write file: " + aFile.path + "["+ ex + "]");
972                        }
973                },
974
975/////////////////////////////////////////////////////////////////////
976                writeIndexDat : function(aItem, aFile){
977                        if(!aFile){
978                                aFile = this.getContentDir(aItem.id).clone();
979                                aFile.append("index.dat");
980                        }
981                        var content = "";
982                        for(var prop in aItem){
983                                content += prop + "\t" + aItem[prop] + "\n";
984                        }
985                        this.writeFile(aFile, content, "UTF-8");
986                },
987
988/////////////////////////////////////////////////////////////////////
989                saveUriToFile : function(aURISpec, aFile){
990                        if(aFile.exists()) return;
991                        var uri = Components.classes['@mozilla.org/network/standard-url;1'].createInstance(Components.interfaces.nsIURL);
992                        uri.spec = aURISpec;
993                        var WBP = Components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1'].createInstance(Components.interfaces.nsIWebBrowserPersist);
994                        WBP.saveURI(uri, null, null, null, null, aFile);
995                },
996
997/////////////////////////////////////////////////////////////////////
998                saveDataUrlToFile : function(aDataURL, aFile){
999                        var io = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
1000                        var source = io.newURI(aDataURL, "UTF8", null);
1001                        var WBP = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(Components.interfaces.nsIWebBrowserPersist);
1002                        WBP.persistFlags = WBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES;
1003                        WBP.persistFlags |= WBP.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
1004                        var progressListener = {
1005                                onLocationChange : function(webProgress, request, location){},
1006                                onProgressChange : function(webProgress, request, curSelfProgress, maxSelfProgress, curTotalProgress, maxTotalProgress){},
1007                                onSecurityChange : function(webProgress, request, state){},
1008                                onStateChange    : function(webProgress, request, stateFlags, status){
1009                                        if((WBP.currentState & WBP.PERSIST_STATE_FINISHED)){
1010                                                if(aFile && aFile.exists()){
1011                                                }else if(status != 0){
1012                                                }
1013                                        }
1014                                },
1015                                onStatusChange   : function(webProgress, request, status, message){},
1016                        };
1017                        WBP.progressListener = progressListener;
1018                        WBP.saveURI(source, null, null, null, null, aFile);
1019                },
1020
1021/////////////////////////////////////////////////////////////////////
1022                getImageFromURL : function(aUrl, aFile){
1023                        if(aUrl == undefined || aFile == undefined || aUrl == "") return false;
1024                        try{
1025                                var ioserv = this.IO;
1026                                var channel = ioserv.newChannel(aUrl, 0, null);
1027                                var stream = channel.open();
1028                                if(channel instanceof Components.interfaces.nsIHttpChannel && channel.responseStatus >= 300 && channel.responseStatus <= 302){
1029                                        var Location = channel.getResponseHeader("Location");
1030                                        channel = ioserv.newChannel(Location, 0, null);
1031                                        stream = channel.open();
1032                                }
1033                                if(channel instanceof Components.interfaces.nsIHttpChannel && (channel.responseStatus != 200 || !channel.contentType.match(/^image\//))){
1034                                        if(aFile.exists()) aFile.remove(true);
1035                                        return false;
1036                                }else if(!(channel instanceof Components.interfaces.nsIHttpChannel)){
1037                                        return false;
1038                                }
1039                                var bistream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);
1040                                bistream.setInputStream(stream);
1041                                if(!aFile.exists()) aFile.create(aFile.NORMAL_FILE_TYPE, 0664);
1042                                var ostream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
1043                                ostream.init(aFile, 0x04 | 0x08 | 0x20, 664, 0); // write, create, truncate
1044                                var bostream = Components.classes["@mozilla.org/binaryoutputstream;1"].createInstance(Components.interfaces.nsIBinaryOutputStream);
1045                                bostream.setOutputStream(ostream);
1046                                var size = 0;
1047                                while(size = bistream.available()){
1048                                        bostream.writeBytes(bistream.readBytes(size), size);
1049                                }
1050                                ostream.close();
1051                                return true;
1052                        }catch(e){
1053                                bitsObjectMng._dump("bitsObjectMng.Database.getImageFromURL():aUrl=["+aUrl+"]");
1054                                bitsObjectMng._dump("bitsObjectMng.Database.getImageFromURL():"+e);
1055                                return false;
1056                        }
1057                },
1058
1059/////////////////////////////////////////////////////////////////////
1060                convertFormUnicode : function(aString, aCharset){
1061                        if(!aString) return "";
1062                        try{
1063                                this.UNICODE.charset = aCharset;
1064                                aString = this.UNICODE.ConvertFromUnicode(aString);
1065                        }catch(ex){}
1066                        return aString;
1067                },
1068
1069/////////////////////////////////////////////////////////////////////
1070                convertToUnicode : function(aString, aCharset){
1071                        if(!aString) return "";
1072                        try{
1073                                this.UNICODE.charset = aCharset;
1074                                aString = this.UNICODE.ConvertToUnicode(aString);
1075                        }catch(ex){}
1076                        return aString;
1077                },
1078
1079/////////////////////////////////////////////////////////////////////
1080                exceptCode : function(aString,rString){
1081                        if(rString == undefined) rString = " ";
1082                        var replaceString = new String(aString);
1083                        replaceString = replaceString.replace(/[\cA\cB\cC\cD\cE\cF\cG\cH\cI\cJ\cK\cL\cM\cN\cO\cP\cQ\cR\cS\cT\cU\cV\cW\cX\cY\cZ\c[\c\\\c]\c^\c_]/mg,rString);
1084                        replaceString = replaceString.replace(/[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f]/mg,rString);
1085                        replaceString = replaceString.replace(/[\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]/mg,rString);
1086                        replaceString = replaceString.replace(/[\x7f]/mg,rString);
1087                        return replaceString;
1088                },
1089
1090/////////////////////////////////////////////////////////////////////
1091                convertPathToFile : function(aPath){
1092                        var aFile = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
1093                        aFile.initWithPath(aPath);
1094                        return aFile;
1095                },
1096
1097/////////////////////////////////////////////////////////////////////
1098                convertFilePathToURL : function(aFilePath){
1099                        var tmpFile = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
1100                        tmpFile.initWithPath(aFilePath);
1101                        return this.IO.newFileURI(tmpFile).spec;
1102                },
1103
1104/////////////////////////////////////////////////////////////////////
1105                convertURLToObject : function(aURLString){
1106                        var aURI = Components.classes['@mozilla.org/network/standard-url;1'].createInstance(Components.interfaces.nsIURI);
1107                        aURI.spec = aURLString;
1108                        return aURI;
1109                },
1110
1111/////////////////////////////////////////////////////////////////////
1112                convertURLToFile : function(aURLString){
1113                        var aURL = this.convertURLToObject(aURLString);
1114                        if(!aURL.schemeIs("file")) return undefined;
1115                        try{
1116                                var fileHandler = this.IO.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
1117                                return fileHandler.getFileFromURLSpec(aURLString);
1118                        }catch(ex){
1119                                return undefined;
1120                        }
1121                },
1122
1123/////////////////////////////////////////////////////////////////////
1124                getURLStringFromDocument : function(aDocument){
1125                        if(!aDocument || !aDocument.location) return "";
1126                        var location = aDocument.location;
1127                        try{
1128                                return location.protocol + "//" + location.host +location.pathname + location.search;
1129                        }catch(ex){
1130                                return location.href;
1131                        }
1132                },
1133
1134/////////////////////////////////////////////////////////////////////
1135                getURLHashStringFromDocument : function(aDocument){
1136                        if(!aDocument || !aDocument.location) return "";
1137                        var location = aDocument.location;
1138                        try{
1139                                var hash = location.toString();
1140                                var hash_index = hash.indexOf("#");
1141                                if(hash_index>=0){
1142                                        return hash.substr(hash_index).replace(/#hyperanchor.*$/g,"").replace(/^#/,"");
1143                                }else{
1144                                        return "";
1145                                }
1146                        }catch(ex){
1147                                return "";
1148                        }
1149                },
1150
1151/////////////////////////////////////////////////////////////////////
1152                getChromeImageURI : function(aURI){
1153                        try{
1154                                var channel = this.IO.newChannelFromURI(aURI);
1155                                var stream  = channel.open();
1156                                var bstream = Components.classes['@mozilla.org/binaryinputstream;1'].createInstance(Components.interfaces.nsIBinaryInputStream);
1157                                bstream.setInputStream(stream);
1158                                var len = stream.available();
1159                                var bytes = bstream.readByteArray(len);
1160                                bstream.close();
1161                                stream.close();
1162                                var mime = this.MIME.getTypeFromURI(aURI);
1163                                var images = String.fromCharCode.apply(String, bytes);
1164                                var image_b64 = btoa(images);
1165                                var dataUri = 'data:' + mime +';base64,' + image_b64;
1166                                return dataUri;
1167                        }catch(e){
1168                                bitsObjectMng._dump("bitsObjectMng.Common.getChromeImageURI():"+e);
1169                        }
1170                  return null;
1171                },
1172
1173/////////////////////////////////////////////////////////////////////
1174                getFocusedWindow : function(){
1175                        var win = document.commandDispatcher.focusedWindow;
1176                        if(!win || win == window || win instanceof Components.interfaces.nsIDOMChromeWindow) win = window._content;
1177                        return win;
1178                },
1179
1180/////////////////////////////////////////////////////////////////////
1181                getDefaultIcon : function(type){
1182                        switch(type){
1183                                case "folder" : return "chrome://objectmng/skin/treefolder.png"; break;
1184                                default       : return "chrome://objectmng/skin/treeitem.png";   break;
1185                        }
1186                },
1187
1188/////////////////////////////////////////////////////////////////////
1189                getBoolPref : function(aName, aDefVal){
1190                        try{
1191                                return this.PREF.getBoolPref(aName);
1192                        }catch(ex){
1193                                return aDefVal;
1194                        }
1195                },
1196
1197/////////////////////////////////////////////////////////////////////
1198                getElementStyle : function(elem){
1199                        var style = {};
1200                        if(elem){
1201                                var resource_exp = new RegExp("^resource:");
1202                                var rules = Components.classes["@mozilla.org/inspector/dom-utils;1"].getService(Components.interfaces["inIDOMUtils"]).getCSSStyleRules(elem);
1203                                var i;
1204                                var j;
1205                                var propertyName;
1206                                var priority;
1207                                var value;
1208                                for(i=0;i<rules.Count();i++) {
1209                                        var rule = rules.GetElementAt(i);
1210                                        if(rule instanceof CSSStyleRule && (!rule.parentStyleSheet.href || !resource_exp.test(rule.parentStyleSheet.href))){
1211                                                for(j=0;j<rule.style.length;j++){
1212                                                        propertyName = rule.style.item(j);
1213                                                        if(propertyName == '') continue;
1214                                                        priority = rule.style.getPropertyPriority(propertyName);
1215                                                        value = rule.style.getPropertyValue(propertyName);
1216                                                        if(!style[propertyName] || !style[propertyName].priority){
1217                                                                style[propertyName] = {};
1218                                                                style[propertyName].value = value;
1219                                                                style[propertyName].priority = priority;
1220                                                        }
1221                                                }
1222                                        }
1223                                }
1224                                if(elem.style){
1225                                        for(j=0;j<elem.style.length;j++){
1226                                                propertyName = elem.style.item(j);
1227                                                if(propertyName == '') continue;
1228                                                priority = elem.style.getPropertyPriority(propertyName);
1229                                                value = elem.style.getPropertyValue(propertyName);
1230                                                if(!style[propertyName] || !style[propertyName].priority){
1231                                                        style[propertyName] = {};
1232                                                        style[propertyName].value = value;
1233                                                        style[propertyName].priority = priority;
1234                                                }
1235                                        }
1236                                }
1237                        }
1238                        return style;
1239                },
1240
1241/////////////////////////////////////////////////////////////////////
1242                getPageOffsetTop : function(elem){
1243                        if(!elem) return 0;
1244                        var top = elem.offsetTop;
1245                        var tempElem;
1246                        var offsetHeight;
1247                        var scrollHeight;
1248                        var style;
1249                        var scrollTop;
1250                        while(elem && elem.offsetParent != null){
1251                                if(elem && elem.parentNode && elem.offsetParent != elem.parentNode){
1252                                        tempElem = elem;
1253                                        while(tempElem && tempElem.parentNode && elem.offsetParent != tempElem.parentNode){
1254                                                offsetHeight = tempElem.parentNode.offsetHeight;
1255                                                scrollHeight = tempElem.parentNode.scrollHeight;
1256                                                if(offsetHeight != scrollHeight){
1257                                                        style = this.getElementStyle(tempElem.parentNode);
1258                                                        if(!style['height']) offsetHeight = scrollHeight;
1259                                                }
1260                                                if(offsetHeight != scrollHeight){
1261                                                        scrollTop = elem.offsetTop - tempElem.parentNode.offsetTop;
1262                                                        if(scrollTop>15) scrollTop -= 15;
1263                                                        if(scrollTop>0){
1264                                                                tempElem.parentNode.scrollTop = scrollTop;
1265                                                                if(tempElem.parentNode.scrollTop>0) top = tempElem.parentNode.offsetTop;
1266                                                        }
1267                                                        elem = tempElem.parentNode;
1268                                                        break;
1269                                                }
1270                                                tempElem = tempElem.parentNode;
1271                                        }
1272                                }
1273                                if(elem.offsetParent.offsetHeight != elem.offsetParent.scrollHeight) elem.offsetParent.scrollTop = top - (top>15?15:0);
1274                                elem = elem.offsetParent;
1275                                if(elem) top += elem.offsetTop;
1276                        }
1277                        return top;
1278                },
1279
1280/////////////////////////////////////////////////////////////////////
1281                addPrefListener : function(aObserver){
1282                        try{
1283                                var pbi = Components.classes['@mozilla.org/preferences;1'].getService(Components.interfaces.nsIPrefBranchInternal);
1284                                pbi.addObserver(aObserver.domain, aObserver, false);
1285                        }catch(e){}
1286                },
1287
1288/////////////////////////////////////////////////////////////////////
1289                removePrefListener : function(aObserver){
1290                        try{
1291                                var pbi = Components.classes['@mozilla.org/preferences;1'].getService(Components.interfaces.nsIPrefBranchInternal);
1292                                pbi.removeObserver(aObserver.domain, aObserver);
1293                        }catch(e){}
1294                },
1295
1296/////////////////////////////////////////////////////////////////////
1297                escapeComment : function(aStr){
1298                        if(aStr.length > 10000) this.alert("NOTICE: Too long comment makes ObjectManagement slow.");
1299                        return aStr.replace(/\r|\n|\t/g, " __BR__ ");
1300                },
1301
1302/////////////////////////////////////////////////////////////////////
1303                openManageWindow : function(aRes, aModEltID){
1304                        window.openDialog("chrome://objectmng/content/manage.xul", "ObjectManagement:Manage", "chrome,centerscreen,all,resizable,dialog=no", aRes, aModEltID);
1305                },
1306
1307/////////////////////////////////////////////////////////////////////
1308                rangeCompareNode : function(aRange, aNode){
1309                        if(!aRange || !aNode || !aRange.compareBoundryPoints) return -1;
1310                        var nodeRange = aNode.ownerDocument.createRange();
1311                        try{
1312                                nodeRange.selectNode(aNode);
1313                        }catch(e){
1314                                nodeRange.selectNodeContents(aNode);
1315                        }
1316                        var nodeIsBefore = aRange.compareBoundryPoints(Range.START_TO_START, nodeRange) == 1;
1317                        var nodeIsAfter = aRange.compareBoundryPoints(Range.END_TO_END, nodeRange) == -1;
1318
1319                        if(nodeIsBefore && !nodeIsAfter) return 0;
1320                        if(!nodeIsBefore && nodeIsAfter) return 1;
1321                        if(nodeIsBefore && nodeIsAfter)  return 2;
1322                        return 3;
1323                },
1324
1325/////////////////////////////////////////////////////////////////////
1326                rangeIntersectsNode : function(aRange, aNode){
1327                        if(!aRange || !aNode || !aRange.compareBoundryPoints) return false;
1328                        var nodeRange = aNode.ownerDocument.createRange();
1329                        try{
1330                                nodeRange.selectNode(aNode);
1331                        }catch(e){
1332                                nodeRange.selectNodeContents(aNode);
1333                        }
1334                        return aRange.compareBoundaryPoints(Range.END_TO_START, nodeRange) == -1 && aRange.compareBoundaryPoints(Range.START_TO_END, nodeRange) == 1;
1335                },
1336
1337/////////////////////////////////////////////////////////////////////
1338                getHostName: function(){
1339                        var DNSService=this.DNS;
1340                        return DNSService.myHostName;
1341                },
1342
1343/////////////////////////////////////////////////////////////////////
1344                getIPAddress: function(){
1345                        try{
1346                                var DNSService=this.DNS;
1347                                var DNSRecord=DNSService.resolve(DNSService.myHostName, true);
1348                                var allIP = [];
1349                                var i;
1350                                for(i=0;DNSRecord.hasMore();i++) allIP[i]=DNSRecord.getNextAddrAsString();
1351                                return (allIP.length>0?allIP:undefined);
1352                        }catch(e){
1353                                bitsObjectMng._dump("bitsObjectMng.Common.getIPAddress():"+e);
1354                                return undefined;
1355                        }
1356                },
1357        },
1358
1359/////////////////////////////////////////////////////////////////////
1360/////////////////////////////////////////////////////////////////////
1361        DataSource : {
1362                initflag : false,
1363                inittime : "",
1364                data : null,
1365                file : null,
1366                unshifting : false,
1367                ABOUT_ROOT : "urn:wiredmarker:root",
1368                ABOUT_ITEM : "urn:wiredmarker:item",
1369                id2about : {},
1370
1371/////////////////////////////////////////////////////////////////////
1372                get filename(){
1373                        if(this.inittime == "") this.inittime = bitsObjectMng.Common.getTimeStamp();
1374                        return "wiredmarker_"+this.inittime+".rdf";
1375                },
1376/////////////////////////////////////////////////////////////////////
1377                init : function(aQuietWarning){
1378                        if(this.initflag) return;
1379                        this.initflag = true;
1380                        try{
1381                                this.file = bitsObjectMng.Common.getExtensionDir().clone();
1382                                this.file.append(this.filename);
1383                                if(!this.file.exists()){
1384                                        this.initRdf();
1385                                }else{
1386                                        this.data = null;
1387                                        var fileURL = bitsObjectMng.Common.IO.newFileURI(this.file).spec;
1388                                        this.data = bitsObjectMng.Common.RDF.GetDataSourceBlocking(fileURL);
1389                                }
1390                        }catch(e){
1391                                if(!aQuietWarning) bitsObjectMng._dump("ObjectManagement ERROR: Failed to initialize datasource.\n\n" + e);
1392                                this.initflag = false;
1393                        }
1394                        this.unshifting = bitsObjectMng.Common.getBoolPref("objectmng.tree.unshift", false);
1395                },
1396
1397               
1398/////////////////////////////////////////////////////////////////////
1399                done : function(){
1400                        if(this.file.exists()) this.file.remove(true);
1401                        this.initflag = false;
1402                },
1403
1404/////////////////////////////////////////////////////////////////////
1405                initRdf : function(){
1406                        try{
1407                                this.file = bitsObjectMng.Common.getExtensionDir().clone();
1408                                this.file.append(this.filename);
1409                                if(this.file.exists()) this.file.remove(true);
1410                                this.file.create(this.file.NORMAL_FILE_TYPE, 0666);
1411                                var content = '<?xml version="1.0"?>\n<RDF:RDF xmlns:NC="http://home.netscape.com/NC-rdf#" xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>\n';
1412                                bitsObjectMng.Common.writeFile(this.file,content,"UTF-8");
1413                                var fileURL = bitsObjectMng.Common.IO.newFileURI(this.file).spec;
1414                                this.data = bitsObjectMng.Common.RDF.GetDataSourceBlocking(fileURL);
1415                                this.createEmptySeq(this.ABOUT_ROOT);
1416                                this.flush();
1417                        }catch(e){
1418                                bitsObjectMng._dump("ObjectManagement ERROR: Failed to initialize datasource.(rdf)\n\n" + e);
1419                        }
1420                        this.unshifting = bitsObjectMng.Common.getBoolPref("objectmng.tree.unshift", false);
1421                },
1422
1423/////////////////////////////////////////////////////////////////////
1424                flush : function(){
1425                        this.data.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush();
1426                },
1427
1428/////////////////////////////////////////////////////////////////////
1429                refresh : function(){
1430                        this.data.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Refresh(true);
1431                },
1432
1433/////////////////////////////////////////////////////////////////////
1434                sanitize : function(aVal){
1435                        if(!aVal || typeof(aVal) != "string") return "";
1436                        return aVal.replace(/[\x00-\x1F\x7F]/g, " ");
1437                },
1438
1439/////////////////////////////////////////////////////////////////////
1440                validateURI : function(aURI){
1441                        if(aURI == this.ABOUT_ROOT || aURI.match(/^urn:wiredmarker:item\d{14}$/)){
1442                                return true;
1443                        }else{
1444                                return false;
1445                        }
1446                },
1447
1448/////////////////////////////////////////////////////////////////////
1449                addItem : function(aOMitem, aParName, aIdx, aMode){
1450                        var about = "";
1451                        if(aOMitem.about){
1452                                about = aOMitem.about;
1453                                delete aOMitem.about;
1454                        }else{
1455                                about = this.ABOUT_ITEM + aOMitem.id;
1456                        }
1457                        if(!this.validateURI(about)) return;
1458                        this.setID2About(aOMitem.id,aOMitem.pfid,about,aMode);
1459                        for(var key in aOMitem){
1460                                if(typeof(aOMitem[key]) == "string") aOMitem[key] = this.sanitize(aOMitem[key]);
1461                        }
1462                        try{
1463                                var cont = this.getContainer(aParName, false);
1464                                if(!cont){
1465                                        cont = this.getContainer(this.ABOUT_ROOT, false);
1466                                        aIdx = 0;
1467                                }
1468                                var newRes = bitsObjectMng.Common.RDF.GetResource(about);
1469                                for(var key in aOMitem){
1470                                        if(aOMitem[key] != undefined) this.data.Assert(newRes, bitsObjectMng.Common.RDF.GetResource(bitsObjectMng.NS_OBJECTMANAGEMENT + key), bitsObjectMng.Common.RDF.GetLiteral(aOMitem[key]), true);
1471                                }
1472                                if(this.unshifting && (aIdx == 0 || aIdx == -1)) aIdx = 1;
1473                                if(0 < aIdx && aIdx < cont.GetCount()){
1474                                        cont.InsertElementAt(newRes, aIdx, true);
1475                                }else{
1476                                        cont.AppendElement(newRes);
1477                                }
1478                                this.flush();
1479                                return newRes;
1480                        }catch(e){
1481                                bitsObjectMng._dump("ObjectManagement ERROR: Failed to add resource to datasource.\n\n" + e);
1482                                return null;
1483                        }
1484                },
1485
1486/////////////////////////////////////////////////////////////////////
1487                moveItem : function(curRes, curPar, tarPar, tarRelIdx){
1488                        try{
1489                                bitsObjectMng.Common.RDFC.Init(this.data, curPar);
1490                                bitsObjectMng.Common.RDFC.RemoveElement(curRes, true);
1491                        }catch(e){
1492                                bitsObjectMng._dump("ObjectManagement ERROR: Failed to move element at datasource (1).\n\n" + e);
1493                                return false;
1494                        }
1495                        if(this.unshifting){
1496                                if(tarRelIdx == 0 || tarRelIdx == -1) tarRelIdx = 1;
1497                        }
1498                        try{
1499                                bitsObjectMng.Common.RDFC.Init(this.data, tarPar);
1500                                if(tarRelIdx > 0){
1501                                        bitsObjectMng.Common.RDFC.InsertElementAt(curRes, tarRelIdx, true);
1502                                }else{
1503                                        bitsObjectMng.Common.RDFC.AppendElement(curRes);
1504                                }
1505                                return true;
1506                        }catch(e){
1507                                bitsObjectMng._dump("ObjectManagement ERROR: Failed to move element at datasource (2).\n\n" + e);
1508                                bitsObjectMng.Common.RDFC.Init(this.data, bitsObjectMng.Common.RDF.GetResource(this.ABOUT_ROOT));
1509                                bitsObjectMng.Common.RDFC.AppendElement(curRes, true);
1510                                return false;
1511                        }
1512                },
1513
1514/////////////////////////////////////////////////////////////////////
1515                createEmptySeq : function(aResName){
1516                        if(!this.validateURI(aResName)) return;
1517                        bitsObjectMng.Common.RDFCU.MakeSeq(this.data, bitsObjectMng.Common.RDF.GetResource(aResName));
1518                },
1519
1520/////////////////////////////////////////////////////////////////////
1521                deleteItem : function(aRes){
1522                        var aParRes = this.findParentResource(aRes);
1523                        return this.deleteItemDescending(aRes,aParRes);
1524                },
1525
1526/////////////////////////////////////////////////////////////////////
1527                deleteItemDescending : function(aRes, aParRes){
1528                        try{
1529                                bitsObjectMng.Common.RDFC.Init(this.data, aParRes);
1530                                bitsObjectMng.Common.RDFC.RemoveElement(aRes, true);
1531                                var rmIDs = [];
1532                                var addIDs = [];
1533                                var depth = 0;
1534                                do{
1535                                        addIDs = this.cleanUpIsolation();
1536                                        rmIDs = rmIDs.concat(addIDs);
1537                                }while(addIDs.length > 0 && ++depth < 100);
1538                                return rmIDs;
1539                        }catch(e){
1540                                bitsObjectMng._dump("bitsObjectMng.DataSource.deleteItemDescending():"+e);
1541                                return [];
1542                        }
1543                },
1544
1545/////////////////////////////////////////////////////////////////////
1546                cleanUpIsolation : function(){
1547                        var rmIDs = [];
1548                        try{
1549                                var resEnum = this.data.GetAllResources();
1550                                while(resEnum.hasMoreElements()){
1551                                        var aRes = resEnum.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
1552                                        if(aRes.Value != this.ABOUT_ROOT && !this.data.ArcLabelsIn(aRes).hasMoreElements()){
1553                                                rmIDs.push(this.removeResource(aRes));
1554                                        }
1555                                }
1556                        }catch(e){
1557                                bitsObjectMng._dump("ObjectManagement ERROR: Failed to clean up datasource.\n" + e);
1558                        }
1559                        return rmIDs;
1560                },
1561
1562/////////////////////////////////////////////////////////////////////
1563                removeResource : function(aRes){
1564                        var names = this.data.ArcLabelsOut(aRes);
1565                        var rmID = this.getProperty(aRes, "id");
1566                        while(names.hasMoreElements()){
1567                                try{
1568                                        var name  = names.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
1569                                        var value = this.data.GetTarget(aRes, name, true);
1570                                        this.data.Unassert(aRes, name, value);
1571                                }catch(e){}
1572                        }
1573                        return rmID;
1574                },
1575
1576/////////////////////////////////////////////////////////////////////
1577                getContainer : function(aResURI, force){
1578                        var cont = Components.classes['@mozilla.org/rdf/container;1'].createInstance(Components.interfaces.nsIRDFContainer);
1579                        try{
1580                                cont.Init(this.data, bitsObjectMng.Common.RDF.GetResource(aResURI));
1581                        }catch(e){
1582                                if(force){
1583                                        if(!this.validateURI(aResURI)) return null;
1584                                        return bitsObjectMng.Common.RDFCU.MakeSeq(this.data, bitsObjectMng.Common.RDF.GetResource(aResURI));
1585                                }else{
1586                                        return null;
1587                                }
1588                        }
1589                        return cont;
1590                },
1591
1592/////////////////////////////////////////////////////////////////////
1593                clearContainer : function(aResURI){
1594                        var cont = this.getContainer(aResURI, true);
1595                        while(cont.GetCount()){
1596                                cont.RemoveElementAt(1,true);
1597                        }
1598                },
1599
1600/////////////////////////////////////////////////////////////////////
1601                removeFromContainer : function(aResURI, aRes){
1602                        var cont = this.getContainer(aResURI, true);
1603                        if(cont) cont.RemoveElement(aRes, true);
1604                },
1605
1606/////////////////////////////////////////////////////////////////////
1607                getProperty : function(aRes, aProp){
1608                        try{
1609                                if(aRes.Value == this.ABOUT_ROOT) return "";
1610                                var retVal = this.data.GetTarget(aRes, bitsObjectMng.Common.RDF.GetResource(bitsObjectMng.NS_OBJECTMANAGEMENT + aProp), true);
1611                                return (retVal?retVal.QueryInterface(Components.interfaces.nsIRDFLiteral).Value:undefined);
1612                        }catch(e){
1613                                bitsObjectMng._dump("bitsObjectMng.DataSource.getProperty():"+bitsObjectMng.DataSource.getProperty.caller);
1614                                bitsObjectMng._dump("bitsObjectMng.DataSource.getProperty("+aRes+","+(aRes?aRes.Value:undefined)+","+aProp+"):["+e+"]");
1615                                return "";
1616                        }
1617                },
1618
1619/////////////////////////////////////////////////////////////////////
1620                setProperty : function(aRes, aProp, newVal){
1621                        try{
1622                                newVal = this.sanitize(newVal);
1623                                var aPropRes = bitsObjectMng.Common.RDF.GetResource(bitsObjectMng.NS_OBJECTMANAGEMENT + aProp);
1624                                var oldVal = this.data.GetTarget(aRes, aPropRes, true);
1625                                oldVal = oldVal.QueryInterface(Components.interfaces.nsIRDFLiteral);
1626                                newVal = bitsObjectMng.Common.RDF.GetLiteral(newVal);
1627                                this.data.Change(aRes, aPropRes, oldVal, newVal);
1628                        }catch(e){
1629                                bitsObjectMng._dump("bitsObjectMng.DataSource.setProperty("+aRes+","+aRes.Value+","+aProp+","+newVal+"):["+e+"]");
1630                        }
1631                },
1632
1633/////////////////////////////////////////////////////////////////////
1634                exists : function(aRes){
1635                        try{
1636                                if(typeof(aRes) == "string") aRes = bitsObjectMng.Common.RDF.GetResource(this.ABOUT_ITEM + aRes);
1637                                return this.data.ArcLabelsOut(aRes).hasMoreElements();
1638                        }catch(e){
1639                                bitsObjectMng._dump("bitsObjectMng.DataSource.exists("+aRes+"):["+e+"]");
1640                                return false;
1641                        }
1642                },
1643
1644/////////////////////////////////////////////////////////////////////
1645                isContainer : function(aRes){
1646                        try{
1647                                return bitsObjectMng.Common.RDFCU.IsContainer(this.data, aRes);
1648                        }catch(e){
1649                                return false;
1650                        }
1651                },
1652
1653/////////////////////////////////////////////////////////////////////
1654                identify : function(aID){
1655                        var i = 0;
1656                        while(this.exists(aID) && i < 100){
1657                                aID = bitsObjectMng.Common.getTimeStamp(--i);
1658                        }
1659                        return aID;
1660                },
1661
1662/////////////////////////////////////////////////////////////////////
1663                getRelativeIndex : function(aParRes, aRes){
1664                        return bitsObjectMng.Common.RDFCU.indexOf(this.data, aParRes, aRes);
1665                },
1666
1667/////////////////////////////////////////////////////////////////////
1668                seqResources : function(aContRes, aRecursive){
1669                        if(!aRecursive || aRecursive == undefined) aRecursive = false;
1670                        var resList = [];
1671
1672                        bitsObjectMng.Common.RDFC.Init(this.data, aContRes);
1673                        var resEnum = bitsObjectMng.Common.RDFC.GetElements();
1674                        while(resEnum.hasMoreElements()){
1675                                var res = resEnum.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
1676                                resList.push(res);
1677                                if(this.isContainer(res) && aRecursive) resList = resList.concat(this.seqResources(res, aRecursive));
1678                        }
1679                        return resList;
1680                },
1681
1682/////////////////////////////////////////////////////////////////////
1683                flattenResources : function(aContRes, aRule, aRecursive){
1684                        var resList = [];
1685                        if(aRule != 2) resList.push(aContRes);
1686                        bitsObjectMng.Common.RDFC.Init(this.data, aContRes);
1687                        var resEnum = bitsObjectMng.Common.RDFC.GetElements();
1688                        while(resEnum.hasMoreElements()){
1689                                var res = resEnum.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
1690                                if(this.isContainer(res)){
1691                                        if(aRecursive)
1692                                                resList = resList.concat(this.flattenResources(res, aRule, aRecursive));
1693                                        else
1694                                                if(aRule != 2) resList.push(res);
1695                                }else{
1696                                        if(aRule != 1) resList.push(res);
1697                                }
1698                        }
1699                        return resList;
1700                },
1701
1702/////////////////////////////////////////////////////////////////////
1703                findParentResource : function(aRes){
1704                        var resEnum = this.data.GetAllResources();
1705                        while(resEnum.hasMoreElements()){
1706                                var res = resEnum.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
1707                                if(!this.isContainer(res)) continue;
1708                                if(bitsObjectMng.Common.RDFCU.indexOf(this.data, res, aRes) != -1) return res;
1709                        }
1710                },
1711
1712/////////////////////////////////////////////////////////////////////
1713                setID2About : function(aID,aPFID,aAbout,aMode){
1714                        if(aMode == undefined || aMode == "") aMode = bitsObjectMng.Database._defaultMode;
1715                        if(aAbout == undefined && this.id2about[aMode] == undefined) return;
1716                        if(this.id2about[aMode] == undefined){
1717                                if(aAbout == undefined) return;
1718                                this.id2about[aMode] = {};
1719                        }
1720                        if(aPFID == undefined) aPFID = "";
1721                        if(this.id2about[aMode][aPFID] == undefined){
1722                                if(aAbout == undefined) return;
1723                                this.id2about[aMode][aPFID] = {};
1724                        }
1725                        this.id2about[aMode][aPFID][aID] = aAbout;
1726                },
1727
1728/////////////////////////////////////////////////////////////////////
1729                getID2About : function(aID,aPFID,aMode){
1730                        if(aMode == undefined || aMode == "") aMode = bitsObjectMng.Database._defaultMode;
1731                        if(this.id2about[aMode] == undefined) return undefined;
1732                        if(aPFID == undefined) aPFID = "";
1733                        if(this.id2about[aMode][aPFID] == undefined) return undefined;
1734                        return (this.id2about[aMode][aPFID][aID]?this.id2about[aMode][aPFID][aID]:undefined);
1735                },
1736
1737/////////////////////////////////////////////////////////////////////
1738                getAbout : function(aID,aPFID,aMode){
1739                        if(aMode == undefined || aMode == "") aMode = bitsObjectMng.Database._defaultMode;
1740                        var about = this.ABOUT_ITEM+bitsObjectMng.Database._seqIdentify(aID);
1741                        this.setID2About(aID,aPFID,about,aMode);
1742                        return about;
1743                },
1744
1745/////////////////////////////////////////////////////////////////////
1746                load : function(aLoadDoc){
1747                        return true;
1748                },
1749
1750/////////////////////////////////////////////////////////////////////
1751                save : function(aSaveDoc){
1752                        return true;
1753                },
1754
1755/////////////////////////////////////////////////////////////////////
1756                saveload : function(event){
1757                        if(!bitsObjectMng.DataSource.save(event)) bitsObjectMng.DataSource.load(event);
1758                },
1759
1760/////////////////////////////////////////////////////////////////////
1761
1762
1763        },
1764
1765/////////////////////////////////////////////////////////////////////
1766/////////////////////////////////////////////////////////////////////
1767        XML : {
1768                _xmldoc : null,
1769
1770/////////////////////////////////////////////////////////////////////
1771                get serializer(){
1772                        if(!this._xmldoc) return "";
1773                        var serializer = new XMLSerializer();
1774                        return serializer.serializeToString(this._xmldoc);
1775                },
1776
1777/////////////////////////////////////////////////////////////////////
1778                createDocument : function(pUri){
1779                        if(this._xmldoc) this._xmldoc = null;
1780                        try{
1781                                var IO = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService);
1782                                var fileHandler = IO.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
1783                                var aFile = fileHandler.getFileFromURLSpec(pUri);
1784                                var istream = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
1785                                istream.init(aFile, 1, 0, false);
1786                                var sstream = Components.classes['@mozilla.org/scriptableinputstream;1'].createInstance(Components.interfaces.nsIScriptableInputStream);
1787                                sstream.init(istream);
1788                                var fileContents = sstream.read(sstream.available());
1789                                sstream.close();
1790                                istream.close();
1791                                var domParser = new DOMParser();
1792                                var xmlDocument = domParser.parseFromString(fileContents, "text/xml");
1793                                if(xmlDocument && xmlDocument.documentElement.nodeName == "parsererror") xmlDocument = undefined;
1794                                return xmlDocument;
1795                        }catch(e){
1796                                mcDatabaseDialog._dump("XML.createDocument("+pUri+"):"+ e);
1797                                return undefined;
1798                        }
1799                },
1800
1801/////////////////////////////////////////////////////////////////////
1802                parseFromString : function(aString){
1803                        if(this._xmldoc) this._xmldoc = null;
1804                        var parser = new DOMParser(); 
1805                        var xmlDocument = parser.parseFromString(aString,"text/xml"); 
1806                        if(xmlDocument && xmlDocument.documentElement.nodeName == "parsererror") xmlDocument = undefined;
1807                        this._xmldoc = xmlDocument;
1808                        return xmlDocument;
1809                },
1810
1811/////////////////////////////////////////////////////////////////////
1812                updateItem : function (pParentNodeName,pItemNodeName,pItemNodeValue){
1813                        if(!this._xmldoc) return null;
1814                        var elemParentNode = this._xmldoc.getElementsByTagName(pParentNodeName);
1815                        if(!elemParentNode || elemParentNode.length == 0){
1816                                elemParentNode = this._xmldoc.createElement(pParentNodeName);
1817                                if(elemParentNode) this._xmldoc.appendChild(elemParentNode);
1818                        }else{
1819                                elemParentNode = elemParentNode[0];
1820                        }
1821                        if(elemParentNode){
1822                                var elemItemNode = elemParentNode.getElementsByTagName(pItemNodeName);
1823                                if(!elemItemNode || elemItemNode.length == 0){
1824                                        elemItemNode = this._xmldoc.createElement(pItemNodeName);
1825                                        if(elemItemNode) elemParentNode.appendChild(elemItemNode);
1826                                }else{
1827                                        elemItemNode = elemItemNode[0];
1828                                        if(elemItemNode && elemItemNode.hasChildNodes()){
1829                                                var childNode = elemItemNode.lastChild;
1830                                                while(childNode){
1831                                                        var previousSibling = childNode.previousSibling;
1832                                                        elemItemNode.removeChild(childNode);
1833                                                        childNode = previousSibling;
1834                                                }
1835                                        }
1836                                }
1837                                if(elemItemNode){
1838                                        if(pItemNodeValue && pItemNodeValue != ""){
1839                                                var elemTextNode = this._xmldoc.createTextNode(pItemNodeValue);
1840                                                if(elemTextNode) elemItemNode.appendChild(elemTextNode);
1841                                        }
1842                                }
1843                        }
1844                        this._xmldoc.normalize();
1845                        if(bitsMarkingCollection._app_version <7) this._xmldoc.normalizeDocument();
1846                        return elemItemNode;
1847                },
1848
1849/////////////////////////////////////////////////////////////////////
1850                getItem : function (pParentNodeName,pItemNodeName){
1851                        var rtnTextValue = null;
1852                        if(!this._xmldoc) return rtnTextValue;
1853                        this._xmldoc.normalize();
1854                        if(bitsMarkingCollection._app_version <7) this._xmldoc.normalizeDocument();
1855                        var elemParentNode = this._xmldoc.getElementsByTagName(pParentNodeName);
1856                        if(!elemParentNode || elemParentNode.length == 0) return rtnTextValue;
1857                        var elemItemNode = null;
1858                        if(pItemNodeName){
1859                                elemItemNode = elemParentNode[0].getElementsByTagName(pItemNodeName);
1860                                if(!elemItemNode || elemItemNode.length == 0) return rtnTextValue;
1861                                rtnTextValue = elemItemNode;
1862                        }else{
1863                                rtnTextValue = elemParentNode;
1864                        }
1865                        return rtnTextValue;
1866                },
1867
1868/////////////////////////////////////////////////////////////////////
1869                removeItem : function (pParentNodeName,pItemNodeName){
1870                        if(!this._xmldoc) return;
1871                        this._xmldoc.normalize();
1872                        if(bitsMarkingCollection._app_version <7) this._xmldoc.normalizeDocument();
1873                        var elemParentNode = this._xmldoc.getElementsByTagName(pParentNodeName);
1874                        if(!elemParentNode || elemParentNode.length == 0) return;
1875                        elemParentNode = elemParentNode[0];
1876                        var elemItemNode = elemParentNode.getElementsByTagName(pItemNodeName);
1877                        if(!elemItemNode || elemItemNode.length == 0) return;
1878                        elemItemNode = elemItemNode[0];
1879                        elemParentNode.appendChild(elemItemNode);
1880                        return;
1881                },
1882
1883/////////////////////////////////////////////////////////////////////
1884        },
1885
1886/////////////////////////////////////////////////////////////////////
1887/////////////////////////////////////////////////////////////////////
1888        XPath : {
1889
1890                xpe : new XPathEvaluator(),
1891
1892/////////////////////////////////////////////////////////////////////
1893                getOffsetFromParentNode : function(aNode,aOffset){
1894                        var xPathNode = aNode;
1895                        var xPathText = "";
1896                        var tmpOffset = aOffset;
1897                        var tmpEffectOffset = 0;
1898                        if(this._isTextNode(xPathNode)) xPathNode = xPathNode.parentNode;
1899                        if(xPathNode && xPathNode.id && xPathNode.id.indexOf("bits_") == 0) xPathNode = xPathNode.parentNode;
1900                        tmpEffectOffset = 0;
1901                        while(xPathNode && xPathNode.id && xPathNode.id.indexOf("bits_") == 0) xPathNode = xPathNode.parentNode;
1902                        while(xPathNode){
1903                                xPathText = this.createXPath(xPathNode);
1904                                if(xPathText.indexOf("bits_") < 0) break;
1905                                xPathNode = xPathNode.parentNode;
1906                        }
1907                        while(xPathText.match(/^(.*)?\/([A-Z]+)\[(\d+)\]$/)){
1908                                var rpath = RegExp.$1;
1909                                var rnode = RegExp.$2;
1910                                var rcnt = RegExp.$3;
1911                                for(;rcnt>0;rcnt--){
1912                                        var rnode_xpath = this.evaluate(rpath+'/'+rnode+'['+rcnt+']',xPathNode.ownerDocument);
1913                                        if(rnode_xpath){
1914                                                for(r2cnt=0;r2cnt<rnode_xpath.snapshotLength;r2cnt++){
1915                                                        var r2node = rnode_xpath.snapshotItem(r2cnt);
1916                                                        if(r2node && r2node.id && r2node.id.indexOf("bits_") == 0){
1917                                                                xPathNode = r2node.parentNode;
1918                                                                rpath = this.createXPath(xPathNode);
1919                                                                rcnt = 0;
1920                                                                break;
1921                                                        }
1922                                                }
1923                                        }
1924                                }
1925                                xPathText = rpath;
1926                        }
1927                        if(xPathNode){
1928                                xPathText = this.createXPath(xPathNode);
1929                                if(this._isTextNode(aNode)){
1930                                        var nodeWalker = xPathNode.ownerDocument.createTreeWalker(xPathNode,NodeFilter.SHOW_TEXT,null,false);
1931                                        var txtNode=nodeWalker.nextNode();
1932                                        if(txtNode){
1933                                                for(;txtNode && txtNode != aNode;txtNode = nodeWalker.nextNode()){
1934                                                        tmpOffset += txtNode.nodeValue.length;
1935                                                }
1936                                                if(txtNode == aNode){
1937                                                        var xContext = txtNode.nodeValue;
1938                                                        if(txtNode.nodeValue.length>xContext.length) tmpOffset -= (txtNode.nodeValue.length-xContext.length);
1939                                                }
1940                                        }else{
1941                                                tmpOffset = 0;
1942                                        }
1943                                }else{
1944                                        var nodeWalker = xPathNode.ownerDocument.createTreeWalker(aNode,NodeFilter.SHOW_TEXT,null,false);
1945                                        var aTxtNode=nodeWalker.nextNode();
1946                                        if(aTxtNode){
1947                                                var nodeWalker = xPathNode.ownerDocument.createTreeWalker(xPathNode,NodeFilter.SHOW_TEXT,null,false);
1948                                                var txtNode=nodeWalker.nextNode();
1949                                                if(txtNode){
1950                                                        for(;txtNode && txtNode != aTxtNode;txtNode = nodeWalker.nextNode()){
1951                                                                tmpOffset += txtNode.nodeValue.length;
1952                                                        }
1953                                                        if(txtNode == aNode){
1954                                                                var xContext = txtNode.nodeValue;
1955                                                                if(txtNode.nodeValue.length>xContext.length) tmpOffset -= (txtNode.nodeValue.length-xContext.length);
1956                                                        }
1957                                                }else{
1958                                                        tmpOffset = 0;
1959                                                }
1960                                        }
1961                                }
1962                        }
1963                        tmpOffset -= tmpEffectOffset;
1964                        return {
1965                                node   : xPathNode,
1966                                xpath  : xPathText,
1967                                offset : tmpOffset,
1968                                type   : aNode.nodeType,
1969                        };
1970                },
1971
1972/////////////////////////////////////////////////////////////////////
1973                getCurrentNodeFromXPath : function(aDoc,aXPath,aOffset,aType){
1974                        try{
1975                                var rtnNode = null;
1976                                var tmpOffset = aOffset;
1977                                try{var evaluateNode = this.evaluate(aXPath,aDoc).snapshotItem(0);}catch(e){bitsObjectMng._dump("bitsObjectMng.XPath.getCurrentNodeFromXPath():"+e);}
1978                                if(evaluateNode && aType == 3){
1979                                        var nodeWalker = aDoc.createTreeWalker(evaluateNode,NodeFilter.SHOW_TEXT,null,false);
1980                                        var txtNode=nodeWalker.nextNode();
1981                                        if(txtNode){
1982                                                for(;txtNode;txtNode = nodeWalker.nextNode()){
1983                                                        if(tmpOffset - txtNode.nodeValue.length<0 || (tmpOffset>0 && (tmpOffset - txtNode.nodeValue.length)==0)){
1984                                                                rtnNode = txtNode;
1985                                                                break;
1986                                                        }
1987                                                        tmpOffset -= txtNode.nodeValue.length;
1988                                                        nodeWalker.currentNode = txtNode;
1989                                                }
1990                                        }else{
1991                                                rtnNode = evaluateNode;
1992                                        }
1993                                }else{
1994                                        rtnNode = evaluateNode;
1995                                }
1996                                return { node: rtnNode, offset : tmpOffset};
1997                        }catch(ex){
1998                                bitsObjectMng._dump("bitsObjectMng.XPath.getCurrentNodeFromXPath():"+ex);
1999                                return undefined;
2000                        }
2001                },
2002
2003/////////////////////////////////////////////////////////////////////
2004                _isTextNode : function(aNode){ 
2005                        return aNode.nodeType == aNode.TEXT_NODE;
2006                },
2007
2008/////////////////////////////////////////////////////////////////////
2009                getDocument : function(aNode){
2010                        return (aNode.ownerDocument == null ? aNode : aNode.ownerDocument);
2011                },
2012
2013/////////////////////////////////////////////////////////////////////
2014                getDocumentElement : function(aNode){
2015                        return (aNode.ownerDocument == null ? aNode.documentElement : aNode.ownerDocument.documentElement);
2016                },
2017
2018/////////////////////////////////////////////////////////////////////
2019                createNSResolver : function(aNode){
2020                        return this.xpe.createNSResolver(this.getDocumentElement(aNode));
2021                },
2022
2023/////////////////////////////////////////////////////////////////////
2024                evaluateArray : function(aExpr, aNode){
2025                        var found = [];
2026                        try{
2027                                var result = this.xpe.evaluate(aExpr, aNode, this.createNSResolver(aNode), 0, null);
2028                                var res;
2029                                while(res = result.iterateNext()) found.push(res);
2030                        }catch(e){}
2031                        return found;
2032                },
2033
2034/////////////////////////////////////////////////////////////////////
2035                evaluate : function(aExpr, aNode){
2036                        var rtn = this.xpe.evaluate(aExpr, aNode, this.createNSResolver(aNode), XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
2037                        if(rtn.snapshotLength == 0) rtn = this.getDocument(aNode).evaluate(aExpr, aNode, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
2038                        return rtn;
2039                },
2040
2041/////////////////////////////////////////////////////////////////////
2042                isPMC : function(aNode){
2043                        if(!aNode || !aNode.ownerDocument) return false;
2044                        if(aNode.ownerDocument.URL.match(/^http:\/\/www\.pubmedcentral\.nih\.gov\//)) return true;
2045                        if(aNode.ownerDocument.URL.match(/^http:\/\/www\.ncbi\.nlm\.nih\.gov\/pmc\//)) return true;
2046                        return false;
2047                },
2048
2049/////////////////////////////////////////////////////////////////////
2050                isUseNodeId : function(aNode){
2051                        if(!aNode.id || aNode.id.match(/^bits_/)) return false;
2052                        if(aNode.ownerDocument && aNode.ownerDocument.URL.match(/^https:\/\/mail\.google\.com\//)) return false;
2053                        var id_check = this.isPMC(aNode);
2054                        if(id_check && aNode.id.match(/^[A-Za-z_]+\d+[a-z]*$/)) return false;
2055                        var id_nodes = this.evaluate('//*[@id="'+aNode.id+'"]', aNode);
2056                        if(id_nodes.snapshotLength>1) return false;
2057                        return true;
2058                },
2059
2060/////////////////////////////////////////////////////////////////////
2061                createXPath : function(aNode){
2062                        var nodeName = (aNode.nodeType == Node.ELEMENT_NODE) ? aNode.localName.toLowerCase() : (aNode.nodeType == Node.TEXT_NODE) ? 'text()' : (aNode.nodeType == Node.COMMENT_NODE) ? 'comment()' : '*';
2063                        if(this.isUseNodeId(aNode)) return '//'+nodeName+'[@id="'+aNode.id+'"]';
2064                        var path = [];
2065                        var node = aNode;
2066                        var i;
2067                        var j;
2068                        var tarNode;
2069                        var tarNodeName;
2070                        var ancestorNodes = []
2071                        var nodes = this.evaluate('ancestor::*', node);
2072                        var len = nodes.snapshotLength;
2073                        for(i=0;i<len;i++){ ancestorNodes.push(nodes.snapshotItem(i)); }
2074                        for(i=ancestorNodes.length-1;i>=0;i--){
2075                                tarNode = ancestorNodes[i];
2076                                if(tarNode.id && this.isUseNodeId(tarNode)) break;
2077                                nodes = this.evaluate('preceding-sibling::*[@id]', tarNode);
2078                                tarNode = null;
2079                                len = nodes.snapshotLength;
2080                                for(j=len-1;j>=0;j--){
2081                                        tarNode = nodes.snapshotItem(j);
2082                                        if(this.isUseNodeId(tarNode)) break;
2083                                        tarNode = null;
2084                                }
2085                                if(tarNode) break;
2086                        }
2087                        if(tarNode){
2088                                tarNodeName = '//'+tarNode.localName.toLowerCase()+'[@id="'+tarNode.id+'"]';
2089                        }else{
2090                                tarNode = this.getDocumentElement(node);
2091                                tarNodeName = '/'+tarNode.localName.toLowerCase()+'[1]';
2092                        }
2093                        while(tarNode.parentNode != node.parentNode){
2094                                nodes = this.evaluate('preceding-sibling::'+nodeName, node);
2095                                path.unshift(nodeName+'['+(nodes.snapshotLength+1)+']');
2096                                node = node.parentNode;
2097                                nodeName = node.localName.toLowerCase();
2098                        }
2099                        if(tarNode != node){
2100                                var axis = 'following-sibling::';
2101                                nodes = this.evaluate(axis+nodeName, tarNode);
2102                                len = nodes.snapshotLength;
2103                                for(i=0;i<len&&nodes.snapshotItem(i)!=node;i++){}
2104                                path.unshift(axis+nodeName+'['+(i+1)+']');
2105                        }
2106                        path.unshift(tarNodeName);
2107                        return path.join('/');
2108                },
2109        },
2110
2111/////////////////////////////////////////////////////////////////////
2112/////////////////////////////////////////////////////////////////////
2113        Database : {
2114                _dbConn : [],
2115
2116                _lastModifiedTime : [],
2117                _checktimer : null,
2118                _Listener : [],
2119
2120                _defaultMode    : "local",
2121                _sharedMode     : "shared",
2122                _repositoryMode : "repository",
2123
2124                _seq    : [],
2125                _seqmin : "",
2126
2127                _version : "1.0",
2128
2129/////////////////////////////////////////////////////////////////////
2130                get version(){
2131                        return this._version;
2132                },
2133                getVersion : function(aMode){
2134                        if(!aMode) return undefined;
2135                        if(!this._dbConn[aMode]) return undefined;
2136                        if(!this._dbConn[aMode].tableExists("om_version")) return undefined;
2137                        var lSql = 'select max(version) as version from om_version';
2138                        var lFld = [];
2139                        var statement = this._dbConn[aMode].createStatement(lSql);
2140                        if(!this.beginTransaction(aMode)) return null;
2141                        while(statement.executeStep()){
2142                                var row = {};
2143                                for(var j=0,k=statement.columnCount;j<k;j++){
2144                                        row[statement.getColumnName(j)] = statement.getUTF8String(j);
2145                                        if(row[statement.getColumnName(j)] == "null") row[statement.getColumnName(j)] = "";
2146                                }
2147                                lFld.push(row);
2148                        }
2149                        this.endTransaction(aMode);
2150                        statement.reset();
2151                        statement = undefined;
2152                        return (lFld && lFld.length>0 ? lFld[0].version : undefined);
2153                },
2154
2155                _updateOidProperty : function (obj,aMode){
2156                        if(obj.oid_property == undefined) return undefined;
2157                        try{
2158                                var parser = new DOMParser();
2159                                try{var xmldoc = parser.parseFromString(obj.oid_property, "text/xml");}catch(e){
2160                                        bitsObjectMng._dump("bitsObjectMng.Database._updateOidProperty():"+e);
2161                                }
2162                                parser = undefined;
2163                                if(xmldoc && xmldoc.documentElement.nodeName == "parsererror"){
2164                                        obj.oid_property = undefined;
2165                                        xmldoc = undefined;
2166                                        return undefined;
2167                                }
2168                                if(xmldoc){
2169                                        var xmlnode = xmldoc.getElementsByTagName("ARTICLE_INFO")[0];
2170                                        if(xmlnode){
2171                                                var domParser = new DOMParser();
2172                                                var xmlDocument = domParser.parseFromString("<ARTICLE_INFO></ARTICLE_INFO>", "text/xml");
2173                                                domParser = undefined;
2174                                                if(xmlDocument){
2175                                                        for(var dcnt=0;dcnt<xmlnode.childNodes.length;dcnt++){
2176                                                                xmlDocument.documentElement.appendChild(xmlnode.childNodes[dcnt].cloneNode(true));
2177                                                        }
2178                                                        var removeElem = false;
2179                                                        for(var dcnt=xmlnode.childNodes.length-1;dcnt>=0;dcnt--){
2180                                                                var nodeName = xmlnode.childNodes[dcnt].nodeName;
2181                                                                if(nodeName == "DOC_INFO"){
2182                                                                        var xmlnode2 = xmlnode.childNodes[dcnt];
2183                                                                        for(var dcnt2=xmlnode2.childNodes.length-1;dcnt2>=0;dcnt2--){
2184                                                                                if(xmlnode2.childNodes[dcnt2].nodeName == "PMID" || xmlnode2.childNodes[dcnt2].nodeName == "TI") continue;
2185                                                                                xmlnode2.removeChild(xmlnode2.childNodes[dcnt2]);
2186                                                                                removeElem = true;
2187                                                                        }
2188                                                                        continue;
2189                                                                }
2190                                                                if(nodeName == "DOC_MEDLINE_INFO"){
2191                                                                        var xmlnode2 = xmlnode.childNodes[dcnt];
2192                                                                        for(var dcnt2=xmlnode2.childNodes.length-1;dcnt2>=0;dcnt2--){
2193                                                                                if(xmlnode2.childNodes[dcnt2].nodeName == "AU" || xmlnode2.childNodes[dcnt2].nodeName == "TA" || xmlnode2.childNodes[dcnt2].nodeName == "DP") continue;
2194                                                                                xmlnode2.removeChild(xmlnode2.childNodes[dcnt2]);
2195                                                                                removeElem = true;
2196                                                                        }
2197                                                                        continue;
2198                                                                }
2199                                                                if(nodeName == "SECTIONS"){
2200                                                                        var xmlnodes = xmlnode.childNodes[dcnt].getElementsByTagName("SECTION");
2201                                                                        for(var dcnts=0;dcnts<xmlnodes.length;dcnts++){
2202                                                                                var xmlnode2 = xmlnodes[dcnts];
2203                                                                                for(var dcnt2=xmlnode2.childNodes.length-1;dcnt2>=0;dcnt2--){
2204                                                                                        if(xmlnode2.childNodes[dcnt2].nodeName == "TITLE") continue;
2205                                                                                        xmlnode2.removeChild(xmlnode2.childNodes[dcnt2]);
2206                                                                                        removeElem = true;
2207                                                                                }
2208                                                                        }
2209                                                                        continue;
2210                                                                }
2211                                                                xmlnode.removeChild(xmlnode.childNodes[dcnt]);
2212                                                                removeElem = true;
2213                                                        }
2214                                                        if(removeElem){
2215                                                                var s = new XMLSerializer();
2216                                                                var xml = s.serializeToString(xmlDocument);
2217                                                                s = undefined;
2218                                                                var pFile = this.getObjectPropertyDir(obj.oid,aMode);
2219                                                                pFile.append("article_info.xml");
2220                                                                bitsObjectMng.Common.writeFile(pFile,xml,'UTF-8');
2221                                                        }
2222                                                        xmlDocument = undefined;
2223                                                }
2224                                                xmlnode = undefined;
2225                                        }else{
2226                                                var pFile = this.getObjectPropertyDir(obj.oid,aMode);
2227                                                pFile.append("article_info.xml");
2228                                                if(pFile.exists()) pFile.remove(true);
2229                                        }
2230                                        var s = new XMLSerializer();
2231                                        obj.oid_property = s.serializeToString(xmldoc);
2232                                        s = undefined;
2233                                }
2234                        }catch(ex){
2235                                bitsObjectMng._dump("bitsObjectMng.Database._convert():"+ex);
2236                        }
2237                        return obj.oid_property;
2238                },
2239
2240                _getStatementValue : function(aStatement,aIndex){
2241                        try{
2242                                var rtn = {};
2243                                rtn.name = aStatement.getColumnName(aIndex);
2244                                rtn.type = aStatement.getTypeOfIndex(aIndex);
2245                                switch(rtn.type){
2246                                        case aStatement.VALUE_TYPE_INTEGER :
2247                                        case aStatement.VALUE_TYPE_FLOAT :
2248                                        case aStatement.VALUE_TYPE_TEXT :
2249                                                rtn.value = aStatement.getUTF8String(aIndex);
2250                                                break;
2251                                        case aStatement.VALUE_TYPE_BLOB :
2252                                                var array = {};
2253                                                var size = {};
2254                                                aStatement.getBlob(aIndex,size,array);
2255                                                rtn.value = array.value;
2256                                                break;
2257                                        default :
2258                                                break;
2259                                }
2260                                return rtn;
2261                        }catch(e){
2262                                bitsObjectMng._dump("bitsObjectMng.Database._getStatementValue():"+e);
2263                                return undefined;
2264                        }
2265                },
2266
2267                _setStatementValue : function(aStatement,aIndex,aValue,aType){
2268                        try{
2269                                if(aType == undefined) aType = aStatement.VALUE_TYPE_TEXT;
2270                                if(aValue == undefined){
2271                                        aStatement.bindNullParameter(aIndex);
2272                                }else{
2273                                        switch(aType){
2274                                                case aStatement.VALUE_TYPE_INTEGER :
2275                                                case aStatement.VALUE_TYPE_FLOAT :
2276                                                case aStatement.VALUE_TYPE_TEXT :
2277                                                        aStatement.bindUTF8StringParameter(aIndex,aValue);
2278                                                        break;
2279                                                case aStatement.VALUE_TYPE_BLOB :
2280                                                        aStatement.bindBlobParameter(aIndex,aValue,aValue.length);
2281                                                        break;
2282                                                default :
2283                                                        break;
2284                                        }
2285                                }
2286                        }catch(e){
2287                                bitsObjectMng._dump("bitsObjectMng.Database._setStatementValue():"+e);
2288                        }
2289                },
2290
2291                _convert : function(aMode,aTable){
2292                        var type = {};
2293                        var statement = this._dbConn[aMode].createStatement("PRAGMA TABLE_INFO("+aTable+")");
2294                        try{
2295                                var columnCount = statement.columnCount;
2296                                while (statement.executeStep()){
2297                                        var pname;
2298                                        var ptype;
2299                                        for(var index=0;index<columnCount;index++){
2300                                                switch(statement.getColumnName(index)){
2301                                                        case "name":
2302                                                                pname = statement.getUTF8String(index);
2303                                                                break;
2304                                                        case "type":
2305                                                                ptype = statement.getUTF8String(index);
2306                                                                switch(ptype){
2307                                                                        case "TEXT":
2308                                                                                type[pname] = statement.VALUE_TYPE_TEXT;
2309                                                                                break;
2310                                                                        case "NUMERIC":
2311                                                                                type[pname] = statement.VALUE_TYPE_FLOAT;
2312                                                                                break;
2313                                                                        case "INTEGER":
2314                                                                                type[pname] = statement.VALUE_TYPE_INTEGER;
2315                                                                                break;
2316                                                                        case "BLOB":
2317                                                                                type[pname] = statement.VALUE_TYPE_BLOB;
2318                                                                                break;
2319                                                                }
2320                                                                break;
2321                                                        default:
2322                                                                break;
2323                                                }
2324                                        }
2325                                }
2326                        }catch(e){
2327                                bitsObjectMng._dump("bitsObjectMng.Database._convert():"+e);
2328                        } finally {
2329                                statement.reset();
2330                        }
2331                        statement = undefined;
2332
2333                        var pos = 0;
2334                        var rows = [];
2335                        var statement = this._dbConn[aMode].createStatement("select * from "+aTable);
2336                        try{
2337                                var columnCount = statement.columnCount;
2338                                while (statement.executeStep()){
2339                                        var obj = {};
2340                                        for(pos=0;pos<columnCount;pos++){
2341                                                var rtn = this._getStatementValue(statement,pos);
2342                                                if(!rtn) continue;
2343                                                if(rtn.value != undefined) obj[rtn.name] = (rtn.type==statement.VALUE_TYPE_TEXT?unescape(rtn.value):rtn.value);
2344                                        }
2345                                        rows.push(obj);
2346                                        obj = undefined;
2347                                }
2348                        }catch(e){
2349                                bitsObjectMng._dump("bitsObjectMng.Database._convert():"+e);
2350                        } finally {
2351                                statement.reset();
2352                        }
2353                        statement = undefined;
2354
2355                        if((type.fid != undefined || type.oid != undefined) && rows.length>0){
2356                                var sql = "update "+aTable+" set ";
2357                                var column = [];
2358                                var names = [];
2359                                var obj = rows[0];
2360                                var index = 0;
2361                                for(var name in type){
2362                                        if(type.fid != undefined && name == "fid") continue;
2363                                        if(type.oid != undefined && name == "oid") continue;
2364                                        if(type[name] != 3) continue;
2365                                        index++;
2366                                        column.push(name + "=?" + index);
2367                                        names.push(name);
2368                                }
2369                                sql += column.join(",");
2370                                if(type.fid != undefined){
2371                                        sql += " where fid=?" + (++index);
2372                                }else if(type.oid != undefined){
2373                                        sql += " where oid=?" + (++index);
2374                                }
2375                                statement = this._dbConn[aMode].createStatement(sql);
2376                                for(pos=0;pos<rows.length;pos++){
2377                                        var statement_c = statement.clone();
2378                                        var obj = rows[pos]
2379                                        if(obj.oid_property) obj.oid_property = this._updateOidProperty(obj,aMode);
2380                                        for(index=0;index<names.length;index++){
2381                                                this._setStatementValue(statement_c,index,obj[names[index]],type[names[index]]);
2382                                        }
2383                                        if(type.fid != undefined){
2384                                                this._setStatementValue(statement_c,index,obj.fid,type.fid);
2385                                        }else if(type.oid != undefined){
2386                                                this._setStatementValue(statement_c,index,obj.oid,type.oid);
2387                                        }
2388                                        try{
2389                                                statement_c.execute();
2390                                        }catch(e){
2391                                                bitsObjectMng._dump("bitsObjectMng.Database._convert():"+e);
2392                                        } finally {
2393                                                statement_c.reset();
2394                                        }
2395                                        statement_c = undefined;
2396                                }
2397                                statement = undefined;
2398                        }
2399                        return true;
2400                },
2401
2402                _convertExec : function(aMode,aTable,type,rows,names,statement,progressWindow,offset){
2403                        var LIMIT = 10;
2404                        if(!progressWindow){
2405                                var x = screen.width;
2406                                var y = screen.height;
2407                                progressWindow = window.openDialog(
2408                                        "chrome://markingcollection/content/progress.xul",
2409                                        "myProgress", "chrome,centerscreen,alwaysRaised,dependent=yes,left="+x+",top="+y, 
2410                                        {status: bitsObjectMng.STRING.getString("CONVERT_DATABASE") + "..."});
2411                                setTimeout(function(){bitsObjectMng.Database._convertExec(aMode,aTable,undefined,undefined,undefined,undefined,progressWindow);},0);
2412                                return;
2413                        }
2414                        if(!type || !rows){
2415                                if(offset == undefined) offset = 0;
2416                                var ourTransaction = false;
2417                                if(this._dbConn[aMode].transactionInProgress){
2418                                        this._dbConn[aMode].beginTransactionAs(this._dbConn[aMode].TRANSACTION_DEFERRED);
2419                                }
2420                                type = {};
2421                                var statement = this._dbConn[aMode].createStatement("PRAGMA TABLE_INFO("+aTable+")");
2422                                try{
2423                                        var columnCount = statement.columnCount;
2424                                        while (statement.executeStep()){
2425                                                var pname;
2426                                                var ptype;
2427                                                for(var index=0;index<columnCount;index++){
2428                                                        switch(statement.getColumnName(index)){
2429                                                                case "name":
2430                                                                        pname = statement.getUTF8String(index);
2431                                                                        break;
2432                                                                case "type":
2433                                                                        ptype = statement.getUTF8String(index);
2434                                                                        switch(ptype){
2435                                                                                case "TEXT":
2436                                                                                        type[pname] = statement.VALUE_TYPE_TEXT;
2437                                                                                        break;
2438                                                                                case "NUMERIC":
2439                                                                                        type[pname] = statement.VALUE_TYPE_FLOAT;
2440                                                                                        break;
2441                                                                                case "INTEGER":
2442                                                                                        type[pname] = statement.VALUE_TYPE_INTEGER;
2443                                                                                        break;
2444                                                                                case "BLOB":
2445                                                                                        type[pname] = statement.VALUE_TYPE_BLOB;
2446                                                                                        break;
2447                                                                        }
2448                                                                        break;
2449                                                                default:
2450                                                                        break;
2451                                                        }
2452                                                }
2453                                        }
2454                                }catch(e){
2455                                        bitsObjectMng._dump("bitsObjectMng.Database._convert():"+e);
2456                                } finally {
2457                                        statement.reset();
2458                                }
2459                                statement = undefined;
2460
2461                                var pos = 0;
2462                                rows = [];
2463                                var selectFld = "*";
2464                                if(aTable == "om_object") selectFld = "oid,doc_title,doc_url,con_url,bgn_dom,end_dom,oid_title,oid_property,oid_mode,oid_type,oid_txt,oid_date";
2465                                var statement = this._dbConn[aMode].createStatement("select "+ selectFld + " from "+aTable + " limit " + LIMIT + " offset " + offset);
2466                                try{
2467                                        var columnCount = statement.columnCount;
2468                                        while (statement.executeStep()){
2469                                                var obj = {};
2470                                                for(pos=0;pos<columnCount;pos++){
2471                                                        var rtn = this._getStatementValue(statement,pos);
2472                                                        if(!rtn) continue;
2473                                                        if(rtn.value != undefined) obj[rtn.name] = (rtn.type==statement.VALUE_TYPE_TEXT?unescape(rtn.value):rtn.value);
2474                                                }
2475                                                rows.push(obj);
2476                                                obj = undefined;
2477                                        }
2478                                }catch(e){
2479                                        bitsObjectMng._dump("bitsObjectMng.Database._convert():"+e);
2480                                } finally {
2481                                        statement.reset();
2482                                }
2483                                statement = undefined;
2484                        }
2485                        if((type.fid != undefined || type.oid != undefined) && rows.length>0){
2486                                if(!statement){
2487                                        var sql = "update "+aTable+" set ";
2488                                        var column = [];
2489                                        names = [];
2490                                        var obj = rows[0];
2491                                        var index = 0;
2492                                        for(var name in type){
2493                                                if(type.fid != undefined && name == "fid") continue;
2494                                                if(type.oid != undefined && name == "oid") continue;
2495                                                if(type[name] != 3) continue;
2496                                                index++;
2497                                                column.push(name + "=?" + index);
2498                                                names.push(name);
2499                                        }
2500                                        sql += column.join(",");
2501                                        if(type.fid != undefined){
2502                                                sql += " where fid=?" + (++index);
2503                                        }else if(type.oid != undefined){
2504                                                sql += " where oid=?" + (++index);
2505                                        }
2506                                        statement = this._dbConn[aMode].createStatement(sql);
2507                                }
2508                                if(rows.length>0){
2509                                        var cnt;
2510                                        for(cnt=0;cnt<1 && rows.length>0;cnt++){
2511                                                var pos = rows.length;
2512                                                var obj = rows.shift();
2513                                                var statement_c = statement.clone();
2514                                                if(obj.oid_property) obj.oid_property = this._updateOidProperty(obj,aMode);
2515                                                for(index=0;index<names.length;index++){
2516                                                        this._setStatementValue(statement_c,index,obj[names[index]],type[names[index]]);
2517                                                }
2518                                                if(type.fid != undefined){
2519                                                        this._setStatementValue(statement_c,index,obj.fid,type.fid);
2520                                                }else if(type.oid != undefined){
2521                                                        this._setStatementValue(statement_c,index,obj.oid,type.oid);
2522                                                }
2523                                                try{
2524                                                        statement_c.execute();
2525                                                }catch(e){
2526                                                        bitsObjectMng._dump("bitsObjectMng.Database._convert():"+e);
2527                                                        for(index=0;index<names.length;index++){
2528                                                                bitsObjectMng._dump2("bitsObjectMng.Database._convert():["+index+"]["+type[names[index]]+"]["+names[index]+"]["+obj[names[index]]+"]");
2529                                                        }
2530                                                } finally {
2531                                                        statement_c.reset();
2532                                                }
2533                                                statement_c = undefined;
2534                                        }
2535                                        if(rows.length == 0){
2536                                                offset += LIMIT;
2537                                                rows = undefined;
2538                                        }
2539                                        setTimeout(function(){bitsObjectMng.Database._convertExec(aMode,aTable,type,rows,names,statement,progressWindow,offset);},0);
2540                                }
2541                        }else if(rows.length==0){
2542                                type = undefined;
2543                                rows = undefined;
2544                                statement = undefined;
2545
2546                                if(!this._dbConn[aMode].tableExists("om_version")) this._dbConn[aMode].executeSimpleSQL("CREATE TABLE om_version (version NUMERIC NOT NULL)");
2547                                this._dbConn[aMode].executeSimpleSQL("insert into om_version (version) values ('"+this.version+"')");
2548                                if(this._dbConn[aMode].transactionInProgress) this._dbConn[aMode].commitTransaction();
2549
2550                                if(progressWindow && !progressWindow.closed) progressWindow.close();
2551                                progressWindow = undefined;
2552                                bitsObjectMng.Common.alert(bitsObjectMng.STRING.getString("CONVERT_END_DATABASE"));
2553                                var appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"].getService(Components.interfaces.nsIAppStartup);
2554                                var quitSeverity = appStartup.eAttemptQuit;
2555                                appStartup.quit(quitSeverity | appStartup.eRestart);
2556                                return;
2557                        }
2558                        if(progressWindow && !progressWindow.closed){
2559                                if(progressWindow.setStatus) progressWindow.setStatus(bitsObjectMng.STRING.getString("CONVERT_DATABASE") + "... [ "+ (offset+ (rows?(LIMIT-rows.length):0)) + " ]");
2560                                progressWindow.focus();
2561                        }
2562                        return true;
2563                },
2564
2565                convert : function(aMode){
2566                        if(!aMode) return undefined;
2567                        if(!this._dbConn[aMode]) return undefined;
2568                        var version = this.getVersion(aMode);
2569                        if(parseFloat(version?version:0)>=parseFloat(this.version)) return;
2570                        var dbFile = this._dbConn[aMode].databaseFile.clone();
2571                        var aBackupFile = dbFile.parent.clone();
2572                        aBackupFile.append(dbFile.leafName+".old");
2573                        var bgcnt=0;
2574                        while(aBackupFile.exists()){
2575                                aBackupFile = dbFile.parent.clone();
2576                                aBackupFile.append(dbFile.leafName+".old."+(++bgcnt));
2577                        }
2578                        dbFile.copyTo(aBackupFile.parent ,aBackupFile.leafName);
2579                        var x = screen.width;
2580                        var y = screen.height;
2581                        progressWindow = window.openDialog(
2582                                "chrome://markingcollection/content/progress.xul",
2583                                "myProgress", "chrome,centerscreen,alwaysRaised,dependent=yes,left="+x+",top="+y, 
2584                                {status: bitsObjectMng.STRING.getString("CONVERT_DATABASE") + "..."});
2585                        setTimeout(function(){
2586                                var ourTransaction = false;
2587                                if (bitsObjectMng.Database._dbConn[aMode].transactionInProgress){
2588                                        ourTransaction = true;
2589                                        bitsObjectMng.Database._dbConn[aMode].beginTransactionAs(bitsObjectMng.Database._dbConn[aMode].TRANSACTION_DEFERRED);
2590                                }
2591                                if(!bitsObjectMng.Database._convert(aMode,"om_folder")) return;
2592                                if(ourTransaction) bitsObjectMng.Database._dbConn[aMode].commitTransaction();
2593                                setTimeout(function(){bitsObjectMng.Database._convertExec(aMode,"om_object",undefined,undefined,undefined,undefined,progressWindow);},0);
2594                        },0);
2595                },
2596
2597/////////////////////////////////////////////////////////////////////
2598                init : function(aMode,aDBFile){
2599                        try{
2600                                if(aMode == undefined || aMode == "") aMode = bitsObjectMng.Database._defaultMode;
2601                                bitsObjectMng.Database.connect(aMode,aDBFile);
2602                                if(bitsObjectMng.Database._dbConn[aMode]){
2603                                        bitsObjectMng.Database._createTable(aMode);
2604                                        bitsObjectMng.Database._updateLastModifiedTime(aMode);
2605                                        bitsObjectMng.Database._startUpdateCheck(aMode);
2606                                }else{
2607                                        bitsObjectMng.Database._lastModifiedTime[aMode] = 0;
2608                                }
2609                        }catch(e){bitsObjectMng._dump("bitsObjectMng.Database.init("+aMode+"):"+e)}
2610                        return bitsObjectMng.Database._dbConn[aMode];
2611                },
2612/////////////////////////////////////////////////////////////////////
2613                done : function(aMode,aVacuum){
2614                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
2615                        if(this._dbConn[aMode]){
2616                                var dbFile = this._dbConn[aMode].databaseFile.clone();
2617                                this.disconnect(aMode,aVacuum);
2618                                this.backup(dbFile);
2619                                this._lastModifiedTime[aMode] = 0;
2620                                this._stopUpdateCheck(aMode);
2621                                delete this._dbConn[aMode];
2622                        }
2623                },
2624
2625/////////////////////////////////////////////////////////////////////
2626                backup : function(aFile){
2627                        try{
2628                                var bDir = bitsObjectMng.Common.getExtensionDir();
2629                                bDir.append("backup");
2630                                var aBackupFile = bDir.clone();
2631                                aBackupFile.append(aFile.leafName+".1");
2632                                if(aBackupFile.exists() && aFile.exists()){
2633                                        if(aBackupFile.lastModifiedTime == aFile.lastModifiedTime) return;
2634                                }
2635                                for(var i=4;i>0;i--){
2636                                        var aFile1 = bDir.clone();
2637                                        aFile1.append(aFile.leafName+"."+i);
2638                                        if(!aFile1.exists()) continue;
2639                                        var aFile2 = bDir.clone();
2640                                        aFile2.append(aFile.leafName+"."+(i+1));
2641                                        if(aFile2.exists()) aFile2.remove(true);
2642                                        aFile1.moveTo(aFile2.parent ,aFile2.leafName);
2643                                }
2644                                if(aBackupFile.exists()) aBackupFile.remove(true);
2645                                aFile.copyTo(aBackupFile.parent ,aBackupFile.leafName);
2646                        }catch(e){}
2647                },
2648
2649/////////////////////////////////////////////////////////////////////
2650                _updateLastModifiedTime : function(aMode){
2651                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
2652                        if(this._dbConn[aMode]){
2653                                var aFile = this._dbConn[aMode].databaseFile.clone();
2654                                if(aFile && aFile.exists()){
2655                                        this._lastModifiedTime[aMode] = aFile.lastModifiedTime;
2656                                }else{
2657                                        this._lastModifiedTime[aMode] = 0;
2658                                }
2659                        }else{
2660                                this._lastModifiedTime[aMode] = 0;
2661                        }
2662                },
2663
2664/////////////////////////////////////////////////////////////////////
2665                _startUpdateCheck : function(aMode){
2666                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
2667                        this._stopUpdateCheck(aMode);
2668                },
2669
2670/////////////////////////////////////////////////////////////////////
2671                _stopUpdateCheck : function(aMode){
2672                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
2673                        if(this._checktimer){
2674                                clearInterval(this._checktimer);
2675                                this._checktimer = null;
2676                        }
2677                },
2678
2679/////////////////////////////////////////////////////////////////////
2680                _updateCheck : function(aMode){
2681                        if(aMode == undefined || aMode == ""){
2682                                var mode;
2683                                for(mode in this._dbConn){
2684                                        if(typeof this._dbConn[mode] == "function") continue;
2685                                        var tmpRtn = bitsObjectMng.Database._updateCheck(mode);
2686                                        if(tmpRtn) return true;
2687                                }
2688                                return false;
2689                        }
2690                        var rtn = false;
2691                        if(bitsObjectMng.Database._dbConn[aMode]){
2692                                var aFile = bitsObjectMng.Database._getConnectFile(aMode);
2693                                if(bitsObjectMng.Database._lastModifiedTime[aMode] != aFile.lastModifiedTime){
2694                                        if(!bitsObjectMng.Database.lockDB(aMode)) return false;
2695                                        bitsObjectMng.Database._updateLastModifiedTime(aMode);
2696                                        rtn = true;
2697                                        bitsObjectMng.Database.unlockDB(aMode);
2698                                }
2699                        }
2700                        return rtn;
2701                },
2702
2703/////////////////////////////////////////////////////////////////////
2704                addEventListener : function(aType,aFunc,aBool,aMode){
2705                        if(!aType || !aFunc) return;
2706                        if(aMode == undefined || aMode == "") aMode = bitsObjectMng.Database._defaultMode;
2707                        aType = aType.toLowerCase();
2708                        aMode = aMode.toLowerCase();
2709                        if(!this._Listener) this._Listener = [];
2710                        if(!this._Listener[aMode]) this._Listener[aMode] = [];
2711                        if(!this._Listener[aMode][aType]) this._Listener[aMode][aType] = [];
2712                        if(!this._Listener[aMode][aType][aFunc]) this._Listener[aMode][aType][aFunc] = aFunc;
2713                },
2714
2715/////////////////////////////////////////////////////////////////////
2716                removeEventListener : function(aType,aFunc,aBool,aMode){
2717                        if(!aType || !aFunc) return;
2718                        if(aMode == undefined || aMode == "") aMode = bitsObjectMng.Database._defaultMode;
2719                        aType = aType.toLowerCase();
2720                        aMode = aMode.toLowerCase();
2721                        if(!this._Listener) return;
2722                        if(!this._Listener[aMode]) return;
2723                        if(!this._Listener[aMode][aType]) return;
2724                        if(this._Listener[aMode][aType][aFunc]) this._Listener[aMode][aType][aFunc] = undefined;
2725                },
2726
2727/////////////////////////////////////////////////////////////////////
2728                _execEventListener : function(aType,aBool,aMode){
2729                        if(!aType) return;
2730                        if(aMode == undefined || aMode == "") aMode = bitsObjectMng.Database._defaultMode;
2731                        aType = aType.toLowerCase();
2732                        aMode = aMode.toLowerCase();
2733                        if(!this._Listener) return;
2734                        if(!this._Listener[aMode]) return;
2735                        if(!this._Listener[aMode][aType]) return;
2736                        var key;
2737                        for(key in this._Listener[aMode][aType]){
2738                                var func = this._Listener[aMode][aType][key];
2739                                if(func) (func)();
2740                        }
2741                },
2742
2743/////////////////////////////////////////////////////////////////////
2744                _getConnectFile : function(aMode){
2745                        var dbFile = null;
2746                        if(typeof(aMode) == "string"){
2747                                if(aMode == this._defaultMode){
2748                                        dbFile = bitsObjectMng.Common.getExtensionDir().clone();
2749                                        var olddb = dbFile.clone();
2750                                        olddb.append("objectmng.sqlite");
2751                                        if(olddb.exists()) olddb.moveTo(dbFile,aMode+".sqlite");
2752                                        dbFile.append(aMode+".sqlite");
2753                                }else{
2754                                        var dbpath = nsPreferences.copyUnicharPref("wiredmarker.dbpath."+aMode,"");
2755                                        if(dbpath == ""){
2756                                                var dir = bitsObjectMng.Common.getExtensionDir().clone();
2757                                                if(!dir.exists()) dir.create(dir.DIRECTORY_TYPE, 0770);
2758                                                dbpath = dir.path;
2759                                        }
2760                                        if(dbpath != ""){
2761                                                dbFile = bitsObjectMng.Common.convertPathToFile(dbpath);
2762                                                if(!dbFile.exists()) dbFile.create(dir.DIRECTORY_TYPE, 0777);
2763                                                dbFile.append(aMode+".sqlite");
2764                                        }
2765                                }
2766                        }
2767                        return dbFile;
2768                },
2769
2770/////////////////////////////////////////////////////////////////////
2771                connect : function(aMode,aDBFile){
2772                        var dbFile = undefined;
2773                        if(aDBFile != undefined){
2774                                dbFile = aDBFile;
2775                        }else{
2776                                dbFile = bitsObjectMng.Database._getConnectFile(aMode);
2777                        }
2778                        if(!this._dbConn[aMode] && dbFile){
2779                                try{
2780                                        this._dbConn[aMode] = bitsObjectMng.Common.STORAGE.openDatabase(dbFile);
2781                                }catch(e){
2782                                        bitsObjectMng._dump("bitsObjectMng.Database.connect("+aMode+","+dbFile.path+"):"+e)
2783                                        this._dbConn[aMode] = undefined;
2784                                }
2785                        }
2786                        return (this._dbConn[aMode] != undefined);
2787                },
2788/////////////////////////////////////////////////////////////////////
2789                disconnect : function(aMode,aVacuum){
2790                        if(aMode == undefined || aMode == "") aMode = bitsObjectMng.Database._defaultMode;
2791                        if(aVacuum == undefined) aVacuum = false;
2792                        try{
2793                                if(aVacuum) this.vacuum(aMode);
2794                        }catch(ex){};
2795                        this._dbConn[aMode] = undefined;
2796                },
2797
2798/////////////////////////////////////////////////////////////////////
2799                vacuum : function(aMode){
2800                        if(aMode == undefined || aMode == "") aMode = bitsObjectMng.Database._defaultMode;
2801                        try{
2802                                this._dbConn[aMode].executeSimpleSQL("VACUUM");
2803                        }catch(ex){
2804                                bitsObjectMng._dump("bitsObjectMng.Database.vacuum():"+ex);
2805                        };
2806                },
2807
2808/////////////////////////////////////////////////////////////////////
2809                getDatabaseFile : function(aMode){
2810                        if(aMode == undefined || aMode == "") aMode = bitsObjectMng.Database._defaultMode;
2811                        if(this._dbConn[aMode] == undefined) this.init(aMode);
2812                        return this._dbConn[aMode].databaseFile;
2813                },
2814
2815/////////////////////////////////////////////////////////////////////
2816                attach : function(aAttachMode,aMode){
2817                        if(!aAttachMode) return false;
2818                        if(this._dbConn[aAttachMode] == undefined) this.init(aAttachMode);
2819                        if(!this._dbConn[aAttachMode]) return false;
2820                        var path = this._dbConn[aAttachMode].databaseFile.path;
2821                        var sql = 'ATTACH DATABASE "'+ path + '" AS "' + aAttachMode + '"';
2822                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
2823                        try{
2824                                this._dbConn[aMode].executeSimpleSQL(sql);
2825                        }catch(ex){
2826                                bitsObjectMng._dump("bitsObjectMng.Database.attach():"+ex);
2827                                bitsObjectMng._dump("bitsObjectMng.Database.attach():"+sql);
2828                                return false;
2829                        }
2830                        return true;
2831                },
2832
2833/////////////////////////////////////////////////////////////////////
2834                _createTable : function(aMode){
2835                        var ourTransaction = false;
2836                        try{
2837                                var createTable = !this._dbConn[aMode].tableExists("om_object");
2838                                if(!createTable) createTable = !this._dbConn[aMode].tableExists("om_link");
2839                                if(!createTable) createTable = !this._dbConn[aMode].tableExists("om_folder");
2840                                if(!createTable) createTable = !this._dbConn[aMode].tableExists("om_favicon");
2841
2842                                if(!createTable) createTable = !this._dbConn[aMode].indexExists("om_object_index_url");
2843                                if(!createTable) createTable = !this._dbConn[aMode].indexExists("om_object_index_type");
2844                                if(!createTable) createTable = !this._dbConn[aMode].indexExists("om_object_index_oid");
2845                                if(!createTable) createTable = !this._dbConn[aMode].indexExists("om_object_index_con_url");
2846                                if(!createTable) createTable = !this._dbConn[aMode].indexExists("om_object_index_oid_date");
2847
2848                                if(!createTable) createTable = !this._dbConn[aMode].indexExists("om_link_index_pfid");
2849                                if(!createTable) createTable = !this._dbConn[aMode].indexExists("om_link_index_oid");
2850
2851                                if(!createTable) createTable = !this._dbConn[aMode].indexExists("om_folder_index_pfid");
2852
2853                                if(createTable){
2854                                        if(!this.beginTransaction(aMode)) return;
2855                                        if(!this._dbConn[aMode].tableExists("om_object")){
2856                                                this._dbConn[aMode].executeSimpleSQL(
2857                                                        "CREATE TABLE om_object (" +
2858                                                        "  oid          INTEGER," +
2859                                                        "  doc_title    TEXT NOT NULL," +
2860                                                        "  doc_url      TEXT NOT NULL," +
2861                                                        "  con_url      TEXT NOT NULL," +
2862                                                        "  bgn_dom      TEXT," +
2863                                                        "  end_dom      TEXT," +
2864                                                        "  oid_title    TEXT," +
2865                                                        "  oid_property TEXT," +
2866                                                        "  oid_mode     INTEGER DEFAULT 0," +
2867                                                        "  oid_type     TEXT NOT NULL," +
2868                                                        "  oid_txt      TEXT," +
2869                                                        "  oid_img      BLOB DEFAULT NULL,"+
2870                                                        "  oid_date     TEXT," +
2871                                                        "  dasish_aid   TEXT," + // annotation id from DASISH REST backend response
2872                                                        "PRIMARY KEY (oid)"+
2873                                                        ")"
2874                                                );
2875                                                if(!this._dbConn[aMode].tableExists("om_version")){
2876                                                        this._dbConn[aMode].executeSimpleSQL(
2877                                                                "CREATE TABLE om_version (" +
2878                                                                "  version      NUMERIC NOT NULL" +
2879                                                                ")"
2880                                                        );
2881                                                        this._dbConn[aMode].executeSimpleSQL("insert into om_version (version) values ('"+this.version+"')");
2882                                                }
2883                                        }
2884                                        if(!this._dbConn[aMode].tableExists("om_link")){
2885                                                this._dbConn[aMode].executeSimpleSQL(
2886                                                        "CREATE TABLE om_link (" +
2887                                                        "  oid        INTEGER," +
2888                                                        "  pfid       INTEGER," +
2889                                                        "  pfid_order INTEGER," +
2890                                                        "PRIMARY KEY (oid,pfid)"+
2891                                                        ")"
2892                                                );
2893                                        }
2894                                        if(!this._dbConn[aMode].tableExists("om_folder")){
2895                                                this._dbConn[aMode].executeSimpleSQL(
2896                                                        "CREATE TABLE om_folder (" +
2897                                                        "  fid          INTEGER," +
2898                                                        "  pfid         INTEGER NOT NULL," +
2899                                                        "  pfid_order   INTEGER NOT NULL," +
2900                                                        "  fid_title    TEXT," +
2901                                                        "  fid_property TEXT," +
2902                                                        "  fid_mode     INTEGER DEFAULT 0," +
2903                                                        "  fid_style    TEXT," +
2904                                                        "PRIMARY KEY (fid)"+
2905                                                        ")"
2906                                                );
2907                                        }
2908                                        if(!this._dbConn[aMode].tableExists("om_favicon")){
2909                                                this._dbConn[aMode].executeSimpleSQL(
2910                                                        "CREATE TABLE om_favicon (" +
2911                                                        "  favicon_url  TEXT NOT NULL," +
2912                                                        "  favicon_mime TEXT NOT NULL," +
2913                                                        "  favicon_img  BLOB DEFAULT NULL,"+
2914                                                        "PRIMARY KEY (favicon_url)"+
2915                                                        ")"
2916                                                );
2917                                        }
2918                                        try{if(!this._dbConn[aMode].indexExists("om_object_index_url"))      this._dbConn[aMode].executeSimpleSQL("CREATE INDEX om_object_index_url  ON om_object(doc_url);");}catch(ex){}
2919                                        try{if(!this._dbConn[aMode].indexExists("om_object_index_type"))     this._dbConn[aMode].executeSimpleSQL("CREATE INDEX om_object_index_type ON om_object(oid_type);");}catch(ex){}
2920                                        try{if(!this._dbConn[aMode].indexExists("om_object_index_oid"))      this._dbConn[aMode].executeSimpleSQL("CREATE INDEX om_object_index_oid  ON om_object(oid);");}catch(ex){}
2921                                        try{if(!this._dbConn[aMode].indexExists("om_object_index_con_url"))  this._dbConn[aMode].executeSimpleSQL("CREATE INDEX om_object_index_con_url ON om_object(con_url);");}catch(ex){}
2922                                        try{if(!this._dbConn[aMode].indexExists("om_object_index_oid_date")) this._dbConn[aMode].executeSimpleSQL("CREATE INDEX om_object_index_oid_date ON om_object(oid_date);");}catch(ex){}
2923
2924                                        try{if(!this._dbConn[aMode].indexExists("om_link_index_pfid")) this._dbConn[aMode].executeSimpleSQL("CREATE INDEX om_link_index_pfid ON om_link(pfid);");}catch(ex){}
2925                                        try{if(!this._dbConn[aMode].indexExists("om_link_index_oid"))  this._dbConn[aMode].executeSimpleSQL("CREATE INDEX om_link_index_oid  ON om_link(oid);");}catch(ex){}
2926
2927                                        try{if(!this._dbConn[aMode].indexExists("om_folder_index_pfid")) this._dbConn[aMode].executeSimpleSQL("CREATE INDEX om_folder_index_pfid ON om_folder(pfid);");}catch(ex){}
2928
2929                                        this.endTransaction(aMode);
2930                                }
2931                        }
2932                        finally {
2933                                if(this._dbConn[aMode].lastError) bitsObjectMng._dump("_createTable():"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")");
2934                                if(ourTransaction){
2935                                        this._dbConn[aMode].rollbackTransaction();
2936                                        ourTransaction = false;
2937                                }
2938                        }
2939                        if(ourTransaction) this._dbConn[aMode].commitTransaction();
2940                },
2941
2942/////////////////////////////////////////////////////////////////////
2943                lockDB : function(aMode){
2944                        return true;
2945                },
2946
2947/////////////////////////////////////////////////////////////////////
2948                unlockDB : function(aMode){
2949                        return true;
2950                },
2951
2952/////////////////////////////////////////////////////////////////////
2953                beginTransaction : function(aMode){
2954                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
2955                        if(this._dbConn[aMode] == undefined) this.init(aMode);
2956                        if(this._dbConn[aMode] == undefined) return false;
2957                        try{
2958                                if(bitsObjectMng.Database.lockDB(aMode)){
2959                                        this._dbConn[aMode].executeSimpleSQL("BEGIN TRANSACTION");
2960                                        return true;
2961                                }else{
2962                                        return false;
2963                                }
2964                        }catch(ex){
2965                                bitsObjectMng._dump("bitsObjectMng.Database.beginTransaction("+aMode+"):"+ex);
2966                                bitsObjectMng.Database.unlockDB(aMode)
2967                                return false;
2968                        }
2969                },
2970
2971/////////////////////////////////////////////////////////////////////
2972                endTransaction : function(aMode){
2973                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
2974                        if(this._dbConn[aMode] == undefined) this.init(aMode);
2975                        if(this._dbConn[aMode] == undefined) return null;
2976                        try{
2977                                this._dbConn[aMode].executeSimpleSQL("END TRANSACTION");
2978                                bitsObjectMng.Database.unlockDB(aMode)
2979                                return true;
2980                        }catch(ex){
2981                                return false;
2982                        }
2983                },
2984
2985/////////////////////////////////////////////////////////////////////
2986                select : function(aMode,aSql,aTransaction){
2987                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
2988                        if(aTransaction == undefined) aTransaction = true;
2989                        if(this._dbConn[aMode] == undefined) this.init(aMode);
2990                        if(this._dbConn[aMode] == undefined) return null;
2991                        var ourTransaction = false;
2992                        if(aTransaction) if(!this.beginTransaction(aMode)) return null;
2993                        var i;
2994                        try{
2995                                var statement = this._dbConn[aMode].createStatement(aSql);
2996                                var k=statement.columnCount;
2997                                var columnNames = [];
2998                                for(i=0;i<k;i++){
2999                                        columnNames.push(statement.getColumnName(i));
3000                                }
3001                        }catch(ex){
3002                                bitsObjectMng._dump("select(1):"+ex);
3003                                bitsObjectMng._dump("bitsObjectMng.Database.select():aSql="+aSql);
3004                                return null;
3005                        }
3006                        var dataset = [];
3007                        try{
3008                                while(statement.executeStep()){
3009                                        var row = [];
3010                                        var utf8String;
3011                                        for(i=0;i<k;i++){
3012                                                utf8String = statement.getUTF8String(i);
3013                                                row[columnNames[i]] = utf8String ? utf8String : "";
3014                                        }
3015                                        dataset.push(row);
3016                                }
3017                                columnNames = undefined;
3018                        }
3019                        finally {
3020                                if(this._dbConn[aMode].lastError > 0 && this._dbConn[aMode].lastError <= 100){
3021                                        bitsObjectMng._dump("select(3):"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")\n\n"+aSql);
3022                                }
3023                                if(this._dbConn[aMode].lastError && this._dbConn[aMode].lastError != 101){
3024                                        bitsObjectMng._dump("select(2):"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")\n\n"+aSql);
3025                                        dataset = null;
3026                                }
3027                                if(ourTransaction && this._dbConn[aMode].lastError && this._dbConn[aMode].lastError != 101){
3028                                        this._dbConn[aMode].rollbackTransaction();
3029                                        ourTransaction = false;
3030                                }
3031                                statement.reset();
3032                        }
3033                        if(aTransaction) this.endTransaction(aMode);
3034                        return dataset;
3035                },
3036
3037/////////////////////////////////////////////////////////////////////
3038                selectB : function(aMode,aSql,aPara,aTransaction){
3039                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3040                        if(aTransaction == undefined) aTransaction = true;
3041                        if(this._dbConn[aMode] == undefined) this.init(aMode);
3042                        if(this._dbConn[aMode] == undefined) return null;
3043                        var ourTransaction = false;
3044                        if(aTransaction) if(!this.beginTransaction(aMode)) return null;
3045                        var i;
3046                        try{
3047                                var statement = this._dbConn[aMode].createStatement(aSql);
3048                                if(aPara){
3049                                        var i;
3050                                        for(i=0;i<aPara.length;i++){
3051                                                this._setStatementValue(statement,i,aPara[i]);
3052                                        }
3053                                }
3054                                var k=statement.columnCount;
3055                                var columnNames = [];
3056                                for(i=0;i<k;i++){
3057                                        columnNames.push(statement.getColumnName(i));
3058                                }
3059                        }catch(ex){
3060                                bitsObjectMng._dump("bitsObjectMng.Database.selectB(1):"+ex);
3061                                bitsObjectMng._dump("bitsObjectMng.Database.selectB():aSql="+aSql);
3062                                return null;
3063                        }
3064                        var dataset = [];
3065                        try{
3066                                while(statement.executeStep()){
3067                                        var row = {};
3068                                        var utf8String;
3069                                        for(i=0;i<k;i++){
3070                                                utf8String = statement.getUTF8String(i);
3071                                                row[columnNames[i]] = utf8String ? utf8String : "";
3072                                        }
3073                                        dataset.push(row);
3074                                }
3075                                columnNames = undefined;
3076                        }
3077                        finally {
3078                                if(this._dbConn[aMode].lastError > 0 && this._dbConn[aMode].lastError <= 100){
3079                                        bitsObjectMng._dump("selectB(3):"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")\n\n"+aSql);
3080                                }
3081                                if(this._dbConn[aMode].lastError && this._dbConn[aMode].lastError != 101){
3082                                        bitsObjectMng._dump("selectB(2):"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")\n\n"+aSql);
3083                                        dataset = null;
3084                                }
3085                                if(ourTransaction && this._dbConn[aMode].lastError && this._dbConn[aMode].lastError != 101){
3086                                        this._dbConn[aMode].rollbackTransaction();
3087                                        ourTransaction = false;
3088                                }
3089                                statement.reset();
3090                        }
3091                        if(aTransaction) this.endTransaction(aMode);
3092                        return dataset;
3093                },
3094
3095/////////////////////////////////////////////////////////////////////
3096                selectBF : function(aMode,aSql,aPara,aFindRegExp,aTransaction){
3097                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3098                        if(aTransaction == undefined) aTransaction = true;
3099                        if(this._dbConn[aMode] == undefined) this.init(aMode);
3100                        if(this._dbConn[aMode] == undefined) return null;
3101                        var ourTransaction = false;
3102                        if(aTransaction) if(!this.beginTransaction(aMode)) return null;
3103                        var i;
3104                        try{
3105                                var statement = this._dbConn[aMode].createStatement(aSql);
3106                                if(aPara){
3107                                        var i;
3108                                        for(i=0;i<aPara.length;i++){
3109                                                this._setStatementValue(statement,i,aPara[i]);
3110                                        }
3111                                }
3112                                var k=statement.columnCount;
3113                                var columnNames = [];
3114                                for(i=0;i<k;i++){
3115                                        columnNames.push(statement.getColumnName(i));
3116                                }
3117                        }catch(ex){
3118                                bitsObjectMng._dump("bitsObjectMng.Database.selectBF(1):"+ex);
3119                                bitsObjectMng._dump("bitsObjectMng.Database.selectBF():aSql="+aSql);
3120                                return null;
3121                        }
3122                        var dataset = [];
3123                        try{
3124                                while(statement.executeStep()){
3125                                        var arr = [];
3126                                        var row = {};
3127                                        var utf8String;
3128                                        for(i=0;i<k;i++){
3129                                                utf8String = statement.getUTF8String(i);
3130                                                row[columnNames[i]] = utf8String ? utf8String : "";
3131                                                arr.push(utf8String ? utf8String : "");
3132                                        }
3133                                        if(arr.join("\n").match(aFindRegExp)) dataset.push(row);
3134                                }
3135                                columnNames = undefined;
3136                        }
3137                        finally {
3138                                if(this._dbConn[aMode].lastError > 0 && this._dbConn[aMode].lastError <= 100){
3139                                        bitsObjectMng._dump("selectBF(3):"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")\n\n"+aSql);
3140                                }
3141                                if(this._dbConn[aMode].lastError && this._dbConn[aMode].lastError != 101){
3142                                        bitsObjectMng._dump("selectBF(2):"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")\n\n"+aSql);
3143                                        dataset = null;
3144                                }
3145                                if(ourTransaction && this._dbConn[aMode].lastError && this._dbConn[aMode].lastError != 101){
3146                                        this._dbConn[aMode].rollbackTransaction();
3147                                        ourTransaction = false;
3148                                }
3149                                statement.reset();
3150                        }
3151                        if(aTransaction) this.endTransaction(aMode);
3152                        return dataset;
3153                },
3154
3155/////////////////////////////////////////////////////////////////////
3156                selectCount : function(aMode,aSql,aTransaction){
3157                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3158                        if(aTransaction == undefined) aTransaction = true;
3159                        if(this._dbConn[aMode] == undefined) this.init(aMode);
3160                        if(this._dbConn[aMode] == undefined) return null;
3161                        var ourTransaction = false;
3162                        if(aTransaction) if(!this.beginTransaction(aMode)) return null;
3163                        try{
3164                                var statement = this._dbConn[aMode].createStatement(aSql);
3165                        }catch(ex){
3166                                bitsObjectMng._dump("selectCount():"+ex);
3167                                bitsObjectMng._dump("bitsObjectMng.Database.selectCount():aSql="+aSql);
3168                                return null;
3169                        }
3170                        var rtnCount = 0;
3171                        try{
3172                                if(statement.executeStep()) rtnCount = statement.getInt32(0);
3173                        }
3174                        finally {
3175                                if(this._dbConn[aMode].lastError && this._dbConn[aMode].lastError != 100){
3176                                        bitsObjectMng._dump("selectCount():"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")\n\n"+aSql);
3177                                        dataset = 0;
3178                                }
3179                                if(ourTransaction && this._dbConn[aMode].lastError && this._dbConn[aMode].lastError != 101){
3180                                        this._dbConn[aMode].rollbackTransaction();
3181                                        ourTransaction = false;
3182                                }
3183                                statement.reset();
3184                        }
3185                        if(aTransaction) this.endTransaction(aMode);
3186                        return rtnCount;
3187                },
3188
3189/////////////////////////////////////////////////////////////////////
3190                selectCountB : function(aMode,aSql,aPara,aTransaction){
3191                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3192                        if(aTransaction == undefined) aTransaction = true;
3193                        if(this._dbConn[aMode] == undefined) this.init(aMode);
3194                        if(this._dbConn[aMode] == undefined) return null;
3195                        var ourTransaction = false;
3196                        if(aTransaction) if(!this.beginTransaction(aMode)) return null;
3197                        try{
3198                                var statement = this._dbConn[aMode].createStatement(aSql);
3199                                if(aPara){
3200                                        var i;
3201                                        for(i=0;i<aPara.length;i++){
3202                                                this._setStatementValue(statement,i,aPara[i]);
3203                                        }
3204                                }
3205                        }catch(ex){
3206                                bitsObjectMng._dump("bitsObjectMng.Database.selectCountB():"+ex);
3207                                bitsObjectMng._dump("bitsObjectMng.Database.selectCountB():aSql="+aSql);
3208                                return null;
3209                        }
3210                        var rtnCount = 0;
3211                        try{
3212                                if(statement.executeStep()) rtnCount = statement.getInt32(0);
3213                        }
3214                        finally {
3215                                if(this._dbConn[aMode].lastError && this._dbConn[aMode].lastError != 100){
3216                                        bitsObjectMng._dump("selectCountB():"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")\n\n"+aSql);
3217                                        dataset = 0;
3218                                }
3219                                if(ourTransaction && this._dbConn[aMode].lastError && this._dbConn[aMode].lastError != 101){
3220                                        this._dbConn[aMode].rollbackTransaction();
3221                                        ourTransaction = false;
3222                                }
3223                                statement.reset();
3224                        }
3225                        if(aTransaction) this.endTransaction(aMode);
3226                        return rtnCount;
3227                },
3228
3229/////////////////////////////////////////////////////////////////////
3230                cmd : function(aMode,aSql,aTransaction){
3231                        var rtn = true;
3232                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3233                        if(aTransaction == undefined) aTransaction = true;
3234                        if(this._dbConn[aMode] == undefined) this.init(aMode);
3235                        if(this._dbConn[aMode] == undefined) return false;
3236                        var ourTransaction = false;
3237                        if(aTransaction) if(!this.beginTransaction(aMode)) return null;
3238                        try{
3239                                var statement = this._dbConn[aMode].createStatement(aSql);
3240                        }catch(ex){
3241                                bitsObjectMng._dump("cmd():"+ex);
3242                                bitsObjectMng._dump("bitsObjectMng.Database.cmd():aSql="+aSql);
3243                                return false;
3244                        }
3245                        try{
3246                                statement.execute();
3247                        }
3248                        finally {
3249                                if(this._dbConn[aMode].lastError){
3250                                        bitsObjectMng._dump("cmd():"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")");
3251                                        bitsObjectMng._dump("bitsObjectMng.Database.cmd():aSql="+aSql);
3252                                        rtn = false;
3253                                }
3254                                if(ourTransaction && this._dbConn[aMode].lastError){
3255                                        this._dbConn[aMode].rollbackTransaction();
3256                                        ourTransaction = false;
3257                                }
3258                                statement.reset();
3259                        }
3260                        if(ourTransaction) this._dbConn[aMode].commitTransaction();
3261                        if(aTransaction) this.endTransaction(aMode);
3262                        return rtn;
3263                },
3264
3265/////////////////////////////////////////////////////////////////////
3266                cmdB : function(aMode,aSql,aPara,aTransaction){
3267                        var rtn = true;
3268                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3269                        if(aTransaction == undefined) aTransaction = true;
3270                        if(this._dbConn[aMode] == undefined) this.init(aMode);
3271                        if(this._dbConn[aMode] == undefined) return false;
3272                        var ourTransaction = false;
3273                        if(aTransaction) if(!this.beginTransaction(aMode)) return null;
3274                        try{
3275                                var statement = this._dbConn[aMode].createStatement(aSql);
3276                                if(aPara){
3277                                        var i;
3278                                        for(i=0;i<aPara.length;i++){
3279                                                this._setStatementValue(statement,i,aPara[i]);
3280                                        }
3281                                }
3282                        }catch(ex){
3283                                bitsObjectMng._dump("bitsObjectMng.Database.cmdB():"+ex);
3284                                bitsObjectMng._dump("bitsObjectMng.Database.cmdB():aSql="+aSql);
3285                                return false;
3286                        }
3287                        try{
3288                                statement.execute();
3289                        }
3290                        finally {
3291                                if(this._dbConn[aMode].lastError){
3292                                        bitsObjectMng._dump("bitsObjectMng.Database.cmdB():"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")");
3293                                        bitsObjectMng._dump("bitsObjectMng.Database.cmdB():aSql="+aSql);
3294                                        rtn = false;
3295                                }
3296                                if(ourTransaction && this._dbConn[aMode].lastError){
3297                                        this._dbConn[aMode].rollbackTransaction();
3298                                        ourTransaction = false;
3299                                }
3300                                statement.reset();
3301                        }
3302                        if(ourTransaction) this._dbConn[aMode].commitTransaction();
3303                        if(aTransaction) this.endTransaction(aMode);
3304                        return rtn;
3305                },
3306
3307/////////////////////////////////////////////////////////////////////
3308                cmdArray : function(aMode,aSql,aTransaction){
3309                        var rtn = true;
3310                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3311                        if(aTransaction == undefined) aTransaction = true;
3312                        if(this._dbConn[aMode] == undefined) this.init(aMode);
3313                        if(this._dbConn[aMode] == undefined) return false;
3314                        var ourTransaction = false;
3315                        if(aTransaction) if(!this.beginTransaction(aMode)) return null;
3316                        var cnt;
3317                        for(cnt=0;cnt<aSql.length;cnt++){
3318                                try{
3319                                        var statement = this._dbConn[aMode].createStatement(aSql[cnt]);
3320                                }catch(ex){
3321                                        bitsObjectMng._dump("bitsObjectMng.Database.cmdArray():"+ex);
3322                                        bitsObjectMng._dump("bitsObjectMng.Database.cmdArray():aSql="+aSql[cnt]);
3323                                        return false;
3324                                }
3325                                try{
3326                                        statement.execute();
3327                                }
3328                                finally {
3329                                        if(this._dbConn[aMode].lastError){
3330                                                bitsObjectMng._dump("bitsObjectMng.Database.cmdArray():"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")");
3331                                                rtn = false;
3332                                        }
3333                                        if(ourTransaction && !rtn){
3334                                                this._dbConn[aMode].rollbackTransaction();
3335                                                ourTransaction = false;
3336                                        }
3337                                        statement.reset();
3338                                        if(!rtn) break;
3339                                }
3340                        }
3341                        if(ourTransaction) this._dbConn[aMode].commitTransaction();
3342                        if(aTransaction) this.endTransaction(aMode);
3343                        return rtn;
3344                },
3345
3346/////////////////////////////////////////////////////////////////////
3347                cmdArrayB : function(aMode,aSql,aPara,aTransaction){
3348                        var rtn = true;
3349                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3350                        if(aTransaction == undefined) aTransaction = true;
3351                        if(this._dbConn[aMode] == undefined) this.init(aMode);
3352                        if(this._dbConn[aMode] == undefined) return false;
3353                        var ourTransaction = false;
3354                        if(aTransaction) if(!this.beginTransaction(aMode)) return null;
3355                        var cnt;
3356                        for(cnt=0;cnt<aSql.length;cnt++){
3357                                try{
3358                                        var statement = this._dbConn[aMode].createStatement(aSql[cnt]);
3359                                        if(aPara){
3360                                                var i;
3361                                                for(i=0;i<aPara[cnt].length;i++){
3362                                                        this._setStatementValue(statement,i,aPara[cnt][i]);
3363                                                }
3364                                        }
3365                                }catch(ex){
3366                                        bitsObjectMng._dump("bitsObjectMng.Database.cmdArrayB():"+ex);
3367                                        bitsObjectMng._dump("bitsObjectMng.Database.cmdArrayB():aSql="+aSql[cnt]);
3368                                        if(this._dbConn[aMode].lastError) bitsObjectMng._dump("bitsObjectMng.Database.cmdArrayB():"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")");
3369                                        return false;
3370                                }
3371                                try{
3372                                        statement.execute();
3373                                }
3374                                finally {
3375                                        if(this._dbConn[aMode].lastError){
3376                                                bitsObjectMng._dump("bitsObjectMng.Database.cmdArrayB():"+this._dbConn[aMode].lastErrorString+" ("+this._dbConn[aMode].lastError+")");
3377                                                rtn = false;
3378                                        }
3379                                        if(ourTransaction && !rtn){
3380                                                this._dbConn[aMode].rollbackTransaction();
3381                                                ourTransaction = false;
3382                                        }
3383                                        statement.reset();
3384                                        if(!rtn) break;
3385                                }
3386                        }
3387                        if(ourTransaction) this._dbConn[aMode].commitTransaction();
3388                        if(aTransaction) this.endTransaction(aMode);
3389                        return rtn;
3390                },
3391
3392/////////////////////////////////////////////////////////////////////
3393                newObject : function(aID,aMode,aTransaction){
3394                        try{
3395                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3396                                if(aTransaction == undefined) aTransaction = true;
3397                                if(aID == undefined){
3398                                        aID = this._oidIdentify(aMode,bitsObjectMng.Common.getTimeStamp(),aTransaction);
3399                                }else{
3400                                        aID = this._oidIdentify(aMode,aID,aTransaction);
3401                                }
3402                                return {
3403                                        oid          : ""+aID,
3404                                        pfid         : ""+0 ,
3405                                        doc_title    : "",
3406                                        doc_url      : "",
3407                                        con_url      : "",
3408                                        bgn_dom      : "" ,
3409                                        end_dom      : "",
3410                                        oid_title    : "",
3411                                        oid_property : "" ,
3412                                        oid_mode     : ""+0,
3413                                        oid_type     : "" ,
3414                                        oid_txt      : "",
3415                                        oid_img      : null,
3416                                        oid_date     : "",
3417                                };
3418                        }catch(ex){
3419                                bitsObjectMng._dump("Database.newObject():"+ex);
3420                                return null;
3421                        }
3422                },
3423
3424/////////////////////////////////////////////////////////////////////
3425                newFolder : function(aID,aMode,aTransaction){
3426                        try{
3427                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3428                                if(aTransaction == undefined) aTransaction = true;
3429                                if(aID == undefined){
3430                                        aID = this._fidIdentify(aMode,bitsObjectMng.Common.getTimeStamp(),aTransaction);
3431                                }else{
3432                                        aID = this._fidIdentify(aMode,aID,aTransaction);
3433                                }
3434                                return {
3435                                        fid          : ""+aID,
3436                                        pfid         : ""+0 ,
3437                                        pfid_order   : ""+0,
3438                                        fid_title    : ""+0,
3439                                        fid_property : "" ,
3440                                        fid_mode     : ""+0,
3441                                        fid_style    : "",
3442                                };
3443                        }catch(ex){
3444                                bitsObjectMng._dump("Database.newFolder():"+ex);
3445                                return null;
3446                        }
3447                },
3448
3449/////////////////////////////////////////////////////////////////////
3450                existsObject : function(aObject,aMode){
3451                        try{
3452                                if(!aObject) return false;
3453                                if(aMode == undefined || aMode == ""){
3454                                        var rtn = false;
3455                                        var mode;
3456                                        for(mode in this._dbConn){
3457                                                if(typeof this._dbConn[mode] == "function") continue;
3458                                                var tmp = bitsObjectMng.Database.existsObject(aObject,mode);
3459                                                if(tmp) rtn = tmp;
3460                                        }
3461                                        return rtn;
3462                                }
3463                                var para = [];
3464                                var where = [];
3465                                var key;
3466                                var index=0;
3467                                for(key in aObject){
3468                                        if(key == "pfid" || key == "pfid_order"){
3469                                                where.push("om_link."+key+"=?"+(++index));
3470                                        }else{
3471                                                where.push("om_object."+key+"=?"+(++index));
3472                                        }
3473                                        para.push(aObject[key]);
3474                                }
3475                                var oSql = 'select' +
3476                                                                        ' count(om_object.oid) as num' +
3477                                                                        ' from om_object' +
3478                                                                        ' LEFT JOIN om_link ON om_link.oid = om_object.oid';
3479                                if(where.length>0) oSql += " where " + where.join(" and ");
3480                                var oFld = this.selectB(aMode,oSql,para);
3481                                if(oFld && oFld.length>0){
3482                                        return (parseInt(oFld[0].num)>0?true:false);
3483                                }else{
3484                                        return false;
3485                                }
3486                        }catch(ex){
3487                                bitsObjectMng._dump("existsObject():"+ex);
3488                                return false;
3489                        }
3490                },
3491
3492/////////////////////////////////////////////////////////////////////
3493                isOpenDB : function(aMode){
3494                        return(this._dbConn[aMode] != undefined);
3495                },
3496
3497/////////////////////////////////////////////////////////////////////
3498                _idExists : function(aMode,aID,aTransaction){
3499                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3500                        if(aTransaction == undefined) aTransaction = true;
3501                        var oSql = 'select count(oid) from om_object where oid="'+aID+'"';
3502                        var oRtn = this.selectCount(aMode,oSql,aTransaction);
3503                        if(oRtn>0) return true;
3504                        var fSql = 'select count(fid) from om_folder where fid="'+aID+'"';
3505                        var fRtn = this.selectCount(aMode,fSql,aTransaction);
3506                        return (fRtn>0);
3507                },
3508
3509/////////////////////////////////////////////////////////////////////
3510                _oidExists : function(aMode,aID,aTransaction){
3511                        if(aTransaction == undefined) aTransaction = true;
3512                        return this._idExists(aMode,aID,aTransaction);
3513                },
3514
3515/////////////////////////////////////////////////////////////////////
3516                _oidIdentify : function(aMode,aID,aTransaction){
3517                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3518                        if(aTransaction == undefined) aTransaction = true;
3519                        var i = 0;
3520                        while(this._oidExists(aMode,aID,aTransaction) && i < 100){
3521                                aID = bitsObjectMng.Common.getTimeStamp(--i);
3522                        }
3523                        return aID;
3524                },
3525
3526/////////////////////////////////////////////////////////////////////
3527                _oidCount : function(aMode,aID,aTransaction){
3528                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3529                        if(aTransaction == undefined) aTransaction = true;
3530                        var aSql = 'select count(oid) from om_link where oid="'+aID+'"';
3531                        var rtn = this.selectCount(aMode,aSql,aTransaction);
3532                        return rtn;
3533                },
3534
3535/////////////////////////////////////////////////////////////////////
3536                _linkExists : function(aMode, aLink, aTransaction){
3537                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3538                        if(aTransaction == undefined) aTransaction = true;
3539                        var oSql = 'select count(oid) from om_link where oid="'+aLink.oid+'" and pfid="'+aLink.pfid+'"';
3540                        var oRtn = this.selectCount(aMode,oSql,aTransaction);
3541                        return (oRtn>0);
3542                },
3543
3544/////////////////////////////////////////////////////////////////////
3545                _fidExists : function(aMode,aID,aTransaction){
3546                        if(aTransaction == undefined) aTransaction = true;
3547                        return this._idExists(aMode,aID,aTransaction);
3548                },
3549
3550/////////////////////////////////////////////////////////////////////
3551                _fidCount : function(aMode,aID){
3552                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3553                        var aSql = 'select count(fid) from om_folder';
3554                        if(aID != undefined) aSql += ' where fid="'+aID+'"'
3555                        var rtn = this.selectCount(aMode,aSql);
3556                        return rtn;
3557                },
3558
3559/////////////////////////////////////////////////////////////////////
3560                _fidIdentify : function(aMode,aID,aTransaction){
3561                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3562                        if(aTransaction == undefined) aTransaction = true;
3563                        var i = 0;
3564                        while(this._fidExists(aMode,aID,aTransaction) && i < 100){
3565                                aID = bitsObjectMng.Common.getTimeStamp(--i);
3566                        }
3567                        return aID;
3568                },
3569
3570/////////////////////////////////////////////////////////////////////
3571                getCountFromPID : function(aPID,aMode){
3572                        if(!aPID) return -1;
3573                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3574                        var aSql = 'select count(pfid) as num from om_folder where pfid='+aPID+' union select count(pfid) as num from om_link where pfid='+aPID;
3575                        var rtn = this.selectCount(aMode,aSql);
3576                        return rtn;
3577                },
3578
3579/////////////////////////////////////////////////////////////////////
3580                addObject : function(aObject,aMode,aTransaction){
3581                    //annotationProxy.log("addObject aMode: "+aMode);
3582                    //annotationProxy.log("addObject aTransaction: "+aTransaction);
3583                    //annotationProxy.log("addObject aObject: "+JSON.stringify(aObject, null, '  '));
3584                    var postToRemote = true;
3585                    if(aMode == 'dasish.remote'){
3586                        aMode = '_uncategorized';
3587                        postToRemote = false;
3588                    }
3589                   
3590                   
3591                        try{
3592                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3593                                if(aTransaction == undefined) aTransaction = true;
3594                                var rtn = true;
3595                                if(aObject.oid == undefined || aObject.pfid == undefined){
3596                                        rtn = false;
3597                                }
3598                                if(rtn && aObject.pfid != "0"){
3599                                        rtn = this._fidExists(aMode,aObject.pfid,aTransaction);
3600                                        if(!rtn) bitsObjectMng._dump("bitsObjectMng.Database.addObject():aObject.pfid="+aObject.pfid);
3601                                }
3602                                if(aObject.style) delete aObject.style;
3603                                if(aObject.cssstyle) delete aObject.cssstyle;
3604                                if(aObject.oid_property) aObject.oid_property = this._updateOidProperty(aObject,aMode);
3605                                if(rtn){
3606                                        var lcolumns = [];
3607                                        var lvalues = [];
3608                                        var lpara = [];
3609                                        var lindex = 0;
3610                                        var columns = [];
3611                                        var values = [];
3612                                        var para = [];
3613                                        var index = 0;
3614                                        var key;
3615                                        for(key in aObject){
3616                                                if(!aObject[key] || aObject[key] == "") continue;
3617                                                if(key == "pfid" || key == "pfid_order"){
3618                                                        lcolumns.push(key);
3619                                                        lvalues.push('?'+(++lindex));
3620                                                        lpara.push(aObject[key]);
3621                                                        continue;
3622                                                }
3623                                                if(key == "oid"){
3624                                                        lcolumns.push(key);
3625                                                        lvalues.push('?'+(++lindex));
3626                                                        lpara.push(aObject[key]);
3627                                                }
3628                                                columns.push(key);
3629                                                values.push('?'+(++index));
3630                                                para.push(aObject[key]);
3631                                        }
3632                                        if(columns.length == 0) rtn = false;
3633                                        if(rtn){
3634                                                var sqlArr = [];
3635                                                var sqlPara = [];
3636                                                var aSql1 = "insert into om_link ("+ lcolumns.join(",") +") values ("+ lvalues.join(",") +")";
3637                                                var aSql2 = "insert into om_object ("+ columns.join(",") +") values ("+ values.join(",") +")";
3638                                                //alert("INSERT "+aObject.note);
3639                                               
3640                                                if(postToRemote == true) {
3641                                                    annotationProxy.postAnnotation(aObject);
3642                                                }
3643                                                sqlArr.push(aSql1);
3644                                                sqlArr.push(aSql2);
3645                                                sqlPara.push(lpara);
3646                                                sqlPara.push(para);
3647                                                rtn = this.cmdArrayB(aMode,sqlArr,sqlPara,aTransaction);
3648                                                if(!rtn){
3649                                                        bitsObjectMng._dump("bitsObjectMng.Database.addObject():aSql1="+aSql1);
3650                                                        bitsObjectMng._dump("bitsObjectMng.Database.addObject():aSql2="+aSql2);
3651                                                }
3652                                        }
3653                                }
3654                                if(!rtn) rtn = this._oidExists(aMode,aObject.oid,aTransaction);
3655                                if(rtn) nsPreferences.setUnicharPref("wiredmarker.last_update", bitsObjectMng.Common.getTimeStamp()+"\t"+aMode+"\t"+bitsObjectMng.DataSource.inittime + "\tINSERT\tOBJECT");
3656                        }catch(ex){
3657                                bitsObjectMng._dump("Database.addObject():"+ex);
3658                        }
3659                        return rtn;
3660                },
3661
3662/////////////////////////////////////////////////////////////////////
3663                addLink : function(aLink,aMode,aTransaction){
3664                        try{
3665                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3666                                if(aTransaction == undefined) aTransaction = true;
3667                                var rtn = true;
3668                                if(!aLink || aLink.oid == undefined || aLink.pfid == undefined){
3669                                        rtn = false;
3670                                }
3671                                if(rtn){
3672                                        rtn = !this._linkExists(aMode, aLink, aTransaction);
3673                                        if(!rtn) bitsObjectMng._dump("bitsObjectMng.Database.addLink():_linkExists=["+ !rtn + "]");
3674                                }
3675                                if(rtn){
3676                                        rtn = this._fidExists(aMode,aLink.pfid,aTransaction);
3677                                        if(!rtn) bitsObjectMng._dump("bitsObjectMng.Database.addLink():aLink.pfid="+aLink.pfid);
3678                                }
3679                                if(rtn){
3680                                        rtn = this._oidExists(aMode,aLink.oid,aTransaction);
3681                                        if(!rtn) bitsObjectMng._dump("bitsObjectMng.Database.addLink():aLink.oid="+aLink.oid);
3682                                }
3683                                if(rtn){
3684                                        var columns = [];
3685                                        var values = [];
3686                                        var para = [];
3687                                        var index=0;
3688                                        for(var key in aLink){
3689                                                if(!aLink[key] || aLink[key] == "") continue;
3690                                                columns.push(key);
3691                                                values.push('?'+(++index));
3692                                                para.push(aLink[key]);
3693                                        }
3694                                        if(columns.length == 0) rtn = false;
3695                                        if(rtn){
3696                                                var aSql = "insert into om_link ("+ columns.join(",") +") values ("+ values.join(",") +")";
3697                                                rtn = this.cmdB(aMode,aSql,para,aTransaction);
3698                                        }
3699                                        if(!rtn){
3700                                                bitsObjectMng._dump("bitsObjectMng.Database.addLink():aSql="+aSql);
3701                                        }
3702                                }
3703                                if(rtn) nsPreferences.setUnicharPref("wiredmarker.last_update", bitsObjectMng.Common.getTimeStamp()+"\t"+aMode+"\t"+bitsObjectMng.DataSource.inittime + "\tINSERT\tLINK");
3704                        }catch(ex){
3705                                bitsObjectMng._dump("Database.addLink():"+ex);
3706                        }
3707                        return rtn;
3708                },
3709
3710/////////////////////////////////////////////////////////////////////
3711                addFolder : function(aFolder,aMode,aTransaction){
3712                        try{
3713                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
3714                                if(aTransaction == undefined) aTransaction = true;
3715                                var columns = [];
3716                                var values = [];
3717                                var para = [];
3718                                var index=0;
3719                                for(var key in aFolder){
3720                                        if(!aFolder[key] || aFolder[key] == "") continue;
3721                                        columns.push(key);
3722                                        values.push('?'+(++index));
3723                                        para.push(aFolder[key]);
3724                                }
3725                                if(columns.length == 0) return false;
3726                                var aSql = "insert into om_folder ("+ columns.join(",") +") values ("+ values.join(",") +")";
3727                                var rtn = this.cmdB(aMode,aSql,para,aTransaction);
3728                                if(rtn) nsPreferences.setUnicharPref("wiredmarker.last_update", bitsObjectMng.Common.getTimeStamp()+"\t"+aMode+"\t"+bitsObjectMng.DataSource.inittime + "\tINSERT\tFOLDER");
3729                                return rtn;
3730                        }catch(ex){
3731                                bitsObjectMng._dump("Database.addFolder():"+ex);
3732                                return false;
3733                        }
3734                },
3735
3736/////////////////////////////////////////////////////////////////////
3737                getAllObjectFormDocument : function(aDocument,aMode,aNoMode,aType){
3738                        try{
3739                                if(!aDocument) return null;
3740                                var doc_url = bitsObjectMng.Common.getURLStringFromDocument(aDocument);
3741                                if(doc_url == "") return null;
3742                                var statement = undefined;
3743                                var oFld = this.getAllObjectFormURL(doc_url, aMode, aNoMode,aType);
3744                                if(oFld && oFld.length>0)
3745                                        return oFld;
3746                                else
3747                                        return null;
3748                        }catch(ex){
3749                                bitsObjectMng._dump("Database.getAllObjectFormDocument():"+ex);
3750                                return null;
3751                        }
3752                },
3753
3754/////////////////////////////////////////////////////////////////////
3755                getAllObjectFormURL : function(aURL, aMode, aNoMode, aType){
3756                        try{
3757                                if(!aURL) return null;
3758                                if(aMode == undefined || aMode == ""){
3759                                        var rtnArr = [];
3760                                        var mode;
3761                                        for(mode in this._dbConn){
3762                                                if(mode == aNoMode) continue;
3763                                                if(typeof this._dbConn[mode] == "function") continue;
3764                                                var tmpArr = bitsObjectMng.Database.getAllObjectFormURL(aURL, mode, undefined, aType);
3765                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
3766                                        }
3767                                        if(rtnArr && rtnArr.length>0)
3768                                                return rtnArr;
3769                                        else
3770                                                return null;
3771                                }
3772                                var doc_url = aURL;
3773                                if(doc_url == "") return null;
3774                                var obj = {doc_url:doc_url};
3775                                if(aType) obj.oid_type = aType;
3776                                var rtnFld = this.getObject(obj,aMode);
3777                                if(rtnFld && rtnFld.length>0)
3778                                        return rtnFld;
3779                                else
3780                                        return null;
3781                        }catch(ex){
3782                                bitsObjectMng._dump("Database.getAllObjectFormURL():"+ex);
3783                                return null;
3784                        }
3785                },
3786
3787/////////////////////////////////////////////////////////////////////
3788                getAllObjectFormContentURL : function(aContentURL, aMode){
3789                        try{
3790                                if(!aContentURL) return null;
3791                                if(aMode == undefined || aMode == ""){
3792                                        var rtnArr = [];
3793                                        var mode;
3794                                        for(mode in this._dbConn){
3795                                                if(typeof this._dbConn[mode] == "function") continue;
3796                                                var tmpArr = bitsObjectMng.Database.getAllObjectFormContentURL(aContentURL, mode);
3797                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
3798                                        }
3799                                        if(rtnArr && rtnArr.length>0)
3800                                                return rtnArr;
3801                                        else
3802                                                return null;
3803                                }
3804                                var con_url = aContentURL;
3805                                if(!con_url || con_url == "") return null;
3806                                var obj = {con_url:con_url};
3807                                var rtnFld = this.getObject(obj,aMode);
3808                                if(rtnFld && rtnFld.length>0)
3809                                        return rtnFld;
3810                                else
3811                                        return null;
3812                        }catch(ex){
3813                                bitsObjectMng._dump("Database.getAllObjectFormContentURL():"+ex);
3814                                return null;
3815                        }
3816                },
3817
3818/////////////////////////////////////////////////////////////////////
3819                getAllObjectFormPIDandURL : function(aPID,aURL,aMode){
3820                        try{
3821                                if(!aPID || !aURL) return null;
3822                                if(aMode == undefined || aMode == ""){
3823                                        var rtnArr = [];
3824                                        var mode;
3825                                        for(mode in this._dbConn){
3826                                                if(typeof this._dbConn[mode] == "function") continue;
3827                                                var tmpArr = bitsObjectMng.Database.getAllObjectFormPIDandURL(aPID,aURL,mode);
3828                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
3829                                        }
3830                                        if(rtnArr && rtnArr.length>0)
3831                                                return rtnArr;
3832                                        else
3833                                                return null;
3834                                }
3835                                var oFld = this.getObject({pfid:aPID,doc_url:aURL},aMode);
3836                                if(oFld && oFld.length>0)
3837                                        return oFld;
3838                                else
3839                                        return null;
3840                        }catch(ex){
3841                                bitsObjectMng._dump("Database.getAllObjectFormPIDandURL():"+ex);
3842                                return null;
3843                        }
3844                },
3845
3846/////////////////////////////////////////////////////////////////////
3847                getObjectFormURL : function(aURL,aMode,aTransaction){
3848                        try{
3849                                if(!aURL) return null;
3850                                if(aTransaction == undefined) aTransaction = true;
3851                                if(aMode == undefined || aMode == ""){
3852                                        var rtnArr = [];
3853                                        var mode;
3854                                        for(mode in this._dbConn){
3855                                                if(typeof this._dbConn[mode] == "function") continue;
3856                                                var tmpArr = bitsObjectMng.Database.getObjectFormURL(aURL,mode,false);
3857                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
3858                                        }
3859                                        if(rtnArr && rtnArr.length>0)
3860                                                return rtnArr;
3861                                        else
3862                                                return null;
3863                                }
3864                                var oFld = this.getObject({doc_url:aURL},aMode);
3865                                if(oFld && oFld.length>0)
3866                                        return oFld;
3867                                else
3868                                        return null;
3869                        }catch(ex){
3870                                bitsObjectMng._dump("Database.getObjectFormURL():"+ex);
3871                                return null;
3872                        }
3873                },
3874
3875/////////////////////////////////////////////////////////////////////
3876                getObject : function(aObject,aMode,aLimit){
3877                        try{
3878                                if(!aObject) return null;
3879                                if(aMode == undefined || aMode == ""){
3880                                        var rtnArr = [];
3881                                        var modeArr = [];
3882                                        var mode;
3883                                        for(mode in this._dbConn){
3884                                                if(typeof this._dbConn[mode] == "function") continue;
3885                                                modeArr.push(mode);
3886                                                var tmpArr = bitsObjectMng.Database.getObject(aObject,mode);
3887                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
3888                                        }
3889                                        if(rtnArr && rtnArr.length>0){
3890                                                var modeHash = {};
3891                                                for(var i=0;i<modeArr.length;i++){
3892                                                        modeHash[modeArr[i]] = i;
3893                                                }
3894                                                rtnArr.sort(function(a,b){
3895                                                        var a_order = parseInt(a.oid);
3896                                                        var b_order = parseInt(b.oid);
3897                                                        if(a_order < b_order) return -1;
3898                                                        if(a_order > b_order) return 1;
3899                                                        if(modeHash[a.dbtype] < modeHash[b.dbtype]) return -1;
3900                                                        if(modeHash[a.dbtype] > modeHash[b.dbtype]) return 1;
3901                                                        return 0;
3902                                                });
3903                                                return rtnArr;
3904                                        }else{
3905                                                return null;
3906                                        }
3907                                }
3908                                var para = [];
3909                                var where = [];
3910                                var key;
3911                                var index=0;
3912                                for(key in aObject){
3913                                        if(key.indexOf("substr") == 0){
3914                                                where.push(key+"=?"+(++index));
3915                                                para.push(aObject[key]);
3916                                        }else if(key == "pfid" || key == "pfid_order"){
3917                                                if((aObject[key]+"").toLowerCase() == "null"){
3918                                                        where.push("om_link."+key+" is null");
3919                                                }else{
3920                                                        where.push("om_link."+key+"=?"+(++index));
3921                                                        para.push(aObject[key]);
3922                                                }
3923                                        }else{
3924                                                if((aObject[key]+"").toLowerCase() == "null"){
3925                                                        where.push("om_object."+key+" is null");
3926                                                }else{
3927                                                        where.push("om_object."+key+"=?"+(++index));
3928                                                        para.push(aObject[key]);
3929                                                }
3930                                        }
3931                                }
3932                                var oSql = 'select' +
3933                                                                        ' om_link.pfid' +
3934                                                                        ',om_link.pfid_order' +
3935                                                                        ',om_object.oid' +
3936                                                                        ',om_object.doc_title' +
3937                                                                        ',om_object.doc_url' +
3938                                                                        ',om_object.con_url' +
3939                                                                        ',om_object.bgn_dom' +
3940                                                                        ',om_object.end_dom' +
3941                                                                        ',om_object.oid_title' +
3942                                                                        ',om_object.oid_property' +
3943                                                                        ',om_object.oid_mode' +
3944                                                                        ',om_object.oid_type' +
3945                                                                        ',om_object.oid_txt' +
3946                                                                        ',om_object.oid_date' +
3947                                                                        ',"'+aMode+'" as dbtype' +
3948                                                                        ',om_folder.fid_style' +
3949                                                                        ',om_folder.fid_title' +
3950                                                                        ',om_folder.pfid_order as folder_order' +
3951                                                                        ' from om_object' +
3952                                                                        ' LEFT JOIN om_link ON om_link.oid = om_object.oid' +
3953                                                                        ' LEFT JOIN om_folder ON om_folder.fid = om_link.pfid';
3954                                if(where.length>0) oSql += " where " + where.join(" and ");
3955                                oSql += ' order by om_link.pfid_order';
3956                                if(aLimit && parseInt(aLimit)>0) oSql += ' LIMIT ' + parseInt(aLimit);
3957                                var oFld = this.selectB(aMode,oSql,para);
3958                                if(oFld && oFld.length>0)
3959                                        return oFld;
3960                                else
3961                                        return null;
3962                        }catch(ex){
3963                                bitsObjectMng._dump("getObject():"+ex);
3964                                return null;
3965                        }
3966                },
3967
3968/////////////////////////////////////////////////////////////////////
3969                getObjectMaxYear : function(aMode){
3970                        try{
3971                                if(aMode == undefined || aMode == ""){
3972                                        var rtnArr = [];
3973                                        var mode;
3974                                        for(mode in this._dbConn){
3975                                                if(typeof this._dbConn[mode] == "function") continue;
3976                                                var tmpArr = bitsObjectMng.Database.getObjectMaxYear(mode);
3977                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
3978                                        }
3979                                        if(rtnArr && rtnArr.length>0){
3980                                                rtnArr.sort();
3981                                                return [rtnArr.pop()];
3982                                        }else{
3983                                                return null;
3984                                        }
3985                                }
3986                                var oSql = 'select max(substr(oid_date,7,4)) as year from om_object';
3987                                var oFld = this.selectB(aMode,oSql);
3988                                if(oFld && oFld.length>0)
3989                                        return oFld;
3990                                else
3991                                        return null;
3992                        }catch(ex){
3993                                bitsObjectMng._dump("getObjectMaxYear():"+ex);
3994                                return null;
3995                        }
3996                },
3997
3998/////////////////////////////////////////////////////////////////////
3999                getObjectMinYear : function(aMode){
4000                        try{
4001                                if(aMode == undefined || aMode == ""){
4002                                        var rtnArr = [];
4003                                        var mode;
4004                                        for(mode in this._dbConn){
4005                                                if(typeof this._dbConn[mode] == "function") continue;
4006                                                var tmpArr = bitsObjectMng.Database.getObjectMinYear(mode);
4007                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4008                                        }
4009                                        if(rtnArr && rtnArr.length>0){
4010                                                rtnArr.sort();
4011                                                return [rtnArr.shift()];
4012                                        }else{
4013                                                return null;
4014                                        }
4015                                }
4016                                var oSql = 'select min(substr(oid_date,7,4)) as year from om_object';
4017                                var oFld = this.selectB(aMode,oSql);
4018                                if(oFld && oFld.length>0)
4019                                        return oFld;
4020                                else
4021                                        return null;
4022                        }catch(ex){
4023                                bitsObjectMng._dump("getObjectMinYear():"+ex);
4024                                return null;
4025                        }
4026                },
4027
4028/////////////////////////////////////////////////////////////////////
4029                getObjectYear : function(aMode){
4030                        try{
4031                                if(aMode == undefined || aMode == ""){
4032                                        var rtnArr = [];
4033                                        var mode;
4034                                        for(mode in this._dbConn){
4035                                                if(typeof this._dbConn[mode] == "function") continue;
4036                                                var tmpArr = bitsObjectMng.Database.getObjectYear(mode);
4037                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4038                                        }
4039                                        if(rtnArr && rtnArr.length>0){
4040                                                var hash = {};
4041                                                for(var i=0;i<rtnArr.length;i++){
4042                                                        hash[rtnArr[i]] = rtnArr[i];
4043                                                }
4044                                                rtnArr.length = 0;
4045                                                for(var key in hash){
4046                                                        rtnArr.push(key);
4047                                                }
4048                                                rtnArr.sort();
4049                                                return rtnArr;
4050                                        }else{
4051                                                return null;
4052                                        }
4053                                }
4054                                var oSql = 'select substr(oid_date,7,4) as year from om_object group by year order by year';
4055                                var oFld = this.selectB(aMode,oSql);
4056                                if(oFld && oFld.length>0){
4057                                        for(var i=0;i<oFld.length;i++){
4058                                                oFld[i] = oFld[i].year;
4059                                        }
4060                                        return oFld;
4061                                }else
4062                                        return null;
4063                        }catch(ex){
4064                                bitsObjectMng._dump("getObjectMinYear():"+ex);
4065                                return null;
4066                        }
4067                },
4068
4069/////////////////////////////////////////////////////////////////////
4070                getObjectMonthFromYear : function(aYear,aMode){
4071                        try{
4072                                if(!aYear) return null;
4073                                if(aMode == undefined || aMode == ""){
4074                                        var rtnArr = [];
4075                                        var mode;
4076                                        for(mode in this._dbConn){
4077                                                if(typeof this._dbConn[mode] == "function") continue;
4078                                                var tmpArr = bitsObjectMng.Database.getObjectMonthFromYear(aYear,mode);
4079                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4080                                        }
4081                                        if(rtnArr && rtnArr.length>0){
4082                                                var hash = {};
4083                                                for(var i=0;i<rtnArr.length;i++){
4084                                                        hash[rtnArr[i]] = rtnArr[i];
4085                                                }
4086                                                rtnArr.length = 0;
4087                                                for(var key in hash){
4088                                                        rtnArr.push(key);
4089                                                }
4090                                                rtnArr.sort();
4091                                                return rtnArr;
4092                                        }else{
4093                                                return null;
4094                                        }
4095                                }
4096                                var oSql = 'select substr(oid_date,1,2) as month from om_object where substr(oid_date,7,4)=?1 group by month order by month';
4097                                var oFld = this.selectB(aMode,oSql,[aYear]);
4098                                if(oFld && oFld.length>0){
4099                                        for(var i=0;i<oFld.length;i++){
4100                                                oFld[i] = oFld[i].month;
4101                                        }
4102                                        return oFld;
4103                                }else
4104                                        return null;
4105                        }catch(ex){
4106                                bitsObjectMng._dump("getObjectMonthFromYear():"+ex);
4107                                return null;
4108                        }
4109                },
4110
4111/////////////////////////////////////////////////////////////////////
4112                getObjectDayFromYearMonth : function(aYear,aMonth,aMode){
4113                        try{
4114                                if(!aYear) return null;
4115                                if(!aMonth) return null;
4116                                if(aMode == undefined || aMode == ""){
4117                                        var rtnArr = [];
4118                                        var mode;
4119                                        for(mode in this._dbConn){
4120                                                if(typeof this._dbConn[mode] == "function") continue;
4121                                                var tmpArr = bitsObjectMng.Database.getObjectDayFromYearMonth(aYear,aMonth,mode);
4122                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4123                                        }
4124                                        if(rtnArr && rtnArr.length>0){
4125                                                var hash = {};
4126                                                for(var i=0;i<rtnArr.length;i++){
4127                                                        hash[rtnArr[i]] = rtnArr[i];
4128                                                }
4129                                                rtnArr.length = 0;
4130                                                for(var key in hash){
4131                                                        rtnArr.push(key);
4132                                                }
4133                                                rtnArr.sort();
4134                                                return rtnArr;
4135                                        }else{
4136                                                return null;
4137                                        }
4138                                }
4139                                var oSql = 'select substr(oid_date,4,2) as day from om_object where substr(oid_date,7,4)=?1 and substr(oid_date,1,2)=?2 group by day order by day';
4140                                var oFld = this.selectB(aMode,oSql,[aYear,aMonth]);
4141                                if(oFld && oFld.length>0){
4142                                        for(var i=0;i<oFld.length;i++){
4143                                                oFld[i] = oFld[i].day;
4144                                        }
4145                                        return oFld;
4146                                }else
4147                                        return null;
4148                        }catch(ex){
4149                                bitsObjectMng._dump("getObjectDayFromYearMonth():"+ex);
4150                                return null;
4151                        }
4152                },
4153
4154
4155/////////////////////////////////////////////////////////////////////
4156                findObject : function(aFindRegExp,aMode,aObject){
4157                        try{
4158                                if(!aFindRegExp && !aObject) return null;
4159                                if(!aFindRegExp && aObject) return this.getObject(aObject,aMode);
4160                                if(aMode == undefined || aMode == ""){
4161                                        var rtnArr = [];
4162                                        var mode;
4163                                        for(mode in this._dbConn){
4164                                                if(typeof this._dbConn[mode] == "function") continue;
4165                                                var tmpArr = bitsObjectMng.Database.findObject(aFindRegExp,mode,aObject);
4166                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4167                                        }
4168                                        if(rtnArr && rtnArr.length>0)
4169                                                return rtnArr;
4170                                        else
4171                                                return null;
4172                                }
4173                                var para = [];
4174                                var where = [];
4175                                var key;
4176                                var index=0;
4177                                if(aObject){
4178                                        for(key in aObject){
4179                                                if(key == "pfid" || key == "pfid_order"){
4180                                                        where.push("om_link."+key+"=?"+(++index));
4181                                                }else{
4182                                                        where.push("om_object."+key+"=?"+(++index));
4183                                                }
4184                                                para.push(aObject[key]);
4185                                        }
4186                                }
4187                                var oSql = 'select' +
4188                                                                        ' om_link.pfid' +
4189                                                                        ',om_link.pfid_order' +
4190                                                                        ',om_object.oid' +
4191                                                                        ',om_object.doc_title' +
4192                                                                        ',om_object.doc_url' +
4193                                                                        ',om_object.con_url' +
4194                                                                        ',om_object.bgn_dom' +
4195                                                                        ',om_object.end_dom' +
4196                                                                        ',om_object.oid_title' +
4197                                                                        ',om_object.oid_property' +
4198                                                                        ',om_object.oid_mode' +
4199                                                                        ',om_object.oid_type' +
4200                                                                        ',om_object.oid_txt' +
4201                                                                        ',om_object.oid_date' +
4202                                                                        ',"'+aMode+'" as dbtype' +
4203                                                                        ',om_folder.fid_style' +
4204                                                                        ',om_folder.fid_title' +
4205                                                                        ',om_folder.pfid_order as folder_order' +
4206                                                                        ' from om_object' +
4207                                                                        ' LEFT JOIN om_link ON om_link.oid = om_object.oid' +
4208                                                                        ' LEFT JOIN om_folder ON om_folder.fid = om_link.pfid';
4209                                if(where.length>0) oSql += " where " + where.join(" and ");
4210                                oSql += ' order by om_link.pfid_order';
4211                                var oFld = this.selectBF(aMode,oSql,para,aFindRegExp);
4212                                if(oFld && oFld.length>0)
4213                                        return oFld;
4214                                else
4215                                        return null;
4216                        }catch(ex){
4217                                bitsObjectMng._dump("findObject():"+ex);
4218                                return null;
4219                        }
4220                },
4221
4222/////////////////////////////////////////////////////////////////////
4223                getObjectWithProperty : function(aObject,aMode){
4224                        try{
4225                                if(!aObject) return null;
4226                                if(aMode == undefined || aMode == ""){
4227                                        var rtnArr = [];
4228                                        var mode;
4229                                        for(mode in this._dbConn){
4230                                                if(typeof this._dbConn[mode] == "function") continue;
4231                                                var tmpArr = bitsObjectMng.Database.getObjectWithProperty(aObject,mode);
4232                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4233                                        }
4234                                        if(rtnArr && rtnArr.length>0)
4235                                                return rtnArr;
4236                                        else
4237                                                return null;
4238                                }
4239                                var para = [];
4240                                var where = [];
4241                                var key;
4242                                var index=0;
4243                                for(key in aObject){
4244                                        if(key == "pfid" || key == "pfid_order"){
4245                                                where.push("om_link."+key+"=?"+(++index));
4246                                        }else{
4247                                                where.push("om_object."+key+"=?"+(++index));
4248                                        }
4249                                        para.push(aObject[key]);
4250                                }
4251                                var oSql = 'select' +
4252                                                                        ' om_link.pfid' +
4253                                                                        ',om_link.pfid_order' +
4254                                                                        ',om_object.oid' +
4255                                                                        ',om_object.doc_title' +
4256                                                                        ',om_object.doc_url' +
4257                                                                        ',om_object.con_url' +
4258                                                                        ',om_object.bgn_dom' +
4259                                                                        ',om_object.end_dom' +
4260                                                                        ',om_object.oid_title' +
4261                                                                        ',om_object.oid_property' +
4262                                                                        ',om_object.oid_mode' +
4263                                                                        ',om_object.oid_type' +
4264                                                                        ',om_object.oid_txt' +
4265                                                                        ',om_object.oid_date' +
4266                                                                        ',"'+aMode+'" as dbtype' +
4267                                                                        ',om_folder.fid_style' +
4268                                                                        ' from om_object' +
4269                                                                        ' LEFT JOIN om_link ON om_link.oid = om_object.oid' +
4270                                                                        ' LEFT JOIN om_folder ON om_folder.fid = om_link.pfid';
4271                                if(where.length>0) oSql += " where " + where.join(" and ");
4272                                oSql += ' order by om_link.pfid_order';
4273                                var oFld = this.selectB(aMode,oSql,para);
4274                                if(oFld && oFld.length>0){
4275                                        var domParser = new DOMParser();
4276                                        var xmlSerializer = new XMLSerializer();
4277                                        for(var i=0;i<oFld.length;i++){
4278                                                if(!oFld[i].oid_property || oFld[i].oid_property == "") continue;
4279                                                var dir = this.getObjectPropertyDir(oFld[i].oid,aMode);
4280                                                if(!dir || !dir.exists()) continue;
4281                                                var entries = dir.directoryEntries;
4282                                                while(entries.hasMoreElements()){
4283                                                        var pFile = entries.getNext().QueryInterface(Components.interfaces.nsILocalFile);
4284                                                        var xml = bitsObjectMng.Common.readFile(pFile);
4285                                                        var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
4286                                                        converter.charset = "UTF-8";
4287                                                        xml = converter.ConvertToUnicode(xml);
4288                                                        var xmldoc2 = domParser.parseFromString(xml, "text/xml");
4289                                                        if(xmldoc2 && xmldoc2.documentElement.nodeName == "parsererror") xmldoc2 = undefined;
4290                                                        if(!xmldoc2 || !xmldoc2.documentElement) continue;
4291                                                        var xmldoc = domParser.parseFromString(oFld[i].oid_property, "text/xml");
4292                                                        if(xmldoc && xmldoc.documentElement.nodeName == "parsererror") xmldoc = undefined;
4293                                                        if(!xmldoc) continue;
4294                                                        var xmlnode = xmldoc.getElementsByTagName(xmldoc2.documentElement.nodeName)[0];
4295                                                        if(xmlnode){
4296                                                                while(xmlnode.hasChildNodes()){
4297                                                                        xmlnode.removeChild(xmlnode.firstChild);
4298                                                                }
4299                                                        }else{
4300                                                                xmlnode = xmldoc.createElement(xmldoc2.documentElement.nodeName);
4301                                                                xmldoc.documentElement.appendChild(xmlnode);
4302                                                        }
4303                                                        if(!xmlnode) continue;
4304                                                        var xmlnode2 = xmldoc2.documentElement;
4305                                                        for(var dcnt=0;dcnt<xmlnode2.childNodes.length;dcnt++){
4306                                                                xmlnode.appendChild(xmlnode2.childNodes[dcnt].cloneNode(true));
4307                                                        }
4308                                                        xmlnode2 = undefined;
4309                                                        xmldoc2 = undefined;
4310                                                        oFld[i].oid_property = xmlSerializer.serializeToString(xmldoc);
4311                                                        xmlnode = undefined;
4312                                                        xmldoc = undefined;
4313                                                }
4314                                        }
4315                                        xmlSerializer = undefined;
4316                                        domParser = undefined;
4317                                        return oFld;
4318                                }else{
4319                                        return null;
4320                                }
4321                        }catch(ex){
4322                                bitsObjectMng._dump("getObject():"+ex);
4323                                return null;
4324                        }
4325                },
4326
4327/////////////////////////////////////////////////////////////////////
4328                getObjectFormID : function(aID,aMode){
4329                        try{
4330                                if(!aID) return null;
4331                                if(aMode == undefined || aMode == ""){
4332                                        var rtnArr = [];
4333                                        for(var mode in this._dbConn){
4334                                                if(typeof this._dbConn[mode] == "function") continue;
4335                                                var tmpArr = bitsObjectMng.Database.getObjectFormID(aID,mode);
4336                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4337                                        }
4338                                        if(rtnArr && rtnArr.length>0)
4339                                                return rtnArr;
4340                                        else
4341                                                return null;
4342                                }
4343                                var oFld = this.getObject({oid:aID},aMode);
4344                                if(oFld && oFld.length>0)
4345                                        return oFld;
4346                                else
4347                                        return null;
4348                        }catch(ex){
4349                                bitsObjectMng._dump("getObjectFormID():"+ex);
4350                                return null;
4351                        }
4352                },
4353
4354/////////////////////////////////////////////////////////////////////
4355                getObjectFormPID : function(aFID,aMode,aLimit){
4356                        try{
4357                                if(!aFID) return null;
4358                                if(aMode == undefined || aMode == ""){
4359                                        var rtnArr = [];
4360                                        var mode;
4361                                        for(mode in this._dbConn){
4362                                                if(typeof this._dbConn[mode] == "function") continue;
4363                                                var tmpArr = bitsObjectMng.Database.getObjectFormID(aID,mode);
4364                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4365                                        }
4366                                        if(rtnArr && rtnArr.length>0)
4367                                                return rtnArr;
4368                                        else
4369                                                return null;
4370                                }
4371                                var lFld = this.getObject({pfid:aFID},aMode,aLimit);
4372                                if(lFld && lFld.length>0)
4373                                        return lFld;
4374                                else
4375                                        return null;
4376                        }catch(ex){
4377                                if(statement){
4378                                        this.endTransaction(aMode);
4379                                        statement.reset();
4380                                        statement = undefined;
4381                                }
4382                                bitsObjectMng._dump("getObjectFormPID():"+ex);
4383                                return null;
4384                        }
4385                },
4386
4387/////////////////////////////////////////////////////////////////////
4388                getObjectDir : function(aID,aMode){
4389                        var dir = bitsObjectMng.Common.getContentDir();
4390                        var dir_new = dir.clone();
4391                        dir.append(aID);
4392                        dir_new.append(aMode);
4393                        dir_new.append(aID);
4394                        if(dir.exists()) return dir;
4395                        return dir_new;
4396                },
4397
4398/////////////////////////////////////////////////////////////////////
4399                getObjectBLOBFile : function(aID,aMode){
4400                        var blobFile = this.getObjectDir(aID,aMode);
4401                        blobFile.append("oid_img");
4402                        return blobFile;
4403                },
4404
4405/////////////////////////////////////////////////////////////////////
4406                getObjectPropertyDir : function(aID,aMode){
4407                        var pDir = this.getObjectDir(aID,aMode);
4408                        pDir.append("oid_property");
4409                        return pDir;
4410                },
4411
4412/////////////////////////////////////////////////////////////////////
4413                getObjectBLOB : function(aID,aMode,aTransaction){
4414                        try{
4415                                if(!aID) return null;
4416                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
4417                                if(aTransaction == undefined) aTransaction = true;
4418                                var oFld = [];
4419                                var imgFile = this.getObjectBLOBFile(aID,aMode);
4420                                if(imgFile.exists()){
4421                                        var istream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
4422                                        istream.init(imgFile, -1, -1, false);
4423                                        var bstream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);
4424                                        bstream.setInputStream(istream);
4425                                        var bytes = bstream.readByteArray(bstream.available());
4426                                        istream.close();
4427                                        oFld.push(bytes);
4428                                        return oFld;
4429                                }
4430                                var oSql = 'select oid_img from om_object where oid=?1';
4431                                if(aTransaction) if(!this.beginTransaction(aMode)) return null;
4432                                var statement = this._dbConn[aMode].createStatement(oSql);
4433                                statement.bindUTF8StringParameter(0,aID);
4434                                while(statement.executeStep()){
4435                                        var array = {};
4436                                        var size = {};
4437                                        statement.getBlob(0,size,array);
4438                                        oFld.push(array.value);
4439                                }
4440                                statement.reset();
4441                                statement = undefined;
4442                                if(aTransaction) this.endTransaction(aMode);
4443                                if(oFld && oFld.length>0)
4444                                        return oFld;
4445                                else
4446                                        return null;
4447                        }catch(ex){
4448                                bitsObjectMng._dump("getObjectBLOB():"+ex);
4449                                return null;
4450                        }
4451                },
4452
4453/////////////////////////////////////////////////////////////////////
4454                getAllObject : function(aMode){
4455                        try{
4456                                if(aMode == undefined || aMode == ""){
4457                                        var rtnArr = [];
4458                                        var mode;
4459                                        for(mode in this._dbConn){
4460                                                if(typeof this._dbConn[mode] == "function") continue;
4461                                                var tmpArr = bitsObjectMng.Database.getAllObject(mode);
4462                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4463                                        }
4464                                        if(rtnArr && rtnArr.length>0)
4465                                                return rtnArr;
4466                                        else
4467                                                return null;
4468                                }
4469                                var rtnFld = this.getObject({},aMode);
4470                                if(rtnFld && rtnFld.length>0)
4471                                        return rtnFld;
4472                                else
4473                                        return null;
4474                        }catch(ex){
4475                                bitsObjectMng._dump("getAllObject():"+ex);
4476                                return null;
4477                        }
4478                },
4479
4480/////////////////////////////////////////////////////////////////////
4481                getURL : function(aMode){
4482                        try{
4483                                if(aMode == undefined || aMode == ""){
4484                                        var rtnArr = [];
4485                                        var mode;
4486                                        for(mode in this._dbConn){
4487                                                if(typeof this._dbConn[mode] == "function") continue;
4488                                                var tmpArr = bitsObjectMng.Database.getURL(mode);
4489                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4490                                        }
4491                                        if(rtnArr && rtnArr.length>0)
4492                                                return rtnArr;
4493                                        else
4494                                                return null;
4495                                }
4496                                var oSql = 'select doc_url from om_object group by doc_url';
4497                                var oFld = this.select(aMode,oSql);
4498                                if(oFld && oFld.length>0)
4499                                        return oFld;
4500                                else
4501                                        return null;
4502                        }catch(ex){
4503                                bitsObjectMng._dump("getURL():"+ex);
4504                                return null;
4505                        }
4506                },
4507
4508/////////////////////////////////////////////////////////////////////
4509                getAllFolder : function(aMode,aTransaction){
4510                        try{
4511                                if(aTransaction == undefined) aTransaction = true;
4512                                if(aMode == undefined || aMode == ""){
4513                                        var rtnArr = [];
4514                                        var mode;
4515                                        for(mode in this._dbConn){
4516                                                if(typeof this._dbConn[mode] == "function") continue;
4517                                                var tmpArr = bitsObjectMng.Database.getAllFolder(mode,false);
4518                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4519                                        }
4520                                        if(rtnArr && rtnArr.length>0)
4521                                                return rtnArr;
4522                                        else
4523                                                return null;
4524                                }
4525                                var fSql = 'select *,"'+aMode+'" as dbtype from om_folder';
4526                                var fFld = [];
4527                                if(aTransaction) if(!this.beginTransaction(aMode)) return null;
4528                                var statement = this._dbConn[aMode].createStatement(fSql);
4529                                while(statement.executeStep()){
4530                                        var row = [];
4531                                        var j,k
4532                                        for(j=0,k=statement.columnCount;j<k;j++){
4533                                                row[statement.getColumnName(j)] = statement.getUTF8String(j);
4534                                                if(row[statement.getColumnName(j)] == "null") row[statement.getColumnName(j)] = "";
4535                                        }
4536                                        fFld.push(row);
4537                                }
4538                                statement.reset();
4539                                statement = undefined;
4540                                if(aTransaction) this.endTransaction(aMode);
4541                                if(fFld && fFld.length>0)
4542                                        return fFld;
4543                                else
4544                                        return null;
4545                        }catch(ex){
4546                                bitsObjectMng._dump("getAllFolder():"+ex);
4547                                return null;
4548                        }
4549                },
4550
4551/////////////////////////////////////////////////////////////////////
4552                getFolderFormID : function(aID,aMode,aNoMode,aTransaction){
4553                        try{
4554                                if(!aID) return null;
4555                                if(aTransaction == undefined) aTransaction = true;
4556                                if(aMode == undefined || aMode == ""){
4557                                        var rtnArr = [];
4558                                        var mode;
4559                                        for(mode in this._dbConn){
4560                                                if(mode == aNoMode) continue;
4561                                                if(typeof this._dbConn[mode] == "function") continue;
4562                                                var tmpArr = bitsObjectMng.Database.getFolderFormID(aID,mode,undefined,aTransaction);
4563                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4564                                        }
4565                                        if(rtnArr && rtnArr.length>0)
4566                                                return rtnArr;
4567                                        else
4568                                                return null;
4569                                }
4570                                var fSql = 'select *,"'+aMode+'" as dbtype from om_folder where fid =?1';
4571                                var fFld = this.selectB(aMode,fSql,[aID],aTransaction);
4572                                if(fFld && fFld.length>0)
4573                                        return fFld;
4574                                else
4575                                        return null;
4576                        }catch(ex){
4577                                bitsObjectMng._dump("getFolderFormID():"+ex);
4578                                return null;
4579                        }
4580                },
4581
4582/////////////////////////////////////////////////////////////////////
4583                getFolderFormPID : function(aPID,aMode,aTransaction){
4584                        try{
4585                                if(!aPID) return null;
4586                                if(aTransaction == undefined) aTransaction = true;
4587                                if(aMode == undefined || aMode == ""){
4588                                        var rtnArr = [];
4589                                        var mode;
4590                                        for(mode in this._dbConn){
4591                                                if(typeof this._dbConn[mode] == "function") continue;
4592                                                var tmpArr = bitsObjectMng.Database.getFolderFormPID(aPID,mode,aTransaction);
4593                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4594                                        }
4595                                        if(rtnArr && rtnArr.length>0)
4596                                                return rtnArr;
4597                                        else
4598                                                return null;
4599                                }
4600                                var fSql = 'select *,"'+aMode+'" as dbtype from om_folder where pfid = ?1';
4601                                var fFld = this.selectB(aMode,fSql,[aPID],aTransaction);
4602                                if(fFld && fFld.length>0)
4603                                        return fFld;
4604                                else
4605                                        return null;
4606                        }catch(ex){
4607                                bitsObjectMng._dump("getFolderFormPID():"+ex);
4608                                return null;
4609                        }
4610                },
4611
4612/////////////////////////////////////////////////////////////////////
4613                getFolderFormTitle : function(aTitle,aMode,aTransaction){
4614                        try{
4615                                if(!aTitle) return null;
4616                                if(aTransaction == undefined) aTransaction = true;
4617                                if(aMode == undefined || aMode == ""){
4618                                        var rtnArr = [];
4619                                        var mode;
4620                                        for(mode in this._dbConn){
4621                                                if(typeof this._dbConn[mode] == "function") continue;
4622                                                var tmpArr = bitsObjectMng.Database.getFolderFormTitle(aTitle,mode,aTransaction);
4623                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4624                                        }
4625                                        if(rtnArr && rtnArr.length>0)
4626                                                return rtnArr;
4627                                        else
4628                                                return null;
4629                                }
4630                                var fSql = 'select *,"'+aMode+'" as dbtype from om_folder where fid_title =?1';
4631                                var fFld = this.selectB(aMode,fSql,[aTitle],aTransaction);
4632                                if(fFld && fFld.length>0)
4633                                        return fFld;
4634                                else
4635                                        return null;
4636                        }catch(ex){
4637                                bitsObjectMng._dump("getFolderFormTitle():"+ex);
4638                                return null;
4639                        }
4640                },
4641
4642/////////////////////////////////////////////////////////////////////
4643                getFolder : function(aFolder,aMode){
4644                        try{
4645                                if(!aFolder) return null;
4646                                if(aMode == undefined || aMode == ""){
4647                                        var rtnArr = [];
4648                                        var mode;
4649                                        for(mode in this._dbConn){
4650                                                if(typeof this._dbConn[mode] == "function") continue;
4651                                                var tmpArr = bitsObjectMng.Database.getFolder(aFolder,mode);
4652                                                if(tmpArr) rtnArr = rtnArr.concat(tmpArr);
4653                                        }
4654                                        if(rtnArr && rtnArr.length>0)
4655                                                return rtnArr;
4656                                        else
4657                                                return null;
4658                                }
4659                                var para = [];
4660                                var where = [];
4661                                var key;
4662                                var index=0;
4663                                for(key in aFolder){
4664                                        where.push("om_folder."+key+"=?"+(++index));
4665                                        para.push(aFolder[key]);
4666                                }
4667                                var oSql = 'select' +
4668                                                                        ' om_folder.*' +
4669                                                                        ',"'+aMode+'" as dbtype' +
4670                                                                        ' from om_folder';
4671                                if(where.length>0) oSql += " where " + where.join(" and ");
4672                                oSql += ' order by om_folder.pfid_order';
4673                                var oFld = this.selectB(aMode,oSql,para);
4674                                if(oFld && oFld.length>0)
4675                                        return oFld;
4676                                else
4677                                        return null;
4678                        }catch(ex){
4679                                bitsObjectMng._dump("getFolder():"+ex);
4680                                return null;
4681                        }
4682                },
4683
4684/////////////////////////////////////////////////////////////////////
4685                getMaxOrderFormPID : function(aPID,aMode,aTransaction){
4686                        try{
4687                                if(!aPID) return null;
4688                                if(aTransaction == undefined) aTransaction = true;
4689                                if(aMode == undefined || aMode == ""){
4690                                        var rtnValue = 0;
4691                                        var mode;
4692                                        for(mode in this._dbConn){
4693                                                if(typeof this._dbConn[mode] == "function") continue;
4694                                                var tmpValue = bitsObjectMng.Database.getMaxOrderFormPID(aPID,mode,aTransaction);
4695                                                if(tmpValue && tmpValue>rtnValue) rtnValue = tmpValue;
4696                                        }
4697                                        return rtnValue;
4698                                }
4699                                var oSql = 'select max(pfid_order) as max_order from (select pfid_order FROM om_link where pfid=' + aPID +' union select pfid_order from om_folder where pfid=' + aPID +')';
4700                                var rtn = this.selectCount(aMode,oSql,aTransaction);
4701                                return rtn;
4702                        }catch(ex){
4703                                bitsObjectMng._dump("Database.getMaxOrderFormPID():"+ex);
4704                                return null;
4705                        }
4706                },
4707
4708/////////////////////////////////////////////////////////////////////
4709                getMaxObjectOrderFormPID : function(aPID,aMode){
4710                        try{
4711                                if(!aPID) return null;
4712                                if(aMode == undefined || aMode == ""){
4713                                        var rtnValue = 0;
4714                                        var mode;
4715                                        for(mode in this._dbConn){
4716                                                if(typeof this._dbConn[mode] == "function") continue;
4717                                                var tmpValue = bitsObjectMng.Database.getMaxObjectOrderFormPID(aPID,mode);
4718                                                if(tmpValue && tmpValue>rtnValue) rtnValue = tmpValue;
4719                                        }
4720                                        return rtnValue;
4721                                }
4722                                var oSql = 'select max(pfid_order) as max_order FROM om_link where pfid=' + aPID;
4723                                var rtn = this.selectCount(aMode,oSql);
4724                                return rtn;
4725                        }catch(ex){
4726                                bitsObjectMng._dump("Database.getMaxObjectOrderFormPID():"+ex);
4727                                return null;
4728                        }
4729                },
4730
4731/////////////////////////////////////////////////////////////////////
4732                getFavicon : function(aURL,aMode){
4733                        try{
4734                                if(!aURL) return undefined;
4735                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
4736                                var image_data;
4737                                var mime;
4738                                var array = {};
4739                                var size = {};
4740                                try{
4741                                        var pageURI = bitsObjectMng.Common.convertURLToObject(aURL);
4742                                        var faviconURI = bitsObjectMng.Common.FAVICON.getFaviconForPage(pageURI);
4743                                }catch(ex2){}
4744                                if(!faviconURI) return null;
4745                                if(array.value==undefined){
4746                                        var mimeType = {};
4747                                        var dataLen  = {};
4748                                        var dataArr = bitsObjectMng.Common.FAVICON.getFaviconData(faviconURI,mimeType,dataLen);
4749                                        mime = mimeType.value;
4750                                        size.value = dataLen.value;
4751                                        if(size.value>0){
4752                                                array.value = dataArr;
4753                                        }
4754                                }
4755                                if(array.value){
4756                                        var images = String.fromCharCode.apply(String, array.value);
4757                                        image_data = 'data:' + mime + ';base64,' + btoa(images);
4758                                }
4759                                return image_data;
4760                        }catch(ex){
4761                                bitsObjectMng._dump("getFavicon():"+ex);
4762                                return null;
4763                        }
4764                },
4765
4766/////////////////////////////////////////////////////////////////////
4767                removeObject : function(aObject,aMode,aTransaction){
4768                        try{
4769                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
4770                                if(aTransaction == undefined) aTransaction = true;
4771                                if(aTransaction) if(!this.beginTransaction(aMode)) return false;
4772                                var rtn = false;
4773                                if(aObject && aObject.oid){
4774                                        rtn = this.removeLink(aObject,aMode,false);
4775                                        if(rtn && this._oidCount(aMode,aObject.oid,false) == 0){
4776                                           
4777                                                // send DELETE request to MPI REST server 
4778                                                annotationFramework.deleteAnnotationByOid(aObject.oid);
4779                                               
4780                                                var aSql = "delete from om_object";
4781                                                aSql += ' where oid="'+ aObject.oid +'"';
4782                                                rtn = this.cmd(aMode,aSql,false);
4783                                        }
4784                                }
4785                                if(!rtn){
4786                                        bitsObjectMng._dump("bitsObjectMng.Database.removeObject():rtn=["+rtn+"]");
4787                                }
4788
4789                                if(rtn){
4790                                        var dDir = this.getObjectDir(aObject.oid,aMode);
4791                                        if(dDir.exists()) dDir.remove(true);
4792                                        dDir = undefined;
4793                                }
4794                                if(aTransaction) this.endTransaction(aMode);
4795                                if(rtn) nsPreferences.setUnicharPref("wiredmarker.last_update", bitsObjectMng.Common.getTimeStamp()+"\t"+aMode+"\t"+bitsObjectMng.DataSource.inittime + "\tDELETE\tOBJECT");
4796                                return rtn;
4797                        }catch(ex){
4798                                if(aTransaction) this.endTransaction(aMode);
4799                                bitsObjectMng._dump("Database.removeObject():"+ex);
4800                                return false;
4801                        }
4802                },
4803
4804/////////////////////////////////////////////////////////////////////
4805                removeLink : function(aObject,aMode,aTransaction){
4806                        try{
4807                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
4808                                if(aTransaction == undefined) aTransaction = true;
4809                                var aSql = "delete from om_link";
4810                                if(aObject){
4811                                        if(aObject.oid && aObject.pfid){
4812                                                aSql += ' where oid='+ aObject.oid +' and pfid='+ aObject.pfid;
4813                                        }else if(aObject.oid){
4814                                                aSql += ' where oid='+ aObject.oid;
4815                                        }
4816                                }
4817                                var rtn = this.cmd(aMode,aSql,aTransaction);
4818                                if(!rtn) bitsObjectMng.Common.alert("removeLink()!!");
4819                                return rtn;
4820                        }catch(ex){
4821                                bitsObjectMng._dump("Database.removeLink():"+ex);
4822                                bitsObjectMng._dump("Database.removeLink():"+aSql);
4823                                return false;
4824                        }
4825                },
4826
4827/////////////////////////////////////////////////////////////////////
4828                removeFolder : function(aID,aMode,aTransaction){
4829                        try{
4830                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
4831                                if(aTransaction == undefined) aTransaction = true;
4832                                if(aTransaction) if(!this.beginTransaction(aMode)) return null;
4833                                var lSql = 'select oid from om_link';
4834                                if(aID) lSql += ' where pfid="'+ aID +'"';
4835                                var lFld = [];
4836                                var statement = this._dbConn[aMode].createStatement(lSql);
4837                                while(statement.executeStep()){
4838                                        var row = [];
4839                                        for(var j=0,k=statement.columnCount;j<k;j++){
4840                                                row[statement.getColumnName(j)] = statement.getUTF8String(j);
4841                                                if(row[statement.getColumnName(j)] == "null") row[statement.getColumnName(j)] = "";
4842                                        }
4843                                        lFld.push(row);
4844                                }
4845                                statement.reset();
4846                                statement = undefined;
4847                                if(lFld && lFld.length>0){
4848                                        var oSql = 'delete from om_object where oid=?1';
4849                                        for(var i=0;i<lFld.length;i++){
4850                                                try{
4851                                                        statement = this._dbConn[aMode].createStatement(oSql);
4852                                                        statement.bindUTF8StringParameter(0,lFld[i].oid);
4853                                                        statement.execute();
4854                                                        statement.reset();
4855                                                }catch(ex2){
4856                                                        bitsObjectMng._dump("bitsObjectMng.Database.removeFolder():"+ex2);
4857                                                        bitsObjectMng._dump("bitsObjectMng.Database.removeFolder():lFld["+i+"].oid=["+lFld[i].oid+"]");
4858                                                }
4859                                        }
4860                                        statement = undefined;
4861                                        lSql = 'delete from om_link';
4862                                        if(aID) lSql += ' where pfid="'+ aID +'"';
4863                                        statement = this._dbConn[aMode].createStatement(lSql);
4864                                        statement.execute();
4865                                        statement.reset();
4866                                        statement = undefined;
4867                                }
4868                                var fSql = 'select fid from om_folder';
4869                                if(aID) fSql += ' where pfid="'+ aID +'"';
4870                                var fFld = [];
4871                                var statement = this._dbConn[aMode].createStatement(fSql);
4872                                while(statement.executeStep()){
4873                                        var row = [];
4874                                        for(var j=0,k=statement.columnCount;j<k;j++){
4875                                                row[statement.getColumnName(j)] = statement.getUTF8String(j);
4876                                                if(row[statement.getColumnName(j)] == "null") row[statement.getColumnName(j)] = "";
4877                                        }
4878                                        fFld.push(row);
4879                                }
4880                                statement.reset();
4881                                statement = undefined;
4882                                if(fFld && fFld.length>0){
4883                                        for(var i=0;i<fFld.length;i++){
4884                                                bitsObjectMng.Database.removeFolder(fFld[i].fid,aMode,false);
4885                                        }
4886                                }
4887                                var aSql = "delete from om_folder";
4888                                if(aID) aSql += ' where fid="'+ aID +'"';
4889                                var rtn = this.cmd(aMode,aSql,false);
4890                                if(aTransaction) this.endTransaction(aMode);
4891                                if(rtn) nsPreferences.setUnicharPref("wiredmarker.last_update", bitsObjectMng.Common.getTimeStamp()+"\t"+aMode+"\t"+bitsObjectMng.DataSource.inittime + "\tDELETE\tFOLDER");
4892                                return rtn;
4893                        }catch(ex){
4894                                bitsObjectMng._dump("Database.removeFolder():"+ex);
4895                                if(aSql) bitsObjectMng._dump("Database.removeFolder():"+aSql);
4896                                if(aTransaction) this.endTransaction(aMode);
4897                                return false;
4898                        }
4899                },
4900
4901/////////////////////////////////////////////////////////////////////
4902                updateObject : function(aObject,aMode){
4903                        try{
4904                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
4905                                var rtn = true;
4906                                var om_link = {};
4907                                var values = [];
4908                                var para = [];
4909                                var index=0;
4910                                if(aObject.style) delete aObject.style;
4911                                if(aObject.cssstyle) delete aObject.cssstyle;
4912                                if(aObject.oid_property) aObject.oid_property = this._updateOidProperty(aObject,aMode);
4913                                var key;
4914                                for(key in aObject){
4915                                        if(aObject[key] == undefined || key == "oid") continue;
4916                                        if(key == "pfid" || key == "pfid_new"){
4917                                                om_link.pfid = aObject[key];
4918                                                continue;
4919                                        }
4920                                        if(key == "pfid_old"){
4921                                                om_link.pfid_old = aObject[key];
4922                                                continue;
4923                                        }
4924                                        if(key == "pfid_order"){
4925                                                om_link.pfid_order = aObject[key];
4926                                                continue;
4927                                        }
4928                                        values.push(key+'=?'+(++index));
4929                                        para.push(aObject[key]);
4930                                }
4931                                if(!aObject.oid || aObject.oid == "") rtn = false;
4932                                if(rtn && om_link.pfid != undefined && om_link.pfid_old != undefined){
4933                                        if(rtn){
4934                                                if(om_link.pfid != om_link.pfid_old) rtn = !this._linkExists(aMode, {oid:aObject.oid, pfid:om_link.pfid});
4935                                                if(!rtn) bitsObjectMng._dump("bitsObjectMng.Database.updateObject():_linkExists=["+ !rtn + "]");
4936                                        }
4937                                        if(rtn){
4938                                                var aSql = 'update om_link set pfid="'+ om_link.pfid +'" where oid="'+ aObject.oid +'" and pfid="'+ om_link.pfid_old +'"';
4939                                                rtn = this.cmd(aMode,aSql);
4940                                        }
4941                                }
4942                                if(rtn && om_link.pfid != undefined && om_link.pfid_order != undefined){
4943                                        var aSql = 'update om_link set pfid_order="'+ om_link.pfid_order +'" where oid="'+ aObject.oid +'" and pfid="'+ om_link.pfid +'"';
4944                                        rtn = this.cmd(aMode,aSql);
4945                                }
4946                                if(rtn && values.length>0){
4947                                        var aSql = 'update om_object set '+ values.join(",") +' where oid="'+ aObject.oid +'"';
4948                                        //alert("UPDATE oid: "+aObject.oid);
4949                                        annotationProxy.updateAnnotation(aObject);
4950                                        rtn = this.cmdB(aMode,aSql,para);
4951                                }
4952                                if(rtn) nsPreferences.setUnicharPref("wiredmarker.last_update", bitsObjectMng.Common.getTimeStamp()+"\t"+aMode+"\t"+bitsObjectMng.DataSource.inittime + "\tUPDATE\tOBJECT");
4953                                return rtn;
4954                        }catch(ex){
4955                                bitsObjectMng._dump("Database.updateObject():"+ex);
4956                                return false;
4957                        }
4958                },
4959
4960/////////////////////////////////////////////////////////////////////
4961                updateObjectBLOB : function(aOID,aArray,aMode,aTransaction){
4962                        try{
4963                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
4964                                if(aTransaction == undefined) aTransaction = true;
4965                                var rtn = true;
4966                                var om_link = {};
4967                                var values = [];
4968                                if(!aOID || !aArray) return false;
4969                                var imgFile = this.getObjectBLOBFile(aOID,aMode);
4970                                if(!imgFile.exists()) imgFile.create(imgFile.NORMAL_FILE_TYPE, 0664);
4971                                var regexp = new RegExp("^data:image/\\w+?;base64,");
4972                                if(typeof aArray == "object" && aArray.length != undefined){
4973                                        var ostream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
4974                                        ostream.init(imgFile, 0x04 | 0x08 | 0x20, 664, 0); // write, create, truncate
4975                                        var bstream = Components.classes["@mozilla.org/binaryoutputstream;1"].createInstance(Components.interfaces.nsIBinaryOutputStream);
4976                                        bstream.setOutputStream(ostream);
4977                                        bstream.writeByteArray(aArray, aArray.length);
4978                                        ostream.close();
4979                                }else if(typeof aArray == "string" && regexp.test(aArray)){
4980                                        bitsObjectMng.Common.saveDataUrlToFile(aArray,imgFile);
4981                                }else{
4982                                        return false;
4983                                }
4984                                if(aTransaction) if(!this.beginTransaction(aMode)) return null;
4985                                var statement = this._dbConn[aMode].createStatement('update om_object set oid_img=?1 where oid = ?2');
4986                                statement.bindNullParameter(0);
4987                                statement.bindUTF8StringParameter(1,aOID);
4988                                statement.execute();
4989                                statement.reset();
4990                                if(aTransaction) this.endTransaction(aMode);
4991                                statement = undefined;
4992                                return rtn;
4993                        }catch(ex){
4994                                bitsObjectMng._dump("Database.updateObjectBLOB():"+ex);
4995                                return false;
4996                        }
4997                },
4998
4999/////////////////////////////////////////////////////////////////////
5000                updateFolder : function(aFolder,aMode,aTransaction){
5001                        try{
5002                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
5003                                if(aTransaction == undefined) aTransaction = true;
5004                                var values = [];
5005                                var para = [];
5006                                var index=0;
5007                                var key;
5008                                for(key in aFolder){
5009                                        if(aFolder[key] == undefined || key == "fid") continue;
5010                                        values.push(key+'=?'+(++index));
5011                                        para.push(aFolder[key]);
5012                                }
5013                                if(values.length == 0 || !aFolder.fid|| aFolder.fid == "") return false;
5014                                var aSql = 'update om_folder set ' + values.join(",") + ' where fid="'+ aFolder.fid +'"';
5015                                var rtn = this.cmdB(aMode,aSql,para,aTransaction);
5016                                if(rtn) nsPreferences.setUnicharPref("wiredmarker.last_update", bitsObjectMng.Common.getTimeStamp()+"\t"+aMode+"\t"+bitsObjectMng.DataSource.inittime + "\tUPDATE\tFOLDER");
5017                                return rtn;
5018                        }catch(ex){
5019                                bitsObjectMng._dump("ERROR!!:Database.updateFolder():"+ex);
5020                                return false;
5021                        }
5022                },
5023
5024/////////////////////////////////////////////////////////////////////
5025                initSeq : function (){
5026                        this._seqmin = bitsObjectMng.Common.getTimeStamp();
5027                        this._seq = [];
5028                },
5029
5030/////////////////////////////////////////////////////////////////////
5031                _seqIdentify : function (aID,aMode){
5032                        if(aID == undefined) aID = bitsObjectMng.Common.getTimeStamp();
5033                        if(aMode == undefined || aMode == "") aMode = this._defaultMode;
5034                        var i = 0;
5035                        while(this._seq[aID] && i < 100){
5036                                aID = ""+parseInt(this._seqmin)-1;
5037                        }
5038                        this._seq[aID] = aID.toString();
5039                        if(parseInt(aID) < parseInt(this._seqmin)) this._seqmin = this._seq[aID];
5040                        return this._seq[aID];
5041                },
5042
5043/////////////////////////////////////////////////////////////////////
5044                makeObjectToItem : function(aObject,aAbout){
5045                        var info = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
5046                        var app_version = parseInt(info.version);
5047                        var xmldoc = null;
5048                        if(aObject.oid_property && aObject.oid_property != ""){
5049                                try{
5050                                        var parser = new DOMParser();
5051                                        xmldoc = parser.parseFromString(aObject.oid_property, "text/xml");
5052                                        parser = undefined;
5053                                }catch(ex){}
5054                                if(xmldoc && xmldoc.documentElement.nodeName == "parsererror") xmldoc = undefined;
5055                        }
5056                        var newItem = bitsObjectMng.Common.newItem();
5057                        newItem.about = (aAbout?aAbout:bitsObjectMng.DataSource.getAbout(aObject.oid,aObject.pfid,aObject.dbtype));
5058                        newItem.id = aObject.oid;
5059                        newItem.type = "item";
5060                        newItem.title = aObject.oid_title;
5061                        newItem.comment = "";
5062                        newItem.uri = aObject.doc_url;
5063                        newItem.date = aObject.oid_date;
5064                        if(aObject.oid_type.match(/^image\/(.+)$/)){
5065                                if(app_version>2){
5066                                        var blobFile = this.getObjectBLOBFile(aObject.oid,aObject.dbtype);
5067                                        if(blobFile.exists()){
5068                                                if(blobFile.fileSize>0){
5069                                                        var url = bitsObjectMng.Common.convertFilePathToURL(blobFile.path);
5070                                                        if(url) newItem.icon = url;
5071                                                }else if(aObject.oid_txt){
5072                                                        if(bitsObjectMng.Common.getImageFromURL(aObject.oid_txt, blobFile)){
5073                                                                if(blobFile.exists() && blobFile.fileSize>0){
5074                                                                        var url = bitsObjectMng.Common.convertFilePathToURL(blobFile.path);
5075                                                                        if(url) newItem.icon = url;
5076                                                                }
5077                                                        }
5078                                                }
5079                                        }
5080                                }
5081                        }else if(aObject.oid_type == "url"){
5082                                newItem.icon = this.getFavicon(aObject.oid_txt,aObject.dbtype);
5083                                if(!newItem.icon) newItem.icon = this.getFavicon(aObject.doc_url,aObject.dbtype);
5084                        }else{
5085                                var icon;
5086                                if(xmldoc){
5087                                        var xmlnode = xmldoc.getElementsByTagName("ICON")[0];
5088                                        if(xmlnode) icon = xmlnode.textContent;
5089                                }else{
5090                                        if(aObject.oid_property.match(/^.*<ICON>(.+?)<\/ICON>.*$/m)){
5091                                                icon = RegExp.$1;
5092                                        }
5093                                }
5094                                if(icon != undefined && icon != ""){
5095                                        var url = Components.classes['@mozilla.org/network/standard-url;1'].createInstance(Components.interfaces.nsIURL);
5096                                        url.spec = icon;
5097                                        if(url.scheme == "file"){
5098                                                var file = bitsObjectMng.Common.convertURLToFile(icon)
5099                                                if(!file.exists()) icon = undefined;
5100                                        }else if(url.scheme == "chrome"){
5101                                                var val = this.existsIcon(url);
5102                                                if(!val) icon = undefined;
5103                                        }
5104                                }
5105                                if(icon != undefined && icon != "") newItem.icon = icon;
5106                        }
5107                        if(!newItem.icon){
5108                                try{
5109                                        newItem.icon = this.getFavicon(aObject.doc_url,aObject.dbtype);
5110                                        if(newItem.icon == undefined) delete newItem.icon;
5111                                }catch(ex){}
5112                        }
5113                        if(!newItem.icon){
5114                                if(aObject.oid_type.match(/^image\//)){
5115                                        newItem.icon = "chrome://markingcollection/skin/image.png";
5116                                }else{
5117                                        newItem.icon = "chrome://markingcollection/skin/defaultFavicon.png";
5118                                }
5119                        }
5120                        if(xmldoc){
5121                                var xmlnode = xmldoc.getElementsByTagName("TREE_TITLE")[0];
5122                                if(xmlnode) newItem.title = xmlnode.textContent;
5123                        }else if(aObject.oid_property){
5124                                if(aObject.oid_property.match(/^.*<TREE_TITLE>(.+?)<\/TREE_TITLE>.*$/m)){
5125                                        newItem.title = RegExp.$1;
5126                                }
5127                        }
5128                        if(!aObject.oid_type.match(/^image\/(.+)$/)){
5129                                newItem.source = bitsMarker.id_key+aObject.dbtype+aObject.oid;
5130                        }
5131                        newItem.editmode = aObject.oid_mode;
5132                        newItem.pfid = aObject.pfid;
5133                        newItem.pfid_order = aObject.pfid_order;
5134                        newItem.dbtype = aObject.dbtype;
5135                        newItem.list = null;
5136                        return newItem;
5137                },
5138
5139/////////////////////////////////////////////////////////////////////
5140                existsIcon : function(aURI){
5141                        var rtn = false;
5142                        try{
5143                                const IOService = bitsObjectMng.Common.IO;
5144                                var channel = IOService.newChannelFromURI(aURI);
5145                                var stream  = channel.open();
5146                                var bstream = Components.classes['@mozilla.org/binaryinputstream;1'].createInstance(Components.interfaces.nsIBinaryInputStream);
5147                                bstream.setInputStream(stream);
5148                                if(bstream.available()>0) rtn = true;
5149                                bstream.close();
5150                                stream.close();
5151                        }
5152                  catch(e){}
5153                  return rtn;
5154                },
5155
5156/////////////////////////////////////////////////////////////////////
5157                makeRdf : function (aID,aRecursive,aNewID,aPfid2Folder,aFid2Folder,aPfid2Object,aFile,aMode){
5158                        try{
5159                                if(aMode == undefined || aMode == "") aMode = this._defaultMode;
5160                                var baseID = aID;
5161                                var results = [];
5162                                var dirArray = [];
5163                                var fileArray = [];
5164                                var folders = null;
5165                                if(aID == undefined){
5166                                        baseID = "0";
5167                                        folders = aPfid2Folder[baseID];
5168                                }else{
5169                                        folders = aFid2Folder[baseID];
5170                                }
5171                                if(folders){
5172                                        var folderFilterHash;
5173                                        var tmpFolderFilter = nsPreferences.copyUnicharPref("wiredmarker.filter.folder","");
5174                                        var tmpFolderFilterArr = tmpFolderFilter.split("\t");
5175                                        var i;
5176                                        for(i=0;i<tmpFolderFilterArr.length;i++){
5177                                                if(!tmpFolderFilterArr[i].match(/^(\d+):(\d+):(.+)$/)) continue;
5178                                                if(!folderFilterHash) folderFilterHash = {};
5179                                                var filter_fid = RegExp.$1;
5180                                                var filter_casesensitive = RegExp.$2;
5181                                                var filter_keyword = RegExp.$3;
5182                                                folderFilterHash[filter_fid] = new RegExp(filter_keyword,(filter_casesensitive==1)?"mg":"img");
5183                                        }
5184                                        tmpFolderFilterArr = undefined;
5185                                        tmpFolderFilter = undefined;
5186                                        var icon;
5187                                        var i;
5188                                        for(i=0;i<folders.length;i++){
5189                                                var newItem = bitsObjectMng.Common.newItem();
5190                                                newItem.about = bitsObjectMng.DataSource.getAbout(folders[i].fid,folders[i].pfid,aMode);
5191                                                newItem.id = folders[i].fid;
5192                                                newItem.pfid = folders[i].pfid;
5193                                                newItem.type = "folder";
5194                                                newItem.title = folders[i].fid_title;
5195                                                newItem.comment = "";
5196                                                newItem.style = folders[i].fid_style;
5197                                                newItem.editmode = folders[i].fid_mode;
5198                                                newItem.pfid_order = folders[i].pfid_order;
5199                                                newItem.cssrule = 'css_'+aMode+'_'+folders[i].fid;
5200                                                newItem.dbtype = folders[i].dbtype;
5201                                                newItem.Folder = "true";
5202                                                newItem.list = null;
5203                                                newItem.addon_id = "";
5204                                                newItem.contextmenu = "";
5205                                                newItem.shortcut = "";
5206                                                bitsObjectMng.DataSource.setID2About(folders[i].fid,folders[i].pfid,newItem.about,aMode);
5207                                                var xmldoc = null;
5208                                                if(folders[i].fid_property && folders[i].fid_property != ""){
5209                                                        try{
5210                                                                var parser = new DOMParser();
5211                                                                xmldoc = parser.parseFromString(folders[i].fid_property, "text/xml");
5212                                                                parser = undefined;
5213                                                        }catch(ex){}
5214                                                        if(xmldoc && xmldoc.documentElement.nodeName == "parsererror") xmldoc = undefined;
5215                                                }
5216                                                icon = undefined;
5217                                                if(folderFilterHash && folderFilterHash[folders[i].fid]) icon = "chrome://markingcollection/skin/filter.png";
5218                                                if(!icon){
5219                                                        if(xmldoc){
5220                                                                var xPathResult = bitsObjectMng.XPath.evaluate('/PROPERTY[1]/ADDON[1]/ICON[1]', xmldoc);
5221                                                                if(xPathResult && xPathResult.snapshotLength>0){
5222                                                                        icon = xPathResult.snapshotItem(0).textContent;
5223                                                                }else{
5224                                                                        var xmlnode = xmldoc.getElementsByTagName("ICON")[0];
5225                                                                        if(xmlnode) icon = xmlnode.textContent;
5226                                                                }
5227                                                                xPathResult = undefined;
5228                                                                var xPathResult = bitsObjectMng.XPath.evaluate('/PROPERTY[1]/ADDON[1]/ID[1]', xmldoc);
5229                                                                if(xPathResult && xPathResult.snapshotLength>0){
5230                                                                        if(newItem.addon_id != "") newItem.addon_id += "\n";
5231                                                                        newItem.addon_id = xPathResult.snapshotItem(0).textContent;
5232                                                                }
5233                                                                xPathResult = undefined;
5234                                                        }else if(folders[i].fid_property){
5235                                                                if(folders[i].fid_property.match(/^.*<ICON>(.+?)<\/ICON>.*$/m)){
5236                                                                        icon = RegExp.$1;
5237                                                                }
5238                                                        }
5239                                                }
5240                                                if(icon != undefined && icon != ""){
5241                                                        var url = Components.classes['@mozilla.org/network/standard-url;1'].createInstance(Components.interfaces.nsIURL);
5242                                                        url.spec = icon;
5243                                                        if(url.scheme == "file"){
5244                                                                var file = bitsObjectMng.Common.convertURLToFile(icon)
5245                                                                if(!file.exists()) icon = undefined;
5246                                                        }else if(url.scheme == "chrome"){
5247                                                                var val = this.existsIcon(url);
5248                                                                if(!val) icon = undefined;
5249                                                        }
5250                                                }
5251                                                if(icon != undefined && icon != "") newItem.icon = icon;
5252                                                var contextmenu;
5253                                                contextmenu = undefined;
5254                                                if(xmldoc){
5255                                                        var xPathResult = bitsObjectMng.XPath.evaluate('/PROPERTY[1]/CONTEXTMENU[1]', xmldoc);
5256                                                        if(xPathResult && xPathResult.snapshotLength>0){
5257                                                                contextmenu = xPathResult.snapshotItem(0).textContent;
5258                                                        }else{
5259                                                                var xmlnode = xmldoc.getElementsByTagName("CONTEXTMENU")[0];
5260                                                                if(xmlnode) contextmenu = xmlnode.textContent;
5261                                                        }
5262                                                        xPathResult = undefined;
5263                                                }else if(folders[i].fid_property){
5264                                                        if(folders[i].fid_property.match(/^.*<CONTEXTMENU>(.+?)<\/CONTEXTMENU>.*$/m)){
5265                                                                contextmenu = RegExp.$1;
5266                                                        }
5267                                                }
5268                                                if(contextmenu != undefined && contextmenu != "") newItem.contextmenu = contextmenu;
5269                                                dirArray.push(newItem);
5270                                        }
5271                                        folders = undefined
5272                                }else{
5273                                        return null;
5274                                }
5275                                if(dirArray.length>0){
5276                                        var cnt;
5277                                        for(cnt=0;cnt<dirArray.length;cnt++){
5278                                                var result = [];
5279                                                if(aRecursive){
5280                                                        var folders = aPfid2Folder[dirArray[cnt].id];
5281                                                        if(folders){
5282                                                                var i;
5283                                                                for(i=0;i<folders.length;i++){
5284                                                                        var rtn = this.makeRdf(folders[i].fid,aRecursive,aNewID,aPfid2Folder,aFid2Folder,aPfid2Object,undefined,aMode);
5285                                                                        if(!rtn || !rtn.list) continue;
5286                                                                        result = result.concat(rtn.list);
5287                                                                }
5288                                                        }
5289                                                }
5290                                                var objects = aPfid2Object[dirArray[cnt].id];
5291                                                if(objects){
5292                                                        var i;
5293                                                        for(i=0;i<objects.length;i++){
5294                                                                var newItem = this.makeObjectToItem(objects[i]);
5295                                                                fileArray.push(newItem);
5296                                                        }
5297                                                        objects = undefined
5298                                                }
5299                                                if(fileArray.length>0) result = result.concat(fileArray);
5300                                                dirArray[cnt].list = result;
5301                                                results.push(dirArray[cnt]);
5302                                                result = null;
5303                                                fileArray = [];
5304                                        }
5305                                }
5306                                dirArray = null;
5307                                fileArray = null;
5308                                if(aFile != undefined){
5309                                        var out_txt = "";
5310                                        var out_txt_utf8 = "";
5311                                        out_txt += '<?xml version="1.0"?>\n';
5312                                        out_txt += '<RDF:RDF xmlns:NS1="' + bitsObjectMng.NS_OBJECTMANAGEMENT + '"\n';
5313                                        out_txt += '         xmlns:NC="http://home.netscape.com/NC-rdf#"\n';
5314                                        out_txt += '         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">\n';
5315                                        out_txt += '  <RDF:Seq RDF:about="'+ bitsObjectMng.DataSource.ABOUT_ROOT +'">\n';
5316                                        if(results){
5317                                                var cnt;
5318                                                for(cnt=0;cnt<results.length;cnt++){
5319                                                        out_txt += '    <RDF:li RDF:resource="'+ results[cnt].about +'"/>\n';
5320                                                }
5321                                        }
5322                                        out_txt += '  </RDF:Seq>\n';
5323                                        out_txt += this._outputRDF(results);
5324                                        out_txt += '</RDF:RDF>\n';
5325                                        bitsObjectMng.Common.writeFile(aFile,out_txt,"UTF-8");
5326                                }
5327                                return {list:results, id:baseID };
5328                        }catch(e){
5329                                bitsObjectMng._dump("bitsObjectMng.makeRdf()"+e);
5330                                return undefined;
5331                        }
5332                },
5333
5334/////////////////////////////////////////////////////////////////////
5335                _outputRDF : function(pArray){
5336                        var cnt;
5337                        var seq;
5338                        var key;
5339                        var out_txt = "";
5340                        for(cnt=0;cnt<pArray.length;cnt++){
5341                                if(pArray[cnt].list){
5342                                        out_txt += '  <RDF:Seq RDF:about="'+ pArray[cnt].about +'">\n';
5343                                        if(pArray[cnt].list){
5344                                                pArray[cnt].list.sort(
5345                                                        function(a,b){
5346                                                                var len = parseInt(a.pfid_order)-parseInt(b.pfid_order);
5347                                                                return len;
5348                                                        }
5349                                                );
5350                                                for(seq=0;seq<pArray[cnt].list.length;seq++){
5351                                                        out_txt += '    <RDF:li RDF:resource="'+ pArray[cnt].list[seq].about +'"/>\n';
5352                                                }
5353                                        }
5354                                        out_txt += '  </RDF:Seq>\n';
5355                                }
5356                                if(pArray[cnt].id != "0"){
5357                                        out_txt += '  <RDF:Description RDF:about="' + pArray[cnt].about +'"';
5358                                        for(key in pArray[cnt]){
5359                                                if(key == "list") continue;
5360                                                if(key == "about") continue;
5361                                                if(pArray[cnt][key] == undefined) continue;
5362                                                if(typeof pArray[cnt][key] == "function") continue;
5363                                                pArray[cnt][key] = pArray[cnt][key].replace(/&/mg,"&amp;").replace(/</mg,"&lt;").replace(/>/mg,"&gt;").replace(/\"/mg,"&quot;");
5364                                                if(pArray[cnt][key] != undefined) out_txt += '\n                   NS1:'+key+'="'+pArray[cnt][key]+'"';
5365                                        }
5366                                        out_txt += '/>\n';
5367                                }
5368                                if(pArray[cnt].list){
5369                                        out_txt += this._outputRDF(pArray[cnt].list);
5370                                }
5371                        }
5372                        return out_txt;
5373                },
5374
5375/////////////////////////////////////////////////////////////////////
5376        },
5377
5378};
Note: See TracBrowser for help on using the repository browser.