(function() {

/* inline configs */

var tick = 40;

var minOpacity = 0;
var maxOpacity = 100;

var viewTicks = 190;
var fadeTicks = 12;
var pauseTicks = 5;

/* utils */

var setOpacity = function(x, o) {
	x.o = o;
	x.style.opacity = o/100;
	//x.style.filter = 'alpha(opacity='+o+')';

	//x.style.-ms-filter = "progid:DXImageTransform.Microsoft.Alpha(Opacity="+o")";
	//x.style.filter = "progid:DXImageTransform.Microsoft.Alpha(Opacity="+o+")";
};

/* dom binding init */

var divs = document.getElementsByTagName('div');
for (var i = 0, div = null; div = divs[i++]; ) {
	if (div.className.match(/(^|\s)rotate($|\s)/)) {

		/*
		 * This function wraps the inner code to create a closure
		 * separating the possible different variable instances.
		 * It is not needed in case there is at most one `rotate'
		 * element within every document.
		 */
		(function() {

			var uls = div.getElementsByTagName('ul');
			for (var j = 0, ul = null; ul = uls[j++]; ) {
				if (ul.className.match(/(^|\s)rt-menu($|\s)/)) {

					/* state vars */

					var clock = 0;
					var stopped = false;
					var freeAnchor = false;

					/* element lists */

					var as = ul.getElementsByTagName('a');
					var ps = [];

					var active = 0;

					/* stronghold */

					var strong;

					/* changing selected anchor */

					var aSelect = function(a) {
						a.className = 'selected';
						freeAnchor = false;
					};

					var aDeselect = function(a) {
						a.className = '';
						freeAnchor = true;
					};

					/* changing visible content */

					var pSelect = function(p) {
						p.className = p.className.replace(/(^|\s+)rt-hidden($|\s+)/, ' ');
					}

					var pDeselect = function(p) {
						p.className += ' rt-hidden';
					};

					/* computed values */

					var t1 = viewTicks;
					var t2 = t1 + fadeTicks;
					var t3 = t2 + pauseTicks;
					var t4 = t3 + fadeTicks;

					var opacityStep = Math.floor((maxOpacity - minOpacity + fadeTicks - 1) / fadeTicks);

					/* steps */

					var step = function(){
						var p = ps[active];
						var o = p.o || 0;

						switch (true) {
						case (t1 <= clock && clock < t2):
							if ((o -= opacityStep) < minOpacity) { o = minOpacity; }
							setOpacity(p, o);
							break;
						case (clock == t3):
							setOpacity(p, minOpacity);
							pDeselect(p);
							if( ++active >= ps.length) { active = 0; }
							p = ps[active];
							a = as[active];
							setOpacity(p, minOpacity);
							pSelect(p);
							break;
						case (t3 < clock && clock <= t4):
							if ((o += opacityStep) > maxOpacity) { o = maxOpacity; }
							setOpacity(p, o);
							break;
						}

						if (clock == t1) {
							aDeselect(as[active]);
						}
						if (clock == t3) {
							aSelect(as[active]);
						}

						if (!stopped) { clock++; }
						if (clock > t4) { clock = 0; }
					};

					/* start and stop */

					var stop = function() {
						stopped = true;
						clock = 0;
						setOpacity(ps[active], maxOpacity);
						if (freeAnchor) {
							aSelect(as[active]);
						}
					};

					var change = function() {
						pDeselect(ps[active]);
						if (!freeAnchor) {
							aDeselect(as[active]);
						}
						pSelect(ps[active = this.i]);
						stop();
					};

					var start = function() {
						stopped = false;
					};

					/* list event binding; traversal */

					var found = false;
					for (var k = -1, a = null; a = as[++k]; ) {
						ps[k] = document.getElementById(a.href.split(/#/)[1]);
						a.href = ps[k].getElementsByTagName('a')[0].href;
						a.i = k;

						a.onmouseover = change;
						a.onmouseout = start;
					}
					if (!found) {
						aSelect(as[active]);
					}
					var p = ps[active];
					while (!p.className.match(/(^|\s)rt-item($|\s)/)) {
						p = p.parentNode;
					}
					p.onmouseover = stop;
					p.onmouseout = start;

					/* run */

					window.setInterval(step, tick);
				}
			}

		})();

	}
}

})();
