	/**
	 * Colorize
	 * @copyright 	Copyright 2009-2010 Scarimango (www.scarimango.de)
	 */

	var Colorize = new Class.Singleton({
		Extends: SimpleClass,
		
		/** Variables */
		_colored: false,
						
		/** Constructor */
		initialize: function(options) {
			this.parent(options);
			this.setDefault('offsetDark', 0);
			this.setDefault('offsetMedium', -25);
		},
	
		/** Setup */
		colorize: function(element) {
			var element = $j(element);
			var offsetDark = this.get('offsetDark');
			var offsetMedium = this.get('offsetMedium');
			var colorRange = 0x8;
			var r = 0xc - colorRange + Math.round(Math.random() * colorRange);
			var g = 0xc - colorRange + Math.round(Math.random() * colorRange);
			var b = 0xc - colorRange + Math.round(Math.random() * colorRange);
			var originalColor = r.toString(16) + "" + r.toString(16) + "" + g.toString(16) + "" + g.toString(16) + "" + b.toString(16) + "" + b.toString(16);
			/*
			if(this.isColored() == false)
				$j('body').css('backgroundColor', '#' + this.adjust(parseInt(color, 16), 0));
			*/
			this.setColored(true);
			if(element.hasClass('colorize')){
				if(element.hasClass('background'))
					element.css('backgroundColor', '#' + originalColor);
			}
			if(element.hasClass('dark')){
				var color = element.parents('.colorize').css('backgroundColor');
				if(!color)
					color = originalColor;
				color = this.convertRgb(color);
				if(element.hasClass('background'))
					element.css('backgroundColor', '#' + this.adjust(color, offsetDark));
				if(element.hasClass('border'))
					element.css('borderColor', '#' + this.adjust(color, offsetDark));
			}
			if(element.hasClass('medium')){
				var color = element.parents('.colorize').css('backgroundColor');
				if(!color)
					color = originalColor;
				color = this.convertRgb(color);
				if(element.hasClass('background'))
					element.css('backgroundColor', '#' + this.adjust(color, offsetMedium));
				if(element.hasClass('border'))
					element.css('borderColor', '#' + this.adjust(color, offsetMedium));
			}
		},
		
		/** Colorizes all elements */
		colorizeAll: function(selector) {
			var self = this;
			$j(selector).each(function() {
				self.colorize($j(this));
			});
		},
		
		/** Converts */
		convertRgb: function(colorString) {
			if(colorString.substring(0, 1) == '#') {
				var values = new Array();
				values[1] = parseInt(colorString.substr(1, 2), 16);
				values[2] = parseInt(colorString.substr(3, 2), 16)
				values[3] = parseInt(colorString.substr(5, 2), 16)
			} else {
				var values = colorString.match(/rgb\((.*),(.*),(.*)\)/);
			}
			if(values == null)
				return colorString;
			var r = parseInt(values[1]);
				r > 0xff ? r = 0xff : r = Math.round(r);
				r < 0x00 ? r = 0x00 : r = Math.round(r);
				r < 16 ? r = '0' + r.toString(16) : r = r.toString(16);;
			var g = parseInt(values[2]);
				g > 0xff ? g = 0xff : g = Math.round(g);
				g < 0x00 ? g = 0x00 : g = Math.round(g);
				g < 16 ? g = '0' + g.toString(16) : g = g.toString(16);;
			var b = parseInt(values[3]);
				b > 0xff ? b = 0xff : b = Math.round(b);
				b < 0x00 ? b = 0x00 : b = Math.round(b);
				b < 16 ? b = '0' + b.toString(16) : b = b.toString(16);;
			var result =  r + g + b;
			result = parseInt(result.toUpperCase(), 16);
			return result;
		},
		
		/** Adjusts color */
		adjust: function(color, offset) {
			var r = color >> 16 & 0xff;
			var g = color >> 8 & 0xff;
			var b = color >> 0 & 0xff;
			
				r += offset; 
				r > 0xff ? r = 0xff : r = Math.round(r);
				r < 0x00 ? r = 0x00 : r = Math.round(r);
				r < 16 ? r = '0' + r.toString(16) : r = r.toString(16);;
			
				g += offset; 
				g > 0xff ? g = 0xff : g = Math.round(g);
				g < 0x00 ? g = 0x00 : g = Math.round(g);
				g < 16 ? g = '0' + g.toString(16) : g = g.toString(16);;
				
				b += offset; 
				b > 0xff ? b = 0xff : b = Math.round(b);
				b < 0x00 ? b = 0x00 : b = Math.round(b);
				b < 16 ? b = '0' + b.toString(16) : b = b.toString(16);;

			return r + g + b;
		},
		
		/** Sets option */
		setColored: function(value) {
			this._colored = value;
		},
		
		/** Sets option */
		isColored: function() {
			return this._colored;
		}
	});
	

