var undoBuffer;
var tOptionsHide;
var oMenu;
var oColor;
var oSwatchId;
var oPalette;
var oPaletteName;
var aPalette;
var undoPalette = "";

var mouseX, mouseY;

var slider_r;
var slider_g;
var slider_b;
var slider_h;
var slider_s;
var slider_v;
var colorMatchSet = new Array("000000","000000","000000","000000","000000","000000");

var ccb="000000";
var cct="FFFFFF";

var sNoColors = "<p><strong>Your current palette is empty.</strong></p>";
var sFloatFix="<div style='clear:both; height:1px; overflow:hidden; margin:0px; padding:0px;'></div>";
var currentLibraryName="";


function initCurrentPalette() {
    getPalette();
    renderPalette();
    
    // swatch context menu
    oMenu = new YAHOO.widget.Menu("basicmenu", { position: "dynamic", x:200, y:200 }); 

    oMenu.addItems([   
         { text: "Edit color", onclick: { fn:useSwatchInPicker, obj:"bar"} },
         { text: "Remove color", onclick: { fn:removeFromCurrentPalette, obj:"bar"} },
         { text: "Use with Color Match", onclick: { fn:useWithColorMatch, obj:"bar"} },
         { text: "Convert to other system", onclick: { fn:convertColor, obj:"bar"} }
     ]);  
    oMenu.render(document.body);    
}


function getPalette () {    
    if(sPalette!=""){
        aPalette=sPalette.split(",");
        undoPalette=sPalette;
    }else{
        aPalette=new Array();
    }
}


function clearCurrentPalette() {
    if (aPalette.length > 0) {
        if (confirm("Are you sure you want to delete\nall colors of the current palette?\n\nThis operation can not be undone!")) {
            aPalette = new Array();
            postPalette();
            renderPalette();
        }
    }
    return (false);
}


function fixRgbColor(sColor) {
    if (sColor.substr(0, 3) == "rgb") {
        // Firefox style background color
        sColor = sColor.substr(4);
        sColor = sColor.substr(0, sColor.length - 1);
        sColor = sColor.replace(/ /gi, "");
        var trgb = new Object();
        trgb.r = sColor.split(",")[0];
        trgb.g = sColor.split(",")[1];
        trgb.b = sColor.split(",")[2];
        sColor = rgb2html(trgb);
    }
    if (sColor.substr(0, 1) == "#") {
        sColor = sColor.substr(1, 6);
    }    
    return (sColor);
}

function fold(sTool) {
	var e=document.getElementById("tool_"+sTool);
	if (e) {
		var c=e.getElementsByTagName("DIV");
		var d;
		for(var i=0;i<c.length;i++){
			if(c[i].className=="content"){
				d=c[i].style;
				d.display=(d.display=="none")?"block":"none";
			}
		}
		e.getElementsByTagName("IMG")[0].src="gfx/toolwindow_fold_"+((d.display=="none")?"right":"down")+".gif";
	}
}

function displayCurrentPaletteFunctions() {
    document.getElementById("currentPaletteFunctions").style.display = "block";
}

function commitPaletteOperations() {
    postPalette();
    document.getElementById("currentPaletteFunctions").style.display = "none";
    return(false);
}

function undoPaletteOperations() {
    sPalette = undoPalette;
    getPalette();
    renderPalette();
    document.getElementById("currentPaletteFunctions").style.display = "none";
    return (false);
}


function renderPalette() {
    document.getElementById("noColorsInfo").style.display = (aPalette.length==0)?"block":"none";
    document.getElementById("swatches").innerHTML=getSwatchesHTML(aPalette)+sFloatFix;
}

function dec2html(d){
	// Converts from decimal color value (0-255) to HTML-style (00-FF)
	var hch="0123456789ABCDEF";
	var a=d%16;
	var b=(d-a)/16;
	return hch.charAt(b)+hch.charAt(a);
}

function html2dec(h){
	// Converts from HEX/HTML-style (00-FF) to decimal color value (0-255)
	return parseInt(h,16);
}

function rgb2html(rgb){
	// Converts from RGB color object to HEX/HTML-style color (AABBCC)
	return dec2html(rgb.r)+dec2html(rgb.g)+dec2html(rgb.b);
}

function html2rgb(htmlcol){
	// Converts from RGB color object to HEX/HTML-style color (AABBCC)
	var rgb=new Object();
	rgb.r=html2dec(htmlcol.substr(0,2));
	rgb.g=html2dec(htmlcol.substr(2,2));
	rgb.b=html2dec(htmlcol.substr(4,2));
	return rgb;
}

function convertToInt(s, min, max) {
    var cs = "";
    var ics = 0;
    for (var a = 0; a < s.length; a++) {
        if ("0123456789".indexOf(s.charAt(a)) >= 0) {
            cs += s.charAt(a);
        }
    }
    if (cs == "") cs = min;
    ics = parseInt(cs);
    if (ics > max) ics = max;
    if (ics < min) ics = min;
    return (ics);
}

function rgb2hsv(rg){
	// Converts an RGB color object to a HSV color object
	var hs=new Object();
	var m=rg.r;
	if(rg.g<m){m=rg.g};
	if(rg.b<m){m=rg.b};
	var v=rg.r;
	if(rg.g>v){v=rg.g};
	if(rg.b>v){v=rg.b};
	var value=100*v/255;
	var delta=v-m;
	if(v==0.0){hs.s=0}else{hs.s=100*delta/v};
	if(hs.s==0){hs.h=0}else{
		if(rg.r==v){hs.h=60.0*(rg.g-rg.b)/delta}
			else if(rg.g==v){hs.h=120.0+60.0*(rg.b-rg.r)/delta}
				else if(rg.b=v){hs.h=240.0+60.0*(rg.r-rg.g)/delta}
	if(hs.h<0.0){hs.h=hs.h+360.0}
	}
	hs.h=Math.round(hs.h);
	hs.s=Math.round(hs.s);
	hs.v=Math.round(value);
	return(hs);
}

function hsv2rgb(hsx){
	// Converts an HSV color object to a RGB color object
	var rg=new Object();
	
	var ls = hsx.s;
	var lh = hsx.h;
	var lv = hsx.v;
	
	if(ls==0){
		rg.r=rg.g=rg.b=Math.round(lv*2.55); return(rg);
	}
	ls=ls/100;
	lv=lv/100;
	lh/=60;
	var i=Math.floor(lh);
	var f=lh-i;
	var p=lv*(1-ls);
	var q=lv*(1-ls*f);
	var t=lv*(1-ls*(1-f));
	switch(i){
		case 0:rg.r=lv; rg.g=t; rg.b=p; break;
		case 1:rg.r=q; rg.g=lv; rg.b=p; break;
		case 2:rg.r=p; rg.g=lv; rg.b=t; break;
		case 3:rg.r=p; rg.g=q; rg.b=lv; break;
		case 4:rg.r=t; rg.g=p; rg.b=lv; break;
		default: rg.r=lv; rg.g=p; rg.b=q;
	}
	rg.r=Math.round(rg.r*255);
	rg.g=Math.round(rg.g*255);
	rg.b=Math.round(rg.b*255);
	return(rg);
}

function makeWebSafe(c) {
	var rgb=html2rgb(c);
	return (dec2html(Math.round(rgb.r/51)*51)+dec2html(Math.round(rgb.g/51)*51)+dec2html(Math.round(rgb.b/51)*51));
}

function isWebSafe(c) {
    if(c==makeWebSafe(c)){return(true)}else{return(false)};
}

function correctColor(c,e,v) {

    // c: HTML style color
    // e: color component (R,G,B,H,S,V)
    // v: value to add

    var rgb=html2rgb(c);
    var hsv=rgb2hsv(rgb);
    
    if(e=="r"){
        rgb.r=rgb.r+v;
        if(rgb.r<0)rgb.r=0;
        if(rgb.r>255)rgb.r=255;
    }
    if(e=="g"){
        rgb.g=rgb.g+v;
        if(rgb.g<0)rgb.g=0;
        if(rgb.g>255)rgb.g=255;
    }
    if(e=="b"){
        rgb.b=rgb.b+v;
        if(rgb.b<0)rgb.b=0;
        if(rgb.b>255)rgb.b=255;
    }

    if(e=="h"){
        hsv.h=(hsv.h+v+360)%360;
        rgb=hsv2rgb(hsv);
    }
    if(e=="s"){
        hsv.s=hsv.s+v;
        if(hsv.s<0)hsv.s=0;
        if(hsv.s>100)hsv.s=100;
        rgb=hsv2rgb(hsv);
    }
    if(e=="v"){
        hsv.v=hsv.v+v;
        if(hsv.v<0)hsv.v=0;
        if(hsv.v>100)hsv.v=100;
        rgb=hsv2rgb(hsv);
    }
    return rgb2html(rgb);
}

function setUndoBuffer(x) {
	aUndoBuffer=aPalette.slice(0);
}
function undoredo() {
	var aNewUndoBuffer=aPalette;
	aPalette=aUndoBuffer;
	aUndoBuffer=aNewUndoBuffer;
	if(activeTab==1){updateSwatches()}else{css_doUpdateSwatches()}
}


function getQuerystring(key, default_)
{
  if (default_==null) default_=""; 
  key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
  var qs = regex.exec(window.location.href);
  if(qs == null)
    return default_;
  else
    return qs[1];
} 


// COLOR LIBRARIES  - START  --------------------------------------------------------------------------------------------------

function initColorLibraries() {
    getPalette();
    renderCurrentPalette_NoInteraction();

    // swatch context menu
    oMenu = new YAHOO.widget.Menu("basicmenu", { position: "dynamic", x:200, y:200 }); 

    oMenu.addItems([   
         { text: "Add to current palette", onclick: { fn:addToCurrentPalette, obj:"bar"} },
         { text: "Use with Color Match", onclick: { fn:useWithColorMatch, obj:"bar"} },
         { text: "Convert to other system", onclick: { fn:convertColor, obj:"bar"} }
     ]);  
    oMenu.render(document.body);
}


