/*
kac.js

--- おことわり
このプログラムの著作権は「ねこまたや」にあります。

あなたは、このプログラムのこの著作権表示を改変しないかぎり
自由にプログラムの使用・複製・再配布などを行うことができます。

あなたは、このプログラムを自己の目的にしたがって改造することができます。
その場合、このプログラムを改造したものであることを明記して、この著作権表示を
添付するように努めてください。

このプログラムを使うも使わないもあなたの自由なのです。

作者はこのプログラムを使用したことによって起きたいかなる
不利益に対しても責任を負いません。
あなたは、あなたの判断と責任においてこのプログラムを使用するのです。

なんか、困ったことがあったら以下で連絡してもらえると何とかなるかもしれません。
http://homepage2.nifty.com/Nekomata/
mailto:nekomata_ya@mac.com

そんな感じです。
*/
/*メッセージ (現在未使用）
フレームレートがロックされているので、リンクは解除できません。
解像度がロックされているので、リンクは解除できません。
ゼロは設定しないでください。
負の値は設定できません。
メッセージは不要かも
フラグを付けてプリファレンスで選択させるか?
*/
//	定数設定
//プログラムバージョン
	var VER = "Ver.0.1 alpha";
//メッセージ
	lmsg = new Array;
lmsg[0]="キーデータがありません。"
lmsg[1]="処理を中断します。"
lmsg[2]="処理すべきデータがありません。"
lmsg[3]="AE4ではZ座標は使用できません。"
//lmsg[]=""
	gmsg = new Array;
gmsg[0]=" は、有効なタイムコードとして認識できませんでした。"
gmsg[1]="フレームサイズ"
gmsg[2]="は、許可できません。"
gmsg[3]="視野外です。"
//gmsg[]=""
//	変数初期化

//マウスバリュースライダ変数
var Xoffset = 0;
var baseValue = 0;
var diffValue = 0;

var SheetLength = 144;
//	初期状態の設定
// 初期状態は、呼び出し側に記述された値で上書きするのでこちらを特に変更する必要はなさそう。

//	時間関連設定
// 	時計機能関連のフラグがたっておるなら使用
if (document.nasExchg.ExchgUnit.value.match(/Time/)=="Time") {
var ccrate = 1000 ;	//最少計測単位(javascriptではミリ秒固定)
var MODE = "clock" ;	//表示の初期モード(時計)
var ClockOption = 12 ;	//時計の初期モード (12時制)
var STATUS = "stop" ;
//	フレームレート	ここの並びでループする　RT 24FPS 30NDF 30DF 25FPS
RATEs = ["100","24FPS","30NDF","30DF","25FPS"];
var RATE = "24FPS" ;
}
//基準変数
//名前付け規則は、以下に準ずる
//スクリプト上の変数名は、大文字のみ
//フォーム上の同名のエレメントは 小文字で綴り初めて 大文字で綴り終わる記法で
//	複合単語は、前置語を小文字、後置語を大文字

var FRATE = 24. ;//fps fRATE
var RESOLUTION = 144. / 2.540 ;//ppc(dpc)
var LENGTH = 225. ;//基準寸法(mm)
var FRAME_L=100 ;//基準フレーム(fl)
//Frame of Location アニメーション撮影フレーム(traditional)
var SCALE = 1;//拡大比率(実数)

var FOCUS_D = 50; //レンズ焦点距離 (mm)
var FILM_W = 36;//FILM Width (mm)
var FILM_H = 24;//FILM Height(mm)
var IMAGE_CR = Math.sqrt(Math.pow(FILM_W,2)+ Math.pow(FILM_H,2));
//イメージサークル直径(mm)

// for AEkey
var COMP_W = 720;//comp Width (px);
var COMP_H = 486;//comp Height(px);
var COMP_A = 0.9;//comp Aspect(W/H);
var COMP_D = Math.sqrt(Math.pow(COMP_W * COMP_A,2)+ Math.pow(COMP_H,2));
var CAMERA_D = (COMP_D * FOCUS_D)/ IMAGE_CR;
//今のところキーに添付するだけの値(変換には無関係)
var SRC_W = 720;//source Width (px);
var SRC_H = 486;//source Height(px);
var SRC_A = 0.9;//source Aspect(W/H);
// AE-Key data 出力関連の変数(初期値)
// フォームの種類によってはこれは不要 (独立させるべきかも?)

var AE_Ver = "5.0";// 4.0/5.0/6.0
var KEY_STYLE = "withTime";//or "valueOnly"
var KEY_TYPE = "Scale";// or "Position"


//子変数 親変数から導かれる表示データ
//変数名は、大文字ではじまり 後ろは小文字のみ
//フォーム上の同名のinputは極力大文字のみで表記

var Dpi = RESOLUTION * 2.540 ;
var Dpc = RESOLUTION ;


var FRAMEl = FRAME_L;
var FRAMEr = fl2fr(FRAME_L);
//キーラインデータ配列[時間,サイズ,スケール,画郭]


function initkld () {
	kld = new Array(3);
	kldFill = 0;
for (n=0;n<3;n ++){
	kld[n] = ["--","--","--","--"];
	updatekeyTime(n);
	updatekeySize(n);
	updatekeyScale(n);
	updatekeyFrameL(n);
}
//for (n=0;n<3;n ++){kld[n] = [n * 1000,"--","--","--"]}

}

//フォームレイアウト定義 フォームごとに設置
if (document.nasExchg.ExchgUnit.value.match(/kac/)=="kac") {
//フォーム部品とカテゴリの対応 
ElementCategory = [
	"ExchgUnit",
	"RATE","RESOLUTION","RESOLUTION",
	"CompSize","CompSize","CompSize",
	"Lens","Lens","Lens",
	"BaseValue","BaseValue","BaseValue",
	"kld","kld","kld","kld","kld","kld","kld","kld",
	"kld","kld","kld","kld","kld","kld","kld","kld",
	"kld","kld","kld","kld","kld","kld","kld","kld",
	"submit","submit","submit",
	"RESULT",
	"submit",
	"AEKey","AEKey","AEKey",
	"AEKey","AEKey",
	"AEKey","AEKey"
];

//	"idx","tc","tc","size","scale","distance","fl","fr",
//エレメントの名称
ElementName = [
	"ExchgUnit",
	"fRATE","dpI","dpC",
	"compA","compX","compY",
	"focusD","filmX","filmY",
	"lengtH","frameL","frameR",
	"idX1","frameS1","tC1","lengtH1","scalE1","zDIST1","fL1","fR1",
	"idX2","frameS2","tC2","lengtH2","scalE2","zDIST2","fL2","fR2",
	"idX3","frameS3","tC3","lengtH3","scalE3","zDIST3","fL3","fR3"
];
/*
	"VIEWLIST","AEKEY","CLEAR",
	"RESULTBOX",
	"SUBMIT",
	"AEV","AEV","AEV",
	"srcX","srcY",
	"KEYTYPE","KEYTYPE"
画像ボタンのステータス(htmlのステータスを上書きする）
最終的にはクッキーで保存?
*/

//ボタンIDとカテゴリの対応
BtCategory = [
	"size",
	"scale",
	"frameL",
];
//画像ボタンの状態(初期値)
BtStatus = [
	"link","link","link"
];
//フォーム入力初期値設定
BkValue = [
	document.nasExchg.ExchgUnit.value,
	FRATE,Dpi,Dpc,
	COMP_A,COMP_W,COMP_H,
	FOCUS_D,FILM_W,FILM_H,
	LENGTH,FRAMEl,FRAMEr,
0,	
	"void","void","void","void","void","void","void",
1,
	"void","void","void","void","void","void","void",
2,
	"void","void","void","void","void","void","void"
];
/*
0,
	kld[0][0],kld[0][0],
	kld[0][1],
	kld[0][2],kld[0][2],
	kld[0][3],kld[0][3],
1,
	kld[1][0],kld[1][0],
	kld[1][1],
	kld[1][2],kld[1][2],
	kld[1][3],kld[1][3],
2,
	kld[2][0],kld[2][0],
	kld[2][1],
	kld[2][2],kld[2][2],
	kld[2][3],kld[2][3]

	ms2FCT(kld[0][0],0,1),ms2FCT(kld[0][0],3,0),
	ms2FCT(kld[1][0],0,1),ms2FCT(kld[1][0],3,0),
	ms2FCT(kld[2][0],0,1),ms2FCT(kld[2][0],3,0),
	"1","0000 _","00+00 .","--","--","--","--","--",
	"2","0000 _","01+00 .","--","--","--","--","--",
	"3","0000 _","02+00 .","--","--","--","--","--"
*/

}
//エレメントの値をすべてバックアップ(正常な処理の最後に呼ぶ)
function updateBk() {
	for (n = 1 ; n< BkValue.length ; n++) {BkValue[n] = document.nasExchg.elements[n].value }
}
//	計算モードフラグ
//	通常の計算モードとレート逆算のモードを作る…
//	つもりだったけど、構成を単純化するためにやめる
var mode_flag = "ST";

