/*
┌─────────────────────────────────
│  301.js v1.03
│  Copyright(C) K2@Factory 2000-2002
│  toro@cside8.com
│  http://toro.cside8.com/
└─────────────────────────────────

┌─────────────────────────────────
│  [更新履歴]
│  [2003/01/04] 「v1.03」 Opera7で不具合が発生するのでそれを回避するようにした。
│  [2002/12/11] 「v1.02」 入力フォーム関連追加
│  [2002/12/10] 「v1.01」 日記モード時に修正・削除（記事番号がNo.0になる為）ができないバグを修正
│  [2002/12/05] 「v1.00」 基本完成
└─────────────────────────────────
 注意：JavaScript が分かる人は適当に改良してください（笑）それ以外の人は触らない方が無難です・・・
 注意：BBS 301.cgi のバージョンが v1.18 以上用です。
 注意：ClientCheck.js が必要です。
*/

// DOM簡易チェック関数（詳細は面倒くさいのでCGI側の奴で判定して変数 UA に格納してます）
var DOM = 0;
function DomCheck() {
		if(document.getElementById && !document.all){
			DOM = 1; //NN6.x, NN7, Mozila 系
		} else if(document.getElementById){
			DOM = 2; //IE5, IE5.5, IE6 系
		} else if(document.all){
			DOM = 3; //IE4
		} else if(document.layers){
			DOM = 4; //NN4.x
		}
		//alert(DOM);
}
DomCheck();

// プレビュー機能を実行する関数
/*
面倒くさい方法を取っているのは・・・NN6.2 で style.display を利用してテキストエリアを消すと何故か中身が消える現象の為
*/
var RCode;
var myReg = new Array(/\r\n/g, /\r/g, /\n/g);
var myReg2 = new Array("%0D%0A", "%0D", "%0A");
var PreMode = 0;

function PreviewControl() {

	var c;
	var agent = navigator.userAgent;

	// PreMode=0 だとプレビュー実行前
	if(PreMode == 0){

		STR1 = document.F1.comment2.value;
		//alert(escape(STR1));

		// 改行コードの判定「\r\n, \r, \n」を想定してます。
		// 製作者調べ・・・WIN の IE5, IE6, NN4.7 は「\r\n」で、NN6.2, NN7 は「\n」らしい（TextArea内）
		if( /\r\n/.test(STR1) ) {
			RCode = 0;
		} else if( /\r/.test(STR1) ) {
			RCode = 1;
		} else if( /\n/.test(STR1) ) {
			RCode = 2;
		} else {
			RCode = 3;
			//alert("スクリプトが想定してない改行コードであるか、改行コードが見つからない。");
		}
		//alert(RCode);

		// 改行コードを<br>に置換
		if(RCode != 3){
			STR1 = STR1.replace(myReg[RCode], "<br>");
		}

		//alert(STR1);

		if(SLC){
			if(!StringLengthCheck(STR1, STR_MAX)){
				alert("警告：連続した半角文字列の長さがが制限値を超えました");
				return false;
			}
		}

		// 自動リンク実行
		if(AUTO_LINK){
			STR2 = STR1.replace(/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/g, "$1<a class=\"UriLink\" href=\"$2\" target='_black'>[URL]<\/a>");
		} else {
			STR2 = STR1;
		}
			//EcodingComment();

			// 置換した文字列をcommentに代入
			document.F1.comment.value = STR1;

			// DOMによるブラウザ判別をしてコメント入力欄を消し、プレビューtableを表示
			if(!ClientCheck.OP && document.getElementById){
				document.getElementById('CommentTextArea').style.display = "none";
				document.getElementById('PreComment').innerHTML = STR2;
				document.getElementById('MainFormTable2').style.display = "";
				document.F1.preview_button.value = "EDIT";
				PreMode++;
			} else if(!ClientCheck.OP && document.all){
				document.all('CommentTextArea').style.display = "none";
				document.all('PreComment').innerHTML = STR2;
				document.all('MainFormTable2').style.display = "";
				document.F1.preview_button.value = "EDIT";
				PreMode++;
			} else {
				alert("申し訳ありません、このブラウザではプレビュー機能は使用できません。");
			}
			PreMode++;

	} else if(PreMode >= 1){

		if(PreMode >= 2){
			//STR1 = document.F1.comment.value;
			// 自動リンクを元のアドレスだけの文字列に戻す
			//REG = REG.replace(/<a\s.*?href=\"(.*?)\".*?>\[URL\]<\/a>/gi, "$1");
			// 最小マッチ.*?がIE5でエラーが発生するので使用しない

			document.F1.comment2.value = STR1.replace(/<br>/g, unescape(myReg2[RCode]));

			if(document.getElementById){
				document.getElementById('MainFormTable2').style.display = "none";
				//document.F1.comment.value = document.F1.comment2.value;
				document.getElementById('CommentTextArea').style.display = "";
			} else if(document.all){
				document.all('MainFormTable2').style.display = "none";
				//document.F1.comment.value = document.F1.comment2.value;
				document.all('CommentTextArea').style.display = "";
			}
				document.F1.preview_button.value = "PREVIEW";
		}
		PreMode = 0;

	}
}

