So, I was drinking coffee this morning and watching my twitter stream and somehow the thread count of sheets came up. Being as I didn't feel like fitting my feelings on the matter into 140 characters, it goes here.
High thread count sheets can suck it. I'd happily pay inverted prices to have to never sleep on them again. It is my firm belief that sheets should not feel like you're lying between two ultra-thin layers of cloud. They damned sure shouldn't end up wadding themselves into a ball just from one night's worth of sleeping between them.
Sheets should feel like you're sandwiched between two new dollar bills. Slightly rough and starched as stiff as you can manage. You should damned near be able to make a drum head out of them. As soon as they start feeling soft and showing signs of wadding up, they should be laundered and starched to within an inch of their lives again.
Worst provider in terms of spam:
- Yahoo
- Hotmail/Outlook
- Gmail
- OVH
- AWS
- Yandex
- Bezeqint
- AOL
I've listed them in order of what I think is most to least worse. Outlook spam sucks extra hard because Microsoft tacks about 5k of headers on every email which makes it that much more expensive to report to Spamcop. But Yahoo, especially from yahoo.co.jp, amounts to almost 50% of the spam that gets through to me.
So, it's Women's Equality Day. Lot of you probably think about this time I'd be busting out with a sexist rant. Hate to disappoint but I'm all about equality. Actual equality though not this bullshit third-gen feminist version of equality where they think equality means special treatment for their tragic victimhood.
No, equality always has and always will mean equal treatment. Every single time. No exceptions for past mistreatment. No white-knighting up if someone with tits comes crying on your shoulder that people are mean to her just because she calls them misogynists, shitlords, tools of the patriarchy, etc...
In fact, no calling yourself a feminist period. If you do it as a woman it's saying you feel your entire gender has been victimized and should be given special treatment because it is incapable of taking care of itself. If you do it as a man you're saying an entire gender is in need of your protection.
You either treat a woman as if she's an adult and as capable of taking care of her own shit as you are, or you don't. There is no "yes, but" to it. Equal treatment or sexism, there are no other choices.
https://soylentnews.org/submit.pl?op=viewsub&subid=8941
https://www.kickstarter.com/projects/metamesh/meta-mesh-community-wireless-networks-for-all
Funding Canceled
Funding for this project was canceled by the project creator 1 day ago.
http://www.metamesh.org/blog/2015/08/14/ks-closure
Today we decided to halt our Kickstarter campaign. In the past few weeks, Meta Mesh and its volunteers have had to face a lot of challenges, both in the business and personal realms. We received wide support from many of those we directly asked. For that, we are terrifically grateful.
We have decided to change the direction our company is headed. In no way are we finished. In fact, this Kickstarter experience revealed a lot to us about who we want to be and how to be it.
In the upcoming months we will be expanding PittMesh, launching a webstore where pre-configured routers can be purchased, and will be building a dedicated PittMesh Working Group where people who want to contribute to building a Community Wireless Network can learn about new technology, can gain new skills, and can network with inspired people.
Definitely stay tuned to our website and our social media feeds. In fact, mere moments after closing our Kickstarter campaign something occurred which we will announce shortly that has been months in the making and we are incredibly excited about.
We’re not done. No way. As they say, it’s hard to keep a good man down. We’ll be in touch with you all again shortly.
Today is a bittersweet day for me. My youngest is off to college tomorrow morning, and my nest will be empty for the 1st time in more than 20 years. We just got finished eating dinner and I cried for some time when I dropped her off at her mom's (actually, I'm still wiping away tears!).
I guess I'm done w/ being a parent. But I'll never stop being her Dad.
The first Republican primary debates will be "legally" available online only to Fox News cable subscribers. Assuming you don't have TV access to the debate and are bored/interested/depraved enough to want to watch live, look for and post streams in the comments. They are sure to be clamping down on livestreaming services like Periscope, but others might escape notice. Twitter real time search is a great way to find these kinds of links and generally a good source of entertainment during these sorts of live events. Here's the Fox News schedule:
Jon Stewart's last episode of the Daily Show will start at 11pm ET and will last 52 minutes.
The candidates making the cut for the main debate were Donald Trump, Jeb Bush, Scott Walker, Mike Huckabee, Ben Carson, Ted Cruz, Marco Rubio, Rand Paul, Chris Christie, and John Kasich. Seven candidates who did not qualify were invited to participate in the 5:00 PM forum; these were Rick Perry, Rick Santorum, Bobby Jindal, Carly Fiorina, Lindsey Graham, George Pataki, and Jim Gilmore. Because of a rule-change announced by FOX one week before the debate-invitations went out, Graham, Pataki, and Gilmore will participate at 5pm despite averaging below 1% in the five selected polls. (Former IRS Commissioner Mark Everson was excluded from the 5pm tier, along with other relatively-unknown candidates who did not meet the updated invitation-criteria of "consistently being offered to respondents in major national polls as recognized by Fox News.") The five selected polls were conducted by Fox News, Bloomberg, CBS News, Monmouth University, and Quinnipiac University.
I made this as a journal because I didn't want to subject all of Soylent to it, especially since Fox News is not making it easy to watch the debates.
Keep in mind: Republican debate drinking games are dangerous.
The other day, I had the opportunity to take a 5 hour tour of the Hanford Site in Washington State. I figured I’d do a write up of my experience for the curious. I’m not a great writer and mainly going off memory here, so apologies if I make any factual errors.
First, a little background. The Hanford site is located near Richland in South East Washington. During World War 2 and throughout the cold war, they were responsible for enriching Uranium into Plutonium for our nuclear weapons program. Plutonium from Hanford was used in the first atomic bomb detonated in the Trinity test, and in the “Fat Man” atomic bomb dropped on Nagasaki. It is also home of the “B” reactor, the world’s first plutonium production reactor. These days Hanford is known as being the most contaminated nuclear site in the United States.
After getting up at 2 AM in order to reach in Richland in time for the 7:30 AM tour start, we arrived in a nondescript business park in the industrial section of the city. Our IDs were checked, we were given badges, and forced to surrender phones, cameras, and other recording devices (sorry! no pictures). We were then ushered into a small conference room with a television. Our tour guide, a retired nuclear engineer, introduced himself and we watched a cheesy video. Then we boarded a bus and began the drive to the site.
During the journey, we passed by the fuel processing facility for the Columbia Generating Station which is near the Hanford site. The Columbia Generating Station is the only operating nuclear power plant in Washington State and produces 1,170 megawatts of electricity.
Shortly before leaving Richland, we took a brief stop at the HAMMER training area. This is where workers at the Hanford Site train to deal with radiation and other hazards they may encounter. That facility was quite extensive, but we only got to see an above-ground replica of the tanks that were used to dispose of liquid nuclear waste. There are around 200 of these tanks buried on the site, and each tank can hold 500,000 to 1,000,000 gallons of waste. The main purpose of the facility at Hammer is to attempt to develop new tools and technology to remove the remaining waste from the older (and leaking) single walled tanks into newer and safer double walled tanks for storage until the Vitrification plant is completed. Our guide explained that all of the liquid that could be pumped out of the old tanks had already been removed. The trouble is that over time, the waste in the tanks settled at the bottom of the tanks. It’s an interesting engineering problem because this “sludge” is highly toxic, often corrosive, and radioactive. Some of the remaining material has a consistency like peanut butter and some is more like a hard salt cake. The current strategy seems to be lowering robots down the 1 foot wide access tube and breaking up the waste with high pressure water.
We left the HAMMER facility and began our journey to the actual site. We passed the Columbia Generating Station run by Energy Northwest on the way. It sits right on the edge of the Columbia river. We didn’t get very close to it, but it didn’t look like what most people imagine a Nuclear Power plant looks like. It’s a newer version of the infamous Fukushima reactor in Japan. An unremarkable industrial building with several short cooling towers giving off steam. The plant is a closed loop plant, which means that the water that is heated by the reactor to drive the steam turbines never makes contact with the outside world. After it goes through the turbines, it is pumped into the cooling towers where the pipes are cooled evaporatively with water from the Columbia River, which is returned to the river after being allowed to cool off.
After about a 10 minute drive, we hit the security gate. An armed guard in a military-style uniform waved us on the site. I don’t know if they actually use the military to guard the facility, and I saw many private security guards around some of the construction sites.
Now we were on the site itself. It’s worth mentioning that the vast majority of Hanford is just empty desert. If you ignore the lack of farms, suspicious number of high tension power lines, and little yellow “Danger: Radiation” signs you see everywhere, you’d have little indication that you are on a nuclear site. Most of the facilities have been torn down or cocooned. Occasionally you’ll see a flat spot or a concrete pad where a building used to be. I even saw an old road running through the road we were on at a 45 degree angle. It looked like they’d just added a 2 foot layer of dirt and paved the road we were traveling on right over it.
The part we were currently in was where the reactors were built. Most of these have been completely shut down and closed off, and there was very little activity in this area. It’s also the old site of the towns of Hanford and White Bluffs, which were reclaimed when the site was founded. Very little remained of the towns. Hanford High School and the White Bluffs Bank are the only structures that are still standing. The only other evidence of the towns are the old trees planted by the residents. Trees in that part of the state are pretty rare. You could usually get a good idea of where the old buildings are by looking for them. For instance, near where the Hanford railroad station used to be are a row of trees planted neatly next to the railroad tracks.
The first building we passed that was part of the actual facility was the fuel processing plant, where fuel would be prepared for the reactors. This building hadn’t been torn down yet because the ground under it was highly contaminated. The building itself is blocking the radiation in the ground. They are currently trying to figure out a way to remove the contaminated soil without collapsing the building on top of it. One idea was to remove the soil underneath the building slowly and backfill it as they went.
The reactors themselves were mostly shrouded in concrete, de-fueled, and closed off. Unfortunately, they weren’t very exciting to look at. Basically just three to four story tall windowless concrete buildings. The first two we saw were involved in the generation of enriched uranium for our nuclear weapons program. There were another two smaller reactors that were used as research reactors. These had the classic concrete domed structures you’d expect to see. Only one of the reactors at Hanford was actually used for power generation. Although safer than the Chernobyl reactor, it was shut down shortly after the disaster because it had a similar design. The reactors were given letter names roughly alphabetically. The “K” reactors are an interesting exception. During the construction of the first K reactor, a problem was found with the design, so they built a re-designed version only yards away. Eventually they were able to fix the problem with the first reactor and they now stand side by side.
The “B” reactor was our first time off the bus. It’s about 4 stories tall and the first production reactor in the world. Fuel produced at the plant was used in the Trinity test device, and the “Fat Man” bomb dropped on Nagasaki. We were led inside the plant, and after a short hallway we were standing feet from the face of the reactor. The reactor itself was about 3 stories tall, and had hundreds of high-pressure water pipes and countless valves leading to the pipes. There were several cranes and gantries that were used to make adjustments, add fuel, and preform maintenance. After watching a short video, we were allowed to explore the building for about a half hour. A lot of the building was roped off, but apparently you can explore more of it during the specific reactor tours.
The control room might be of particular interest to the folks here. It’s remarkable how sophisticated the all-analog equipment was. Instead of CRTs or LCD displays, spools of paper unwound behind glass panels while arms tracked performance of the reactor by drawing on the paper. There was an entire wall of gauges monitoring the water pressure of all the previously mentioned pipes going into the face of the reactor. These were plumbed directly into the reactor. Behind the panel was a small access hallway with a dizzying array of pipes and valves servicing the gauges. I imagine it was rather loud in the control room when it was operating.
All these pipes and valves were serviced by a pumphouse (a separate building) that would filter and pump millions of gallons of water through the reactor directly from the Columbia river. The water would emerge moments later nearly boiling (not bad for a pile of rocks) and be pumped off to a cooling pit, then pumped directly back into the Columbia river.
This area of the site had quite a bit more activity than where the other reactors were. Once we boarded the bus again, dump trucks carrying loads of contaminated dirt were a common sight. Our guide also pointed out some of the areas where the tanks were buried. The tank sites were all roped off and there were little yellow radiation signs every 5 feet or so in a grid. There wasn’t much to see aboveground. Just shallow hills with pipes sticking out of the ground, some electrical boxes, fire hydrants, and concrete blocks to protect them from vehicles.
We continued on to the area where the irradiated uranium from the reactors was refined and processed into plutonium for the nuclear weapons. I suspect this was the main reason for the tight security as the next set of buildings would create diplomatic incidents if discovered in the wrong countries. Here things were very busy. Most of the processing plants were in the process of being entombed or decommissioned, and there were lots of construction vehicles and trailers surrounding the plants. The plants themselves were pretty generic looking. Five story tall windowless concrete buildings, probably about 200 meters long with a single smokestack at one end. Most of them had loading docks for trucks, and one of them even had a door over railroad tracks so the material could be unloaded directly inside.
For obvious reasons, we couldn’t get very close to the processing plants. We did watch a short video about them on the bus. This told the story of the “McCluskey Room” in the Plutonium Finishing Plant. While Harold McCluskey was extracting Americium in a glove box, there was an explosion and the entire room was covered in radioactive material and nitric acid. McCluskey was exposed to the highest dose of radiation from americium ever recorded, and the room was sealed off. Only recently have workers been able to re-enter the room and begin decontaminating it. The Plutonium Finishing plant still stands, but is likely to be demolished within the next year or two. If you’re interested in seeing it, you’d better sign up for a tour soon! McCluskey died of natural causes in 1987 at age 75.
The Plutonium Finishing Plant (“Z plant”) was the last step in plutonium construction at the site. It was also one of the most heavily guarded sites at Hanford. After the plutonium “buttons” were produced, they were stored in a heavily guarded vault on the site. The last plutonium stored there left the facility in 2009, along with the armed guards and heavy restrictions on the employees of the facility.
The tour shifted gears here. Now the focus was much heavier on the decontamination efforts and the purposes of some of the new buildings and the ones under construction. Our next stop was the “Environmental Restoration Disposal Facility” err, landfill. This was where low level nuclear waste and hazardous materials such as asbestos and lead were buried. If you’ve ever been to a conventional landfill you have a pretty good idea of what this looked like. The waste is sealed in large plastic bags and dumped into pits. Water trucks and workers spraying the smooth, sandy ground with hoses were everywhere, giving the site an appearance eerily similar to a beach. The air quality is heavily monitored in the area.
We had two stops left on our tour. The first stop was a water treatment plant specializing in treating groundwater in the area. As you’d expect, it’s a dizzying array of shiny pipes and tanks. Water is pumped up from the contaminated aquifer, treated with microbes that absorb the radiation, then returned to the aquifer in strategic locations in an attempt to flush out the contamination. The water that leaves the plant is safe enough to drink. The radioactive microbe slurry is deposited into dump trucks, then ferried off for further processing, or to be put in the landfill.
Our final stop on the site was the vitrification plant. Along the way we passed a large pit containing the spent reactors from nuclear submarines and ships. The vitrification plant has been under construction since the early 2000s and is expected (provided funding doesn’t dry up) to be completed sometime around 2030. It’s a massive facility that will separate and process the high-level nuclear waste located in the tank farms and elsewhere into a glasslike substance. The glass is very stable, and will be put in steel canisters until the radiation decays. The original plan was to ship the canisters to Yucca mountain, but with that project on hold, it is uncertain what the fate of the nuclear waste will be.
As we drove out of the site, we also passed the LIGO Hanford observatory. It is unrelated to the Hanford site, but it was pretty neat to see anyway. Apparently scientists are firing lasers down 4KM long tubes to attempt to detect gravity waves. There is a sister site in Louisiana to rule out any false readings from local interference. I don’t know much more about it, but the facility was very impressive.
Hanford offers tours of the site to the public. The 5 hour tour that we went on was focused more the decontamination efforts and requires that participants have US citizenship and ID. There were also no cameras, phones, or recording devices allowed on the 5 hour tour. If you are more interested in the Historic B Reactor, they also offer a shorter tour of that, and you can bring your cell phones and cameras. I’d recommend the B reactor tour if you’re more interested in the historical and technology side. The B reactor also looks like a multiplayer map in Half-Life, so it’d probably fun if you’re into industrial/nuclear porn.
// ==UserScript==
// @name Soylent Upgrade
// @match http://soylentnews.org/*article.pl*
// @match https://soylentnews.org/*article.pl*
// @match http://soylentnews.org/*submit.pl*
// @match https://soylentnews.org/*submit.pl*
// @match http://soylentnews.org/*admin.pl*
// @match https://soylentnews.org/*admin.pl*
// @match http://soylentnews.org/*comments.pl*
// @match https://soylentnews.org/*comments.pl*
// @match http://soylentnews.org/*journal.pl*
// @match https://soylentnews.org/*journal.pl*
// ==/UserScript==// 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// 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
}
}if (stripEmail && window.location.href.search(/https?\:\/\/soylentnews\.org.*?\/submit\.pl/)!=-1) // Empty email input area, but only on submission page
{
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, and Story Preview
if (window.location.href.search(/https?\:\/\/soylentnews\.org.*?\/(submit|admin)\.pl/)!=-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].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])'([a-z])/gi,function(m, p1, p2){return p1+'\\''+p2.toLowerCase();}).replace(/\\bx(86|64)\\b/gi,'x$1').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" || boxes[x].value == "update"))
{
// 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);}");
}
}
}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);// 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+"]);");
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
// 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;"];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],[8216,8221],[8226],[8230],[8251],[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],[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],[65533],[127744,127756],[127759],[127775,127776],[127797],[127801],[127804,127812],[127817],[127820,127822],[127828,127831],[127838,127839],[127843],[127849],[127855],[127860,127867],[127891],[127904,127911],[127918],[127939],[127942],[127977],[128025],[128074,128078],[128123,128131],[128137,128142],[128148,128150],[128152],[128158],[128161,128164],[128168,128170],[128172],[128176,128177],[128187],[128189,128190],[128193,128194],[128197],[128203,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,128510],[128659],[128684,128685]];
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",":-)",":^)","(^_^;)","\u0028\u00A0\u0361\u00B0\u00A0\u035C\u0296\u00A0\u0361\u00B0\u0029","\u0028\u00A0\u0361\u007E\u00A0\u035C\u0296\u00A0\u0361\u00B0\u0029\uFEFF","\u00AF\u005C\u005F\u0028\u30C4\u0029\u005F\u002F\u00AF","\u0028\u256F\u00B0\u25A1\u00B0\uFF09\u256F\uFE35\u00A0\u253B\u2501\u253B","\u0028\u30CE\u0CA0\u76CA\u0CA0\u0029\u30CE\u5F61\u253B\u2501\u253B","\u0028\u0060\uFF65\u03C9\uFF65\u00B4\u0029","\u0CA0_\u0CA0","\u0295\u2022\u1D25\u2022\u0294","\u0028\u3065\uFFE3\u00A0\u00B3\uFFE3\u0029\u3065","\u0669\u0028\u204E\u275B\u1D17\u275B\u204E\u0029\u06F6","\u30FD\u0F3C\u0E88\u0644\u035C\u0E88\u0F3D\uFF89"]); // Add in arbitrary emoticons
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+1<smiles.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);
}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://'); 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]) + '<strike>'+area.value.substring(sel[0],sel[1])+'<\/strike>' + 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 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) { if ('selectionStart' in area) { if (area.selectionStart != area.selectionEnd) { area.value = area.value.substring(0,area.selectionStart) + '<ol><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>'; while(listitem = prompt('Enter a list item. Leave the box empty or press Cancel to complete the list:', '')) { temp += '<li>' + listitem + '<\/li>\\n'; } 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'; } 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) } }"));document.getElementsByTagName('head')[0].appendChild(temp); // Add script to page