var inkRGB=new Array(10)
	inkRGB[0]=new Array(0.188, 0.204, 0.220)
	inkRGB[1]=new Array(0.161, 0.157, 0.490)
	inkRGB[2]=new Array(0.000, 0.565, 0.373)
	inkRGB[3]=new Array(0.000, 0.647, 0.847)
	inkRGB[4]=new Array(0.851, 0.106, 0.145)
	inkRGB[5]=new Array(0.847, 0.000, 0.475)
	inkRGB[6]=new Array(0.961, 0.875, 0.000)
	inkRGB[7]=new Array(0.941, 0.925, 0.922)
	inkRGB[8]=new Array(0.180, 0.161, 0.141)
	inkRGB[9]=new Array(1.0, 1.0, 1.0)
var dotGain = new Array(0.38, 0.32, 0.5, 0.5);

function getCMYKForChannelName(channelsArrayString, ChannelName)
{
	var resultString = "cmyk(0,0,0,0)";

	var ChannelNameStart = channelsArrayString.indexOf(ChannelName);
	if (ChannelNameStart >= 0)
	{
		var CMYKStartIndex = channelsArrayString.indexOf("cmyk", ChannelNameStart);
		if (CMYKStartIndex >= 0)
		{
			var CMYKEndIndex = channelsArrayString.indexOf(")", CMYKStartIndex+4);
			if ((CMYKEndIndex >= 0) && ((CMYKStartIndex+11) < CMYKEndIndex))
			{
				var resultStringTmp = channelsArrayString.substring(CMYKStartIndex, CMYKEndIndex+1)
				var ValuesString = resultStringTmp.substring(5,resultStringTmp.length-1);
				var ValuesArray = new Array();
				ValuesArray = ValuesString.split(',');
				if (ValuesArray.length == 4)
				{
					var isNumbersOK = true;
					for (var i=0; i < ValuesArray.length; i++)
					{
						if (isNaN(ValuesArray[i]))
						{
							isNumbersOK = false;
							break;
						}
					}
					if (isNumbersOK)
						resultString = resultStringTmp
				}
			}
		}
	}

	return resultString;
}

function chanStrToCMYKstr(channelsStr)
{	
	var cmykStr = ""
	//if (channelsStr == " || channelsStr == null) return channelsStr
	channelsStr = channelsStr.toLowerCase()
	alreadyRgb = channelsStr.indexOf("rgb(")
	if (alreadyRgb != -1)
		return null
	
	channelCnt = channelsStr.split(',').length
	// Is Spot
	if (channelCnt = 1 && isSpotColor(channelsStr))
	{
		var tempName = String(channelsStr.split('channel(')[1])
		if (tempName == null) return null
		var channelName = tempName.split(':')[0]
		if (channelName== null) return null
		var tempPercent = channelsStr.split(':')[1]
		if (tempPercent == null) return null
		var channelPercent = tempPercent.split(')')[0]
		if (channelPercent== null) return null
		
		cmykStr = applyCMYKChannelPercent(getCMYKForChannelName(channelsArray,channelName), channelPercent)
	}
	else
	{
		// Not spot and not allready RGB => CMYK
		var cyan = getChannelValue(channelsStr, "cyan")
		var magenta = getChannelValue(channelsStr, "magenta")
		var yellow = getChannelValue(channelsStr, "yellow")
		var black = getChannelValue(channelsStr, "black")
		
		cmykStr = "cmyk(" + cyan + "," + magenta + "," + yellow + "," + black + ")"
	}
	return cmykStr
}

function isChannelStr(chanColor)
{
	if (chanColor != null)
		return (chanColor.toLowerCase().indexOf("channel(") != -1)
}

function isRgbStr(rgbColor)
{
	if (rgbColor!= null)
		return (rgbColor.toLowerCase().indexOf("rgb") != -1)
}

/* This function takes the channels string (channel(cyan:60,....)) and gets the RGB code for it
The rest of the following functions are internal functions to be used in it*/
function chanStrToRGBstr(channelsStr)
{	
	var cmykStr = ""
	//if (channelsStr == " || channelsStr == null) return channelsStr
	channelsStr = channelsStr.toLowerCase()
	alreadyRgb = channelsStr.indexOf("rgb(")
	if (alreadyRgb != -1)
		return channelsStr
	
	channelCnt = channelsStr.split(',').length
	// Is Spot
	if (channelCnt = 1 && isSpotColor(channelsStr))
	{
		var tempName = channelsStr.split('channel(')[1]
		if (tempName == null) return null
		channelName = tempName.split(':')[0]
		if (channelName== null) return null
		tempPercent = channelsStr.split(':')[1]
		if (tempPercent == null) return null
		channelPercent = tempPercent.split(')')[0]
		if (channelPercent== null) return null
		for (var i=0;i < channelsArray.length ; i++)
			if (channelName == channelsArray[i][0])
				cmykStr = applyCMYKChannelPercent(channelsArray[i][3], channelPercent)
	}
	else
	{
		// Not spot and not allready RGB => CMYK
		var cyan = getChannelValue(channelsStr, "cyan")
		var magenta = getChannelValue(channelsStr, "magenta")
		var yellow = getChannelValue(channelsStr, "yellow")
		var black = getChannelValue(channelsStr, "black")
		
		cmykStr = "cmyk(" + cyan + "," + magenta + "," + yellow + "," + black + ")"
	}
	rgbStr = colCMYK2RGBStr(cmykStr)
	return rgbStr
}


