
jQuery.fn.farbtastic=function(callback){
$.farbtastic(this,callback);
return this};
jQuery.farbtastic=function(container,callback){
var container=$(container).get(0);
return container.farbtastic||(container.farbtastic=new jQuery._farbtastic(container,callback))}
jQuery._farbtastic=function(container,callback){
var fb=this;
$(container).html('<div class="farbtastic"><div class="color"></div><div class="wheel"></div><div class="overlay"></div><div class="h-marker marker"></div><div class="sl-marker marker"></div></div>');
var e=$('.farbtastic',container);
fb.wheel=$('.wheel',container).get(0);
fb.radius=84;
fb.square=100;
fb.width=194;
if(navigator.appVersion.match(/MSIE [0-6]\./)){
$('*',e).each(function(){
if(this.currentStyle.backgroundImage!='none'){
var image=this.currentStyle.backgroundImage;
image=this.currentStyle.backgroundImage.substring(5,image.length-2);
$(this).css({
'backgroundImage':'none',
'filter':"progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='"+image+"')"
})}
})}
fb.linkTo=function(callback){
if(typeof fb.callback=='object'){
$(fb.callback).unbind('keyup',fb.updateValue)}
fb.color=null;
if(typeof callback=='function'){
fb.callback=callback}
else if(typeof callback=='object'||typeof callback=='string'){
fb.callback=$(callback);
fb.callback.bind('keyup',fb.updateValue);
if(fb.callback.get(0).value){
fb.setColor(fb.callback.get(0).value)}
}
return this}
fb.updateValue=function(event){
if(this.value&&this.value!=fb.color){
fb.setColor(this.value)}
}
fb.setColor=function(color){
var unpack=fb.unpack(color);
if(fb.color!=color&&unpack){
fb.color=color;
fb.rgb=unpack;
fb.hsl=fb.RGBToHSL(fb.rgb);
fb.updateDisplay()}
return this}
fb.setHSL=function(hsl){
fb.hsl=hsl;
fb.rgb=fb.HSLToRGB(hsl);
fb.color=fb.pack(fb.rgb);
fb.updateDisplay();
return this}
fb.widgetCoords=function(event){
var x,y;
var el=event.target||event.srcElement;
var reference=fb.wheel;
if(typeof event.offsetX!='undefined'){
var pos={x:event.offsetX,y:event.offsetY};
var e=el;
while(e){
e.mouseX=pos.x;
e.mouseY=pos.y;
pos.x+=e.offsetLeft;
pos.y+=e.offsetTop;
e=e.offsetParent}
var e=reference;
var offset={x:0,y:0}
while(e){
if(typeof e.mouseX!='undefined'){
x=e.mouseX-offset.x;
y=e.mouseY-offset.y;
break}
offset.x+=e.offsetLeft;
offset.y+=e.offsetTop;
e=e.offsetParent}
e=el;
while(e){
e.mouseX=undefined;
e.mouseY=undefined;
e=e.offsetParent}
}
else{
var pos=fb.absolutePosition(reference);
x=(event.pageX||0*(event.clientX+$('html').get(0).scrollLeft))-pos.x;
y=(event.pageY||0*(event.clientY+$('html').get(0).scrollTop))-pos.y}
return{x:x-fb.width/2,y:y-fb.width/2}}
fb.mousedown=function(event){
if(!document.dragging){
$(document).bind('mousemove',fb.mousemove).bind('mouseup',fb.mouseup);
document.dragging=true}
var pos=fb.widgetCoords(event);
fb.circleDrag=Math.max(Math.abs(pos.x),Math.abs(pos.y))*2>fb.square;
fb.mousemove(event);
return false}
fb.mousemove=function(event){
var pos=fb.widgetCoords(event);
if(fb.circleDrag){
var hue=Math.atan2(pos.x,-pos.y)/6.28;
if(hue<0)hue+=1;
fb.setHSL([hue,fb.hsl[1],fb.hsl[2]])}
else{
var sat=Math.max(0,Math.min(1,-(pos.x/fb.square)+.5));
var lum=Math.max(0,Math.min(1,-(pos.y/fb.square)+.5));
fb.setHSL([fb.hsl[0],sat,lum])}
return false}
fb.mouseup=function(){
$(document).unbind('mousemove',fb.mousemove);
$(document).unbind('mouseup',fb.mouseup);
document.dragging=false}
fb.updateDisplay=function(){
var angle=fb.hsl[0]*6.28;
$('.h-marker',e).css({
left:Math.round(Math.sin(angle)*fb.radius+fb.width/2)+'px',
top:Math.round(-Math.cos(angle)*fb.radius+fb.width/2)+'px'
});
$('.sl-marker',e).css({
left:Math.round(fb.square*(.5-fb.hsl[1])+fb.width/2)+'px',
top:Math.round(fb.square*(.5-fb.hsl[2])+fb.width/2)+'px'
});
$('.color',e).css('backgroundColor',fb.pack(fb.HSLToRGB([fb.hsl[0],1,0.5])));
if(typeof fb.callback=='object'){
$(fb.callback).css({
backgroundColor:fb.color,
color:fb.hsl[2]>0.5?'#000':'#fff'
});
$(fb.callback).each(function(){
if(this.value&&this.value!=fb.color){
this.value=fb.color}
})}
else if(typeof fb.callback=='function'){
fb.callback.call(fb,fb.color)}
}
fb.absolutePosition=function(el){
var r={x:el.offsetLeft,y:el.offsetTop};
if(el.offsetParent){
var tmp=fb.absolutePosition(el.offsetParent);
r.x+=tmp.x;
r.y+=tmp.y}
return r};
fb.pack=function(rgb){
var r=Math.round(rgb[0]*255);
var g=Math.round(rgb[1]*255);
var b=Math.round(rgb[2]*255);
return'#'+(r<16?'0':'')+r.toString(16)+
(g<16?'0':'')+g.toString(16)+
(b<16?'0':'')+b.toString(16)}
fb.unpack=function(color){
if(color.length==7){
return[parseInt('0x'+color.substring(1,3))/255,
parseInt('0x'+color.substring(3,5))/255,
parseInt('0x'+color.substring(5,7))/255]}
else if(color.length==4){
return[parseInt('0x'+color.substring(1,2))/15,
parseInt('0x'+color.substring(2,3))/15,
parseInt('0x'+color.substring(3,4))/15]}
}
fb.HSLToRGB=function(hsl){
var m1,m2,r,g,b;
var h=hsl[0],s=hsl[1],l=hsl[2];
m2=(l<=0.5)?l*(s+1):l+s-l*s;
m1=l*2-m2;
return[this.hueToRGB(m1,m2,h+0.33333),
this.hueToRGB(m1,m2,h),
this.hueToRGB(m1,m2,h-0.33333)]}
fb.hueToRGB=function(m1,m2,h){
h=(h<0)?h+1:((h>1)?h-1:h);
if(h*6<1)return m1+(m2-m1)*h*6;
if(h*2<1)return m2;
if(h*3<2)return m1+(m2-m1)*(0.66666-h)*6;
return m1}
fb.RGBToHSL=function(rgb){
var min,max,delta,h,s,l;
var r=rgb[0],g=rgb[1],b=rgb[2];
min=Math.min(r,Math.min(g,b));
max=Math.max(r,Math.max(g,b));
delta=max-min;
l=(min+max)/2;
s=0;
if(l>0&&l<1){
s=delta/(l<0.5?(2*l):(2-2*l))}
h=0;
if(delta>0){
if(max==r&&max!=g)h+=(g-b)/delta;
if(max==g&&max!=b)h+=(2+(b-r)/delta);
if(max==b&&max!=r)h+=(4+(r-g)/delta);
h/=6}
return[h,s,l]}
$('*',e).mousedown(fb.mousedown);
fb.setColor('#000000');
if(callback){
fb.linkTo(callback)}
}

$(document).ready(
function(){
init_palette()}
);
function init_palette(){
$("input.palette").each(
function(i,palette){
$(palette).css("background-color",$(palette).attr("value"));
palette.id=palid(palette);
palette.onclick=function(e){
$(".colorpicker").empty().remove();
$(palette)
.after('<div class="colorpicker"><div class="colorpicker_close" title="Fermer la palette">&nbsp;x&nbsp;</div><div class="colorpicker_bar">Palette</div><div id="colorpicker"></div></div>');
$.farbtastic('#colorpicker',palette);
$(".colorpicker_close")
.hover(function(){$(this).addClass("hover")},function(){$(this).removeClass("hover")})
.click(function(){$(".colorpicker").empty().remove()})}}
)}
function palid(element){
if(!$(element).attr("id")){
var newid=parseInt(10000+10000*Math.random());
return newid}
return $(element).attr("id")}

