/*
	Javascript for the categories dropdown
*/
Cats = {
	p: {
		i: {
			catsList: 'categories-list',
			catsShow: 'categories-show',
			catsLoading: 'categories-loading'
		},
		c: {
			ch: 'children',
			chc: 'children-click',
			tshow: 'tree-show',
			thide: 'tree-hide'
		},
		t: {
			show: "+ ",
			hide: "o "
		},
		u: {
			catsLoadingImg: '/smallbeds/wp-content/themes/green-bridge-10/img/cats_loading.gif',
			catsURL: '/smallbeds/',
			catsURLParams: {
				'cats' : 'ajax'
			}
		}
	},

	HTML: {
		// Change all classes of child elements within an element
		changeClasses: function(elem,childTag,from,to) {
			children = elem.getElementsByTagName(childTag);

			forEach(children, function(c) {
				if (hasElementClass(c, from)) {
					removeElementClass(c, from);
					addElementClass(c, to);
					c.style.display = "none";
				}
			});
		},

		insertAfter: function(nu, old) {
			if (old.nextSibling) {
				old.parentNode.insertBefore(nu, old.nextSibling);
			} else {
				old.parentNode.appendChild(nu);
			}
		},
		catsAJAXLoading: function() {
			return DIV({id: Cats.p.i.catsLoading}, IMG({src: Cats.p.u.catsLoadingImg }), "Categories loading...");
		},
		catsAJAXInsert: function(iH) {
			var d = DIV();
			d.innerHTML = iH;
			return d;
		}
	},

	Dynamic: {
		// Add handlers to all ancestors of elem, of that type
		addHandlers: function(elem,childTag) {
			children = elem.getElementsByTagName(childTag);
			forEach(children, function(c) {
				// Create clickdrop link
				var clickDrop = document.createElement("a");
				clickDrop.href = "#";
				clickDrop.appendChild(document.createTextNode(Cats.p.t.show));
				clickDrop.onclick = Cats.Dynamic.showOrHide;
				addElementClass(clickDrop, Cats.p.c.tshow);

				// Append clickDrop link
				c.insertBefore(clickDrop, c.childNodes[0]);

				// Disappear the clickdrop link if no children
				if (c.getElementsByTagName("ul").length == 0) {
					clickDrop.style.visibility = "hidden";
				}
			});
		},
		showOrHide: function(makeVis) {
			var elem = this.parentNode;

			var makeVis = (this.childNodes[0].nodeValue == Cats.p.t.show);

			// Change link - swap it over
			this.childNodes[0].nodeValue = (makeVis ? Cats.p.t.hide : Cats.p.t.show);
			removeElementClass(this, (makeVis ? Cats.p.c.tshow : Cats.p.c.thide));
			addElementClass(this, (makeVis ? Cats.p.c.thide : Cats.p.c.tshow));
			

			forEach(elem.childNodes, function(c) {
				if (c.tagName == "UL") {
					(makeVis ? blindDown(c) : blindUp(c));
					//toggle(c, 'blind');
				}
			});
			return false;
		},
		show: function() {
			Cats.Dynamic.showOrHide(this,true);
		},
		hide: function() {
			Cats.Dynamic.showOrHide(this,false);
		}
	},

	AJAX: {
		loadCatsOverElem: function(elem) {
			var loadElem = Cats.HTML.catsAJAXLoading();
			swapDOM(elem, loadElem);
			Cats.AJAX.loadCatsGET(loadElem);
		},
		loadCatsGET: function(elem) {
			var d = doSimpleXMLHttpRequest(
				Cats.p.u.catsURL,
				Cats.p.u.catsURLParams
			);
			d.addCallback(Cats.AJAX.loadCatsOverwrite, elem);
		},
		loadCatsOverwrite: function(elem, xhr) {
			swapDOM(elem, Cats.HTML.catsAJAXInsert(xhr.responseText));
			Cats.goCats();
		}
	},

	goCats: function(catsElem) {
		if (typeof catsElem == "undefined") {
			var catsElem = $(Cats.p.i.catsList);
		}
		if (catsElem) {
			Cats.mungeCatClasses(catsElem);
			return true;
		}
		return false;
	},

	mungeCatClasses: function(cats) {
		Cats.HTML.changeClasses(cats, "ul", Cats.p.c.ch, Cats.p.c.chc);
		Cats.Dynamic.addHandlers(cats, "li");
	},

	goCatsOnClick: function() {
		var catsShow = $(Cats.p.i.catsShow);
		Cats.AJAX.loadCatsOverElem(catsShow);
		return false;
	},

	go: function() {
		// Do we already have categories?
		var catsElem = $(Cats.p.i.catsList);
		// Do we have a target for AJAX to dump the categories into
		var catsShow = $(Cats.p.i.catsShow);

		// If existing cats, munge the classes to be Javascripty
		if (Cats.goCats(catsElem)) {
			Cats.mungeCatClasses(catsElem);
		// Otherwise, if we've an AJAX target, make the link in the target clickable
		} else if (catsShow) {
			catsShow.getElementsByTagName("a")[0].onclick =  Cats.goCatsOnClick;
		}
	}
};

connect(window, 'onload', Cats.go);