//	ログ配列を初期化（）
Log = new Array() ;
function nas_Push_Log(str) {Log = Log.concat([str])}
//	ログ 初期化してみる
nas_Push_Log( "Program Started " + VER);
nas_Push_Log( Date() );
nas_Push_Log( "  FrameRate" + FRATE + "(" + FRATE + ")");
//nas_Push_Log( "  Start Mode  [" + MODE + "]" );
//
function showMsg(str){
document.nasExchg.RESULTBOX.value = document.nasExchg.RESULTBOX.value 
+ str + "\n";
}
//距離関連換算関数
function dt2sc(dt){return (CAMERA_D/((1 * dt) + CAMERA_D))}
function sc2dt(sc){return ((CAMERA_D/(1 * sc))-CAMERA_D)}
//フレーム関連換算関数 一々書いても間違えそうなのでまとめておく。
function fl2fr(fl){return ((fl * 1 + 60)/1.60)}
function fr2fl(fr){return ((fr * 1.60)-60)}
/*
function fl2sc(fl){return (fr2sc(fl2fr(fl)))}
function fr2sc(fr){return (100/(1*fr))}
function sc2fl(sc){return (fr2fl(sc2fr(sc)))}
function sc2fr(sc){return (100/(1*sc))}
*/
function fl2sc(fl){return ((160*((FRAME_L * 1)+60))/(160*((fl*1)+60)))}
function fr2sc(fr){return (fl2sc(fr2fl(fr)))}
function sc2fl(sc){return ((((160 * (FRAME_L + 60))/(sc * 1))/160) - 60)}
function sc2fr(sc){return (fl2fr(sc2fl(sc)))}

// 拡大率変換関数
// kac(基準量,目標量,助変数)
// 戻り値は 拡大率を実数で

function kac(StartSize,EndSize,timingValue) {
if (timingValue == 0 || timingValue == 1){
	if (timingValue == 0) {resultS = StartSize}
	if (timingValue == 1) {resultS = EndSize}
} else {
/*
求める寸法は

まず開始寸法を1として終了寸法の比率を求める EndSize/Startsize

距離評価係数として 比の逆数を開始点と終了点で求める。
開始点距離評価係数 1/1 = 1
終了点距離評価係数 1/(EndSize/Startsize) = Startsize/EndSize

与えられた助変数にしたがって距離評価係数を求める。
((終了点距離評価係数 - 開始点距離評価係数) * 序変数) + 開始点距離評価係数
= (((Startsize/EndSize) - 1) * timingValue) + 1
逆数をとって比率を得て
開始寸法に掛ける
開始寸法 * 距離評価係数
= StartSize / ((((Startsize/EndSize) - 1) * timingValue) + 1)
*/
//	resultS = (1-(timingValue)*(1-(StartSize/EndSize)));
//if (EndSize == 0 || StartSize == 0) {resultS="novalue"} else {}
if (0 >= ((((StartSize/EndSize) - 1) * timingValue) + 1)){resultS="VOID"}else{
resultS = StartSize / ((((StartSize/EndSize) - 1) * timingValue) + 1)

}
}
return (resultS);
}
//逆関数
//cak(基準量,目標量,拡大率)
//戻り値は助変数を最大精度で

function cak(StartSize,EndSize,scaleValue) {
return ("resultT");
}

// ゼロ埋め ZERROfilling
function Zf(N,f) {
var prefix="";
if (N < 0) {N=Math.abs(N);prefix="-"}
if (String(N).length < f) {
	return prefix + ('00000000' + String(N)).slice(String(N).length + 8 - f , String(N).length + 8);
} else {return String(N);}
}
//時間フレーム変換
function ms2fr(ms){return (Math.floor(FRATE*(ms/1000)))}
//function ms2fr(ms){return (FRATE*(ms/1000))}
function fr2ms(frm){return (1000*frm/FRATE)}
function ms2FCT(ms,type,ostF){return Frm2FCT(Math.floor(FRATE * ms /1000),type,ostF)}
function FCT2ms(fct){return 1000*(FCT2Frm(fct))/FRATE}

