/**
 * jQuery Interface ColorPicker
 *
 * NEED JQUERY 1.1 AND INTERFACE 1.1
 *
 *
 * @name ColorPicker
 * @description This a jQuery (Interface) ColorPicker.
 * @option String inputHexCode An input id (type hidden or text) to fill with the hex code of the chosen color
 * @option String objShowColor An object id (div, td ...) to fill with the chosen color
 * @option Boolean showRGB Show the R,G,B elements in the colorPicker
 * @option String okFunc The function (name of the function) to launch when 'OK' is pressed and inputHexCode is filled
 *
 * @type jQuery
 * @cat Plugins/Interface
 * @author Stefan Petre - Matthieu Paineau
 *
 *
 * READ 'howto_color_picker.txt' for information.
 *
 * TODO:
 * 		setcolor
 *		update automatically colors and cursors when we enter text into R, G, B, or hexvalue ...
 *
**/
jQuery.ColorPicker = {
	options : {
		inputHexCode		: "hexcode",
		objShowColor		: "divcolor",
		showRGB				: true,
		okFunc				: null,
		psdEditor			: null
	},
	baseColor : {r:255,g:0,b:0},
	currentColor : {r:255,g:255,b:255},
	lastValues : [0,0],
	opened : false,

	init : function(options)
	{
		if (options)
			jQuery.extend(jQuery.ColorPicker.options, options);

		jQuery.ColorPicker.createPicker();
		jQuery.ColorPicker.baseColor = {r:255,g:0,b:0};
		jQuery.ColorPicker.currentColor = {r:255,g:255,b:255,a:255};
		jQuery.ColorPicker.alpha = 255;
		jQuery.ColorPicker.hsv = {h: 0, s: 1, v: 1};
		jQuery.ColorPicker.lastValues = [0,0];
		jQuery.ColorPicker.setGradientColor();

		jQuery('#cPcolorContainer').Slider(
			{
				accept : '#cPcolorIndic',
				onSlide : function( cordx, cordy,x, y)
				{
					jQuery.ColorPicker.hsv.s = cordx / 100;
					jQuery.ColorPicker.hsv.v = 1 - cordy / 100;
					jQuery.ColorPicker.setGradientColor();
				},
				onChange : function()
				{
					document.getElementById('cPoldColor').style.backgroundColor = 'rgb(' + jQuery.ColorPicker.currentColor.r + ',' + jQuery.ColorPicker.currentColor.g + ',' + jQuery.ColorPicker.currentColor.b + ')';
				}
			}
		);

		jQuery('#cPhue').Slider(
			{
				accept : '#cPhueIndic',
				onSlide : function( cordx, cordy,x, y)
				{
					jQuery.ColorPicker.hsv.h = 360 - cordy * 360 / 100;
					var hsv = { h: jQuery.ColorPicker.hsv.h, s: 1, v: 1};
					var c = jQuery.ColorPicker.hsvToRgb(hsv);
					jQuery.ColorPicker.baseColor = c;
					document.getElementById('cPcolor').style.backgroundColor = 'rgb(' + jQuery.ColorPicker.baseColor.r + ',' + jQuery.ColorPicker.baseColor.g + ',' + jQuery.ColorPicker.baseColor.b + ')';
					jQuery.ColorPicker.setGradientColor();
				},
				onChange : function()
				{
					document.getElementById('cPoldColor').style.backgroundColor = 'rgb(' + jQuery.ColorPicker.currentColor.r + ',' + jQuery.ColorPicker.currentColor.g + ',' + jQuery.ColorPicker.currentColor.b + ')';
				}
			}
		);
		
		jQuery('#cPalpha').Slider(
			{
				accept : '#cPhueIndic',
				onSlide : function( cordx, cordy,x, y)
				{
					jQuery.ColorPicker.alpha = Math.round(cordy * 255 / 100);
					jQuery.ColorPicker.updateCurrentColor();
					//jQuery.ColorPicker.setGradientColor();
				},
				onChange : function()
				{
					//document.getElementById('cPoldColor').style.backgroundColor = 'rgb(' + jQuery.ColorPicker.currentColor.r + ',' + jQuery.ColorPicker.currentColor.g + ',' + jQuery.ColorPicker.currentColor.b + ')';
				}
			}
		);


		//attach the colorpicker :
		jQuery('a').each(
			function()
			{
				el 				= jQuery(this);
				relAttr 		= el.attr('rel')||'';
				if (relAttr.toLowerCase().indexOf('colorpicker') == 0) {
					el.attr("attached",true);
					el.bind('click', jQuery.ColorPicker.cPShow);
				}
			}
		);

	},

	setGradientColor : function(){
		
		var c = jQuery.ColorPicker.hsvToRgb(jQuery.ColorPicker.hsv);
		jQuery.ColorPicker.currentColor = {r:c.r,g:c.g,b:c.b};
		jQuery.ColorPicker.updateCurrentColor();		
	},
	
	updateCurrentColor : function() {
		var c = jQuery.ColorPicker.currentColor;
		document.getElementById('cPcolorCurrent').style.backgroundColor = 'rgb(' + c.r + ',' + c.g + ',' + c.b + ')';

		if(jQuery.ColorPicker.showRGB){
			document.getElementById('cPrgbR').value = c.r;
			document.getElementById('cPrgbG').value = c.g;
			document.getElementById('cPrgbB').value = c.b;
			document.getElementById('cPrgbA').value = jQuery.ColorPicker.alpha;
		}		
		
		document.getElementById('cPhex').value = (jQuery.ColorPicker.toHex(c.r) + jQuery.ColorPicker.toHex(c.g) + jQuery.ColorPicker.toHex(c.b)		+ jQuery.ColorPicker.toHex(jQuery.ColorPicker.alpha)).toUpperCase();
	},
	
	toHex : function(color){
		color=parseInt(color).toString(16);
		return color.length<2?"0"+color:color;
	},


	/**
	 *
	 * return hex code into specified input
	 **/
	cPok : function(){
		jQuery('#'+jQuery.ColorPicker.inputHexCode).attr("value",jQuery("#cPhex").attr("value"));
		
		//jQuery('#'+jQuery.ColorPicker.inputHexCode).blur();
		$find(jQuery.ColorPicker.psdE)._testProperties(false);
		// TODO: remove;
		jQuery('#'+jQuery.ColorPicker.objShowColor).css("background-color","#"+jQuery("#cPhex").attr("value").substr(0,6));
		jQuery.ColorPicker.cPclose();
		if (jQuery.ColorPicker.okFunc) {
			try{
				eval(jQuery.ColorPicker.okFunc+"();");
			}
			catch(err){
				//do nothing if okfunc fails ?
			}
		}
	},

	/**
	 * close the picker
	**/
	cPclose : function(){
		jQuery("#cPcolorPicker").css("visibility","hidden");
		jQuery.ColorPicker.opened=false;
		$find(jQuery.ColorPicker.psdE)._hideModalDialogPanel();
		//jQuery.ColorPicker.options.psdEditor._hideModalDialogPanel();
	},
	
	parseHexColor : function(hex) {
		var std = /^\s*[0-9A-F]{8,8}\s*$/i;
		var c = std.exec(hex);
		if (std) {
			var r = parseInt(hex.substr(0,2), 16);
			var g = parseInt(hex.substr(2,2), 16);
			var b = parseInt(hex.substr(4,2), 16);		
			var a = parseInt(hex.substr(6,2), 16);
			return {r:r, g:g, b:b, a:a};
		}
		return null;
	},
	
	/*rgbToHue : function(color) {
		var hue = 180/Math.PI*Math.atan2( Math.sqrt(3)*(color.g-color.b) , 2*color.r-color.g-color.b );
		if (hue < 0) hue += 360;
		return hue;
	},*/
	
	/*hslToRgb: function(hsl) {
		var h = hsl.h;
		var s = hsl.s;
		var l = hsl.l;
		
		var q = (l < 0.5) ? l * (1 + s) : l + s - (l * s);
		var p = 2 * l - q;
		Hk = h / 360;
		T = [Hk + 1/3, Hk, Hk - 1/3];
		var i;
		for (i = 0; i < 3; i++)
		{
			if (T[i] < 0) T[i] += 1;
			if (T[i] > 1) T[i] -= 1;
		}
		
		C = [0,0,0];
		for (i = 0; i < 3; i++)
		{
			C[i] = p;
			if (T[i] < 1/6) C[i] = p + ((q - p) * 6 * T[i]);
			if ((T[i] >= 1/6) && (T[i] < 1/2)) C[i] = q;
			if ((T[i] >= 1/2) && (T[i] < 2/3)) C[i] = p + ((q - p) * (2/3 - T[i]) * 6);
			C[i] = Math.round(C[i] * 255);
		}
		return {r: C[0], g: C[1], b: C[2], a: 255};
		
	},*/
	
	hsvToRgb: function(hsv) {
		// hsv
		var hi = Math.floor(hsv.h / 60) % 6;
		var f = hsv.h / 60 - Math.floor(hsv.h / 60);
		var p = Math.round(255 * hsv.v * (1 - hsv.s));
		var q = Math.round(255 * hsv.v * (1 - f * hsv.s));
		var t = Math.round(255 * hsv.v * (1 - (1 - f) * hsv.s));
		var v = Math.round(255 * hsv.v);
		if (hi == 0) return {r: v, g: t, b: p, a: 255};
		if (hi == 1) return {r: q, g: v, b: p, a: 255};
		if (hi == 2) return {r: p, g: v, b: t, a: 255};
		if (hi == 3) return {r: p, g: q, b: v, a: 255};
		if (hi == 4) return {r: t, g: p, b: v, a: 255};
		if (hi == 5) return {r: v, g: p, b: q, a: 255};
	},
	
	rgbToHsv : function(color) {
		// http://en.wikipedia.org/wiki/HSL_color_space
		var r = color.r/255;
		var g = color.g/255;
		var b = color.b/255;
		var max = Math.max(r,Math.max(g,b));
		var min = Math.min(r,Math.min(g,b));
		var h = 0;
		if (max == min) h = 0;
		if ((max == r) && (g >= b)) h = 60 * (g - b) / (max - min);
		if ((max == r) && (g < b)) h = 60 * (g - b) / (max - min) + 360;
		if (max == g) h = 60 * (b - r) / (max - min) + 120;
		if (max == b) h = 60 * (r - g) / (max - min) + 240;
		var s = 0;
		if (max != 0) {
			s = 1 - min / max;
		}
		var v = max;
		return {h: h, s: s, v: v};
		/*var l = (max + min) / 2;
		var s = 1;
		if (max == min) s = 0;
		if ((l > 0) && (l <= 1/2)) s = (max - min) / (2*l);
		if ((l > 1/2) && (l < 1)) s = (max - min) / (2 - 2*l);
		return { h:h, s:s, l:l };*/
	},

	/**
	 * set the specified color into colorPicker (set cursors positions...)
	**/
	setcolor : function(){
		var couleur_orig = jQuery("#"+jQuery.ColorPicker.inputHexCode).attr("value");
		if (typeof(couleur_orig)!="undefined") {
		
			var color = jQuery.ColorPicker.parseHexColor(couleur_orig);
			if (color) {
				var h = 173;
				var hsv = jQuery.ColorPicker.rgbToHsv(color);
				
				jQuery('#cPalpha').SliderSetValues([[0,color.a*h/255]]);
				jQuery('#cPhue').SliderSetValues([[0,(360 - hsv.h)*h/360]]);
				jQuery('#cPcolorContainer').SliderSetValues([[hsv.s * 181, (1 - hsv.v)* 179]])
								
				jQuery.ColorPicker.baseColor = {a:color.a, r:color.r, g: color.g, b:color.b};
				jQuery.ColorPicker.currentColor = {a:color.a, r:color.r, g: color.g, b:color.b};
				jQuery.ColorPicker.alpha = color.a;
				jQuery.ColorPicker.updateCurrentColor();
			}

			//alert("setcolor "+couleur_orig+" into colorPicker !");

			//set #cPcolorIndic position (vertical)

			//set #cPhueIndic position (vertical and horizontal)

			//set #cPcolorCurrent color

			//set #cPoldColor color

			//set #cPrgbR, #cPrgbG, #cPrgbB, #cPhex values :

		}

	},

	/**
	 * Show the colorPicker
	**/
	cPShow : function(e,options){

		if (!jQuery.ColorPicker.opened) {
			
			//attached
			el = jQuery(this);
			if (el.attr("attached")) {
				//parse to find options :
				var relAttr = el.attr('rel');
				var opts = relAttr.split('&');

				var oc="";
				var os="";
				var osr="";
				var okf="";

				for(var i=0;i<opts.length;i++){
					var data = opts[i];
					var matchobjcode = data.match(/objcode\=(.*)/gi);
					var matchobjshow = data.match(/objshow\=(.*)/gi);
					var matchshowrgb = data.match(/showrgb\=(.*)/gi);
					var matchokfunc = data.match(/okfunc\=(.*)/gi);
					var psdEditor = data.match(/psdEditor\=(.*)/gi);

					if(matchobjcode){
						oc=matchobjcode[0].split("=");
						oc = oc[1];
					}
					if(matchobjshow){
						os=matchobjshow[0].split("=");
						os = os[1];
					}
					if(matchshowrgb){
						osr=matchshowrgb[0].split("=");
						osr = osr[1];
						if (osr=="1" || osr==true) {
							osr=true;
						}
						else{
							osr=false;
						}
					}
					if(matchokfunc){
						okf=matchokfunc[0].split("=");
						okf = okf[1];
					}
					if (psdEditor){
						psdE = psdEditor[0].split("=");
						psdE = psdE[1];
					}
				}


				var emptyopts=true;
				if (oc!="") {
					jQuery.ColorPicker.inputHexCode=oc;
					emptyopts=false;
				}
				if (os!="") {
					jQuery.ColorPicker.objShowColor = os;
					emptyopts=false;
				}
				if (osr!="") {
					jQuery.ColorPicker.showRGB = osr;
					emptyopts=false;
				}
				if (okf!="") {
					jQuery.ColorPicker.okFunc = okf;
					emptyopts=false;
				}
				if(psdE!="") {
					jQuery.ColorPicker.psdE = psdE;
				}

				if(!emptyopts){
					jQuery.ColorPicker.init();
				}
				
				
			}
			
			var pe = $find(jQuery.ColorPicker.psdE);
			pe._showModalDialogPanel();

			//options allow to re-init at show
			if (options){
				jQuery.extend(jQuery.ColorPicker.options, options);
				jQuery.ColorPicker.init(options);
			}

			var code_couleur = jQuery("#"+jQuery.ColorPicker.options.inputHexCode).attr("value");

			jQuery.ColorPicker.setcolor(code_couleur);

			var X = jQuery.ColorPicker.getCoord(e,'X');
			var Y = jQuery.ColorPicker.getCoord(e,'Y');
			
			//var pe = jQuery.ColorPicker.options.psdEditor;			
			
			
			mpBounds = Sys.UI.DomElement.getBounds($get(pe._modalDialogPanelId));
			/*jQuery("#cPcolorPicker").css("top", -(-Y-10)+"px");
			jQuery("#cPcolorPicker").css("left", X+"px");*/
			jQuery('#cPcolorPicker').css("top", Math.round(mpBounds.y + mpBounds.height / 2 - jQuery('#cPcolorPicker').height() / 2) + "px");
			jQuery('#cPcolorPicker').css("left", Math.round(mpBounds.x + mpBounds.width / 2 - jQuery('#cPcolorPicker').width() / 2) + "px");
			jQuery('#cPcolorPicker').css("background-color", "#efefef");
			jQuery("#cPcolorPicker").css("visibility","visible");
			jQuery.ColorPicker.opened=true;
		}
	},


	/**
	 * replace this function by a jquery.iutils one...
	**/
	getCoord : function(e,what) {
		var ie5=document.all && document.getElementById;

		  if (ie5) {
		      var Xvar = event.x;
			  var Yvar = event.y;
		  }
		  else {
		      var Xvar = e.pageX;
		      var Yvar = e.pageY;
		  }


		  what = what.toUpperCase();
		  switch(what){
		  		case 'X': 	return Xvar;
							break;

		  		case 'Y': 	return Yvar;
							break;
		  	}
	},

/*

	return_code: function(obj_div){
		var k=obj_div.style.backgroundColor;
		var j=(k.substr(4,k.indexOf(")")-4)).split(",");
		var c=new Object();
		c.r=j[0];
		c.g=j[1];
		c.b=j[2];
		objcode.value=rg2html(c);
		objcc.style.visibility='hidden';

		if(myfonc) eval(myfonc);
	},

*/


	/**
	 *
	 * Create the picker structure :
	 **/
	createPicker : function(){

		var cpcp = document.createElement("div");
		cpcp.id="cPcolorPicker";

		/*var cpclose = document.createElement("div");
		cpclose.id="cPclose";
		var closelink = document.createElement("a");
			closelink.href="javascript:jQuery.ColorPicker.cPclose();";
		var closelinktext = document.createTextNode("X");

		closelink.appendChild(closelinktext);
		cpclose.appendChild(closelink);*/
		
		var cpclose = document.createElement("div");
		cpclose.id="cPclose";
		cpclose.onclick = jQuery.ColorPicker.cPclose;
		cpclose.innerHTML = "Cancel";
		

		var cpccont = document.createElement("div");
		cpccont.id="cPcolorContainer";

		var cpc = document.createElement("div");
		cpc.id="cPcolor";

		var cpci = document.createElement("div");
		cpci.id="cPcolorIndic";

		var cph = document.createElement("div");
		cph.id="cPhue";
		
		var cpa = document.createElement("div");
		cpa.id="cPalpha";
		
		var cpai = document.createElement("div");
		cpai.id="cPhueIndic";

		var cphi = document.createElement("div");
		cphi.id="cPhueIndic";

		var cpcc = document.createElement("div");
		cpcc.id="cPcolorCurrent";

		var cpoc = document.createElement("div");
		cpoc.id="cPoldColor";

		var cpcv = document.createElement("div");
		cpcv.id="cPcolorValues";

		// form :
		var f = document.createElement("form");
			f.name="cpicker";
			f.method="post";


		// ----- table dans form:
		var tcv = document.createElement("table");
		var tbodycv = document.createElement("tbody");

		if(jQuery.ColorPicker.showRGB){
				var tr1cv = document.createElement("tr");
				var td1cv1 = document.createElement("td");
				var td1cv1txt = document.createTextNode("R:");
					td1cv1.appendChild(td1cv1txt);

				var td1cv2 = document.createElement("td");
				var input_td1cv2 = document.createElement("input");
					input_td1cv2.type="text";
					input_td1cv2.style.width="30px";
					input_td1cv2.id="cPrgbR";
					input_td1cv2.value="255";
				td1cv2.appendChild(input_td1cv2);
				tr1cv.appendChild(td1cv1);
				tr1cv.appendChild(td1cv2);
				tbodycv.appendChild(tr1cv);

				var tr2cv = document.createElement("tr");
				var td2cv1 = document.createElement("td");
				var td2cv1txt = document.createTextNode("G:");
					td2cv1.appendChild(td2cv1txt);

				var td2cv2 = document.createElement("td");
				var input_td2cv2 = document.createElement("input");
					input_td2cv2.setAttribute("type","text");
					input_td2cv2.style.width="30px";
					input_td2cv2.id="cPrgbG";
					input_td2cv2.value="255";
				td2cv2.appendChild(input_td2cv2);
				tr2cv.appendChild(td2cv1);
				tr2cv.appendChild(td2cv2);
				tbodycv.appendChild(tr2cv);

				var tr3cv = document.createElement("tr");
				var td3cv1 = document.createElement("td");
				var td3cv1txt = document.createTextNode("B:");
					td3cv1.appendChild(td3cv1txt);

				var td3cv2 = document.createElement("td");
				var input_td3cv2 = document.createElement("input");
					input_td3cv2.type="text";
					input_td3cv2.style.width="30px";
					input_td3cv2.id="cPrgbB";
					input_td3cv2.value="255";
				td3cv2.appendChild(input_td3cv2);
				tr3cv.appendChild(td3cv1);
				tr3cv.appendChild(td3cv2);
				tbodycv.appendChild(tr3cv);
				
				var tr4cv = document.createElement("tr");
				var td4cv1 = document.createElement("td");
				var td4cv1txt = document.createTextNode("A:");
					td4cv1.appendChild(td4cv1txt);

				var td4cv2 = document.createElement("td");
				var input_td4cv2 = document.createElement("input");
					input_td4cv2.type="text";
					input_td4cv2.style.width="30px";
					input_td4cv2.id="cPrgbA";
					input_td4cv2.value="255";
				td4cv2.appendChild(input_td4cv2);
				tr4cv.appendChild(td4cv1);
				tr4cv.appendChild(td4cv2);
				tbodycv.appendChild(tr4cv);
		}//if rgb

		var tr4cv = document.createElement("tr");
		var td4cv1 = document.createElement("td");
		td4cv1.style.verticalAlign='top';
		var td4cv1txt = document.createTextNode("#");
		td4cv1.appendChild(td4cv1txt);

		var td4cv2 = document.createElement("td");
		var input_td4cv2 = document.createElement("input");
			input_td4cv2.type="text";
			input_td4cv2.style.width="60px";
			input_td4cv2.id="cPhex";
			input_td4cv2.value="FFFFFF";
		td4cv2.appendChild(input_td4cv2);

			///bouton 'ok':
			/*var bok = document.createElement("input");
				bok.type="button";
				bok.id="cPbuttok";
				bok.value="OK";
				bok.onclick = jQuery.ColorPicker.cPok;*/
		

		//td4cv2.appendChild(bok);

		tr4cv.appendChild(td4cv1);
		tr4cv.appendChild(td4cv2);

		tbodycv.appendChild(tr4cv);
		//tbodycv.appendChild(bok);
		tcv.appendChild(tbodycv);
		// ----- fin table


		//cpc.appendChild(cpci);
		cpccont.appendChild(cpc);
		cpccont.appendChild(cpci);
		cpcp.appendChild(cpccont);

		cph.appendChild(cphi);
		cpcp.appendChild(cph);
		
		cpa.appendChild(cpai);
		cpcp.appendChild(cpa);

		cpcc.appendChild(cpoc);
		cpcp.appendChild(cpcc);

		f.appendChild(tcv);
		cpcv.appendChild(f);
		cpcp.appendChild(cpcv);

		var bok = document.createElement("div");
		bok.id="cPbuttok";
		bok.innerHTML="OK";
		bok.onclick = jQuery.ColorPicker.cPok;
		cpcp.appendChild(bok);
		
		cpcp.appendChild(cpclose);


		jQuery("body").prepend(cpcp);
	}


}; //end!


