function cp(v, o)
{
	return((typeof(o)=='object'?o:document).getElementById(v));
}

function cpS(o)
{
	o=cp(o);
	if(o) return(o.style);
}

function abPos(o)
{
	var o=(typeof(o)=='object'?o:cp(o)), z={X:0,Y:0};
	while(o!=null)
	{
		z.X+=o.offsetLeft;
		z.Y+=o.offsetTop;
		o=o.offsetParent;
	}
	return(z);
}

function agent(v)
{
	return(Math.max(navigator.userAgent.toLowerCase().indexOf(v),0));
}

function toggle(v)
{
	cpS(v).display=(cpS(v).display=='none'?'block':'none');
}

function within(v, a, z)
{
	return((v>=a && v<=z)?true:false);
}

function XY(e, v)
{
	var z=agent('msie')?[event.clientX+document.body.scrollLeft,event.clientY+document.body.scrollTop]:[e.pageX,e.pageY];
	return(z[zero(v)]);
}

function zero(v)
{
	v=parseInt(v);
	return(!isNaN(v)?v:0);
}

/* COLOR PICKER */

var maxValue={'H':360,'S':100,'V':100}, HSV={H:360, S:100, V:100};

var slideHSV={H:360, S:100, V:100}, zINDEX=15, stop=1;

function HSVslide(d,o,e) {

	function tXY(e) { tY=XY(e,1)-ab.Y; tX=XY(e)-ab.X; }
	function mkHSV(a,b,c) { return(Math.min(a,Math.max(0,Math.ceil((parseInt(c)/b)*a)))); }
	function ckHSV(a,b) { if(within(a,0,b)) return(a); else if(a>b) return(b); else if(a<0) return('-'+oo); }
	function drag(e) { if(!stop) { if(d!='drag') tXY(e);
	
		if(d=='SVslide') { ds.left=ckHSV(tX-oo,96)+'px'; ds.top=ckHSV(tY-oo,95)+'px';

			slideHSV.S=mkHSV(100,96,ds.left); slideHSV.V=100-mkHSV(100,95,ds.top); HSVupdate();

		}
		else if(d=='Hslide') { var ck=ckHSV(tY-oo,98), r=['H','S','V'], z={};
		
			ds.top=(ck-5)+'px'; slideHSV.H=mkHSV(360,98,ck);

			z['H']=maxValue['H']-mkHSV(maxValue['H'],98,ck);
			z['S']=HSV['S'];
			z['V']=HSV['V'];

			HSVupdate(z); cpS('SV').backgroundColor='#'+color.HSV_HEX({H:HSV.H, S:100, V:100});

		}
		else if(d=='drag') { ds.left=XY(e)+oX-eX+'px'; ds.top=XY(e,1)+oY-eY+'px'; }

	}}

	if(stop) { stop=''; var ds=cpS(d!='drag'?d:o);

		if(d=='drag') { var oX=parseInt(ds.left), oY=parseInt(ds.top), eX=XY(e), eY=XY(e,1); cpS(o).zIndex=zINDEX++; }

		else { var ab=abPos(cp(o)), tX, tY, oo=(d=='Hslide')?2:4; ab.X+=11; ab.Y+=7; if(d=='SVslide') slideHSV.H=HSV.H; }

		document.onmousemove=drag; document.onmouseup=function(){ stop=1; document.onmousemove=''; document.onmouseup=''; }; drag(e);

	}
};

function HSVupdate(v) {
	if(v == undefined)
	{
		var v = color.HSV_HEX(slideHSV);
		HSV = slideHSV;
	}
	else
	{
		HSV = v;	
		v = color.HSV_HEX(v);
	}

	$('color_value').value = v;
	cpS('awesome_body').backgroundColor = '#' + v;	
	
	return(v);
};

function loadSV() { var z='';

	for(var i=99; i>=0; i--) { z+="<div style=\"background: #"+color.HSV_HEX({H:Math.round((360/99)*i), S:100, V:100})+";\"><br /><\/div>"; }

	cp('Hmodel').innerHTML=z;
	
};


/* COLOR LIBRARY */

color={};

