// ==UserScript== // @name Whirlpool Plus Cross-browser // @namespace blurg! // @description Whirlpool Plus Cross-browser // @include http://forums.whirlpool.net.au/* // @match http://forums.whirlpool.net.au/* // @version 0.1 // ==/UserScript== //update //wlr //stop tracking and mark as read //quick quote // whircode 2 buttons //fix optinputs so they work with redirect //alert(typeof this.whirlcode2); var wlrLite = { u:document.URL, w:window, gottaPee:null, gearsdb:null, opdInputs:{}, create:{}, whirlcode2:function(F,U){var M=F;var Q=0;var G={};if(typeof U=="string"){G={whirlcode:(U.indexOf("w")>-1),headings:(U.indexOf("h")>-1),paragraph:(U.indexOf("p")>-1),entities:(U.indexOf("e")>-1),basichtml:(U.indexOf("b")>-1),autolink:(U.indexOf("a")>-1),wordfilter:(U.indexOf("f")>-1),linelimit:(U.indexOf("l")>-1)};}else{if(typeof U=="object"){G=U;}else{G={whirlcode:true,headings:true,paragraph:true,entities:true,basichtml:true,autolink:true,wordfilter:true,linelimit:true};}}M=M.replace(/\u00AB/g,"«").replace(/\u00BB/g,"»").replace(//g,"\u00BB");M=M.replace(/\r\n?/g,"\n");M=M.replace(/([^\n])\n([=#*]{1,3}\s|[+]{3}|[:$]\s|@[0-9]{1,12}\s|\+\+\{)/g,"$1\n\n$2");M=M.replace(/([^\n])\n(-----)/g,"$1\n\n$2");M=M.replace(/([^\n])\n([^\n])/g,"$1
$2");M=M.replace(/\n{2,}/g,"\n");if(G.whirlcode){M=M.replace(/\[\[(([A-Z0-9_ ]{1,75})\|(.+?)|(.+?))\]\]/ig,'$3$4');var L=[{code:"\\*",tag:"strong"},{code:"/",tag:"em"},{code:"\\\\",tag:"sub"},{code:"\\^",tag:"sup"},{code:"-",tag:"strike"},{code:"#",tag:"tt"},{code:"\\(",tag:"small",code2:"\\)"},{code:'"',tag:"span",plus:' class="wcrep1"'},{code:"'",tag:"span",plus:' class="wcrep2"'},{code:"`",tag:"span",plus:' class="wcgrey"'},{code:"~",tag:"span",plus:' class="wcserif"'},{code:"\\+",tag:"span",plus:' class="wcauth"'},{code:"_",tag:"span",plus:' class="wcspoil"'},{code:"\\?",tag:"a",plus:' href="http://www.google.com.au/search?q=$1"'}];for(Q=0;Q$1");}M=M.replace(/\[\.(.+?)\.\]/g,"[$1]");}if(G.basichtml){var D=[{tag:"a",inner:' href="(/|https?://|mailto:)[^"]+?"'},{tag:"strong|b"},{tag:"em|i"},{tag:"small"},{tag:"tt"},{tag:"sup"},{tag:"sub"},{tag:"strike"}];for(Q=0;Q$4");}}if(G.entities){M=M.replace(/&(\s)/ig,"&$1").replace(/ -- /ig," — ").replace(/ - /ig," – ").replace(/\(c\)/ig,"©").replace(/\(r\)/ig,"®").replace(/\(tm\)/ig,"™").replace(/(\s)1\/4([^0-9])/ig,"$1¼$2").replace(/(\s)1\/2([^0-9])/ig,"$1½$2").replace(/(\s)3\/4([^0-9])/ig,"$1¾$2");}if(G.wordfilter){M=M.replace(/fuck(ed|ing|er)/ig,"flapp$1").replace(/fuck/ig,"flap").replace(/cunt/ig,"legend");}if(G.autolink){M=" "+M;M=M.replace(/([^""\/])\b(https?:\/\/|ftp:\/\/|file:\/\/|www\.)([-A-Z0-9+&@#\/%?=~_|!:,.;()]*[-A-Z0-9+&@#\/%=~_|])/ig,'$1$2$3');M=M.replace(/href="www\./ig,'href="http://www.');M=M.replace(/([^"":])\b(?:mailto:)?([A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4})\b/ig,'$1$2');}var B=M.split("\n");var J=[];var I="";for(Q=0;Q)+$/,"");J[Q]="";if(G.headings&&I.search(/^===\s+/)!=-1){J[Q]="2";I=I.replace(/^===\s+/,"");}if(G.headings&&I.search(/^==\s+/)!=-1){J[Q]="3";I=I.replace(/^==\s+/,"");}if(G.headings&&I.search(/^=\s+/)!=-1){J[Q]="4";I=I.replace(/^=\s+/,"");}if(G.paragraph&&I.search(/^:\s+/)!=-1){J[Q]=":";I=I.replace(/^:\s+/,"");}if(G.paragraph&&I.search(/^\$\s+/)!=-1){J[Q]="$";I=I.replace(/^\$\s+/,"");}if(G.paragraph&&I.search(/^-----$/)!=-1){J[Q]="-";}if(G.paragraph&&I.search(/^\+\+\{.+\}$/)!=-1){J[Q]="+";I=I.replace(/^\+\+\{(.+)\}$/,"$1");}if(G.paragraph&&I.search(/^@[0-9]{1,12}\s+/)!=-1){J[Q]="@";I=I.replace(/^@([0-9]{1,12})\s+/,"$1 ").replace(/
/,"