//カウンタ文字列生成
function Frm2FCT(frames,type,ostF) {
var negative_flag = false;
if (frames < 0) {frames = Math.abs(frames);negative_flag=true;}
	if (ostF == 1) {
		PostFix = ' _';
	} else {
		ostF = 0;
		PostFix = ' .';
	}
//
//	default	00000
//	type 2	0:00:00
//	type 3	000 + 00
//	type 4	p 0 / 0 + 00
//	type 5	p 0 / + 000
//
var m = Math.floor((frames + ostF) / (FRATE * 60));
 var s = Math.floor((frames + ostF) / FRATE);
  var SrM = s % 60;
   var p = Math.floor(frames / SheetLength ) + 1;
    var FrS = ((frames + ostF) % FRATE);
     var FrP = (frames % SheetLength) + ostF;
      var SrP = Math.floor(((frames % SheetLength) + ostF) / FRATE)

switch (type) {
case 5: Counter ='p ' + Zf(p,1) + ' / + ' + Zf(FrP,3) + PostFix ;break;
case 4: Counter ='p ' + Zf(p,1) + ' / ' + SrP +' + ' + Zf(FrS,2)+ PostFix ;break;
case 3: Counter =Zf(s,1) + ' + ' + Zf(FrS,2) + PostFix ;break;
case 2: Counter =Zf(m,1) + ':' + Zf(SrM,2) + ':' + Zf(FrS,2) + PostFix ;break;
default: Counter =Zf(frames + ostF ,4) + PostFix ;
}
if (negative_flag) {Counter="-( " + Counter +" )"}
 return Counter;
}
//カウンタ文字から0スタートのフレーム値を返す
//カウンタ文字列以外には'元の文字列'を返す[仕様変更]
function FCT2Frm(fct) {
	var fpsC = FRATE;
	fct = fct+"";
//文字列の最期の文字を評価してオリジネーションを取得
	if (fct.charAt(fct.length - 1)=='_') {
		ostF = 1;
		PostFix = '_';
	} else {
		ostF = 0;
		PostFix = '.';
	}
//文字列の最期の文字がポストフィックスなら切り捨て
	if (fct.charAt(fct.length - 1)==PostFix) {
		fct = fct.slice(0,-1)
	}
//空白を全削除
	fct = fct.replace(/\ /g,'')
//判定
//	if (fct.match(/[0-9\:\p\/\+]/)) {return fct}
// ローカル変数初期化
	var p=1;
	 var h=0;
	  var m=0;
	   var s=0;
	    var k=0;
//	type 1	00000
	if (fct.match(/^[0-9]+$/)) {
		k=fct;
	} else {
//	type 2	0:00:00
	if (fct.match(/^([0-9]+:){1,3}[0-9]+$/)) {
//TCなのでスプリットして配列に入れる
		tmpTC=new Array()
		tmpTC=fct.split(":")
		switch (tmpTC.length) {
case 4:	 h=tmpTC[tmpTC.length - 4];
case 3:	  m=tmpTC[tmpTC.length - 3];
case 2:	   s=tmpTC[tmpTC.length - 2];
case 1:	    k=tmpTC[tmpTC.length - 1];
		}
	} else {
//	type 3	000 + 00
	if (fct.match(/^[0-9]+\+[0-9]+$/)) {
		s=fct.substring(0,fct.search(/\+/));
		 k=fct.substr(fct.search(/\+/)+1);
	} else {
//	type 4	p 0 / 0 + 00
	if (fct.match(/^p[0-9]+\/[0-9]+\+[0-9]+$/)) {
		p=fct.slice(1,fct.search(/\//));
		 s=fct.substring(fct.search(/\//)+1,fct.search(/\+/));
		  k=fct.substr(fct.search(/\+/)+1);
	} else {
//	type 5	p 0 / + 000
	if (fct.match(/^p[0-9]+\/\+[0-9]+$/)) {
		p=fct.slice(1,fct.search(/\//));
		  k=fct.substr(fct.search(/\+/)+1);
	} else {
// ダメダメ
	return fct;
		}}}}}
// 数値化して全加算
 p=parseInt(p,10);
  h=parseInt(h,10);
   m=parseInt(m,10);
     s=parseInt(s,10);
      k=parseInt(k,10);
var Frame=(p-1) * (fpsC * SheetLength) + h * (fpsC * 60 * 60) + m * (fpsC * 60) + s * (fpsC) + k - ostF;
 return Frame;
}
//
//マウスバリスライダ
function sliderVALUE(chnk) {
//配列で受け渡し [イベント,エレメント名,上限,下限,桁数(,デフォルト値)]
	Xoffset = chnk[0].screenX;

	slfocus = chnk[1];
	slmax = 1*chnk[2];
	slmin = 1*chnk[3];
	slstp = 1*chnk[4];
//ロックされていたらモード変更なしでリターン
if (document.nasExchg.elements[slfocus].disabled == true) {return false}
//基準値取得
	kpValue=document.nasExchg.elements[slfocus].value;//現在値の保存
if (document.nasExchg.elements[slfocus].value == "--") {
	if (chnk.length == 6){baseValue = 1*chnk[5]} else {baseValue = slmin}
} else {
	baseValue = 1 * (document.nasExchg.elements[slfocus].value);
}
//該当するエレメントのオンチェンジを保留してスライダモードに入る
	document.nasExchg.elements[slfocus].blur();
//	document.nasExch.elements[slfocus].onchange = '';
switch (navigator.appName) {
case "Opera":
case "Microsoft Internet Explorer":
	document.body.onmousemove = MVSlider_IE;break;
case "Netscape":
	document.body.onmousemove = MVSlider_NS;break;
default:	return;
}
	document.nasExchg.elements[slfocus].value=baseValue;
	document.body.onmouseup = sliderOFF;
}
function sliderOFF() {
//	document.nasExchg.elements[slfocus].focus();
	document.body.onmousemove = null;
	document.body.onmouseup = null;
//スライダモード終了して該当するエレメントのオンチェンジを復帰
//	document.nasExch.elements[slfocus].onchange = 'CHK_VALUE';
//スライダの値が前の値と異なっていた場合のみ更新
if (document.nasExchg.elements[slfocus].value != kpValue) {CHK_VALUE()}
//if (document.nasExchg.elements[slfocus].value != baseValue) {CHK_VALUE()}
	return;
}
function MVSlider_NS(event) {
	diffValue = event.screenX - Xoffset;
	if (diffValue >= 0) {Flgl = 1} else {Flgl= -1}
//ガンマかけて値をとる
	newValue = baseValue + (Flgl * (Math.pow(diffValue/100,2)*100));
//上限下限でおさえる
	if (newValue > slmax) {newValue = slmax} {
		if (newValue < slmin) {newValue = slmin}
	}
//ステップで桁だし
	var exN = Math.pow(10,slstp);
	newValue = Math.floor(newValue * exN)/exN;
if(document.nasExchg.elements[slfocus].value != newValue) {
	document.nasExchg.elements[slfocus].value = newValue ;
}
}

function MVSlider_IE() {
	diffValue = event.screenX - Xoffset;
	if (diffValue >= 0) {Flgl = 1} else {Flgl= -1}
//ガンマかけて値をとる
	newValue = baseValue + (Flgl * (Math.pow(diffValue/100,2)*100));
//上限下限でおさえる
	if (newValue > slmax) {newValue = slmax} {
		if (newValue < slmin) {newValue = slmin}
	}
//ステップで桁だし
	var exN = Math.pow(10,slstp);
	newValue = Math.floor(newValue * exN)/exN;
if(document.nasExchg.elements[slfocus].value != newValue) { document.nasExchg.elements[slfocus].value = newValue }
}

/*
入力値の判定と入力された値に対応するアクション
*/

function CHK_VALUE() {
	var chgValue = false;
//	入力された値を検索
for (n = 1 ; n < ElementName.length ; n++){
	if (document.nasExchg.elements[n].value != BkValue[n]) {
	ElementID = n;	elName= ElementName[n];chgValue = true;
	var InputValue = document.nasExchg.elements[n].value;
//msg = document.nasExchg.elements[elName].name + " " + document.nasExchg.elements[elName].value + " " + BkValue[n];
	break;
	} else {chgValue = false}
}
// 全数マッチしていたら処理終了
	if (chgValue == false) {return false;}

// TC文字列でかつTC入力可能なフィールドの場合は、TC文字列を処理して値をスルー
if ( elName.match(/^tC[0-9]$|^frameS[0-9]$/)){
var TCvalue = FCT2Frm(document.nasExchg.elements[elName].value);
	if (isNaN(TCvalue)){
showMsg(TCvalue + gmsg[0]);
// skip
document.nasExchg.elements[elName].value = BkValue[ElementID];return false;
//showMsg(elName + " : " + document.nasExchg.elements[elName].value + " : " + TCvalue);
	}
} else {
//TC値にデフォルトを設定
var TCvalue=0;
}

// 許容値以外の入力は前値で書き戻して処理中断
// fl形式の場合のみ-60まで許容
if ( (elName.match(/^fL[0-9]$|^frameL$/) && InputValue < -60)) {
showMsg(gmsg[1] + document.nasExchg.elements[elName].value + gmsg[2]);
//skip
document.nasExchg.elements[elName].value = BkValue[ElementID];return false;
			}
// z距離の場合はキャメラ距離以上ならば許容
if ( (elName.match(/^zDIST[0-9]$/) && InputValue <= - CAMERA_D)) {
showMsg(gmsg[3]);
//skip
document.nasExchg.elements[elName].value = BkValue[ElementID];return false;
}
// 0より下|非数値を条件付きで排除
	if (! elName.match(/^tC[0-9]$|^frameS[0-9]$/)){
if (isNaN(document.nasExchg.elements[elName].value) || (document.nasExchg.elements[elName].value < 0)) {
document.nasExchg.elements[elName].value = BkValue[ElementID]; return false;
}
	}

//	if () {document.nasExchg.elements[elName].value = BkValue[ElementID]; return false;} 
//現在の親変数の値をバックアップ 演算モードによって更新する親変数が異なる
//フォームから読み取った値で親変数を更新

	switch (elName) {
case "fRATE" :
		BackupValue = FRATE;
		FRATE = document.nasExchg.elements[elName].value;
	break;
case "dpI" :
		BackupValue = RESOLUTION;
	RESOLUTION = document.nasExchg.elements[elName].value / 2.540;
	break;
case "dpC" :
		BackupValue = RESOLUTION;
	RESOLUTION = document.nasExchg.elements[elName].value;
	break;
case "compA" :
		BackupValue =  COMP_A;
	COMP_A = document.nasExchg.elements[elName].value;
	break;
case "compX" :
		BackupValue =  COMP_W;
	COMP_W = document.nasExchg.elements[elName].value;
	break;
case "compY" :
		BackupValue =  COMP_H;
	COMP_H = document.nasExchg.elements[elName].value;
	break;
case "focusD" :
		BackupValue =  FOCUS_D;
	FOCUS_D = document.nasExchg.elements[elName].value;
	break;
case "filmX" :
		BackupValue =  FILM_W;
	FILM_W = document.nasExchg.elements[elName].value;
	break;
case "filmY" :
		BackupValue =  FILM_H;
	FILM_H = document.nasExchg.elements[elName].value;
	break;
case "lengtH" :
		BackupValue =  LENGTH;
	LENGTH = document.nasExchg.elements[elName].value;
	break;
case "frameL" :
		BackupValue =  FRAME_L;
	FRAME_L = 1*document.nasExchg.elements[elName].value;
	break;
case "frameR" :
		BackupValue =  FRAME_L;
	FRAME_L = fr2fl(1*document.nasExchg.elements[elName].value);
	break;
//case "" :
//		BackupValue =  ;
//	 = document.nasExchg.elements[elName].value;
//	break;
case "tC1":
case "tC2":
case "tC3":
case "frameS1":
case "frameS2":
case "frameS3":
	var kcA = "kTime";
	var kiD = elName.charAt(elName.length - 1)*1 - 1;
		BackupValue =  kld[kiD][0];
	kld[kiD][0] = FCT2ms(TCvalue);
/*	
//
//showMsg( kldFill + " : " +kiD + " : " + minTime + " : "  + maxTime);
*/
//showMsg("tC" + kiD + " : " + TCvalue  + " : " + kld[kiD][0] );
	break;
case "lengtH1":
case "lengtH2":
case "lengtH3":
	var kcA = "kSize";
	var kiD = elName.charAt(elName.length - 1)*1 - 1;
if (BtStatus[0] == "link") {
		BackupValue =  kld[kiD][1];
	kld[kiD][1] = document.nasExchg.elements[elName].value;
} else {
	if (isNaN(kld[kiD][2])) {
document.nasExchg.elements[elName].value = BkValue[ElementID];return false;
	} else {
	BackupValue =  LENGTH;
	LENGTH = document.nasExchg.elements[elName].value / kld[kiD][2];
	}
}
//showMsg("LENGTH" + kiD + " : " + kld[kiD][1] );
	break;
case "scalE1":
case "scalE2":
case "scalE3":
	var kcA = "kScale";
	var kiD = elName.charAt(elName.length - 1)*1 - 1;
if (BtStatus[1] == "link") {
		BackupValue =  kld[kiD][2];
	kld[kiD][2] = document.nasExchg.elements[elName].value / 100;
} else {
	if (isNaN(kld[kiD][1])) {
document.nasExchg.elements[elName].value = BkValue[ElementID];return false;
	} else {
	BackupValue =  LENGTH;
	kld[kiD][2] = document.nasExchg.elements[elName].value / 100;
	LENGTH = kld[kiD][1] / (document.nasExchg.elements[elName].value / 100);
	}
}
//showMsg("SCALE" + kiD + " : " + kld[kiD][2] );
	break;
case "zDIST1":
case "zDIST2":
case "zDIST3":
	var kcA = "kScale";
	var kiD = elName.charAt(elName.length - 1)*1 - 1;
if (BtStatus[1] == "link") {
		BackupValue =  kld[kiD][2];
	kld[kiD][2] = dt2sc(document.nasExchg.elements[elName].value);
} else {
	if (isNaN(kld[kiD][1])) {
document.nasExchg.elements[elName].value = BkValue[ElementID];return false;
	} else {
	BackupValue =  LENGTH;
	kld[kiD][2] = dt2sc(document.nasExchg.elements[elName].value);
	LENGTH = kld[kiD][1] / dt2sc(document.nasExchg.elements[elName].value);
	}
}
//		BackupValue =  kld[kiD][2];
//	kld[kiD][2] = dt2sc(document.nasExchg.elements[elName].value);
//showMsg("DIST" + kiD + " : " + kld[kiD][2] + ":" + COMP_D + ":" + CAMERA_D );
	break;
case "fL1":
case "fL2":
case "fL3":
	var kcA = "kFrameL";
	var kiD = elName.charAt(elName.length - 1)*1 - 1;
if (BtStatus[2] == "link") {
		BackupValue =  kld[kiD][3];
	kld[kiD][3] = 1 * document.nasExchg.elements[elName].value;
} else {
	if (isNaN(kld[kiD][1])) {
document.nasExchg.elements[elName].value = BkValue[ElementID];return false;
	} else {
	BackupValue =  FRAME_L;
	FRAME_L = fr2fl(100 * (kld[kiD][2] / (100/fl2fr(InputValue))));
	}
}
//showMsg("FRAME" + kiD + " : " + kld[kiD][3] );//
	break;
case "fR1":
case "fR2":
case "fR3":
	var kcA = "kFrameL";
	var kiD = elName.charAt(elName.length - 1)*1 - 1;
if (BtStatus[2] == "link") {
		BackupValue =  kld[kiD][3];
	kld[kiD][3] = fr2fl(document.nasExchg.elements[elName].value);
} else {
	if (isNaN(kld[kiD][1])) {
document.nasExchg.elements[elName].value = BkValue[ElementID];return false;
	} else {
	BackupValue =  FRAME_L;
	FRAME_L = fr2fl(100 * (kld[kiD][2] / (100 / InputValue)));
	}
}
//showMsg("FRAME" + kiD + " : " + kld[kiD][3] );
	break;

default :
		BackupValue = "unknown";

	}
//ロック/リンク状態にしたがって影響を受ける他の変数を更新して
//表示の更新
//( = カテゴリで分岐)

	switch (ElementCategory[ElementID]) {
case	"RATE" :
		updateRATE();
			for (id=0;id<3;id ++){if (! isNaN(kld[(id)][0])) {updatekeyTime(id)}}
	break;
case	"RESOLUTION" :
		updateRESOLUTION();
	break;
case	"CompSize" :
	COMP_D = Math.sqrt(Math.pow(COMP_W * COMP_A,2)+Math.pow(COMP_H,2));
	CAMERA_D = (COMP_D * FOCUS_D)/ IMAGE_CR;
			for (id=0;id<3;id ++){
				updatekeyScale(id);
			}
	break;
case	"Lens" :
	IMAGE_CR = Math.sqrt(Math.pow(FILM_W,2)+ Math.pow(FILM_H,2));
	CAMERA_D = (COMP_D * FOCUS_D)/ IMAGE_CR;
			for (id=0;id<3;id ++){
				updatekeyScale(id);
			}
	break;
case	"BaseValue" :
	FRAMEl = FRAME_L ;
	FRAMEr = fl2fr(FRAME_L) ;
			for (id=0;id<3;id ++){
				kld[id][1]=kld[id][2] * LENGTH ;
				updatekeySize(id);
				kld[id][3]=sc2fl(kld[id][2]);
				updatekeyFrameL(id);
			}
		updateFRAME_L();
//ちぃと保留
	break;
case	"kld" :
// 入力値が飛ばされた場合バックアップデータ復帰
//showMsg(kiD +"/" + kldFill +"  "+ kcA +"  "+ BackupValue );
// || isNaN(document.nasExchg.elements[elName].value)
	if (kiD > kldFill ){
switch (kcA) {
case "kTime" :
	kld[kiD][0] = BackupValue;
	updatekeyTime(kiD);
break;
case "kSize" :
	kld[kiD][1] = BackupValue;
	updatekeySize(kiD);
break;
case "kScale" :
	kld[kiD][2] = BackupValue;
	updatekeyScale(kiD);
break;
case "kFrameL" :
	kld[kiD][3] = BackupValue;
	updatekeyFrameL(kiD);
break;
}
return;
	} else {
//それ以外はキーデータを更新
if (kldFill < (kiD+1)) {kldFill = kiD +1;}
	}
//キーの値変更があった場合
if (kiD >= 1){
	var minTime = kld[(kiD - 1)][0];
} else {
	var minTime = 0;
}
if (kiD == (kld.length -1)) {
	var maxTime = 60000;
} else {
	if (isNaN(kld[(kiD +1)][0])){
	var maxTime = 60000;
	}else {
	var maxTime = kld[(kiD + 1)][0];
	}
}


var Ktime = kld[kiD][0];
var Ksize = kld[kiD][1];
var Kscale = kld[kiD][2];
var KframeL = kld[kiD][3];

	switch (kcA) {
case "kTime":
//時間キーは単独で変更
	if (kld[kiD][0] < minTime || kld[kiD][0] >= maxTime){
	kld[kiD][0] = BackupValue;
	updatekeyTime(kiD);
	return;
	}
//	updatekeyTime(kiD);
//キーデータが新規ならサイズにデフォルトを入れてkcAを更新?
break;
case "kSize":
//サイズ変更
	if (BtStatus[0] == "link") {
	Kscale = Ksize / LENGTH;
	KframeL= sc2fl(Kscale);
//		kld[kiD][1] = Ksize;
		kld[kiD][2] = Kscale;
		kld[kiD][3] = KframeL;
	} else {
	for (idx = 0;idx < kld.length;idx ++){
		if (! isNaN(kld[idx][2])){
			kld[idx][1] = kld[idx][2] * LENGTH;
			updatekeySize(idx);
		}
	}
	document.nasExchg.lengtH.value = LENGTH;
	updateBk();return false;
	}

break;
case "kScale":
//スケール変更
	if (BtStatus[1] == "link") {
	Ksize = LENGTH * Kscale;
	KframeL = sc2fl(Kscale);
		kld[kiD][1] = Ksize;
//		kld[kiD][2] = Kscale;
		kld[kiD][3] = KframeL;
	} else {
	for (idx = 0;idx < kld.length;idx ++){
		if (! isNaN(kld[idx][1])){
			kld[idx][2] = kld[idx][1] / LENGTH;
			updatekeyScale(idx);
		}
	}
	document.nasExchg.lengtH.value = LENGTH;
	FRAMEr=100*(LENGTH/kld[kiD][1]);
	FRAMEl=fr2fl(FRAMEr);
	FRAME_L = FRAMEl;
	document.nasExchg.frameR.value = FRAMEr;
	document.nasExchg.frameL.value = FRAMEl;
	for (idx = 0;idx < kld.length;idx ++){
		if (! isNaN(kld[idx][2])){
			kld[idx][3] = sc2fl(1/kld[idx][2]);
			updatekeyFrameL(idx);
		}
	}
	updateBk();return false;
//showMsg(BtStatus[1]);
	}
break;
case "kFrameL":
//フレーム変更
	if (BtStatus[2] == "link") {
	Kscale = fl2sc(KframeL) ;
	Ksize = LENGTH * Kscale;
		kld[kiD][1] = Ksize;
		kld[kiD][2] = Kscale;
//		kld[kiD][3] = KflameL;
	} else {
	for (idx = 0;idx < kld.length;idx ++){
		if (! isNaN(kld[idx][1])){
			kld[idx][3] = sc2fl(kld[idx][2]);
			updatekeyFrameL(idx);
		}
	}
	FRAMEr=fl2fr(FRAME_L);
	FRAMEl=FRAME_L;
		updateFRAME_L();
	updateBk();return false;
//showMsg(BtStatus[2]);
	}
break;
default:
	}
// 
	if (kcA == "kTime") {
		updatekeyTime(kiD);
		if (isNaN(Kscale)) {
	Kscale = 1;
	Ksize = LENGTH * Kscale ;
	KframeL = sc2fl(Kscale);
		kld[kiD][1] = Ksize;
		kld[kiD][2] = Kscale;
		kld[kiD][3] = KframeL;
			updatekeySize(kiD);
			updatekeyScale(kiD);
			updatekeyFrameL(kiD);
		}
	} else {
		updatekeySize(kiD);
		updatekeyScale(kiD);
		updatekeyFrameL(kiD);
		if (Ktime == "--") {
	if (kiD == 0) {
	Ktime = 0; 
	} else {
	Ktime = 1000 + minTime;
	}
		kld[kiD][0] = Ktime;
			updatekeyTime(kiD);
		}
	}
	break;

default :
	msg = msg + "\nDEFAULT!"

	}
//
		updateBk();return false;
}
//デバッグ用変数表示
function VarList() {
msg = "フレームレート :" + FRATE + " fps"
	+ "\nインチあたり : " + Dpi + " dpi"
	+ "\nセンチあたり : " + Dpc + " dpc"
	+ "\nコンポサイズ(WxH,A) : "
	+ COMP_W + " x " + COMP_H + " , "+ COMP_A
	+ "\n焦点距離(mm) :" + FOCUS_D + " mm"
	+ "\nフィルム(WxH,A) : "
	 + FILM_W + "mm x " + FILM_H + "mm"
	+ "\n==========================="
	+ "\n基準寸法(mm) : " + LENGTH + " mm"
	+ "\n基準フレーム(f) : " + FRAME_L + " fL"
	+ "\n基準フレーム(レタス) : " + fl2fr(FRAME_L) + " fR"
	+ "\n==========================="
	+ "\nAE-Keyframe options"
	+ "\nAE-Ver. : " + AE_Ver
	+ "\nKeyType : " + KEY_TYPE
	+ "\nsource Aspect,Width x Height: " 
	+ "\n" + SRC_A + " , "+ SRC_W + " x " +SRC_H
	+ "\n key data: " + kldFill +"\n"  ;
	for (idx=0;idx<3;idx ++){
	msg = msg + kld[idx] +"\n";
//	msg = msg + cld[idx] +"\n";
	}

document.nasExchg.RESULTBOX.value=msg;
//document.nasExchg.elements[33].checked = true;
}
//
function initSHEET() {
//データ配列にしたがって入力ボックスの更新 表示は有効桁数固定
with (document.nasExchg){
	fRATE.value = FRATE ;
		dpI.value = Math.round(Dpi * 10000)/10000 ;
		dpC.value = Math.round(Dpc * 10000)/10000 ;

	compA.value = COMP_A;
	compX.value = COMP_W;
	compY.value = COMP_H;

	focusD.value = FOCUS_D;
		filmX.value = FILM_W;
		filmY.value = FILM_H;
// キー情報関連
	KEYoffset=13;
	for (idX=KEYoffset-3 ; idX < KEYoffset; idX ++) {
		elements[idX].value = BkValue[idX];
	}
	initkld();
// AE-Key 関連
		var AEoffset = 49;
		switch (AE_Ver) {
		case "4.0" :	elements[AEoffset+0].checked = true;break;
		case "5.0" :	elements[AEoffset+1].checked = true;break;
		case "6.0" :	elements[AEoffset+2].checked = true;break;
		}
		srcAspect.value = SRC_A;
		srcWidth.value = SRC_W;
		srcHeight.value = SRC_H;
		switch (KEY_TYPE) {
		case "Scale" :	elements[AEoffset+6].checked = true;break;
		case "Position" :	elements[AEoffset+7].checked = true;break;
		default :	elements[AEoffset+6].checked = true;
		}
/*

*/
		RESULTBOX.value = "";
}
//showMsg(document.nasExchg.ae_ver.value);
updateBk();

//ボタン状態配列にしたがってボタンの再描画
for (n = 0;n < BtStatus.length ;n++) {ChgButtonImage(n)}


}
//
function CKBT(n) {
// ボタンクリックされたのでステータスを調整
	switch (BtStatus[n]) {
case	 "lock":	BtStatus[n] = "unlock";break;
case	"unlock":	BtStatus[n] = "lock";break;
case	 "link":	BtStatus[n] = "unlink";break;
case	"unlink":	BtStatus[n] = "link";break;
default	:	return false;
}

// 選択されたボタンイメージを変更
ChgButtonImage(n);

return false;
}

// ボタンステータスを文字列で返す
function ButtonStatus(btnm) {
	for (btID=0 ; btID < BtCategory.length; btID++) {
		if (btnm == BtCategory[btID]) {
			return BtStatus[btID] ;
			break;
		}
	}
return false;
}
//	ボタン状態の変更
function ChgButton(btnm,stts) {
	for (btID=0 ; btID < BtCategory.length; btID++) {
		if (btnm == BtCategory[btID]) {
			BtStatus[btID] = stts;
			ChgButtonImage(btID);
			break;
		}
	}
return 
}
//	ボタンイメージ置き換え
function ChgButtonImage(btID) {
//ボタンIDを指定する
	switch (BtStatus[btID]) {
case	 "lock":	btIMG = "./images/controls/lock.gif";Status = true ;break;
case	"unlock":	btIMG = "./images/controls/unlock.gif";Status = false ;break;
case	"link":	btIMG = "./images/controls/link.gif";Status = true ;break;
case	"unlink":	btIMG = "./images/controls/unlink.gif";Status = false ;break;
default : return false;
}
	switch (BtCategory[btID]) {
case "size" :
	break;
case "scale" :
	break;
case "frameL" :
	break;
case "sample" :
	break;
default :
	}

	document.images[btID].src = btIMG ;
}
//演算・再表示ルーチン
function updateRATE () {
	document.nasExchg.fRATE.value = FRATE;
}
//
function updateRESOLUTION() {
//
	Dpi = RESOLUTION * 2.54 ;
	Dpc = RESOLUTION ;
//
with (document.nasExchg) {
	dpI.value = Math.round(Dpi * 10000)/10000;
	dpC.value = Math.round(Dpc * 10000)/10000;
}
}
//
function updateFRAME_L() {
//
//
with (document.nasExchg) {
	frameL.value = Math.floor(FRAMEl);
	frameR.value = Math.floor(FRAMEr);
	}
}
//
function updatekeyTime (kiD){
	var kidx = kiD + 1;
//showMsg(kiD +":"+kld[kiD]+ ":\n" );
if (isNaN(kld[kiD][0])) {
	var TimeCode0 = "--";
	var TimeCode1 = "--";
} else {
	var TimeCode0 = ms2FCT(kld[kiD][0],0,1);
	var TimeCode1 = ms2FCT(kld[kiD][0],3,0);
}

with (document.nasExchg) {
	elements[ "frameS" + kidx ].value = TimeCode0 ;
	elements[ "tC" + kidx ].value = TimeCode1 ;
	}
}
function updatekeySize (kiD){
if(isNaN(kld[kiD][1])){
	var keySize = "--";
} else {
	var keySize = Math.floor(kld[kiD][1] * 100)/100;
}
	var kidx = kiD + 1;
//showMsg(kiD +":"+kld[kiD]+ ":\n" );
with (document.nasExchg) {
	elements[ "lengtH" + kidx ].value = keySize;
	}
}
function updatekeyScale (kiD){
if(isNaN(kld[kiD][2])){
	var keyScale = "--";
	var keyDist = "--";
} else {
	var keyScale = Math.floor(kld[kiD][2] * 10000)/100;
	var keyDist = Math.floor(sc2dt(kld[kiD][2])*100)/100;
}
	var kidx = kiD + 1;
//showMsg(kiD +":"+kld[kiD]+ ":\n" );
with (document.nasExchg) {
	elements[ "scalE" + kidx ].value = keyScale;
	elements[ "zDIST" + kidx ].value = keyDist;
	}
}
function updatekeyFrameL(kiD){
//showMsg(kiD +":"+kld[kiD]+ ":\n" );
if(isNaN(kld[kiD][3])){
	var keyfL = "--";
	var keyfR = "--";
} else {
	var keyfL = Math.round(kld[kiD][3]);
	var keyfR = Math.round(fl2fr(kld[kiD][3]));
}
	var kidx = kiD + 1;
with (document.nasExchg) {
	elements[ "fL" + kidx ].value = keyfL;
	elements[ "fR" + kidx ].value = keyfR;
	}
}


//
function updateKey() {
//
//
	with (document.nasExchg) {
	}
}
//
/*	表示データ配列作成
配列名は cld
配列は [時間,サイズ,スケール,画郭,メモ,データ種別]
	前置フラグがあれば前置区間をまず作成
第一区間の開始点と終了点から前置区間の序変数範囲を求める
	バカめ!序変数範囲は-1〜0に決まっとる!
すいません
第一区間の開始点と終了点から前置区間の時間範囲を求める
開始時間は、t1 - (t2 -t1) = 2*t1 -t2 なので
計算すべきポイントの総数は区間長をサンプリング時間で割った数
サンプリング時間はフレーム継続時間に(フレームスキップ数+1) を掛けたもの。
	サンプリング時間=(1000/FRATE) * (document.nasExchg.frameSkip +1)ms
前置区間は開始時間からのオフセットでなく終了時間からのオフセットなので注意
上の式で得られる開始時間はサンプリング点と一致するとはかぎらない。
ただしインデックスの数としてはつかえるので無視して計算する。
思ったが、ここで求めるべきインデックスの数は要するに第一区間のインデックス数と一致なので計算やめて第一区間のインデックス数を求める。
	区間継続時間=kld[後区間][0]-kld[現区間][0]
*/
function kac_cld(){

//	var start_T = 2*kld[0][0] - kld[1][0];
//リザルト配列の初期化
	cld = new Array;
	var cld_count=0;//
//時間単位
	var sliceTime = (1000/FRATE) * (1 * document.nasExchg.frameSkip.value + 1);
//区間インデックス数初期化
	var lengthS=Math.floor((kld[1][0]-kld[0][0])/sliceTime);

//showMsg("Find key DATA :" + sliceTime + " : " + lengthS +" : "+ document.nasExchg.prekey.value);
//前方挿入区間
if (document.nasExchg.prekey.checked==true) {
	for (idcx = 0;idcx < lengthS; idcx ++ ) {
		c_time	=kld[0][0]-(lengthS-idcx)*sliceTime;//ラベルタイム
		cld_T	=-(kld[0][0]-c_time)/(kld[1][0]-kld[0][0]) ;//助変数
		c_scale	=kac(kld[0][2],kld[1][2],cld_T);
if(isNaN(c_scale)){
		c_scale	="--";
		c_size	= "--";
		c_frameL	="--";
		c_memo	="カメラ位置を越えました";
}else{
		c_size	= Math.floor(100 * c_scale * LENGTH)/100;
		c_frameL	=sc2fl(c_scale);
//		c_memo	="idcx: " + idcx + "/  T: " + cld_T;
		c_memo	="";
}
		c_class	="pre";
	cld[idcx]=[c_time,c_size,c_scale,c_frameL,c_memo,c_class];
	}
}
for (kld_count=0;kld_count<(kldFill-1);kld_count ++) {
cld_count = cld.length;
lengthS = Math.floor((kld[kld_count+1][0]-kld[kld_count][0])/sliceTime)
//第一区間
	for (idcx = 0;idcx < lengthS; idcx ++ ) {
		c_time	=kld[kld_count][0]+(idcx*sliceTime);//ラベルタイム
		cld_T	=(c_time-kld[kld_count][0])/(kld[kld_count+1][0]-kld[kld_count][0]) ;//助変数
//		c_size	=kac(kld[kld_count][1],kld[kld_count+1][1],cld_T);
		c_scale	=kac(kld[kld_count][2],kld[kld_count+1][2],cld_T);
		c_size	= Math.floor(100 * c_scale * LENGTH)/100;
		c_frameL	=sc2fl(c_scale);
//		c_memo	="idcx: " + idcx + "/  T: " + cld_T;
		c_memo	="";
	if (idcx==0)	{c_class="keyframe"}else{c_class="data"}

	cld[idcx+cld_count]=[c_time,c_size,c_scale,c_frameL,c_memo,c_class];
	}
}

//後方挿入区間
cld_count = cld.length;
if (document.nasExchg.postkey.checked==true) {
	for (idcx = 0;idcx <= lengthS; idcx ++ ) {
		c_time	=kld[kld_count][0]+((idcx)*sliceTime);//ラベルタイム
		cld_T	=1+(c_time-kld[kld_count][0])/(kld[kld_count][0]-kld[kld_count-1][0]) ;//助変数
		c_scale	=kac(kld[kld_count-1][2],kld[kld_count][2],cld_T);
if(isNaN(c_scale)){
		c_scale	="--";
		c_size	= "--";
		c_frameL	="--";
		c_memo	="カメラ位置を越えました";
}else{
		c_size	= Math.floor(100 * c_scale * LENGTH)/100;
		c_frameL	=sc2fl(c_scale);
}
if (idcx==lengthS)	{c_memo	=c_memo+" END"}else{c_memo=c_memo}
	if (idcx==0)	{c_class="keyframe"}else{c_class="post"}

	cld[idcx+cld_count]=[c_time,c_size,c_scale,c_frameL,c_memo,c_class];
	}
} else {
cld[cld.length]=[kld[kld_count][0],Math.floor(100*kld[kld_count][1])/100,kld[kld_count][2],kld[kld_count][3],"END","keyframe"];
}

}

//
function updateTABLE() {
//処理が可能かどうかを判定
//キーフレームデータが1つ以上必要
//キーが無い場合は処理そのものを中止して復帰

if (kldFill < 1) {
document.nasExchg.RESULTBOX.value = lmsg[0] + "\n";return false;}

var Now = new Date;
var output_body=""


if (document.nasExchg.csvck.checked==true){
//	CSV data output
if (document.nasExchg.tabck.checked==true){var SPT=","}else{var SPT="";}

output_body="<html>"
+"\n<head>"
+"\n<title>"
+"\n	kac output"
+"\n</title>"
+ "<meta http-equiv='Content-Type' content='text/html; charset=euc-jp'>"
+"\n</head>"
+"\n<body>"
+"\n<!-- kac output -->"
+"<table border=1><tr><td colspan=8>"
+ document.nasExchg.titleStr.value
+ "</td></tr>\n<tr><td colspan=8>"
+ document.nasExchg.RESULTBOX.value
+ "</td></tr>\n<tr><td colspan=3>"
+"BASE-LENGTH"+SPT+SPT+SPT
+ "</td><td>"
+ LENGTH+SPT
+ "</td><td>"
+"100 %"+SPT
+ "</td><td>"
+ FRAME_L+SPT
+ "</td><td>"
+ fl2fr(FRAME_L)+SPT
+ "</td></tr>";

for (idx = 0 ; idx < kldFill ; idx ++){
		if (! isNaN(kld[idx][1])) {
	switch (idx.toString(10)) {
case "0" :
	LineName = "Start";
	break;
case "1" :
	if (kldFill == 2){LineName="End"}else{LineName = "Transit"};
	break;
case "2" :
	LineName="End";
	break;
default:
	LineName = "Default"
		}

output_body = output_body
+"<tr><td colspan=3>"
+	LineName+SPT+SPT+SPT
+ "</td><td>"
+	Math.round(kld[idx][1]*100)/100+SPT
+ "</td><td>"
+	Math.floor(kld[idx][2] * 10000)/100+"%"+SPT
+ "</td><td>"
+	Math.round(kld[idx][3]*100)/100+SPT
+ "</td><td>"
+	Math.round(fl2fr(kld[idx][3])*100)/100+SPT
+ "</td></tr>";
		}
}

//キーデータが二つ以上の場合は、中間値を算出する。
//それ以外はここで打ち切り
if (kldFill < 2) {
//データに余白のみを挿入
showMsg(lmsg[1]);

output_body = output_body +"<tr><td>" + lmsg[2] + "</td></tr>>\n";
} else {
//キーデータがあるので計算して表示
// 配列 cld を生成(初期化してデータを計算)
kac_cld();

output_body = output_body
+"<tr><th>id"
 + SPT + "</th><th>frame"
 + SPT + "</th><th>tc"
 + SPT + "</th><th>size"
 + SPT + "</th><th>scale"
 + SPT + "</th><th>F"
 + SPT + "</th><th>F(retas)"
 + SPT + "</th><th>memo"
 + SPT + "</th></tr>";
// データ展開
for (c_line=0;c_line < cld.length ;c_line ++){
output_body = output_body
+ "<tr><td>"
+ c_line+SPT
+ "</td><td>"
+	ms2fr(cld[c_line][0]+(500/FRATE))+SPT
+ "</td><td>"
+	ms2FCT(cld[c_line][0]+(500/FRATE),3,0)+SPT
+ "</td><td>";

if (isNaN(cld[c_line][1])){
output_body = output_body
+	"--"
+ "</td><td>"
+	"--"
+ "</td><td>"
+	"--"
+ "</td><td>"
+	"--"
+ "</td><td>"
+	cld[c_line][4]
+ "</td></tr>";
}else{
output_body = output_body
+	cld[c_line][1]+SPT
+ "</td><td>"
+	Math.floor(cld[c_line][2]*10000)/100+"%"+SPT
+ "</td><td>"
+	Math.floor(cld[c_line][3])+SPT
+ "</td><td>"
+	Math.floor(fl2fr(cld[c_line][3]))+SPT
+ "</td><td>"
+	cld[c_line][4]
+ "</td></tr>";
}

}}
//表示を閉じる

output_body = output_body
+"\n</table>"
+"\n</body>"
+"\n</html>";

	}else{

//	TABLE data output
var output_body="<html>"
+"\n<head>"
+"\n<title>"
+"\n	kac output"
+"\n</title>"
+ "<meta http-equiv='Content-Type' content='text/html; charset=euc-jp'>"
+"\n</head>"
+"\n<body>"
+"\n<!-- kac output -->"
+"\n<input type=text size=32 style='border-style:none;font-size:large;font-style:bold' value='"
+ document.nasExchg.titleStr.value
+"'>"
+"\n<hr>"
+"\n<textarea rows=5 cols=48>"
+ document.nasExchg.RESULTBOX.value
+"\n</textarea>"
+"\n<table border=0>"
+"\n<hr>"
+"\n"
+"\n<tr>"
+"\n	<th>"
+"\n		BASE-LENGTH /"
+"\n	</th>"
+"\n	<td nowrap align=right>"
+ LENGTH
+" mm\n	</td>"
+"\n	<td nowrap>"
+ "\n		100 %"
+"\n	</td>"
+"\n	<td nowrap>\n"
+ FRAME_L
+ "( "
+ fl2fr(FRAME_L)
+ " ) F"
+"\n	</td>"
+"\n</tr>";

for (idx = 0 ; idx < kldFill ; idx ++){
		if (! isNaN(kld[idx][1])) {
	switch (idx.toString(10)) { 
case "0" :
	LineName = "Start";
	break;
case "1" :
	if (kldFill == 2){LineName="End"}else{LineName = "Transit"};
	break;
case "2" :
	LineName="End";
	break;
default:
	LineName = "Default"
		}
output_body = output_body
+"\n<tr>"
+"\n	<th>\n"
+	LineName
+" /\n	</th>"
+"\n	<td nowrap align=right>"
+	Math.round(kld[idx][1]*100)/100
+" mm\n	</td>"
+"\n	<td nowrap style='text-align:right'>"
+ "\n"	
+	Math.floor(kld[idx][2] * 10000)/100
+" %"
+"\n	</td>"
+"\n	<td nowrap>\n"
+	Math.round(kld[idx][3]*100)/100
+ "( "
+	Math.round(fl2fr(kld[idx][3])*100)/100
+ " ) F"
+"\n	</td>"
+"\n</tr>";
		}
}
//キーデータが二つ以上の場合は、中間値を算出する。
//それ以外はここで打ち切り
if (kldFill < 2) {
//テーブルに余白のみを挿入
showMsg(lmsg[1]);

output_body = output_body
+"\n"
+"\n<tr><td></td></tr>"
+"\n<tr><td></td></tr>"
+"\n<tr><td></td></tr>"
+"\n<tr><td></td></tr>"
+"\n<tr><td></td></tr>"
+"\n<tr><td></td></tr>";


} else {
//キーデータがあるので計算して表示
// 配列 cld を生成(初期化してデータを計算)
kac_cld();

output_body = output_body
+"\n"
+"\n</table>"
+"\n<hr>"
+"\n<table border=0 cellspacing=5 >"
+"\n"
+"\n<tr>"
+"\n	<th>"
+"\n		id"
+"\n	</th>"
+"\n	<th>"
+"\n		frame"
+"\n	</th>"
+"\n	<th>"
+"\n		tc"
+"\n	</th>"
+"\n	<th>"
+"\n		size"
+"\n	</th>"
+"\n	<th>"
+"\n		scale"
+"\n	</th>"
+"\n	<th>"
+"\n		F(Retas!)"
+"\n	</th>"
+"\n	<th>"
+"\n		Memo."
+"\n	</th>"
+"\n</tr>"
+"\n<tr><td COLSPAN=7><hr></td></tr>";

// データ展開



for (c_line=0;c_line < cld.length ;c_line ++){

switch (cld[c_line][5]) {
case "keyframe":	LineColor ="red";break;
case "pre":
case "post":	LineColor ="blue";break;
default:	LineColor ="black";
}


output_body = output_body
+"\n<tr style='text-decoration:underline;color:"
	+ LineColor
+ "' >"
+"\n	<th>"
+"\n		"
	+ c_line
+"\n	</th>"
+"\n	<th>"
+"\n		"
+	Zf(ms2fr(cld[c_line][0]+(500/FRATE)),3)
+"\n	</th>"
+"\n	<td nowrap>"
+"\n		"
+	ms2FCT(cld[c_line][0]+(500/FRATE),3,0)
+"\n	</td>"
+"\n	<td nowrap style='text-align:right'>"
+"\n		";

	if (isNaN(cld[c_line][1])){
output_body = output_body
+	"--"
+" mm"
+"\n	</td>"
+"\n	<td nowrap style='text-align:right'>"
+"\n		"
+	"--"
+" %"
+"\n	</td>"
+"\n	<td nowrap style='text-align:right'>"
+"\n		"
+	"--"
+" ( "
+	"--"
+" ) F"
+"\n	</td>"
+"\n	<td nowrap><input type=text size=32 style='border-style:none' value='"
+	cld[c_line][4]
+"'></td>"
+"\n</tr>";
	}else{

output_body = output_body
+	cld[c_line][1]
+" mm"
+"\n	</td>"
+"\n	<td nowrap style='text-align:right'>"
+"\n		"
+	Math.floor(cld[c_line][2]*10000)/100
+" %"
+"\n	</td>"
+"\n	<td nowrap style='text-align:right'>"
+"\n		"
+	Math.floor(cld[c_line][3])
+" ( "
+	Math.floor(fl2fr(cld[c_line][3]))
+" ) F"
+"\n	</td>"
+"\n	<td nowrap><input type=text size=32 style='border-style:none' value='"
+	cld[c_line][4]
+"'></td>"
+"\n</tr>";
	}
}
}
//テーブルを閉じる
output_body = output_body
+"\n<tr><td COLSPAN=7><hr></td></tr>"
+"\n"
+"\n</table>"
+"\n"
+"\n<div align=right>"
+ Now.toDateString()
+ "/ kacJS ver1.0 / Nekomataya / 2004<hr>"
+"\n</div>"
+"\n</body>"
+"\n</html>";
	}

//ウィンドウを開く
outPutWindow = window.open("","kakudai","toolbar=no,location=no,directories=no,status=no,menubar=yes,resizable=yes,scrollbars=yes,width=512,height=512");
	with (outPutWindow.document) {
open();
write(output_body);
close();
	}
outPutWindow.focus();
}
//
function updateAEKey() {
//AE- Keydata output
var AE_KeyData;
//header
AE_KeyData = "Adobe After Effects " + AE_Ver + " Keyframe Data\n\n"
+ "\tUnits Per Second	" + FRATE +"\n"
+ "\tSource Width\t" + SRC_W + "\n"
+ "\tSource Height\t" + SRC_H + "\n"
+ "\tSource Pixel Aspect Ratio\t" + SRC_A + "\n"
+ "\tComp Pixel Aspect Ratio\t" + COMP_A + "\n";
switch (KEY_TYPE) {

case "Scale":
// 計算
	if (isNaN(kld[0][0])) {
document.nasExchg.RESULTBOX.value = lmsg[2] + "\n";return false;
	}else {
kac_cld();

	switch (AE_Ver) {
	case "4.0":

AE_KeyData = AE_KeyData
+ "Scale\n\tFrame\tX percent\tY persent\t\n";

for (idx=0;idx<cld.length;idx ++){
	if (! isNaN(cld[idx][1])){
AE_KeyData = AE_KeyData
+ "\t"
+ Math.floor(FRATE*cld[idx][0]/1000)
+ "\t"
+ cld[idx][2] * 100
+ "\t" 
+ cld[idx][2] * 100
+ "\t\n";
//AE4
	}
}
	break;

	default:

AE_KeyData = AE_KeyData
+ "Scale\n\tFrame\tX percent\tY percent\tZ percent\t\n";

for (idx=0;idx<cld.length;idx ++){
	if(! isNaN(cld[idx][1])){
AE_KeyData = AE_KeyData
+ "\t"
+ Math.floor(FRATE*cld[idx][0]/1000)
+ "\t"
+ cld[idx][2] * 100
+ "\t" 
+ cld[idx][2] * 100
+ "\t" 
+ cld[idx][2] * 100
+ "\t\n";
	}
}
//AE5~6
}
	}

break;
case "Position":
	if (isNaN(kld[0][0])) {
document.nasExchg.RESULTBOX.value = lmsg[2] + "\n";return false;
	}else {

	switch (AE_Ver) {
	case "4.0":
document.nasExchg.RESULTBOX.value = lmsg[3] + "\n";return false;
//AE4
	break;
	default:
		AE_KeyData = AE_KeyData
+ "Position\n\tFrame\tX pixels\tY pixels\tZ pixels\t\n";

for (idx=0;idx<kld.length;idx ++){
	if (! isNaN(kld[idx][0])) {
AE_KeyData = AE_KeyData
+ "\t"
+ Math.floor(FRATE*kld[idx][0]/1000)
+ "\t"
+ COMP_W / 2
+ "\t" 
+ COMP_H / 2
+ "\t" 
+ sc2dt(kld[idx][2])
+ "\t\n";
	}
}
//AE5~6
}
	}
break;


}
//
AE_KeyData = AE_KeyData + "\n\nEnd of Keyframe Data\n";
document.nasExchg.RESULTBOX.value = AE_KeyData;

//
//
}
//function update() {
//
//
//}
//function update() {
//
//
//}