function chooseLibrary(sLibraryName) {
    if(sLibraryName!=""){
        document.getElementById("swatches").innerHTML="<img src='gfx/loader_light.gif' alt='Loading library ...' />";
        currentLibraryName=sLibraryName;
        window.setTimeout("renderLibrary()",100);
    }else{
        document.getElementById("swatches").innerHTML="";
        document.getElementById("library_info").innerHTML="";
    }
}

function renderLibrary() {
    var sInfo="";
    if(eval(currentLibraryName+"info")){
        sInfo=eval(currentLibraryName+"info")[2];
    }
    sInfo+="<p><b>Colors in library:</b> "+eval(currentLibraryName).length+"</p>";
    if(eval(currentLibraryName+"info")[3]!=""){
        sInfo+="<p><b>More information:</b> <a href='"+eval(currentLibraryName+"info")[3]+"' target='_blank'>Read more</a></p>";
    }
    document.getElementById("library_info").innerHTML=sInfo;

	var sHTML="";
	var oRGB;
	var sColorBaseName=eval(currentLibraryName+"info")[1];
	var colorLibrary = eval(currentLibraryName);
	var swatchArray = new Array();
	for(var i=0;i<colorLibrary.length;i++){
	    var aColor=colorLibrary[i].split("~");
	    oRGB=html2rgb(aColor[1]);
	    var tempStr = "<div class=\"swatch\" onclick=\"showMenu('"+aColor[1]+"',"+i+")\" id=\"swatch"+i+"\">";
		    tempStr+= "<div class=\"color\" style=\"background-color:#"+aColor[1]+"\">&nbsp;</div>";
		    tempStr+= "<div class=\"info\">R: "+oRGB.r+"<br/>G: "+oRGB.g+"<br/>B: "+oRGB.b+"<br/>#"+aColor[1]+"</div>";
		    tempStr+= "<div class=\"name\">"+sColorBaseName+" "+aColor[0]+"</div>";
		    tempStr+= "</div>";
		swatchArray.push(tempStr);
	}
	sHTML = swatchArray.join("");
	document.getElementById("swatches").innerHTML=sHTML+sFloatFix;
}

function showMenu(htmlcolor,swatchid) {
    oMenu.show();
    document.getElementById("basicmenu").style.left = (YAHOO.util.Dom.getX("swatch"+swatchid)-20) + "px";
    document.getElementById("basicmenu").style.top = (YAHOO.util.Dom.getY("swatch"+swatchid)+10) + "px";
    oColor = htmlcolor;
    oSwatchId = swatchid;
}

function removeFromCurrentPalette(eventtype,eventargs,obj){
    removeSwatch(oSwatchId);
}
function addToCurrentPalette(eventtype, eventargs, obj) {
    addNewSwatch(oColor);
}
function useColorInPicker(eventtype,eventargs,obj){
    window.location = "colorpicker.aspx?c=" + oColor;
}
function useSwatchInPicker(eventtype,eventargs,obj){
    window.location = "colorpicker.aspx?s=" + oSwatchId;
}
function useWithColorMatch(eventtype,eventargs,obj){
    window.location = "colormatch.aspx?c=" + oColor;
}    
function convertColor(eventtype,eventargs,obj){
    window.location = "convert.aspx?c=" + oColor;
}


function sortLibrary(sKey) {
    setTimeout("dosortLibrary('" + sKey + "')", 200);
    return (false);	
}

function dosortLibrary(sKey) {
	if(currentLibraryName!="") {
		switch(sKey){
			case "name":
				eval(currentLibraryName).sort(sortColorsName);
				break;
			case "hue":
				eval(currentLibraryName).sort(sortColorsHue);
				break;
			case "light":
				eval(currentLibraryName).sort(sortColorsLight);
				break;
			case "sat":
				eval(currentLibraryName).sort(sortColorsSat);
				break;
		}
		renderLibrary();
	}
}

function sortColorsHue(col1,col2) {
	var iRet;
	var hsv1=rgb2hsv(html2rgb(col1.split("~")[1]));
	var hsv2=rgb2hsv(html2rgb(col2.split("~")[1]));
	if(hsv1.h<hsv2.h)iRet=-1;
	if(hsv1.h>hsv2.h)iRet=1;
	if(hsv1.h==hsv2.h)iRet=0;
	return iRet;
}

function sortColorsLight(col1,col2) {
	var hsv1=rgb2hsv(html2rgb(col1.split("~")[1]));
	var hsv2=rgb2hsv(html2rgb(col2.split("~")[1]));
	if(hsv1.v<hsv2.v)return(-1);
	if(hsv1.v>hsv2.v)return(1);
	if(hsv1.v==hsv2.v)return(0);
}

function sortColorsSat(col1,col2) {
	var hsv1=rgb2hsv(html2rgb(col1.split("~")[1]));
	var hsv2=rgb2hsv(html2rgb(col2.split("~")[1]));
	if(hsv1.s<hsv2.s)return(-1);
	if(hsv1.s>hsv2.s)return(1);
	if(hsv1.s==hsv2.s)return(0);
}

function sortColorsName(col1,col2) {
	var val1=col1.split("~")[0];
	var val2=col2.split("~")[0];
	if(val1<val2)return(-1);
	if(val1>val2)return(1);
	if(val1==val2)return(0);
}

// COLOR LIBRARIES  - END




// PALETTE OPERATIONS  -  START

function sortSwatches(sKey) {
	switch(sKey){
		case "hue":
		    aPalette.sort(sortSwatchesHue);
			break;
		case "light":
		    aPalette.sort(sortSwatchesLight);
			break;
		case "sat":
		    aPalette.sort(sortSwatchesSat);
			break;
		case "intensity":
		    aPalette.sort(sortSwatchesIntensity);
			break;
	}
	renderPalette();
	displayCurrentPaletteFunctions();
	return (false);
}
function sortSwatchesHue(col1,col2) {
	var iRet=0;
	var hsv1=rgb2hsv(html2rgb(col1));
	var hsv2=rgb2hsv(html2rgb(col2));
	if(hsv1.h<hsv2.h)iRet=-1;
	if(hsv1.h>hsv2.h)iRet=1;
	return iRet;
}
function sortSwatchesLight(col1,col2) {
	var hsv1=rgb2hsv(html2rgb(col1));
	var hsv2=rgb2hsv(html2rgb(col2));
	if(hsv1.v<hsv2.v)return(-1);
	if(hsv1.v>hsv2.v)return(1);
	if(hsv1.v==hsv2.v)return(0);
}
function sortSwatchesSat(col1,col2) {
	var hsv1=rgb2hsv(html2rgb(col1));
	var hsv2=rgb2hsv(html2rgb(col2));
	if(hsv1.s<hsv2.s)return(-1);
	if(hsv1.s>hsv2.s)return(1);
	if(hsv1.s==hsv2.s)return(0);
}
function sortSwatchesIntensity(col1,col2) {
	var hsv1=rgb2hsv(html2rgb(col1));
	var hsv2=rgb2hsv(html2rgb(col2));
	var h1int = hsv1.s * hsv1.v;
	var h2int = hsv2.s * hsv2.s;
	if(h1int<h2int)return(-1);
	if(h1int>h2int)return(1);
	if(h1int==h2int)return(0);
}

function applyPaletteStyle(style) {
    var i,hsv,rgb,h,s,v;
    switch(style) {
    
        case "pastel":     // PASTEL
            for(i=0;i<aPalette.length;i++){
                  hsv=rgb2hsv(html2rgb(aPalette[i]));
                  hsv.s=15;
                  hsv.v=85;
                  aPalette[i]=rgb2html(hsv2rgb(hsv));
            }
            break;
        
        case "dusty":     // DUSTY
            for(i=0;i<aPalette.length;i++){
                  hsv=rgb2hsv(html2rgb(aPalette[i]));
                  hsv.s=20;
                  hsv.v=50;
                  aPalette[i]=rgb2html(hsv2rgb(hsv));
            }
            break;
        
        case "fresh":     // FRESH
            for(i=0;i<aPalette.length;i++){
                  hsv=rgb2hsv(html2rgb(aPalette[i]));
                  hsv.s=80;
                  hsv.v=80;
                  aPalette[i]=rgb2html(hsv2rgb(hsv));
            }
            break;
        
        case "seventies":     // SEVENTIES
            for(i=0;i<aPalette.length;i++){
                  hsv=rgb2hsv(html2rgb(aPalette[i]));

                  h=hsv.h;
                  if((h>=110)&&(h<290)) {   // blue range
                    h=200 + (h-200)*0.6;
                  }else{                    // orangered range
                    h+=500;
                    h=530 + (h-530)*0.6;
                    h-=500;
                  }
                  
                  s=hsv.s;
                  
                  v=hsv.v;
                  if(v>50){
                    v+=10;
                    s*=1.2;
                  }else{
                    v-=5;
                    s*=1.4;
                  }

                  if(v>100)v=100;
                  if(v<0)v=0;
                  if(s>100)s=100;
                  if(s<0)s=0;

                  hsv.v=v;
                  hsv.h=h;
                  hsv.s=s;
                  
                  aPalette[i]=rgb2html(hsv2rgb(hsv));
            }
            break;
        
        case "comicbook":     // COMIC BOOK
            for(i=0;i<aPalette.length;i++){
                  hsv=rgb2hsv(html2rgb(aPalette[i]));

                  h=hsv.h;
                  if((h>=60)&&(h<220)) {   // green
                    h=140 + (h-140)*0.6;
                  }else{                    // magenta
                    if(h<60){
                        h+=360;
                        h=320 + (h-320)*0.6;
                        h=(h)%360;
                    }else{
                        h=320 + (h-320)*0.6;
                    }
                  }
                  
                  s=hsv.s;
                  s=30 + (s-30)*0.6;
                  
                  v=hsv.v;
                  if(v>50){
                    v+=10;
                  }else{
                    v-=5;
                  }
                  v=70 + (v-70)*0.6;


                  if(v>100)v=100;
                  if(v<0)v=0;
                  if(s>100)s=100;
                  if(s<0)s=0;

                  hsv.v=v;
                  hsv.h=h;
                  hsv.s=s;
                  
                  aPalette[i]=rgb2html(hsv2rgb(hsv));
            }
            break;
        
    }
    renderPalette();
    displayCurrentPaletteFunctions();
    return (false);
}