\n

");}if(G.paragraph&&I.search(/^[*#]{1,3}\s+/)!=-1){J[Q]=I.match(/^([*#]{1,3})\s+/)[1];I=I.replace(/^[*#]{1,3}\s+/,"");}if(J[Q].length==0&&I.length>0){J[Q]="p";}switch(J[Q].charAt(0)){case"2":I="

"+I+"

";break;case"3":I="

"+I+"

";break;case"4":I="

"+I+"

";break;case"@":I='

'+I+"

";break;case"#":case"*":I="
  • "+I+"
  • ";break;case"p":case":":I="

    "+I+"

    ";break;case"$":break;case"-":I="
    ";break;case"+":I='

    (include: '+I+")

    ";break;default:I="deletethisline";}B[Q]=I;}var P=0;var N="";for(Q=0;Q\n"+B[Q];}if(Q==B.length-1||J[Q]!=J[Q+1]){B[Q]+="\n";}}else{if(J[Q]=="$"){if(Q==0||J[Q]!=J[Q-1]){B[Q]="
    "+B[Q];}if(Q==B.length-1||J[Q]!=J[Q+1]){B[Q]+="
    ";}}else{if(J[Q].match(/(\*|#)+/)){for(P=2;P>=0;P--){N=J[Q].charAt(P);if(N.length&&(Q==0||N!=J[Q-1].charAt(P))){B[Q]=(N=="*"?"
      \n":"
        \n")+B[Q];}if(N.length&&(Q==B.length-1||N!=J[Q+1].charAt(P))){B[Q]+=(N=="*"?"\n
    ":"\n");}}}}}}M=B.join("\n");M=M.replace(/deletethisline\n?/g,"");M=M.replace(/()http:\/\/forums\.whirlpool\.net\.au(\/.+?<\/a>)/g,"$1$2").replace(/ ?([0-9]{1,12})([^<]+?)<\/span>/ig,'$2').replace(/

    ([0-9]{1,12}) (.+?)<\/p>/ig,'

    $2

    ');M=M.replace(/[\u2580\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588\u2589\u258A\u258B\u258C\u258D\u258E\u258F\u2590\u2591\u2592\u2593\u2594\u2595\u2596\u2597\u2598\u2599\u259A\u259B\u259C\u259D\u259E\u259F]/g,"?");if(G.linelimit){var V=M;var O=[];var S=30;var C=/^((<[^>]+>|[^<\s]){0,30}\s+)+/;var H=/^<\/?[p|h1|h2|h3|ul|ol|li|hr|br]>/;var R=/^&\w+?;/;var T=0;var A=0;while(V.length){if(V.length")>-1){A=V.indexOf(">");if(V.match(H)){T=0;}}else{if(V.match(R)){A=(V.indexOf(";")>-1)?1+V.indexOf(";"):V.length;T++;}else{A=1;T++;}}}O.push(V.substring(0,A));V=V.substring(A);if(T>=S){O.push("");T=2;}}M=O.join("");}M=M.replace(/\u00AB/g,"<").replace(/\u00BB/g,">");return M;}, browser:null, checkbrowser:function(){ if(typeof GM_getValue != 'undefined') { //FF GM wlrLite.browser='FF'; } else if(typeof PRO_getValue != 'undefined') { //IE7Pro API console.log('PRO'); wlrLite.browser='IE7+'; } else if(localStorage){ //Safari(webkit) (Chrome doesn't support localStorage) wlrLite.browser='Safari'; } else if(window.google){ //Chrome wlrLite.gearsdb = google.gears.factory.create('beta.database'); //instantiate gears database wlrLite.gearsdb.open('database-wlrdb'); wlrLite.gearsdb.execute('create table if not exists WLRDB (GMSetKey text, GMSetVal text)'); //wlrLite.gearsdb.close(); wlrLite.browser='Chrome'; } else if(window.opera){ var s=document.createElement('script'); s.setAttribute('type','text/javascript'); s.setAttribute('src','http://www.json.org/json2.js'); document.querySelector('body').appendChild(s); wlrLite.browser='Opera'; } }, domTools:{ nextEl:function(node) { //only FF supports next/previousElementSibling etc. so need to check against text nodes http://ejohn.org/blog/element-traversal-api/ http://code.google.com/p/doctype/wiki/ArticleNodeEssentials while (node && node.nodeType != 1) { node = node.nextSibling; } return node; }, prevEl:function(node) { while (node && node.nodeType != 1) { node = node.previousSibling; } return node; } }, event:{ //cross-browser events http://ejohn.org/blog/flexible-javascript-events/ add:function( obj, type, fn ) { if ( obj.attachEvent ) { obj['e'+type+fn] = fn; obj[type+fn] = function(){obj['e'+type+fn]( window.event );} obj.attachEvent( 'on'+type, obj[type+fn] ); } else obj.addEventListener( type, fn, false ); }, remove:function( obj, type, fn ) { if ( obj.detachEvent ) { obj.detachEvent( 'on'+type, obj[type+fn] ); obj[type+fn] = null; } else obj.removeEventListener( type, fn, false ); } }, storage:{ store:function(str){ if(typeof str =='string'){ if(wlrLite.browser=="FF") { GM_setValue('WLRDB', str); } else if(wlrLite.browser=="IE7+") { console.log('str; '+str); PRO_setValue('WLRDB', str); } else if(wlrLite.browser=="Safari"){ localStorage.setItem('WLRDB', str); } else if(wlrLite.browser=="Chrome"){ //google gears SQL //sqlite doesn't support ON DUPLICATE KEY UPDATE :( var rs = wlrLite.gearsdb.execute('select GMSetKey from WLRDB'); if(rs.isValidRow()){ wlrLite.gearsdb.execute("UPDATE WLRDB SET GMSetKey='WLR', GMSetVal='"+str+"'"); } else{ wlrLite.gearsdb.execute("insert into WLRDB values (?, ?)", ['WLR', str]); //.execute("insert into WLRDB values GMSetKey='WLR' GMSetVal='"+str+"'") } //wlrLite.gearsdb.execute("insert into WLRDB values GMSetKey='WLR' GMSetVal='"+str+"' ON DUPLICATE KEY UPDATE GMSetKey='WLR' GMSetVal='"+str+"'"); //explain why doing this way (i.e. only one key) //wlrLite.gearsdb.execute("INSERT ON CONFLICT REPLACE INTO WLRDB VALUES (?, ?)", ['WLR', str]); //see if can make sqlite statement more efficient http://www.sqlite.org/lang_conflict.html } else if(wlrLite.browser=="Opera"){ //Opera return; //flash } } }, set:function(k, v){ var getDB = wlrLite.storage.get(); if(getDB){ //if has already been created, add a new key/value pair to it getDB[k]=v; } else{ //if hasn't been created, create a new assoc array with the new key/value pair getDB={}; getDB[k]=v; } var stoS = JSON.stringify(getDB); // '{k:v}' wlrLite.storage.store(stoS); }, get:function(){ var db; if(wlrLite.browser=="FF") { db=JSON.parse(GM_getValue('WLRDB')); } else if(wlrLite.browser=="IE7+") { db=JSON.parse(PRO_getValue('WLRDB')); } else if(wlrLite.browser=="Safari"){ db=JSON.parse(localStorage.getItem('WLRDB')); } else if(wlrLite.browser=="Chrome"){ db=JSON.parse(wlrLite.gearsdb.execute("select GMSetVal from WLRDB WHERE GMSetKey='WLR' LIMIT 1").field(0)); } else if(wlrLite.browser=="Opera"){ //Opera return; //flash } return db; //return db even if it's undefined - returning the whole associative array/JSON or whatever its called - evals'ok cause we can trust the data }, del:function(k){ //we don't actually delete the parent storage key ('WLRDB') var delret, getStorageKey = wlrLite.storage.get(); if(getStorageKey[k]){ delete(getStorageKey[k]); var toS = JSON.stringify(getStorageKey); wlrLite.storage.store(toS); delret= 'delete successful'; } else{ delret= 'key not in storage!'; } return delret; } }, tracker:function(){ return; }, qquote:function(where){ function toPostPage(){ if(wlrLite.threadStatus && wlrLite.create.tar.value.length>0){ var optObj ={ modewc:{name:'modewc',c:wlrLite.create.modewc.checked}, modeht:{name:'modeht',c:wlrLite.create.modeht.checked}, modest:{name:'modest',c:wlrLite.create.modest.checked}, modewl:{name:'modewl',c:wlrLite.create.modewl.checked} } wlrLite.storage.set('optObj', JSON.stringify(optObj)); wlrLite.storage.set('wlrLitecreatetarvalue', escape(wlrLite.create.tar.value)); } } wlrLite.threadStatus=document.querySelectorAll('.foot_reply')[0].getElementsByTagName('a')[0]; var greyA =document.querySelectorAll('.greylink'); for(var a in greyA){ if(typeof greyA[a]=='objext' && greyA[a].getAttribute('title')=='a link to this specific post'){ var tParent = greyA[a].parentNode; var spanBar = document.createElement('span'); spanBar.className='bar'; spanBar.textContent=' | '; var noJQqqLink = document.createElement('a'); noJQqqLink.setAttribute('class','qqlink greylink'); noJQqqLink.textContent='q-quote'; noJQqqLink.href='#'; tParent.insertBefore( spanBar, greyA[a] ); tParent.insertBefore( noJQqqLink, spanBar ); wlrLite.event.add(noJQqqLink, "click", function(e){ e.preventDefault(); var nE = wlrLite.domTools.prevEl(this.parentNode.parentNode); var buser = wlrLite.domTools.prevEl(nE); var nE1 = wlrLite.domTools.prevEl(this); var nE2 = wlrLite.domTools.prevEl(nE1); var qqpreS = nE2.getAttribute('href').split('&r=')[1].split('&')[0]; var qquNam = buser.querySelector('.bu_name'); var tc = qquNam.textContent; var qqtSel = window.getSelection().toString().replace(/^(.+)$/mg, '["$1"]'); if(wlrLite.create.tar.value.length > 0){ wlrLite.create.tar.value+='\r@'+qqpreS+' '+tc+' writes... \n'+qqtSel+'\n\n'; } else{ wlrLite.create.tar.value='@'+qqpreS+' '+tc+' writes... \n'+qqtSel+'\n\n'; } wlrLite.create.tar.focus(); return false; }, false); } } var buttons ={ Bold:{title:'Bold WhirlCode',accesskey:'b',id:'wc_whirlBold',text:'Bold'}, Italic:{title:'Italic WhirlCode',accesskey:'i',id:'wc_whirlItalic',text:'Italic'}, SingleQuote:{title:'SingleQuote WhirlCode',accesskey:'t',id:'wc_whirlSingleQuote',text:'\'quote\''}, DoubleQuote:{title:'DoubleQuote WhirlCode',accesskey:'q',id:'wc_whirlDoubleQuote',text:'"quote"'}, quote:{title:'Quote WhirlCode',accesskey:'h',id:'wc_whirlQuote',text:'who'}, Superscript:{title:'Superscript WhirlCode',accesskey:'p',id:'wc_whirlSuperscript',text:'Super'}, Subscript:{title:'Subscript WhirlCode',accesskey:'\\',id:'wc_whirlSubscript',text:'Sub'}, Strike:{title:'Strike WhirlCode',accesskey:'k',id:'wc_whirlStrike',text:'Strike'}, Courier:{title:'Courier WhirlCode',accesskey:'c',id:'wc_whirlCourier',text:'Courier'}, Small:{title:'Small WhirlCode',accesskey:'m',id:'wc_whirlSmall',text:'Small'}, Grey:{title:'Grey WhirlCode',accesskey:'r',id:'wc_whirlGrey',text:'Grey'}, Serif:{title:'Serif WhirlCode',accesskey:'s',id:'wc_whirlSerif',text:'Serif'}, Google:{title:'Google WhirlCode',accesskey:'g',id:'wc_whirlGoogle',text:'Google'}, Escape:{title:'Escape WhirlCode',accesskey:'e',id:'wc_whirlEscape',text:'Esc'}, Wiki:{title:'Wiki WhirlCode',accesskey:'w',id:'wc_whirlWiki',text:'Wiki'}, Spoiler:{title:'Spoiler WhirlCode',accesskey:'o',id:'wc_whirlSpoil',text:'Spoiler'}, URLLink:{title:'URL Link',accesskey:'u',id:'wc_whirlurl',text:'URL'}, Link:{title:'Link',accesskey:'l',id:'wc_whirllink',text:'Link'} }; var code={ wc_whirlBold : { encloseLeft : "[*", encloseRight : "*]"}, wc_whirlItalic : { encloseLeft : "[/", encloseRight : "/]"}, wc_whirlSingleQuote : { encloseLeft : "['", encloseRight : "']"}, wc_whirlDoubleQuote : { encloseLeft : "[\"", encloseRight : "\"]"}, wc_whirlQuote : { encloseLeft : "[+", encloseRight : "+]"}, wc_whirlSuperscript : { encloseLeft : "[^", encloseRight : "^]"}, wc_whirlSubscript : { encloseLeft : "[\\", encloseRight : "\\]"}, wc_whirlStrike : { encloseLeft : "[-", encloseRight : "-]"}, wc_whirlCourier : { encloseLeft : "[#", encloseRight : "#]"}, wc_whirlSmall : { encloseLeft : "[(", encloseRight : ")]"}, wc_whirlGrey : { encloseLeft : "[`", encloseRight : "`]"}, wc_whirlSerif : { encloseLeft : "[~", encloseRight : "~]"}, wc_whirlGoogle : { encloseLeft : "[?", encloseRight : "?]"}, wc_whirlEscape : { encloseLeft : "[.", encloseRight : ".]"}, wc_whirlWiki : { encloseLeft : "[[", encloseRight : "]]"}, wc_whirlSpoil : { encloseLeft : "[_", encloseRight : "_]"} }; function preview(){ var previewTimer; var previewWait = false; if (!previewWait) { previewWait = true; previewTimer = setTimeout(function(){ var settingStr = "pflh"; if(wlrLite.create.modewc.checked){ settingStr+='w'; } if(wlrLite.create.modest.checked){ settingStr+='e'; } if(wlrLite.create.modeht.checked){ settingStr+='b'; } if(wlrLite.create.modewl.checked){ settingStr+='a'; } wlrLite.create.td2.innerHTML=wlrLite.whirlcode2(wlrLite.create.tar.value, settingStr); //wlrLite.create.td2.innerHTML=(typeof whirlcode2 !="undefined")?whirlcode2(wlrLite.create.tar.value, settingStr):unsafeWindow.whirlcode2(wlrLite.create.tar.value, settingStr); //wlrLite.create.td2.innerHTML=window.whirlcode2(wlrLite.create.tar.value, settingStr); previewWait = false; }, 600); } } function processText(evt){ /**** http://stackoverflow.com/questions/275761/how-to-get-selected-text-from-textbox-control-with-javascript ****/ var qqbuttonID = evt.target.getAttribute('id'); wlrLite.create.tar.focus(); var textComponent = wlrLite.create.tar; var selectedText; if (document.selection != undefined){ // IE version var sel = document.selection.createRange(); selectedText = sel.text; } else if (textComponent.selectionStart != undefined){ // Mozilla version var startPos = textComponent.selectionStart; var endPos = textComponent.selectionEnd; selectedText = textComponent.value.substring(startPos, endPos); } function insertAtCursor(n, left, right){ var storeVal = textComponent.value; var startText = storeVal.slice(0,startPos); var replaceText = left+selectedText.replace(/^(.+)$/mg, "$1")+right; var endText = storeVal.slice(endPos,storeVal.length); textComponent.value=startText+replaceText+endText; textComponent.focus(); textComponent.setSelectionRange(endPos+n,endPos+n); } if(qqbuttonID == "wc_whirlurl"){ var uPrompt = window.prompt("Enter URL:", "http://"); if ((uPrompt !== "http://") && (uPrompt !== "") & (uPrompt !== null)) { var uNum = 16+selectedText.legnth+uPrompt.legnth; var l = ''; insertAtCursor(uNum, l, ''); } } else if(qqbuttonID == "wc_whirllink"){ var uPrompt = window.prompt("Enter Text:", ""); if ((uPrompt !== "") & (uPrompt !== null)) { if(selectedText.indexOf('http://')<0){ selectedText = 'http://'+selectedText; } var r='">'+uPrompt+''; insertAtCursor(selectedText.length+15+uPrompt.length, '