
// firebug
/*
if (!console || !console.firebug){
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {};
}
*/

//ttddd


// ヘッダ部とhtml部の境界
var PART_SEPARATOR = '<<--XB_AJAX_PART_SEPARATOR-->>\n';
var LOGINED = 'LOGINED';
var TERMINATE = '__TERMINATE__\n';
var XB_WINDOW_NAME = 'xb.window_name';



var tmp="";

var debug=true;


// 試作
// 
function postAutoReloadForm(form, url){
//alert('form: ' + form.innerHTML);
//alert('url: ' + url);
	requestAndChange(form, null, url, null);
}



// フォームのデータを送ります
function postFormData(sender, url){
	
	// 送信ボタンを一時的に使用不能にする
	if(sender.disabled != undefined) sender.disabled = true;
	var form = getForm(sender);
	var parameter = makeFormParam(form, sender);
	
//alert('parameter: ' + parameter);
	// 後処理の記述
	var cleanUpFunc = function(){
		// 送信ボタンの使用不能を解除
		if(sender.disabled != undefined) sender.disabled = false;
		//alert("clean up: " + sender.name);
	};
	
	requestAndChange(form, parameter, url, cleanUpFunc);
}


// フォームのデータをパラメタ化します
function makeFormParam(form, sender){
//alert("A");
	var inputList    = form.getElementsByTagName("input");
	var textAreaList = form.getElementsByTagName("textarea");
	var selectList = form.getElementsByTagName("select");
	
	var tmp_param = '';
	
//alert("B");
	// 送信ボタンの情報を格納
	for(var i=0; i<sender.attributes.length; i++){
		var attribute = sender.attributes[i];
		tmp_param += makeParam('xb.sender.' + attribute.name, attribute.value);
		
		// プルダウンからの送信の場合、選択値を送信
		if(sender.options
				&& sender.selectedIndex
				&& sender.value){
			tmp_param += makeParam('xb.sender.value', sender.options[sender.selectedIndex].value);
		}
	}
	
	for(var i=0; i<inputList.length; i++){
		var input = inputList[i];
		
		// 使用不能時は送信しない（ただし、送信者は除く）
		if(input.disabled && input != sender) continue;
		
		if(input.type == 'radio'){
			if(input.checked){
				tmp_param += makeParam(input.name, input.value);
			}
		}else if(input.type == 'checkbox'){
			/*
			if(input.checked){
				tmp_param += makeParam(input.name, '1');
			}else{
				tmp_param += makeParam(input.name, '0');
			}*/
			
			if(input.checked){
				tmp_param += makeParam(input.name, input.value);
			}
		}else{
			tmp_param += makeParam(input.name, input.value);
		}
	}
	
	// テキストエリア
	for(var i=0; i<textAreaList.length; i++){
		var textArea = textAreaList[i];
		
		// 使用不能時は送信しない（ただし、送信者は除く）
		if(textArea.disabled && textArea != sender) continue;
		tmp_param += makeParam(textArea.name, textArea.value);
	}
	
	
	// プルダウン
	for(var i=0; i<selectList.length; i++){
		var select = selectList[i];
		
		// 使用不能時は送信しない（ただし、送信者は除く）
		if(select.disabled && select != sender) continue;
		
		// 選択されていない場合は送信しない
		if(select.selectedIndex == -1) continue;
		
		if(!select.multiple){
			tmp_param += makeParam(select.name, select.options[select.selectedIndex].value);
		}else{
			for (var j = 0; j < select.options.length; j++)
				if (select.options[j].selected){
					tmp_param += makeParam(select.name, select.options[j].value);
			}
		}
	}
	


//alert("C");
	var parameter = null;
	if(tmp_param == ''){
		parameter = '';
	}else{
		// 余分な'&'を取り除く
		parameter = tmp_param.substring(1, tmp_param.length);
	}
//alert("D");
	
//alert(parameter);
	
	return parameter;
}

function makeParam(name, value){
	return '&' + encodeURIComponent(name) + '=' + encodeURIComponent(value);
}