function applyPaletteFilter(filter) {
    var i;
    switch(filter) {
    
        case "websafe":     // WEBSAFE
            for(i=0;i<aPalette.length;i++){
                aPalette[i]=makeWebSafe(aPalette[i]);
            }
            break;

        case "warmer1":     // WARMER +1
            for(i=0;i<aPalette.length;i++){
                  aPalette[i]=correctColor(aPalette[i],"r",10);
                  aPalette[i]=correctColor(aPalette[i],"g",0);
                  aPalette[i]=correctColor(aPalette[i],"b",-5);
            }
            break;
        
        case "warmer2":     // WARMER +2
            for(i=0;i<aPalette.length;i++){
                  aPalette[i]=correctColor(aPalette[i],"r",20);
                  aPalette[i]=correctColor(aPalette[i],"g",0);
                  aPalette[i]=correctColor(aPalette[i],"b",-10);
            }
            break;
        
        case "colder1":     // COLDER -1
            for(i=0;i<aPalette.length;i++){
                  aPalette[i]=correctColor(aPalette[i],"r",-5);
                  aPalette[i]=correctColor(aPalette[i],"g",0);
                  aPalette[i]=correctColor(aPalette[i],"b",10);
            }
            break;
        
        case "colder2":     // COLDER -2
            for(i=0;i<aPalette.length;i++){
                  aPalette[i]=correctColor(aPalette[i],"r",-20);
                  aPalette[i]=correctColor(aPalette[i],"g",0);
                  aPalette[i]=correctColor(aPalette[i],"b",20);
            }
            break;
        
        case "desaturate":     // DESATURATE
            for(i=0;i<aPalette.length;i++){
                  aPalette[i]=correctColor(aPalette[i],"s",-100);
            }
            break;
        
        case "sepia":     // SEPIA
            for(i=0;i<aPalette.length;i++){
                  hsv=rgb2hsv(html2rgb(aPalette[i]));
                  hsv.s*=0.3;
                  html=rgb2html(hsv2rgb(hsv));
                  html=correctColor(html,"r",10);
                  html=correctColor(html,"g",5);
                  html=correctColor(html,"b",-5);
                  aPalette[i]=html;
            }
            break;
        
    }
    renderPalette();
    displayCurrentPaletteFunctions();
    return (false);
}

// PALETTE OPERATIONS  -  END



// MAGIC MATCH  -  START

function calcSwatches(action,parameter) {
	var t;
	var v=0;
	for(var i=0;i<aPalette.length;i++){
		var hsv=rgb2hsv(html2rgb(aPalette[i]));

		if(parameter=="s")t=hsv.s;	// saturation
		if(parameter=="v")t=hsv.v;	// value (lightness)
		
		if(action=="a") {		// average
			v+=t;
		}
		if(action=="n") {		// normalize
			if(t>v)v=t;
		}
	}
	if(action=="a") {		// average
		v=Math.round(v/aPalette.length);
	}
	for(var i=0;i<aPalette.length;i++){
		var hsv=rgb2hsv(html2rgb(aPalette[i]));
		if(parameter=="s")hsv.s=v;	// saturation
		if(parameter=="v")hsv.v=v;	// value (lightness)
		aPalette[i]=rgb2html(hsv2rgb(hsv));
	}
	renderPalette();
	displayCurrentPaletteFunctions();
	return (false);
}
function addAlternates() {
	var aNewSwatches=new Array();
	var hsv;
	for(var i=0;i<aPalette.length;i++){
		aNewSwatches[aNewSwatches.length]=aPalette[i];
		hsv=rgb2hsv(html2rgb(aPalette[i]));
		if(hsv.v>50){
			hsv.v-=40;
			if(hsv.s<80)hsv.s+=20;
		}else{
			hsv.v+=40;
			if(hsv.s>20)hsv.s-=20;
		}
		aNewSwatches.push(rgb2html(hsv2rgb(hsv)));
	}
	aPalette=aNewSwatches;
	renderPalette();
}
function cutDownHues() {
	sortSwatches('hue');
	var minoffset=30;
	var hsv;
	var h=-1;
	var i=0;
	while(i<aPalette.length){
		hsv=rgb2hsv(html2rgb(aPalette[i]));
		if(h<0){
			h=hsv.h;
			i++;
		}else{
			if(hsv.h>=h+minoffset){
				h=hsv.h;
				i++;
			}else{
				aPalette.splice(i,1);
			}
		}
	}
}
function magicMatch(cutdwn,avgsat,avgval,addalt) {
	setUndoBuffer();
	if(cutdwn==1){
		sortSwatches('hue');
		cutDownHues();
	}
	if(avgsat==1)calcSwatches('a','s');
	if(avgval==1)calcSwatches('a','v');
	if(addalt==1)addAlternates();
	renderPalette();
	displayCurrentPaletteFunctions();
	return (false);
}

// MAGIC MATCH  -  END


function getSwatchesHTML(aColors) {
	var sHTML="";
	for(var i=0;i<aColors.length;i++){
	    var rgb=html2rgb(aColors[i]);
		sHTML+=	"<div class=\"swatch noname\" onclick=\"showMenu('"+aColors[i]+"',"+i+")\" id=\"swatch" + i + "\">";
		sHTML+=	"<div class=\"color\" style=\"background-color:#"+aColors[i]+"\">&nbsp;</div>";
		sHTML+=	"<div class=\"info\">R: "+rgb.r+"<br/>G: "+rgb.g+"<br/>B: "+rgb.b+"<br/>#"+aColors[i]+"</div>";
		sHTML+=	"</div>";
	}
	return(sHTML);
}

function savePalette() {
    document.getElementById("callback").src="callback.aspx";
}

function exportSwatches(t) {
	if(aPalette.length>0){
		var sUrl;
		var t=document.getElementById("exportFormat").value;
		if (t == "aco") sUrl = "export.aspx?mode=aco";
		if (t == "ase") sUrl = "export.aspx?mode=ase";
		if (t == "png") sUrl = "export.aspx?mode=png";
		if (t == "pngnotext") sUrl = "export.aspx?mode=pngnotext";
		if (t == "gif") sUrl = "export_img.asp?format=2";
		if (t == "txt") sUrl = "export.aspx?mode=txt";
		window.open(sUrl);
	}else{
		alert("You have no colors in you palette to export.");
	}
}

function renderCurrentPalette() {
    var oe=document.getElementById("content_palette");
    var sHTML="";
    for(var i=0;i<aPalette.length;i++){
        sHTML=sHTML+"<div class='smallswatch' style='background-color:#" + aPalette[i] + "' onclick='setActiveColorFromSwatch("+i+")'><img src='gfx/pixel.gif' alt='' /></div>";
    }
    if(aPalette.length==0){ sHTML=sNoColors; }
    sHTML=sHTML+sFloatFix;
    oe.innerHTML=sHTML;
}

function renderCurrentPalette_NoInteraction() {
    var oe=document.getElementById("content_palette");
    var sHTML="";
    for(var i=0;i<aPalette.length;i++){
        sHTML=sHTML+"<div class='smallswatch' style='background-color:#" + aPalette[i] + "'><img src='gfx/pixel.gif' alt='' /></div>";
    }
    if(aPalette.length==0){ sHTML=sNoColors; }
    sHTML=sHTML+sFloatFix;
    oe.innerHTML=sHTML;
}

function addNewSwatch(sColor) {
    aPalette.push(sColor);
    postPalette();
    renderCurrentPalette();
    return (false);
}

function removeSwatch(sColorId) {
    aPalette.splice(sColorId,1);
    postPalette();
    renderPalette();
}

function silentlySavePalette(paletteToSave,paletteName) {
    document.getElementById("callback").src = "savePalette.aspx?palette=" + paletteToSave + "&name=" + paletteName;
}

function postPalette() {
    undoPalette = aPalette.join(",");
    document.getElementById("callback").src="callback.aspx?s="+undoPalette;
}

function updateSwatch(sColor) {
    aPalette[iOldSwatch]=sColor;
    postPalette();
    renderCurrentPalette();
    return (false);
}


function saveCurrentPalette(sNewName,overwrite) {
    if(sNewName==""){sNewName="[untitled]";}
    window.location="managePalette.asp?op="+(overwrite?"replace":"save")+"&n="+sNewName;
}


function logout() {
    window.location="profile.asp?action=logout";
}



