So, I'm running a Debian knockoff. Did a distro upgrade, primarily because Liquorix kernel is barfing all over Jessie. The distro upgrade went alright, and some irritating quirks in the system were cured. I wasn't expecting that - how long has it been since a system ran noticeably better after an upgrade? Stuff is mostly incremental, and unnoticeable these days.
After booting to the new system, I attempt to install Liquorix again, and it barfs again. I do get a message this time, leaving me hopeful - I need a couple specific packages to satisfy Liquorix kernel. So, apt-get update, then apt-get upgrade. Those packages and a half dozen related are installed. But, apt-get barfs now. /var/apt/ is now locked. So, the only thing to do is dpkg --reconfigure -a
Not possible. My file system is read only now.
I didn't document stuff, so I can't reconstruct all the steps I took, but EVERYTHING failed. I read at least a dozen different pages, trying to figure out how to fix my fs. fsck was being entirely uncooperative, no matter which DVD/USB I booted to. So, screw it - I guess I'll have to install something. Look around the net a bit, think, look at the ISO's I already have downloaded, and decide on Manjaro. Write it to a USB, try again to recover my files system, and fail. I change my mind about installing Manjaro. I decide on Siduction - write that to USB, boot up, and again, decide to try recovering my file system (one more time) before proceeding with installation.
And, the file system is fixed. There were no errors or anything on the part of fsck. It found errors on my root file system, and fixed them. Simple as that.
Obviously, the system was recoverable. It's recovered. It can't get any more obvious than that, can it? So, why did all those rescue disk images, and various distribution ISO's all fail? For a few moments, I wanted to point at systemd as the culprit, but Siduction runs on systemd. So, what is different between Siduction, and everything else I was working with?
I might imagine that Siduction is the distro most similar to the installed system - but that gets me nowhere. None of the administration tools are "different" from one distro to another. I might imagine that one (or more) of my DVD's or USB's was improperly burnt. But, ALL OF THEM???
I might also presume that my SSD is getting ready to barf. Possibly, there is some kind of error going on in the "hard drive" that affected me a dozen times, but didn't trigger on (roughly) the 13th attempt to fix the system?
Or, maybe we're just experiencing an especially heavy cosmic ray storm? Phhhttt - I give up. I've got my system back. Unless it barfs on me again, I'll blame those cosmic rays, or gremlins. If it does barf, I'll stick a new SSD in, install Siduction, and hope it's not some other bit of hardware that caused the problem.
And, maybe I'll just give up on the Liquorix kernal. That's where all of this nonsense started.
Theoretical Physicists Are Getting Closer to Explaining How NASA’s ‘Impossible’ EmDrive Works
Theoretical scientists are trying to understand why and how EmDrive propulsion works. The NASA paper suggests a tentative explanation based on a quantum physics theory, "a nonlocal hidden-variable theory, or pilot-wave theory for short."
A new research paper by a Portuguese scientist, titled "A Possible Explanation for the Em Drive Based on a Pilot Wave Theory" is now trending among EmDrive enthusiasts in the NasaSpaceFlight forum. The paywalled paper proposes a similar model to the NASA one (here's an open access preprint you can read.)
Pilot-wave theories have been proposed since the 1920s by quantum physicists, notably Louis de Broglie and David Bohm, to make sense of the weird behavior of quantum matter. Recently, pilot-wave quantum theories have gained more popularity after it was discovered that pilot-wave quantum-like behavior can be reproduced in classical fluids and explained by classical (non-quantum) fluid dynamics.
Not enough meat on these bones for another story, but you might be interested.
Previously: Explanation may be on the way for the "Impossible" EmDrive
Finnish Physicist Says EmDrive Device Does Have an Exhaust
EmDrive Peer-Reviewed Paper Coming in December; Theseus Planning a Cannae Thruster Cubesat
It's Official: NASA's Peer-Reviewed EmDrive Paper Has Finally Been Published
Space Race 2.0: China May Already be Testing an EmDrive in Orbit
Physicist Uses "Quantised Inertia" to Explain Both EmDrive and Galaxy Rotation
EmDrive 3.0: Wait, Where's EmDrive 2.0?
A while back I discovered that they’re selling photographic film again, so I bought a package of three rolls of 35mm Kodak color film. Not sure what I’ll photograph, but the Minolta 35 mm SLR takes a hell of a lot better pictures than my phone. Actually, than any phone—and any digital camera.
I got home, set the film aside (it’s a lot more expensive than the last time I used film) and looked for my camera, which hadn’t been used for a couple of decades.
I couldn’t find it. I was sure I’d put it in the middle drawer of my dresser, but no matter how much I rummaged I couldn’t find it. And damn it, I’d paid eighteen dollars for the film and didn’t keep the receipt. That was a few days ago.
So yesterday I decided to look again, maybe it was in a different drawer? I looked through all of them, and finally rummaged through the one I’d looked in earlier. And I found a small case with a zipper, and there was a camera inside.
An old sixteen millimeter, the kind you used flash cubes with. Looking more, I found another camera. It was a cheapo as well. And then at the back of the bottom of the drawer, there it was. My old camera, the SLR (I have another 35mm but it’s not nearly as good).
Checking it out I wondered if I could remember how to use it. On the bottom was a screwed in battery cover. I opened it and stuck the battery in my pocket, since after half a century that battery’s certainly more than dead.
So I want back to Walgreen’s for a new battery.
They don’t make them any more. It’s a mercury battery, and they no longer sell anything with mercury in it. And it’s a strange 1.6 volts, the new ones are 1.3 or 1.5, which is going to make my light meter inaccurate. I’ll have to experiment to find out how to adjust it... that is, if I can get it to work at all. It’s thinner than the old battery, and I don’t think the polarity is marked. And it’s thinner, so I’ll probably have to use aluminum foil as a spacer to make it connect. That means I’ll have a burrito from La Bamba for lunch tomorrow, because they wrap them in foil. I’m not buying a whole roll for a square inch of foil!
***
Two days later as I was eating my burrito I remembered that film changed sometime in the 1980s, with the film speeds changing from ASA to ISO, so I put off opening the battery until I could do a little research. I found that the camera’s built-in light meter wouldn’t work; conversion was more complex than converting Fahrenheit to Celcius. So now I’m going to have to schlep all the way over to the west side of town, or all the way up to the north side.
And then I thought of the other camera—the one we call a “phone”. It could probably be used as a light meter, so it looks like I have a little more research.
So I downloaded two or three photographic light meters, all of which were completely incomprehensible and none of which came with instructions.
So it looks like my only recourse is to go to the camera store and buy a light meter. I googled, and everything was either on the far north side of town or the far west side. One listed was Best Buy, and since I’d decided to hook my TV to the network I needed a cable and went there.
They had the short cable I needed, and lots of camera supplies, but no light meters. It’s probably because cameras had built-in light meters for the last half century, but film changed from ASA to ISO three decades ago or so, so it would no longer work even if they still made batteries for it.
So I asked the guy for directions to the camera shop, got in the car and looked at Google Maps, and couldn’t find the damned place! When I got home I looked it up again, have a better idea of where it is, and will have to go back out there, but I’m calling first.
I should have called. I found it on the map, drove out there, and found the hard to find camera store.
Their cheapest light meter was over $250! That’s way, way too much. The store guy explained that it was because so few people are shooting film now, and new cameras have built-in light meters so they only made really fancy ones. It made sense, but of course I was disappointed. Not sure what to do now, I’m not paying that much for a light meter! I only paid fifteen bucks for one when I was a teenager.
Then, on my way out, I saw something that cheered me greatly—a small blackboard with a notice that they could digitize VCR tape! It’s worth twenty five bucks to me to get that tape of my kids when they were kids digitized.
But I still don’t know what to do about that light meter. Guess I’ll have to check Google Play again and try all the light meter apps. I’m not very hopeful...
Any ideas?
Trump’s Legacy: Damaged Brains
The pesticide, which belongs to a class of chemicals developed as a nerve gas made by Nazi Germany, is now found in food, air and drinking water. Human and animal studies show that it damages the brain and reduces I.Q.s while causing tremors among children. It has also been linked [open, DOI: 10.1093/jnci/djh324] [DX] to lung cancer and Parkinson's disease [DOI: 10.1136/oemed-2013-101394] [DX] in adults.
[...] This chemical, chlorpyrifos, is hard to pronounce, so let's just call it Dow Chemical Company's Nerve Gas Pesticide. Even if you haven't heard of it, it may be inside you: One 2012 study found that it was in the umbilical cord blood of 87 percent of newborn babies tested. And now the Trump administration is embracing it, overturning a planned ban that had been in the works for many years.
The Environmental Protection Agency actually banned Dow's Nerve Gas Pesticide for most indoor residential use 17 years ago — so it's no longer found in the Raid you spray at cockroaches (it's very effective, which is why it's so widely used; then again, don't suggest this to Dow, but sarin nerve gas might be even more effective!). The E.P.A. was preparing to ban it for agricultural and outdoor use this spring, but then the Trump administration rejected the ban. That was a triumph for Dow, but the decision stirred outrage among public health experts. They noted that Dow had donated $1 million for President Trump's inauguration.
So Dow's Nerve Gas Pesticide will still be used on golf courses, road medians and crops that end up on our plate. Kids are told to eat fruits and vegetables, but E.P.A. scientists found levels of this pesticide on such foods at up to 140 times the limits deemed safe. "This was a chemical developed to attack the nervous system," notes Virginia Rauh, a Columbia professor who has conducted groundbreaking research on it. "It should not be a surprise that it's not good for people."
[...] Democrats sometimes gloat that Trump hasn't managed to pass significant legislation so far, which is true. But he has been tragically effective at dismantling environmental and health regulations — so that Trump's most enduring legacy may be cancer, infertility and diminished I.Q.s for decades to come.
Asked in April whether Pruitt had met with Dow Chemical Company executives or lobbyists before his decision, a EPA spokesman replied: "We have had no meetings with Dow on this topic." In June, after several Freedom of Information Act requests, the EPA released a copy of Pruitt's March meeting schedule which showed that a meeting had been scheduled between Pruitt and Dow CEO Andrew Liveris at a hotel in Houston, Texas, on March 9.[91] Both men were featured speakers at an energy conference. An EPA spokesperson reported that the meeting was brief and the pesticide was not discussed.[92]
In August, it was revealed that in fact Pruitt and other EPA officials had met with industry representatives on dozens of occasions in the weeks immediately prior to the March decision, promising them that it was "a new day" and assuring them that their wish to continue using chlorpyrifos had been heard. Ryan Jackson, Pruitt's chief of staff, said in a March 8 email that he had "scared" career staff into going along with the political decision to deny the ban, adding "[T]hey know where this is headed and they are documenting it well."[93]
I don't have the cash for an FPGA so I'll give it a try on my iMac and my Xeon box.
I don't know much about the GPU on the iMac but the Xeon box has some manner of high-end card. It takes up two PCI slots so it can have its own fan.
I discussed this at Kuro5hin a while back, but those who knew something about cryptocurrency told me that the electricity would cost more than the bitcoins it produced.
Bit now BitCoin is at $7000. Surely I won't use more electricity than that.
If it works out at least a little bit, when I get paid I'll buy a mining rig.
I at first planned to use 1/3rd of my paycheck to buy equal amounts of bitcoin, lite coin and etherium. But I think it's quite likely that today's irrational exuberance isn't like to last as long as I would like. Yeah I could make some money but likely there are other ways I could make more. Like mining.
Soylent often reports that mining rigs are always in short supply. But I'm not greedy, I expect I would do just fine with last year's model.
Papa John's Blames the NFL for Hurting Pizza Sales 🍕📉🔥
Papa John’s International Inc. founder John Schnatter is going after NFL Commissioner Roger Goodell, saying weak handling of the league’s national-anthem controversy has hammered sales of his pizza.
“The NFL has hurt us by not resolving the current debacle to the players’ and owners’ satisfaction,” Schnatter, who serves as the pizza chain’s chairman and chief executive officer, said on a conference call. “NFL leadership has hurt Papa John’s shareholders.”
The remarks follow a controversy over NFL football players protesting during the national anthem, a movement that started last season. The demonstrations have sparked calls for a boycott and raised concerns among league sponsors. But Schnatter’s comments mark the highest-profile example of an NFL partner publicly blaming the outcry for hurting business.
NOW WITH MORE BLOAT!
// ==UserScript==
// @name Soylent Upgrade
// @version 14.0
// @grant none
// @match http://soylentnews.org/*article.pl*
// @match http://*.soylentnews.org/*article.pl*
// @match https://soylentnews.org/*article.pl*
// @match https://*.soylentnews.org/*article.pl*// @match http://soylentnews.org/*submit.pl*
// @match http://*.soylentnews.org/*submit.pl*
// @match https://soylentnews.org/*submit.pl*
// @match https://*.soylentnews.org/*submit.pl*// @match http://soylentnews.org/*admin.pl*
// @match http://*.soylentnews.org/*admin.pl*
// @match https://soylentnews.org/*admin.pl*
// @match https://*.soylentnews.org/*admin.pl*// @match http://soylentnews.org/*comments.pl*
// @match http://*.soylentnews.org/*comments.pl*
// @match https://soylentnews.org/*comments.pl*
// @match https://*.soylentnews.org/*comments.pl*// @include /^https?://(.*\.)?soylentnews\.org/.*?journal\.pl.*?/
// @match http://soylentnews.org/*journal.pl*
// @match http://*.soylentnews.org/*journal.pl*
// @match https://soylentnews.org/*journal.pl*
// @match https://*.soylentnews.org/*journal.pl*// @include /^https?://(.*\.)?soylentnews\.org/.*?pollBooth\.pl\?qid=.*/
// ==/UserScript==// Begin User Options:
var simplifyChars = true; // Change to false if you don't want stylized quotation marks, ellipses, etc. to be replaced
var stripEmail = false; // Remove auto-filled email from submission
var doiChecker = true; // Add Crossref search to DOIs in the summary
var disableCycler = false; // Change to true to disable the button that cycles through *New* comments// End User Options
/* ! http://mths.be/fromcodepoint v0.1.0 by @mathias */
if (!String.fromCodePoint) { (function() { var defineProperty = (function() { try { var object = {}; var $defineProperty = Object.defineProperty; var result = $defineProperty(object, object, object) && $defineProperty; } catch(error) {} return result; }()); var stringFromCharCode = String.fromCharCode; var floor = Math.floor; var fromCodePoint = function() { var MAX_SIZE = 0x4000; var codeUnits = []; var highSurrogate; var lowSurrogate; var index = -1; var length = arguments.length; if (!length) { return ''; } var result = ''; while (++index < length) { var codePoint = Number(arguments[index]); if ( !isFinite(codePoint) || codePoint < 0 || codePoint > 0x10FFFF || floor(codePoint) != codePoint ) { throw RangeError('Invalid code point: ' + codePoint); } if (codePoint <= 0xFFFF) { codeUnits.push(codePoint); } else { codePoint -= 0x10000; highSurrogate = (codePoint >> 10) + 0xD800; lowSurrogate = (codePoint % 0x400) + 0xDC00; codeUnits.push(highSurrogate, lowSurrogate); } if (index + 1 == length || codeUnits.length > MAX_SIZE) { result += stringFromCharCode.apply(null, codeUnits); codeUnits.length = 0; } } return result; }; if (defineProperty) { defineProperty(String, 'fromCodePoint', { 'value': fromCodePoint, 'configurable': true, 'writable': true }); } else { String.fromCodePoint = fromCodePoint; } }()); }// Add "Quote This" buttons to all initially visible comments
var spans = document.getElementsByTagName("span");
for (var x=0; x<spans.length; x++)
{
if (spans[x].id.indexOf("reply_link_")==0)
{
var button = document.createElement("span");
button.setAttribute("class","nbutton");
var p = document.createElement("p");
var b = document.createElement("b");
var a = document.createElement("a");
// Set the href of the "Quote This" button to the href of the "Reply to This" button, with the escaped contents of the post added to URL and any [domain.names] following links in the post cut out:
a.setAttribute("href",spans[x].getElementsByTagName("a")[0].href.replace("#post_comment","&postercomment="+escape("<blockquote>"+document.getElementById("comment_body_"+spans[x].id.replace("reply_link_","")).innerHTML.replace(/<\/a>\s\[.*?\..*?\]/g,"<\/a>")+"<\/blockquote>\n\n")+"#post_comment"));
// To Do: Shorten URLs longer than 2000 characters
a.appendChild(document.createTextNode("Quote This"));
b.appendChild(a);
p.appendChild(b);
button.appendChild(p);
spans[x].parentNode.insertBefore(button, spans[x].nextSibling);
spans[x].parentNode.insertBefore(document.createTextNode(" "), spans[x].nextSibling); // Divider
}
}// DOI checker in the summary
if (doiChecker && window.location.href.search(/https?\:\/\/.*soylentnews\.org.*?\/article\.pl/)!=-1)
{
var summary = document.getElementById("articles").getElementsByClassName("intro")[0];
summary.innerHTML = summary.innerHTML.replace(/(\(|\[)DOI: (10[^\s\n<]*)(\)|\])/gi,"$1DOI: <a href='http://search.crossref.org/?q=$2' target='_blank'>$2</a>$3");
summary.innerHTML = summary.innerHTML.replace(/(\(|\[)open, DOI: (10[^\s\n<]*)(\)|\])/gi,"$1open, DOI: <a href='http://search.crossref.org/?q=$2' target='_blank'>$2</a>$3");
if (document.getElementById("articles").getElementsByClassName("full").length > 0)
{
var summary2 = document.getElementById("articles").getElementsByClassName("full")[0];
summary2.innerHTML = summary2.innerHTML.replace(/(\(|\[)DOI: (10[^\s\n<]*)(\)|\])/gi,"$1DOI: <a href='http://search.crossref.org/?q=$2' target='_blank'>$2</a>$3");
summary2.innerHTML = summary2.innerHTML.replace(/(\(|\[)open, DOI: (10[^\s\n<]*)(\)|\])/gi,"$1open, DOI: <a href='http://search.crossref.org/?q=$2' target='_blank'>$2</a>$3");
}
}// Empty email input area, but only on submission page
if (stripEmail && window.location.href.search(/https?\:\/\/.*soylentnews\.org.*?\/submit\.pl/)!=-1)
{
var boxes = document.getElementsByTagName("input");
for (var x=0; x<boxes.length; x++)
{
if (boxes[x].name == "email")
{
boxes[x].value = "";
}
}
}// Add title case button next to title/subj field on Story Submissions, Submission Preview, Story Preview, and New Journal
if (window.location.href.search(/https?\:\/\/.*soylentnews\.org.*?\/(submit\.pl|admin\.pl|journal\.pl|journal\.pl\?op=edit)/)!=-1)
{
var boxes = document.getElementsByTagName("input");
for (var x=0; x<boxes.length; x++)
{
if (boxes[x].name == "title" || boxes[x].name == "subj" || boxes[x].name == "description")
{
boxes[x].id = "storyTitle";
var button = document.createElement("input");
button.setAttribute("type","button");
button.setAttribute("value","Title Case");
button.setAttribute("title","Convert title to title case.");
button.setAttribute("onclick","document.getElementById('storyTitle').value=document.getElementById('storyTitle').value.replace(/^\\s/gi,'').replace(/\\b([a-z])/gi,function(m, p1){return p1.toUpperCase();}).replace(/\\b(at|of|is|and|to|in|by|as|its|be|the|on|a|an|but|or|for)\\b/gi,function(m, p1){return p1.toLowerCase();}).replace(/^([a-z])/gi,function(m, p1){return p1.toUpperCase();}).replace(/:\\s([a-z])/gi,function(m, p1){return ': '+p1.toUpperCase();}).replace(/([a-z])['\u2019]([a-z])/gi,function(m, p1, p2){return p1+'\\''+p2.toLowerCase();}).replace(/\\bx(86|64)\\b/gi,'x$1').replace(/\\bIphone/gi,'iPhone').replace(/\\s$/gi,'');");
boxes[x].parentNode.insertBefore(button, boxes[x].nextSibling);
if (window.location.href.search(/https?\:\/\/.*soylentnews\.org.*?\/admin\.pl/)!=-1 || boxes[x].name == "subj")
{
boxes[x].parentNode.insertBefore(document.createElement("br"), boxes[x].nextSibling);
}
else
{
boxes[x].parentNode.insertBefore(document.createTextNode(" "), boxes[x].nextSibling);
}
}
}
}// Add warning for creating a story in the past
if (window.location.href.search(/https?\:\/\/.*soylentnews\.org.*?\/admin\.pl/)!=-1)
{
var boxes = document.getElementsByTagName("input");
for (var x=0; x<boxes.length; x++)
{
if (boxes[x].name == "op" && (boxes[x].value == "save"))
{
// New onclick extracts the post date, compares to the current date, and only submits if the post date is in the future or the user overrides the warning:
boxes[x].setAttribute("onclick","var d = new Date(document.getElementById('slashstoryform').elements['time'].value.replace(/\\s/,'T')); var a = true; if (d < Date.now()){a = confirm('Are you sure you want to post a story '+(Math.round((Date.now()-d)/60000))+' minutes in the past?');} if (a) {st_submit(this);}");
}
}
}// Expand all initially hidden spoiler blocks when editing a story
if (window.location.href.search(/https?\:\/\/.*soylentnews\.org.*?\/admin\.pl/)!=-1)
{
var boxes = document.getElementsByTagName("input");
for (var x=0; x<boxes.length; x++)
{
if (boxes[x].className == "spoiler")
{
boxes[x].checked = true;
}
}
}// Add draft capabilties to story submission form
if (window.location.href.search(/https?\:\/\/.*soylentnews\.org.*?\/submit\.pl/)!=-1)
{
var boxes = document.getElementsByTagName("textarea");
for (var x=0; x<boxes.length; x++)
{
if (boxes[x].name == "story")
{
var p = document.createElement("p");// Save Draft button
var button = document.createElement("input");
button.setAttribute("type","button");
button.setAttribute("value","Save Draft");
button.setAttribute("onclick","saveSoydraft();");
p.appendChild(button);p.appendChild(document.createTextNode(" "));
// Discard Draft button
var button = document.createElement("input");
button.setAttribute("type","button");
button.setAttribute("id","discardDraft");
button.setAttribute("value","Discard");
// Disable the Discard Draft button onload if no draft is available
if(!localStorage.getItem("soydraft"))
{
button.setAttribute("disabled","disabled");
}
else
{
button.setAttribute("onclick","discardSoydraft();");
}
p.appendChild(button);p.appendChild(document.createTextNode(" "));
// Autosave checkbox
var span = document.createElement("span");
span.setAttribute("id","autosaveBar");
// Hide autosave checkbox onload if no draft is available
if (document.getElementById("storyTitle").value == "" && boxes[x].value == "")
{
if(localStorage.getItem("soydraft"))
{
span.setAttribute("style","visibility:visible;");
}
else
{
span.setAttribute("style","visibility:hidden;");
}
}
span.appendChild(document.createTextNode("Autosave?"));
var checkbox = document.createElement("input");
checkbox.setAttribute("type","checkbox");
checkbox.setAttribute("id","autosave");
checkbox.setAttribute("value","");
checkbox.setAttribute("onclick","if (this.checked==false){autosaveOff();} else {autosaveOn();}");
checkbox.setAttribute("style","vertical-align:middle;");
span.appendChild(checkbox);
span.appendChild(document.createTextNode(" "));
p.appendChild(span);// "Saved." text will appear and fade out whenever a draft is saved
var span2 = document.createElement("span");
span2.setAttribute("id","autosaveState");
span2.setAttribute("style","opacity:0;");
span2.appendChild(document.createTextNode("Saved."));
p.appendChild(span2);boxes[x].parentNode.insertBefore(p, boxes[x]);
// Load draft if it exists, but only if workspace is clear
if (document.getElementById("storyTitle").value == "" && boxes[x].value == "")
{
if(localStorage.getItem("soydraft"))
{
document.getElementById("storyTitle").value = decodeURI(JSON.parse(localStorage.getItem("soydraft"))[0]);
for (var y=0; y<document.getElementsByClassName("fullbox").length; y++)
{
if (document.getElementsByClassName("fullbox")[y].name == "dept")
{
document.getElementsByClassName("fullbox")[y].value = decodeURI(JSON.parse(localStorage.getItem("soydraft"))[1]);
break;
}
}
document.getElementById("primaryskid").value = JSON.parse(localStorage.getItem("soydraft"))[2];
document.getElementById("tid").value = JSON.parse(localStorage.getItem("soydraft"))[3];
boxes[x].value = decodeURI(JSON.parse(localStorage.getItem("soydraft"))[4]);
}
}
}
}
}var boxes = document.getElementsByTagName("textarea");
for (var x=0; x<boxes.length; x++)
{
if (boxes[x].name == "introtext" || boxes[x].name == "bodytext" || boxes[x].name == "story")
{
var temp = boxes[x].value; // Retrieve textarea contents
temp = temp.replace(/<\/p><p>/g,"<\/p>\n\n<p>"); // Add newlines between paragraphs
temp = temp.replace(/<br>\s?<br>/g,"<\/p>\n\n<p>"); // Convert double break tags to paragraph tags
temp = temp.replace(/<\/blockquote><p>/g,"<\/blockquote>\n\n<p>"); // Add newlines after blockquotes
temp = temp.replace(/<\/p><blockquote>/g,"<\/p>\n\n<blockquote>"); // Add newlines before blockquotes
temp = temp.replace(/<blockquote><div><p>/g,"<blockquote><div>\n\n<p>"); // Add newlines within start of blockquotes
temp = temp.replace(/<\/p><\/div><\/blockquote>/g,"<\/p>\n\n<\/div><\/blockquote>"); // Add newlines within end of blockquotes
temp = temp.replace(/<\/blockquote><blockquote>/g,"<\/blockquote>\n\n<blockquote>"); // Add newlines between two blockquotes
temp = temp.replace(/<p class="byline">\s/i,"<p class=\"byline\">"); // Remove extra space from byline
temp = temp.replace(/<p>\s/g,"<p>"); // Remove extra space from start of paragraph
temp = temp.replace(/\s<\/p>/g,"<\/p>"); // Remove extra space from end of paragraph
temp = temp.replace(/<\/li><li>/g,"<\/li>\n<li>"); // Add newlines between list items
temp = temp.replace(/(<\/li>)(<\/[u|o]l>)/g,'$1\n$2'); // Add newline after last list item
temp = temp.replace(/(<\/p>)(<[u|o]l>)/g,'$1\n$2'); // Add newlines before lists
temp = temp.replace(/<p>\[...\]/g,"<p>[...] "); // Add space within beginning of foreshortened paragraph
while (temp.indexOf(" ")!=-1)
{
temp = temp.replace(/ /g," "); // Replace double spaces with single spaces
}
if (simplifyChars)
{
temp = temp.replace(/\u2018/g,"'"); // 'LEFT SINGLE QUOTATION MARK' (U+2018) to (U+0027)
temp = temp.replace(/\u2019/g,"'"); // 'RIGHT SINGLE QUOTATION MARK' (U+2019) to (U+0027)
temp = temp.replace(/\u201C/g,"\""); // 'LEFT DOUBLE QUOTATION MARK' (U+201C) to (U+0022)
temp = temp.replace(/\u201D/g,"\""); // 'RIGHT DOUBLE QUOTATION MARK' (U+201D) to (U+0022)
temp = temp.replace(/\u2026/g,"..."); // 'HORIZONTAL ELLIPSIS' (U+2026) to (U+002E) x3
}
boxes[x].value = temp;
boxes[x].rows = 32; // Expand textarea height to 32 rows
}
var toolbar = document.createElement("div");// Blockquote button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","Blockquote");
tempbutton.setAttribute("title","Wrap \u003Cblockquote\u003E tags around the selected text.");
tempbutton.setAttribute("onclick","addBlockquote(document.getElementsByTagName('textarea')["+x+"]);");
toolbar.appendChild(tempbutton);// Paragraph and Line break buttons
var tempspan = document.createElement("span");
tempspan.setAttribute("id","htmlFormatButtons");
if (document.getElementById("posttype") && document.getElementById("posttype").selectedIndex == 0)
{
tempspan.setAttribute("style","display:none;"); // Hide if initial post type option is "Plain Old Text"
}
if (document.getElementById("posttype"))
{
document.getElementById("posttype").addEventListener("change", function() {if (document.getElementById('posttype').selectedIndex == 0) {document.getElementById('htmlFormatButtons').style.display = 'none'} else {document.getElementById('htmlFormatButtons').style.display = 'inline'}}); // Change visibility of these buttons based on value of post type
}
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","P");
tempbutton.setAttribute("title","Wrap \u003Cp\u003E tags around the selected text.");
tempbutton.setAttribute("onclick","addPara(document.getElementsByTagName('textarea')["+x+"]);");
tempspan.appendChild(tempbutton);
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","BR");
tempbutton.setAttribute("title","Insert a line break.");
tempbutton.setAttribute("onclick","addBreak(document.getElementsByTagName('textarea')["+x+"]);");
tempspan.appendChild(tempbutton);
toolbar.appendChild(tempspan);// HR button, if editing a story
if (boxes[x].name == "introtext" || boxes[x].name == "bodytext" || boxes[x].name == "story")
{
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","HR");
tempbutton.setAttribute("title","Insert a horizontal rule.");
tempbutton.setAttribute("style","text-decoration:underline overline;");
tempbutton.setAttribute("onclick","addHRule(document.getElementsByTagName('textarea')["+x+"]);");
tempspan.appendChild(tempbutton);
toolbar.appendChild(tempspan);
}// URL button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","URL");
tempbutton.setAttribute("title","Create a hyperlink around the selected text.");
tempbutton.setAttribute("style","text-decoration:underline;");
tempbutton.setAttribute("onclick","addHyperlink(document.getElementsByTagName('textarea')["+x+"]);");
toolbar.appendChild(tempbutton);
toolbar.appendChild(document.createTextNode(" "));// Bold button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","B");
tempbutton.setAttribute("title","Bold");
tempbutton.setAttribute("style","font-weight:bold;");
tempbutton.setAttribute("onclick","addBold(document.getElementsByTagName('textarea')["+x+"]);");
toolbar.appendChild(tempbutton);// Italic button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","I");
tempbutton.setAttribute("title","Italic");
tempbutton.setAttribute("style","font-style:italic;");
tempbutton.setAttribute("onclick","addItalic(document.getElementsByTagName('textarea')["+x+"]);");
toolbar.appendChild(tempbutton);// Strike button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","S");
tempbutton.setAttribute("title","Strikethrough");
tempbutton.setAttribute("style","text-decoration:line-through;");
tempbutton.setAttribute("onclick","addStrike(document.getElementsByTagName('textarea')["+x+"]);");
toolbar.appendChild(tempbutton);toolbar.appendChild(document.createTextNode(" ")); // Divider
// Code button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","Code");
tempbutton.setAttribute("title","Wrap \u003Cecode\u003E tags around the selected text.");
tempbutton.setAttribute("style","font-family:monospace;");
tempbutton.setAttribute("onclick","addEcode(document.getElementsByTagName('textarea')["+x+"]);");
toolbar.appendChild(tempbutton);// Teletype button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","TT");
tempbutton.setAttribute("title","Wrap \u003Ctt\u003E (teletype, i.e. monospace) tags around the selected text.");
tempbutton.setAttribute("style","font-family:monospace;");
tempbutton.setAttribute("onclick","addTT(document.getElementsByTagName('textarea')["+x+"]);");
toolbar.appendChild(tempbutton);// Spoiler button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","\u25A0\u25A0\u25A0");
tempbutton.setAttribute("title","Wrap \u003Cspoiler\u003E tags around the selected text.");
//tempbutton.setAttribute("style","font-family:monospace;");
tempbutton.setAttribute("onclick","addSpoiler(document.getElementsByTagName('textarea')["+x+"]);");
toolbar.appendChild(tempbutton);// Small button, if editing a story
if (boxes[x].name == "introtext" || boxes[x].name == "bodytext" || boxes[x].name == "story")
{
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","\u0073\u1D0D\u1D00\u029F\u029F");
tempbutton.setAttribute("title","Wrap \u003Csmall\u003E tags around the selected text.");
// tempbutton.setAttribute("style","font-size:75%;");
tempbutton.setAttribute("onclick","addSmall(document.getElementsByTagName('textarea')["+x+"]);");
toolbar.appendChild(tempbutton);
}toolbar.appendChild(document.createTextNode(" ")); // Divider
// Superscript button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","x\u00B2");
tempbutton.setAttribute("title","Superscript");
tempbutton.setAttribute("style","font-family:monospace;");
tempbutton.setAttribute("onclick","addSuper(document.getElementsByTagName('textarea')["+x+"]);");
toolbar.appendChild(tempbutton);// Subscript button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","x\u2082");
tempbutton.setAttribute("title","Subscript");
tempbutton.setAttribute("style","font-family:monospace;");
tempbutton.setAttribute("onclick","addSubsc(document.getElementsByTagName('textarea')["+x+"]);");
toolbar.appendChild(tempbutton);toolbar.appendChild(document.createTextNode(" ")); // Divider
// Ordered list button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","1. List");
tempbutton.setAttribute("title","Insert an ordered list or convert newline-separated text into an ordered list.");
tempbutton.setAttribute("onclick","addOrdlist(document.getElementsByTagName('textarea')["+x+"],'1');");
toolbar.appendChild(tempbutton);// Ordered list button - Alpha
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","A. List");
tempbutton.setAttribute("title","Insert an ordered list or convert newline-separated text into an ordered list.");
tempbutton.setAttribute("onclick","addOrdlist(document.getElementsByTagName('textarea')["+x+"],'A');");
toolbar.appendChild(tempbutton);// Ordered list button - Roman
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","I. List");
tempbutton.setAttribute("title","Insert an ordered list or convert newline-separated text into an ordered list.");
tempbutton.setAttribute("onclick","addOrdlist(document.getElementsByTagName('textarea')["+x+"],'I');");
toolbar.appendChild(tempbutton);// Unordered list button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","\u2022 List");
tempbutton.setAttribute("title","Insert an unordered list or convert newline-separated text into an unordered list.");
tempbutton.setAttribute("onclick","addUnordlist(document.getElementsByTagName('textarea')["+x+"]);");
toolbar.appendChild(tempbutton);toolbar.appendChild(document.createElement("br")); // Divider
toolbar.appendChild(document.createElement("br")); // Divider// Create 7 macro buttons
for (var i=1; i<=7; i++)
{
// Create macros if they don't exist
if(!localStorage.getItem("soymacro"+i))
{
localStorage.setItem("soymacro"+i,JSON.stringify(["M"+i,"string","Sample Text"]));
//localStorage.setItem("soymacro"+i,JSON.stringify(["M"+i,"regexp","/a/gi","b"]));
}
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("id","soymacros"+x+"button"+i);
tempbutton.setAttribute("value",JSON.parse(localStorage.getItem("soymacro"+i))[0]);
if (JSON.parse(localStorage.getItem("soymacro"+i))[1]=="string")
{
if (JSON.parse(localStorage.getItem("soymacro"+i))[2].length < 40)
{
tempbutton.setAttribute("title","Insert or replace selected text with: " + JSON.parse(localStorage.getItem("soymacro"+i))[2]);
}
else
{
tempbutton.setAttribute("title","Insert or replace selected text with: " + JSON.parse(localStorage.getItem("soymacro"+i))[2].substring(0,40)+"...");
}
tempbutton.setAttribute("onclick","macroChoose(document.getElementsByTagName('textarea')["+x+"],"+i+");");
}
else
{
tempbutton.setAttribute("title","Replace text matched by the regular expression: " + JSON.parse(localStorage.getItem("soymacro"+i))[2] + " with: " + JSON.parse(localStorage.getItem("soymacro"+i))[3]);
tempbutton.setAttribute("onclick","macroChoose(document.getElementsByTagName('textarea')["+x+"],"+i+");");
}
toolbar.appendChild(tempbutton);
}
// Create macros edit button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","Edit");
tempbutton.setAttribute("title","Configure user macros or discard changes.");
tempbutton.setAttribute("onclick","if (document.getElementById('macrobar"+x+"').style.display == 'none') {document.getElementById('macrobar"+x+"').style.display = 'block'; macrobarInit("+x+");} else {document.getElementById('macrobar"+x+"').style.display = 'none'; if (p = document.getElementById('postercomment')) { var x = p.offsetTop; while (p = p.offsetParent) {x += p.offsetLeft;} window.scrollTo(0,x-75);}}");
toolbar.appendChild(tempbutton);toolbar.appendChild(document.createElement("br")); // Divider
// Despace button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value","Despace");
tempbutton.setAttribute("title","Delete newlines within the selection.");
tempbutton.setAttribute("onclick","despace(document.getElementsByTagName('textarea')["+x+"]);");
toolbar.appendChild(tempbutton);// Symbol button
var tempbutton = document.createElement("input");
tempbutton.setAttribute("type","button");
tempbutton.setAttribute("value",":-)");
tempbutton.setAttribute("title","Insert a symbol.");
tempbutton.setAttribute("onclick","if (document.getElementById('smilebar"+x+"').style.display == 'none') {document.getElementById('smilebar"+x+"').style.display = 'block'} else {document.getElementById('smilebar"+x+"').style.display = 'none'; if (p = document.getElementById('postercomment')) { var x = p.offsetTop; while (p = p.offsetParent) {x += p.offsetLeft;} window.scrollTo(0,x-75); } }");
toolbar.appendChild(tempbutton);
boxes[x].parentNode.insertBefore(toolbar, boxes[x].nextSibling);// Symbol list
var smilebar = document.createElement("div");
smilebar.setAttribute("style","-moz-user-select:none; -webkit-user-select:none; display:none; font-size:16pt; max-height:240px; overflow:auto; padding:0.5em;");
smilebar.setAttribute("id","smilebar"+x);
var smiles = ["\u0026amp;","\u0026lt;","\u0026gt;","\u0026nbsp;"];var codes = [[161,169],[171,172],[174],[176,177],[180,183],[187,191],[215],[224,255],[402],[629],[632],[916],[920],[931],[934],[937],[945,946],[956],[960],[963],[8211,8213],[8216,8221],[8226],[8230],[8251],[8315],[8331],[8364],[8478],[8482],[8528,8542],[8585],[8592,8652],[8712,8716],[8721],[8730],[8733,8734],[8736],[8743,8749],[8756,8757],[8773],[8776],[8800,8805],[8834,8837],[8984],[9095],[9760],[9762,9765],[9770],[9773,9775],[9784,9794],[9812,9831],[9833,9842],[9850],[9855,9861],[9874,9877],[9882,9885],[9888,9893],[9913],[9940],[9962],[9971],[9981],[9992,10087],[12316],[12336],[21328],[65533],[127744,127756],[127759],[127775,127776],[127797],[127801],[127804,127812],[127817],[127820,127822],[127828,127831],[127838,127839],[127843],[127849],[127855],[127860,127867],[127873,127877],[127884],[127891],[127904,127911],[127918],[127939],[127942],[127977],[128025],[128039],[128074,128078],[128123,128131],[128137,128142],[128148,128150],[128152],[128158],[128161,128165],[128168,128170],[128172],[128175,128177],[128187],[128189,128190],[128193,128194],[128197],[128200,128204],[128206],[128214],[128225,128227],[128231,128233],[128241],[128244],[128246],[128250,128252],[128259],[128266,128270],[128273,128276],[128278,128280],[128286],[128293,128299],[128302,128303],[128509,128565],[128640],[128659],[128681],[128684,128685],[128701]];
for (var i=0; i<codes.length; i++) { if (codes[i].length > 1) { for (var j=codes[i][0]; j<=codes[i][1]; j++) { smiles[smiles.length] = String.fromCodePoint(j); } } else { smiles[smiles.length] = String.fromCodePoint(codes[i][0]); } } // Populate smiles array with code ranges converted to individual characters
smiles = smiles.concat(["xD",":-)",":^)","(^_^;)","(\u00A0\u0361\u00B0\u00A0\u035C\u0296\u00A0\u0361\u00B0)","(\u00A0\u0361\u007E\u00A0\u035C\u0296\u00A0\u0361\u00B0)\uFEFF","\u00AF\u005C\u005F(\u30C4)\u005F\u002F\u00AF","(\u256F\u00B0\u25A1\u00B0\uFF09\u256F\uFE35\u00A0\u253B\u2501\u253B","(\u30CE\u0CA0\u76CA\u0CA0)\u30CE\u5F61\u253B\u2501\u253B","(\u0060\uFF65\u03C9\uFF65\u00B4)","\u0CA0_\u0CA0","\u0295\u2022\u1D25\u2022\u0294","(\u3065\uFFE3\u00A0\u00B3\uFFE3)\u3065","\u0669(\u204E\u275B\u1D17\u275B\u204E)\u06F6","\u30FD\u0F3C\u0E88\u0644\u035C\u0E88\u0F3D\uFF89","(\uB208\u2038\uB208)","\u006F(\u3003\uFF3E\u25BD\uFF3E\u3003)\u006F","\u0028\u0028\u30FE\u0028\u2267\u76BF\u2266\uFF1B\u0029\u30CE\uFF3F\u0029\u0029","\u30FD\u0028\u002A\u2312\u2207\u2312\u002A\u0029\uFF89","\u0028\u2267\u2207\u2266\u0029\u002F","\u0028\u0E07\u00A0\u0360\u00B0\u00A0\u035F\u0644\u035C\u00A0\u0361\u00B0\u0029\u0E07"]); // Add in arbitrary emoticons
// Note: \u00A0 is a non-breaking space character.for (var i=0; i<smiles.length; i++)
{
var smile = document.createElement("span");
smile.setAttribute("style","cursor:pointer; padding:2px; white-space:nowrap;");
smile.setAttribute("onclick","addSmile(document.getElementsByTagName('textarea')["+x+"],'"+smiles[i].replace("\u005C","\u005C\u005C")+"');");
smile.appendChild(document.createTextNode(smiles[i]));
smilebar.appendChild(smile);
if (i<smiles.length) // A space is added after every symbol including the final one
{
smilebar.appendChild(document.createTextNode(" "));
}
}var flags = [];
flags = flags.concat([[[127462,127467],"Afghanistan"]]); // AF/Afghanistan
flags = flags.concat([[[127462,127478],"Antarctica"]]); // AQ/Antarctica
flags = flags.concat([[[127462,127482],"Australia"]]); // AU/Australia
flags = flags.concat([[[127463,127465],"Bangladesh"]]); // BD/Bangladesh
flags = flags.concat([[[127463,127479],"Brazil"]]); // BR/Brazil
flags = flags.concat([[[127464,127462],"Canada"]]); // CA/Canada
flags = flags.concat([[[127464,127475],"China"]]); // CN/China
flags = flags.concat([[[127464,127476],"Colombia"]]); // CO/Colombia
flags = flags.concat([[[127464,127482],"Cuba"]]); // CU/Cuba
flags = flags.concat([[[127465,127466],"Germany"]]); // DE/Germany
flags = flags.concat([[[127466,127468],"Egypt"]]); // EG/Egypt
flags = flags.concat([[[127466,127480],"Spain"]]); // ES/Spain
flags = flags.concat([[[127988,917605,917619,917603,917620,917631],"Catalonia"]]); // ES-CT/Catalonia
flags = flags.concat([[[127466,127482],"European Union"]]); // EU/European Union
flags = flags.concat([[[127467,127479],"France"]]); // FR/France
flags = flags.concat([[[127468,127463],"United Kingdom"]]); // GB/United Kingdom
flags = flags.concat([[[127988,917607,917602,917605,917614,917607,917631],"England"]]); // GB-ENG/England
flags = flags.concat([[[127988,917607,917602,917619,917603,917620,917631],"Scotland"]]); // GB-SCT/Scotland
flags = flags.concat([[[127988,917607,917602,917623,917612,917619,917631],"Wales"]]); // GB-WLS/Wales
flags = flags.concat([[[127468,127479],"Greece"]]); // GR/Greece
flags = flags.concat([[[127469,127472],"Hong Kong"]]); // HK/Hong Kong
flags = flags.concat([[[127470,127465],"Indonesia"]]); // ID/Indonesia
flags = flags.concat([[[127470,127466],"Ireland"]]); // IE/Ireland
flags = flags.concat([[[127470,127473],"Israel"]]); // IL/Israel
flags = flags.concat([[[127470,127475],"India"]]); // IN/India
flags = flags.concat([[[127470,127478],"Iraq"]]); // IQ/Iraq
flags = flags.concat([[[127470,127479],"Iran"]]); // IR/Iran
flags = flags.concat([[[127470,127481],"Italy"]]); // IT/Italy
flags = flags.concat([[[127471,127474],"Jamaica"]]); // JM/Jamaica
flags = flags.concat([[[127471,127477],"Japan"]]); // JP/Japan
flags = flags.concat([[[127472,127466],"Kenya"]]); // KE/Kenya
flags = flags.concat([[[127472,127477],"North Korea"]]); // KP/North Korea
flags = flags.concat([[[127472,127479],"South Korea"]]); // KR/South Korea
flags = flags.concat([[[127473,127463],"Lebanon"]]); // LB/Lebanon
flags = flags.concat([[[127473,127486],"Libya"]]); // LY/Libya
flags = flags.concat([[[127474,127475],"Mongolia"]]); // MN/Mongolia
flags = flags.concat([[[127474,127485],"Mexico"]]); // MX/Mexico
flags = flags.concat([[[127475,127468],"Nigeria"]]); // NG/Nigeria
flags = flags.concat([[[127477,127466],"Peru"]]); // PE/Peru
flags = flags.concat([[[127477,127472],"Pakistan"]]); // PK/Pakistan
flags = flags.concat([[[127477,127479],"Puerto Rico"]]); // PR/Puerto Rico
flags = flags.concat([[[127477,127480],"Palestinian Territory"]]); // PS/Palestinian Territory
flags = flags.concat([[[127479,127482],"Russia"]]); // RU/Russia
flags = flags.concat([[[127480,127462],"Saudi Arabia"]]); // SA/Saudi Arabia
flags = flags.concat([[[127480,127465],"Sudan"]]); // SD/Sudan
flags = flags.concat([[[127480,127466],"Sweden"]]); // SE/Sweden
flags = flags.concat([[[127480,127468],"Singapore"]]); // SG/Singapore
flags = flags.concat([[[127480,127476],"Somalia"]]); // SO/Somalia
flags = flags.concat([[[127481,127469],"Thailand"]]); // TH/Thailand
flags = flags.concat([[[127481,127479],"Turkey"]]); // TR/Turkey
flags = flags.concat([[[127481,127484],"Taiwan"]]); // TW/Taiwan
flags = flags.concat([[[127482,127468],"Uganda"]]); // UG/Uganda
flags = flags.concat([[[127482,127480],"United States"]]); // US/United States
flags = flags.concat([[[127483,127462],"Vatican City"]]); // VA/Vatican City
flags = flags.concat([[[127483,127466],"Venezuela"]]); // VE/Venezuela
flags = flags.concat([[[127487,127462],"South Africa"]]); // ZA/South Africa
flags = flags.concat([[[127487,127484],"Zimbabwe"]]); // ZW/Zimbabwe
flags = flags.concat([[[127987],"White Flag"]]); // Waving White Flag
flags = flags.concat([[[127988],"Black Flag"]]); // Waving Black Flag
flags = flags.concat([[[127987,65039,8205,127752],"Rainbow Flag"]]); // Waving White Flag + Rainbow
flags = flags.concat([[[127988,8205,9760,65039],"Pirate Flag"]]); // Waving Black Flag + Skull and Crossbones
//flags = flags.concat([[[000000,000000],"STRING"]]); // STRINGfor (var i=0; i<flags.length; i++)
{
var flag = document.createElement("span");
flag.setAttribute("style","cursor:pointer; padding:2px; white-space:nowrap;");
var s1 = "", s2 = "";
for (var j=0; j<flags[i][0].length; j++)
{
s1 += String.fromCodePoint(flags[i][0][j]);
s2 += "&#"+flags[i][0][j]+";";
}
flag.setAttribute("onclick","addSmile(document.getElementsByTagName('textarea')["+x+"],'"+s2+"');");
flag.setAttribute("title",flags[i][1]);
flag.appendChild(document.createTextNode(s1));
smilebar.appendChild(flag);
if (i+1<flags.length)
{
smilebar.appendChild(document.createTextNode(" "));
}
}toolbar.parentNode.insertBefore(smilebar, toolbar.nextSibling);
// Create macro configuration interface
var macrobar = document.createElement("div");
macrobar.setAttribute("style","display:none; padding:0.5em;");
macrobar.setAttribute("id","macrobar"+x);
var table = document.createElement("table");
var tr = document.createElement("tr");
var th = document.createElement("th");
th.appendChild(document.createTextNode("Name"));
tr.appendChild(th);
var th = document.createElement("th");
th.appendChild(document.createTextNode("Type"));
tr.appendChild(th);
var th = document.createElement("th");
th.appendChild(document.createTextNode("String | Expression"));
tr.appendChild(th);
var th = document.createElement("th");
th.setAttribute("title","Only used with expressions. Parenthesized substring matches (e.g. '$1') can be used.");
th.setAttribute("style","cursor:help;");
th.appendChild(document.createTextNode("Expression Replace"));
tr.appendChild(th);
table.appendChild(tr);
for (var i=1; i<=7; i++)
{
var tr = document.createElement("tr");// Macro name
var td = document.createElement("td");
var name = document.createElement("input");
name.setAttribute("type","text");
name.setAttribute("id","soymacros"+x+"name"+i);
td.appendChild(name);
tr.appendChild(td);// Macro type
var td = document.createElement("td");
var rad = document.createElement("input");
rad.setAttribute("type","radio");
rad.setAttribute("name","soymacros"+x+"type"+i);
rad.setAttribute("id","soymacros"+x+"type"+i+"S");
td.appendChild(rad);
td.appendChild(document.createTextNode(" String "));
var rad = document.createElement("input");
rad.setAttribute("type","radio");
rad.setAttribute("name","soymacros"+x+"type"+i);
rad.setAttribute("id","soymacros"+x+"type"+i+"E");
td.appendChild(rad);
td.appendChild(document.createTextNode(" Expression "));
tr.appendChild(td);// Field A
var td = document.createElement("td");
var f1 = document.createElement("input");
f1.setAttribute("type","text");
f1.setAttribute("id","soymacros"+x+"fieldA"+i);
td.appendChild(f1);
tr.appendChild(td);// Field B
var td = document.createElement("td");
var f1 = document.createElement("input");
f1.setAttribute("type","text");
f1.setAttribute("id","soymacros"+x+"fieldB"+i);
td.appendChild(f1);
tr.appendChild(td);table.appendChild(tr);
}
macrobar.appendChild(table);var p = document.createElement("p");
var save = document.createElement("input");
save.setAttribute("type","button");
save.setAttribute("value","Save");
save.setAttribute("title","Save any edits to the macro configuration.");
save.setAttribute("onclick","macrobarSave("+x+");");
p.appendChild(save);
p.appendChild(document.createTextNode(" "));
var guide = document.createElement("a");
guide.setAttribute("href","https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions");
guide.setAttribute("target","_blank");
guide.appendChild(document.createTextNode("Regexp Guide"));
p.appendChild(guide);
macrobar.appendChild(p);toolbar.parentNode.insertBefore(macrobar, toolbar.nextSibling);
}// Change Stories link to regular admin.pl on breakingnews, meta, politics, and communityreviews nexii
if (window.location.href.search(/https?\:\/\/.*soylentnews\.org.*?\/(breakingnews|meta|politics|communityreviews)\//)!=-1)
{
if (document.getElementById("adminmenu"))
{
var t = document.getElementById("adminmenu").getElementsByTagName("a");
for (var i=0; i<t.length; i++)
{
if (t[i].innerText == "Stories")
{
t[i].setAttribute("href","//soylentnews.org/admin.pl");
}
}
}
}// Easily cycle through *New* comments
if (!disableCycler && (document.querySelector(".newBadge") || (document.querySelector(".dimmed") && document.querySelector(".comment > div.commentDiv:not(.dimmed)"))))
{
var temp = document.getElementById("links");
var temp2 = document.createElement("div");
temp2.setAttribute("style","position:fixed; bottom:15px; z-index:-100;");
var temp3 = document.createElement("input");
temp3.setAttribute("type","button");
temp3.setAttribute("value","New Comment \u00BB");
temp3.setAttribute("onclick","cycleNew();");
temp2.appendChild(temp3);
temp.appendChild(temp2);
}var temp = document.createElement("script");
// Add selection handling function
temp.appendChild(document.createTextNode("function getSelection(textarea) { if ('selectionStart' in textarea) { if (textarea.selectionStart != textarea.selectionEnd) { return [textarea.selectionStart,textarea.selectionEnd]; } } } "));// Add comment formatting buttons
temp.appendChild(document.createTextNode("function addBlockquote(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<blockquote>'+area.value.substring(sel[0],sel[1])+'<\/blockquote>' + area.value.substring(sel[1]); } } function addPara(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<p>'+area.value.substring(sel[0],sel[1])+'<\/p>' + area.value.substring(sel[1]); } } function addBreak(area) { if ('selectionStart' in area) { var pos = area.selectionStart; area.value = area.value.substring(0,area.selectionStart) + '<br>' + area.value.substring(pos); area.focus(); area.setSelectionRange(pos+4,pos+4) } } function addHRule(area) { if ('selectionStart' in area) { var pos = area.selectionStart; area.value = area.value.substring(0,area.selectionStart) + '<hr>' + area.value.substring(pos); area.focus(); area.setSelectionRange(pos+4,pos+4) } } function addHyperlink(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { url = prompt('URL:', 'https://'); if (url==null) {return false;} area.value = area.value.substring(0,sel[0]) + '<a href=\"'+url+'\">'+area.value.substring(sel[0],sel[1])+'<\/a>' + area.value.substring(sel[1]); } } function addBold(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<b>'+area.value.substring(sel[0],sel[1])+'<\/b>' + area.value.substring(sel[1]); } } function addItalic(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<em>'+area.value.substring(sel[0],sel[1])+'<\/em>' + area.value.substring(sel[1]); } } function addStrike(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<del>'+area.value.substring(sel[0],sel[1])+'<\/del>' + area.value.substring(sel[1]); } } function addEcode(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<ecode>'+area.value.substring(sel[0],sel[1])+'<\/ecode>' + area.value.substring(sel[1]); } } function addTT(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<tt>'+area.value.substring(sel[0],sel[1])+'<\/tt>' + area.value.substring(sel[1]); } } function addSpoiler(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<spoiler>'+area.value.substring(sel[0],sel[1])+'<\/spoiler>' + area.value.substring(sel[1]); } } function addSmall(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<small>'+area.value.substring(sel[0],sel[1])+'<\/small>' + area.value.substring(sel[1]); } } function addSuper(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<sup>'+area.value.substring(sel[0],sel[1])+'<\/sup>' + area.value.substring(sel[1]); } } function addSubsc(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + '<sub>'+area.value.substring(sel[0],sel[1])+'<\/sub>' + area.value.substring(sel[1]); } } "));// Add list creation functions
temp.appendChild(document.createTextNode("function addOrdlist(area,type) { if ('selectionStart' in area) { if (area.selectionStart != area.selectionEnd) { area.value = area.value.substring(0,area.selectionStart) + '<ol type=\\\"' + type + '\\\"><li>' + area.value.substring(area.selectionStart,area.selectionEnd).replace(/\\n/g,'<\/li>\\n<li>').replace(/\\n<li><\\/li>/g,'') + '<\/li><\/ol>' + area.value.substring(area.selectionEnd); } else { temp = '<ol type=\\\"' + type + '\\\">'; while(listitem = prompt('Enter a list item. Leave the box empty or press Cancel to complete the list:', '')) { temp += '<li>' + listitem + '<\/li>\\n'; } if (temp=='<ol type=\\\"' + type + '\\\">') {return;} area.value = area.value.substring(0,area.selectionStart) + temp.substring(0,temp.length-1) + '<\/ol>' + area.value.substring(area.selectionStart); } } } function addUnordlist(area) { if ('selectionStart' in area) { if (area.selectionStart != area.selectionEnd) { area.value = area.value.substring(0,area.selectionStart) + '<ul><li>' + area.value.substring(area.selectionStart,area.selectionEnd).replace(/\\n/g,'<\/li>\\n<li>').replace(/\\n<li><\\/li>/g,'') + '<\/li><\/ul>' + area.value.substring(area.selectionEnd); } else { temp = '<ul>'; while(listitem = prompt('Enter a list item. Leave the box empty or press Cancel to complete the list:', '')) { temp += '<li>' + listitem + '<\/li>\\n'; } if (temp=='<ul>') {return;} area.value = area.value.substring(0,area.selectionStart) + temp.substring(0,temp.length-1) + '<\/ul>' + area.value.substring(area.selectionStart); } } }"));// Add macro functions
temp.appendChild(document.createTextNode("function macroChoose(area,x) { if (JSON.parse(localStorage.getItem('soymacro'+x))[1]=='string') { macroString(area,x); } else { macroRegexp(area,x); } }"));
temp.appendChild(document.createTextNode("function macroString(area,x) { var sel = getSelection(area); if (sel && sel[0] != sel[1]) { area.value = area.value.substring(0,sel[0]) + JSON.parse(localStorage.getItem('soymacro'+x))[2] + area.value.substring(sel[1]); } else if ('selectionStart' in area) { var pos = area.selectionStart; area.value = area.value.substring(0,area.selectionStart) + JSON.parse(localStorage.getItem('soymacro'+x))[2] + area.value.substring(pos); area.focus(); area.setSelectionRange(pos+JSON.parse(localStorage.getItem('soymacro'+x))[2].length,pos+JSON.parse(localStorage.getItem('soymacro'+x))[2].length); } }"));
temp.appendChild(document.createTextNode("function macroRegexp(area,x) { var sel = getSelection(area); if (sel && sel[0] != sel[1]) { var reg = JSON.parse(localStorage.getItem('soymacro'+x))[2]; area.value = area.value.substring(0,sel[0]) + area.value.substring(sel[0],sel[1]).replace(new RegExp(reg.substring(reg.indexOf('/')+1,reg.lastIndexOf('/')), reg.substring(reg.lastIndexOf('/')+1)),JSON.parse(localStorage.getItem('soymacro'+x))[3]) + area.value.substring(sel[1]); } }"));
temp.appendChild(document.createTextNode("function macrobarInit(x) { for (var y=1; y<=7; y++) { document.getElementById('soymacros'+x+'name'+y).value = JSON.parse(localStorage.getItem('soymacro'+y))[0]; if (JSON.parse(localStorage.getItem('soymacro'+y))[1]=='string') { document.getElementById('soymacros'+x+'type'+y+'S').checked = true; } else { document.getElementById('soymacros'+x+'type'+y+'E').checked = true; } document.getElementById('soymacros'+x+'fieldA'+y).value = JSON.parse(localStorage.getItem('soymacro'+y))[2]; if (JSON.parse(localStorage.getItem('soymacro'+y))[1]!='string') { document.getElementById('soymacros'+x+'fieldB'+y).value = JSON.parse(localStorage.getItem('soymacro'+y))[3]; } else { document.getElementById('soymacros'+x+'fieldB'+y).value = ''; } } }"));
temp.appendChild(document.createTextNode("function macrobarSave(x) { for (var y=1; y<=7; y++) { if (document.getElementById('soymacros'+x+'type'+y+'S').checked == true) { localStorage.setItem('soymacro'+y,JSON.stringify([document.getElementById('soymacros'+x+'name'+y).value,'string',document.getElementById('soymacros'+x+'fieldA'+y).value])); } else { localStorage.setItem('soymacro'+y,JSON.stringify([document.getElementById('soymacros'+x+'name'+y).value,'regexp',document.getElementById('soymacros'+x+'fieldA'+y).value,document.getElementById('soymacros'+x+'fieldB'+y).value])); } } document.getElementById('macrobar'+x).style.display = 'none'; var boxes = document.getElementsByTagName('textarea'); for (var z=0; z<boxes.length; z++) { for (var y=1; y<=7; y++) { document.getElementById('soymacros'+z+'button'+y).value = JSON.parse(localStorage.getItem('soymacro'+y))[0]; if (JSON.parse(localStorage.getItem('soymacro'+y))[1]=='string') { if (JSON.parse(localStorage.getItem('soymacro'+y))[2].length < 40) { document.getElementById('soymacros'+z+'button'+y).title = 'Insert or replace selected text with: ' + JSON.parse(localStorage.getItem('soymacro'+y))[2]; } else { document.getElementById('soymacros'+z+'button'+y).title = 'Insert or replace selected text with: ' + JSON.parse(localStorage.getItem('soymacro'+y))[2].substring(0,40)+'...'; } } else { document.getElementById('soymacros'+z+'button'+y).title = 'Replace text matched by the regular expression: ' + JSON.parse(localStorage.getItem('soymacro'+y))[2] + ' with: ' + JSON.parse(localStorage.getItem('soymacro'+y))[3]; } } } }"));// Add despace function
temp.appendChild(document.createTextNode("function despace(area) { var sel = getSelection(area); if (!(sel[0] == 0 && sel[1] == 0)) { area.value = area.value.substring(0,sel[0]) + area.value.substring(sel[0],sel[1]).replace(/\\r/g,' ').replace(/\\n/g,' ').replace(/\\s\\s/g,' ').replace(/\\s\\s/g,' ').replace(/\\s\\s/g,' ').replace(/\\s\\s/g,' ').replace(/\\s\\s/g,' ') + area.value.substring(sel[1]); } }"));// Add unicode insertion function
temp.appendChild(document.createTextNode("function addSmile(area, smile) { if ('selectionStart' in area) { var pos = area.selectionStart; area.value = area.value.substring(0,pos) + smile + area.value.substring(pos); area.focus(); area.setSelectionRange(pos+smile.length,pos+smile.length) } }"));// Add save submission function
temp.appendChild(document.createTextNode("function saveSoydraft() { try {window.clearTimeout(timer);} catch(e){} var boxes = document.getElementsByTagName('textarea'); for (var x=0; x<boxes.length; x++) { if (boxes[x].name == 'story') { if (document.getElementById('storyTitle').value!=''||boxes[x].value!='') { document.getElementById('autosaveBar').style.visibility='visible'; document.getElementById('autosaveState').style.transition='opacity 0s'; document.getElementById('autosaveState').style.opacity='1'; document.getElementById('autosaveState').offsetWidth = document.getElementById('autosaveState').offsetWidth; document.getElementById('autosaveState').style.transition='opacity 1s'; document.getElementById('autosaveState').style.opacity='0'; var y=0; for (y=0; y<document.getElementsByClassName('fullbox').length; y++) { if (document.getElementsByClassName('fullbox')[y].name == 'dept') { break; } } localStorage.setItem('soydraft',JSON.stringify([encodeURI(document.getElementById('storyTitle').value),encodeURI(document.getElementsByClassName('fullbox')[y].value),document.getElementById('primaryskid').value,document.getElementById('tid').value,encodeURI(boxes[x].value)])); document.getElementById('discardDraft').removeAttribute('disabled'); document.getElementById('discardDraft').setAttribute('onclick','discardSoydraft();'); } else { alert('There is no title or story to save.'); } break; } } }"));// Add discard submission function
temp.appendChild(document.createTextNode("function discardSoydraft() { autosaveOff(); document.getElementById('autosave').checked=false; document.getElementById('autosaveBar').style.visibility='hidden'; localStorage.removeItem('soydraft'); document.getElementById('discardDraft').setAttribute('disabled','disabled'); document.getElementById('discardDraft').removeAttribute('onclick'); }"));// Add autosave functions
temp.appendChild(document.createTextNode("function autosaveOn() { var boxes = document.getElementsByTagName('textarea'); for (var x=0; x<boxes.length; x++) { if (boxes[x].name == 'story') { boxes[x].onkeydown = function() {try {window.clearTimeout(timer);} catch(e){} timer = window.setTimeout(function() { if(document.getElementById(\"autosaveBar\").style.visibility==\"visible\") {saveSoydraft();} }, 3000);}; } } document.getElementById('storyTitle').onkeydown = function() {try {window.clearTimeout(timer);} catch(e){} timer = window.setTimeout(function() { if(document.getElementById(\"autosaveBar\").style.visibility==\"visible\") {saveSoydraft();} }, 3000);}; }"));
temp.appendChild(document.createTextNode("function autosaveOff() { var boxes = document.getElementsByTagName('textarea'); for (var x=0; x<boxes.length; x++) { if (boxes[x].name == 'story') { try {window.clearTimeout(timer);} catch(e){} boxes[x].onkeydown = null; } } document.getElementById('storyTitle').onkeydown = null; }"));// Add new comment cycling function
// Credit: charon
temp.appendChild(document.createTextNode("var newComN = 0; var newComments = document.querySelector('.newBadge') ? document.querySelectorAll('.newBadge') : document.querySelectorAll('.comment > div:not(.dimmed)'); function cycleNew() {if (!newComments[newComN]) {return;} if (newComN != 0 && window.pageYOffset > newComments[newComN].offsetTop + 100) {while (newComments[newComN].offsetTop <= window.pageYOffset){newComN++;}} var p = newComments[newComN++]; var y = p.offsetTop; while (p = p.offsetParent) {y += p.offsetLeft;} window.scrollTo(0,y); if(newComN>=newComments.length-1){newComN=0;}}"));document.getElementsByTagName('head')[0].appendChild(temp); // Add script to page
https://www.gofundme.com/help-mike-survive-for-a-month
"A friend" anonymously donated $85, thereby reaching the goal.
However my sister and brother in law gave me $200, but sent a check. So really I raised $900.
At the end of my pitch I promise to donate any excess to the Portland Rescue Mission. One of my donors advised me to hold on to any excess. I decided that's wise advice, so I'll wait until after I get my next paycheck to donate to the rescue mission.
I remain angry at GoFundMe for posting my campaign at Facebook with the demand "Donate Now!". I was mortified. I edited the post - I'm glad I could do so - then apologized to all my FB friends, and sent a note of apology to all my donors.
The usual crowdfunding advice is to ask all of one's friends and family to donate. I didn't do that. Rather I mailed them all my campaign link with a request that they forward the message to _their_ friends and family.
That is, I was shaking down a bunch of complete strangers for _their_ money.
All but one of my donors are complete strangers. The one friend - he gave me $125 - I've known since he and I worked together on multimedia CDs at Medior, just before the dot-com boom hit. Doug Clarke is a good guy.