// @param cleanUpFunc クリーンアップ関数(非同期通信終了後に呼び出される)
function requestAndChange(target, parameter, url, cleanUpFunc){
//console.log("requestAndChange");

//alert("22222");

/*
var startMillis = new Date().getTime();


	httpPostRequest(url, parameter, function(responseText){
	
var endMillis = new Date().getTime();
var mes = 'time_log: ' + ((endMillis - startMillis) / 1000);


//alert(mes);
Logger.log(mes);
*/
	
	
	httpPostRequest(url, parameter, function(responseText){
	
	
	
//alert(responseText);
//Logger.log(responseText);
//console.time("requestAndChange");

		var START_LOGIN_SECTION   = '# start login section';
		var END_LOGIN_SECTION     = '# end   login section';
		var START_DATA_SECTION    = '# start data section';
		var END_DATA_SECTION      = '# end   data section';
		var START_BEGIN_COMMAND_SECTION = '# start begin command section';
		var END_BEGIN_COMMAND_SECTION   = '# end   begin command section';
		var START_FINISH_COMMAND_SECTION = '# start finish command section';
		var END_FINISH_COMMAND_SECTION   = '# end   finish command section';
		var START_HTML_SECTION    = '# start html section';
		var END_HTML_SECTION      = '# end   html section';
		var TERMINATE_ANALYZE     = '# __TERMINATE__';
		
		var REGEX_HTML_SECTION = /# start html section\n((.|\n|\r)*)# end   html section/;
		
		var STATE_NONE    = -1;
		var STATE_DATA    =  1;
		var STATE_BEGIN_COMMAND =  2;
		var STATE_FINISH_COMMAND =  3;
		
		var lines = responseText.split('\n');		// 最後に余分な空行が入る
		
		var begin_commands = new Array();
		var finish_commands = new Array();
		
		// コマンドの実行部 ---------------------------------------------------
		var state = STATE_NONE;
		var data  = null;
		for(var i=0; i<lines.length-1; i++){	// 最後の空行を無視
			var line = lines[i];
			
			// 解析状態の変更
			if(line == START_DATA_SECTION){
				
				state = STATE_DATA;
				data = new Object();
				continue;
				
			}else if(line == START_BEGIN_COMMAND_SECTION){
				
				state = STATE_BEGIN_COMMAND;
				continue;
				
			}else if(line == START_FINISH_COMMAND_SECTION){
				
				state = STATE_FINISH_COMMAND;
				continue;
				
			}else if(line == END_LOGIN_SECTION
					|| line == END_DATA_SECTION
					|| line == END_BEGIN_COMMAND_SECTION
					|| line == END_FINISH_COMMAND_SECTION){
				
				// セクションの終わり
				state = STATE_NONE;
				continue;
				
			}else if(line.match(/^\s*\/\//) ){
				
				// コメント行を無視する
				continue;
				
			}else if(line == START_HTML_SECTION){
				
				// htmlの反映に移る
				break;
				
			}else if(line == TERMINATE_ANALYZE){
				// 何もしない（ここは修正中）
				continue;
				/*
				// 解析を強制終了する
				return;
				*/
				
			}
			
			
			if(state == STATE_DATA){
				
				// データ解析
				var keyAndValue = line.match(/^(\w+)\s*=\s*'([^']*)'$/);
				if(keyAndValue != null){
					var key = keyAndValue[1];
					var value = keyAndValue[2];
					data[key] = value;
				}
				
			}else if(state == STATE_BEGIN_COMMAND){
				
				// html表示前に実行するコマンドを作成
				var commandName = line;
				var command = new ResponseCommand(commandName, data);
				begin_commands.push(command);
				
				data = null;
				
			}else if(state == STATE_FINISH_COMMAND){
				
				// html表示のあとに実行するコマンドを作成
				var commandName = line;
				var command = new ResponseCommand(commandName, data);
				finish_commands.push(command);
				
				
			}else {
				alert("Not expected state: " + state);
				//throw "Not expected state: " + state;
				return;
			}
		}
		
		
		// htmlを表示する前に実行する関数 ---------------------------------------------------
		for(var i=0;i<begin_commands.length;i++){
			var command = begin_commands[i];
			command.execute();
		}
		
		
		
		// htmlの反映部 ---------------------------------------------------------------------
		var startHtmlIndex = responseText.indexOf(START_HTML_SECTION) + START_HTML_SECTION.length;
		var endHtmlIndex = responseText.indexOf(END_HTML_SECTION, startHtmlIndex);
		
		// htmlがなければここで終了
		if(startHtmlIndex < 0 || endHtmlIndex < 0){
			//throw "Not exist htmlSection";
			return;
		}
		
		var htmlSection = responseText.substring(startHtmlIndex, endHtmlIndex);
		var html = '<input type="hidden" name="' + XB_WINDOW_NAME + '" value="' + window.name + '">' + htmlSection; // ウィンドウ名をhiddenに仕込む
		
		// ログインしてたとき
		target.innerHTML = html;	// html書き換え
//textlog(htmlSection);

		
		// イベント処理を再設定 -------------------------------------------------------------
		XB_ONLOAD.execChildren(target); 		// タグのxb_onloadに登録されている関数を起動
		EnterPressEvent.addEventsToForm(target);	// enterkeyを押されたときの処理を追加
		
		
		// 画像サムネイル表示イベントの割り当て
		if(window.Slimbox && window.Slimbox.scanPage){
			Slimbox.scanPage();
		}
		
		
		// htmlを表示した後に実行する関数 ---------------------------------------------------
		for(var i=0;i<finish_commands.length;i++){
			var command = finish_commands[i];
			command.execute();
		}

	}, cleanUpFunc);
}



