
//	JAVASCRIPT LIBRARY "nifty.js" FOR CSS-BASED ROUNDED DIV BOXES


	//	this code is based on free javascript by alessandro fulciniti ("nifty corners 2")
	//	http://pro.html.it/esempio/nifty/ and http://pro.html.it/articoli/id_599/idcat_31/pag_1/pag.html

	//	functions
		//	Rounded: procedure(string x string x string x string [ x string ] );
		//	Rounded: create rounded corners for a named div layer		//	         * selector: name of the div layer, e.g. "div#content"		//	         * corners: a combination of {"all", "top", "bottom", "tl", "tr", "bl", "br"}, delimited by spaces (" ")		//	         * outsideColor: the background color outside the current box ("transparent" is also a valid color)		//	         * insideColor: the background color inside the current box ("transparent" is also a valid color)		//	         * options: any combination of "smooth" (anti-aliasing), "border #cccccc" (border) or "small" (small corners)
			function Rounded(selector, corners, outsideColor, insideColor, options) {			//	local helper functions				//	CheckBrowserDOM: -> boolean;				//	CheckBrowserDOM: check if browser supports DOM parsing and set up xhtml detection and array push, if not exists					function CheckBrowserDOM() {						isXHTML = /html\:/.test(document.getElementsByTagName('body')[0].nodeName);						if (Array.prototype.push == null)							Array.prototype.push = function() { this[this.length] = arguments[0]; return(this.length); };						return (document.getElementById && document.createElement);					}				//	getElementsBySelector: string -> array(object);				//	getElementsBySelector: get all tags that need to be modified inside the DOM tree					function getElementsBySelector(selector) {						var selid = "", selclass = "", tag = selector, s = [], objlist = [];					//	descendant selector like "tag#id tag"						if (selector.indexOf(" ") > 0) {							s = selector.split(" ");							var fs = s[0].split("#");							if (fs.length == 1)								return (objlist);							var f = document.getElementById(fs[1]);							return(f? f.getElementsByTagName(s[1]): objlist);						}					//	id selector like "tag#id"						if (selector.indexOf("#") > 0) {							s = selector.split("#");							tag = s[0];							selid = s[1];						}						if (selid != "") {							var f = document.getElementById(selid);							if (f)								objlist.push(f);							return (objlist);						}					//	class selector like "tag.class"						if (selector.indexOf(".") > 0) {							s = selector.split(".");
							tag = s[0];
							selclass = s[1];						}					//	tag selector like "tag"
						var v = document.getElementsByTagName(tag);						if (selclass == "")							return (v);						for (var i = 0; i < v.length; i++) {							if (v[i].className.indexOf(selclass) >= 0)								objlist.push(v[i]);
						}						return (objlist);					}
				//	CreateElement: string -> string;
				//	CreateElement: creates a new tagged element

					function CreateElement(x) {
						return ( isXHTML?
							document.createElementNS('http://www.w3.org/1999/xhtml', x):
							document.createElement(x)
						);
					}


				//	AddBorder: procedure(string x string);
				//	AddBorder: adds a border to the current rounded corner div layer

					function AddBorder(element, borderColor) {
						if (! element.passed) {
							if ( (element.childNodes.length == 1) && (element.childNodes[0].nodeType == 3) ) {
								var t = element.firstChild.nodeValue;
								element.removeChild(element.lastChild);
								var d = CreateElement("span");								d.style.display = "block";								d.appendChild(document.createTextNode(t));
								element.appendChild(d);
							}
							for (var i = 0; i < element.childNodes.length; i++) {
								if (element.childNodes[i].nodeType == 1) {
									element.childNodes[i].style.borderLeft = "1px solid " + borderColor;
									element.childNodes[i].style.borderRight = "1px solid " + borderColor;
								}
							}						}
						element.passed = true;					}				//	AddTop: procedure(string x string x string [ x string [ x string ] ] );
				//	AddTop: add rounded corners at the top of current div layer box

					function AddTop(element, outsideColor, insideColor, borderColor, classPrefix) {
						var lim = 4, d = CreateElement("span");
						if (classPrefix.indexOf("s") >= 0)
							lim = 2;
						if (borderColor)
							d.className = "artop";
						else d.className = "rtop";
						d.style.backgroundColor = outsideColor;
						for (var i = 1; i <= lim; i++) {							var x = CreateElement("span");							x.className = classPrefix + i;							x.style.backgroundColor = insideColor;
							if (borderColor)
								x.style.borderColor = borderColor;
							d.appendChild(x);
						}						element.style.paddingTop = 0;
						element.insertBefore(d, element.firstChild);					}				//	AddBottom: procedure(string x string x string [ x string [ x string ] ] );				//	AddBottom: add rounded corners at the bottom of current div layer box
					function AddBottom(element, outsideColor, insideColor, borderColor, classPrefix) {
						var lim = 4, d = CreateElement("span");
						if (classPrefix.indexOf("s") >= 0)
							lim = 2;						if (borderColor)							d.className = "artop";						else
							d.className = "rtop";
						d.style.backgroundColor = outsideColor;
						for (var i = lim; i > 0; i--) {
							var x = CreateElement("span");							x.className = classPrefix + i;							x.style.backgroundColor = insideColor;
							if (borderColor)
								x.style.borderColor = borderColor;
							d.appendChild(x);
						}						element.style.paddingBottom = 0;
						element.appendChild(d);
					}
					function Mix(c1, c2) {
						var step1, step2, x, y, r = new Array(3);
						if (c1.length == 4)
							step1 = 1;						else step1 = 2;
						if (c2.length == 4)
							step2 = 1;						else
							step2 = 2;
						for (var i = 0; i < 3; i++) {							x = parseInt(c1.substr(1 + step1*i, step1), 16);							if (step1 == 1)
								x = 16*x + x;
							y = parseInt(c2.substr(1 + step2*i, step2), 16);
							if (step2 == 1)
								y = 16*y + y;
							r[i] = Math.floor((x*50 + y*50)/100);
						}
						return("#" + r[0].toString(16) + r[1].toString(16) + r[2].toString(16));
					} 


			//	main
				var prefixt, prefixb, classPrefix = "r", edgeColor = "", edges = false, eclass = "", b = false, t = false;				if ( CheckBrowserDOM() ) {					if (insideColor == "transparent") {
						classPrefix += "x";
						edgeColor = outsideColor;
						outsideColor = "transparent";
					}
					else if (options && options.indexOf("border") >= 0) {
						var optar = options.split(" ");
						for (var i = 0; i < optar.length;i ++) {							if (optar[i].indexOf("#") >= 0)
								edgeColor = optar[i];
						}
						if (edgeColor == "")							edgeColor = "#666";						classPrefix += "e";						edges = true;					}
					else if (options && options.indexOf("smooth") >= 0) {
						classPrefix += "a";
						edgeColor = Mix(outsideColor, insideColor);					}
					if (options && options.indexOf("small") >= 0)
						classPrefix += "s";
					prefixt = classPrefix;
					prefixb = classPrefix;
					if (corners.indexOf("all") >= 0) {
						t = true;
						b = true
					} else if (corners.indexOf("top") >= 0)						t = "true";
					else if (corners.indexOf("tl") >= 0) {
						t = "true";
						if (corners.indexOf("tr") < 0)							prefixt += "l";
					}
					else if (corners.indexOf("tr") >= 0) {
						t = true;
						prefixt += "r";
					}
					if (corners.indexOf("bottom") >= 0)
						b = true;
					else if (corners.indexOf("bl") >= 0) {
						b = "true";						if (corners.indexOf("br") < 0)
							prefixb += "l";					}
					else if (corners.indexOf("br") >= 0) {
						b = "true";						prefixb += "r";					}					var v = getElementsBySelector(selector);					for (var i = 0; i < v.length; i++) {						if (edges)							AddBorder(v[i], edgeColor);						if (t)							AddTop(v[i], outsideColor, insideColor, edgeColor, prefixt);						if (b)							AddBottom(v[i], outsideColor, insideColor, edgeColor, prefixb);					}				}			}