function showOptions() {
	cancelHideOptions();
	if(window.event)var e=window.event;
	sCurrentColor=e.srcElement.style.backgroundColor.substr(1,6);
	if(e.srcElement.id.substr(0,8)=="myswatch"){
		iCurrentSwatch=parseInt(e.srcElement.id.substr(8,4))
	}else{
		iCurrentSwatch=-1
	}
	var sHTML="";
	if(iCurrentSwatch>=0){
		sHTML+="<a href='javascript:removeSwatch()'>Remove swatch</a>"
	}else{
		sHTML+="<a href='javascript:addSwatch()'>Add to swatches</a>"
	}
	sHTML+="<a href='javascript:doMatchAll();'>Convert to other space</a>";
	document.getElementById("optionsmenu").innerHTML=sHTML;
	document.getElementById("optionsmenu").style.left=window.event.x-10+"px";
	document.getElementById("optionsmenu").style.top=window.event.y-10+"px";
	document.getElementById("optionsmenu").style.display="inline";
}
function hideOptions() {
	tOptionsHide=setTimeout("doHideOptions()",500);
}
function doHideOptions() {
	document.getElementById("optionsmenu").style.display="none";
}
function cancelHideOptions() {
	window.clearTimeout(tOptionsHide);
}




// NCS - START 

function initNCS() {
    getPalette();
    renderCurrentPalette_NoInteraction();
    renderNCSTriangle("Y");

    // swatch context menu
    oMenu = new YAHOO.widget.Menu("basicmenu", { position: "dynamic", x: 200, y: 200 });

    oMenu.addItems([
         { text: "Add to current palette", onclick: { fn: addToCurrentPalette, obj: "bar"} },
         { text: "Use with Color Match", onclick: { fn: useWithColorMatch, obj: "bar"} },
         { text: "Convert to other system", onclick: { fn: convertColor, obj: "bar"} }
     ]);
    oMenu.render(document.body);    
}

function ncs(ncsHue) { // hue circle clicked
    renderNCSTriangle(ncsHue);

    // update dropdowns to match
    var pri = document.getElementById("ncsHueSelect");
    var sec = document.getElementById("ncsToHue");
    var grade = document.getElementById("ncsHueGrade");
    var newValue = ncsHue.substr(0, 1);
    var secValue = "";
    var ih = 0;
    if (ncsHue.length > 1) {
        ih = ncsHue.substr(1, ncsHue.length - 2);
        switch (newValue) {
            case "Y":
                secValue = "R";
                break;
            case "R":
                secValue = "B";
                break;
            case "B":
                secValue = "G";
                break;
            case "G":
                secValue = "Y";
                break;
        }
    }
    pri.value = newValue;
    sec.innerHTML = secValue;
    grade.value = ih;

    updateNCSColorFromInputs();
}

function renderNCSTriangle(ncsHue) {
    // renders NCS triangle from a specified NCS HUE  (X00Y)
    var hue = HueFromNCSChroma(ncsHue);
    var ohue=hue;    
    var base=new Object();
	base.h=ohue;
	base.s=100;
	base.v=100;
	var rgb,htmlcol;
	var i,j,sHTML;
	var iVertOffset=24;
	var iHorOffset=22;
	var iWidth=iHorOffset-3;
	var iHeight=iVertOffset-3;
	sHTML="";
	for(i=0;i<11;i++) {
	    for (j = 0; j < 11 - i; j++) {

	        var blackness = fix2digits(j * 10);
	        var chromaticsness = fix2digits(Math.min(99,i * 10));

			base.h=ohue;
			base.s=i*10;
			base.v=100-j*10;
			rgb=hsv2rgb(base);
			htmlcol = "#" + rgb2html(rgb);

			var NCSColorIdent;
			if (i == 0) {
			    NCSColorIdent = html2ncs(rgb2html(rgb)); // Neutral
			} else {
			    NCSColorIdent = blackness + chromaticsness + "-" + ncsHue;
			}
	        			
			sHTML+="<div style='position:absolute;left:"+(i*iHorOffset)+"px;top:"+(j*iVertOffset+iVertOffset/2*i)+"px;width:"+iWidth+"px;height:"+iHeight+"px;background-color:"+htmlcol+";cursor:pointer;border:solid 1px #000;' onclick='showNCS(\"" + NCSColorIdent + "\")'></div>";
		}
	}
	document.getElementById("ncs_triangle").innerHTML = sHTML;
	updateNCSColorFromInputs();	
}

function NCSChromaFromHue(hue) {
    var sNCS;
    var ohue=hue;
    var iPart;
    if(hue==0)hue=360;
    // determine NCS hue part
    if((hue>0)&&(hue<=60)){    // Y-R
        sNCS="Y";
        iPart=Math.round(10*(60-hue)/6);
        if (iPart > 0) sNCS = sNCS + fix2digits(iPart) + "R";
    }
    if((hue>60)&&(hue<=120)){    // G-Y
        sNCS="G";
        iPart=Math.round(10*(120-hue)/6);
        if (iPart > 0) sNCS = sNCS + fix2digits(iPart) + "Y";
    }
    if((hue>120)&&(hue<=240)){    // B-G
        sNCS="B";
        iPart=Math.round(10*(120-(hue-120))/12);
        if (iPart > 0) sNCS = sNCS + fix2digits(iPart) + "G";
    }
    if((hue>240)&&(hue<=360)){    // R-B
        sNCS="R";
        iPart=Math.round(10*(120-(hue-240))/12);
        if (iPart > 0) sNCS = sNCS + fix2digits(iPart) + "B";
    }
    return(sNCS);
}

function HueFromNCSChroma(ncsh) {
    var h;
    var ih = 0;
    ncsh = ncsh.toUpperCase();
    if (ncsh.length > 1) {
        ih = ncsh.substr(1, ncsh.length - 2);
    }    
    var hcsbasehue = ncsh.substr(0,1);
    switch (hcsbasehue) {
        case "N":
            h = -1;
            break;
        case "Y":
            h = 60 - 60 * (ih / 100);
            break;
        case "G":
            h = 120 - 60 * (ih / 100);
            break;
        case "B":
            h = 240 - 120 * (ih / 100);
            break;
        default: // R
            h = 360 - 120 * (ih / 100);
            h = h % 360;
            break;
    }   
    return(h);
}

function html2ncs(c) {
    var rgb=html2rgb(c);
    var hsv=rgb2hsv(rgb);
    var hue=hsv.h;
    if(hue==0)hue=360;
    var sNCS = NCSChromaFromHue(hue);
    if (hsv.s == 0) {
        sNCS = (300 + (9000-300) * (100-hsv.v)/100) + "-N";
    } else {
        sNCS = fix2digits(Math.min((100 - hsv.v),99)) + "" + fix2digits(Math.min(hsv.s,99)) + "-" + sNCS;
    }    
    return(sNCS);
}

function ncsHueChanged() {
    var ncsChroma = getNCSChromeFromInputs();
    renderNCSTriangle(ncsChroma);
}

function getNCSChromeFromInputs() {
    var newValue = document.getElementById("ncsHueSelect").value;
    var sec = document.getElementById("ncsToHue");
    var secValue = "";
    var grade = convertToInt(document.getElementById("ncsHueGrade").value, 0, 99);
    document.getElementById("ncsHueGrade").value = grade;
    switch (newValue) {
        case "Y":
            secValue = (grade == 0) ? "" : "R";
            break;
        case "R":
            secValue = (grade == 0) ? "" : "B";
            break;
        case "B":
            secValue = (grade == 0) ? "" : "G";
            break;
        case "G":
            secValue = (grade == 0) ? "" : "Y";
            break;
    }
    sec.innerHTML = secValue;
    var ncsChroma = newValue + ((grade > 0) ? grade : "") + secValue;
    return (ncsChroma);
}

function ncsBCChanged() {
    var blackness = convertToInt(document.getElementById("ncsBlackEdit").value,0,99);
    var chromaticness = convertToInt(document.getElementById("ncsChromaEdit").value,0,99);
    document.getElementById("ncsBlackEdit").value = blackness;
    document.getElementById("ncsChromaEdit").value = chromaticness;
    updateNCSColorFromInputs();
}

function updateNCSColorFromInputs() {
    var blackness = fix2digits(convertToInt(document.getElementById("ncsBlackEdit").value, 0, 99));
    var chromaticness = fix2digits(convertToInt(document.getElementById("ncsChromaEdit").value, 0, 99));
    var hue = getNCSChromeFromInputs();
    if (chromaticness == "00") { // Neutral
        blackness = 300 + (9000-300) * parseInt(blackness)/100;
        chromaticness = "";
        hue = "N";
    }
    showNCS(blackness + chromaticness + "-" + hue);
}

function ncs2hsv(ncsin) {
    var h, s, v, b, c;
    var fh, th, ih;
    var hsv = new Object();

    ncsin = ncsin.toUpperCase();
    // parse hue
    var ncsh = ncsin.split("-")[1];
    h = HueFromNCSChroma(ncsh);

    if (h == -1) { // Neutral
        h = 0;
        s = 0;
        v = Math.round(100 - (100 * (parseInt(ncsin.split("-")[0])-300) / (9000-300)));
    } else {
        v = 100 - ncsin.split("-")[0].substr(0, 2);
        s = ncsin.split("-")[0].substr(2, 2);
    }

    hsv.h = h;
    hsv.s = s;
    hsv.v = v;
    
    return (hsv);
}

function showNCS(ncscol) {
    updateNCSInputsFromColor(ncscol);
    var rgb = hsv2rgb(ncs2hsv(ncscol));
    var htmlvalue = rgb2html(rgb);
    document.getElementById("ncs_colorname").innerHTML = ncscol;
    document.getElementById("ncs_colorswatch").style.backgroundColor = "#"+htmlvalue;
    document.getElementById("ncs_colorinfo").innerHTML = "R: " + rgb.r + "<br />G: " + rgb.g + "<br/>B: " + rgb.b + "<br/>#" + htmlvalue;
    oColor = htmlvalue;
}