// 記事入力フォームからの送信時に実行する関数
function FormSubmit(){

	var c, error = 0, error_comment="警告 ： ";
	var temp;

	if(document.F1.name.value.length == 0){
		error_comment = error_comment + "名前" ;
		error++;
	}

	//alert(document.F1.comment2.value.length +" / "+ STR1);

	// NN6.2 で style.display を利用してテキストエリアを消すと中身が消える現象の為に条件判定が必要に・・・面倒くさいな〜ｗ
	if(PreMode >= 2){
		temp = STR1;
	} else {
		temp = document.F1.comment2.value;
	}

	//alert(temp);

	if(temp.length > 0){

		STR1 = temp;

		//改行コードの判定
		if( /\r\n/.test(STR1) ) {
			RCode = 0;
		} else if( /\r/.test(STR1) ) {
			RCode = 1;
		} else if( /\n/.test(STR1) ) {
			RCode = 2;
		} else {
			RCode = 3;
		}

		// 改行コードを<br>に置換
		if(RCode != 3){
			STR1 = STR1.replace(myReg[RCode], "<br>");
		}

		// 置換した文字列をcommentに代入
		document.F1.comment.value = STR1;

	} else {
		if(error > 0){
			error_comment = error_comment + " と " ;
		}
		error_comment = error_comment + "コメント" ;
		error++;
	}

	if(error > 0){
		error_comment = error_comment + " が 未入力です。" ;
		alert(error_comment);
		return false;
	} else {
		if(SLC){
			if(StringLengthCheck(STR1, STR_MAX)){
				return true;

			} else {
				alert("警告：連続した半角文字列の長さがが制限値を超えました");
				return false;
			}
		} else {
			return true;
		}
	}
}

// 修正・削除フォームからの送信時に実行する関数
// mode = 0[削除・修正], =1[削除・修正・管理人のみ返信]
function FormSubmit2(mode, diary_mode){

	var c, error = false;

	//alert(diary_mode +" / "+ document.F2.mode.value);

	// 日記モード用ダミー NO. 代入
	if(diary_mode != 0) {
		if(document.F2.mode.value == "diary"){
			document.F2.no.value = "0";
		}
		//alert(document.F2.no.value.length);
	}

	if(document.F2.no.value.length >= 1){
		if(document.F2.pwd.value.length >= 1){
			if(mode == 1){
				if(document.F2.mode.value == "admin_res"){
					for(c=1; c<=OYA; c++){
						if(OYARES_NO[c] == document.F2.no.value){
							error = true;
							return error;
						}
					}
					alert("警告：現在のページの親記事No.ではありませんので返信できません。");
					return error;
				}
			}
			error = true;
			return error;
		} else {
			alert("警告：パスワード が未入力です。");
			return error;
		}
	} else {
		alert("警告：記事No.又はパスワードが未入力です。");
		return error;
	}

	return error;
}

//v1.02[js], v1.16[cgi]
function SendColor(mode, color){
	window.status = color;
	document.F1.color.value = color;
  if(mode){
	if((DOM == 1) || (DOM == 2)){

		if(document.getElementById('FourCorners1')){
			document.getElementById('FourCorners1').style.color = color;
			document.getElementById('FourCorners2').style.color = color;
			document.getElementById('FourCorners3').style.color = color;
			document.getElementById('FourCorners4').style.color = color;
		}
		document.getElementById('PrePoint').style.color = color;
		//document.getElementById('ColorIndex').style.color = color;
		document.getElementById('submit_button').style.backgroundColor = color;
	} else if(DOM == 3){

		if(document.all('FourCorners1')){
			document.all('FourCorners1').style.color = color;
			document.all('FourCorners2').style.color = color;
			document.all('FourCorners3').style.color = color;
			document.all('FourCorners4').style.color = color;
		}
		document.all('PrePoint').style.color = color;
		//document.all('ColorIndex').style.color = color;
		document.all('submit_button').style.backgroundColor = color;
	}
  } else {
	if((DOM == 1) || (DOM == 2)){
		document.getElementById('PrePoint').style.color = color;
		document.getElementById('submit_button').style.backgroundColor = color;
	} else if(DOM == 3){
		document.all('PrePoint').style.color = color;
		document.all('submit_button').style.backgroundColor = color;
	}
  }
}