color.cords=function(W) {

	var W2=W/2, rad=(hsv.H/360)*(Math.PI*2), hyp=(hsv.S+(100-hsv.V))/100*(W2/2);

	cpS('mCur').left=Math.round(Math.abs(Math.round(Math.sin(rad)*hyp)+W2+3))+'px';
	cpS('mCur').top=Math.round(Math.abs(Math.round(Math.cos(rad)*hyp)-W2-21))+'px';

};

color.HEX=function(o) { o=Math.round(Math.min(Math.max(0,o),255));

    return("0123456789ABCDEF".charAt((o-o%16)/16)+"0123456789ABCDEF".charAt(o%16));

};

color.RGB_HEX=function(o) { var fu=color.HEX; return(fu(o.R)+fu(o.G)+fu(o.B)); };

color.HSV_RGB=function(o) {
    
    var R, G, A, B, C, S=o.S/100, V=o.V/100, H=o.H/360;

    if(S>0) { if(H>=1) H=0;

        H=6*H; F=H-Math.floor(H);
        A=Math.round(255*V*(1-S));
        B=Math.round(255*V*(1-(S*F)));
        C=Math.round(255*V*(1-(S*(1-F))));
        V=Math.round(255*V); 

        switch(Math.floor(H)) {

            case 0: R=V; G=C; B=A; break;
            case 1: R=B; G=V; B=A; break;
            case 2: R=A; G=V; B=C; break;
            case 3: R=A; G=B; B=V; break;
            case 4: R=C; G=A; B=V; break;
            case 5: R=V; G=A; B=B; break;

        }

        return({'R':R?R:0, 'G':G?G:0, 'B':B?B:0, 'A':1});

    }
    else return({'R':(V=Math.round(V*255)), 'G':V, 'B':V, 'A':1});

};

// Start of Added By Enrico Simonetti

color.HEX_HSV = function(color_string)
{
	var r = parseInt(color_string.substr(0,2),16);
	var g = parseInt(color_string.substr(2,2),16);
	var b = parseInt(color_string.substr(4,2),16);
	var r = (r / 255), g = (g / 255), b = (b / 255);   
   
	var min = Math.min(Math.min(r, g), b), max = Math.max(Math.max(r, g), b), delta = max - min;  
        var value = max, saturation, hue;  
   
	// Hue  
	if(max == min)
	{
		hue = 0;  
	}
	else if (max == r)
	{
		hue = (60 * ((g-b) / (max-min))) % 360;
	}
	else if (max == g)
	{
		hue = 60 * ((b-r) / (max-min)) + 120;  
	}
	else if (max == b)
	{  
		hue = 60 * ((r-g) / (max-min)) + 240;  
	}  
   
	if(hue < 0)
	{  
		hue += 360;  
	}  
   
	// Saturation  
	if(max == 0)
	{
		saturation = 0;  
	}
	else
	{  
		saturation = 1 - (min/max);  
	}  
   
	var h = Math.round(hue);
	var s = Math.round(saturation * 100);
	var v = Math.round(value * 100);
	
        return {'H':h, 'S':s, 'V':v };
};

color.repositionCursors = function(hex_string)
{
	var hsv = this.HEX_HSV(hex_string);
	var new_sv = cpS('SVslide');
	var sv_min = -4;
	var sv_max = 96;
	var sv_length = sv_max - sv_min;
	
	var s = hsv.S;
	var v = hsv.V;

        var new_h = cpS('Hslide');
        var h_min = -6;
        var h_max = 90;
        var h_length = h_max - h_min;

        var h = hsv.H;

	new_sv.left = ((sv_length / 100 * s) + sv_min) + 'px';
	new_sv.top = ((sv_max - ( sv_length / 100 * v))) + 'px';
	if(h != 0) new_h.top = (h_max - (h_length / 360 * h)) + 'px';
	if(h!=0 && s!=0 && v!=0) cpS('SV').backgroundColor = '#'+color.HSV_HEX({'H':h, 'S':100, 'V':100});

	HSVupdate(hsv);
}

// End of Added By Enrico Simonetti

color.HSV_HEX=function(o) { return(color.RGB_HEX(color.HSV_RGB(o))); };

/* LOAD */

loadSV();