function updateNCSInputsFromColor(ncscol) {
    var c, b;
    if (ncscol.split("-")[1] == "N") { // Neutral
        c = 0;
        b = Math.round((99 * (parseInt(ncscol.split("-")[0]) - 300) / (9000 - 300)));
    } else {
        b = ncscol.split("-")[0].substr(0, 2);
        c = ncscol.split("-")[0].substr(2, 2);
    }
    document.getElementById("ncsBlackEdit").value = b;
    document.getElementById("ncsChromaEdit").value = c;
}

function ncs_showMenu() {
    oMenu.show();
    document.getElementById("basicmenu").style.left = (YAHOO.util.Dom.getX("ncs_swatch") - 20) + "px";
    document.getElementById("basicmenu").style.top = (YAHOO.util.Dom.getY("ncs_swatch") + 10) + "px";
    oColor = fixRgbColor(document.getElementById("ncs_colorswatch").style.backgroundColor).toUpperCase();
}

function fix2digits(n) {
    n = Math.round(n);
    n = n + "";
    if (n.length == 1) {
        n = "0" + n;
    }
    return (n);
}
// NCS - END



// COLOR MATCH - START

function initColorMatch() {
    getPalette();
    
    //renderCurrentPalette();
    
    var sHTML="";
    for(var i=0;i<aPalette.length;i++){
        sHTML=sHTML+"<div class='smallswatch' style='background-color:#" + aPalette[i] + "' onclick='colorMatchFromSwatch("+i+")'><img src='gfx/pixel.gif' alt='' /></div>";
    }
    if(aPalette.length==0){ sHTML=sNoColors; }
    sHTML=sHTML+sFloatFix;
    document.getElementById("content_palette").innerHTML=sHTML;
    
    
    slider_r = YAHOO.widget.Slider.getHorizSlider("sliderbg_r", "sliderthumb_r", 0, 255);
    slider_r.subscribe("change",sliderChange_rgb);
    slider_g = YAHOO.widget.Slider.getHorizSlider("sliderbg_g", "sliderthumb_g", 0, 255);
    slider_g.subscribe("change",sliderChange_rgb);
    slider_b = YAHOO.widget.Slider.getHorizSlider("sliderbg_b", "sliderthumb_b", 0, 255);
    slider_b.subscribe("change",sliderChange_rgb);
    
    slider_h = YAHOO.widget.Slider.getHorizSlider("sliderbg_h", "sliderthumb_h", 0, 255);
    slider_h.subscribe("change",sliderChange_hsv);
    slider_s = YAHOO.widget.Slider.getHorizSlider("sliderbg_s", "sliderthumb_s", 0, 255);
    slider_s.subscribe("change",sliderChange_hsv);
    slider_v = YAHOO.widget.Slider.getHorizSlider("sliderbg_v", "sliderthumb_v", 0, 255);
    slider_v.subscribe("change",sliderChange_hsv);


    // swatch context menu
    oMenu = new YAHOO.widget.Menu("basicmenu", { position: "dynamic", x:200, y:200 }); 

    oMenu.addItems([   
         { text: "Promote to primary color", onclick: { fn:colorMatchFromColor, obj:"bar"} },
         { text: "Add to current palette", onclick: { fn:addToCurrentPalette, obj:"bar"} },
         { text: "Convert to other system", onclick: { fn:convertColor, obj:"bar"} }
     ]);  
    oMenu.render(document.body);
    
    
    var queryColor = getQuerystring("c","");
    
    
    if((aPalette.length>0)||(queryColor!="")){
        if(queryColor!=""){
            oColor = queryColor;
        }else{
            oColor = aPalette[0];
        }
        colorMatchFromColor(false,false,false);
    }else{
        cm_update();
    }
}

function colorMatchFromSwatch(swatch) {
    oColor = aPalette[swatch];
    colorMatchFromColor(false,false,false);
}

function cm_update() {
    var hsv = rgb2hsv(html2rgb(colorMatchSet[0]));
	domatch_classic(hsv);
	updateColorMatchInfo();

}

function sliderChange_rgb() {
    var rgb=new Object();
	rgb.r = slider_r.getXValue();
	rgb.g = slider_g.getXValue();
	rgb.b = slider_b.getXValue();
	
	var hsv = rgb2hsv(rgb);
	YAHOO.util.Dom.setStyle("cm_color_1","background-color","#"+rgb2html(rgb));
	
	// update swatch 1 one
	colorMatchSet[0] = rgb2html(rgb);

	domatch_classic(hsv);
	updateColorMatchInfo();
	
	// set opposite slider set (HSV)	
	slider_h.setValue(Math.round(255 * hsv.h / 359),true,true,true);
	slider_s.setValue(Math.round(255 * hsv.s / 100),true,true,true);
	slider_v.setValue(Math.round(255 * hsv.v / 100),true,true,true);	
}

function sliderChange_hsv() {
    var hsv = new Object();
	hsv.h = Math.round(356 * slider_h.getXValue()/255);
	hsv.s = Math.round(100 * slider_s.getXValue()/255);
	hsv.v = Math.round(100 * slider_v.getXValue()/255);
	
	//alert(hsv.h);
	
	var rgb = hsv2rgb(hsv);
	YAHOO.util.Dom.setStyle("cm_color_1","background-color","#"+rgb2html(rgb));
	
	// update swatch 1 one
	colorMatchSet[0] = rgb2html(rgb);

	domatch_classic(hsv);
	updateColorMatchInfo();

	// set opposite slider set (RGB)	
	slider_r.setValue(rgb.r,true,true,true);
	slider_g.setValue(rgb.g,true,true,true);
	slider_b.setValue(rgb.b,true,true,true);	
}

function updateColorMatchInfo() {
    var sHTML = "";
    var rgb;
    for(var i=1; i<=6; i++) {
        YAHOO.util.Dom.setStyle("cm_color_"+i,"background-color","#"+colorMatchSet[i-1]);
        rgb = html2rgb(colorMatchSet[i-1]);
        sHTML = "RGB: " + rgb.r + "/" + rgb.g + "/" + rgb.b + "<br />" + "#" + colorMatchSet[i-1];
        document.getElementById("cm_info_"+i).innerHTML = sHTML;
    }
}

