
	 styleToCssCache = {};

getStyleToCss = function(className) {
    
    var cached = styleToCssCache[className];
    if (cached) {
	return cached;
    }
    
    var to = {};
    
    $each(document.styleSheets, function(style){
	var rules = style.rules || style.cssRules;
	$each(rules, function(rule){
	    if (!rule.selectorText.test('\.' + className + '$')) return;
	    Fx.CSS.Styles.each(function(style){
		if (!rule.style || !rule.style[style]) return;
		var ruleStyle = rule.style[style];
		to[style] = (style.test(/color/i) && ruleStyle.test(/^rgb/)) ? ruleStyle.rgbToHex() : ruleStyle;
	    });
	});
    });
    
    styleToCssCache[className] = to;
    return to;
}


Fx.Morph = Fx.Styles.extend({
    
    start: function(className) {
	
	var to = getStyleToCss(className);
	
	return this.parent(to);
    },
    
    apply: function(className) {
	var to = getStyleToCss(className);
	for (var p in to){
	    var parsed = Fx.CSS.parse(this.element, p, to[p]);
	    this.element.setStyle(p, parsed.to);
	}
	
    }
    
});

Fx.MultipleMorph = Fx.MultipleStyles.extend({
    
    start: function(className){
	
	var to = getStyleToCss(className);
	return this.parent(to);
    },
    
    apply: function(className) {
	var to = getStyleToCss(className);
	for (var p in to){
	    var parsed = Fx.CSS.parse(this.element, p, to[p]);
	    for (var i = 0; i < this.elements.length; i++) {
		this.elements[i].setStyle(p, parsed.to);
	    }
	}
    }
    
});

Fx.CSS.Styles = ["backgroundColor", "backgroundPosition", "color", "width", "height", "left", "top", 
		 "bottom", "right", "fontSize", "letterSpacing", "lineHeight", "textIndent", "opacity"];

Fx.CSS.Styles.extend(Element.Styles.padding);
Fx.CSS.Styles.extend(Element.Styles.margin);

Element.Styles.border.each(function(border){
    ['Width', 'Color'].each(function(property){
	Fx.CSS.Styles.push(border + property);
    });
});

function setupMenuMorph(name) {
    var morph = new Fx.Morph(name, {duration: 200, wait: false, transition: Fx.Transitions.Cubic.easeInOut});
    $(name).addEvent('mouseover', function(e){
	if (e) {
	    new Event(e).stop();
	}
	morph.start('aktiv');
    });
    
    $(name).addEvent('mouseout', function(e){
	new Event(e).stop();
	morph.start('inactive');
    });
    
    // Do an initial morph.
    morph.apply('inactive');
    
}

function setupDiscoMorph(name) {
    var morph = new Fx.Morph(name, {duration: 200, wait: false, transition: Fx.Transitions.Cubic.easeInOut});
    $(name).addEvent('mouseover', function(e){
	if (e) {
	    new Event(e).stop();
	}
	morph.start('discoon');
    });
    
    $(name).addEvent('mouseout', function(e){
	new Event(e).stop();
	morph.start('discomiddle');
    });
    
    // Do an initial morhp.
    morph.apply('discomiddle');
}

function getStyleClass (className) {
    for (var s = 0; s < document.styleSheets.length; s++) {
	if (document.styleSheets[s].rules) {
	    for (var r = 0; r < document.styleSheets[s].rules.length; r++) {
		if (document.styleSheets[s].rules[r].selectorText == className) {
		    return document.styleSheets[s].rules[r];
		}
	    }
	} else if(document.styleSheets[s].cssRules) {
	    for (var r = 0; r < document.styleSheets[s].cssRules.length; r++) {
		if (document.styleSheets[s].cssRules[r].selectorText == className) {
		    return document.styleSheets[s].cssRules[r];
		}
	    }
	}
    }
    return null;
}

