// Wiki.js - implements the Wiki application FIRSTCLASS.apps.Wiki = function(config) { this._domEl = config.domElement; config.dataSource.deactivate(); this._dataSource = config.dataSource.createClone({name: "Wiki"}); this._communityACL = config.dataSource.getAcl(); this._view = "none"; this._currentRow = false; this._community = config.community; this._config = config; this._commentEl = false; this._commEditor = false; this._commenting = false; this._selectedComment = false; this._postedAComment = false; this._firstPageEl = false; this._savePageName = false; this._mainViewMap = false; var that = this; var html = []; // component elements this._offlineEl = document.createElement("div"); // bag for out-of-page componentss this._frameEl = document.createElement("div"); // app frame // application frame html = []; html.push(""); // header bar html.push(""); html.push(""); html.push(""); html.push(""); // title bar html.push(""); html.push(""); html.push(""); html.push(""); // info bar html.push(""); html.push(""); html.push(""); html.push(""); html.push(""); // control bar html.push(""); html.push(""); html.push(""); html.push(""); // app body html.push(""); html.push(""); html.push("
"); html.push(""); html.push(""); html.push("
"); html.push(""); html.push(""); html.push("
 
 
"); html.push(""); html.push(""); html.push("
"); html.push("
"); this._frameEl.innerHTML = html.join(''); YAHOO.util.Dom.addClass(this._frameEl, "fcWikiMain"); this._domEl.appendChild(this._frameEl); // app frame boxes this._headerBar = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiPageBar", this._frameEl); this._titleBar = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiTitleBar", this._frameEl); this._controlBar = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiControlBar", this._frameEl); this._infoBar = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiInfoBar", this._frameEl); this._leftHeaderBox = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiLeftHeaderBox", this._frameEl); this._rightHeaderBox = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiRightHeaderBox", this._frameEl); this._leftTitleBarBox = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiLeftTitleBox", this._frameEl); this._rightTitleBarBox = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiRightTitleBox", this._frameEl); this._leftControlBox = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiLeftControlBox", this._frameEl); this._rightControlBox = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiRightControlBox", this._frameEl); this._infoBox = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiInfoBox", this._frameEl); this._appBodyBox = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiAppBodyBox", this._frameEl); // page count this._countEl = document.createElement("div"); YAHOO.util.Dom.setStyle(this._countEl, 'display','inline'); this._offlineEl.appendChild(this._countEl); // page title this._titleEl = document.createElement("div"); this._titleEl.innerHTML = ""; this._offlineEl.appendChild(this._titleEl); // quick filter this._filterEl = document.createElement("div"); html = []; html.push(""); html.push(""); html.push("
"); this._filterEl.innerHTML = html.join(''); YAHOO.util.Dom.setStyle(this._filterEl, 'float', 'right'); this._offlineEl.appendChild(this._filterEl); // page info this._pgInfoEl = document.createElement("div"); YAHOO.util.Dom.setStyle(this._pgInfoEl, 'display', 'inline'); this._offlineEl.appendChild(this._pgInfoEl); // page list this._listEl = document.createElement("div"); YAHOO.util.Dom.addClass(this._listEl, 'fcWikiList'); this._offlineEl.appendChild(this._listEl); // comments this._commentFrame = document.createElement("div"); html = []; html.push("
" + FIRSTCLASS.locale.comments.add + "
"); html.push("
"); html.push("
"); this._commentFrame.innerHTML = html.join(""); this._commentEditFrame = FIRSTCLASS.ui.Dom.getChildByIdName('fcWikiNewComment', this._commentFrame); this._commentListFrame = FIRSTCLASS.ui.Dom.getChildByIdName('fcWikiCommentList', this._commentFrame); this._commentProto = document.createElement("div"); html = []; html.push(""); html.push(""); html.push(""); html.push(""); html.push(""); html.push(""); html.push("
 