function domatch_classic(hs){

	// Color matching algorithm. All work is done in HSV color space, because all
	// calculations are based on hue, saturation and value of the working color.
	// The hue spectrum is divided into sections, are the matching colors are
	// calculated differently depending on the hue of the color.
	
	// input: hs = a HSV style color object
	
	
	var method = document.getElementById("cm_method").value;
	var z;
	var y;
	var yx;
	
	switch(method){
	
	    case "classic": // colormatch classic
	        z=new Object();
	        y=new Object();
	        yx=new Object();
	        y.s=hs.s;
	        y.h=hs.h;
	        if(hs.v>70){y.v=hs.v-30}else{y.v=hs.v+30};
	        z=hsv2rgb(y);
	        outp(1,z);
	        if((hs.h>=0)&&(hs.h<30)){
		        yx.h=y.h=hs.h+30;yx.s=y.s=hs.s;y.v=hs.v;
		        if(hs.v>70){yx.v=hs.v-30}else{yx.v=hs.v+30}
	        }
	        if((hs.h>=30)&&(hs.h<60)){yx.h=y.h=hs.h+150;
		        y.s=rc(hs.s-30,100);
		        y.v=rc(hs.v-20,100);
		        yx.s=rc(hs.s-50,100);
		        yx.v=rc(hs.v+20,100);
	        }
	        if((hs.h>=60)&&(hs.h<180)){
		        yx.h=y.h=hs.h-40;
		        y.s=yx.s=hs.s;
		        y.v=hs.v;if(hs.v>70){yx.v=hs.v-30}else{yx.v=hs.v+30}
	        }
	        if((hs.h>=180)&&(hs.h<220)){
		        yx.h=hs.h-170;
		        y.h=hs.h-160;
		        yx.s=y.s=hs.s;
		        y.v=hs.v;
		        if(hs.v>70){yx.v=hs.v-30}else{yx.v=hs.v+30}
	        }if((hs.h>=220)&&(hs.h<300)){
		        yx.h=y.h=hs.h;
		        yx.s=y.s=rc(hs.s-40,100);
		        y.v=hs.v;
		        if(hs.v>70){yx.v=hs.v-30}else{yx.v=hs.v+30}
	        }
	        if(hs.h>=300){
		        if(hs.s>50){y.s=yx.s=hs.s-40}else{y.s=yx.s=hs.s+40}yx.h=y.h=(hs.h+20)%360;
		        y.v=hs.v;
		        if(hs.v>70){yx.v=hs.v-30}else{yx.v=hs.v+30}
	        }
	        z=hsv2rgb(y);
	        outp(2,z);
	        z=hsv2rgb(yx);
	        outp(3,z);
	        y.h=0;
	        y.s=0;
	        y.v=100-hs.v;
	        z=hsv2rgb(y);
	        outp(4,z);
	        y.h=0;
	        y.s=0;
	        y.v=hs.v;
	        z=hsv2rgb(y);
	        outp(5,z);
	    break;
	    
	    
	    case "colorexplorer": // colorexplorer
            z = new Object();
            z.h = hs.h;
	    	z.s = Math.round(hs.s * 0.3);
	    	z.v = Math.min(Math.round(hs.v * 1.3),100);
	    	outp(1,hsv2rgb(z));
	    	    	
	    	z = new Object();
	    	z.h = (hs.h+300)%360;
	    	z.s = hs.s;
	    	z.v = hs.v;
	    	outp(3,hsv2rgb(z));

	    	z.s = Math.min(Math.round(z.s * 1.2),100);
	    	z.v = Math.min(Math.round(z.v * 0.5),100);
            outp(2,hsv2rgb(z));
            
            z.s = 0;
            z.v = (hs.v + 50) % 100;
            outp(4,hsv2rgb(z));

            z.v = (z.v + 50) % 100;
            outp(5,hsv2rgb(z));
	    break;
	    
	    
	    case "singlehue": // single hue
            z = new Object();
            z.h = hs.h;

	    	z.s = hs.s;
	    	z.v = hs.v+((hs.v<50)?20:-20);
	    	outp(1,hsv2rgb(z));
	    	
	    	z.s = hs.s;
	    	z.v = hs.v+((hs.v<50)?40:-40);
	    	outp(2,hsv2rgb(z));
	    	
	    	z.s = hs.s+((hs.s<50)?20:-20);
	    	z.v = hs.v;
	    	outp(3,hsv2rgb(z));
	    	
	    	z.s = hs.s+((hs.s<50)?40:-40);
	    	z.v = hs.v;
	    	outp(4,hsv2rgb(z));
	    	
	    	z.s = hs.s+((hs.s<50)?40:-40);
	    	z.v = hs.v+((hs.v<50)?40:-40);
	    	outp(5,hsv2rgb(z));	    	
	    break;
	    
	    
	    case "complementary": // complementary	    
	    	z = new Object();
	    	z.h = hs.h;
	    	z.s = (hs.s>50)?(hs.s * 0.5):(hs.s * 2);
	    	z.v = (hs.v<50)?(Math.min(hs.v*1.5,100)):(hs.v/1.5);
	    	outp(1,hsv2rgb(z));
	    	
	    	var w = hueToWheel(hs.h);
	    	z.h = wheelToHue((w+180)%360);
	    	z.s = hs.s;
	    	z.v = hs.v;
	    	outp(2,hsv2rgb(z));	    	
	    	
	    	z.s = (z.s>50)?(z.s * 0.5):(z.s * 2);
	    	z.v = (z.v<50)?(Math.min(z.v*1.5,100)):(z.v/1.5);
	    	outp(3,hsv2rgb(z));
	    	
	    	z = new Object();
            z.s = 0;
            z.h = 0;
            z.v = hs.v;
            outp(4,hsv2rgb(z));	            
            z.v = 100 - hs.v;
            outp(5,hsv2rgb(z));	            

	    break;
	    
	    
	    case "splitcomplementary": // splitcomplementary	    
	    	var w = hueToWheel(hs.h);
	    	z = new Object();
	    	z.h = hs.h;
	    	z.s = hs.s;
	    	z.v = hs.v;
	    	
	    	z.h = wheelToHue((w+150)%360);
	    	z.s = hs.s;
	    	z.v = hs.v;
	    	outp(1,hsv2rgb(z));	    	

	    	z.h = wheelToHue((w+210)%360);
	    	z.s = hs.s;
	    	z.v = hs.v;
	    	outp(2,hsv2rgb(z));	    	
	    	
	    	z.s = 0;
	    	z.v = hs.s;
	    	outp(3,hsv2rgb(z));
	    	
	    	z.s = 0;
	    	z.v = hs.v;
	    	outp(4,hsv2rgb(z));

	    	z.s = 0;
	    	z.v = (100 - hs.v);
	    	outp(5,hsv2rgb(z));
	    	
	    break;
	    
	    
	    case "analogue": // analogue
	        var w = hueToWheel(hs.h);
	    
	    	z = new Object();
	    	z.h = wheelToHue((w+30)%360);
	    	z.s = hs.s;
	    	z.v = hs.v;
	    	outp(1,hsv2rgb(z));
	    	
	    	z = new Object();
	    	z.h = wheelToHue((w+60)%360);
	    	z.s = hs.s;
	    	z.v = hs.v;
	    	outp(2,hsv2rgb(z));
	    	
	    	z = new Object();
            z.s = 0;
            z.h = 0;
            z.v = 100 - hs.v;
            outp(3,hsv2rgb(z));	
            
            z.v = Math.round(hs.v * 1.3) % 100;
            outp(4,hsv2rgb(z));

            z.v = Math.round(hs.v / 1.3) % 100;
            outp(5,hsv2rgb(z));
	    break;
	    
	    
	    case "triadic": // triadic
	        var w = hueToWheel(hs.h);

	    	z = new Object();
            z.s = hs.s;
            z.h = hs.h;
            z.v = 100 - hs.v;
            outp(1,hsv2rgb(z));
	    
	    	z = new Object();
	    	z.h = wheelToHue((w+120)%360);
	    	z.s = hs.s;
	    	z.v = hs.v;
	    	outp(2,hsv2rgb(z));

            z.v = 100 - z.v;
            outp(3,hsv2rgb(z));
	    	
	    	z = new Object();
	    	z.h = wheelToHue((w+240)%360);
	    	z.s = hs.s;
	    	z.v = hs.v;
	    	outp(4,hsv2rgb(z));

            z.v = 100 - z.v;
            outp(5,hsv2rgb(z));
	    	
	    break;
	    
	    
	    case "square": // square
	        var w = hueToWheel(hs.h);
	    	z = new Object();

	    	z.h = wheelToHue((w+90)%360);
	    	z.s = hs.s;
	    	z.v = hs.v;
	    	outp(1,hsv2rgb(z));

	    	z.h = wheelToHue((w+180)%360);
	    	z.s = hs.s;
	    	z.v = hs.v;
	    	outp(2,hsv2rgb(z));

	    	z.h = wheelToHue((w+270)%360);
	    	z.s = hs.s;
	    	z.v = hs.v;
	    	outp(3,hsv2rgb(z));

            z.s = 0;
            outp(4,hsv2rgb(z));

            z.v = 100 - z.v;
            outp(5,hsv2rgb(z));
	    	
	    break;
	}
}

function hueToWheel(h) {
    if(h<=120){
        return(Math.round(h*1.5));
    }else{
        return(Math.round(180+(h-120)*0.75));
    }
}

function wheelToHue(w) {
    if(w<=180){
        return(Math.round(w/1.5));
    }else{
        return(Math.round(120+(w-180)/0.75));
    }
}

function outp(x,c){
	colorMatchSet[x]=rgb2html(c);
}

function rc(x,m){
	if(x>m){return m}
	if(x<0){return 0}else{return x}
}

function cm_showMenu(swatchid) {
    oMenu.show();
    document.getElementById("basicmenu").style.left = (YAHOO.util.Dom.getX("cm_swatch_"+swatchid)-20) + "px";
    document.getElementById("basicmenu").style.top = (YAHOO.util.Dom.getY("cm_swatch_"+swatchid)+10) + "px";
    oColor = colorMatchSet[swatchid-1];
    oSwatchId = swatchid;
}

function colorMatchFromColor(eventtype,eventargs,obj){    
    colorMatchSet[0] = oColor;
    var rgb = html2rgb(oColor);
    var hsv = rgb2hsv(rgb);
    domatch_classic(hsv);
    updateColorMatchInfo();
    
	// update slider set (RGB)	
	slider_r.setValue(rgb.r,true,true,true);
	slider_g.setValue(rgb.g,true,true,true);
	slider_b.setValue(rgb.b,true,true,true);	

	slider_h.setValue(Math.round(255 * hsv.h / 359),true,true,true);
	slider_s.setValue(Math.round(255 * hsv.s / 100),true,true,true);
	slider_v.setValue(Math.round(255 * hsv.v / 100),true,true,true);    
}

function cmToCurrent(replace) {
    if(replace){
        aPalette = new Array();
    }
    for(var z=0; z<6; z++){
        aPalette.push(colorMatchSet[z]);
    }
    
    postPalette();

    var sHTML = "";
    for (var i = 0; i < aPalette.length; i++) {
        sHTML = sHTML + "<div class='smallswatch' style='background-color:#" + aPalette[i] + "' onclick='colorMatchFromSwatch(" + i + ")'><img src='gfx/pixel.gif' alt='' /></div>";
    }
    if (aPalette.length == 0) { sHTML = sNoColors; }
    sHTML = sHTML + sFloatFix;
    document.getElementById("content_palette").innerHTML = sHTML;
        
    return (false);
}

function cmSaveSilently() {
    var p = colorMatchSet.join(",");
    silentlySavePalette(p, "ColorMatch")
    alert("The palette has been saved.\n\nYou may access it from the My Palettes tab.");
    return (false);
}



// COLOR MATCH - END



// CONVERT - START

function initConvert() {
    getPalette();

    var sHTML="";
    for(var i=0;i<aPalette.length;i++){
        sHTML=sHTML+"<div class='smallswatch' style='background-color:#" + aPalette[i] + "' onclick='convertFromColor(\""+aPalette[i]+"\")'><img src='gfx/pixel.gif' alt='' /></div>";
    }
    if(aPalette.length==0){ sHTML=sNoColors; }
    sHTML=sHTML+sFloatFix;
    document.getElementById("content_palette").innerHTML=sHTML; 
    
    
    var queryColor = getQuerystring("c","");
    if(queryColor != ""){
        convertFromColor(queryColor);
    }
   
}