/**
 * 　取得したデータを解析します。
 * 　ログインされていなければ、ログインページにリダイレクトします。
 * 　ログインされていた場合、javascript実行後に指定タグ内のhtmlを書き換えます
 *
 * @param target 書き換えを行うノード
 * @param parameter ポストするパラメータ
 * @param url 要求URL
 */
/*
function requestAndChange(target, parameter, url){
	httpPostRequest(url, parameter, function(responseText){
		//alert(responseText);
		var parts = responseText.split(PART_SEPARATOR);
		if(parts.length < 2) throw new "LoginCheck part and html part are essential. ";
		
		
		var loginCheckPart  = parts[0];
		var javascriptParts = parts.slice(1, parts.length-1);
		var htmlPart        = parts[parts.length-1];
		
		var isLogined = (loginCheckPart.split('\n')[0] == LOGINED);
		if(!isLogined){
			// ログインチェックに弾かれたとき
			var redirectURL = loginCheckPart.split('\n')[1];
			window.location.href = redirectURL;
			return;
		}
		
		// javascriptを元ページから呼ぶ
		for(var i=0; i<javascriptParts.length; i++){
			var scriptPart = javascriptParts[i];
			var exeScript = scriptPart.split(TERMINATE)[0];
			var isTerminated = scriptPart.split(TERMINATE).length > 1;
			eval(exeScript);
			if(isTerminated) return;
		}
		
		// ログインしてたとき
		target.innerHTML = htmlPart;	// html書き換え

	});
}
*/

/*
function requestAndChange(target, parameter, url){
	httpPostRequest(url, parameter, function(responseText){
		//alert(responseText);
		var parts = responseText.split(PART_SEPARATOR, 3);
		var loginCheckPart = parts[0];
		var javascriptPart = parts[1];
		var htmlPart       = parts[2];
		
		var isLogined = (loginCheckPart.split('\n')[0] == LOGINED);
		if(isLogined){
			// ログインしてたとき
			eval(javascriptPart);		// javascriptを元ページから呼ぶ
			target.innerHTML = htmlPart;	// html書き換え
		}else{
			// ログインチェックに弾かれたとき
			var redirectURL = loginCheckPart.split('\n')[1];
			window.location.href = redirectURL;
		}
	});
}
*/