function chanCMYKStrToChannelStr(cmykStr)
{
	var cyan = getCMYKValue(cmykStr, "cyan")
	var magenta = getCMYKValue(cmykStr, "magenta")
	var yellow = getCMYKValue(cmykStr, "yellow")
	var black = getCMYKValue(cmykStr, "black")
	return "channel(Cyan:" + cyan + ",Magenta:" + magenta + ",Yellow:" + yellow + ",Black:" + black + ")"
}

function applyCMYKChannelPercent(oldCMYKStr, percent)
{
	cmykArr = oldCMYKStr.split('cmyk(')[1].split(')')[0].split(',')
	for (var i=0;i<4;i++)
	{
		temp = parseInt(percent * cmykArr[i] / 100)
		cmykArr[i] = temp
	}
	var cmykStr = "cmyk(" + cmykArr[0] + "," + cmykArr[1] + "," + cmykArr[2] + "," + cmykArr[3] + ")"
	return cmykStr
}

function isSpotColor(channelsStr)
{
	var processArr = new Array ("cyan", "magenta", "yellow" ,"black")
	for (var i=0;i < processArr.length;i++)
	{
		if (channelsStr.indexOf(processArr[i]) != -1)
			return false
	}
	return true
}

function getChannelValue(channelsStr, channel)
{
	var beginIndex = channelsStr.indexOf(channel)
	var endIndex = channelsStr.indexOf(",", beginIndex)
	nameLen = channel.length
	if (beginIndex!=-1)
	{
		if (endIndex !=-1)
			return channelsStr.substring(beginIndex + nameLen + 1,endIndex )
		else
			return channelsStr.substring(beginIndex + nameLen + 1, channelsStr.indexOf(")"))
	}
	return 0
}

function getCMYKValue(cmykStr, channelName)
{
	if (cmykStr != null & cmykStr != "")
	{
		var cmykStr = cmykStr.substring(5,cmykStr.length-1)
		var cmykArr = cmykStr.split(",")
		switch (channelName)
		{
			case "cyan":
				index = 0
			break
			case "magenta":
				index = 1	
			break
			case "yellow":
				index = 2
			break
			case "black":
				index = 3
			break
		}
		return cmykArr[index]
	}
}

function colCMYK2RGBStr(cmykstr)
{
	if(cmykstr != null && cmykstr != "")
	{
		var RGB;
		RGB = CMYK2RGB(cmykstr.replace("cmyk(","").replace("CMYK(","").replace(")","").split(","));
		return "rgb("+mumToStr(RGB[0])+","+mumToStr(RGB[1])+","+mumToStr(RGB[2])+")";
	}
}

/*
mumToStr
	converts a number to string
*/

function mumToStr(d)
{
	d=parseFloat(d);
	if (isNaN(d))
		return "";
	var s = new String(d);
	return (s.replace(",","."));
}

function applyDotGain(inCMYK) {
	var x;
	for (var i = 0; i < 4; i++) {
		x = inCMYK[i];
		inCMYK[i] = dotGain[i] * x * (1.0 - x) / 0.25 + x * (x - 0.5) / 0.5;
	}
	return inCMYK
}

/*
CMYK2RGB
	converts a cmyk vector to a rgb one

	in	:	inCMYK : int[4]  = cmyk in % (0 .. 100)
	out :	int[3] = rgb in (0 .. 255)
*/
function CMYK2RGB(inCMYK)
{
	var outRGB=new Array(3);

	var cmyk=new Array(4)
	var c, m, y, k, cm, cy, my, cmy, w, r, g, b;

	cmyk[0] = inCMYK[0] / 100.0;
	cmyk[1] = inCMYK[1] / 100.0;
	cmyk[2] = inCMYK[2] / 100.0;
	cmyk[3] = inCMYK[3] / 100.0;

	cmyk=applyDotGain(cmyk, dotGain);

	c = cmyk[0];
	m = cmyk[1];
	y = cmyk[2];
	k = cmyk[3];

	w = 1.0 - c;
	cm = c * m;
	c = c - cm;
	m = m * w;
	w = w - m;

	cy = c * y;
	c = c - cy;
	my = m * y;
	m = m - my;
	cmy = cm * y;
	cm = cm - cmy;
	y = y * w;
	w = w - y;

	r = g = b = w;

	r += c * inkRGB[3][0] + m * inkRGB[5][0] + y * inkRGB[6][0];
	g += c * inkRGB[3][1] + m * inkRGB[5][1] + y * inkRGB[6][1];
	b += c * inkRGB[3][2] + m * inkRGB[5][2] + y * inkRGB[6][2];

	r += cm * inkRGB[1][0] + cy * inkRGB[2][0] + my * inkRGB[4][0] + cmy * inkRGB[0][0];
	g += cm * inkRGB[1][1] + cy * inkRGB[2][1] + my * inkRGB[4][1] + cmy * inkRGB[0][1];
	b += cm * inkRGB[1][2] + cy * inkRGB[2][2] + my * inkRGB[4][2] + cmy * inkRGB[0][2];

	r *= 1.0 - k * (1.0 - inkRGB[8][0]);
	g *= 1.0 - k * (1.0 - inkRGB[8][1]);
	b *= 1.0 - k * (1.0 - inkRGB[8][2]);

	// clip to range 0 - 1
	// round color values and encode them in 8-bit values
	outRGB[0] = (Math.floor(clip(r,0,1) * 255.0 + 0.5));
	outRGB[1] = (Math.floor(clip(g,0,1) * 255.0 + 0.5));
	outRGB[2] = (Math.floor(clip(b,0,1) * 255.0 + 0.5));
	return outRGB;
}
/*
clip
	clips a number to the range min..max
	if i isn't a number then return min
*/

function clip(d,min,max)
{
	d=parseFloat(d);
	if (isNaN(d))
		return min;
	return (d < min) ? min : (d > max) ? max : d;
}