function SendIcon(no){
	//alert(no);
	if((DOM == 1) || (DOM == 2)){
		document.PreIcon.src = ARRAY_ICON[no];
	} else if(DOM == 3){
		document.PreIcon.src = ARRAY_ICON[no];
	}
}

var ARRAY_ICON_NO = 0;
var RandIcon_ID;
function RandIcon(){
	if((DOM == 1) || (DOM == 2) || (DOM == 3)){
		document.PreIcon.src = ARRAY_ICON[ARRAY_ICON_NO];
		if(ARRAY_ICON_NO > (ARRAY_ICON.length - 1)){
			ARRAY_ICON_NO = 0;
		}else{
			ARRAY_ICON_NO++;
		}
//alert(ARRAY_ICON_NO);
		window.status = ARRAY_ICON_NO;
		RandIcon_ID = setTimeout('RandIcon()', 1000);
	}
}

// 文字列内の連続した半角文字列をカウントし、制限値を超えたら false を返す。
// 入力フォーム内の文字列を送信する前にチェックするのが目的にできてるので、使用可能なタグ、及び属性はカウントしません。
// つまり、<a href="....">や</a>はカウントしませんが、<a href="...." の様に閉じ忘れはカウントします。
function StringLengthCheck(str, max){

	var point = 0; //位置
	var pickup_char; //抜き出した文字を格納
	var length = 0; //文字列の長さ
	var buffer = ''; //抜き出した文字列を一時保存
	var flag = 0; //「<」フラグ・・・タグの属性部分の可能性あり
	var flag2 = 0; //使用可能タグの可能性あり
	var count = 0; //半角文字数
	var error = 0;

	// 自動リンク実行
	if(AUTO_LINK){
		str = str.replace(/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/g, "$1<a class=\"UriLink\" href=\"$2\" target='_black'>[URL]<\/a>");
	}

	length = str.length;
	//alert("length="+length +"str="+str +"MAX="+STR_MAX);

	while(point < length){

		// 現在位置の文字を抜き出す
		pickup_char = str.substr(point, 1); //str.charAt(point);でもいいな（笑）
		//alert(pickup_char +" / "+ flag);

		// 半角文字か判別
		if(/[!"#\$%&`\(\)\*\+'-\.\/:;<=>\?@\[\\\]\^_,\{\|\}~\w]/.test(pickup_char)){
		//alert("pickup_char=" + pickup_char + ", count=" + count + ", buffer=" + buffer);
		//alert(pickup_char);

			count++;
			buffer = buffer + pickup_char;

			if(/</.test(pickup_char) && !flag) {

				flag = 1;

				if(TAG_MODE){
					// 使用可能タグの時はカウントしない・・・現時点では汎用性は無いので別方法を考えないとな〜＾＾；
					if(/<SPAN\s/i.test(str.substr(point, 6))){
						flag2 = 1;
					} else if(/<FONT\s/i.test(str.substr(point, 6))){
						flag2 = 1;
					} else if(/<IMG\s/i.test(str.substr(point, 5))){
						flag2 = 1;
					} else if(/<[A|S|I|U|B]\s/i.test(str.substr(point, 3))){
						flag2 = 1;
					} else if(/<[S|I|U|B]>/i.test(str.substr(point, 3))){
						flag2 = 1;
					} else if(/<\/SPAN>/i.test(str.substr(point, 7))){
						flag2 = 1;
					} else if(/<\/FONT>/i.test(str.substr(point, 7))){
						flag2 = 1;
					} else if(/<\/[A|S|I|U|B]>/i.test(str.substr(point, 4))){
						flag2 = 1;
					} else if(/<BR>/i.test(str.substr(point, 4))){
						// 改行コードは既に<br>に置換されてる為チェック必要
						flag2 = 1;
					}
				} else {
					if(/<BR>/i.test(str.substr(point, 4))){
						// 改行コードは既に<br>に置換されてる為チェック必要
						flag2 = 1;
					}
				}
			}

			if(/>/.test(pickup_char)) {
				if(flag == 1){
					//count = 0;
					flag = 0;
				}
	 			if(flag2 == 1){
					count = 0;
					flag2 = 0;
				}
			}

			if(count >= max){
				if(flag2 != 1){
					error = 1;
					break;
				}
			}

			point++;

		} else {
			count = 0;
			buffer = '';
			point++;
		}
	}

	if(flag && !error){
		//alert("ERROE2:半角文字数が制限値を超えたか、タグの閉じ忘れの恐れあります");
		return false;
	} else if(error){
		//alert("ERROE1:半角文字数が制限値を超えました");
		return false;
	} else {
		//alert("ok");
		return true;
	}
}


//v1.02[js], v1.16[cgi]
// テキストエリアの内容を色々操作
// del = 消去, add = 追加, res = 復元, save = 保存
var commentControl_TEMP = "";
function commentControl(mode) {

	var temp;

  if(PreMode <= 1){
	switch(mode) {

		case "del" :
			if(confirm("コメント内容を消去しますか？")) {
				temp = document.F1.comment2.value;
					document.F1.comment2.value = "";
				if(confirm("コメント内容を一時保存しますか？")) {
					commentControl_TEMP = temp;
				}
			}
			break;

		case "add" :
			if(confirm("一時保存した奴を現在の内容の最後に追加しますか？")) {
				document.F1.comment2.value = document.F1.comment2.value + commentControl_TEMP;
			}
			break;

		case "res" :
			if(confirm("一時保存した奴を復元します。現在の内容は無くなりますが実行しますか？")) {
				document.F1.comment2.value = commentControl_TEMP;
			}
			break;

		case "save" :
			if(confirm("コメントを一時保存しますか？")) {
				commentControl_TEMP = document.F1.comment2.value;
			}
			break;

		default:
	}
  }
}

//v1.02[js], v1.16[cgi]
// テキストエリアの行数を変える
function ziseChange(id, line) {

	var D = document;

	if(line < 0) {

		if(D.getElementById) {
			if(D.getElementById(id).rows <= (line * -1)) {
				return false;
			}
		} else if(D.all) {
			if(D.all(id).rows <= (line * -1)) {
				return false;
			}
		}
	}

	if(D.getElementById && !D.all){
			D.getElementById(id).rows = D.getElementById(id).rows + line;
	} else if(D.getElementById){
		D.getElementById(id).rows = D.getElementById(id).rows + line;
	} else if(D.all){
		D.all(id).rows = D.all(id).rows + line;
	} else if(D.layers){
		alert("すみません、このブラウザでこの機能は使用できません");
	} else {
		alert("すみません、このブラウザでこの機能は使用できません");
	}

}

//v1.02[js], v1.16[cgi]
// 枠の色を変える
function BorderColor(mode, id, color) {

	var D = document;

	if(mode){
		if(D.getElementById && !D.all){
				D.getElementById(id).style.borderColor = color;
		} else if(D.getElementById){
			D.getElementById(id).style.borderColor = color;
		} else if(D.all){
			D.all(id).style.borderColor = color;
		} else if(D.layers){
		} else {
		}
	}
}




//---------------------------------

/*
function SC(str){
	alert("str = "+str.length);
	//↑引数が０だと文字列の長さがとれず、この行が実行されず。↓次の行も実行されない。したがって引数の文字列の長さを直接とるのはヤバイ？
	alert("ok");
}
SC();
*/
// str, max
function StringLengthCheck2(){

	var point = 0; //位置
	var str;
	var length = 0; //文字列の長さ
	var pickup_char; //抜き出した文字を格納
	var buffer = ''; //抜き出した文字列を一時保存
	//var flag = 0; //「<」フラグ・・・タグの属性部分の可能性あり
	//var flag2 = 0; //使用可能タグの可能性あり
	//var count = 0; //半角文字数
	//var error = 0;

	var a = arguments; //引数

	switch( a.length ){
		case 0 : break;
		case 1 : {
			if(typeof a[0] == "string"){
				str = a[0];
				length = a[0].length;
			}
			break;
		}
		default : break;
	}

	alert("str = " + str + " lenght = " + length);
}
//StringLengthCheck2("OK?");