"); this._commentProto.innerHTML = html.join(""); YAHOO.util.Dom.addClass(this._commentProto, 'fcCommentBlock'); this._commentProto.setAttribute('fcid','fcpopupcomment'); // history this._histEl = document.createElement("div"); // page view this._pageEl = document.createElement("div"); YAHOO.util.Dom.addClass(this._pageEl,'fcWikiPageContainer'); this._pageView = new FIRSTCLASS.apps.Wiki.pageView({domEl: this._pageEl, dataSource: this._dataSource, owner: this}); // actions toolbar this._actionsEl = document.createElement("div"); var actionTBCfg = { domElement: this._actionsEl, vertical: true, buttons: [ { id: "fcWikiNewPage", label: FIRSTCLASS.locale.community.wiki.actions.wikinew, fcid: 'newwikipage', priv: FIRSTCLASS.permissions.ACL.CREATE }, { id: "fcWikiClearUnread", label: FIRSTCLASS.locale.toolbars.readall, fcid: 'clearwikiflags' } ] }; this._actionsTB = new FIRSTCLASS.ui.toolBar(actionTBCfg); this._actionsTB.reconfigure(false, this._communityACL); FIRSTCLASS.ui.rightSideBar.updateBoxContents(FIRSTCLASS.locale.community.actions.lbl, this._actionsEl); FIRSTCLASS.ui.leftSideBar.updateBoxContents(FIRSTCLASS.locale.community.actions.lbl, this._actionsEl); // page toolbar container this._pageTBEl = document.createElement("div"); this._offlineEl.appendChild(this._pageTBEl); this._pageTB = false; // editing toolbar this._editTBEl = document.createElement("div"); this._editTBEl.setAttribute('align', 'right'); this._offlineEl.appendChild(this._editTBEl); var TBCfg = { domElement: this._editTBEl, ends: 'both', buttons: [ { id: "fcWikiCancelEdits", label: FIRSTCLASS.locale.community.wiki.cancel, fcid: 'wikieditcancel' }, { id: "fcWikiSaveEditsBtn", label: FIRSTCLASS.locale.community.wiki.savebtn, fcid: 'wikieditsave' } ] }; this._editTB = new FIRSTCLASS.ui.toolBar(TBCfg); // dialogs this._saveDlg = false; // edit-complete dialog this._sendDlg = false; // send-to dialog this._infoDlg = false; // page info dialog // init this._navigator = false; this._history = false; this._editor = false; this._tocTick = false; this._pageCount = false; FIRSTCLASS.session.setActiveApplication(this, "wiki"); this._editsSaved = false; // un-skin the top bar of the tab var mainEl = document.getElementById('fcContent'); var theEl = FIRSTCLASS.ui.Dom.getChildByClassName('tm', mainEl); YAHOO.util.Dom.setStyle(theEl, 'background-image', 'url(' + FIRSTCLASS.session.ui.fcbase.absolute + '/images/ContentPane_100W_T.png)'); YAHOO.util.Dom.setStyle(theEl, 'background-repeat', 'repeat-x'); theEl = FIRSTCLASS.ui.Dom.getChildByClassName('trc', mainEl); YAHOO.util.Dom.setStyle(theEl, 'background-image', 'url(' + FIRSTCLASS.session.ui.fcbase.absolute + '/images/ContentPane_100W_TRC.png)'); // set up view map var viewMap = [ { element: this._pgInfoEl, views: { edit: this._infoBox, page: this._infoBox } }, { element: this._listEl, views: { list: this._appBodyBox } }, { element: this._pageEl, views: { page: this._appBodyBox, edit: this._appBodyBox } }, { element: this._pageTBEl, views: { page: this._leftControlBox } }, { element: this._editTBEl, views: { edit: this._rightTitleBarBox } }, { element: this._titleEl, views: { page: this._leftTitleBarBox, edit: this._leftTitleBarBox } }, { element: this._countEl, views: { list: this._leftHeaderBox, page: this._leftHeaderBox, edit: this._leftHeaderBox } }, { element: this._filterEl, views: { list: this._rightHeaderBox } } ]; this._mainViewMap = new FIRSTCLASS.ui.viewMapper(viewMap); // show the list to start this.setView("list"); this._navigator = new FIRSTCLASS.apps.Wiki.navigator({ domElement: this._listEl, dataSource: this._dataSource, wiki: this }); this._navigator.activate(); }; // class methods FIRSTCLASS.apps.Wiki.prototype.__fcAppName = "FIRSTCLASS.apps.Wiki"; FIRSTCLASS.apps.Wiki.prototype.isRelatedApp = function(app) { return this._community.isSubApp(app); }; FIRSTCLASS.apps.Wiki.prototype.createToolbar = function() { var that = this; var addUnreadBlobToMenu = function(el, flagState, button) { var fmt = "$content$"; if (flagState) { fmt = "
$content$"; } // keep existing HTML along with tooltip var str = button.label; var parts = str.split('|'); if (el.innerHTML && el.innerHTML.indexOf('fcWikiUnreadHist') < 0) { parts[0] = el.innerHTML; } str = parts.join('|'); FIRSTCLASS.locale.setElementString(str, el, fmt); }; var TBCfg = { domElement: this._pageTBEl, ends: 'both', buttons: [ { id: "fcWikiApprove", label: FIRSTCLASS.locale.toolbars.wiki.approve, fcid: 'wikiapprove', condition: function(row) { var show = false; if (that._currentRow && that._currentRow.status.unapproved && FIRSTCLASS.permissions.hasPriv(that._currentRow.acl, FIRSTCLASS.permissions.ACL.APPROVE)) { show = true; } return show; } }, { id: "fcWikiAddAComment", label: FIRSTCLASS.locale.toolbars.wiki.comment, type: "popup", popup: { width: 350, height: 300, callbacks: { onRender: function(evt, el) { that.showComments(evt, el); }, onClose: function() { that.hideComments(); } } }, condition: function() { var show = ((that._view === "history") || (that._view === "page")); if (that._currentRow && that._currentRow.status.backversion) { show = false; } else { var canCreate = FIRSTCLASS.permissions.hasPriv(that._currentRow.acl, FIRSTCLASS.permissions.ACL.CREATE); var comm = that._navigator && that._navigator._comments[that._currentRow.threadid]; if (!canCreate && !comm) { show = false; } } return show; }, customizer: function(el) { if (that._currentRow && that._navigator) { var f = that._navigator.getUnreadState(that._currentRow, true); addUnreadBlobToMenu(el, f.comments, this); } }, fcid: 'wikicomment' }, { id: "fcWikiTag", label: FIRSTCLASS.locale.toolbars.wiki.tags, type: "popup", popup: { width: 400, height: 200, callbacks: { onRender: function(evt, el) { that.showTags(evt, el); }, onClose: function() { that.hideTags(); } } }, condition: function(row) { var show = (that._view === "page") && that._currentRow && !that._currentRow.status.backversion; if (show) { if (row) { show = row.threadid !== "0"; } } return show; } }, { id: "fcWikiWatch", label: FIRSTCLASS.locale.toolbars.wiki.watch, customizer: function(el) { var l = this.label; var fmt = "$content$"; if (that._currentRow && that._currentRow.status.watched) { fmt += "
"; } FIRSTCLASS.locale.setElementString(this.label, el, fmt); }, fcid: 'wikiwatch' }, { id: "fcWikiEditPage", label: FIRSTCLASS.locale.toolbars.wiki.edit, priv: FIRSTCLASS.permissions.ACL.CREATE | FIRSTCLASS.permissions.ACL.WRITE | FIRSTCLASS.permissions.ACL.DELETEOWN, condition: function() { var show = (that._view === "page") ? true : false; if (show) { if (!that._currentRow) { show = false; } else if (that._currentRow && that._currentRow.status.unapproved) { show = false; } else if (that._currentRow.status.backversion) { show = false; } } return show; }, fcid: 'wikiedit' }, { id: "fcWikiShowHistory", label: FIRSTCLASS.locale.toolbars.wiki.history, condition: function() { return (that._view !== "history"); }, customizer: function(el) { if (that._currentRow && that._navigator) { var f = that._navigator.getUnreadState(that._currentRow, false) ? true : false; addUnreadBlobToMenu(el, f, this); } }, type: "popup", popup: { width: Math.floor(that._appBodyBox.offsetWidth * 0.8), height: Math.floor(that._appBodyBox.offsetHeight * 0.8), callbacks: { onRender: function(evt, el) { that.showHistory(el); }, onClose: function() { that.hideHistory(); } } } }, { id: "fcWikiDelete", label: FIRSTCLASS.locale.toolbars.wiki.del, fcid: 'wikideletepage', condition: function(row) { if (row) { if (row.threadid === "0") { return false; } if (row.status.backversion) { return false; } if (that._view !== "page") { return false; } if (FIRSTCLASS.permissions.hasPriv(row.acl, FIRSTCLASS.permissions.ACL.DELETE)) { return true; } } return false; } }, { id: "fcWikiPrint", label: FIRSTCLASS.locale.toolbars.wiki.print, fcid: 'print', condition: function(row) { return (that._view === "page"); } }, { id: "fcWikiShare", label: FIRSTCLASS.locale.toolbars.wiki.share, fcid: 'share', type: "popup", popup: { width: 320, height: 500, callbacks: { onRender: function(evt, el) { var clickEl = evt.target ? evt.target.parentNode : evt.srcElement.parentNode; FIRSTCLASS.ui.sharePopup.showShareDialog(clickEl,el,that._currentRow,that._dataSource,"email"); }, onClose: function() { } } }, condition: function(row) { return row.threadid !== "0"; } } ] }; this._pageTB = new FIRSTCLASS.ui.toolBar(TBCfg); }; FIRSTCLASS.apps.Wiki.prototype.getCommunity = function() { return this._community; }; FIRSTCLASS.apps.Wiki.prototype.eventHandlers = { click: { // actions bar newwikipage: function(that) { if (that._view !== 'edit') { if (FIRSTCLASS.session.canNavigateAway()) { that.newPage(); } } }, clearwikiflags: function(that) { that._dataSource.markAllAsRead(false); FIRSTCLASS.ui.navBar.setProfileUnread(0); }, // navigator wikinav: function(that) { that.setView('list'); }, // page toolbar wikiapprove: function(that) { if (that._currentRow && that._currentRow.status.unapproved) { that._dataSource.approveItem(that._currentRow); that._pageTB.reconfigure(that._currentRow, that._dataSource.getAcl()); that.openPage(that._currentRow); } }, wikiview: function(that) { that.setView("page"); }, wikiviewlatest: function(that) { that.openPageByName(that._currentRow.col8010); }, wikiedit: function(that) { that.editPage(); }, wikicomment: function(that) { }, wikihistory: function(that) { that.showHistory(); }, wikiwatch: function(that) { if (that._currentRow) { if (that._currentRow.status.watched) { FIRSTCLASS.session.desktop.deleteWatch(that._currentRow); that._currentRow.status.watched = false; that._pageTB.reconfigure(that._currentRow, that._dataSource.getAcl()); } else { that._dataSource.watchItem(that._currentRow); that._currentRow.status.watched = true; that._pageTB.reconfigure(that._currentRow, that._dataSource.getAcl()); } } }, wikisend: function(that, fcevent) { that.sendTo(that._currentRow, fcevent); }, wikideletepage: function(that) { that.deletePage(that._currentRow); }, print: function(that, fcevent) { if (that._currentRow.threadid === "0") { return false; } window.open(FIRSTCLASS.lang.ensureSlashUrl(FIRSTCLASS.session.domain + FIRSTCLASS.session._activeObject) + that._currentRow.uri + "?Templates=Print"); }, // edit toolbar wikieditcancel: function(that) { if (that._editor && (that._editor._saveState === "none")) { that.cancelEdits(); if (that._currentRow) { that.setView("page"); that.openPageByName(that._currentRow.col8010); } else { that.setView("list"); } } }, wikieditsave: function(that) { if (that._editor && (that._editor._saveState === "none")) { that.saveEdits(); } }, // embeds fcestart: function(that, fcevent) { var attrs = fcevent.fcattrs.split(";"); var url = FIRSTCLASS.lang.ensureSlashUrl(that._dataSource.getItemUrl(that._currentRow, true, false, true)); url += "embed" + attrs[0] + ".html"; FIRSTCLASS.ui.embeds.handleClick(fcevent, url); }, // history wikihistdel: function(that, fcevent) { that._dataSource.deleteRow(that._history._list._selRow); // delete from UI var deleteNode = document.getElementById('fcListView' + that._history._list._lv._ListViewID + 'Thread' + that._history._list._selRow.col8090); if (deleteNode !== null) { deleteNode.parentNode.removeChild(deleteNode); } }, // comments fcpopupcomment: function(that, fcevent) { that.showCommentToolbar(fcevent); }, wikicommentdelete: function(that, fcevent) { that.deleteComment(fcevent); } } }; FIRSTCLASS.apps.Wiki.prototype.handleEvent = function(evt, fcevent) { var rc = false; if (this._community) { rv = this._config.community.handleEvent(evt, fcevent); } if (this._history) { rc = this._history.handleEvent(evt, fcevent); } if (!rc && (this._view === "page" || this._view === "edit")) { rc = this._pageView.handleEvent(evt, fcevent); } if (!rc) { var handlers = this.eventHandlers[evt.type]; if (handlers) { var handler = handlers[fcevent.fcid]; if (handler) { rc = handler(this, fcevent, evt); if (typeof rc === "undefined") { rc = true; } } } } return rc; }; FIRSTCLASS.apps.Wiki.prototype.dispose = function() { this._dataSource.dispose(); this.hideTags(); this.hideComments(); }; // delete entire page thread FIRSTCLASS.apps.Wiki.prototype.deletePage = function(row) { var that = this; // put up dialog var delDlg = new YAHOO.widget.SimpleDialog("dlg", { width: '320px', fixedcenter: true, postmethod: 'none', visible: false, draggable: false }); var str = FIRSTCLASS.locale.community.wiki.del.header.replace("$name$", row.name); delDlg.setHeader(str); str = FIRSTCLASS.locale.community.wiki.del.prompt.replace("$name$", row.name); delDlg.setBody(str); delDlg.cfg.setProperty("icon", YAHOO.widget.SimpleDialog.ICON_WARN); var doContinue = function() { that._dataSource.deleteThread(row); // remove immediately from nav's version map and row map var n = that._navigator; if (n._versions[row.threadid]) { delete n._versions[row.threadid]; } delDlg.destroy(); that.setView("list"); }; var doCancel = function() { delDlg.destroy(); }; delDlg.cfg.queueProperty('buttons', [ { text: FIRSTCLASS.locale.community.wiki.del.cancel, handler: doCancel }, { text: FIRSTCLASS.locale.community.wiki.del.cont, handler: doContinue } ]); delDlg.render(document.body); delDlg.show(); }; // configure page components for selected view FIRSTCLASS.apps.Wiki.prototype.setView = function(view) { if (view === this._view) { return; } // hide/dispose old view elements switch (this._view) { case "page": this._pageView._bodyEl.innerHTML = ""; break; case "list": this._navigator.hide(); break; case "edit": YAHOO.util.Dom.removeClass(this._pageView._bodyEl, 'fcWikiEditBody'); YAHOO.util.Dom.removeClass(this._controlBar, 'fcHidden'); this.hideEditor(); this._editsSaved = false; break; default: break; } // set the view this._view = view; // show & hide frame rows if (view === 'list') { YAHOO.util.Dom.addClass(this._controlBar, 'fcHidden'); YAHOO.util.Dom.addClass(this._titleBar, 'fcHidden'); YAHOO.util.Dom.addClass(this._infoBar, 'fcHidden'); YAHOO.util.Dom.removeClass(this._rightHeaderBox, 'fcHidden'); YAHOO.util.Dom.setStyle(this._rightHeaderBox, 'width','240px'); } else { YAHOO.util.Dom.addClass(this._rightHeaderBox, 'fcHidden'); YAHOO.util.Dom.removeClass(this._controlBar, 'fcHidden'); YAHOO.util.Dom.removeClass(this._titleBar, 'fcHidden'); YAHOO.util.Dom.removeClass(this._infoBar, 'fcHidden'); } // select the view this._mainViewMap.selectView(view); // update required components switch (view) { case "page": // reading view if (!this._pageTB) { this.createToolbar(); } this.setPageInfo(this._currentRow, this._pgInfoEl); break; case "edit": YAHOO.util.Dom.addClass(this._pageView._bodyEl, 'fcWikiEditBody'); YAHOO.util.Dom.addClass(this._controlBar, 'fcHidden'); this.showEditor(); break; case "list": if (this._navigator) { this._navigator.show(); } break; default: break; } if (this._pageTB) { this._pageTB.reconfigure(this._currentRow, this._dataSource.getAcl()); } this.updateCount(); this.myResizeEvent(false, true); }; FIRSTCLASS.apps.Wiki.prototype.resizeEvent = function(event, recursive) { this._community.resizeEvent(event, recursive); }; FIRSTCLASS.apps.Wiki.prototype.myResizeEvent = function(event, recursive) { var viewport = FIRSTCLASS.ui.Dom.getViewportBounds(), yTop = false, yBottom = false, newHeight = false, paneHeight = false, newWidth = false, underhead = 0; // detect first call and unhook 'feed' scroll behaviour if (YAHOO.util.Dom.hasClass(this._domEl, "fcContentWrapper")) { YAHOO.util.Dom.removeClass(this._domEl, "fcContentWrapper"); var scroller = YAHOO.util.Dom.getElementsByClassName("fcTabContentPane"); if (scroller[0]) { scroller[0] = scroller[0].parentNode; if (scroller[0]) { YAHOO.util.Dom.setStyle(scroller[0],"overflow","hidden"); YAHOO.util.Dom.setStyle(scroller[0],"height","auto"); } } } // set the sizing yBottom = YAHOO.util.Dom.getY($('fcChatOverlayContainer')); if (!yBottom) { yBottom = viewport.ht; } switch (this._view) { case "edit": var e = false; if (this._editor && this._editor._editor && this._editor._editor._editor) { e = this._editor._editor._editor; } if (e) { var editBodyEl = e.getResizable().$; if (editBodyEl) { YAHOO.util.Dom.setStyle(this._appBodyBox, "overflow", "hidden"); YAHOO.util.Dom.setStyle(this._appBodyBox, "height", "auto"); // set/calc height this._pageView.setBottomBounds(yBottom, viewport.ht); yTop = YAHOO.util.Dom.getY(editBodyEl) + underhead; newHeight = yBottom - yTop; // calc width newWidth = false; var minX = 400; var sidebarX = viewport.wd * 0.2; if (sidebarX < 180) { sidebarX = 180; } newWidth = viewport.wd - (YAHOO.util.Dom.getX(editBodyEl) + sidebarX); if (!isNaN(newHeight) && newHeight >= 0 && !isNaN(newWidth) && newWidth >= 0) { e.resize(newWidth, newHeight); } } } break; case "page": YAHOO.util.Dom.setStyle(this._appBodyBox, "overflow", "hidden"); this._pageView.setBottomBounds(yBottom, viewport.ht); break; case "list": yTop = YAHOO.util.Dom.getY(this._listEl); listHeight = yBottom - yTop; paneHeight = viewport.ht - yTop; newWidth = 400; var listWidth, sbWidth = viewport.wd * 0.2; if (sbWidth < 180) { sbWidth = 180; } listWidth = viewport.wd - (YAHOO.util.Dom.getX(this._domElement) + sbWidth); if (listWidth > newWidth) { newWidth = listWidth; } YAHOO.util.Dom.setStyle(this._domElement, "width", newWidth + "px"); YAHOO.util.Dom.setStyle(this._listEl, "height", paneHeight + "px"); YAHOO.util.Dom.setStyle(this._listEl, "overflow", "hidden"); if (this._navigator && this._navigator._tableView) { // set the width this._navigator._tableView.setSize(newWidth, listHeight, paneHeight); } break; default: yTop = YAHOO.util.Dom.getY(this._appBodyBox) + underhead; listHeight = yBottom - yTop; YAHOO.util.Dom.setStyle(this._appBodyBox, "overflow", "auto"); YAHOO.util.Dom.setStyle(this._appBodyBox, "height", "auto"); if (!isNaN(newHeight) && newHeight >= 0) { YAHOO.util.Dom.setStyle(this._appBodyBox, "height", listHeight+"px"); if (!this.pageView._tocHidden) { this._pageView.setTocBounds(newHeight); } } } }; FIRSTCLASS.apps.Wiki.prototype.openLinkedPage = function(evt) { var tg = evt.target; if (!tg) { tg = evt.srcElement; } if (tg.tagName !== "A") { if (tg.parentNode.tagName === "A") { tg = tg.parentNode; } else { tg = false; } } if (tg && tg.className && tg.className.indexOf("fcwl") >= 0) { var path = tg.pathname; if (path) { var slash = path.lastIndexOf("/"); if (slash >= 0) { path = path.slice(slash+1); } path = decodeURI(path); this.openPageByName(path); } return true; } return false; }; FIRSTCLASS.apps.Wiki.prototype.openPageByName = function(pageName) { var row = this._navigator.rowFromPageName(pageName); if (row) { this.openPage(row); } }; FIRSTCLASS.apps.Wiki.prototype.openItem = function(row) { this.openPage(row); }; FIRSTCLASS.apps.Wiki.prototype.showRowInContext = function(row, oncomplete) { this.openPage(row, oncomplete); }; FIRSTCLASS.apps.Wiki.prototype.openPage = function(row, oncomplete) { var that = this; // squirrel the row var oldRow = this._currentRow; this._currentRow = row; // initialize flag state if (typeof row.status.watched === "undefined") { row.status.watched = FIRSTCLASS.session.desktop.isThreadBeingWatched(row.threadid); } this._pageView.openPage(row, { success: function(o) { that.setView("page"); that.setPageInfo(row, this._pgInfoEl); row.wasUnread = row.status.unread; if (row.status.unread) { that._dataSource.toggleUnRead(row, false); } that._history = false; that._editor = false; if (oncomplete) { oncomplete(); } FIRSTCLASS.session.addHistoryEntry(that._community.generateHistoryEntry('Wiki', that, row)); }, failure: function(o) { that.setView("page"); if (row.status.unapproved) { /* FIXME: hack for HRDC RFP */ var html = FIRSTCLASS.locale.community.wiki.needapprove; if (FIRSTCLASS.permissions.hasPriv(row.acl, FIRSTCLASS.permissions.ACL.APPROVE)) { var str = FIRSTCLASS.locale.community.wiki.approve; str = str.replace('$1$', ""); html += str.replace('$2$', ""); } that.setPageInfo(row, this._pgInfoEl); that._pageView.constructPage(row, html); } else { that.setPageInfo(row, this._pgInfoEl); that._pageView.constructPage(row, o.responseText); } that._history = false; that._editor = false; } }); }; // set page info from passed-in specifier - object or string FIRSTCLASS.apps.Wiki.prototype.setPageInfo = function(spec, el) { if (!el) { el = this._pgInfoEl; } if (el) { if (spec && (typeof spec === "object")) { var html = ""; var version = 1; if (spec.col8090) { version = spec.col8090; } html = FIRSTCLASS.locale.community.docs.info.version + version; if (spec.status.backversion) { html += FIRSTCLASS.locale.community.docs.info.old; YAHOO.util.Dom.addClass(el,'fcWikiOldVersion'); } else { html += FIRSTCLASS.locale.community.docs.info.latest; YAHOO.util.Dom.removeClass(el,'fcWikiOldVersion'); } html += FIRSTCLASS.locale.community.docs.info.moddate; var dt = new Date(); dt.setTime(spec.lastmods*1000); var date = FIRSTCLASS.util.Date.getFriendlyDateTimeString(dt); html += date + FIRSTCLASS.locale.community.docs.info.auth + spec.col8082; el.innerHTML = html; if (this._titleEl) { this._titleEl.firstChild.innerHTML = FIRSTCLASS.lang.mlesc(spec.col8010); } } else if (typeof spec === "string") { el.innerHTML = spec; } else { el.innerHTML = ""; } } }; FIRSTCLASS.apps.Wiki.prototype.updateCount = function() { if (this._navigator && this._navigator._tableView) { this._pageCount = this._navigator._tableView._nItems; } var html = ""; if (this._pageCount) { html += "" + this._pageCount + " " + FIRSTCLASS.locale.community.wiki.count + " "; if (this._view === "page") { html += "" + FIRSTCLASS.locale.community.wiki.showall + ""; } } this._countEl.innerHTML = html; }; FIRSTCLASS.apps.Wiki.prototype.isSafeToNavigate = function() { if (this._editor) { return false; } else { FIRSTCLASS.ui.ToolbarPopup.closePopup(); return true; } }; FIRSTCLASS.apps.Wiki.prototype.hideEditor = function() { if (this._editor) { if (this._editor && this._editor._editor) { this._editor._editor.destroy(); } this._editor.hideEditor(); this._editor = false; this._dataSource.activate(); // this._navigator.activate(); } if (this._saveDlg) { this._saveDlg.cancel(); this._saveDlg.destroy(); this._saveDlg = false; } }; FIRSTCLASS.apps.Wiki.prototype.showEditor = function() { if (this._editor) { this._editor.showEditor(); this._navigator.deactivate(); } }; FIRSTCLASS.apps.Wiki.prototype.cancelEdits = function() { if (this._editor) { if (this._editor._editor) { if (this._editor._tocTick) { window.clearInterval(this._editor._tocTick); this._editor._tocTick = false; } this._editor._editor.onCancel(); } } }; FIRSTCLASS.apps.Wiki.prototype.saveEdits = function() { if (this._editor) { this._editor._saveState = "saving"; } var that = this; var pageName = FIRSTCLASS.locale.community.wiki.save.defname; var comment = FIRSTCLASS.locale.community.wiki.save.defcomm; var tags = ""; var namewidth = "74", commwidth = "71", tagwidth = "97%"; if (YAHOO.env.ua.webkit) { namewidth = "63"; commwidth = "61"; tagwidth = "97%"; } else if (YAHOO.env.ua.mac && YAHOO.env.ua.gecko) { namewidth = "71"; commwidth = "69"; } if (this._currentRow && !this._editor._isACreate) { pageName = this._currentRow.col8010; tags = this._currentRow.tags; comment = ""; } // create and post dialog if (this._saveDlgEl) { var saveCont = document.getElementById("fcWikiSaveDlg"); if (saveCont && saveCont.parentNode) { this._leftTitleBarBox.removeChild(saveCont.parentNode); } this._saveDlgEl = false; this._saveDlg = false; } this._saveDlgEl = document.createElement("div"); this._saveDlgEl.setAttribute("style", "visibility:hidden"); this._saveDlgEl.setAttribute("id", "fcWikiSaveDlg"); var html = []; html.push("
"); html.push(FIRSTCLASS.locale.community.wiki.save.title); html.push(" " + pageName + "
"); html.push("
"); html.push(""); html.push(""); html.push(""); html.push("
"); html.push("
"); html.push("
"); this._saveDlgEl.innerHTML = html.join(""); this._leftTitleBarBox.appendChild(this._saveDlgEl); this._saveDlg = new YAHOO.widget.Dialog("fcWikiSaveDlg", { width: "525px", draggable: true, visible: false, constraintoviewport: true, postmethod: "manual", close: false, shim: (navigator.userAgent.toLowerCase().indexOf("msie") > -1), buttons: [ { text: FIRSTCLASS.locale.community.wiki.save.cancel, handler: function() { that._editor._saveState = "none"; this.cancel(); } }, { text: FIRSTCLASS.locale.community.wiki.save.save, handler: function() { if (that._editor && that._editor._editor && that._editor._editor._editForm) { var elements = that._editor._editor._editForm.elements, data = this.getData(), el = false, buttons = false, i; if (data.pagename) { // page name var pageName = FIRSTCLASS.lang.strTruncUTF8(data.pagename, 60); that._editor._editor._editForm["FieldID:8010=STRING"].value = pageName; // comment that._editor._editor._editForm["FieldID:8101=LITERALSTRING"].value = data.comment; // tags that._editor._editor._editForm["FieldID:8021=STRING"].value = data.tags; // toc update if (that._editor._tocTick) { window.clearInterval(that._editor._tocTick); that._editor._tocTick = false; } // save name for matching that._savePageName = pageName; for (i in elements) { if (elements[i] && elements[i].tagName) { el = elements[i]; if (typeof el === "object" && typeof el.tagName !== "undefined" && el.tagName === "INPUT") { el.disabled = "disabled"; } } } buttons = this.getButtons(); buttons[0].set('disabled', true); buttons[0].addClass('fcHidden'); buttons[1].set('disabled', true); buttons[1].set('label', FIRSTCLASS.locale.editor.misc.prog); that._editor._editor.onSubmit(false, {completed:function() { buttons[1].set('label', FIRSTCLASS.locale.community.feed.loading); }}); that._editsSaved = true; /* FIX: don't cancel here, let hideEditor do it this.cancel(); */ } } }, isDefault: true } ] }); this._tagContainer = FIRSTCLASS.ui.Dom.getChildByIdName('fcTagger', this._saveDlgEl); this._tags = FIRSTCLASS.ui.Dom.getChildByIdName('fcTags', this._saveDlgEl); this._tagcfg = { domElement: this._tagContainer, item: FIRSTCLASS.ui.parseServerTags(tags), hidesuggestions: true, destField: this._tags, showonconfig: true }; FIRSTCLASS.apps.Workflows.Tags.reconfigure(this._tagcfg); this._saveDlg.render(); this._saveDlg.show(); if (that._editor._isACreate) { that._saveDlg.form.pagename.value = ''; that._saveDlg.form.pagename.focus(); } else { that._saveDlg.form.comment.focus(); } return; }; FIRSTCLASS.apps.Wiki.prototype.hideHistory = function() { if (this._history) { this._history.dispose(); this._history = false; this._histEl.innerHTML = ''; FIRSTCLASS.ui.Dom.reparentNode(this._histEl, this._offlineEl); var that = this; window.setTimeout(function() { that._pageTB.reconfigure(that._currentRow, that._dataSource.getAcl()); }, 1000); } }; FIRSTCLASS.apps.Wiki.prototype.showHistory = function(el) { var that = this; if (this._currentRow) { var histCfg = { domEl: this._histEl, owner: this }; this._history = new FIRSTCLASS.apps.Wiki.history(histCfg); FIRSTCLASS.ui.Dom.reparentNode(this._histEl, el); // if (this._navigator) { // this._navigator.clearCommentFlags(this._currentRow); // } } }; FIRSTCLASS.apps.Wiki.prototype.showCommentToolbar = function(fcevent) { var el = fcevent.target; if (el) { var row = el.row; if (row) { this._selectedComment = el; var delown = FIRSTCLASS.permissions.hasPriv(row.acl, FIRSTCLASS.permissions.ACL.DELETEOWN); var del = FIRSTCLASS.permissions.hasPriv(row.acl, FIRSTCLASS.permissions.ACL.DELETE); if (del || (delown && FIRSTCLASS.session.user.cid === row.creatorcid)) { var tbCont = FIRSTCLASS.ui.Dom.getChildByClassName('fcCommentToolbar', el); if (tbCont) { FIRSTCLASS.ui.Dom.reparentNode(this._commentTBEl, tbCont); } } } } }; FIRSTCLASS.apps.Wiki.prototype.deleteComment = function(fcevent) { var el = fcevent.target; if (el && this._selectedComment) { this._dataSource.deleteRow(this._selectedComment.row); FIRSTCLASS.ui.Dom.reparentNode(this._commentTBEl, this._offlineEl); this._selectedComment.parentNode.removeChild(this._selectedComment); this._selectedComment = false; } }; FIRSTCLASS.apps.Wiki.prototype.hideComments = function() { var wasFlagged = false; if (this._commEditor) { this._commEditor.onCancel(); this._commEditor.destroy(); this._commEditor = false; } FIRSTCLASS.ui.Dom.reparentNode(this._commentFrame, this._offlineEl); this._commentListFrame.innerHTML = ""; this._commentEditFrame.innerHTML = ""; if (this._navigator) { wasFlagged = this._navigator.clearCommentFlags(this._currentRow); } if (this._commenting && wasFlagged) { var that = this; window.setTimeout(function() { that._pageTB.reconfigure(that._currentRow, that._dataSource.getAcl()); }, 1000); } this._commenting = false; }; FIRSTCLASS.apps.Wiki.prototype.showComments = function(event, element) { this._commentListFrame.innerHTML = ""; this._commentEditFrame.innerHTML = ""; YAHOO.util.Dom.setStyle(element, 'background-color', '#FFFFFF'); if (FIRSTCLASS.permissions.hasPriv(this._dataSource.getAcl(), FIRSTCLASS.permissions.ACL.SEND)) { // show it element.appendChild(this._commentFrame); // create the comment editor var msgCfg = { callback: { owner: this, onDisplay: function () { var btn = document.getElementById("fcDocFormCancel"); if (btn) { YAHOO.util.Dom.setStyle(btn,'display','none'); } btn = document.getElementById("fcDocFormClear"); if (btn) { YAHOO.util.Dom.setStyle(btn,'display','none'); } this.owner.clearComment(); if (this.owner._commEditor && this.owner._commEditor._editForm && this.owner._commEditor._editForm.BODY) { this.owner._commEditor._editForm.BODY.focus(); } }, onCancel: function () { this.owner.clearComment(); }, onSave: function () { this.owner.clearComment(); this.owner._postedAComment = true; this.owner._dataSource.fetchNewRows(); }, validate: function() { var hasData = false; if (this.owner._commEditor && this.owner._commEditor._editForm) { var data = this.owner._commEditor._editForm.BODY.value; if (data && data.length > 0) { hasData = true; } } return hasData; } }, element: this._commentEditFrame, op: FIRSTCLASS.opCodes.Reply, params: "Quote=0", baseURL: FIRSTCLASS.lang.ensureSlashUrl(this._dataSource.getItemUrl(this._currentRow)), objType: FIRSTCLASS.objTypes.message, formID: 21003, formElId: "fcDocForm", bodyType: "plain", tbType: "reply", initHeight: "80px", quoteText: false, sendTo: false, showAddr: false }; this._commEditor = new FIRSTCLASS.util.Message(msgCfg); } // add the list of comments if (this._navigator && this._navigator._comments) { var comments = this._navigator._comments[this._currentRow.threadid]; if (comments) { var newCommentEl, idx, currVersion = -1, showVersion = false; for (idx in comments) { if (comments[idx].messageid) { if (!comments[idx].replyToVersion) { this.setReplyToVersion(comments[idx]); } showVersion = false; if (comments[idx].replyToVersion !== currVersion) { currVersion = comments[idx].replyToVersion; showVersion = true; } if (!comments[idx].status.deleted) { newCommentEl = this.renderComment(comments[idx], showVersion); this._commentListFrame.appendChild(newCommentEl); } } } } } // create comment toolbar this._commentTBEl = document.createElement('div'); var TBCfg = { domElement: this._commentTBEl, buttons: [ { id: "fcWikiCommentDelete", label: FIRSTCLASS.locale.toolbars.wiki.del, fcid: "wikicommentdelete" } ] }; this._commentTB = new FIRSTCLASS.ui.toolBar(TBCfg); this._commenting = true; }; // set the version number that this comment is in reply to FIRSTCLASS.apps.Wiki.prototype.setReplyToVersion = function(row) { var versions = false; var theVersion = 1; if (row && this._navigator && this._navigator._versions) { versions = this._navigator._versions[row.threadid]; } if (versions) { var page = false, lastPage = false; for (page in versions) { if (versions[page].lastmods) { if (versions[page].lastmods < row.lastmods) { if (!lastPage || versions[page].lastmods > versions[lastPage].lastmods) { // save newest version prior to the comment lastPage = page; } } } } if (lastPage) { theVersion = versions[lastPage].col8090; } } row.replyToVersion = theVersion; }; FIRSTCLASS.apps.Wiki.prototype.renderComment = function(row, showVersion) { var commentEl = this._commentProto.cloneNode(true); var html = []; var el = false; var nm = false; // set the row onto the outer element commentEl.row = row; // show the version on this comment if (showVersion) { el = FIRSTCLASS.ui.Dom.getChildByClassName('fcCommentVersion', commentEl); if (el) { el.innerHTML = FIRSTCLASS.locale.comments.version + " " + row.replyToVersion; } } // comment posting details el = FIRSTCLASS.ui.Dom.getChildByClassName('fcCommentDetails', commentEl); if (el) { html = []; var itemstr = FIRSTCLASS.locale.history.commented; nm = row.name; if (row.col8082) { nm = row.col8082; } html.push("
"); html.push(nm); html.push("
"); el.innerHTML = itemstr.replace("$name$",html.join("")).replace("$date$", "
" + FIRSTCLASS.util.Date.getFriendlyDateTimeString(row.lastmods) + "
"); } // show the author's piccie el = FIRSTCLASS.ui.Dom.getChildByClassName('fcHistProfPic', commentEl); if (el) { var picurl = ""; var cid = false; if (row.itemdata && row.itemdata.from) { picurl = FIRSTCLASS.util.User.getSmallProfPicUrlByCid(row.itemdata.from[0].cid); cid = row.itemdata.from[0].cid; } else if (row.creatorcid) { picurl = FIRSTCLASS.util.User.getSmallProfPicUrlByCid(row.creatorcid); cid = row.creatorcid; } else { picurl = FIRSTCLASS.util.User.getSmallProfPicUrlByName(nm); } picurl += "&WidthAA=20&HeightAA=27"; if (row.status.unread) { YAHOO.util.Dom.setStyle(el, 'background-image', "url("+picurl+")"); } else { YAHOO.util.Dom.setStyle(el, 'background-image', ""); var img = document.createElement("img"); img.src = picurl; img.setAttribute('fcid', 'user'); img.setAttribute('fcattrs', nm); if (cid) { img.setAttribute('uid', cid); } YAHOO.util.Dom.addClass(img,'fcHistProfPic'); YAHOO.util.Dom.removeClass(img, 'fcHistPicUnread'); el.removeChild(el.lastChild); el.appendChild(img); } } // text of the comment el = FIRSTCLASS.ui.Dom.getChildByClassName('fcCommentText', commentEl); if (el && row.expandedPreview) { el.innerHTML = row.expandedPreview; } return commentEl; }; FIRSTCLASS.apps.Wiki.prototype.clearComment = function() { if (this._commEditor) { this._commEditor.clearContent(); } }; FIRSTCLASS.apps.Wiki.prototype.sendTo = function(row, fcevent) { var rgn = YAHOO.util.Dom.getRegion(fcevent.target); var xy = [rgn.left + rgn.width, rgn.top]; var config = { xy: xy, row: row, dataSource: this._dataSource, community: { uri: this._dataSource.getContainerUrl(), name: this._dataSource._data.name, cid: this._dataSource._data.cid }, permalink: this._dataSource.getPermalink(row) }; FIRSTCLASS.apps.Workflows.SendTo.draw(config); }; FIRSTCLASS.apps.Wiki.prototype.editPage = function() { if (this._currentRow) { this._navigator.deactivate(); var editCfg = { row: this._currentRow, domElement: this._pageView._bodyEl, wiki: this }; this._editor = new FIRSTCLASS.apps.Wiki.editor(editCfg); this._pageView.processContentNodes(); this._editsSaved = false; } }; // instantiate tagger and insert into passed-in element FIRSTCLASS.apps.Wiki.prototype.showTags = function(event, element) { var row = this._currentRow; var config = { domElement:element, item: FIRSTCLASS.ui.parseServerTags(row.tags), personal:FIRSTCLASS.session.desktop.personaltags, container: FIRSTCLASS.ui.parseServerTags(this._dataSource.getTags()), editable: true, dataSource: this._dataSource, row: row, showonconfig:true }; this._tagging = true; FIRSTCLASS.apps.Workflows.Tags.reconfigure(config); this._dataSource.deactivate(); }; FIRSTCLASS.apps.Wiki.prototype.hideTags = function() { FIRSTCLASS.apps.Workflows.Tags.cleanup(); this._tagging = false; this._dataSource.activate(); }; FIRSTCLASS.apps.Wiki.prototype.newPage = function() { this._navigator.deactivate(); var editCfg = { row: false, domElement: this._pageView._bodyEl, wiki: this }; this._editor = new FIRSTCLASS.apps.Wiki.editor(editCfg); this._pageView.updateContents(); this._pageView.hideContents(); this.setView('edit'); }; FIRSTCLASS.apps.Wiki.prototype.activate = function () { if (this._navigator) { this._navigator.activate(); } FIRSTCLASS.session.setActiveApplication(this, "wiki"); FIRSTCLASS.ui.rightSideBar.updateBoxContents(FIRSTCLASS.locale.community.actions.lbl, this._actionsEl); FIRSTCLASS.ui.leftSideBar.updateBoxContents(FIRSTCLASS.locale.community.actions.lbl, this._actionsEl); }; FIRSTCLASS.apps.Wiki.prototype.deactivate = function(internal) { this._navigator.deactivate(); if (!internal) { FIRSTCLASS.ui.skin.clear(); this._community.deactivate(internal); } }; // Show error dialog, with config options: // .header string dialog title bar // .body string dialog message // .width number pixel width of dialog // .onCancel function callback when dialog dismissed // FIRSTCLASS.apps.Wiki.prototype.showErrorDialog = function(config) { var width = "320px"; if (config.width) { width = config.width + "px"; } var failDlg = new YAHOO.widget.SimpleDialog("dlg", { width: '320px', fixedcenter: true, postmethod: 'none', visible: false, draggable: false }); if (config.header) { failDlg.setHeader(config.header); } if (config.body) { failDlg.setBody(config.body); } failDlg.cfg.setProperty("icon",YAHOO.widget.SimpleDialog.ICON_WARN); var doCancel = function() { if (typeof config.onCancel === "function") { config.onCancel(); } failDlg.destroy(); }; failDlg.cfg.queueProperty('buttons', [ { text: FIRSTCLASS.locale.community.wiki.del.cancel, handler: doCancel } ]); failDlg.render(document.body); failDlg.show(); }; // -- wiki url handler callbacks // callback to make full url from clicked-on content URLs FIRSTCLASS.apps.Wiki.prototype.getCurrentPageUrl = function() { return this._dataSource.getItemUrl(this._currentRow); }; YAHOO.register("fcWiki", FIRSTCLASS.apps.Wiki, {version: "0.0.1", build: "1"}); // ---- Wiki navigation control ---- /* * Navigator configuration: * domElement - element to install in * dataSource * wiki - parent object pointer */ FIRSTCLASS.apps.Wiki.navigator = function(config) { this._domElement = config.domElement; this._dataSource = config.dataSource; this._wiki = config.wiki; this._fixedHeader = false; this._firstPageEl = false; // initialize dimensions this.nItems = 0; this._firstFill = true; // initialize row maps this._versions = []; // versions, by thread this._comments = []; // comments, by thread var that = this; this._quickFind = false; // prototype HTML elements this._nameProtoA = document.createElement('div'); var html = []; html.push("
"); html.push("
"); html.push("
"); this._nameProtoA.innerHTML = html.join(''); this._nameProto = this._nameProtoA.firstChild; this._nameFlagProto = document.createElement('div'); YAHOO.util.Dom.setStyle(this._nameFlagProto, 'display', 'block'); YAHOO.util.Dom.addClass(this._nameFlagProto, 'fcWikiIconFlag'); // create table view - Name, version, lastmod, author, comments, tags var tvConfig = { dataSource: this._dataSource, columns: this._wiki._config.dataSource.getColumns(), domEl: this._domElement, defaultSort: { key: "name", dir: YAHOO.widget.DataTable.CLASS_ASC }, colDefs: [ { label: FIRSTCLASS.locale.community.docs.columns.name, key: "name", pcWidth: 40, abbr: "page name", formatter: function(elCell, oRow, oColumn, oData) { that.formatName(elCell, oRow, oColumn, oData); }, className: 'fcWikiListName', sortable: true }, { label: FIRSTCLASS.locale.community.docs.columns.version, abbr: "version", key: "col8090", pcWidth: 7, formatter: function(elCell, oRow, oColumn, oData) { that.formatVersion(elCell, oRow, oColumn, oData); }, className: 'fcWikiListVersion', sortable: true }, { label: FIRSTCLASS.locale.community.wiki.columns.date, key: "parsedDate", pcWidth: 14, formatter: function(elCell, oRow, oColumn, oData) { that.formatDate(elCell, oRow, oColumn, oData); }, className: 'fcWikiListDate', sortable: true }, { label: FIRSTCLASS.locale.community.wiki.columns.author, key: "col8082", pcWidth: 15, formatter: function(elCell, oRow, oColumn, oData) { that.formatAuthor(elCell, oRow, oColumn, oData); }, className: 'fcWikiListAuthor', sortable: true }, { label: FIRSTCLASS.locale.community.docs.columns.comments, abbr: "comments", key: "comments", pcWidth: 10, formatter: function(elCell, oRow, oColumn, oData) { that.formatComments(elCell, oRow, oColumn, oData); }, className: 'fcWikiListComments', sortable: true }, { label: FIRSTCLASS.locale.community.docs.columns.tags, key: "tags", pcWidth: 14, formatter: function(elCell, oRow, oColumn, oData) { that.formatTags(elCell, oRow, oColumn, oData); }, sortable: true } ], objtypes: [FIRSTCLASS.objTypes.odocument, FIRSTCLASS.objTypes.message], totalPad: 55, callback: this }; this._tableView = new FIRSTCLASS.layout.TableView(tvConfig); // filter var qfCfg = { domEl: this._wiki._filterEl, callback: { filter: function(str) { that._tableView.quickFilterRows(str); }, reset: function() { that._tableView.unQuickFilter(); } } }; this._quickFilter = new FIRSTCLASS.util.quickFilter(qfCfg); }; // navigator vars FIRSTCLASS.apps.Wiki.navigator.prototype._domElement = false; FIRSTCLASS.apps.Wiki.navigator.prototype._dataSource = false; FIRSTCLASS.apps.Wiki.navigator.prototype._wiki = false; // navigator functions FIRSTCLASS.apps.Wiki.navigator.prototype.activate = function() { if (this._tableView) { if (this._wiki._view === "list") { this.show(); } this._tableView.activate(); } }; FIRSTCLASS.apps.Wiki.navigator.prototype.deactivate = function() { if (this._tableView) { this._tableView.deactivate(); } this.hide(); }; FIRSTCLASS.apps.Wiki.navigator.prototype.show = function() { if (this._tableView) { this._tableView.show(); } }; FIRSTCLASS.apps.Wiki.navigator.prototype.hide = function() { if (this._tableView) { this._tableView.hide(); } }; FIRSTCLASS.apps.Wiki.navigator.prototype.formatName = function(elCell, oRow, oColumn, oData) { var row = oRow._oData; var newCell = this._nameProto.cloneNode(true); newCell.childNodes[1].innerHTML = FIRSTCLASS.lang.mlesc(oData); if (row.col8101) { newCell.childNodes[1].setAttribute('title', row.col8101); } if (this.getUnreadState(row, true)) { var nameFlag = this._nameFlagProto.cloneNode(true); newCell.firstChild.firstChild.appendChild(nameFlag); } elCell.appendChild(newCell); }; FIRSTCLASS.apps.Wiki.navigator.prototype.formatVersion = function(elCell, oRow, oColumn, oData) { var vers = 1; if (typeof oData === "number") { vers = oData; } elCell.innerHTML = vers + ""; }; FIRSTCLASS.apps.Wiki.navigator.prototype.formatDate = function(elCell, oRow, oColumn, oData) { var row = oRow._oData; elCell.innerHTML = FIRSTCLASS.util.Date.getFriendlyShortDateString(row.lastmods) + ' '; }; FIRSTCLASS.apps.Wiki.navigator.prototype.formatAuthor = function(elCell, oRow, oColumn, oData) { var row = oRow._oData; var name = row.col8082; var mds = this._wiki._community._memberlistds; if (mds) { var author = mds.query("uid","" + row.creatorcid); if (author && author.length) { author = author[0][1]; name = author.name; } } elCell.innerHTML = ' ' + name; }; FIRSTCLASS.apps.Wiki.navigator.prototype.formatComments = function(elCell, oRow, oColumn, oData) { var row = oRow._oData, unread = this.getUnreadState(row, true), comments = 0; if (this._comments[row.threadid]) { comments = this._comments[row.threadid].length + " "; } if (unread && unread.comments > 0) { var str = FIRSTCLASS.locale.doSub(FIRSTCLASS.locale.community.wiki.ncomments, {count: unread.comments}); comments += "" + str + ""; } elCell.innerHTML = comments + ""; }; FIRSTCLASS.apps.Wiki.navigator.prototype.formatTags = function(elCell, oRow, oColumn, oData) { var tags = ""; if (oData) { tags = oData; tags = FIRSTCLASS.ui.generateTagDisplayList(FIRSTCLASS.ui.parseServerTags(tags, {clickable:false, weight:1})); if (tags.length > 45) { tags = tags.substring(0,45) + "..."; } } elCell.innerHTML = "" + tags + ""; }; // table view new-row callback FIRSTCLASS.apps.Wiki.navigator.prototype.onNewRow = function(row) { // fix version header style if (!this._fixedHeader && this._tableView && this._tableView._dt) { var header = this._tableView._dt.getThLinerEl('col8090'); if (header) { YAHOO.util.Dom.setStyle(header,'text-align','center'); this._fixedHeader = true; } } // update page count this._wiki.updateCount(); }; // table view row-update callback FIRSTCLASS.apps.Wiki.navigator.prototype.onRowUpdate = function(oldRow, newRow) { this.onNewRow(newRow); }; // table view fill-complete callback FIRSTCLASS.apps.Wiki.navigator.prototype.fillComplete = function() { this._wiki.updateCount(); if (!this._wiki._pageCount || this._wiki._pageCount === 0) { if (FIRSTCLASS.permissions.hasPriv(this._wiki._communityACL, FIRSTCLASS.permissions.ACL.CREATE)) { this.insertPlaceholder(this._domElement); } } else { this.removePlaceholder(); } }; FIRSTCLASS.apps.Wiki.navigator.prototype.removePlaceholder = function() { if (this._firstPageEl && this._firstPageEl.parentNode) { this._firstPageEl.parentNode.removeChild(this._firstPageEl); this._firstPageEl = false; } }; FIRSTCLASS.apps.Wiki.navigator.prototype.insertPlaceholder = function(domEl) { if (!this._firstPageEl) { this._firstPageEl = document.createElement("div"); this._firstPageEl.setAttribute('width','100%'); YAHOO.util.Dom.setStyle(this._firstPageEl,'padding-top','8px'); YAHOO.util.Dom.setStyle(this._firstPageEl,'padding-left','8px'); var TBCfg = { domElement: this._firstPageEl, buttons: [ { id: "makefirstwikipage", label: FIRSTCLASS.locale.community.wiki.initial, fcid: "newwikipage" } ] }; var tb = new FIRSTCLASS.ui.toolBar(TBCfg); domEl.appendChild(this._firstPageEl); } }; // table view row-delete callback FIRSTCLASS.apps.Wiki.navigator.prototype.onRowDelete = function(row) { if (row.typedef.objtype === FIRSTCLASS.objTypes.odocument) { this.removeFromVersionMap(row); } else { this.removeFromCommentMap(row); } }; // table view row-click callback FIRSTCLASS.apps.Wiki.navigator.prototype.onRowClick = function(row) { if (this._wiki && row) { this._wiki.openPage(row); } }; FIRSTCLASS.apps.Wiki.navigator.prototype.rowFromPageName = function(pageName) { var row = false; if (this._tableView) { var rows = this._tableView.query("name", pageName, true); if (rows) { row = rows[0][1]; } } return row; }; // add a new version from the given row; replace if already there FIRSTCLASS.apps.Wiki.navigator.prototype.addToVersionMap = function(row) { var threadVers = this._versions[row.threadid]; if (!threadVers) { threadVers = []; this._versions[row.threadid] = threadVers; } var found = false, i; for (i in threadVers) { if (threadVers[i].uid === row.uid) { found = true; threadVers.splice(i,1,row); break; } } if (threadVers && !found) { threadVers.push(row); } return; }; // add a new comment from the given row; replace if already there FIRSTCLASS.apps.Wiki.navigator.prototype.addToCommentMap = function(row) { var threadComm = this._comments[row.threadid]; if (!threadComm) { threadComm = []; this._comments[row.threadid] = threadComm; } var found = false, i; for (i in threadComm) { if (threadComm[i].uid === row.uid) { found = true; threadComm.splice(i,1,row); break; } } if (threadComm && !found) { if (threadComm[0] && threadComm[0].lastmods && row.lastmods && row.lastmods > threadComm[0].lastmods) { threadComm.splice(0,0,row); } else { threadComm.push(row); } } return; }; // remove passed-in version from map FIRSTCLASS.apps.Wiki.navigator.prototype.removeFromVersionMap = function(row) { var threadVers = this._versions[row.threadid], i; if (threadVers) { for (i in threadVers) { if (threadVers[i].uid === row.uid) { threadVers.splice(i, 1); break; } } if (threadVers.length === 0) { delete this._versions[row.threadid]; } } return; }; // remove passed-in comment from map FIRSTCLASS.apps.Wiki.navigator.prototype.removeFromCommentMap = function(row) { var threadComm = this._comments[row.threadid],i; for (i in threadComm) { if (threadComm[i].uid === row.uid) { threadComm.splice(i,1); break; } } return; }; // clear comment red flags for thread of passed-in row FIRSTCLASS.apps.Wiki.navigator.prototype.clearCommentFlags = function(row) { var threadComm = this._comments[row.threadid]; var foundUnread = false, i; for (i in threadComm) { if (threadComm[i].status && threadComm[i].status.unread) { this._dataSource.toggleUnRead(threadComm[i], 0); foundUnread = true; } } return foundUnread; }; // returns an object of the form { versions, comments } or false if none. FIRSTCLASS.apps.Wiki.navigator.prototype.getUnreadState = function(row, includelatest) { var rc = false, newVersions = 0, newComments = 0, i, j; var comments = this._comments[row.threadid]; for (i in comments) { if (comments[i].status.unread) { newComments++; } } var versions = this._versions[row.threadid]; for (j in versions) { if (versions[j].status.unread && (versions[j].status.backversion || includelatest)) { newVersions++; } } if (newVersions > 0 || newComments > 0) { rc = { versions: newVersions, comments: newComments }; } return rc; }; // row filter function; return code controls placement in list FIRSTCLASS.apps.Wiki.navigator.prototype.rowFilter = function(row) { // it's a wiki page var acceptIt = row.typedef.objtype === FIRSTCLASS.objTypes.odocument, mapIt = acceptIt; // it's a wiki comment if (row.replyobjtype && (row.replyobjtype === FIRSTCLASS.objTypes.odocument)) { mapIt = true; } // it's not deleted if (row.status.deleted) { mapIt = acceptIt = false; } // it's not a half-formed new page if ((row.typedef.objtype === FIRSTCLASS.objTypes.odocument) && !row.col8082) { mapIt = acceptIt = false; } // it's not an external document if (row.linkinfo) { mapIt = acceptIt = false; } // it's not a wrapped file if (row.lformid && row.lformid === 20503) { mapIt = acceptIt = false; } if (mapIt) { this.mapNewRow(row); } if (mapIt && this._wiki._commenting && this._wiki._postedAComment && row.threadid === this._wiki._currentRow.threadid && this._wiki._commentFrame && this._wiki._commentFrame.parentNode) { this._wiki.showComments(false, this._wiki._commentFrame.parentNode); this._wiki._postedAComment = false; } return acceptIt; }; FIRSTCLASS.apps.Wiki.navigator.prototype.mapNewRow = function(row) { if (row.typedef.objtype === FIRSTCLASS.objTypes.odocument) { // a version this.addToVersionMap(row); // open the page if it's an update to the current page or the result of an edit; there are three cases: // - unsolicited update - thread id matches current, and there is no pending edit and not viewing history var update = this._wiki._currentRow && this._wiki._currentRow.threadid === row.threadid && !this._wiki._savedWikiThreadID && !row.status.backversion && !this._wiki._history && !this._wiki._tagging; // - completed edit of new item - no current row and name matches saved name var newedit = !this._wiki._currentRow && row.col8010 === this._wiki._savePageName; // - completed edit of existing item - thread id matches saved one, message id does not match current var edit = this._wiki._savedWikiThreadID && this._wiki._currentRow && row.threadid === this._wiki._savedWikiThreadID && row.messageid !== this._wiki._currentRow.messageid && !row.status.backversion; if (update || edit || newedit) { this._wiki._savedWikiThreadID = false; this._wiki._savePageName = false; this._wiki.hideEditor(); this._wiki.openPage(row); } } else { // a comment this.addToCommentMap(row); } }; // ---- Wiki editor ---- // editor configuration: // domElement // wiki FIRSTCLASS.apps.Wiki.editor = function(config) { this._domElement = config.domElement; this._wiki = config.wiki; this._dsRow = config.row || null; var that = this; // create editor socket and page container this._view = {}; this._view.socketEl = document.createElement("div"); // holder div for editor this._view.editEl = document.createElement("div"); YAHOO.util.Dom.addClass(this._view.editEl, "fcWikiPage"); this._view.socketEl.appendChild(this._view.editEl); this._view.isOffscreen = true; this._isACreate = false; // fire up the editor var msgCfg = { callback: this, dataSource: this._wiki._dataSource, row: this._dsRow, element: this._view.editEl, objType: FIRSTCLASS.objTypes.odocument, body: "HTML", formID: 20501, formElId: "fcDocForm", bodyType: "HTML", maxImage: 720, quoteText: null, sendTo: null, tbType: "wiki", initHeight: this._domElement.offsetHeight, initWidth: this._domElement.offsetWidth }; this._wiki.setPageInfo(FIRSTCLASS.locale.community.wiki.editing, this._pgInfoEl); if (this._dsRow) { // edit vs create msgCfg.baseURL = this._wiki._dataSource.getItemUrl(this._dsRow); msgCfg.op = FIRSTCLASS.opCodes.FormEdit; msgCfg.params = "Close=-1"; } else { this._isACreate = true; msgCfg.baseURL = this._wiki._dataSource.getContainerUrl(); msgCfg.op = FIRSTCLASS.opCodes.FormNew; msgCfg.params = "Close=-1&InitialText="; } this._editor = new FIRSTCLASS.util.Message(msgCfg); // set up interval timer to refresh contents during editing this._contentChange = false; this._tocTick = window.setInterval(function() { that.checkTOCUpdate(); }, 3000); this._saveState = "none"; }; // editor vars // editor functions FIRSTCLASS.apps.Wiki.editor.prototype.onFail = function(obj) { var that = this; var cfg = { header: FIRSTCLASS.locale.community.wiki.noedhd, body: FIRSTCLASS.locale.community.wiki.noedit, onCancel: function() { that._wiki.hideEditor(); } }; if (obj && obj.error) { cfg.body = FIRSTCLASS.locale.errors.getErrorString(obj.error); } this._wiki.showErrorDialog(cfg); }; FIRSTCLASS.apps.Wiki.editor.prototype.onLoaded = function(success) { if (success) { this._wiki.setView("edit"); } else { var that = this; var cfg = { header: FIRSTCLASS.locale.community.wiki.noedhd, body: FIRSTCLASS.locale.community.wiki.noedit, onCancel: function() { that._wiki.hideEditor(); } }; this._wiki.showErrorDialog(cfg); } }; FIRSTCLASS.apps.Wiki.editor.prototype.onDisplay = function() { if (this._editor && this._editor._editor) { this._editor._editor.on('afterCommandExec', function() { this.onCommand(); }, this); } if (this._wiki._titleEl) { var contents = ""; if (this._editor && this._editor._editForm) { contents = this._editor._editForm["FieldID:8010=STRING"].value; } this._wiki._titleEl.firstChild.innerHTML = FIRSTCLASS.lang.mlesc(contents); } this.onCommand(); this._wiki.resizeEvent(); }; FIRSTCLASS.apps.Wiki.editor.prototype.showEditor = function() { if (this._view.isOffscreen) { FIRSTCLASS.ui.Dom.reparentNode(this._view.editEl, this._domElement); this._view.isOffscreen = false; } }; FIRSTCLASS.apps.Wiki.editor.prototype.onCancel = function() { this._wiki.hideEditor(); if (this._wiki._currentRow) { this._wiki.openPage(this._wiki._currentRow); } }; FIRSTCLASS.apps.Wiki.editor.prototype.onSave = function(response) { var that = this, cb = false; this._saveState = "done"; if (response.responseJSON) { this._wiki._savedWikiThreadID = response.responseJSON.item.threadid; this._wiki._navigator.activate(); } else if (this._wiki._currentRow && !this._isACreate) { this._wiki.openPage(this._wiki._currentRow); } else { this._wiki._navigator.activate(); } }; FIRSTCLASS.apps.Wiki.editor.prototype.onSubmit = function() { }; FIRSTCLASS.apps.Wiki.editor.prototype.onCommand = function() { this._contentChange = true; }; FIRSTCLASS.apps.Wiki.editor.prototype.onTyping = function() { this._contentChange = true; }; FIRSTCLASS.apps.Wiki.editor.prototype.hideEditor = function() { if (!this._view.isOffscreen) { FIRSTCLASS.ui.Dom.reparentNode(this._view.editEl,this._view.socketEl); this._view.isOffscreen = true; } }; FIRSTCLASS.apps.Wiki.editor.prototype.checkTOCUpdate = function() { if (this._contentChange) { this._wiki._pageView.updateContents(); this._contentChange = false; } }; // ---- Wiki page viewer ---- // // configuration is: // domEl - the element to install view into // dataSource - the source of data // owner - the owning application // FIRSTCLASS.apps.Wiki.pageView = function(config) { this._config = config; var html = [], el = this._config.domEl; html.push(""); html.push(""); html.push(""); html.push(""); html.push("
"); html.push("
"); html.push("
"); el.innerHTML = html.join(''); this._bodyCell = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiPageCell", el); this._bodyEl = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiPageBody", el); this._tocCell = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiTOCCell", el); this._tocEl = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiTOC", el); this._tocEl.setAttribute('fcid', 'wikitoc'); this._tocBtnEl = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiTOCBtn", el); this._tocBtnEl.setAttribute('fcid', 'wikitocbtn'); this._tocSplitEl = FIRSTCLASS.ui.Dom.getChildByClassName("fcWikiPageSplit", el); this._tocTitle = document.createElement("div"); YAHOO.util.Dom.addClass(this._tocTitle, 'fcWikiContentsTitle'); this._tocTitle.innerHTML = "
" + FIRSTCLASS.locale.community.wiki.contents + "
"; this._offlineEl = document.createElement("div"); this._offlineEl.appendChild(this._tocTitle); this._contentBase = this._bodyEl; this.hideContents(); this._tocOrigin = 0; this._nTocRows = 0; this._TOC = []; this._scrollToc = false; }; // open the page FIRSTCLASS.apps.Wiki.pageView.prototype.openPage = function(row, callback) { var that = this; var openCB = { success: function(o) { that.constructPage(row, o.responseText); if (callback.success) { callback.success(o); } }, failure: function(o) { if (callback.failure) { callback.failure(o); } } }; var url = this._config.dataSource.getItemUrl(row); var qm = "?"; if (url.indexOf(qm) < 0) { url += "?"; } else { url += "&"; } url += "FormID=20501"; FIRSTCLASS.util.net.asyncRequest('GET', url, openCB); }; // populate page view from passed-in row and body text FIRSTCLASS.apps.Wiki.pageView.prototype.constructPage = function(row, pageText) { if (this._config.dataSource && pageText) { // swap the body out of the DOM FIRSTCLASS.ui.Dom.reparentNode(this._bodyEl, this._offlineEl); this._bodyEl.innerHTML = this._config.dataSource.expandContent(row, pageText); FIRSTCLASS.ui.Dom.reparentNode(this._bodyEl, this._bodyCell); this.processContentNodes(); this.updateContents(); this.hideContents(); } }; FIRSTCLASS.apps.Wiki.pageView.prototype.setContentBaseNode = function(node) { if (node) { this._contentBase = node; } }; FIRSTCLASS.apps.Wiki.pageView.prototype.processContentNodes = function() { /* if (this.howMany) alert('wow'); else this.howMany = true; */ // functions for various kinds of nodes var wikiWidth = this._config.owner._domEl.clientWidth; var processAnchor = function(node) { if ((node.className === "fcwl") && (this._view !== 'edit')) { node.setAttribute('fcid', 'fcwl'); } }; var processDiv = function(node) { if ((node.className === 'fcEmbed') && (this._view === 'edit')) { node.innerHTML = ""; } }; var processImage = function(node) { if (node.width && (node.width > 0)) { if (node.width > wikiWidth) { node.width = parseInt(wikiWidth * 0.80); node.setAttribute("width", node.width + "px"); } } else { YAHOO.util.Event.addListener(node, "load", function(ev) { if (node.width > wikiWidth) { node.width = parseInt(wikiWidth * 0.90); node.setAttribute("width", node.width + "px"); YAHOO.util.Event.stopEvent(ev); } }); } }; var process = function(node) { var c; switch (node.tagName) { case 'A': processAnchor(node); break; case 'DIV': processDiv(node); break; case 'IMG': processImage(node); break; } for (c = 0; c < node.childNodes.length; c++) { process(node.childNodes[c]); } }; // find base node - FIX THIS TO CALL setContentBaseNode var baseEl = this._contentBase; if (this._config.owner._view === "edit") { var editor = this._config.owner.editor; if (editor && editor._editor && editor._editor._editor && editor._editor._editor._getDoc) { var doc = editor._editor._editor._getDoc(); if (doc.body) { baseEl = doc.body; } } } process(baseEl); }; FIRSTCLASS.apps.Wiki.pageView.prototype.updateContents = function() { // function to walk nodes and scrape headings var addToTOC = function (node, list) { var isH = true; var level = false, c; switch (node.tagName) { case 'H1': level = 1; break; case 'H2': level = 2; break; case 'H3': level = 3; break; case 'H4': level = 4; break; case 'H5': level = 5; break; case 'H6': level = 6; break; default: isH = false; } if (isH) { var e = {}; if (YAHOO.env.ua.ie) { e.text = "" + node.innerText; } else { e.text = "" + node.textContent; } e.el = node; e.level = level; list.push(e); } for (c = 0; c < node.childNodes.length; c++) { addToTOC(node.childNodes[c],list); } }; this._TOC = []; // find base node var w = this._config.owner; var baseEl = this._bodyEl; if (w._view === "edit") { if (w._editor && w._editor._editor && w._editor._editor._editor && w._editor._editor._editor.document) { baseEl = w._editor._editor._editor.document.getBody().$; } } addToTOC(baseEl, this._TOC); this.setTocBounds(this._tocCell.offsetHeight); }; // insert the contents data into the contents pane, with optional scroller buttons FIRSTCLASS.apps.Wiki.pageView.prototype.drawContents = function() { var row = this._tocOrigin, end = row + this._nTocRows; var text, title; this._tocEl.innerHTML = ""; var html = []; if (this._scrollToc) { html.push("
"); } for (; row < end; row++) { html.push(" 32) { text = text.slice(0,29) + "..."; } html.push(" id='fcWikiTOC" + row + "' fcid='wikitoc' title='" + title + "'>" + text + ""); } if (this._scrollToc) { html.push("
"); html.push("
"); } this._tocEl.innerHTML = html.join(""); // set up event handler keys if (this._scrollToc) { var that = this; var btn = FIRSTCLASS.ui.Dom.getChildByIdName('fcWikiTocUp',this._tocEl); btn.setAttribute('fcid','wikitocup'); btn = FIRSTCLASS.ui.Dom.getChildByIdName('fcWikiTocDown',this._tocEl); btn.setAttribute('fcid','wikitocdown'); } return; }; // set the ordinal origin for the top TOC item FIRSTCLASS.apps.Wiki.pageView.prototype.setTocOrigin = function(origin) { if (this._scrollToc && this._TOC && this._TOC.length > 0) { if (origin !== this._tocOrigin && this._scrollToc) { this._tocOrigin = origin; if (this._tocOrigin < 0) { this._tocOrigin = 0; } if (this._tocOrigin > (this._TOC.length - this._nTocRows)) { this._tocOrigin = this._TOC.length - this._nTocRows; } if (!this._tocHidden) { this.drawContents(); } } } else { this._tocOrigin = 0; } return; }; // set TOC visible row count FIRSTCLASS.apps.Wiki.pageView.prototype.setTocBounds = function(height) { var yRow = 20, yTitle = 25, yScroll = 42; var available = height - yTitle; if ((available < (yRow * this._TOC.length)) && (this._TOC.length > 0)) { this._scrollToc = true; available -= yScroll; if (available > yRow) { this._nTocRows = Math.floor(available/yRow); this._tocSlop = available - (this._nTocRows * yRow); } else { this._nTocRows = 1; } } else { this._scrollToc = false; this._nTocRows = this._TOC.length; } this.drawContents(); }; FIRSTCLASS.apps.Wiki.pageView.prototype.showContents = function() { this._tocCell.setAttribute('width','15%'); this._bodyCell.setAttribute('width','85%'); YAHOO.util.Dom.removeClass(this._tocCell,'fcHidden'); YAHOO.util.Dom.removeClass(this._tocBtnEl, 'fcWikiOpenToc'); YAHOO.util.Dom.addClass(this._tocBtnEl, 'fcWikiCloseToc'); YAHOO.util.Dom.removeClass(this._tocSplitEl, 'fcWikiPageSplitClosed'); this._tocBtnEl.setAttribute('title',FIRSTCLASS.locale.community.wiki.tooltips.hidetoc); FIRSTCLASS.ui.Dom.reparentNode(this._tocTitle,this._tocCell); FIRSTCLASS.ui.Dom.reparentNode(this._tocEl,this._tocCell); this._tocOrigin = 0; this.setTocBounds(this._tocCell.offsetHeight); this._tocHidden = false; return; }; FIRSTCLASS.apps.Wiki.pageView.prototype.hideContents = function() { YAHOO.util.Dom.addClass(this._tocCell,'fcHidden'); YAHOO.util.Dom.removeClass(this._tocBtnEl, 'fcWikiCloseToc'); YAHOO.util.Dom.addClass(this._tocBtnEl, 'fcWikiOpenToc'); YAHOO.util.Dom.addClass(this._tocSplitEl, 'fcWikiPageSplitClosed'); this._tocBtnEl.setAttribute('title',FIRSTCLASS.locale.community.wiki.tooltips.showtoc); this._tocHidden = true; return; }; FIRSTCLASS.apps.Wiki.pageView.prototype.scrollToContentsItem = function(target) { if (target) { var id = target.id; var prefix = "fcWikiTOC"; id = id.slice(id.indexOf(prefix) + prefix.length); var scroller = false; var w = this._config.owner; if (w._view === "edit") { if (w._editor && w._editor._editor && w._editor._editor._editor && w._editor._editor._editor.document) { scroller = w._editor._editor._editor.document.getBody().$.parentNode; } } else if (w._view === "page") { scroller = this._bodyEl; } if (scroller) { FIRSTCLASS.ui.scrollChildrenIntoView(scroller, this._TOC[id].el, this._TOC[id].el, true); } } return; }; FIRSTCLASS.apps.Wiki.pageView.prototype.eventHandlers = { click: { // table of contents items wikitoc: function(that, fcevent) { that.scrollToContentsItem(fcevent.target); }, // body links fcwl: function(that, fcevent, evt) { return that._config.owner.openLinkedPage(evt); }, // show/hide toc wikitocbtn: function(that) { if (that._tocHidden) { that.showContents(); } else { that.hideContents(); } }, // scroll toc wikitocup: function(that) { that.setTocOrigin(that._tocOrigin - 1); }, wikitocdown: function(that) { that.setTocOrigin(that._tocOrigin + 1); } } }; FIRSTCLASS.apps.Wiki.pageView.prototype.handleEvent = function(evt, fcevent) { var rc = false; if (!rc) { var handlers = this.eventHandlers[evt.type]; if (handlers) { var handler = handlers[fcevent.fcid]; if (handler) { rc = handler(this, fcevent, evt); if (typeof rc === "undefined") { rc = true; } } } } return rc; }; FIRSTCLASS.apps.Wiki.pageView.prototype.setBottomBounds = function(pageBottom, paneBottom) { var yTop = YAHOO.util.Dom.getY(this._bodyCell); var pageHeight = pageBottom - yTop, paneHeight = paneBottom - yTop; YAHOO.util.Dom.setStyle(this._bodyEl, "overflow", "auto"); YAHOO.util.Dom.setStyle(this._bodyEl, "height", "auto"); if (!isNaN(pageHeight) && pageHeight >= 0) { YAHOO.util.Dom.setStyle(this._bodyEl, "height", pageHeight+"px"); } if (!isNaN(paneHeight) && paneHeight >= 0) { YAHOO.util.Dom.setStyle(this._bodyCell, "height", paneHeight+"px"); if (!this._tocHidden) { yTop = YAHOO.util.Dom.getY(this._tocCell); paneHeight = paneBottom - yTop; this.setTocBounds(paneHeight); } } }; // ---- History component ----- // // Config is: // domEl - containing DOM element for all the history stuff // owner - pointer back to owning Wiki // FIRSTCLASS.apps.Wiki.history = function(config) { var html = false; var that = this; this._domEl = config.domEl; this._wiki = config.owner; // frame this._header = document.createElement('div'); this._domEl.appendChild(this._header); this._body = document.createElement('div'); this._domEl.appendChild(this._body); // list components this._listTitleEl = document.createElement('div'); YAHOO.util.Dom.addClass(this._listTitleEl, 'fcWikiHistTitle'); this._listTitleEl.innerHTML = FIRSTCLASS.locale.community.wiki.history; this._listEl = document.createElement('div'); var listCfg = { domElement: this._listEl, dataSource: this._wiki._dataSource, dsRow: this._wiki._currentRow, scrolling: true, toolbar: [ { id: 'fcWikiHistShowVersion', label: FIRSTCLASS.locale.toolbars.wiki.view, fcid: 'histshowversion' }, { id: "fcWikiHistDiffPrev", label: FIRSTCLASS.locale.toolbars.wiki.changes, fcid: 'wikihistdiffprev', condition: function() { var allow = (that._list._selRow.typedef.objtype === FIRSTCLASS.objTypes.odocument); if (allow) { allow = (that._list._selRow.col8090 > 1) ? true : false; } return allow; } }, { id: "fcWikiHistDiffLatest", label: FIRSTCLASS.locale.toolbars.wiki.compare, fcid: 'wikihistdifflatest', condition: function() { var allow = (that._list._selRow.typedef.objtype === FIRSTCLASS.objTypes.odocument); if (allow) { allow = that._list._selRow.status.backversion ? true : false; } return allow; } }, { id: "fcWikiHistDelete", label: FIRSTCLASS.locale.toolbars.documents.deletevers, fcid: 'wikihistdel', condition: function() { var allow = (that._list._selRow.typedef.objtype === FIRSTCLASS.objTypes.odocument); if (allow) { allow = that._list._selRow.status.backversion ? true : false; } if (allow) { var delown = FIRSTCLASS.permissions.hasPriv(that._list._selRow.acl, FIRSTCLASS.permissions.ACL.DELETEOWN); var del = FIRSTCLASS.permissions.hasPriv(that._list._selRow.acl, FIRSTCLASS.permissions.ACL.DELETE); if (del) { return true; } else if (delown && FIRSTCLASS.session.user.cid === that._list._selRow.creatorcid) { return true; } } return false; } } ] }; this._list = new FIRSTCLASS.apps.history(listCfg); // page components this._pageViewEl = document.createElement("div"); YAHOO.util.Dom.addClass(this._pageViewEl,'fcWikiPageContainer'); this._pageView = new FIRSTCLASS.apps.Wiki.pageView({domEl:this._pageViewEl, dataSource: this._wiki._dataSource, owner: this}); this._pageDetails = document.createElement('div'); YAHOO.util.Dom.addClass(this._header, 'fcToolBar'); YAHOO.util.Dom.setStyle(this._header, 'padding','7px 0px 0px 3px'); // diff components this._diffContainer = document.createElement('div'); html = []; html.push(""); html.push(""); html.push(""); html.push(""); html.push("
"); this._diffContainer.innerHTML = html.join(""); this._leftHeaderCell = FIRSTCLASS.ui.Dom.getChildByClassName('fcWikiDiffHeaderLeft', this._diffContainer); this._leftHeaderCell.setAttribute('align', 'center'); this._rightHeaderCell = FIRSTCLASS.ui.Dom.getChildByClassName('fcWikiDiffHeaderRight', this._diffContainer); this._rightHeaderCell.setAttribute('align', 'center'); this._leftInfoCell = FIRSTCLASS.ui.Dom.getChildByClassName('fcWikiDiffInfoLeft', this._diffContainer); this._rightInfoCell = FIRSTCLASS.ui.Dom.getChildByClassName('fcWikiDiffInfoRight', this._diffContainer); this._diffCell = FIRSTCLASS.ui.Dom.getChildByClassName('fcWikiDiffCell', this._diffContainer); this._diffTitleEl = document.createElement('span'); YAHOO.util.Dom.addClass(this._diffTitleEl, 'fcCommentGuide'); this._diffFixedHeader = document.createElement('div'); YAHOO.util.Dom.addClass(this._diffFixedHeader, 'fcWikiDiffHeader fcWikiDiffFixedHeader'); this._diffTBEl = document.createElement("div"); YAHOO.util.Dom.addClass(this._diffTBEl, 'fcWikiDiffHeader'); var diffTBCfg = { domElement: this._diffTBEl, buttons: [ { id: "fcWikiDiffPrev", label: FIRSTCLASS.locale.toolbars.wiki.prev, fcid: 'wikidiffprevious' }, { id: "fcWikiDiffNext", label: FIRSTCLASS.locale.toolbars.wiki.next, fcid: 'wikidiffnext' } ] }; this._diffTB = new FIRSTCLASS.ui.toolBar(diffTBCfg); // back-to-list button this._listButton = document.createElement('span'); this._listButton.innerHTML =FIRSTCLASS.locale.toolbars.wiki.showhist; this._listButton.setAttribute('fcid','wikihistshowlist'); this._listButton.setAttribute('fcid','wikihistshowlist'); YAHOO.util.Dom.setStyle(this._listButton, 'font-size','0.9em'); YAHOO.util.Dom.addClass(this._listButton, 'fcToolBarButton fcToolBarLastButton'); // view mapper var viewMap = [ { element: this._pageViewEl, views: { page: this._body } }, { element: this._pageDetails, views: { page: this._header } }, { element: this._listEl, views: { list: this._body } }, { element: this._listTitleEl, views: { list: this._header } }, { element: this._diffTitleEl, views: { diffprev: this._header, difflatest: this._header } }, { element: this._diffTBEl, views: { diffprev: this._rightHeaderCell, difflatest: this._leftHeaderCell } }, { element: this._diffFixedHeader, views: { diffprev: this._leftHeaderCell, difflatest: this._rightHeaderCell } }, { element: this._diffContainer, views: { diffprev: this._body, difflatest: this._body } }, { element: this._listButton, views: { page: this._header, diffprev: this._header, difflatest: this._header } } ]; this._viewMapper = new FIRSTCLASS.ui.viewMapper(viewMap); this.setView('list'); }; FIRSTCLASS.apps.Wiki.history.prototype.setView = function(view) { this._viewMapper.selectView(view); }; FIRSTCLASS.apps.Wiki.history.prototype.showDifferences = function(baseRow, mode) { // figure out which versions to compare var row = false, vers; if (mode === 'prev') { this._diffMode = 'prev'; this._newDiffRow = baseRow; vers = baseRow.col8090 - 1; while (vers >= 1) { row = this._list.getRowByVersion(vers--); if (row) { break; } } if (!row) { return; } this._oldDiffRow = row; this._diffTitleEl.innerHTML = FIRSTCLASS.locale.diff.changes; this._diffFixedHeader.innerHTML = FIRSTCLASS.locale.diff.previous; } else if (mode === 'latest') { this._diffMode = 'latest'; this._newDiffRow = this._wiki._currentRow; this._oldDiffRow = baseRow; this._diffTitleEl.innerHTML = FIRSTCLASS.locale.diff.compare; this._diffFixedHeader.innerHTML = FIRSTCLASS.locale.diff.latest; } // set page infos this._wiki.setPageInfo(this._oldDiffRow, this._leftInfoCell); this._wiki.setPageInfo(this._newDiffRow, this._rightInfoCell); // fetch bodies, then generate the diff view var bodiesIn = 0; var that = this; var gotBody = function(recRowObj, version) { bodiesIn++; if (version === that._oldDiffRow.col8090) { that._oldDiffRow.body = recRowObj.body; } else { that._newDiffRow.body = recRowObj.body; } if (bodiesIn > 1) { that.displayDifferences(); } }; // fetch version bodies if (this.getBody(this._oldDiffRow, gotBody)) { // fetch previous version this.getBody(this._newDiffRow, gotBody); } }; // return full row JS object with body FIRSTCLASS.apps.Wiki.history.prototype.getBody = function(row, callback) { var that = this; var version = row.col8090; // handle the response var CB = { success: function(o) { try { var rowObj = FIRSTCLASS.util.net._parseJSONResponse(o.responseText); if (!rowObj) { throw FIRSTCLASS.locale.diff.parsefail; } callback(rowObj, version); } catch(x) { return; } } }; // get the row if (row) { var url = this._wiki._dataSource.getItemUrl(row); if (url.indexOf('?') < 0) { url += "?"; } else { url += "&"; } url += "Templates=JS&FormID=20501"; FIRSTCLASS.util.net.asyncRequest('GET', url, CB); return true; } return false; }; // after row bodies are received, generate the difference view FIRSTCLASS.apps.Wiki.history.prototype.displayDifferences = function() { var getTextContent = function(domEl) { var text = false; if (domEl.textContent) { text = domEl.textContent; } else if (domEl.innerText) { text = domEl.innerText; } return text; }; var splitIntoLines = function(domEl, result) { var isLink = false, isAnchor = false; if (domEl.tagName === 'A') { // links and anchors if (domEl.href) { // a link isLink = true; result.push('[Link:'); result.push('> url: ' + domEl.href); } else if (domEl.name) { isAnchor = true; result.push('[Anchor:'); result.push('> name: ' + domEl.name); } if (isAnchor || isLink) { if (domEl.target) { result.push('> target: ' + domEl.target); } if (domEl.title) { result.push('> title: ' + domEl.title); } if (isAnchor) { result.push('end anchor]'); } else { result.push('end link]'); } } } else if (domEl.tagName === 'IMG') { // images result.push('[Image:'); if (domEl.src) { result.push('> url: ' + domEl.src); } if (domEl.title) { result.push('> title: ' + domEl.title); } result.push('end image]'); } else if (domEl.tagName === 'DIV' && (domEl.className.indexOf('fcEmbed') >= 0)) { // embeds result.push('[Embed:'); if (domEl.title) { result.push('> title: ' + domEl.title); } result.push('end embed]'); } if (getTextContent(domEl)) { if (domEl.childNodes.length > 0) { var c; for (c = 0; c < domEl.childNodes.length; c++) { splitIntoLines(domEl.childNodes[c], result); } } else { var text = getTextContent(domEl).split('\r'), l; for (l in text) { if (text[l].length > 0) { result.push(text[l]); } } } } if (isLink) { result.push('end link]'); } else if (isAnchor) { result.push('end anchor]'); } }; // get the baseText and newText values from the two textboxes, and split them into lines var diffWorkEl = document.createElement('div'); diffWorkEl.innerHTML = this._oldDiffRow.body; var baselines = []; splitIntoLines(diffWorkEl, baselines); diffWorkEl.innerHTML = this._newDiffRow.body; var newlines = []; splitIntoLines(diffWorkEl, newlines); // create a SequenceMatcher instance that diffs the two sets of lines var sm = new difflib.SequenceMatcher(baselines, newlines); // get the opcodes from the SequenceMatcher instance var opcodes = sm.get_opcodes(); // build the diff view this._diffCell.innerHTML = ''; this._diffCell.appendChild( diffview.buildView( { baseTextLines:baselines, newTextLines:newlines, opcodes:opcodes, // set the display titles for each resource baseTextName:"", newTextName:"", contextSize: null, viewType: 0 }) ); // change the view this.setView('diff' + this._diffMode); }; FIRSTCLASS.apps.Wiki.history.prototype.showList = function() { this.setView('list'); }; FIRSTCLASS.apps.Wiki.history.prototype.showVersion = function(row) { var that = this; if (row.status.unread) { that._wiki._dataSource.toggleUnRead(row, false); } this._pageView.openPage(row, { success: function(o) { that._wiki.setPageInfo(row, that._pageDetails); that.setView('page'); }, failure: function(o) { alert(FIRSTCLASS.locale.diff.cantopen); } }); }; FIRSTCLASS.apps.Wiki.history.prototype.eventHandlers = { click: { // history button wikihistshowlist: function(that, fcevent) { that.showList(); }, // show/hide toc wikitocbtn: function(that) { if (that._pageView._tocHidden) { that._pageView.showContents(); } else { that._pageView.hideContents(); } }, // scroll toc wikitocup: function(that) { that._pageView.setTocOrigin(that._pageView._tocOrigin - 1); }, wikitocdown: function(that) { that._pageView.setTocOrigin(that._pageView._tocOrigin + 1); }, // show version histshowversion: function(that, fcevent) { var tg = that._list.rowFromEvent(fcevent); if (tg) { that.showVersion(tg.row); } }, // diffing commands wikihistdiffprev: function(that, fcevent) { var tg = that._list.rowFromEvent(fcevent); if (tg) { that.showDifferences(tg.row, 'prev'); } }, wikihistdifflatest: function(that, fcevent) { var tg = that._list.rowFromEvent(fcevent); if (tg) { that.showDifferences(tg.row, 'latest'); } }, wikidiffprevious: function(that, fcevent) { if (that._diffMode === 'prev') { that.showDifferences(that._oldDiffRow, 'prev'); } else { var prevRow = false, prevVers = that._oldDiffRow.col8090 - 1; while (prevVers >= 1) { prevRow = that._list.getRowByVersion(prevVers--); if (prevRow) { that.showDifferences(prevRow, 'latest'); break; } } } }, wikidiffnext: function(that, fcevent) { var nextRow = false, nextVers, maxVers; if (that._diffMode === 'prev') { nextVers = that._newDiffRow.col8090 + 1; maxVers = that._wiki._currentRow.col8090; } else { nextVers = that._oldDiffRow.col8090 + 1; maxVers = that._wiki._currentRow.col8090; } while (nextVers <= maxVers) { nextRow = that._list.getRowByVersion(nextVers++); if (nextRow) { that.showDifferences(nextRow, that._diffMode); break; } } } } }; FIRSTCLASS.apps.Wiki.history.prototype.handleEvent = function(evt, fcevent) { var rc = false; if (this._list) { rc = this._list.handleEvent(evt, fcevent); } if (!rc) { var handlers = this.eventHandlers[evt.type]; if (handlers) { var handler = handlers[fcevent.fcid]; if (handler) { rc = handler(this, fcevent, evt); if (typeof rc === "undefined") { rc = true; } } } } return rc; }; FIRSTCLASS.apps.Wiki.history.prototype.dispose = function() { YAHOO.util.Event.purgeElement(this._domEl, true); this._domEl.innerHTML = ""; };