//
//function postOnlySelf(sender, url){
//	var form = getForm(sender);
//	var tmp_param ='';
//	/*
//	tmp_param += makeParam('xb.sender.name', sender.name);
//	tmp_param += makeParam('xb.sender.value', sender.getAttribute('value'));
//	tmp_param += makeParam(sender.name, sender.getAttribute('value'));
//	*/
//	
//	// 送信ボタンの情報を格納
//	for(var i=0; i<sender.attributes.length; i++){
//		var attribute = sender.attributes[i];
//		tmp_param += makeParam('xb.sender.' + attribute.name, attribute.value);
//	}
//	var parameter = tmp_param.substring(1, tmp_param.length);	 // 余分な'&'を取り除く]
//	
//	//alert(parameter);
//	requestAndChange(form, parameter, url);
//	
//}


// 自分が属するフォームを検索する
function getForm(child){
	
	var elem = child.parentNode;
	while(true){
tmp+=" tag="+elem.tagName;
		if(elem.tagName.toLowerCase() == 'form'){
			return elem
		}
		elem = elem.parentNode;
	}
	
	throw "Should never reach here.";
}


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

function textlog(text){
	if(debug==true){
		var body = document.getElementsByTagName("body");
		var newField = document.createElement("textarea");
		newField.rows = "10";
		newField.cols = "80";
		newField.name = "log";
		newField.id = "log";
		var val = document.createTextNode(text);
		newField.appendChild(val);
		body[0].appendChild(newField);
	}
}
//グローバル変数の定義
//var timerId;               // HTTP通信用タイマーオブジェクト
//var timeout_sec = 10;      // HTTP通信タイムアウト秒数


// 引数に与えられたURLにHTTPリクエストを行ない、指定された関数を実行
function httpPostRequest(target_url, post_data, funcitonReference, cleanUpFunc, funcOnBusy) {
//alert('' + target_url);
//alert('' + post_data);
//alert('' + funcitonReference);
	
	// --------------------------------------------------------------------
	// 引数のデフォルト値を設定
	// --------------------------------------------------------------------
	
	// デフォルトでは終了処理を行わない
	cleanUpFunc = cleanUpFunc || function(){};
	
	// デフォルトではサーバ混雑時にメッセージを表示
	funcOnBusy = funcOnBusy || function(){
		alert(
			  'ただいまサーバが大変込み合っております。\n'
			+ '時間をおいてもう一度実行して下さい。\n'
			+ '[ステータス] ' + httpObj.status + ' : ' + httpObj.statusText
		
		);
	};
	
	
	
	// --------------------------------------------------------------------
	// 通信処理
	// --------------------------------------------------------------------
	var httpObj;               // HTTP通信用オブジェクト
	
	try {
		if(window.XMLHttpRequest) {
			httpObj = new XMLHttpRequest();
		} else if(window.ActiveXObject) {
			try {
				httpObj = new ActiveXObject('Msxml2.XMLHTTP');
			  } catch (e) {
				httpObj = new ActiveXObject('Microsoft.XMLHTTP');
			}
			
		} else {
			httpObj = false;
		}
	} catch(e) {
		httpObj = false;
	}
	
   if(! httpObj) {
		httpObjGenerateFail();
	}
	
	httpObj.open("POST", target_url, true);
	// ヘッダをセット
	httpObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	
	
	httpObj.send(post_data);
	httpObj.onreadystatechange = function() {
		
		if (httpObj.readyState == 4) {
			
			
			try{
				if (httpObj.status == 200) {
					funcitonReference(httpObj.responseText);
				} else {
					
					funcOnBusy();
					return false;
				}
			}finally{
				// 終了処理
				cleanUpFunc();
			}
		}
	}
}

// XMLHttpRequestオブジェクト生成に失敗した場合の処理
function httpObjGenerateFail() {
    alert('ご利用のブラウザーでは、当サイトをご利用頂けません。');
    return false;
}



// ページの表示中はセッションが切れないようにします
function makeSessionDeathless(url) {
	
	var f = function(){
		//var millis = new Date().getMilliseconds();
		//var url   = '?dummy=' + millis;
		var emptyFunc = function(){};
		httpPostRequest(url, null, emptyFunc, emptyFunc, emptyFunc);
	};
	
	var interval = 5 * 60 * 1000;
	
//alert('start dethless');
	window.setInterval(f, interval);
}

