// Name: Add, remove and find event
// --------------------------------------------------
function addEvent(obj, evt, fn) {
	if (obj.addEventListener) {
		obj.addEventListener(evt, fn, false);
	} else if (obj.attachEvent) {
		obj.attachEvent('on' + evt, fn);
	}
}

function removeEvent(obj, evt, fn) {
	if (obj.removeEventListener) {
		obj.removeEventListener(evt, fn, false);
	} else if (obj.detachEvent) {
		obj.detachEvent('on' + evt, fn);
	}
}

// Function getElementsByClassName by Robert Nyman
var getElementsByClassName = function(className, tag, elm) {
	if (document.getElementsByClassName) {
		getElementsByClassName = function(className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className), nodeName = (tag) ? new RegExp("\\b" + tag + "\\b", "i") : null, returnElements = [], current;
			for ( var i = 0, il = elements.length; i < il; i += 1) {
				current = elements[i];
				if (!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	} else if (document.evaluate) {
		getElementsByClassName = function(className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "), classesToCheck = "", xhtmlNamespace = "http://www.w3.org/1999/xhtml", namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace) ? xhtmlNamespace : null, returnElements = [], elements, node;
			for ( var j = 0, jl = classes.length; j < jl; j += 1) {
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			} catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	} else {
		getElementsByClassName = function(className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "), classesToCheck = [], elements = (tag === "*" && elm.all) ? elm.all : elm.getElementsByTagName(tag), current, returnElements = [], match;
			for ( var k = 0, kl = classes.length; k < kl; k += 1) {
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for ( var l = 0, ll = elements.length; l < ll; l += 1) {
				current = elements[l];
				match = false;
				for ( var m = 0, ml = classesToCheck.length; m < ml; m += 1) {
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};

// Toggle classes on specified element with href
// The function find element with href, then element with id="from href"
function toggle_element() {
	var elem = this;
	if (elem && (elem.href !== null)) {
		elem.blur();
		var getid = elem.href.split('#');
		var id = document.getElementById(getid[1]);
		if (hasClass(id, "hide")) {
			replaceClass(id, "hide", "view");
		} else {
			replaceClass(id, "view", "hide");
		}
	}
	return false;
}
// Initialisation Toggle classes
function toggle_init() {
	var i, ids, targetURL;
	var anch = getElementsByClassName("toggle");
	if (anch.length < 1) {
		return false;
	} // check, if exits any element with "toggle" class
	for (i = 0; i < anch.length; i++) {
		if (anch[i].href !== null) {
			ids = anch[i].href.split("#");
			targetURL = document.getElementById(ids[1]);
			if (!hasClass(targetURL, "hide")) {
				addClass(targetURL, "hide");
			}
			anch[i].onclick = toggle_element;
		}
	}
}

// **** CSS functions ****
// Check if object have class name
function hasClass(e, name) {
	return (!e || !e.className) ? false : new RegExp('\\b' + name + '\\b')
			.test(e.className);
}
// Remove class name from object
function delClass(e, name) {
	return e && (e.className = e.className.replace(new RegExp('^' + name + '\\b\\s*|\\s*\\b' + name + '\\b', 'g'), ''));
}
// Add class name to object
function addClass(e, name) {
	delClass(e, name);
	return e && (e.className += (e.className ? ' ' : '') + name);
}
// Swap class name in object
function replaceClass(e, class1, class2) {
	if (typeof e == 'string') {
		e = document.getElementById(e);
	}
	if (hasClass(e, class1)) {
		delClass(e, class1);
		addClass(e, class2);
		return true;
	} else {
		return false;
	}
}

addEvent(window, 'load', function() {
	toggle_init(); // toggle class on elements
});