function convertFromColor(sColor) {
    var rgb = html2rgb(sColor);
    var bestMatch;

    // SOURCE
    document.getElementById("cm_color_0").style.backgroundColor = "#"+sColor;
    document.getElementById("cm_info_0").innerHTML = "R/G/B<br />"+rgb.r + " / "+rgb.g + " / "+rgb.b;

    // PANTONE
    bestMatch = convertToLibrary("PANTONE",rgb,false).split("~");
    document.getElementById("cm_color_1").style.backgroundColor = "#"+bestMatch[1];
    document.getElementById("cm_info_1").innerHTML = "PANTONE&reg;<br />PMS "+bestMatch[0];

    // RAL
    bestMatch = convertToLibrary("RAL",rgb,true).split("~");
    document.getElementById("cm_color_2").style.backgroundColor = "#"+bestMatch[1];
    document.getElementById("cm_info_2").innerHTML = "RAL<br />"+bestMatch[0];
    
    // TOYO
    bestMatch = convertToLibrary("TOYO",rgb,true).split("~");
    document.getElementById("cm_color_3").style.backgroundColor = "#"+bestMatch[1];
    document.getElementById("cm_info_3").innerHTML = "TOYO<br />"+bestMatch[0];

    // FOCOLTONE
    bestMatch = convertToLibrary("FOCOLTONE",rgb,true).split("~");
    document.getElementById("cm_color_8").style.backgroundColor = "#"+bestMatch[1];
    document.getElementById("cm_info_8").innerHTML = "FOCOLTONE<br />"+bestMatch[0];

    // TRUMATCH
    bestMatch = convertToLibrary("TRUMATCH",rgb,true).split("~");
    document.getElementById("cm_color_9").style.backgroundColor = "#"+bestMatch[1];
    document.getElementById("cm_info_9").innerHTML = "TRUMATCH<br />"+bestMatch[0];

    // WEBSAFE
    //bestMatch = convertToLibrary("WEBSAFE",rgb).split("~");
    document.getElementById("cm_color_4").style.backgroundColor = "#"+makeWebSafe(rgb2html(rgb));
    document.getElementById("cm_info_4").innerHTML = "Websafe<br />#"+makeWebSafe(rgb2html(rgb));

    // W3C
    bestMatch = convertToLibrary("W3C",rgb,true).split("~");
    document.getElementById("cm_color_5").style.backgroundColor = "#"+bestMatch[1];
    document.getElementById("cm_info_5").innerHTML = "W3C Named C'<br />"+bestMatch[0];

    // NAMEDWEB
    bestMatch = convertToLibrary("NAMEDWEB",rgb,true).split("~");
    document.getElementById("cm_color_6").style.backgroundColor = "#"+bestMatch[1];
    document.getElementById("cm_info_6").innerHTML = "Named Web C'<br />"+bestMatch[0];

    // NCS
    document.getElementById("cm_color_7").style.backgroundColor = "#"+rgb2html(rgb);
    document.getElementById("cm_info_7").innerHTML = "NCS&reg;<br />"+html2ncs(rgb2html(rgb));
    
}

function convertToLibrary(libraryName,rgb,useRGBmode) {
    // libraryName input must be name of JS library array without "a" prefix

	var dBest,pNo,dH,dS,dV,dA,dR,dG,dB,oInRGB,oInHSV,oOutRGB,oOutHSV;
	pNo=0;
	
	oInHSV=rgb2hsv(rgb);
    var sArr = eval("a"+libraryName);
	
	dBest=3000;
	for(var a=0;a<sArr.length-1;a++){
		arrC=sArr[a].split("~")[1];
		
		if(useRGBmode){
		    oOutRGB=html2rgb(arrC);
		    dR=Math.abs(rgb.r-oOutRGB.r);
		    dG=Math.abs(rgb.g-oOutRGB.g);
		    dB=Math.abs(rgb.b-oOutRGB.b);
		    dA=dR+dG+dB;
		}else{
		    oOutHSV=rgb2hsv(html2rgb(arrC));
		    dH=Math.abs(oInHSV.h-oOutHSV.h);
		    dS=Math.abs(oInHSV.s-oOutHSV.s);
		    dV=Math.abs(oInHSV.v-oOutHSV.v);
		    //dA=(2.5*dH+dS+dV);
		    dA=(1*dH+1*dS+dV);
		}
		
		if(dA<dBest){
			dBest=dA;
			pNo=a;
		}
	}
	return(sArr[pNo]);
}
// CONVERT - END



// DESCRIBE - START

function nameColor(sColor) {
    var hsv = rgb2hsv(html2rgb(sColor));

    var colorDescription = "";
    var hueName = "";
    var desc = "hueName";
    
    // hue name
    if((hsv.h>=0)&&(hsv.h<20)){    hueName="red"; }
    if((hsv.h>=20)&&(hsv.h<50)){   
        hueName="orange";
        if((hsv.v<70)||(hsv.s<50)){ hueName="brown"; }
    }
    if((hsv.h>=50)&&(hsv.h<80)){   hueName="yellow"; }
    if((hsv.h>=80)&&(hsv.h<100)){  hueName="lime green"; }
    if((hsv.h>=100)&&(hsv.h<180)){ hueName="green"; }
    if((hsv.h>=180)&&(hsv.h<200)){ hueName="cyan"; }
    if((hsv.h>=200)&&(hsv.h<260)){ hueName="blue"; }
    if((hsv.h>=260)&&(hsv.h<310)){ hueName="purple"; }
    if((hsv.h>=310)&&(hsv.h<340)){ hueName="violet"; }
    if((hsv.h>=340)&&(hsv.h<360)){ hueName="red"; }
    
    // desc
    if((hsv.s<20)&&(hsv.v>90)) { desc="pastel hueName"; }
    if((hsv.s>60)) { desc="saturated hueName"; }
    if((hsv.s>20)&&(hsv.s<40)) { desc="dimmed hueName"; }
    
    if((hsv.v<40)) { desc="dark hueName"; }
    if((hsv.v<20)) { desc="very dark hueName"; }

    if((hsv.v>50)) { desc="bright hueName"; }
    if((hsv.v>90)) { desc="very bright hueName"; }
    if((hsv.v>90)&&(hsv.s>80)) { desc="vibrant hueName"; }

    if((hsv.s<10)&&(hsv.v>=50)) { desc="medium grey with hueName tint"; }
    if((hsv.s<10)&&(hsv.v>80)) { desc="light grey with hueName tint"; }
    if((hsv.s<10)&&(hsv.v<50)) { desc="dark grey with hueName tint"; }

    if((hsv.s==0)&&(hsv.v>=50)) { desc="medium grey"; }
    if((hsv.s==0)&&(hsv.v>80)) { desc="light grey"; }
    if((hsv.s==0)&&(hsv.v<50)) { desc="dark grey"; }
    
    if((hsv.s==0)&&(hsv.v>=98)) { desc="white"; }
    if((hsv.s==0)&&(hsv.v<=2)) { desc="black"; }

    colorDescription = desc.replace(/hueName/gi,hueName);
    colorDescription = colorDescription.substr(0,1).toUpperCase() + colorDescription.substr(1);
    return(colorDescription);
}

// DESCRIBE - END



// CONTRAST ANALYSIS - START

function initContrastAnalysis() {
    getPalette();
    
    var sHTML="";
    for(var i=0;i<aPalette.length;i++){
        sHTML=sHTML+"<div class='smallswatch' style='background-color:#" + aPalette[i] + "' onclick='contrastBackColorFromSwatch("+i+")'><img src='gfx/pixel.gif' alt='' /></div>";
    }
    if(aPalette.length==0){ sHTML=sNoColors; }
    sHTML=sHTML+sFloatFix;
    document.getElementById("content_palette_back").innerHTML=sHTML;

    sHTML="";
    for(var i=0;i<aPalette.length;i++){
        sHTML=sHTML+"<div class='smallswatch' style='background-color:#" + aPalette[i] + "' onclick='contrastTextColorFromSwatch("+i+")'><img src='gfx/pixel.gif' alt='' /></div>";
    }
    if(aPalette.length==0){ sHTML=sNoColors; }
    sHTML=sHTML+sFloatFix;
    document.getElementById("content_palette_text").innerHTML=sHTML;
    
    updateResult();
}

function contrastBackColorFromSwatch(iSwatchNumber) {
    ccb = aPalette[iSwatchNumber];
    updateResult();
}

function contrastTextColorFromSwatch(iSwatchNumber) {
    cct = aPalette[iSwatchNumber];
    updateResult();
}

function updateResult() {
    document.getElementById("contrast_testarea").style.backgroundColor="#"+ccb;

    document.getElementById("contrast_testarea").style.color="#"+cct;
    document.getElementById("contrast_testarea").document.getElementById("header").style.color="#"+cct;

    document.getElementById("contrast_color_1").style.backgroundColor = "#"+ccb.toUpperCase();
    document.getElementById("contrast_color_2").style.backgroundColor = "#"+cct.toUpperCase();
    document.getElementById("contrast_info_1").innerHTML = "Background<br />#" + ccb.toUpperCase();
    document.getElementById("contrast_info_2").innerHTML = "Text Color<br />#" + cct.toUpperCase();

    var cr = contrastRatio(ccb,cct);
    var bd = Math.round(Math.abs(colorBrightness(ccb)-colorBrightness(cct)));
    var cd = Math.round(colorDifference(cct,ccb));

    document.getElementById("wcag2_cr").innerHTML = cr + " : 1";
    document.getElementById("wcag1_bd").innerHTML = bd;
    document.getElementById("wcag1_cd").innerHTML = cd;

    // WCAG 2.0
    var ltImg = "fail";
    var stImg = "fail";
    if(cr>=3){ ltImg = "aa"; }
    if(cr>=5){ stImg = "aa"; ltImg="aaa" }
    if(cr>=7){ stImg = "aaa"; }
    document.getElementById("wcag2lt_img").src = "gfx/cc_"+ltImg+".png";
    document.getElementById("wcag2st_img").src = "gfx/cc_"+stImg+".png";
    
    // WCAG 1.0
    if((bd>=125)&&(cd>=500)){
        document.getElementById("wcag1_img").src = "gfx/cc_aaa.png";
    }else{
        document.getElementById("wcag1_img").src = "gfx/cc_fail.png";
    }

}

function colorBrightness(sColor) {
    var rgb = html2rgb(sColor);
    return(((rgb.r * 299) + (rgb.g * 587) + (rgb.b * 114)) / 1000);
}

