// Toolkit.Styles
// See http://api.13thparallel.org/api/dom/ for documentation.
// (c) 2003 13thparallel.org
if(!window.Toolkit) Toolkit = {};

Toolkit.Styles = {
	// String getStyle( Element node, String cssSelector )
	// ex: getStyle(document.getElementById("temp"), "width")
	getStyle : function(node, cssSelector) {
		var value = "", camelCased;
		if(node && node.style) {
			camelCased = Toolkit.Styles.camelCase(cssSelector);
			value = node.style[camelCased];
			if(!value) {
				if(document.defaultView) value = document.defaultView.getComputedStyle(node, "").getPropertyValue(cssSelector); // moz
				else if(node.currentStyle) value = node.currentStyle[camelCased]; // ie
				else if(node.style.getPropertyValue) value = node.style.getPropertyValue(cssSelector); // svg/dom-proper
				else value = node.style[camelCased]; // other
			}
		}
		return value;
	},
		
	// Boolean setStyle( Element node, String cssText )
	// ex: setStyle(document.getElementById("temp"), "color : blue; font-size : 12pt");
	setStyle : function(node, cssText) {
		var values, i = 0, isStyleableNode = false;
		if(node && node.style) {
			isStyleableNode = true;
			values = Toolkit.Styles.parseCSS(cssText);
			while( i < values.length ) {
				if(node.style.setProperty) node.style.setProperty(values[i][0], values[i][1], null);
				else node.style[Toolkit.Styles.camelCase(values[i][0])] = values[i][1];
				i++;
			}
		}
		return isStyleableNode;
	},
	
	// Boolean addClass( Element node, String classNames [, Boolean clearClass] )
	// ex: addClass(document.getElementById("temp"), "red underlined")
	addClass : function(node, classNames, clearClass) {
		var expr, isNode = false, classes = classNames.split(" ");
		if(node && node.className.constructor == String) {
			isNode = true;
			if(!clearClass && node.className != "") {
				for(i = 0; i < classes.length; i++) {
					expr = new RegExp("\\b" + classes[i] + "\\b");
					if( !expr.test(node.className) ) node.className += " " + classes[i];
				}
			} else node.className = classNames.replace(/^\s+|\s+$/g, "").replace(/s{2,}/, " ");
		}
		return isNode;
	},
	
	// Boolean removeClass( Element node, String classNames )
	// ex: removeClass(document.getElementById("temp"), "red underlined tester")
	removeClass : function(node, classNames) {
		var classes, expr, len = 1, removed = false;
		if( node && node.className && node.className != "" ) {
			classNames = classNames.replace(/\s{2,}/g, " ").replace(/(^\s+)|(\s+$)/g, "").split(/\s+/);
			len = classNames.length;
			expr = new RegExp("([\\s^]?)((" + classNames.join(")|(") + "))([\\s$]?)", "g");
			classes = node.className.replace(expr, "$1$" + (len+3)).replace(/(^\s+)|(\s+$)/g, "").replace(/\s{2,}/g, " ");
			if(node.className != classes) removed = true;
			node.className = classes;
		}
		return removed;
	},
	
	// Boolean hasClass( Element node, String className )
	// ex: hasClass(document.getElementById("temp"), "myClass")
	hasClass : function(node, className) {
		var expr = new RegExp("\\b" + className + "\\b"), is = false;
		if(node && node.className) is = expr.test(node.className);
		return is;
	},
	
	// CSSStyleSheet getStyleSheet( String / Int / CSSStyleSheet sheet )
	// ex: getStyleSheet("myStyleSheetTitle")
	// ex: getStyleSheet(0)
	// ex: getStyleSheet( document.styleSheets.item(2) )
	getStyleSheet : function(sheet) {
		var i = 0, ss = null;
		if( typeof sheet == "number" && document.styleSheets.item(sheet) ) ss = document.styleSheets.item(sheet);
		else if(typeof sheet == "object" && sheet.cssRules) ss = sheet;
		else if(typeof sheet == "string" && document.styleSheets && document.styleSheets.length > 0) {
			while(i < document.styleSheets.length && ss == null) {
				if(document.styleSheets.item(i).title == sheet || document.styleSheets.item(i).id == sheet)
					ss = document.styleSheets.item(i);
				i++;
			}
		}
		return ss;
	},
	
	// CSSStyleSheet addStyleSheet( String href, String title, String id, String media, String rel, Boolean disabled)
	addStyleSheet : function(href, title, id, media, rel, disabled) {
		var sheet = document.createElement("link");
		sheet.setAttribute("href", href);
		sheet.setAttribute("type", "text/css");
		sheet.setAttribute("rel", rel ? rel : "stylesheet");
		if(disabled) sheet.disabled = true;
		if(title && title !="") sheet.setAttribute("title", title);
		if(id && id != "") sheet.setAttribute("id", id);
		if(media && media !="") sheet.setAttribute("media", media);
		return document.getElementsByTagName("head").item(0).appendChild(sheet);
	},
	
	// array [ array [ String ] ] parseCSS( String selector, String cssText )
	// ex: parseCSS("font-size : 12pt; width : 100em; height : 2em")
	parseCSS : function(cssText) {
		var values, i = 0, rules = [];
		values = cssText.split(/\s*[:;]\s*/g);
		while(i < values.length) rules[rules.length] = [ values[i++].toLowerCase(), values[i++] ];
		return rules;
	},
	
	// camelCase & selectorCase from tim morgan <http://timmorgan.info/jude/archives/2002/03/03_camelcase_to_selectorcase.html>
	// gotta fix these, apparently they don't work 100% of the time
	
	// String camelCase( String selector )
	// ex: camelCase("font-size")
	camelCase : function(selector) {
		return selector.replace( /\-[^\-]*/g, function(t){return t.substring(1,2).toUpperCase()+t.substring(2)} ) ;
	},
	
	// String selectorCase( String selector )
	// ex: selectorCase("fontSize")
	selectorCase : function(selector) {
		return selector.replace( /([A-Z])/g, "-$1" ).toLowerCase() ;
	}
};
