/*
	====================================
		共通JavaScript関数 ver1.15より標準実装化
	====================================
*/

/*
 * RSSを読み込み出力するAjax
 * http://allabout.co.jp/internet/javascript/closeup/CU20050531A/index.htm
 * で紹介されているプログラムをほぼそのまま参照
 * @param url 読み込みアドレス
 *        ptype 表示タイプ
 *        count 表示件数
 *        leng 表示文字数
 *
 */
function rssReader(url, ptype, count, leng, callcount)
{
	// url変換
	// 最初の文字が.であれば相対パスなので、cgiファイルまでの
	//var fChr = url.substr(0,1);
	//if (fChr == ".") {
	//	var path = document.location.href;
	//	var path2 = path.substring(0,path.lastIndexOf('/',path.length)+1);
	//	url = path2 + url.substr(2,url.length);
	//}

	var xml = new JKL.ParseXML( url );  // JKL.ParseXMLオブジェクトを生成
	var func = function(data)        // 呼び出し先関数を定義する
	{
		//alert(document.location);
	  onloaded1(data, ptype, count, leng, callcount);           //コールバック
	}
	xml.async(func);     	             // 呼び出し先関数を指定する
	xml.parse;                       // ダウンロード～解析～関数呼び出しする
}

//RSSを受信時に起動するコールバック関数
function onloaded1(xml,ptype,count,leng, callcount)
{
	var data = ""
  var flushCount = 0;
	var siteTitle = "";
	var siteLink = "";

	if (ptype == "site") {
		// channelのtitleとlinkをh4あたりで書き出しておきたいね
		siteTitle = xml["rdf:RDF"].channel.title;
		siteLink = xml["rdf:RDF"].channel.link;
		data += "<h4>Site: <a href='"+siteLink+"'>"+siteTitle+"</a></h4>";
		
	}
	//var desc1 = "";
	//rdf:RDF要素以下のitem要素を順番に処理
	data += '<div class="rss"><ul>';
	for(i in xml["rdf:RDF"].item)
	{
		//出力用HTMLを作る
		desc1 = xml["rdf:RDF"].item[i].description;
		if (desc1 != undefined) {
		  if (desc1.length > leng) {
	  		desc1 = desc1.substring(0,leng) + "...";
	  	}
		}
		data += '<li><a href="'+xml["rdf:RDF"].item[i].link+'">'
		data += xml["rdf:RDF"].item[i].title
		data += '</a><br>\n'
		if (desc1 != undefined) { data += desc1; }
		flushCount++;
		if (flushCount >= count) { break; }
	}
	data += '</ul></div>';

	//出力
	document.getElementById('out'+callcount).innerHTML = data
}

/* 検索用 */
function doCsvSearch(fnn, url,midasi) {
    var word = document.forms[fnn].csvkey.value;
		if (word == "") {
			alert("検索キーワードを入力してください。\n全検索を行いたい時は % を入れてください");
			return false;
		}
    document.location.href = url + "&condition="+midasi+" LIKE \"%25"+word+"%25\" "
    return false;
}

/*フォルダ開閉用 */
function exMenu(tName)
{
	tMenu = document.all[tName].style;
	//tMenu = document.getElementById[tName].style;
	if (tMenu.display == 'none') tMenu.display = "block"; else tMenu.display = "none";
	return false;
}

/* =================
チェック関数を呼んでConfirmを出す関数
=============*/
function checkValuesWithConfirm(msg, mode) {
    ret = checkValues(mode);
    //alert("結果:" + ret);
    // エラーがあるならそのまま終了
    if (ret == false) { return false; }
    // Confirm
    if (confirm(msg)) {
        return true;
    }
    return false;
}

