ToodleDo Folder Categories

By jgallen23 Last update Jan 8, 2009 — Installed 651 times.

There are 1 previous version of this script.

// ==UserScript==
// @name           ToodleDo Folder Categories
// @namespace      http://userscripts.org
// @description    Allows folders to be grouped
// @include        http://www.toodledo.com/views/folder.php*
// ==/UserScript==

//VERSION 1.1

var toodleDoLeftTabs = function() {

	var tabWidth = 200;
	var DEBUG = false;
	var log = function(item) {
		if (DEBUG)
			unsafeWindow.console.log(item);
	};

	var $ = function(id) {
		return document.getElementById(id);
	};

	var addGlobalStyle = function(css) {
		var head, style;
		head = document.getElementsByTagName('head')[0];
		if (!head) { return; }
		style = document.createElement('style');
		style.type = 'text/css';
		style.appendChild(document.createTextNode(css));
		head.appendChild(style);
	}

	var changeTabStyle = function() {
		addGlobalStyle(
			"#tabs { overflow: none; float: left; height: auto; width: " + tabWidth + "px; }"+
			".tab { float: none; }"+
			".tabon { float: none; }"+
			".tab, .tabon { height: 12px; }"+
			".tab a, .tabon a { font-size: 12px; }"+
			"#moretabs { display: none; }"
		);
	};

	var createContainer = function() {
		var container = document.createElement('div');
		container.id = "contentContainer";
		var head = $("head");
		head.parentNode.insertBefore(container, head);
		var width = getContainerWidth();
		addGlobalStyle(
			"#contentContainer { float: left; }" 
		);
		resizeContainer();
	};

	var resizeContainer = function() {
		$("contentContainer").style.width = getContainerWidth()+"px";
	};

	var getContainerWidth = function() {
		var mainWidth = $("main").offsetWidth; 
		var tocWidth = $("toc").offsetWidth;

		var newWidth = mainWidth - tabWidth - 50; 
		return newWidth;
	};

	var moveElements = function() {
		var elements = ['head', 'sharetask', 'filtertask', 'sorttask', 'searchtask', 'toolbar', 'tip', 'colhead', 'tasks'];
		for (i in elements) {
			moveElement(elements[i]);
		}
	};

	var moveElement = function(id) {
		var container = $("contentContainer");
		var element = $(id);
		if (element) 
			container.appendChild($(id));
	};

	var initResizeListener = function() {
		window.addEventListener("resize", function() { resizeContainer() }, false);
	};

	var initTOCListener = function() {
		$("tocc").addEventListener("click", function() {
			setTimeout(resizeContainer, 200);
		}, false);
		$("toco").addEventListener("click", function() {
			setTimeout(resizeContainer, 200);
		}, false);
	};

	window.addEventListener("load", function() { 
		initResizeListener();
		initTOCListener();
		changeTabStyle();
		createContainer();
		moveElements();
	}, false);
};