var XbEvent = {
	
	// イベントリスナー登録
	addListener: function(elem, eventType, func, cap){
		
		if(elem.addEventListener) {
			elem.addEventListener(eventType, func, cap);
		} else if(elem.attachEvent) {
			elem.attachEvent('on' + eventType, func);
		} else {
			alert('ご利用のブラウザーはサポートされていません。');
			return false;
		}
	},
		
	addLoadEvent : function(func){
		var oldonload = window.onload;
		
		if (typeof window.onload != 'function') {
			window.onload = func;
		} else {
			window.onload = function() {
				oldonload();
				func();
			}
		}
	}

};

/**
	テキストボックス上でenterキーが押下されたときの動作を規定する。
	1.ボタンがform上に1つだけ存在      -> そのボタンをクリックする
	2.ボタンがform上に0または2異常存在 -> 何もしない
*/
var EnterPressEvent = {
	
	addEventsToDocument: function(){
		var forms = document.getElementsByTagName("form");
		for(var i=0; i<forms.length; i++){
			var form = forms[i];
			EnterPressEvent.addEventsToForm(form);
		}
	},
	
	addEventsToForm: function(form){
		
		// ------------------------------------------------------------
		var buttons   = EnterPressEvent.getButtons(form);
		var funcKeypress;
		if(buttons.length == 1){
			// ボタンが１つならそれをクリック
			
			var targetButton = buttons[0];
			funcKeypress = function(e){
				
				if(getKEYCODE(e) != 13) return true; // デフォルトの動作
				
				if(!targetButton.disabled){
					// ボタンが使用可能ならクリック
					targetButton.click();
				}
				
				// デフォルトの動作を抑制
				return false;
			};
		}else{
			// ボタンが0または複数ならenter時に何もしなくさせる
			funcKeypress = function(e){
				if(getKEYCODE(e) == 13){
					 return false;
				}else{
					// デフォルトの動作
					return true;
				}
			};
		}
		
		// テキストボックスにイベントハンドラをセット
		var textBoxes = EnterPressEvent.getTextBoxes(form);
		for(var i=0; i<textBoxes.length; i++){
			var text = textBoxes[i];
			
			// onkeypressイベントがすでに定義されている場合は何もしない
			if (typeof text.onkeypress == 'function') continue;
			text.onkeypress = funcKeypress;

		}
		
	},
	
	
	
	// form上のボタン要素を探索(button, submin)
	getButtons: function(form){
		var inputList    = form.getElementsByTagName("input");
		var result   = new Array();
		
		// 全ボタンを探す
		for(var i=0; i<inputList.length; i++){
			var input = inputList[i];
			
			if(input.type == 'button'
					|| input.type == 'submit'){
				result.push(input);
			}
		}
		
		return result;
	},
	
	
	// form上のボタン要素を探索(text, password)
	getTextBoxes: function(form){
		var inputList = form.getElementsByTagName("input");
		var result    = new Array();
		
		// 全テキストボックス
		for(var i=0; i<inputList.length; i++){
			var input = inputList[i];
			if(input.type == 'text'
					|| input.type =='password'){
				result.push(input);
			}
		}
		return result;
	},
	
	start: function(){
		XbEvent.addLoadEvent(function(){
			EnterPressEvent.addEventsToDocument();
		});
	}
}
EnterPressEvent.start();