function colorDifference(sColor1,sColor2) {
    var rgb1 = html2rgb(sColor1);
    var rgb2 = html2rgb(sColor2);
    return( (Math.max(rgb1.r,rgb2.r)-Math.min(rgb1.r,rgb2.r)) + (Math.max(rgb1.g,rgb2.g)-Math.min(rgb1.g,rgb2.g)) + (Math.max(rgb1.b,rgb2.b)-Math.min(rgb1.b,rgb2.b)) );
}

function relativeLuminance(sColor) {
    var rgb = html2rgb(sColor);
    var srgb = new Object();
    srgb.r = rgb.r/255;
    srgb.g = rgb.g/255;
    srgb.b = rgb.b/255;    
    var R = (srgb.r<=0.03928)?(srgb.r/12.92):Math.pow(((srgb.r+0.055)/1.055),2.4);
    var G = (srgb.g<=0.03928)?(srgb.g/12.92):Math.pow(((srgb.g+0.055)/1.055),2.4);
    var B = (srgb.b<=0.03928)?(srgb.b/12.92):Math.pow(((srgb.b+0.055)/1.055),2.4);
    return(0.2126 * R + 0.7152 * G + 0.0722 * B);    
}

function contrastRatio(sColor1,sColor2) {
    var L1 = relativeLuminance(sColor1);
    var L2 = relativeLuminance(sColor2);        
    if(L1<L2){ // make sure L1 is the brighter color
        var t=L1;
        L1=L2;
        L2=t;
    }    
    var c = Math.round(100 * (L1 + 0.05) / (L2 + 0.05)) / 100;
    return (c);
}

// CONTRAST ANALYSIS - END



// IMAGE COLOR IMPORT - START
function initImageImport() {
    getPalette();

    sHTML="";
    for(var i=0;i<aPalette.length;i++){
        sHTML=sHTML+"<div class='smallswatch' style='background-color:#" + aPalette[i] + "'><img src='gfx/pixel.gif' alt='' /></div>";
    }
    if(aPalette.length==0){ sHTML=sNoColors; }
    sHTML=sHTML+sFloatFix;
    document.getElementById("content_palette").innerHTML=sHTML;

    
    if(extractedColors){
        extractedColors.sort(sortSwatchesLight);
        extractedColors.reverse();
        document.getElementById("swatches").innerHTML=getSwatchesHTML(extractedColors)+sFloatFix;
        document.getElementById("importPaletteFunctions").style.display="block";
	}
    
    // swatch context menu
    oMenu = new YAHOO.widget.Menu("basicmenu", { position: "dynamic", x:200, y:200 }); 

    oMenu.addItems([   
         { text: "Add to current palette", onclick: { fn:addToCurrentPalette, obj:"bar"} },
         { text: "Use with Color Match", onclick: { fn:useWithColorMatch, obj:"bar"} },
         { text: "Convert to other system", onclick: { fn:convertColor, obj:"bar"} }
     ]);  
    oMenu.render(document.body);    
}

function importToCurrent(replace) {
    if(replace){
        aPalette = new Array();
    }
    try {
        var colCount = extractedColors.length;
        if(colCount>0){
            for(var z=0; z<colCount; z++){
                aPalette.push(extractedColors[z]);
            }
        }
    }catch(m){
        // no colors
    }
        
    postPalette();
    renderCurrentPalette();

    return (false);
}

function importSaveSilently() {
    var p = extractedColors.join(",");
    silentlySavePalette(p, "Image Import")
    alert("The palette has been saved.\n\nYou may access it from the My Palettes tab.");
    return (false);
}


// IMAGE COLOR IMPORT - END



// MY PALETTES - START

function initMyPalettes() {

    // track mouse position
    YAHOO.util.Event.on(document.body, 'mousemove', function(e) {
        mouseX = YAHOO.util.Event.getPageX(e);
        mouseY = YAHOO.util.Event.getPageY(e);
    });

    // swatch context menu
    oMenu = new YAHOO.widget.Menu("basicmenu", { position: "dynamic", x: 200, y: 200 });

    oMenu.addItems([
         [
             { text: "Load palette", onclick: { fn: loadPalette} },
             { text: "Append to current", onclick: { fn: appendPalette} }
         ],
         [
             { text: "Rename", onclick: { fn: renamePalette} },
             { text: "Delete", onclick: { fn: deletePalette} }
         ]
         ,
         [
            { text: "Export as ASE file", onclick: { fn: exportPalette, obj: "ase" } },
            { text: "Export as ACO file", onclick: { fn: exportPalette, obj: "aco" } },
            { text: "Export as PNG file", onclick: { fn: exportPalette, obj: "png" } },
            { text: "Export as TXT file", onclick: { fn: exportPalette, obj: "txt" } }
         ]
     ]);
    oMenu.render(document.body);
}

function mp_showMenu(paletteId, currentName) {
    oPalette = paletteId;
    oPaletteName = currentName;
    oMenu.show();
    document.getElementById("basicmenu").style.left = (mouseX - 10) + "px";
    document.getElementById("basicmenu").style.top = (mouseY - 10) + "px";    
}

function renamePalette() {
    var newName = prompt('Please enter new palette name:', oPaletteName);
    if (!newName) {
        return (false);
    } else {    
        window.location = "paletteoperations.aspx?cmd=rename&param=" + oPalette + "&value=" + newName;        
        //document.getElementById("renamedPaletteName").value = newName;
        return (true);
    }
}

function deletePalette() {
    if (confirm('Really delete this palette?')) {
        window.location = "paletteoperations.aspx?cmd=delete&param=" + oPalette;
    } else {
        return (false);
    }
}
function loadPalette() {
    window.location = "paletteoperations.aspx?cmd=load&param=" + oPalette;
}
function appendPalette() {
    window.location = "paletteoperations.aspx?cmd=append&param=" + oPalette;
}
function exportPalette(p_sType, p_aArgs, expformat) {
    window.location = "export.aspx?mode=" + expformat + "&id=" + oPalette;
}
// MY PALETTES - END




// LAYOUT TESTER - START

function initLayoutTester() {
    getPalette();
    
    document.getElementById("swatches").innerHTML = getSwatchesHTML(aPalette) + sFloatFix;
    
    
    // swatch context menu
    oMenu = new YAHOO.widget.Menu("basicmenu", { position: "dynamic", x: 200, y: 200 });

    oMenu.addItems([
         [
         { text: "Use for Background Color", onclick: { fn: assignLayoutColor, obj: "background"} },
         { text: "Use for Menu Background Color", onclick: { fn: assignLayoutColor, obj: "menubackground"} }
         ],[
         { text: "Use for Heading 1 Color", onclick: { fn: assignLayoutColor, obj: "h1"} },
         { text: "Use for Heading 2 Color", onclick: { fn: assignLayoutColor, obj: "h2"} },
         { text: "Use for Text Color", onclick: { fn: assignLayoutColor, obj: "text"} },
         { text: "Use for Link Color", onclick: { fn: assignLayoutColor, obj: "link"} },
         { text: "Use for Link Hover Color", onclick: { fn: assignLayoutColor, obj: "linkhover"} }
         ],[
         { text: "Use for Menu Link Color", onclick: { fn: assignLayoutColor, obj: "menulink"} },
         { text: "Use for Menu Link Hover Color", onclick: { fn: assignLayoutColor, obj: "menulinkhover"} }
         ]
     ]);
    oMenu.render(document.body);
}


function assignLayoutColor(p_sType, p_aArgs, styleElement) {
    var styleElement;
    //alert(oColor);
    switch (styleElement) {
        case "background":
            styleElement = getCSSRule(".layoutTester .content", false);
            styleElement.style.backgroundColor = "#" + oColor;
            break;
        case "menubackground":
            styleElement = getCSSRule(".layoutTester .menu", false);
            styleElement.style.backgroundColor = "#" + oColor;
            break;
        case "text":
            styleElement = getCSSRule(".layoutTester .content p", false);
            styleElement.style.color = "#" + oColor;
            break;
        case "h1":
            styleElement = getCSSRule(".layoutTester .content h1", false);
            styleElement.style.color = "#" + oColor;
            break;
        case "h2":
            styleElement = getCSSRule(".layoutTester .content h2", false);
            styleElement.style.color = "#" + oColor;
            break;
        case "link":
            styleElement = getCSSRule(".layoutTester .content a", false);
            styleElement.style.color = "#" + oColor;
            break;
        case "linkhover":
            styleElement = getCSSRule(".layoutTester .content a:hover", false);
            styleElement.style.color = "#" + oColor;
            break;
        case "menulink":
            styleElement = getCSSRule(".layoutTester .menu a", false);
            styleElement.style.color = "#" + oColor;
            break;
        case "menulinkhover":
            styleElement = getCSSRule(".layoutTester .menu a:hover", false);
            styleElement.style.color = "#" + oColor;
            break;
    }
    
}


// getCSSRule() courtesy of http://www.hunlock.com
function getCSSRule(ruleName, deleteFlag) { ruleName = ruleName.toLowerCase(); if (document.styleSheets) { for (var i = 0; i < document.styleSheets.length; i++) { var styleSheet = document.styleSheets[i]; var ii = 0; var cssRule = false; do { if (styleSheet.cssRules) { cssRule = styleSheet.cssRules[ii]; } else { cssRule = styleSheet.rules[ii]; } if (cssRule) { if (cssRule.selectorText.toLowerCase() == ruleName) { if (deleteFlag == 'delete') { if (styleSheet.cssRules) { styleSheet.deleteRule(ii); } else { styleSheet.removeRule(ii); } return true; } else { return cssRule; } } } ii++; } while (cssRule) } } return false; }

// LAYOUT TESTER - END




// COMMON - START

function mtLink(name, dom, tld) {
    document.write("<a href='mailto:" + name + "@" + dom + "." + tld + "'>" + name + "@" + dom + "." + tld + "</a>");
}

// COMMON - END

