User:Bawolff/sandbox/opinion.js

/* Note this is not really for wikinews, as it has already has a working comment js system. This is for me to practise Javascript, because I want to learn how to do javascript stuff better (learn by doing...)

/*extern wgPageName, wgArticlePath, wgNamespaceNumber, wgPageName, wgServer, addPortletLink wgScript wgScriptPath sajax_init_object*/ /*extern on_article_or_talk, on_comment_page, change_tab_link, change_tab_title, check_link, doesPageExist*/

var enableComments = (enableComments === undefined ? true : enableComments);

if (enableComments && (wgPageName !== "Main_Page")) { (function {

//Variables for diff lang and options, etc

var commentTabName = "Opinions2";

var page = wgPageName; //this is escaped

/* commentPrefix and suffix should be escaped (aka foo bar -> foo_bar */ var commentPrefix = "Comments:"; var commentSuffix = ""; //If none, make empty string. Do not use null

var ns = {}; ns[0] = ""; ns[1] = "Talk"; ns.main = ns[0]; ns.talk = ns[1]; ns.articleNumber = 0; ns.talkNumber = 1; ns.commentNumber = 102; ns.currentNumber = wgNamespaceNumber; var commentTabId = "ca-nstab-comments"; //probably shouldn't modify unless you really want to. if using custom ns for comments, MUST BE id used for tab var commentAccessKey = "o"; //Make sure it doesn't conflict with another accesskey var commentToolTip = "Express your personal opinion on the events described in this article"; var tabAfterComment = "ca-edit"; //id of next tab (or make null to be at end) var commentPortlet = "p-cactions"; //which part of nav bar (Rccomend p-cactions) var articleTabName = "Article"; var mainAccessKey = "c"; //Note: if you're using the talk:article/comments form, change this to something that does not conflict like "a" otherwise, should = MediaWiki:Accesskey-ca-nstab-main var mainToolTip = "View the article that this comment page is about"; //can be similiar to MediaWiki:Tooltip-ca-nstab-main var commentPreload = "Wikinews:Commentary_pages_on_news_events/body"; //default state of edit box for new page var commentIntro = "Wikinews:Commentary_pages_on_news_events/intro"; //Instructions

//Variables that don't need to be modified when changing langs tabAfterComment = document.getElementById(tabAfterComment); var commentPrefixRegex = new RegExp("^"+commentPrefix); //hopefully no special chars in the commentPrefix var commentSuffixRegex = new RegExp(commentSuffix + "$"); // a / seems to be okay. var articleTabId = "ca-nstab-main"; var pCactions = "p-cactions"; //cactions portlet

var wikiURL = function (page) { //If second argument, object for url arguments. if (arguments.length === 1) { return mw.config.get('wgServer') + mw.config.get('wgArticlePath').replace("$1", page); } else { var URL = mw.config.get('wgServer') + mw.config.get('wgScript') + "?title=" + page; var argList = arguments[1]; for (var i in argList) { URL += "&" + i + "=" + argList[i]; }  return URL; } }

//Determine page we are on //Article, Talk: or Comment: if (ns.currentNumber === ns.commentNumber) { if ((page.indexOf(commentPrefix) === 0) && (page.lastIndexOf(commentSuffix) === page.length - commentSuffix.length)) on_comment_page; } else if (ns.currentNumber === ns.talkNumber /*TALK*/) on_article_or_talk; else if (ns.currentNumber === ns.articleNumber) on_article_or_talk;

function on_article_or_talk { /*We're at an article and need to change its tabs*/ page = (ns.currentNumber === 1 ? page.replace(new RegExp("^"+ns.talk+"\:"), "") : page) //strip talk ns prefix if in talk ns. var newTab = mw.util.addPortletLink(commentPortlet, wikiURL(commentPrefix + page + commentSuffix), commentTabName, commentTabId, commentToolTip, commentAccessKey, tabAfterComment); var newCommentPageURL = {preload: commentPreload, editintro: commentIntro, action: "edit"}; check_link(commentPrefix + page + commentSuffix, newTab, wikiURL(commentPrefix + page + commentSuffix, newCommentPageURL));

}

function on_comment_page { var articleTabId2 = articleTabId; //needed later var articleTitle = page.replace(commentPrefixRegex, "").replace(commentSuffixRegex, "");//get rid of commentness of page title var talkURL = wikiURL("Talk:" + articleTitle); change_tab_link("ca-talk", talkURL ); if (document.getElementById(articleTabId)) {      //the comment page is somewhere in the main NS, Article -> Opinions change_tab_title(articleTabId, commentTabName); articleTabId2 = articleTabId + "-base";          //for later in function } //otherwise we assume that this has been taken care of server side and we do nothing

//add link back to article var newArticleTab = mw.util.addPortletLink(pCactions, wikiURL(articleTitle), articleTabName, articleTabId2, mainToolTip, mainAccessKey, document.getElementById(articleTabId2 === articleTabId ? commentTabId : articleTabId)); //Last bit of that function. If we're on comment ns, make article linkback before ca-nstab-comment, otherwise (in talk:article/comment) before ca-nstab-main.

//Check if article still exists (one would hope it did)

check_link(articleTitle, newArticleTab, wikiURL(articleTitle, {action: 'edit'}));

}

function change_tab_title (id, newTitle) { //This function should probably do some checking to make sure that the html is where it should be var tab = (typeof id === "string" ? id = document.getElementById(id) : id ); var label = id.firstChild.firstChild.data; label = newTitle;

} function change_tab_link (id, newLink) { var tab = (typeof id === "string" ? id = document.getElementById(id) : id );//get node tab.firstChild.setAttribute("href", newLink);

}

function check_link (page /* to check. (wikipage, not URL)*/, element/*to mark new or does not exist*/, URL /* url to change link to if not exist*/) {

/* Takes node of newly created tab (as node or as string of id), does bg check using ajax to see if it exists and applies appropriate css classes*/ var redden = function (exists) { if (!exists) { //Change link to an edit link, and put it to class new (make red) element = typeof element === "string" ? document.getElementById(element) : element; element.className = "new";

element.firstChild.href = URL; } } doesPageExist(page, redden); }

}); }

//The following is bassed on Matt's checkCommentaryPageExist(pageName) function function doesPageExist(pageName, callback) {

//Pagename can be a name as a string, or multiple pages seperated by a pipe. To check if it exists //Callback is a function. takes an object like {NameOfPageThatExists: true, NameOfNotAPage: false, ...}

var mwAPI = "/api.php"; var x;  x = sajax_init_object; // do nothing if we can't check if (!x) { return false; }  x.open("GET", wgServer + wgScriptPath + mwAPI + "?action=query&format=xml&titles=" + pageName, true); x.setRequestHeader("Pragma", "cache=yes"); x.setRequestHeader("Cache-Control", "no-transform"); x.onreadystatechange = function { if (x.readyState === 4) { if (x.status === 200) { var xmldoc = x.responseXML; var xpage = xmldoc.getElementsByTagName('page');

if (xpage[0].hasAttribute("missing")) callback(false); //does not exist else callback(true); }    }   };   x.send(null); }