/*
function setButtonClickedOnEnter(buttonName){
	
	var button =  document.getElementById(buttonName);
	document.onkeyup = function(aEvent){
		var event;
		if(aEvent){
			event = aEvent;
		}else{
			event = window.event;
		}
			
		if (event.keyCode == 13){
			// enter が押されたとき
			// ボタンをクリックし、キー入力を無効にする
			button.click();
			return false;
		}else {
			return true;
		}
	}
}
*/
/*
// フォーム上でキーが押下された場合の処理
function xbOnKeyPressOnForm(form, e){
	
	
	//  enterキーが押されたとき、
	// フォーム上のボタンが一つだけ存在するならば
	// そのボタンをクリックする
	
	// enterキーが押されたときのみ処理する
	if(getKEYCODE(e) != 13) return true;
	
	
	//var element = (document.activeElement || window.getSelection().focusNode);
	var element = (document.activeElement || window.getSelection());
	alert('' + element.tagName);
	
	
	clickButtonIfThereIsJustOne(form);
	
	// デフォルトの動作を抑制
	return false;
}

// フォーム上にボタンが一つだけあった場合に、それをクリックします
function clickButtonIfThereIsJustOne(form){
	
	var inputList    = form.getElementsByTagName("input");
	var buttonList   = new Array();
	
	// 全ボタンを探す
	for(var i=0; i<inputList.length; i++){
		var input = inputList[i];
		
		if(input.type == 'button'
				|| input.type == 'submit'){
			buttonList.push(input);
		}
	}
	
	if(buttonList.length == 1){
		var button = buttonList[0];
		if(!input.disabled){
			// 使用可能ならクリックする
			button.click();
		}
	}
	
	

}
*/


//--押されたキ－コードを返す
function getKEYCODE(e){  
	if(document.all){
		return  event.keyCode;
	}else if(document.getElementById){ 
	    return (e.keyCode!=0)?e.keyCode:e.charCode;
	}else if(document.layers){
		return  e.which
	}
}


/**
 * 使い方
 *
 * [1] と [2] が等価になります。
 * 命令を配列等に保存することができます。
 *
 * [1]
 * ResponseCommand.sendRedirect({url:'http://sample.co.jp/'});
 *
 * [2]
 * var cmd = new ResponseCommand('sendRedirect', {url:'http://sample.co.jp/'});
 * cmd.execute();
 *
 * 命令を追加したい場合、新たにクラスメソッドを作成してください。
 */
// Commandパターン[DP]使用
// コンストラクタ
function ResponseCommand(commandName, args){
	this.commandName = commandName;	// String
	this.args = args;		// Object(ハッシュとして扱う)
}

new ResponseCommand(null, null);	// dummy

// インスタンスメソッド
ResponseCommand.prototype.execute = function(){
	ResponseCommand[this.commandName](this.args);
}


// クラスメソッド
// 命令を追加する場合にはここにメソッドを追加してください

// 他のページにリダイレクトする
ResponseCommand.sendRedirect = function(args) {
	window.location.href = args.url;

}

ResponseCommand.sendRedirectTop = function(args) {
	top.location.href = args.url;

}


// 他のパーツをリロードする（暫定版）
ResponseCommand.reloadParts = function(args){
	var tmp_param = '';
	var target = document.getElementById(args.targetID);
	target.innerHTML = 'Now Loading.Wait a Minute.';
	
	for(index in args){
		if(index != 'targetID' || index != 'url'){
			tmp_param += makeParam(index, args[index]);
		}
	}
//alert(tmp_param);
	requestAndChange(target, tmp_param, args.url);
}

/*ResponseCommand.reloadParts = function(args){
	var target = document.getElementById(args.targetID);
	requestAndChange(target, '', args.url);
}*/

// ページの一番上へスクロールする
ResponseCommand.scrollToHome = function(args){
	window.scrollTo(0,0);
}

// 同一ページの以下のタグ位置にスクロール
// <a name="{+args.name+}"></a>
// 注意：
// このコマンドを実行したコンテキストが他のパーツを更新する場合、
// 正しくスクロールしない場合がある。
// 
ResponseCommand.scrollToAnchor = function(args){
	self.location.href = '#' + args.anchorName;
}


// 他のウィンドウを開く
// 注意: PDFを開く場合には必ずargs.name='_blank' を指定してください
ResponseCommand.windowOpen = function(args) {
	
	var url      = args.url;
	var name     = args.name;
	var features = args.features;
	var replace  = args.replace;
	var anotherWindow = window.open(url, name, features, replace);
	
	anotherWindow.focus(); // IEでは効くが、FireFoxでは効かない模様
	
}

ResponseCommand.log = function(args) {
	Logger.log(args.message);
}

ResponseCommand.windowCloseAndOpenerReload = function(args) {
	window.opener.location.reload(true);
	window.close();
}


ResponseCommand.openerSendRedirect = function(args) {
	window.opener.location.href = args.url;
}


