
/* ----- csshover.js ----- */
var currentSheet, doc = window.document;
var ddMenuIDs = new Array();

function findDdMenus() {
        var aTmp = getElementsByClassName("csshover", document, "div", function(oM) {
                ddMenuAdd(oM.id);
        } );
};

function ddMenuAdd(ddMenuID) {
        if ( typeof(ddMenuID) == "undefined") return;
        ddMenuIDs[ddMenuIDs.length] = ddMenuID.replace(/List/, "");
};

function parseStylesheets() {
        findDdMenus();
	var sheets = doc.styleSheets, l = sheets.length;
	for(var i=0; i<l; i++) 
		parseStylesheet(sheets[i]);
}
function parseStylesheet(sheet) {
	var l, rules, imports;
	if(sheet.imports) {
		imports = sheet.imports, l = imports.length;
		for(var i=0; i<l; i++) 
			parseStylesheet(sheet.imports[i]);
	}

	rules = (currentSheet = sheet).rules, l = rules.length;
	for(var j=0; j<l; j++) parseCSSRule(rules[j]);
}

function parseCSSRule(rule) {
	var select = rule.selectorText, style = rule.style.cssText;
                if ( style.replace(/ /, "") == "" ) return;
                var ddMenuID, Found = 0;
                for (var t=0; t<ddMenuIDs.length; t++) {
                        if (select.indexOf(ddMenuIDs[t]) != -1) {
                        Found = 1;
                        ddMenuID = ddMenuIDs[t];
                        break;
                       }
               }
                if (!Found) return;

		if(!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):hover/i).test(select)) return;
		
		var newSelect = select.replace(/(\.([a-z0-9_-]+):hover)|(:hover)/g, '.$2onHover');
		var hasClass = (/(\.([a-z0-9_-]+):hover)/g).exec(select);
		var className = (hasClass? hasClass[2]:'') + 'onHover';

		var affected = select.replace(/:hover.*$/g, '');           
                eval('affected = affected.replace(/#' + ddMenuID + '([ ]+)/i, "")');               

		var elements = getElementsBySelect(affected, ddMenuID);
		
		currentSheet.addRule(newSelect, style);
		for(var i=0; i<elements.length; i++)
			new HoverElement(elements[i], className);
	}

function HoverElement(node, className) {
	if(!node.hovers) node.hovers = {};
	if(node.hovers[className]) return;
	node.hovers[className] = true;
	node.attachEvent('onmouseover',
		function() { node.className += ' ' + className; });
	node.attachEvent('onmouseout',
		function() { node.className = 
			node.className.replace((new RegExp('\\s+'+className)),''); });
}

function getElementsBySelect(rule, ddMenuID) {
	var parts, nodes = [doc.getElementById(ddMenuID)];
	parts = rule.split(' ');
	for(var i=0; i<parts.length; i++) {
		nodes = getSelectedNodes(parts[i], nodes);
	}	return nodes;
}
function getSelectedNodes(select, elements) {
	var result, node, nodes = [];
	var classname = (/\.([a-z0-9_-]+)/i).exec(select);
	var identify = (/\#([a-z0-9_-]+)/i).exec(select);
	var tagName = (/^[a-z0-9]+/i).exec(select.toUpperCase()) || '*';
	for(var i=0; i<elements.length; i++) {
		result = elements[i].getElementsByTagName(tagName);
		for(var j=0; j<result.length; j++) {
			node = result[j];
			if((identify && node.id != identify[1]) || (classname && !(new RegExp('\\b' +
				classname[1] + '\\b').exec(node.className)))) continue;
			nodes[nodes.length] = node;
		}
	}	return nodes;
}

function getElementsByClassName(clsName, parentEle, tagName, fn) {
	var found = new Array();
	var re = new RegExp('\\b'+clsName+'\\b', 'i');
	var list = parentEle.getElementsByTagName(tagName);
	for (var i = 0; i < list.length; ++i) {
		if (list[i].className.search(re) != -1) {
			found[found.length] = list[i];
			if (fn) fn(list[i]);
		}
	}
	return found;
}
window.onload=parseStylesheets;

