By JohnM
Has 5 other scripts.
// ==UserScript==
// @name Digg Custom Tabs
// @namespace http://digg.com
// @description Add custom tabs(or topics), such as searches to the sidebar along with technology, science, view all, videos, etc.
// @include http://digg.com/*
// @include http://*.digg.com/*
// ==/UserScript==
//Lots of other stuff based on the GMail Saved Searches Script from http://persistent.info/archives/2005/03/01/gmail-searches, by mihai
var cTabs=new Array();
var header;
var gmCustomize;
const defaultTabs = {
"Google": "http://digg.com/search?area=all&age=all&sort=new&search-buried=1&s=Google&submit=Search",
"Yahoo": "http://digg.com/search?area=all&age=all&sort=new&search-buried=1&s=Yahoo&submit=Search"
};
//const RED_X="data:image/gif,GIF89a%0C%00%0C%00%80%00%00%FF%00%00%FF%FF%FF!%F9%04%01%00%00%01%00%2C%00%00%00%00%0C%00%0C%00%00%02%19%0C%1E%99%B8l~%80r-%D2z%B1%DA%2Fc%C9Y%D16v%13UfQ%01%00%3B";
const RED_X="data:image/gif;base64,R0lGODlhEAAQAJEAAP8AAP%2F%2F%2F%2F%2F%2F%2FwAAACH5BAEAAAIALAAAAAAQABAAAAIdjI%2Bpy%2B1vAECSyRluu9px%2BHkctnSdUh0pxLYuVAAAOw%3D%3D";
const TABS_COOKIE="gm-diggtabs_";
insertStyle();
loadTabs();
addTabs();
checkPageLocation();
function insertStyle(){
const RULES = new Array(
// Edit page
".innerContainer {text-align: left;}",
".tabList {width: 100%;}",
".tabList th {text-align: left;}",
".tabList td {padding: 0 0 0 0; vertical-align: bottom;}",
".tabList td.divider {height: 2px; padding: 0;}", //#80A71F
".editItem {font-size: 120%;}",
".labelCell {width: 180px;}",
".labelCell input {width: 170px;}",
".editCell {width: 100%}",
".editCell input {width: 94%}",
".saveButton {margin-left: 5px; margin-right: 5px; font-weight: bold;}",
".cancelButton {margin-right: 5px; font-weight: bold;}",
".addTabButton {margin-left: auto; margin-right: 0px; font-weight: bold; text-align: right;}",
"img.redx {border: 1px solid #ccc; vertical-align: bottom; padding: 1px; margin-left: 3px;}",
//Save Search
"a.saveSearch {font-weight: normal; vertical-align: middle;}"
);
GM_addStyle(RULES.join("\n"));
}
function loadTabs(){
var cookie;
cTabs=new Array();
if ((cookie=getCookie(TABS_COOKIE)) != null) {
var serializedTabs = cookie.split("|");
for (var i=0; i < serializedTabs.length; i++) {
cTabs.push(getTabfromString(serializedTabs[i]));
}
} else {
for (var query in defaultTabs) {
cTabs.push(new CustomTab(query, defaultTabs[query]));
}
}
}
function addTabs(){
header = document.getElementById("header-primary");
if (header!=null){
header=header.childNodes[1];
GM_log(header);
GM_log("header: "+header.tagName);
var customize=header.childNodes[header.childNodes.length-1];
var lir;
for (var i=0;i<cTabs.length;i++){
lir = document.createElement("li");
lir.name="sidebar_cTabs";
lir.id="sidebar_cTabs_"+i;
lir.className = "view-all";
lir.innerHTML="<a href="+cTabs[i].location+"><strong>"+cTabs[i].label+"</strong></a>";
header.insertBefore(lir,customize);
}
//GM_log(ulr[1].innerHTML);
}
}
function refreshTabs(){
header = document.getElementById("header-primary").firstChild;
var tab;
for (var i=0;(tab=document.getElementById("sidebar_cTabs_"+i))!=null;i++){
header.removeChild(tab);
}
addTabs();
}
function checkPageLocation(){
//<div id="sidebar"><h3>Username</h3>
//var username=sidebar.innerHTML.match(/<h3>([a-zA-Z0-9]+)<\/h3>/)[1];
//GM_log("Username="+username);
//http://digg.com/users/JohnM5/edit/topics
if (document.location.toString().match(/http:\/\/.*digg.com\/users\/([a-zA-Z0-9]+)\/edit\/topics/))
insertCustomize();
else if (document.location.toString().match(/http:\/\/.*digg.com\/search.*/))
insertAddSearch();
}
function insertCustomize(){
//alert('Customize!');
GM_log("Customize!");
var contents=document.getElementById("wrapper");
gmCustomize=document.createElement('fieldset');
gmCustomize.id="gmCustomize";
var legend=document.createElement('legend'); legend.innerHTML="Custom Tabs";
gmCustomize.appendChild(legend);
var innerContainer = document.createElement("div");
innerContainer.className = "innerContainer";
innerContainer.innerHTML +=
'<p>Delete an items label or location to remove it.</p>';
gmCustomize.appendChild(innerContainer);
var tabList
tabList = document.createElement("table");
tabList.className = "tabList";
tabList.id = "tabList";
innerContainer.appendChild(tabList);
var headerRow = document.createElement("tr");
tabList.appendChild(headerRow);
headerRow.appendChild(document.createElement("th")).appendChild(document.createTextNode("Label"));
headerRow.appendChild(document.createElement("th")).appendChild(document.createTextNode("Location"));
for (var i=0; i < cTabs.length; i++) {
var tab=cTabs[i];
tabList.appendChild(getEditItem(tab,i));
if (i!=cTabs.length-1){
var dividerRow = document.createElement("tr");
var dividerCell = dividerRow.appendChild(document.createElement("td"));
dividerCell.className = "divider";
dividerCell.colSpan = 3;
tabList.appendChild(dividerRow);
}
}
var newRow = document.createElement("tr");
var newCell = newRow.appendChild(document.createElement("td"));
newCell.colSpan = 3;
newCell.appendChild(document.createTextNode("Create a new tab:"));
tabList.appendChild(newRow);
tabList.appendChild(getEditItem(new CustomTab("","",-1)));
var buttonContainer = document.createElement("div");
buttonContainer.className = "buttonContainer";
var saveButton = document.createElement("button");
saveButton.appendChild(document.createTextNode("Save Changes"));
saveButton.className = "saveButton";
saveButton.addEventListener("click", saveEditCustomTabs, false);
buttonContainer.appendChild(saveButton);
var cancelButton = document.createElement("button");
cancelButton.appendChild(document.createTextNode("Cancel"));
cancelButton.className = "cancelButton";
cancelButton.addEventListener("click", cancelEditCustomTabs, false);
buttonContainer.appendChild(cancelButton);
innerContainer.appendChild(buttonContainer);
contents.appendChild(gmCustomize);
//GM_log(contents.innerHTML);
}
function cancelEditCustomTabs(){
//loadTabs();
refreshEditCustomTabs();
}
function refreshEditCustomTabs(){
var contents=document.getElementById("wrapper");
var gm=document.getElementById("gmCustomize");
contents.removeChild(gm);
insertCustomize();
}
function saveEditCustomTabs(){
cTabs=new Array();
var tabList=document.getElementById("tabList");
for (var row = tabList.firstChild; row; row = row.nextSibling) {
var cells = row.getElementsByTagName("td");
if (cells.length != 2 && cells.length != 3) {
continue;
}
var label = cells[0].getElementsByTagName("input")[0].value;
var query = cells[1].getElementsByTagName("input")[0].value;
if (label && query) {
cTabs.push(new CustomTab(label, query));
}
}
saveTabs();
refreshEditCustomTabs();
//refreshTabs();
}
function insertAddSearch(){
var saveSearch=document.createElement('a');
//<a href="javascript:;" onclick="toggleDisclosureWidget('advanced-search-options');"class="advanced-search">Advanced Options</a>
saveSearch.href="javascript:;";
saveSearch.className="saveSearch";
saveSearch.innerHTML="Save Search";
saveSearch.addEventListener("click", saveSearchToTab, false);
var search=document.getElementById("advanced-search-options");
search.appendChild(saveSearch);
/*
var asToggle;
var thisForm=document.getElementById("thisform");
var node1=thisForm.childNodes[5];
var node2=node1.childNodes[0];
var asToggle=node2.childNodes[1];
node2.insertBefore(saveSearch,asToggle);
*/
}
function saveSearchToTab(){
//alert("Save search to tab");
var loc=document.location;
var label;
var fullSearch=document.location.search.substring(1);//It starts with a ? and we dont want that...
//area=promoted&age=all&sort=new&s=iPod&submit=Search
var splitSearch=fullSearch.split('&');
for (var i in splitSearch){
//GM_log('a: '+splitSearch[i]);
var search=splitSearch[i].split('=');
if (search[0]=='s'){
label=decodeURIComponent(search[1]).replace('+'," ");
break;
}
}
if (label==null) label="Im null!";
cTabs.push(new CustomTab(label, loc));
saveTabs();
//refreshTabs();
}
function saveTabs(){
var serializedTabs = new Array();
for (var i=0; i < cTabs.length; i++) {
serializedTabs.push(cTabs[i].toString());
}
setCookie(TABS_COOKIE, serializedTabs.join("|"));
}
function CustomTab(label, location) {
this.label = label;
this.location = location;
}
CustomTab.prototype.toString = function() {
return "&label="+this.label+"&location="+encodeURIComponent(this.location);
}
function getTabfromString(serialized) {
var loc=serialized.indexOf("&location=");
var label=serialized.substring(7,loc);
var location=decodeURIComponent(serialized.substring(loc+10));
return new CustomTab(label, location);
}
//CustomTab.prototype.getEditItem = function(pos) {
function getEditItem(tab,pos) {
var editItem;
editItem = document.createElement("tr");
editItem.className = "editItem";
var labelCell = document.createElement("td");
labelCell.className = "labelCell";
var labelInput = document.createElement("input");
labelInput.value = tab.label;
labelCell.appendChild(labelInput);
editItem.appendChild(labelCell);
var editCell = document.createElement("td");
editCell.className = "editCell";
var queryInput = document.createElement("input");
queryInput.value = tab.location;
editCell.appendChild(queryInput);
if (tab.label!="" && tab.location!=""){
var redx = document.createElement("img");
redx.src=RED_X;
redx.className="redx";
redx.name=pos;
redx.addEventListener("click", removeTab, false);
editCell.appendChild(redx);
}
editItem.appendChild(editCell);
return editItem;
}
function removeTab(event){
var pos=event.target.name;
//GM_log("Pos: "+pos);
//GM_log('remove tab');
if (pos!=-1){
cTabs.splice(pos,1);
refreshEditCustomTabs();
}
}
function getSearchField(){
var searchField=document.createElement("tr");
searchField.innerHTML=
'<td>'+
'<span class="search">'+
'<input type="text" name="s" id="search" value="" size="30" />'+
'<input type="submit" name="submit" value="Search" />'+
'<select name="area">'+
'<option value="all" selected="selected">All Stories</option>'+
'<option value="promoted">Front Page Stories</option>'+
'<option value="dig">Upcoming Stories</option>'+
'</select>'+
'<select name="age">'+
'<option value="7" selected="selected">Last 7 days</option>'+
'<option value="30">Last 30 days</option>'+
'<option value="365">Last 365 days</option>'+
'<option value="all">From All Time</option>'+
'</select>'+
'<select name="sort">'+
'<option value="new" selected="selected">Newest First</option>'+
'<option value="old">Oldest First</option>'+
'<option value="most">Most Diggs</option>'+
'</select>'+
'<input type="checkbox" name="search-buried" id="search-buried" style="vertical-align: middle;" value="1"/>'+
'<label for="search-buried" style="font-weight: normal;">Include Buried Stories</label>'+
'</span>'+
'</td>';
//var cell=document.createElement('td');
//cell["colspan"]=2;
//cell.innerHTML=
//searchField.appendChild(cell);
return searchField;
}
function setCookie(name, value) {
GM_setValue(name, value);
}
function getCookie(name){
return GM_getValue(name);
}