/*
function showProps(obj){
	var result = "";
	for(prop in obj){
		result += 'name: ' + prop + '; value: ' + obj[prop] + '\n';
	}
	
	alert(result);
	
	
	var anotherWindow = window.open('', 'props');
	anotherWindow.document.clear();
	anotherWindow.document.write('<html><body>');
	anotherWindow.document.write(result);
	anotherWindow.document.write('</html></body>');
	anotherWindow.document.close();
	
}*/


function TimeLogger(){
	this.startMillis = new Date().getTime();
	this.recordList = new Array();
}

TimeLogger.prototype.reset = function(){
	this.startMillis = new Date().getTime();
}

TimeLogger.prototype.log = function(message){
	var currentMillis = new Date().getTime();
	var record = '' + message + ': ' + ((currentMillis - this.startMillis) / 1000);
	this.recordList.push(record);
}

TimeLogger.prototype.view = function(){
	var anotherWin = window.open("", "xb_time_log");
	
	anotherWin.document.clear();
	anotherWin.document.write('<html><body>');
	
	for(var i=0; i< this.recordList.length; i++){
		var record = this.recordList[i];
		anotherWin.document.write(record + '<br>');
	}
	
	anotherWin.document.write('</html></body>');
	anotherWin.document.close();
}


// 画面下部のログを制御

function Logger(){
}

new Logger();	// dummy
Logger.LOG_SPACE_ID = 'xb_log_space';

Logger.log = function (message){	
	var div = My.$(Logger.LOG_SPACE_ID);
	if(div){
		div.innerHTML += message + '<br>\n';
		//div.innerText += message + '<br>\n';
	}

};

Logger.clear = function (){	
	var div = My.$(Logger.LOG_SPACE_ID);
	if(div){
		div.innerHTML = '';
	}
};

/*
Logger.logText = function(message){
	var div = My.$(Logger.LOG_SPACE_ID);
	if(div){
		var text = document.createElement('textarea');
		text.defaultValue = message;
		text.value = message;
		div.appendChild(text);
		
	}
}*/

/*
(function(){
	if(window.$ == undefined){
		window.$ = function $(id){
			return document.getElementById(id);
		}
	}
})();
*/

var My = {
	$: function(id){
		return document.getElementById(id);
	}
};


// 新機能を実装可能か検証するためのコード

function isDateValid(nYear, nMonth, nDay) //nYearに年度,　nMonthに月, nDayに日付を渡してください。
{
	if(nYear == '' && nMonth == 0 && nDay == 0) return true;
	if(nYear == '' || nMonth == 0 || nDay == 0) return false;
	
	
	var dtCal = new Date;
	var strDate;
	var nMonthCount = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	
	/*
	//年度のチェック （ここでは4桁チェック)
	if (nYear.length != 4)
	{
		//alert ("正しい年を入力してください。");
		//return false;
	}
	*/
	
	//月のチェック
	if ((nMonth < 1) || (nMonth > 12))
	{
		//alert ("正しい月を入力してください。");
		return false;
	}

	dtCal.setYear(nYear);
	dtCal.setMonth(nMonth-1);
	var nDayCount = nMonthCount[nMonth-1];
	if ((nMonth == 2)&&(((nYear%4 == 0)&&(nYear%100 != 0))||(nYear%400 == 0)))
	{
		nDayCount = 29;
	}

	//日付チェック
	if ((nDay < 1) || (nDay > nDayCount))
	{
		//alert ("正しい日付を入力してください。");
		//alert ("ご参考に→"+nYear+"年"+nMonth+"月は"+nDayCount+"日までです。");
		return false;
	}
	return true;
}

