/*
Programmed by Hedger Wang, July 11, 2007
*/

var Rgba = (function(){
	
	//private variables
	var p_isIE = !!(document.expando && document.uniqueID);
	
	var p_isSupportCSSText = typeof( document.documentElement.style.cssText ) == 'string';

    var p_dCanvas = document.createElement('canvas');
	var p_useCanvas =  !!( typeof(p_dCanvas.getContext) == 'function');
	var p_dCtx = p_useCanvas?p_dCanvas.getContext('2d'):null;
	if( p_useCanvas){
		p_dCanvas.width = p_dCanvas.height = 1;	
	};

	var  p_useRGBA = false;

	try
	{
		p_useRGBA = document.createElement('var');
		p_useRGBA.style.backgroundColor = 'rgba(255,255,255,1)' ;	
        //FF and Opera will get empty string, and IE will throw error for invalid assignment 
		p_useRGBA = !!p_useRGBA.style.backgroundColor;
		
	
	}catch(err){ p_useRGBA = false ;};

	


	//HTML color constants
	var p_oColorNames = {
				'transparent':'transparent',
                'aliceblue':'#f0f8ff', 'antiquewhite':'#faebd7', 'aqua':'#00ffff', 'aquamarine':'#7fffd4', 'azure':'#f0ffff', 'beige':'#f5f5dc', 'bisque':'#ffe4c4',
                'black':'#000000', 'blanchedalmond':'#ffebcd', 'blue':'#0000ff', 'blueviolet':'#8a2be2', 'brown':'#a52a2a', 'burlywood':'#deb887', 'cadetblue':'#5f9ea0', 'chartreuse':'#7fff00', 'chocolate':'#d2691e', 'coral':'#ff7f50', 'cornflowerblue':'#6495ed', 'cornsilk':'#fff8dc', 'crimson':'#dc143c', 'cyan':'#00ffff', 'darkblue':'#00008b', 'darkcyan':'#008b8b', 'darkgoldenrod':'#b8860b', 'darkgray':'#a9a9a9', 'darkgrey':'#a9a9a9', 'darkgreen':'#006400', 'darkkhaki':'#bdb76b', 'darkmagenta':'#8b008b', 'darkolivegreen':'#556b2f', 'darkorange':'#ff8c00', 'darkorchid':'#9932cc', 'darkred':'#8b0000', 'darksalmon':'#e9967a', 'darkseagreen':'#8fbc8f', 'darkslateblue':'#483d8b', 'darkslategray':'#2f4f4f', 'darkslategrey':'#2f4f4f',
                'darkturquoise':'#00ced1', 'darkviolet':'#9400d3', 'deeppink':'#ff1493', 'deepskyblue':'#00bfff', 'dimgray':'#696969', 'dimgrey':'#696969', 'dodgerblue':'#1e90ff', 'firebrick':'#b22222', 'floralwhite':'#fffaf0', 'forestgreen':'#228b22', 'fuchsia':'#ff00ff', 'gainsboro':'#dcdcdc', 'ghostwhite':'#f8f8ff', 'gold':'#ffd700', 'goldenrod':'#daa520', 'gray':'#808080', 'grey':'#808080', 'green':'#008000', 'greenyellow':'#adff2f', 'honeydew':'#f0fff0', 'hotpink':'#ff69b4', 'indianred':'#cd5c5c', 'indigo':'#4b0082', 'ivory':'#fffff0', 'khaki':'#f0e68c', 'lavender':'#e6e6fa', 'lavenderblush':'#fff0f5', 'lawngreen':'#7cfc00', 'lemonchiffon':'#fffacd', 'lightblue':'#add8e6', 'lightcoral':'#f08080', 'lightcyan':'#e0ffff', 'lightgoldenrodyellow':'#fafad2', 'lightgray':'#d3d3d3', 'lightgrey':'#d3d3d3', 'lightgreen':'#90ee90', 'lightpink':'#ffb6c1', 'lightsalmon':'#ffa07a', 'lightseagreen':'#20b2aa', 'lightskyblue':'#87cefa', 'lightslategray':'#778899', 'lightslategrey':'#778899', 'lightsteelblue':'#b0c4de',
                'lightyellow':'#ffffe0', 'lime':'#00ff00', 'limegreen':'#32cd32', 'linen':'#faf0e6', 'magenta':'#ff00ff', 'maroon':'#800000', 'mediumaquamarine':'#66cdaa', 'mediumblue':'#0000cd', 'mediumorchid':'#ba55d3', 'mediumpurple':'#9370d8', 'mediumseagreen':'#3cb371', 'mediumslateblue':'#7b68ee', 'mediumspringgreen':'#00fa9a', 'mediumturquoise':'#48d1cc', 'mediumvioletred':'#c71585', 'midnightblue':'#191970', 'mintcream':'#f5fffa', 'mistyrose':'#ffe4e1', 'moccasin':'#ffe4b5', 'navajowhite':'#ffdead', 'navy':'#000080', 'oldlace':'#fdf5e6', 'olive':'#808000', 'olivedrab':'#6b8e23', 'orange':'#ffa500', 'orangered':'#ff4500', 'orchid':'#da70d6',
                'palegoldenrod':'#eee8aa', 'palegreen':'#98fb98', 'paleturquoise':'#afeeee', 'palevioletred':'#d87093', 'papayawhip':'#ffefd5', 'peachpuff':'#ffdab9', 'peru':'#cd853f', 'pink':'#ffc0cb', 'plum':'#dda0dd', 'powderblue':'#b0e0e6', 'purple':'#800080', 'red':'#ff0000', 'rosybrown':'#bc8f8f', 'royalblue':'#4169e1', 'saddlebrown':'#8b4513', 'salmon':'#fa8072', 'sandybrown':'#f4a460', 'seagreen':'#2e8b57', 'seashell':'#fff5ee', 'sienna':'#a0522d', 'silver':'#c0c0c0', 'skyblue':'#87ceeb', 'slateblue':'#6a5acd', 'slategray':'#708090', 'slategrey':'#708090', 'snow':'#fffafa', 'springgreen':'#00ff7f', 'steelblue':'#4682b4', 'tan':'#d2b48c', 'teal':'#008080', 'thistle':'#d8bfd8', 'tomato':'#ff6347', 'turquoise':'#40e0d0', 'violet':'#ee82ee', 'wheat':'#f5deb3', 'white':'#ffffff', 
                'whitesmoke':'#f5f5f5', 'yellow':'#ffff00', 'yellowgreen':'#9acd32'
	};

    var p_aColorNames = [];
    for(var i in p_oColorNames){
        p_aColorNames.push(i);
    };
  


	var oApi = {
		
	    trim:function(str){
			str = str || '';
			return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
		},

	
		parseRGB:function(sColor){
			
			
			if (sColor.indexOf('rgb') <0) return null;
			var re = new RegExp('rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)', 'gi');
			var rgb = sColor.replace(re, '$1,$2,$3').split(',');
			
			if (rgb.length == 3) {
				return rgb;
			}else{
				return null;
			}

		},
		

        getRandomColorName:function(){
            var n = Math.round(Math.random() * p_aColorNames.length) - 1;
            return  p_aColorNames[n];
        },
		
		toRGB:function(sColor){

			sColor = this.trim(sColor).toLowerCase();
			sColor = p_oColorNames[sColor] || sColor ;

			switch(true){
				case (sColor.indexOf('#')==0) : return this.convertHexToRGB(sColor); 
				case (sColor.indexOf('rgba')==0) : return this.convertRGBToRGB(sColor); 
				case (sColor.indexOf('rgb')==0) : return this.convertRGBToRGB(sColor); 
				default : return null;

			};
			
			

		},

		convertRGBToRGB:function(sColor){
		
    		var aRGB = this.parseRGB(sColor);
			if(!aRGB) return null;

			return 'rgb(' + aRGB.join(',') + ')';
			

		},

        convertRGBAToRGB:function(sColor){
			if (sColor.indexOf('rgba') <0) return null;

		},

		convertRGBToHex : function(sColor){
			
			if (sColor.indexOf('rgb') <0) return null;
			
			var rgb = this.parseRGB(sColor);
			if (rgb) {
				r = parseInt(rgb[0]).toString(16);
				g = parseInt(rgb[1]).toString(16);
				b = parseInt(rgb[2]).toString(16);

				r = r.length == 1 ? '0' + r : r;
				g = g.length == 1 ? '0' + g : g;
				b = b.length == 1 ? '0' + b : b;

				return '#' + r + g + b;		
			}else{
				return null;	
			}
			
		},

		convertRGBtoRGBA:function(sColor , nOpacity ){
		
			var rgb =  this.parseRGB(sColor);
            	nOpacity = Math.round(nOpacity * 10) / 10; 
            if(! rgb ) return null;    
			return  [ 'rgba(' , rgb , ',' , nOpacity , ')'  ].join('');

		},

		convertHexToRGB:function(sColor){
			
			if (sColor.indexOf('#') <0) return null;
				
			sColor = sColor.replace(new RegExp('[^0-9A-F]', 'gi'), '');
			r = parseInt(sColor.substring(0, 2), 16);
			g = parseInt(sColor.substring(2, 4), 16);
			b = parseInt(sColor.substring(4, 6), 16);
			return "rgb(" + r + "," + g + "," + b + ")";
			
		},


		setBackgroundColor:function(dEl,sColor , nOpacity){			
			
			if(typeof( dEl) === 'string'  ) dEl = document.getElementById(dEl);
           
			if(!dEl) throw new Error('unknown object or element : ' + dEl );
			
			sColor = this.toRGB( sColor );
			if(!sColor ) throw new Error('unknown color name : ' + sColor );

			if( isNaN(nOpacity) ||  nOpacity >= 1 ){
				return dEl.style.background=  sColor;
			}

			nOpacity = Math.min(  nOpacity , 1 );
			nOpacity = Math.max(  nOpacity , 0 );

			if(p_useRGBA){
			  
			   dEl.style.background = this.convertRGBtoRGBA(sColor , nOpacity);
			   return true;
			}
	

			if(p_useCanvas){
			  
              
			   p_dCtx.fillStyle =  this.convertRGBtoRGBA(sColor , nOpacity);
			   p_dCtx.fillRect(0,0,1,1);

			   var sDataUrl = p_dCtx.canvas.toDataURL('image/png');
         p_dCtx.clearRect(0,0,1,1);    
			   dEl.style.background = 'transparent url(' + sDataUrl  + ')';
               return true;
			}


            if(p_isIE){               
			   
			   sColor = this.convertRGBToHex(sColor); //to Hex
			   nOpacity  = Math.round(nOpacity  * 255 ).toString(16);
			   sColor = '#' + nOpacity  + sColor.substr( 1 , 7 );

			   //In many cases, color is expanded to include the Alpha component (#AARRGGBB) in the Internet Explorer 5.5 filters. See the reference pages to confirm which filters this applies to. 
			   //See http://msdn2.microsoft.com/en-us/library/ms532847.aspx
			   dEl.style.background = 'transparent';
			   dEl.style.filter =  [ 'progid:DXImageTransform.Microsoft.gradient(startColorstr=',sColor,',endColorstr=',sColor,')' ].join('');//#AARRGGBB ;
			   return true;

			};

			return !!(dEl.style.background=  sColor);

			
			
		},


		getCssText:function(sColor,nOpacity){			
			
			sColor = this.toRGB( sColor );
			if(!sColor ) throw new Error('unknown color name : ' + sColor );
			
			if( isNaN(nOpacity) ||  nOpacity >= 1 ){
				return 'background-color:' + sColor;
			};

			nOpacity = Math.min(  nOpacity , 1 );
			nOpacity = Math.max(  nOpacity , 0 );
		
            
			if(p_useRGBA){			
			   return [  'background:' ,  this.convertRGBtoRGBA(sColor , nOpacity) , ';' ].join('');
			}

			if(p_isIE){  
			  sColor = this.convertRGBToHex(sColor); //to Hex
			  nOpacity  = Math.round(nOpacity  * 255 ).toString(16);
			  sColor = '#' + nOpacity  + sColor.substr( 1 , 7 );	
			  return [ 'filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=',sColor,',endColorstr=',sColor,');zoom:1;' ].join('');//#AARRGGBB ;;
			}

			if(p_useCanvas){			 
              
			   p_dCtx.fillStyle =   this.convertRGBtoRGBA(sColor , nOpacity);
              
			   p_dCtx.fillRect(0,0,10,10);              
			   var sDataUrl = p_dCtx.canvas.toDataURL('image/png');
                
               return  [  'background:url(' ,  sDataUrl , ');' ].join('');
			}

			return '';

		}


	};
	return oApi;


})();