/* =================
値チェックルーチン
@return true:成功 false:失敗
=============*/
function checkValues(dispMode) {
    var list1=checkVoid_ctrl;
    var list2=checkVoid_name;
    var list3=checkVoid_type;   
    var errorString = "";
    // 必須チェック
    for (var i=0; i<list1.length; i++){   
        if (list3[i] == "void" && dispMode == "EDIT") {    
            var elementObj = document.getElementsByName(list1[i])(0);
            if(elementObj.value == ""){
                errorString += list2[i] + "は必須項目です\n";
            }
        }
        if (list3[i] == "checkvoid" && dispMode == "EDIT") {    
            var elementObj = document.getElementsByName(list1[i])(0);
            if(elementObj.checked == false){
                errorString += list2[i] + "は必須項目です\n";
            }
        }
        //if (list3[i] == "num" && dispMode == "EDIT") {  
        if (list3[i] == "num") {  
            var inpValue = document.getElementsByName(list1[i])(0).value;   
            if (inpValue.match(/[^0-9]/g)) {
                errorString += list2[i] + "は数値で入力してください\n";
            }
        }
        if (list3[i] == "datevoid" && dispMode == "EDIT") {
             var checkDate = new Date();
            var ctrlY=document.getElementsByName(list1[i]+"_y")(0);
            var ctrlM=document.getElementsByName(list1[i]+"_m")(0);
            var ctrlD=document.getElementsByName(list1[i]+"_d")(0);
            if (ctrlY.value == "" || ctrlM.value == "" || ctrlD.value == "") {
                errorString += list2[i] + "は必須項目です\n";
            }       
        }
        if (list3[i] == "date") {
            var checkDate = new Date();
            var ctrlY=document.getElementsByName(list1[i]+"_y")(0);
            var ctrlM=document.getElementsByName(list1[i]+"_m")(0);
            var ctrlD=document.getElementsByName(list1[i]+"_d")(0);
            if (ctrlY.value == "" && ctrlM.value == "" && ctrlD.value == "") {
                continue;
            }
            
            // 以下、Monthが１つずれてる状態なので注意
            var ctrlYval = ctrlY.value;
            var ctrlMval = parseInt(ctrlM.value,10);
            var ctrlDval = parseInt(ctrlD.value,10);
            
            checkDate.setYear(ctrlYval);
            checkDate.setMonth(ctrlMval - 1);
            checkDate.setDate(ctrlDval);
            
            //checkDate.setFullYear(ctrlYval,ctrlMval,ctrlDval);
            var check1= checkDate.getFullYear();
            var check2= checkDate.getMonth() + 1;
            var check3= checkDate.getDate();
            //errorString += list2[i] + "は日付として正しくありません\n";
            if (ctrlYval != check1 || ctrlMval != check2 || ctrlDval != check3) {
                // デバッグ用
                //errorString += "a1:a2:a3="+ctrlYval+":"+ctrlMval+":"+ctrlDval+"\n";
                //errorString += "c1:c2:c3="+check1+":"+check2+":"+check3+"\n";
            
                errorString += list2[i] + "は日付として正しくありません\n";            
            } 
        }
        if (list3[i] == "daterange" && errorString == "") {
            // このチェックはエラーがないときにしか行わない
            var checkDate1 = new Date();
            var ctrlY1=document.getElementsByName(list1[i]+"_begin_y")(0);
            var ctrlM1=document.getElementsByName(list1[i]+"_begin_m")(0);
            var ctrlD1=document.getElementsByName(list1[i]+"_begin_d")(0);
            if (ctrlY1.value == "" || ctrlM1.value == "" || ctrlD1.value == "") {
                continue;
            }            
            var ctrlYval1 = ctrlY1.value;
            var ctrlMval1 = parseInt(ctrlM1.value,10);
            var ctrlDval1 = parseInt(ctrlD1.value,10);
            checkDate1.setYear(ctrlYval1);
            checkDate1.setMonth(ctrlMval1 - 1);
            checkDate1.setDate(ctrlDval1);
            
            var checkDate2 = new Date();
            var ctrlY2=document.getElementsByName(list1[i]+"_end_y")(0);
            var ctrlM2=document.getElementsByName(list1[i]+"_end_m")(0);
            var ctrlD2=document.getElementsByName(list1[i]+"_end_d")(0);
            if (ctrlY2.value == "" || ctrlM2.value == "" || ctrlD2.value == "") {
                continue;
            }            
            var ctrlYval2 = ctrlY2.value;
            var ctrlMval2 = parseInt(ctrlM2.value,10);
            var ctrlDval2 = parseInt(ctrlD2.value,10);
            checkDate2.setYear(ctrlYval2);
            checkDate2.setMonth(ctrlMval2 - 1);
            checkDate2.setDate(ctrlDval2);
            // 比較
            var subDate = checkDate1.getTime() - checkDate2.getTime();
            if (subDate > 0) {
                 errorString += list2[i] + "の開始日は終了日よりも後にできません。\n";                 
            }            
        }
        if (list3[i] == "time" && dispMode == "EDIT") {
            // 時間チェック。xx:xx形式であるかどうか
            var inpValue = document.getElementsByName(list1[i])(0).value;
            if(inpValue == ""){
                continue;
            }            
            if (inpValue.match(/^[0-2]\d:?[0-5]\d(:?[0-5]\d)?$/)) {
                // OK
            } else {
                errorString += list2[i] + "は時刻形式（hh:mm or hh:mm:ss）で入力してください\n";
            }
        }         
        if (list3[i] == "ipaddr") {
            // IPアドレスチェック。エラーにすることもあれば自動修正することもある
            var inpValue = document.getElementsByName(list1[i])(0).value;
            if(inpValue == ""){
                continue;
            }
            // ピリオドが３つなければエラーにしちゃおう
            if (inpValue.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/)) {
                // OKなのでこれを３桁形式にリフォーマット？
                var ipAddrArray = inpValue.split(".");
                var ip1 = ipAddrArray[0]; var ip1Len = ip1.length;
                var ip2 = ipAddrArray[1]; var ip2Len = ip2.length;
                var ip3 = ipAddrArray[2]; var ip3Len = ip3.length;
                var ip4 = ipAddrArray[3]; var ip4Len = ip4.length;
                //alert("ip1Len:"+ip1Len+" ip2Len:"+ip2Len+ " ip3Len:"+ip3Len+" ip4Len:"+ip4Len)
                if (ip1Len<3) {for (k=0; k<3-ip1Len; k++) { ip1 = "0" + ip1;} }
                if (ip2Len<3) {for (k=0; k<3-ip2Len; k++) { ip2 = "0" + ip2;} }
                if (ip3Len<3) {for (k=0; k<3-ip3Len; k++) { ip3 = "0" + ip3;} }
                if (ip4Len<3) {for (k=0; k<3-ip4Len; k++) { ip4 = "0" + ip4;} }
                document.getElementsByName(list1[i])(0).value = ip1 + "." + ip2 + "." + ip3 + "." + ip4;                
            } else {
                // エラーを出すのはあくまで編集・登録時のみ
                if (dispMode == "EDIT") {
                    errorString += list2[i] + "はIPアドレス形式（aaa.bbb.ccc.ddd）で入力してください\n";
                }
            }
                     
        }       
        
    }
    
    // 全部のチェックが終了したらまとめて表示
    if (errorString != "") {
        alert(errorString);
        return false;
    }
    return true;
}