function hintInvalidDate(sender, dateName){
	var XB_TYPE_PART_YEAR   = "xb.type_part.year.";
	var XB_TYPE_PART_MONTH  = "xb.type_part.month.";
	var XB_TYPE_PART_DAY    = "xb.type_part.day.";
	
	var yearTag  = sender.form[XB_TYPE_PART_YEAR  + dateName];
	var monthTag = sender.form[XB_TYPE_PART_MONTH + dateName];
	var dayTag   = sender.form[XB_TYPE_PART_DAY   + dateName];
	
	var year  = yearTag.value;
	var month = getSelectedValue(monthTag);
	var day   = getSelectedValue(dayTag);
	
	if(isDateValid(year, month, day)){
		yearTag.style.backgroundColor  ='';
		monthTag.style.backgroundColor ='';
		dayTag.style.backgroundColor   ='';
	}else{
		yearTag.style.backgroundColor  ='orange';
		monthTag.style.backgroundColor ='orange';
		dayTag.style.backgroundColor   ='orange';
	}
}

function getSelectedValue(select){
	return select.options[select.selectedIndex].value;
}

/*
function addEvent(element,event,func){
	if(element.addEventListener){
		element.addEventListener(event,func,false);
	}else if(element.attachEvent){
		element.attachEvent('on'+event,func);
	}else{
		element['on'+event] = func;
	}
}
*/
/*
//削除
function removeEventListener(element, type, func){
    if(element.attachEvent){
        element.detachEvent("on" + type, func);
    }else{
        element.removeEventListener(type, func, true);
    }
}
*/


/*
function execXBOnload(element){
	
	var XB_ONLOAD_NAME = "xb_onload";
	
	var exec = function(elem){
		if(!!elem.getAttribute && !!elem.getAttribute(XB_ONLOAD_NAME)){
			var xbOnloadValue = elem.getAttribute(XB_ONLOAD_NAME);
			
			elem.doload = eval(xbOnloadValue); // xb_onload内の'this'をwindosからelemに置き換える
			elem.doload();
		}
	};
	
	exec(element);
	
	//var children = element.childNodes;
	var children = element.getElementsByTagName('*');
	for (i=0; i<children.length; i++) {
		var child = children[i];
		exec(child);
	}
}
*/

//addEvent(window, "load", function(){alert('eventlistener')});
//addEvent(window, "load", execXBOnload(document.body));

var XB_ONLOAD = {
	prefix: 'xb_onload',

	execAll: function(){
		XB_ONLOAD.execChildren(window.document);
	},

	execChildren : function(aParent){
	       XB_ONLOAD.execList(aParent.getElementsByTagName("div"));
	       XB_ONLOAD.execList(aParent.getElementsByTagName("span"));
	       XB_ONLOAD.execList(aParent.getElementsByTagName("input"));
	},
	execList : function(list){
		for(var i=0; i<list.length; i++){
			var elem = list[i];

			if(!elem.getAttribute || !elem.getAttribute(XB_ONLOAD.prefix)) continue;
			var command = elem.getAttribute(XB_ONLOAD.prefix)
			//console.info(command);
			var f = function(){eval(command);};
			f.apply(elem, arguments);
		}
	},

	start : function(){
//console.time(XB_ONLOAD.prefix);
		XB_ONLOAD.addLoadEvent(function(){
			XB_ONLOAD.execAll();
		});
//console.timeEnd(XB_ONLOAD.prefix);
	},
	
	addLoadEvent : function(func){
		var oldonload = window.onload;
		
		if (typeof window.onload != 'function') {
			window.onload = func;
		} else {
			window.onload = function() {
				oldonload();
				func();
			}
		}
	}

};
XB_ONLOAD.start();

function setIFrame(form, iframe){

	
	/*
	if(this.latch){
		form.innerHTML = extractIFrameBody(iframe).innerHTML;
	}
	
	this.latch = true;
	*/
	
	
	var html = extractIFrameBody(iframe).innerHTML;;
	if(html != ''){
		form.innerHTML = html;
	}
};



function extractIFrameBody(iFrameEl) {

  var doc = null;
  if (iFrameEl.contentDocument) { // For NS6
    doc = iFrameEl.contentDocument; 
  } else if (iFrameEl.contentWindow) { // For IE5.5 and IE6
    doc = iFrameEl.contentWindow.document;
  } else if (iFrameEl.document) { // For IE5
    doc = iFrameEl.document;
  } else {
    alert("Error: could not find sumiFrame document");
    return null;
  }
  return doc.body;

}
