User:Whiteknight/bookpage.js
From Wikibooks, open books for an open world
Note: After saving, changes may not occur immediately. Click here to learn how to bypass your browser's cache.
- Mozilla / Firefox / Safari: hold down Shift while clicking Reload, or press Ctrl-Shift-R (Cmd-Shift-R on Apple Mac);
- Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5;
- Konqueror: simply click the Reload button, or press F5;
- Opera users may need to completely clear their cache in Tools→Preferences.
| Code that you insert on this page could contain malicious content capable of compromising your account. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate reading room. The code will be executed when previewing this page under some skins, including Monobook. |
|
|
Documentation for this script can be added at User:Whiteknight/bookpage. |
// <source lang="javascript"> //class constructor for BookPage function BookPage(name) { if(name.match(/\s$/)) name = name.substring(0, name.length - 1); this.pagename = name; this.headings = new Array(); this.subpages = new Array(); this.formspan = wk.makeElement('div'); this.parent = null; //subpage parent, null if root this.parent2 = null; //heading parent, null if not in a heading. this.pagetext = ""; //initial text of a page this.comments = ""; //comment text which is in the outline only this.collapse = vbd.defaultcollapse; //flag to collapse part of the tree this.inherittext = vbd.defaultinherit; //flag to inherit text from parent this.box = null; } //add a new heading to the page BookPage.prototype.addHeading = function(heading) { heading.parent = this; this.headings.push(heading); } //add a new subpage to the page BookPage.prototype.addSubpage = function(subpage) { subpage.parent = this; this.subpages.push(subpage); } //create a special node for a page that is to be created but does not appear in the outline BookPage.prototype.makeSpecialPageNode = function(name) { // Create a node that thinks it's a subpage, but isn't included in the list of subpages of the parent. var node = new BookPage(name); node.parent = this; node.formspan = null; return node; } //Show a little animation when things are happening behind the scenes BookPage.prototype.makeLoadingNotice = function(text) { this.formspan.innerHTML = "<img src=\"http://upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif\"> <big>" + text + "...</big>" } //make an editor, according to the users preferences BookPage.prototype.makeEditInterface = function(page, deftext, defsummary) { if(vbd.useexternaledit) wk.showEditWindowExternal(page, deftext, defsummary); else { var self = this; this.makeLoadingNotice("Loading"); wk.loadEditPage(page, function (xml) { wk.showEditWindowSmall(xml, self.formspan, deftext, defsummary); self.closeButton(); }); } } //create the part of the outline for the page text and comments BookPage.prototype.getTextNode = function () { var self = this; var div = wk.makeElement('small', null, ((this.pagetext.length == 0)?('[click here to edit page text]'):(this.pagetext))); div.innerHTML = div.innerHTML + ((this.inherittext && !this.isRoot())?(' (inherited)'):("")) var cmts = wk.makeElement('small', {style:'color: #666666'}, ((this.comments.length == 0)?('[click here to edit comments]'):(this.comments))); div.onclick = function() { var edit = wk.makeElement('textarea', {rows:10}); edit.value = self.pagetext; self.formspan.innerHTML = 'Enter some text for the page:'; self.formspan.appendChild(edit); if(!self.isRoot()) { var inherit = wk.makeElement('input', {type:"checkbox"}); inherit.checked = self.inherittext; wk.appendChildren(self.formspan, [inherit, 'inherit text from parent?']); } self.formspan.appendChild(wk.makeButton('', 'Save', function() { if(!self.isRoot()) self.inherittext = inherit.checked; self.pagetext = edit.value; if(self.pagetext.match(/^\s*$/)) self.pagetext = ""; self.formspan.innerHTML = ""; vbd.visual(); })); self.closeButton(); edit.focus(); } div.style.cursor = "pointer"; cmts.onclick = function() { var edit = wk.makeElement('textarea', {rows:10}); edit.value = self.comments; self.formspan.innerHTML = 'Enter some comments:'; self.formspan.appendChild(edit); self.formspan.appendChild(wk.makeButton('', 'Save', function() { self.comments = edit.value; if(self.comments.match(/^\s*$/)) self.comments = ""; self.formspan.innerHTML = ""; vbd.visual(); })); self.closeButton(); edit.focus(); } cmts.style.cursor = "pointer"; return wk.makeElement('table', {width:"100%", style:"background-color: transparent"}, [ wk.makeElement('td', {width:"50%", style:"padding-left: 2em;"}, div), wk.makeElement('td', {style:"padding-left: 2em;"}, cmts) ]); } //remove a subpage BookPage.prototype.removeSubpage = function(subpage) { for(var i = 0; i < this.subpages.length; i++) { if(this.subpages[i] != subpage) continue; this.subpages.splice(i, 1); return; } } //remove a heading BookPage.prototype.removeHeading = function(heading) { for(var i = 0; i < this.headings.length; i++) { if(this.headings[i] != heading) continue; this.headings.splice(i, 1); return; } } //create a link to modify the list of headings. BookPage.prototype.makeHeadingsLink = function () { var link = wk.makeElement('a', null, ['Headings']); var self = this; link.onclick = function() { var text = ""; for(var i = 0; i < self.headings.length; i++) { text = text + self.headings[i].label + "\n"; } var old = vbd.CopyArray(self.headings); var edit = wk.makeElement('textarea', {rows:10, cols:50}); edit.value = text; self.formspan.innerHTML = ""; self.formspan.appendChild(document.createTextNode( 'Enter the names of all headings, one per line')); self.formspan.appendChild(edit); self.formspan.appendChild(wk.makeButton('', 'Save', function() { self.headings.length = 0; var pages = edit.value.split("\n"); for(var i = 0; i < pages.length; i++) { if(pages[i].match(/^\s*$/)) continue; var stat = vbd.FindHeadNameInArray(old, pages[i]); if(stat != -1) { self.addHeading(old[stat]); } else { self.addHeading(new PageHeading(vbd.forceFirstCaps(pages[i]))); } } self.formspan.innerHTML = ""; vbd.visual(); })); self.closeButton(); edit.focus(); } return(link); } //create a link to add a new subpage BookPage.prototype.makeSubpagesAddLink = function () { var link = wk.makeElement('a', null, [" [ + ]"]); var self = this; link.onclick = function () { self.addSubpage(new BookPage(vbd.defpagename + " " + vbd.newpagecnt)); vbd.newpagecnt++; vbd.visual(); } return link; } //create a link to add a new heading BookPage.prototype.makeHeadingsAddLink = function () { var link = wk.makeElement('a', null, [" [ + ]"]); var self = this; link.onclick = function () { self.addHeading(new PageHeading(vbd.defheadname + " " + vbd.newheadcnt)); vbd.newheadcnt++; vbd.visual(); } return link; } //make a list to modify the list of subpages BookPage.prototype.makeSubpagesLink = function () { var link = wk.makeElement('a', null, ['Subpages']); var self = this; link.onclick = function() { var text = ""; for(var i = 0; i < self.subpages.length; i++) { text = text + self.subpages[i].pagename + "\n"; } var old = vbd.CopyArray(self.subpages); var edit = wk.makeElement('textarea', {rows:10, cols:50}); edit.value = text; self.formspan.innerHTML = ""; self.formspan.appendChild(document.createTextNode('Enter subpages, one per line')); self.formspan.appendChild(edit); self.formspan.appendChild(wk.makeButton('', 'Save', function() { self.subpages.length = 0; var pages = edit.value.split("\n"); for(var i = 0; i < pages.length; i++) { if(pages[i].match(/^\s*$/)) continue; var stat = vbd.FindPageNameInArray(old, pages[i]); if(stat != -1) self.addSubpage(old[stat]); else self.addSubpage(new BookPage(vbd.forceFirstCaps(pages[i]))); } self.formspan.innerHTML = ""; vbd.visual(); })); self.closeButton(); edit.focus(); } return(link); } //display the title of the page BookPage.prototype.getTitleNode = function () { var self = this; var container = wk.makeElement('span'); var collapse = wk.makeElement('small', null, ((this.collapse == 0)?('[-] '):('[+] '))); collapse.style.cursor = "pointer"; collapse.onclick = function () { self.collapse = (self.collapse == 1)?(0):(1); vbd.visual(); } var span = wk.makeElement('big', {style:"font-weight: bold;"}, this.pagename); span.style.cursor = "pointer"; span.onclick = function() { var edit = wk.makeElement('input', {type:'text', value:(self.pagename), size:50}); self.formspan.innerHTML = ""; wk.appendChildren(self.formspan, ['Enter the new name: ', edit, wk.makeButton('', 'Rename', function() { self.formspan.innerHTML = "Renaming..."; var pagename = vbd.forceCaps(edit.value, self.isRoot()); if(self.isRoot()) wk.loadWikiText(pagename, function (text) { if(text.length != 0) self.formspan.innerHTML = "<b>Warning:</b> " + pagename + " already exists. Check it before saving over it."; else self.formspan.innerHTML = ""; }); else self.formspan.innerHTML = ""; self.pagename = pagename.replace("\n", ""); vbd.visual(); })]); if(!self.isRoot()) self.formspan.appendChild(wk.makeButton('', 'Delete', function () { if(confirm("delete page '" + self.pagename + "'?")) { if(self.parent2 == null) self.parent.removeSubpage(self); else self.parent2.removeSubpage(self); vbd.visual(); } })); self.closeButton(); } if(this.subpages.length != 0 || this.headings.length != 0) container.appendChild(collapse); container.appendChild(span); return(container); } //functions for dealing with recursion BookPage.prototype.isRoot = function () { return (this.parent == null)?(1):(0); } BookPage.prototype.getFullName = function() { if(this.isRoot()) return this.pagename; return this.parent.getFullName() + "/" + this.pagename; } BookPage.prototype.getDepth = function() { if(this.isRoot()) return 0; return this.parent.getDepth() + 1; } BookPage.prototype.getBookName = function () { if(this.isRoot()) return this.pagename; return this.parent.getBookName(); } //make wikitext of a page, using nested asterisks, as required BookPage.prototype.makeWikitextLinkStars = function (parent) { var depth = this.getDepth() - ((parent != null)?(parent.getDepth()):(0)); var stars = ""; for(var i = 0; i < depth; i++) { stars = stars + "*"; } var text = stars + "[[" + this.getFullName() + "|" + this.pagename + "]]\n"; text = text.replace(/\n/g, "") + "\n"; for(var i = 0; i < this.subpages.length; i++) { text += this.subpages[i].makeWikitextLinkStars(parent); } for(var i = 0; i < this.headings.length; i++) { text += this.headings[i].makeWikitextLinkStars(parent); } return text; } //make links for a subpage, as formattined for a template BookPage.prototype.makeTemplateLinks = function () { var text = "[[" + this.getFullName() + "|" + this.pagename + "]] - "; for(var i = 0; i < this.subpages.length; i++) { text += this.subpages[i].makeTemplateLinks() + " - "; } for(var i = 0; i < this.headings.length; i++) { text += this.headings[i].makeTemplateLinks(); } return text; } //make a link for a page without nested asterisks BookPage.prototype.makeWikitextLink = function () { return "*[[" + this.getFullName() + "|" + this.pagename + "]]"; } BookPage.prototype.getPageText = function() { if(!this.inherittext || this.isRoot()) return this.pagetext; return this.parent.getPageText() + "\n" + this.pagetext; } //make the wikitext of an entire page BookPage.prototype.makeWikitextPage = function () { var text = "{{" + this.getBookName() + "/Page}}\n\n"; for(var i = 0; i < this.subpages.length; i++) { text = text + this.subpages[i].makeWikitextLinkStars(this); } text += this.getPageText() + "\n"; for(var i = 0; i < this.headings.length; i++) { text = text + this.headings[i].makeWikitext(this) + "\n"; } text = text + "[[Category:" + this.getBookName() + "]]\n"; return text; } //make the wikitext for the special root page BookPage.prototype.makeWikitextRoot = function () { var text = "{{New book}}\n{{" + this.pagename + "/Page}}\n" + "{{Reading level|" + vbd.readingLevels[vbd.readingLevel] + "}}\n\n"; text += "== Preface ==\n" + this.pagetext + "\n"; text += "== Table of Contents ==\n\n"; if(vbd.useintroduction) text += "*[[" + this.pagename + "/Introduction|Introduction]]\n"; for(var i = 0; i < this.subpages.length; i++) { text += this.subpages[i].makeWikitextLinkStars(); } text += "\n"; for(var i = 0; i < this.headings.length; i++) { text += this.headings[i].makeWikitext() + "\n"; } text += "\n== Resources and Licensing ==\n\n"; if(vbd.useresources) text += "*[[" + this.pagename + "/Resources|Resources]]\n"; if(vbd.uselicensing) text += "*[[" + this.pagename + "/Licensing|Licensing]]\n"; text += "\n[[Category:" + this.getBookName() + "]]\n"; text += "{{Subject"; for(var i = 0; i < vbd.subjects.length; i++) { text += "|" + vbd.subjects[i]; } text += "}}\n{{Alphabetical|" + this.pagename.substr(0, 1) + "}}\n"; return text; } //make the print version text of the root page BookPage.prototype.makePrintVersionRoot = function() { var text = "{{Print version notice}}\n" + "__NOTOC__ __NOEDITSECTION__\n" + "<br style=\"page-break-after: always\">\n" + "{{:" + this.getBookName() + "/Cover}}\n" + "<br style=\"page-break-after: always\">\n\n"; if(vbd.useintroduction) text += "{{Print chapter heading|Introduction}}\n"; for(var x = 0; x < this.subpages.length; x++) { text += this.subpages[x].makePrintVersionText(); } for(var x = 0; x < this.headings.length; x++) { text += this.headings[x].makePrintVersionText(); } text = text + "{{Print unit page|Resources and Licensing}}\n\n"; if(vbd.useresources) text += "{{Print chapter heading|Resources}}\n" if(vbd.uselicensing) text += "{{Print chapter heading|Licensing}}\n"; text += "\n== License: GFDL ==\n\n{{:GFDL}}\n\n"; return text; } //make the print version text of a subpage BookPage.prototype.makePrintVersionText = function () { return "{{Print chapter heading|" + this.pagename + "}}\n" + "{{:" + this.getFullName() + "}}\n\n"; } //make the wikitext for any page BookPage.prototype.makeWikitextAll = function() { if(this.isRoot()) return this.makeWikitextRoot(); return this.makeWikitextPage(); } //make a link to view the wikitext of the current page BookPage.prototype.makeDisplayLink = function () { var link = wk.makeElement('a', null, ['Wikitext']); var self = this; link.onclick = function() { self.formspan.innerHTML = "<pre>" + self.makeWikitextAll() + "</pre>"; self.closeButton(); } return(link); } //make the collection text of a page BookPage.prototype.makeCollectionText = function (subt) { var text = ""; if(this.isRoot()) { if(subt == null || subt == "") subt = "A Book from English Wikibooks"; text = "== " + this.pagename + " ==\n=== " + subt + " ===\n"; if(vbd.usecollectionpreface) text += ":[[Wikibooks:Collections Preface]]\n"; if(vbd.useintroduction) text += ":[[" + this.pagename + "/Introduction|Introduction]]\n"; } else text = ":[[" + this.getFullName() + "|" + this.pagename + "]]\n"; for(var i = 0; i < this.subpages.length; i++) { text = text + this.subpages[i].makeCollectionText(); } for(var i = 0; i < this.headings.length; i++) { text = text + this.headings[i].makeCollectionText(); } if(this.isRoot()) { text += "\n;Resources and Licensing\n"; if(vbd.useresources) text += ":[[" + this.pagename + "/Resources|Resources]]\n"; if(vbd.uselicensing) text += ":[[" + this.pagename + "/Licensing|Licensing]]\n"; text += "\n[[Category:Collections]]\n"; } return text; } //make a button to close an open formspan BookPage.prototype.closeButton = function () { var self = this; this.formspan.appendChild(wk.makeButton('', 'Close', function() { self.formspan.innerHTML = ""; })); } //add all subpages of the current page to list BookPage.prototype.listAllSubpages = function(list) { if(this.subpages.length) { for(var i = this.subpages.length - 1; i >= 0; i--) { list = this.subpages[i].listAllSubpages(list); list.push(this.subpages[i]); } } if(this.headings.length) { for(var i = this.headings.length - 1; i >= 0; i--) { list = this.headings[i].listAllSubpages(list); } } return list; } //a link to create the book using AJAXy magic BookPage.prototype.makeAutomateLink = function () { var automate = wk.makeElement('a', null, ['Create']); var self = this; automate.onclick = function() { if(!wk.testUserPermissions("administrator")) { self.formspan.innerHTML = "<b>ERROR:</b> You must be an administrator to use this feature."; return; } wk.loadWikiText(self.pagename, function (text) { if(text.length != 0) self.formspan.innerHTML = "<b>ERROR:</b> The page " + self.pagename + " already exists. " + "This function cannot be used to overwrite existing pages."; else { var list = self.listAllSubpages(new Array()); if(vbd.useintroduction) list.push(self.makeSpecialPageNode("Introduction")); if(vbd.useresources) list.push(self.makeSpecialPageNode("Resources")); if(vbd.uselicensing) list.push(self.makeSpecialPageNode("Licensing")); if(confirm("WARNING: This operation will automatically create " + (list.length + 1) + " pages. " + "You are responsible for any edits made by this tool, and any pages that it creates. " + "Do you want to continue?")) self.automaticCreation(list); } }); } return automate; } //create a page using AJAXy magic BookPage.prototype.automaticCreation = function(list) { if(this.formspan) this.makeLoadingNotice("Creating"); else wk.appendChildren(this.parent.formspan, [wk.makeElement('br'), "Creating " + this.pagename + "..."]); var text = this.makeWikitextAll(); var self = this; wk.postEdit(this.getFullName(), text, "Automatic page creation", {callback: function() { /* XXX: because this is a recursive callback, it could create quite a large mess on the VMs stack for very large books. It should be possible with some kind of count parameter to loop and unwind the stack partially after every N edits. Either implement some kind of a sentinel like this, or find a different method for automating the process. */ if(self.formspan) { self.formspan.innerHTML = "<big>Done.</big> — "; self.formspan.appendChild(wk.wikiLink(self.getFullName(), "View")); } else { wk.appendChildren(vbd.pageTree.formspan, ["Done. - ", wk.wikiLink(self.getFullName(), "View")]); } if(list.length) { var next = list.pop(); next.automaticCreation(list); } }}); } //make a link to edit the text of the page BookPage.prototype.makeEditLink = function () { var link = wk.makeElement('a', null, ['Edit']); var self = this; link.onclick = function() { self.makeEditInterface(self.getFullName(), self.makeWikitextAll(), self.pagename + ": Created by Whiteknight's Visual Book Designer"); } return(link); } //prepare the text to save a subpage from the outline. // XXX: Eventually, should probably save the structures directly in JSON for easy loading. BookPage.prototype.makeSaveText = function () { var depth = this.getDepth(); var stars = ""; for(var i = 0; i < depth; i++) { stars = stars + "*"; } var text = stars + this.pagename + "\n"; if(this.pagetext.length != 0) { var pagetext = this.pagetext; pagetext.replace(/\n/g, "\n&"); text += "&" + this.pagetext + "\n"; } if(this.comments.length != 0) { var comments = this.comments; comments.replace(/\n/g, "\n%"); text += "%" + this.comments + "\n"; } for(var i = 0; i < this.subpages.length; i++) { text += this.subpages[i].makeSaveText(); } for(var i = 0; i < this.headings.length; i++) { text += this.headings[i].makeSaveText(); } return text; } //make a link to save the outline BookPage.prototype.makeSaveLink = function () { var link = wk.makeElement('a', null, ['Save']); var self = this; link.onclick = function() { var page = "User:" + wgUserName + "/" + self.pagename; var edit = wk.makeElement('input', {type:'text', value:page, size:50}); self.formspan.innerHTML = 'Enter the page name to save at: '; self.formspan.appendChild(edit); self.formspan.appendChild(wk.makeButton('', 'Save', function() { self.makeEditInterface(edit.value, function(t) { return vbd.killOldSaves(t) + "{{User:Whiteknight/SavedOutlineStart|" + wk.getDate() + "}}\n\n" + self.makeSaveText() + "\n\n{{User:Whiteknight/SavedOutlineEnd}}\n"; }, self.pagename + ": Saving Visual Book Designer Outline"); })); self.closeButton(); edit.focus(); } return(link); } //make a link to load a saved outline BookPage.prototype.makeLoadLink = function () { var link = wk.makeElement('a', null, ['Load']); var self = this; link.onclick = function() { var page = "User:" + wgUserName + "/" + self.pagename; var edit = wk.makeElement('input', {type:'text', value:page, size:50}); wk.appendChildren(self.formspan, ['Enter the page name to load from: ', edit, wk.makeButton('', 'Load', function() { page = edit.value; self.makeLoadingNotice("Loading"); wk.loadWikiText(page, function (text) { var start = text.indexOf('{{User:Whiteknight/SavedOutlineStart}}'); var end = text.indexOf('{{User:Whiteknight/SavedOutlineEnd}}'); if(start == -1 || end == -1) { self.formspan.innerHTML = ""; self.formspan.appendChild(wk.makeElement('font', {color:'#FF0000'}, [ 'Cannot load outline from ' + page ])); self.closeButton(); } else vbd.loadNodeTree(text.substring(start + 38, end)); }); })]); self.closeButton(); edit.focus(); } return(link); } //make a link to load the TOC from an existing book BookPage.prototype.makeLoadTOCLink = function () { var link = wk.makeElement('a', null, ['Load TOC']); var self = this; link.onclick = function() { var page = self.pagename; var edit = wk.makeElement('input', {type:'text', value:page, size:50}); self.formspan.innerHTML = 'Enter the name of the book to load: '; self.formspan.appendChild(edit); self.formspan.appendChild(wk.makeButton('', 'Load', function() { page = edit.value; wk.loadWikiText(page, function (text) { vbd.loadNodeTreeTOC(text, page); }); })); self.closeButton(); edit.focus(); } return(link); } BookPage.prototype.makeSaveCollectionLink = function (key) { var link = wk.makeElement('a', null, ['Save']); var self = this; link.onclick = function() { var page = ""; if(key == "personal") page = "User:" + wgUserName + "/Collections/" + self.pagename; else page = "Wikibooks:Collections/" + self.pagename; var subt = wk.makeElement('input', {type:'text', size:50}); var edit = wk.makeElement('input', {type:'text', value:page, size:50}); self.formspan.innerHTML = ""; wk.appendChildren(self.formspan, ["Enter a subtitle for the book: ", subt, wk.makeElement('br'), 'Enter the ' + key + ' collection name to save at: ', edit]); self.formspan.appendChild(wk.makeButton('', 'Save', function() { self.makeEditInterface(edit.value, self.makeCollectionText(subt.value), ": Saving " + key + " collection"); })); self.closeButton(); edit.focus(); } return(link); } BookPage.prototype.makeLoadCollectionLink = function (type) { var link = wk.makeElement('a', null, ['Load']); var self = this; link.onclick = function() { var page = ""; if(type == 'personal') page = "User:" + wgUserName + "/Collections/"; else page = "Wikibooks:Collections/"; var edit = wk.makeElement('input', {type:'text', size:50}); self.formspan.innerHTML = ""; wk.appendChildren(self.formspan, ["Enter the name of the " + type + " collection to load: ", edit, wk.makeButton('', 'Load', function () { wk.loadWikiText(page + edit.value, function (text) { vbd.loadNodeTreeCollection(text, page); }); }) ]); } return link; } //make the text for a heading template BookPage.prototype.makeTemplate = function () { var self = this; self.makeEditInterface("Template:" + this.pagename + "/Page", vbd.makeTemplateText(), self.pagename + ": Creating page head template"); } BookPage.prototype.makeFileLink = function() { var self = this; var disp = wk.makeElement('a', null, ['View']); disp.onclick = function () { self.formspan.innerHTML = "<b>Warning:</b> Print versions are deprecated. Please use <b>Collections</b> instead.<br>" + "<pre>" + self.makePrintVersionRoot().replace(/</g, "<") + "</pre>"; self.closeButton(); } var saveprint = wk.makeElement('a', null, ['Save']); saveprint.onclick = function() { self.makeEditInterface(self.getFullName() + "/Print Version", self.makePrintVersionRoot(), self.pagename + ": Print version created by Whiteknight's Visual Book Designer"); } var link = wk.makeElement('a', null, ['File']); var self = this; link.onclick = function () { self.formspan.innerHTML = ""; //vbd.createDropMenu(self.formspan, [ wk.appendChildren(self.formspan, [ "Select whether you want to load or save this outline:", wk.makeElement('br'), 'Saved Outlines: ', self.makeSaveLink(), ' - ', self.makeLoadLink(), wk.makeElement('br'), 'Personal Collection: ', self.makeSaveCollectionLink('personal'), ' - ', self.makeLoadCollectionLink('personal'), wk.makeElement('br'), 'Public Collection: ', self.makeSaveCollectionLink('community'), ' - ', self.makeLoadCollectionLink('community'), wk.makeElement('br'), 'Existing Books: ', self.makeLoadTOCLink(), ' - ', self.makeAutomateLink(), wk.makeElement('br'), 'Print versions: ', disp, ' - ', saveprint, wk.makeElement('br'), ]); self.closeButton(); } return link; } //make additional links for the main page BookPage.prototype.makeRootMenu = function() { if(!this.isRoot()) { return document.createTextNode(' - '); } var box = wk.makeElement('span', null, [" - "]); var nav = wk.makeElement('a', null, ['Templates']); var self = this; nav.onclick = function () { self.formspan.innerHTML = ''; var temps = wk.makeElement('select', {size:"1"}); for(var i = 0; i < vbd.templates.length; i++) { temps.appendChild(wk.makeElement("option", {value:i}, vbd.templates[i][3])); } temps.onchange = function () { vbd.template = temps.selectedIndex; } temps.selectedIndex = vbd.template; var select = wk.makeElement('select', {size:"1"}); for(var i = 0; i < vbd.readingLevels.length; i++) { select.appendChild(wk.makeElement("option", {value:i}, vbd.readingLevels[i])); } select.selectedIndex = vbd.readingLevel; select.onchange = function () { vbd.readingLevel = select.selectedIndex; } wk.appendChildren(self.formspan, [wk.makeElement('br'), "Select a page navigation template (", wk.wikiLink("User:Whiteknight/Book_Foundry#Header_Templates", "Help"), "): ", temps, wk.makeButton('WKVBDMakeTemplate', 'Make Template', function () { self.makeTemplate() }), wk.makeElement('br'), "Select the book ", wk.wikiLink("Wikibooks:Reading Levels", "reading level"), ": ", select]); if(typeof cg == 'object') { var topics = cg.makeSubjectSelect(10, true); cg.setSelected(vbd.subjects); topics.onchange = function () { vbd.subjects.length = 0; vbd.subjects = cg.returnAllSelected(); } wk.appendChildren(self.formspan, [wk.makeElement('br'), 'Select major subjects for your book. ', 'Hold ctrl to select multiple entries.', wk.makeElement('br'), topics, wk.makeElement('br')]); } self.closeButton(); } var options = wk.makeElement('a', null, ['Options']); options.onclick = function () { self.formspan.innerHTML = ""; wk.appendChildren(self.formspan, [ vbd.makeOptionsCheckbox("defaultinherit"), "inherit page text by default", wk.makeElement('br'), vbd.makeOptionsCheckbox("defaultcollapse"), "collapse nodes by default", wk.makeElement('br'), vbd.makeOptionsCheckbox("useresources"), "add a resources page by default", wk.makeElement('br'), vbd.makeOptionsCheckbox("uselicensing"), "add a licensing page by default", wk.makeElement('br'), vbd.makeOptionsCheckbox("useintroduction"), "add an introduction page by default", wk.makeElement('br'), vbd.makeOptionsCheckbox("usecollectionpreface"), "add [[Wikibooks:Collections Preface]] to Collections by default", wk.makeElement('br'), vbd.makeOptionsCheckbox("commentsaspages"), "use page comments to create talk pages", wk.makeElement('br'), vbd.makeOptionsCheckbox("useexternaledit"), "make edits in an external tab or window", wk.makeElement('br') ]); self.closeButton(); } var clear = wk.makeElement('a', null, ['Clear']); clear.onclick = function () { if(!confirm('Clear this outline? You will lose any unsaved work.')) return; vbd.clear(); self.formspan.innerHTML = "outline cleared"; vbd.visual(); } wk.appendChildren(box, [ nav, ' - ', this.makeFileLink(), ' - ', options, ' - ', clear, ' - ', wk.makeElement('small', null, [" (Version " + vbd.version + ")"]), wk.makeElement('br') ]); return box; } //make a subpage node in the outline BookPage.prototype.makeNode = function() { this.box = wk.makeElement('div', null, [ this.getTitleNode(), this.makeRootMenu(), wk.makeElement('small', null, [ this.makeHeadingsLink(), this.makeHeadingsAddLink(), " - ", this.makeSubpagesLink(), this.makeSubpagesAddLink(), " - ", this.makeDisplayLink(), " - ", this.makeEditLink() ]) ]); this.box.style.position = "relative"; this.box.appendChild(wk.makeElement('br')); this.box.appendChild(this.getTextNode()); this.box.appendChild(this.formspan); this.box.style.padding = "5px"; this.box.style.marginBottom = "1em"; var container = wk.makeElement('div'); container.style.marginLeft = "2em"; if(this.collapse == 0) { for(var i = 0; i < this.subpages.length; i++) { if(this.subpages[i] == null) continue; var node = this.subpages[i].makeNode(); container.appendChild(node); } for(var i = 0; i < this.headings.length; i++) { container.appendChild(this.headings[i].makeNode()); container.appendChild(wk.makeElement('br')); } } container.style.borderLeft = "1px dashed #000000"; container.style.borderBottom = "1px dashed #000000"; this.box.appendChild(container); var self = this; //<noinclude> //this.box.addEventListener("mouseup", function(event) { // if(vbd.lastClicked == self) { // self.box.style.border = "none"; // vbd.lastClicked = null; // vbd.visual(); // return; // } // if(vbd.lastClicked == null || event.target != self.box) return; // document.removeEventListener("mousemove", vbd.moveMouse, false); // var dragged = vbd.lastClicked; // vbd.lastClicked.box.style.border = "none"; // vbd.lastClicked = null; // if(dragged instanceof BookPage) { //it's a bookpage // if(dragged.parent2 != null) { // dragged.parent2.removeSubpage(dragged); // self.addSubpage(dragged); // } else { // dragged.parent.removeSubpage(dragged); // self.addSubpage(dragged); // } // } else { //it's a heading // dragged.parent.removeHeading(dragged); // self.addHeading(dragged); // } // vbd.visual(); //}, false); //this.box.addEventListener("mouseover", function(event) { // if(vbd.lastClicked == null || event.target != self.box || vbd.lastClicked == self) return; // self.box.style.border = "1px solid grey"; //}, false); //this.box.addEventListener("mouseout", function(event) { // if(vbd.lastClicked == null || event.target != self.box) return; // self.box.style.border = "none"; //}, false); //if(this.isRoot()) return this.box; //short circuit, the main book page can't be dragged. //this.box.addEventListener("mousedown", function(event) { // if(vbd.lastClicked != null || event.target != self.box) return; // self.box.style.border = "1px solid red"; // vbd.lastClicked = self; // //vbd.startX = event.clientX; // //vbd.startY = event.clientY; // //vbd.offsetX = vbd.extractNumber(self.box.style.left); // //vbd.offsetY = vbd.extractNumber(self.box.style.top); // document.body.focus(); // //document.addEventListener("mousemove", vbd.moveMouse, false); //}, false); //</noinclude> return(this.box); } // </source>