/***************************************************************
*  Copyright notice
*  
*  (c) 2007 cron IT GmbH
*  All rights reserved
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
/** 
 * @author	Ernesto Baschny <ernst@cron-it.de>
 */
/*
 * General javascript helper functions
 *
 */

/* Get an object based on the ID */
function getObj(id) {
  if (document.getElementById) {
    return document.getElementById(id);
  }
  else if (document.all) {
    return document.all[id];
  }
  else if (document.layers) {
    return document.layers[id];
  }
}

/* Get elements by a class name */
function getElementsByClass(searchClass, node, tag) {
	var classElements = new Array();
	if (node == null)
		node = document;
	if (tag == null)
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if (pattern.test(els[i].className)) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}


function toggleDisplayNew(field) {
	var toggleDiv = document.getElementById(field + '_toggle');
		
	if (!toggleDiv) {
		toggleDisplay(field);
		return false;
	}
	
	var toggleEleArr = toggleDiv.getElementsByTagName('div');
	var i = 0;
	for (i; i<toggleEleArr.length; i++) {
		if (toggleEleArr[i].className == 'toggleTag') {
			toggleDisplay(toggleEleArr[i].getAttribute('id'));
		}
	}
	
	var toggleEleArr = toggleDiv.getElementsByTagName('span');
	var i = 0;
	for (i; i<toggleEleArr.length; i++) {
		if (toggleEleArr[i].className == 'toggleTag') {
			toggleDisplay(toggleEleArr[i].getAttribute('id'));
		}
	}
}


/*
 * Toggle the display of some object by its id
 * 
 * If id_plus and id_minus exists, they will be considered
 * expander elements and also be toggled accordingly
 */
function toggleDisplay(id) {
	var div;
	if (typeof id == 'object') {
		div = id;
	} else {
		div = getObj(id);
	}
	if (!div) { return; }

	var plus = getObj(id + '_plus');
	var minus = getObj(id + '_minus');
	if (div.style.display == 'none') {
		div.style.display = 'block';
		if (plus) { hide(plus); }
		if (minus) { show(minus); }
	} else {
		div.style.display = 'none';
		if (plus) { show(plus); }
		if (minus) { hide(minus); }
	}
}

/* Hide some object by id */
function hide(id) {
	var div;
	if (typeof id == 'object') {
		div = id;
	} else {
		div = getObj(id);
	}
	if (!div) { return; }
	var plus = getObj(id + '_plus');
	var minus = getObj(id + '_minus');
	if (plus) { show(plus); }
	if (minus) { hide(minus); }
	div.style.display = 'none';
}

/* Shows some object by id */
function show(id) {
	var div;
	if (typeof id == 'object') {
		div = id;
	} else {
		div = getObj(id);
	}
	if (!div) { return; }
	var plus = getObj(id + '_plus');
	var minus = getObj(id + '_minus');
	if (plus) { hide(plus); }
	if (minus) { show(minus); }

	div.style.display = getStandardDisplay(div.nodeName);
}

/* determines the browsers default display value for a given tagname */
function getStandardDisplay(tag) {
	var elem = document.createElement(tag);
	var body = document.getElementsByTagName("body")[0];
	body.appendChild(elem);
	var display;
	if (document.defaultView) {
		display = document.defaultView.getComputedStyle(elem, null).display;
	} else if (elem.currentStyle) {
		display = elem.currentStyle['display'];
	}
	body.removeChild(elem);
	return display;
}


/* Hides all other tabs and display only id
 * - Tabs must have class="<selectorClass>" id="tab<tabId>"
 * - Tab-Content must have class="<tabClass>" id="<tabId>" and be of style "block" 
 */
function selectTab(id, tabClass, selectorClass, highlightClass) {
	// Display correct tab content
	var els = getElementsByClass(tabClass, null, null);
	for (i = 0; i < els.length; i++) {
		if (els[i].id == id) {
			els[i].style.display = 'block';
		} else {
			els[i].style.display = 'none';
		}
	}
	// Highlight the current tab selector, de-highlight all others
	var els = getElementsByClass(selectorClass, null, null);
	var pattern = new RegExp("(^|\\s)"+highlightClass+"(\\s|$)");
	for (i = 0; i < els.length; i++) {
		if (pattern.test(els[i].className)) {
			// De-highlight all
			els[i].className = els[i].className.replace(new RegExp("(^|\\s)"+highlightClass+"(\\s|$)"), '');
		}
		if (els[i].id == 'tab'+id) {
			els[i].className = els[i].className+' '+highlightClass;
		}
	}
}

/**
 * adds a css class to a given element
 * @param element element which shall have this class
 * @param newClass classname
 */
function addClass(element, newClass) {
	if (element.className) {
		var hasClass = false;
		var classes = element.className.split(" ");
		for (var i=0; i<classes.length; i++) {
			if (classes[i] == newClass) {
				hasClass = true;
				break;
			}
		}
		if (!hasClass) {
			element.className += " " + newClass;
		}
	} else {
		element.className = newClass;
	}
}


/**
 * removes a css class from a given element
 * @param element element which shouldn't have this class anymore
 * @param className class to be removed
 */
function removeClass(element, className) {
	if (element.className) {
		var classes = element.className.split(" ");
		var newClasses = new Array();
		for (var i=0; i<classes.length; i++) {
			if (classes[i] != className) {
				newClasses.push(classes[i]);
			}
		}
		element.className = newClasses.join(" ")
	}
}
