/* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * The Original Code is bookmarkshome * * The Initial Developer of the Original Code is Jeroen Groenenboom. * * Contributor(s): * Dimiter Dimitrov * Josh Powell * Jean-Bernard Marcon * * ***** END LICENSE BLOCK ***** */ // constructor for column function ColumnTd() { this.node = document.createElement( "td" ); this.offsetNode = document.createElement( "div" ); this.node.appendChild( this.offsetNode ); } ColumnTd.prototype = { isEmpty: function() { return this.offsetNode == this.node.firstChild; }, getOffset: function() { return this.offsetNode.offsetTop; }, add: function( folderDiv ) { this.node.insertBefore( folderDiv.node, this.offsetNode ); } } // constructor for folder function FolderDiv( ancestors, index ) { this.node = document.createElement( "div" ); this.folderUl = document.createElement( "ul" ); this.node.setAttribute( "class", "folder" ); // folder h1 var folderH1 = document.createElement( "h1" ); this.node.appendChild( folderH1 ); // folder anchor var folderA = document.createElement( "a" ); folderA.setAttribute( "class", "headerLink" ); var listId = "folderList" + index; folderA.setAttribute( "href", "javascript:void(bmhCheck('openFolder','" + listId + "'))" ); this.createHeaderText( ancestors, folderA ); folderH1.appendChild( folderA ); //this.startDepth = this.depth; // folder ul this.folderUl.setAttribute( "id", listId ); this.node.appendChild( this.folderUl ); } FolderDiv.prototype = { isEmpty: function() { return ! this.folderUl.hasChildNodes(); }, // create folder header based on maximum header lines pref createHeaderText: function( ancestors, folderA ) { var headerArray = eval( ancestors.toSource() ); var top = headerArray.length - bMHPrefs.getPref( "maxHeaderLines" ); var i = top; if( top > 1 ) { // at least one ancestor won't be displayed headerArray[top] = "> ".concat( headerArray[top] ); i--; // append '>' for other ancestors that won't be displayed for( ; i > 1; i-- ) { headerArray[top] = ">".concat( headerArray[top] ); } } // top <= 1 -> all ancestors (except root) will be displayed i = ( top <= 1 ? 1 : top ); // root ancestor only displayed for root folder if( ancestors.length == 1 ) { i = 0; } var folderName, headerBr, span; for( ; i < headerArray.length; i++ ) { folderName = document.createTextNode( this.processName( headerArray[i] )); span = document.createElement( "span" ); folderA.appendChild( span ); span.appendChild( folderName ); } }, add: function( name, url, description, icon, type ) { // folder li var folderLi = document.createElement( "li" ); this.folderUl.appendChild( folderLi ); // folder a var folderA = document.createElement( "a" ); folderA.setAttribute( "href", url ); var title = this.getTitle( name, description ); if( title ) { folderA.setAttribute( "title", title ); } folderLi.appendChild( folderA ); var aName = this.processName( name ); // text a var aText = document.createTextNode( aName ); // icons, list style icons doesn't work var image; if( icon != "" ) { image = document.createElement( "img" ); image.setAttribute( "src", icon ); image.setAttribute( "alt", "" ); if( type == "Folder" ) { image.setAttribute( "class", "normalIcon" ); } else if( type == "Livemark" ) { image.setAttribute( "class", "LivemarkIcon" ); } // display depends on prefs image.style.display = bMHPrefs.getIconDisplay( type, bMHPrefs.getPref( "iconDisplay" )); folderA.appendChild( image ); } folderA.appendChild( aText ); }, getTitle: function( name, description ) { return name.length > bMHPrefs.getPref( "maxNameLength" ) ? name : null; }, processName: function( name ) { var displayName = name; var reg1 = /^(?:\w+:[\/\\]{1,3}(?:www\.)?)/; var reg2 = /.{2}$/; max = bMHPrefs.getPref( "maxNameLength" ); if( displayName.length > max ) { // remove protocol of url displayName = displayName.replace( reg1, "" ); if( displayName.length > max ) { displayName = displayName.substring( 0, max ); // show that name is longer than portrayed displayName = displayName.replace( reg2, ".." ); } } return displayName; } } function Folder( node, ancestors, type ) { this.node = node; this.type = type; // ancestors include name of folder this.ancestors = ancestors; } var bookmarksHome = { main: function() { // RDF variables var RDF = bMHPrefs.getRDF(); var RDFC = bMHPrefs.getRDFC(); var RDFCU = bMHPrefs.getRDFCU(); var BMDS = RDF.GetDataSource("rdf:bookmarks"); var root = RDF.GetResource( "NC:BookmarksRoot" ); var NameArc = RDF.GetResource( bMHPrefs.NC_NS + "Name" ); var URLArc = RDF.GetResource( bMHPrefs.NC_NS + "URL" ); var IconArc = RDF.GetResource( bMHPrefs.NC_NS + "Icon" ); var DescriptionArc = RDF.GetResource( bMHPrefs.NC_NS + "Description" ); var typeArc = RDF.GetResource( bMHPrefs.RDF_NS + "type" ); // initialize preferences bMHPrefs.init(); var curName = bMHPrefs.getProperty( root, NameArc, BMDS ); var curFolder = new Folder( root, [curName], "Folder" ); var folderStack = new Array( curFolder ); var inOrExcludedFolders = bMHPrefs.getPref( "inOrExcludedFolders" ).split( "|" ); var enumerator, tempFolders, curNode; var curType, curURL, curDesc, curIcon, curNodeAncestors; // add style bookmarksHome.addStyle(); // hide or display search bar bookmarksHome.showHideSearchBar(); var mainRow = document.getElementsByTagName( "tr" )[0]; var columns = bMHPrefs.getPref( "nrOfColumns" ); var columnTds = new Array( columns ); // add preferred nr of columns to page var i; for( i = 0; i < columnTds.length; i++ ) { columnTds[i] = new ColumnTd(); mainRow.appendChild( columnTds[i].node ); } var folderDiv; var isExcluded, folderIndex = 0; // make page while( folderStack.length > 0 ) { curFolder = folderStack.pop(); folderIndex++; folderDiv = new FolderDiv( curFolder.ancestors, folderIndex ); RDFC.Init( BMDS, curFolder.node ); enumerator = RDFC.GetElements(); tempFolders = new Array(); while( enumerator.hasMoreElements() ) { curNode = enumerator.getNext(); curType = bMHPrefs.getProperty( curNode, typeArc, BMDS ) .split( "#" )[1]; curName = bMHPrefs.getProperty( curNode, NameArc, BMDS ); if( curType == "Bookmark" ) { // Bookmark curURL = bMHPrefs.getProperty( curNode, URLArc, BMDS ); curDesc = bMHPrefs.getProperty( curNode, DescriptionArc, BMDS ); curIcon = bMHPrefs.getProperty( curNode, IconArc, BMDS ); // icon in link of bmh page is not picked up by FF if( curURL == "about:bookmarkshome" || curURL == "chrome://bookmarkshome/locale/bookmarksHome.html" ) { curIcon = document.getElementsByTagName( "link" )[0].getAttribute( "href" ); } folderDiv.add( curName, curURL, curDesc, curIcon, curFolder.type ); } else if( curType == "Folder" || curType == "Livemark" ) { // Folder curNodeAncestors = curFolder.ancestors.concat( [curName] ); tempFolders.push( new Folder( curNode, curNodeAncestors, curType )); } } isExcluded = false; isExcluded = bMHPrefs.isExcludedFolder( encodeURI( curFolder.ancestors.toString()), bMHPrefs.getPref( "excludeIndex" ), inOrExcludedFolders ); // check if folder contains bookmarks and is not excluded // Display empty livemarks if(( ! folderDiv.isEmpty() || curFolder.type == "Livemark" ) && ! isExcluded ) { i = bookmarksHome.smallestColumn( columnTds ); // add folder to smallest column columnTds[i].add( folderDiv ); } // reverse to match order in bookmarks tree folderStack = folderStack.concat( tempFolders.reverse() ); } // remove empty columns for( i = 0; i < columnTds.length; i++ ) { if( columnTds[i].isEmpty() ) { mainRow.removeChild( columnTds[i].node ); } } }, showHideSearchBar: function() { var displayValue = bMHPrefs.getSearchFormDisplay( bMHPrefs.getPref( "hideSearchEngines" )); var searchDiv = document.getElementById( "searchForm" ); searchDiv.style.display = displayValue; if( displayValue != "none" ) { document.getElementById( "engineSelect" ) .selectedIndex = bMHPrefs.getPref( "engine" ); document.getElementById( "queryInput" ).focus(); } }, smallestColumn: function( columns ) { var index = 0; for(var i = 1; i < columns.length; i++ ) { if( columns[i].getOffset() < columns[index].getOffset() ) { index = i; } } return index; }, addStyle: function() { // get styles datasource var stylesDS = bMHPrefs.getStylesDS(); var RDF = bMHPrefs.getRDF(); // get default style var defaultStyle = RDF.GetResource( bMHPrefs.stylesNS + bMHPrefs.getPref( "styleName" )); var sheetArc = RDF.GetResource( bMHPrefs.stylesNS + "sheet" ); var defaultSheet = bMHPrefs.getProperty( defaultStyle, sheetArc, stylesDS ); // insert stylesheet in document var styleTag = document.getElementsByTagName( "style" )[0]; styleTag.innerHTML = bMHPrefs.formatSheet( defaultSheet ); } }