var toodleDoFolderCategories = function() {
	var DEBUG = false;
	var folderCategories;
	var tabList;

	var log = function(item) {
		if (DEBUG)
			unsafeWindow.console.log(item);
		//console.log(item);
	};

	var $ = function(id) {
		return document.getElementById(id);
	};

	var addGlobalStyle = function(css) {
		var head, style;
		head = document.getElementsByTagName('head')[0];
		if (!head) { return; }
		style = document.createElement('style');
		style.type = 'text/css';
		style.appendChild(document.createTextNode(css));
		head.appendChild(style);
	}

	var addFolderCategories = function() {
		var y = 1;
		var categoriesElement = document.createElement('div');
		var tabContainer = $("tabs");
		tabContainer.insertBefore(categoriesElement, tabContainer.getElementsByTagName("div")[1]);
		for (var key in folderCategories) {
			var groupElement = document.createElement('div');
			var id =  "folderGroup_"+key;
			groupElement.id = id;
			groupElement.className = "folderGroup tab";
			if (cookie.read(id) == "closed")
				groupElement.className += " folderGroupClosed";
			var spanElement = document.createElement("span");
			spanElement.innerHTML = folderCategories[key];
			spanElement.addEventListener("click",function() {
				var parent = this.parentNode;
				if (parent.className.indexOf("folderGroupClosed") == -1) {
					parent.className += " folderGroupClosed";
					cookie.create(parent.id, "closed", 365);
				}
				else {
					parent.className = "folderGroup tab";
					cookie.erase(parent.id);
				}
			}, false);
			groupElement.appendChild(spanElement);
			categoriesElement.appendChild(groupElement);
			moveTabsToGroup(key, groupElement);
			y++;
		}
	};

	var addFolderCategorieStyle = function() {
		addGlobalStyle(
			".folderGroup { height: auto; margin:0; background: 0; }"+
			".folderGroup span { display: block; cursor: pointer; font-size: 13px; padding: 3px 0; }"+
			".folderGroup .tab { border: 0;}"+
			".folderGroup.folderGroupClosed div { display: none; }"+
			".folderGroup .tab a, .folderGroup .tabon a { font-weight: normal; }"
		);
	};

	var moveTabsToGroup = function(key, groupElement) {
		var re = new RegExp(" -?"+key+"$");
		for (var i = 0; i < tabList.length; i++) {
			var tabName = getTabName(tabList[i]);
			var match = re.exec(tabName);
			if (match) {
				setTabName(tabList[i], tabName.replace(re, ""));
				if (match[0].indexOf("-") != -1) {
					log(tabList[i]);
					tabList[i].style.display = "none";
				}
				groupElement.appendChild(tabList[i]);
			}
		}
	};

	var getTabList = function() {
		var tabContainer = $("tabs");
		return tabContainer.getElementsByTagName("div");
	};

	var getTabName = function(tab) {
		if (tab.getElementsByTagName("a").length != 0) {
			var text = tab.getElementsByTagName("a")[0].innerHTML;
			if (text.indexOf("<i>") != -1)
				text = text.substr(0, text.indexOf(" <i>"));
			return text;
		}
		return '';
	};

	var setTabName = function(tab, tabName) {
		if (tab.getElementsByTagName("a").length != 0) {
			var href = tab.getElementsByTagName("a")[0];
			var text = href.innerHTML;
			if (text.indexOf("<i>") != -1) {
				href.innerHTML = text.replace(/(.*?)<i>/, tabName+" <i>");
			}
			else
				href.innerHTML = tabName;
		}
	};

	var getTabFromList = function(name) {
		var list = getTabList();
		for (var i = 0; i < list.length; i++) {
			if (getTabName(list[i]) == name)
				return list[i];
		}
		return false;
	};

	var hideFolders = function() {
		var tabs = getTabList();
		log(tabs);
		for (var i = 0; i < tabs.length; i++) {
			for (var x = 0; x < hiddenFolders.length; x++) {
				if (hiddenFolders[x] == getTabName(tabs[i])) {
					log(getTabName(tabs[i]));
					tabs[i].style.display = "none";
					continue;
				}
			}
		}
	};

	var getCategoryKey = function(folderName) {
		var re = new RegExp("z* (.*) (\\w.*)$");
		match = re.exec(folderName);
		if (match) {
			return [match[2], match[1]];
		} else {
			return '';
		}
	};

	var getFolderCategories = function() {
		var folderCategories = {};
		var toRemove = []
		tabList = getTabList();
		for (var i = 0; i < tabList.length; i++) {
			var name = getTabName(tabList[i]);
			if (name.indexOf('z*') == 0) {
				var key = getCategoryKey(name);
				folderCategories[key[0]] = key[1];
				toRemove.push(tabList[i]);
			}
		}
		for (var i = 0; i < toRemove.length; i++) {
			toRemove[i].parentNode.removeChild(toRemove[i]);
		}
		log(folderCategories);
		return folderCategories;
	};

	var onload = function() {
		folderCategories = getFolderCategories();
		tabList = getTabList();
		addFolderCategorieStyle();
		addFolderCategories();
		//TODO
		//hideFolders();
	};

	window.addEventListener("load", onload, false);
};

var cookie = {
	create: function(name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	},
	read: function(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	},
	erase: function(name) {
		this.create(name,"",-1);
	}
}

new toodleDoLeftTabs();
new toodleDoFolderCategories();