//ColorMixers
//2010-2-8 何も選択していない時はスウォッチを処理する。（破壊的）なので要セーブ後。
//2009-9-3 設定の保存と読み込み機能を追加。
//2009-9-2 とりあえず
//色混var2（http://dtpwiki.jp/?Perl）のjavascript移植版のつもり
//
#target 'illustrator';
#include 'c.js';
#include 'myDialogMaker.js';
(function(){
/*
if(c.selection().length == 0){
	alert('何か選択してから実行してください。');
	return;
}
*/
var GradientColorNames = "";
var SpotColorNames = "";
var CalcColor = {
	CMYKColor : function(Color,mixValue){
		with(Color){	
			var Newcyan = ((mixValue.C.C*cyan+mixValue.M.C*magenta+mixValue.Y.C*yellow+mixValue.K.C*black)/100);
			var Newmagenta = ((mixValue.C.M*cyan+mixValue.M.M*magenta+mixValue.Y.M*yellow+mixValue.K.M*black)/100);
			var Newyellow = ((mixValue.C.Y*cyan+mixValue.M.Y*magenta+mixValue.Y.Y*yellow+mixValue.K.Y*black)/100);
			var Newblack = ((mixValue.C.K*cyan+mixValue.M.K*magenta+mixValue.Y.K*yellow+mixValue.K.K*black)/100);
			cyan = Newcyan < 100 ? Newcyan : 100;
			magenta = Newmagenta < 100 ? Newmagenta : 100 ;
			yellow = Newyellow  < 100 ? Newyellow : 100;
			black = Newblack < 100 ? Newblack : 100;
		}
		return Color
	},
	GrayColor : function(Color,mixValue){
			var cmyk = new CMYKColor();
			cmyk.black = Color.gray;
			Color = cmyk;
			return CalcColor.CMYKColor(Color,mixValue);
	},
	RGBColor : function(Color,mixValue){},
	GradientColor : function(Color,mixValue){
			if(GradientColorNames.match(">"+Color.gradient.name+"<"))return Color;
			GradientColorNames += ">"+Color.gradient.name+"<";
			c(Color.gradient.gradientStops).each(function(){
				this.color = CalcColor[this.color.constructor.name](this.color,mixValue);
			});
			return Color;
	},
	SpotColor : function(Color,mixValue){
			if(SpotColorNames.match(">"+Color.spot.name+"<"))return Color;
			SpotColorNames += ">"+Color.spot.name+"<";
			Color.spot.color = CalcColor[Color.spot.color.constructor.name](Color.spot.color,mixValue);
			return Color;
	},
	PatternColor : function(Color,mixValue){
			$.bp();
			return Color;
	},
	NoColor : function(Color,mixValue){return Color}
};	

var myD =myDialogMaker({type:"dialog", title:"ColorMixers", pos:["200", "200", "470", "420"], option:{closeOnKey:"OSCmnd+W"}, layout:[
{name:"EXECUTE", type:"button", label:"EXECUTE", option:{onClick : ColorChange}, pos:[175, 180, 255, 200]},
{name:"SAVE", type:"button", label:"SAVE", option:{onClick : saveValue}, pos:[100, 180, 140, 200]},
{name:"LOAD", type:"button", label:"LOAD", option:{onClick : loadValue}, pos:[20, 180, 80, 200]},
{name:"CMYK", type:"panel", label:"CMYK", option:{}, pos:[15, 5, 250, 170], items:[
	{name:"C", type:"group", label:"TEXT", option:{orientation:"--"}, pos:[15, 25, 240, 45], items:[
		{name:"T", type:"statictext", label:"Cyan", option:{}, pos:[0, 3, 65, 23]},
		{name:"C", type:"edittext", label:"", option:{text:"100"}, pos:[65, 0, 100, 20]},
		{name:"M", type:"edittext", label:"", option:{text:"0"}, pos:[100, 0, 135, 20]},
		{name:"Y", type:"edittext", label:"", option:{text:"0"}, pos:[135, 0, 170, 20]},
		{name:"K", type:"edittext", label:"", option:{text:"0"}, pos:[170, 0, 205, 20]}
	]},
	{name:"M", type:"group", label:"TEXT", option:{orientation:"--"}, pos:[15, 60, 240, 80], items:[
		{name:"T", type:"statictext", label:"Magenta", option:{}, pos:[0, 3, 65, 23]},
		{name:"C", type:"edittext", label:"", option:{text:"0"}, pos:[65, 0, 100, 20]},
		{name:"M", type:"edittext", label:"", option:{text:"100"}, pos:[100, 0, 135, 20]},
		{name:"Y", type:"edittext", label:"", option:{text:"0"}, pos:[135, 0, 170, 20]},
		{name:"K", type:"edittext", label:"", option:{text:"0"}, pos:[170, 0, 205, 20]}
	]},
	{name:"Y", type:"group", label:"TEXT", option:{orientation:"--"}, pos:[15, 95, 240, 115], items:[
		{name:"T", type:"statictext", label:"Yellow", option:{}, pos:[0, 3, 65, 23]},
		{name:"C", type:"edittext", label:"", option:{text:"0"}, pos:[65, 0, 100, 20]},
		{name:"M", type:"edittext", label:"", option:{text:"0"}, pos:[100, 0, 135, 20]},
		{name:"Y", type:"edittext", label:"", option:{text:"100"}, pos:[135, 0, 170, 20]},
		{name:"K", type:"edittext", label:"", option:{text:"0"}, pos:[170, 0, 205, 20]}
	]},
	{name:"K", type:"group", label:"TEXT", option:{orientation:"--"}, pos:[15, 130, 240, 150], items:[
		{name:"T", type:"statictext", label:"Black", option:{justify:"canter", text:""}, pos:[0, 3, 65, 23]},
		{name:"C", type:"edittext", label:"", option:{text:"0"}, pos:[65, 0, 100, 20]},
		{name:"M", type:"edittext", label:"", option:{text:"0"}, pos:[100, 0, 135, 20]},
		{name:"Y", type:"edittext", label:"", option:{text:"0"}, pos:[135, 0, 170, 20]},
		{name:"K", type:"edittext", label:"", option:{text:"100"}, pos:[170, 0, 205, 20]}
	]}	
]}
]});
myD.wD.show()

function ColorChange(){
mixValue = getValue();

if(c.selection().length == 0){
	c(app.activeDocument.swatches).each(function(){
		this.color = CalcColor[this.color.constructor.name](this.color,mixValue);
	});	
}else{
		//パスに対して
		c.selection().pathItems().each(function(){
			//塗り
			this.filled && this.fillColor = CalcColor[this.fillColor.constructor.name](this.fillColor,mixValue);
			//線
			this.stroked && this.strokeColor = CalcColor[this.strokeColor.constructor.name](this.strokeColor,mixValue);
		});
		//テキストフレームに対して
		c.selection().textFrames().textRanges().each(function(){
			//塗り
			this.fillColor = CalcColor[this.fillColor.constructor.name](this.fillColor,mixValue);
			//線
			this.strokeColor = CalcColor[this.strokeColor.constructor.name](this.strokeColor,mixValue);
		});
}
/*
//画像に対して
c.selection().placedItems().each(function(){

});
*/


init();
app.redraw();
alert('実行が完了しました。');
}



function init(){
mixValue = {};
GradientColorNames = "";
SpotColorNames = "";
}
function setValue(Value){
	if(!(Value.hasOwnProperty ('C') && Value.hasOwnProperty ('M') && Value.hasOwnProperty ('Y') && Value.hasOwnProperty ('K'))){
		alert("設定ファイルではありません");
		return;
	}
	for(var i in Value){
			$.writeln(i);
			for(var j in Value[i]){
				try{
				myD.items.CMYK.items[i].items[j].text = Value[i][j];
				}catch(e){
					
				}
			};

	}
};

function getValue(){
	return {
		C : { C :myD.items.CMYK.items.C.items.C.text ,  M :myD.items.CMYK.items.C.items.M.text ,  Y :myD.items.CMYK.items.C.items.Y.text ,  K :myD.items.CMYK.items.C.items.K.text },
		M : { C :myD.items.CMYK.items.M.items.C.text ,  M :myD.items.CMYK.items.M.items.M.text ,  Y :myD.items.CMYK.items.M.items.Y.text ,  K :myD.items.CMYK.items.M.items.K.text },
		Y : { C :myD.items.CMYK.items.Y.items.C.text ,  M :myD.items.CMYK.items.Y.items.M.text ,  Y :myD.items.CMYK.items.Y.items.Y.text ,  K :myD.items.CMYK.items.Y.items.K.text },
		K : { C :myD.items.CMYK.items.K.items.C.text ,  M :myD.items.CMYK.items.K.items.M.text ,  Y :myD.items.CMYK.items.K.items.Y.text ,  K :myD.items.CMYK.items.K.items.K.text }
	};	
};

function saveValue(){
	var saveFile = File.saveDialog ('どこに保存しますか', '*.js');
	if(!saveFile)return;
	saveFile.open('w');
	saveFile.write(toSourceCodeCleaner(getValue().toSource()));
	saveFile.close();
	alert('保存しました。');
}
function loadValue(){
	var loadFile = File.openDialog ('読み込む設定ファイルを選択してください。','*.js', false);
	if(!loadFile)return;
	loadFile.open('r');
	eval('var val =' + loadFile.read());
	setValue(val);
}
function toSourceCodeCleaner(Code){
	return Code.replace(/^\(\{/,'{' ).replace(/\}\)$/,'}' ).replace(/\}\),\s\(\{/g,"},\n{").replace(/\[\(\{/g,'[\n{').replace(/\}\)\]/g,'}\n]').replace(/\"([0-9]+)\"/g,'$1');
}
})();