function deleteEntry(did) {
	document.Form1.summaryId.value = did;
	return true;
}

function ageCheck() {
	if (confirm("この投稿を一番上に移動します。よろしいですか？\n注意※タイムスタンプは現在の日付になります")) { return true; }
	return false;
}

/* バックアップ関連（バックヤード） */
function doBackup(type) {
	document.backupForm.passPhrase.value = document.Form5.passPhrase.value;
	document.backupForm.action.value = type;
	document.backupForm.submit();
	return false;
}

/* ---------------------------------------------*/
/* for excanvas functions                       */

// canvasに重ねたdivの中に文字列を埋め込む
function addTextDiv(divname, caption, posx, posy, capcolor, capsize, clName) {
	if (divname == undefined || caption == undefined) { return; }
  try {
	  var element = document.createElement('div');
	  element.id = "id";
	  element.innerHTML = caption;
	  var objBody = document.getElementById(divname);
	  element.style.left = posx; 
	  element.style.top = posy;
	  element.style.position = "absolute";
		if (capcolor != undefined && capcolor != "") {element.style.color = capcolor;}
		if (capsize != undefined && capsize != "") {element.style.fontSize = capsize;}
		if (clName != undefined && clName != "") {element.className = clName;}
	  objBody.appendChild(element);
  } catch(e) {}
  return;
}

// 線表示(x1,y1)-(x2,y2),r,g,b
function canvas_drawLine(divname,x1,y1,x2,y2,r,g,b) {
  divname.beginPath();
	divname.strokeStyle = "rgb("+r+","+g+", "+b+")";
  divname.moveTo(x1, y1);
  divname.lineTo(x2, y2);
  divname.stroke();
}

// 矩形表示(x1,y1)-(x2,y2),fill,r,g,b
function canvas_drawRect(divname,x1,y1,x2,y2,opt,r,g,b) {
	if (opt == "fill") {
		divname.fillStyle = "rgb("+r+","+g+", "+b+")";
		divname.fillRect(x1,y1,x2-x1,y2-y1);
	} else {
		divname.strokeStyle = "rgb("+r+","+g+", "+b+")";
		divname.strokeRect(x1,y1,x2-x1,y2-y1);
	}
}

// 真円表示(x1,y1),r1,fill,r,g,b
function canvas_drawCircle(divname,x1,y1,r1,opt,r,g,b) {
	divname.beginPath();
	if (opt == "fill") {
		divname.fillStyle = "rgb("+r+","+g+", "+b+")";
		divname.arc(x1,y1,r1,0,Math.PI*2,false);
		divname.fill();
  } else {
		divname.strokeStyle = "rgb("+r+","+g+", "+b+")";
		divname.arc(x1,y1,r1,0,Math.PI*2,false);
		divname.stroke();
	}
	//divname.scale(1,1);
}

// (x1,y1)-(x2,y2)の楕円表示だが、スケーリングを使わない方法
function canvas_drawCurveEllipse(divname,x1,y1,x2,y2,opt,r,g,b) {
	// 左端中点を基点とし、カーブしながら作画していく
	divname.beginPath();
	divname.strokeStyle = "rgb("+r+","+g+", "+b+")";
	divname.fillStyle = "rgb("+r+","+g+", "+b+")";

	divname.moveTo(x1,(y2+y1)/2);	// 基点
	divname.quadraticCurveTo(x1,y1, (x2+x1)/2, y1);
	//divname.lineTo((x2+x1)/2, y1);
	divname.quadraticCurveTo(x2,y1, x2,(y2+y1)/2);
	//divname.lineTo(x2,(y2+y1)/2);
	divname.quadraticCurveTo(x2,y2, (x2+x1)/2, y2);
	//divname.lineTo((x2+x1)/2, y2);
	divname.quadraticCurveTo(x1,y2, x1, (y2+y1)/2);
	if (opt == "fill") {
		divname.fill();
	} else {
		divname.stroke();
	}
	return;
}

// ツリーモデリング命令
function canvas_drawTreeModel(divname, textdivname, modelStr) {
	var trimedString = modelStr.replace(/^[ ]+|[ ]+$/g, '') + ",";
  var len = trimedString.length;
	var s,s2,renderStr;
	var posx = 0;
	var posy = 0;	
	s = ""; s2 = ""; renderStr = ""; limit = 0;
	var arr = new Array(12);
	for (var i=0; i<12; i++) { arr[i] = 0; }
	var pal1=230; var pal2=230; var pal3=255; 
	//var pal4=32; var pal5=32; var pal6=64;
	var lineMode = 0;

	// -- ここから本体 --
	for (var i=0; i<len; i++) {
		s = trimedString.substring(i,i+1);
		// "("か","か")"が出現するまで文字を読んでいく。出現時、それまでの
		// 文字が確定するので作画する
		if (s == "(") {	limit = 1; } else if (s == ",") {	limit = 2; } else if (s == ")") {	limit = 3; }
     else if (s == "@") {
			 // 特殊作画命令。@のあとに何を入れるかによる。エラーがおきやすいので注意
			 s2 =	trimedString.substring(i,i+2);
			 if (s2 == "@U") { // 上部線
  				canvas_drawLine(divname,75+posx*150,10+posy*35,75+posx*150,0+posy*35,0,0,0);i++;
			 }
			 if (s2 == "@Y") { // ウエツメ（※取扱注意）
					posy--; i++;
			 }
			 if (s2 == "@@") {
  				renderStr = renderStr + "@";i++;
			 }
			 // 以下、ボックスの色変更（１度だけ有効）
			 if (s2 == "@7") { pal1=255; pal2=255; pal3=255; i++; }
			 if (s2 == "@2") { pal1=192; pal2=192; pal3=255; i++; }
			 if (s2 == "@1") { pal1=255; pal2=255; pal3=192; i++; }
			 if (s2 == "@0") { pal1=230; pal2=230; pal3=255; i++; }
			 if (s2 == "@S") { lineMode = 1; i++; }
		 }
		 else { renderStr = renderStr + s; }

		if (limit > 0 || i==len) {
			if (renderStr != "") {
				// ----の場合だけ特殊
				if (renderStr == "----") {
					canvas_drawLine(divname,10+posx*150,22+posy*35,140+posx*150,22+posy*35,0,0,0);
				} else {
					var modifyY = 0;
					if (renderStr.indexOf("<br>")>=0) { modifyY = -5;}
			  canvas_drawRect(divname,10+posx*150,10+posy*35,140+posx*150,35+posy*35,'fill',pal1,pal2,pal3);
			  canvas_drawRect(divname,10+posx*150,10+posy*35,140+posx*150,35+posy*35,'box',32,32,64);
	 		    addTextDiv(textdivname, renderStr, 15+posx*150, 17+posy*35+modifyY, 'black', '8pt','treeText');
				}
				pal1=230; pal2=230; pal3=255; 
				//pal4=32; pal5=32; pal6=64;
			}

			if (renderStr != "") {
				if (lineMode != 1 || posx != 0) {
					canvas_drawLine(divname,0+posx*150,22+posy*35,10+posx*150,22+posy*35,0,0,0);
				}
			}
			if ((limit == 2 || limit == 3 ) && renderStr != "") {
				canvas_drawLine(divname,0+posx*150,22+posy*35,0+posx*150,22+arr[posx]*35,0,0,0);
			}
			if (limit == 1) {
				canvas_drawLine(divname,140+posx*150,22+posy*35,160+posx*150,22+posy*35,0,0,0);
				canvas_drawLine(divname,0+posx*150,22+posy*35,0+posx*150,22+arr[posx]*35,0,0,0);

				posx+=1;
				// 配列に記憶
				arr[posx] = posy;
			} 
			else if (limit == 2) { posy += 1; }
			else if (limit == 3) { posx -= 1; if (posx<0) {posx=0;} }

			renderStr = "";
			limit = 0;
		}
	}
	return;
}





