/* -----------------------------------------------------
	JavaScript 共通 function
	最終更新: 2007-11-08
	※gina 用

	[int 版との相違点]
	- エンコードは Shift_JIS。
		JavaScript の仕様により、POST は UTF-8 のままなので
		PHP 側で変換する必要あり。
	- int 版には含まれていない
		- $()
		- document.getElementsByClassName
		を含む。int 環境では default.js に含まれる。
----------------------------------------------------- */
// プロセスをスタックする配列
var process_stack = [];
// ログインダイアログ表示/非表示フラグ
var login_dialog_flg = false;

// ログインダイアログに使うHTMLパーツを先読みする
if (login_dialog_flg == true) {
	var loginHtml = createXmlHttp();
	loginHtml.open('get', '/login/ajax/login.html', false);
	loginHtml.send(null);
	var login_dialog_tags = loginHtml.responseText;
}

// window.onload 指定
window.onload =  windowOnLoadExec;
if (windowOnLoad == undefined) var windowOnLoad = [];

/* -----------------------------------------------------
	外部 JavaScript ファイルの
	window.onload 相当関数をまとめてイベント追加
----------------------------------------------------- */
function windowOnLoadExec(){
	for (var i in windowOnLoad) {
		addEvent('window','load', windowOnLoad[i]());
	}
}


/* -----------------------------------------------------
	document.getElementById() の拡張
	(prototype.js の いわゆる "dollar function")
----------------------------------------------------- */
function $() {
	var elements = new Array();
	for (var i=0;i<arguments.length;i++) {
		var element = arguments[i];
		if (typeof element=='string')
			element = document.getElementById(element);
		if (arguments.length==1)
			return element;
		elements.push(element);
	}
	return elements;
}



/* -----------------------------------------------------
	クラス名でエレメントを取得
----------------------------------------------------- */
document.getElementsByClassName = function(cl){
	var r = [];
	var c = new RegExp('\\b'+cl+'\\b');
	var e = this.getElementsByTagName('*');
	var len = e.length;
	for (var i=0; i<len; i++) {
		var n = e[i].className;
		if (c.test(n)) r.push(e[i]);
	}
	return r;
}



/* -----------------------------------------------------
	プロセスをスタックしてAjaxをコール
----------------------------------------------------- */
function callAjax(param, func, url, mode) {
	// ログインするまでプロセスをスタック
	process_stack[process_stack.length] = {
		'param' : param,
		'func'  : func,
		'url'   : url,
		'mode'  : mode
	};
	// 自分だけがスタックされている場合のみAjaxする
	if (process_stack.length === 1) {
		doAjax(param, func, url, mode);
	}
}



/* -----------------------------------------------------
	Ajax
----------------------------------------------------- */
function doAjax(param, func, url, mode) {
	// true:非同期 / false:同期
	mode = (mode == false) ? false : true;

	// POSTするパラメータを生成
	var par = createParameter(param);
	// ブラウザ判定用(もう少し整理できる?)
	var ua			= navigator.userAgent;
	var safari		= ua.indexOf('Safari')!=-1;
	var konqueror	= ua.indexOf('Konqueror')!=-1;
	var mozes		= ((a=navigator.userAgent.split('Gecko/')[1] )?a.split(' ')[0]:0) >= 20011128;

	// XMLHTTPオブジェクト生成
	var xmlhttp = createXmlHttp();
	xmlhttp.open('POST', url, mode);
	xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	// コールバック関数を定義
	if (window.opera || safari || konqueror || mozes) {
		xmlhttp.onload = function () { xhrCallback(xmlhttp, param, func); };
	} else {
		xmlhttp.onreadystatechange = function () { xhrCallback(xmlhttp, param, func); };
	}
	// XMLHTTP経由でPOST
	xmlhttp.send(par);
	delete xmlhttp;
}



/* -----------------------------------------------------
	XMLHTTPの結果を処理
----------------------------------------------------- */
function xhrCallback(xmlhttp) {
	if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
		response = xmlhttp.responseText;
		xmlhttp.abort();
		xmlhttp = null;
		// ログインしていない
		if (response.match(/^NO=([0-9]+)$/)) {
			// ログインステータス
			var st = RegExp.$1;
			// ログイン画面を表示
			showLoginPrompt(st);
		}
		// ログインOK
		else {
			// ログインダイアログが表示されていれば非表示にする
			if (login_dialog_flg) {
				disp_login_dialog(false);
			}
			// 待機ファンクションを取り出す
			var process = process_stack.shift();
			// 待機プロセスが残っていれば Ajax 通信に回す
			if (process_stack.length > 0) {
				var process_left = process_stack[0];
				doAjax(process_left.param, process_left.func, process_left.url, process_left.mode);
			}
			// 待機ファンクションを実行
			this[process.func](response);
		}
	}
}



/* -----------------------------------------------------
	XMLHTTPオブジェクト生成
----------------------------------------------------- */
function createXmlHttp() {
	if (window.XMLHttpRequest) { // IE7、Mozilla、Opera
		return new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		try { // IE6
			return new ActiveXObject('Msxml2.XMLHTTP');
		} catch (e) {
			try { // IE5.5
				return new ActiveXObject('Msxml2.XMLHTTP.3.0');
			} catch (e) {
				return null;
			}
		}
	} else {
		return null;
	}
}
/* -----------------------------------------------------
	POSTするパラメータの生成
----------------------------------------------------- */
function createParameter(param) {
	var arr = new Array();
	for (var key in param) {
		if ((typeof param[key] == 'object') && (param[key].constructor == Array)) {
			for (var i=0;i<param[key].length;i++) {
				arr.push(key + '[]=' + encodeURIComponent(param[key][i]));
			}
		} else {
			arr.push(key + '=' + encodeURIComponent(param[key]));
		}
	}
	var par = arr.join('&'); 
	return par;
}
/* -----------------------------------------------------
	イベント追加
	ブラウザ間の差異を吸収するためのラッパー
----------------------------------------------------- */
function addEvent(target,eventName,handlerName) {
	if ( target.attachEvent ) {
		target.attachEvent('on' + eventName, function(e){target[handlerName](e);});
	} else if ( target.addEventListener ) {
		target.addEventListener(eventName, function(e){target[handlerName](e);}, false);
	} else {
		var originalHandler = target['on' + eventName];
		if ( originalHandler ) {
			target['on' + eventName] = function(e){originalHandler(e);target[handlerName](e);};
		} else {
			target['on' + eventName] = target[handlerName];
		}
	}
}
function removeEvent(target,eventName,handlerName) {
	if (target.detachEvent) {
		target.detachEvent('on' + eventName, handlerName);
	} else if (target.removeEventListener) {
		target.removeEventListener(eventName, handlerName, false);
	} else {
		alert("Handler could not be removed");
	}
}

function removeEvent(target,eventName,handlerName) {
	if (target["_"+eventName]){
		for (var i in obj["_"+eventName]) {
			if (obj["_"+eventName][i]===handlerName) delete target["_"+eventName][i];
		}
	}
};


/* -----------------------------------------------------
	イベントバブルアップ停止
	ブラウザ間の差異を吸収するためのラッパー
----------------------------------------------------- */
function cancelEvent(evtObj){
	if (window.addEventListener) {
		evtObj.stopPropagation();
	} else {
		window.event.cancelBubble = true;
	}
}
/* -----------------------------------------------------
	子ノード全削除
----------------------------------------------------- */
function removeChildren(obj) {
	while(obj.hasChildNodes()){
		obj.removeChild(obj.firstChild);
	}
}
/* -----------------------------------------------------
	子ノード追加
----------------------------------------------------- */
function addChildren(val,text,elm,obj) {
	var opt = document.createElement(elm);
	opt.setAttribute('value',val);
	var txt = document.createTextNode(text);
	opt.appendChild(txt);
	obj.appendChild(opt);
}

/* -----------------------------------------------------
	document.getElementById() の拡張
	(prototype.js の いわゆる "dollar function")
----------------------------------------------------- */
function $() {
	var elements = new Array();
	for (var i=0;i<arguments.length;i++) {
		var element = arguments[i];
		if (typeof element=='string')
			element = document.getElementById(element);
		if (arguments.length==1)
			return element;
		elements.push(element);
	}
	return elements;
}

/* -----------------------------------------------------
	ログインダイアログ: ダイアログを表示
----------------------------------------------------- */
function showLoginPrompt(st, func) {
	// ログインダイアログが非表示なら表示する
	if (!login_dialog_flg) {
		var elment = find_coverd_element();
		var login_area_tag = document.createElement('div');
		login_area_tag.id = 'ajaxlogin_parent_tag';
		elment.appendChild(login_area_tag);
		$('ajaxlogin_parent_tag').innerHTML = login_dialog_tags;
		disp_login_dialog(true);
	}
	var msg;
	switch (st) {
		case '1': // ログイン失敗 => ID/PW不整合
			msg = 'ログインに失敗しました。';
			break;
		case '2':	// ＳＩＤ無し（未ログイン状態） => ログイン要求
			msg = 'ログインしてください。';
			break;
		case '4': // レベル足らず => 不正アクセス？
			msg = 'ログイン権限がありません。';
			break;
		case '5': // タイムアウト => ログイン要求
			msg = 'タイムアウトが発生しました。';
			break;
		case '9': // ページ情報ＤＢにデータなし => 設定ミス（ＯＫとするか要検討）
			msg = '管理者にお問い合わせください。';
			break;
		case '10':
			disp_login_dialog(false);
			break;
	};
	$('msg').innerHTML = msg;
}
/* ------------------------------------------------------------
	ログインダイアログ: ダイアログ表示・非表示切替
------------------------------------------------------------ */
function disp_login_dialog(flg){
	if (flg) {
		load_login_CSS('/login/ajax/login_js.css');
		// 黒の位置合わせ
		$('login_bg_transparent').style.display = 'block';
		// ログインボックスの位置合わせ
		$('login_dialog').style.display = 'block';
		login_dialog_flg = true;
		setTimeout('dialog_ini()',10);
		//ログインボタンのマウスオーバー処理
		login_btn_event();
	}
	else {// CSSファイルを削除
		for(var i=0;i<document.getElementsByTagName('link').length;i++){
			if (document.getElementsByTagName('link').item(i).href.indexOf('login_js.css')>-1) {
				document.getElementsByTagName('head').item(0).removeChild(document.getElementsByTagName('link').item(i));
			}
		}
		//描画を更新
		for(var i=0; i < document.getElementsByTagName('select').length; i++){
			document.getElementsByTagName('select').item(i).parentNode.innerHTML += '';
		}
		// ログインダイアログ一式を削除
		var elment = find_coverd_element();
		elment.removeChild($('ajaxlogin_parent_tag'));
		
		login_dialog_flg = false;

	}
}



/* ------------------------------------------------------------
	ログインボタンにマウスオーバーイベントを追加
------------------------------------------------------------ */
function login_btn_event(){
	if(msie){
		$('login_sub').onmouseover = function(){
			$('btn_login').style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="/login/img/btn_login_o.png", sizingMethod=crop);';
			
		}
		$('login_sub').onmouseout = function(){
			$('btn_login').style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="/login/img/btn_login.png", sizingMethod=crop);';
		}
	}
	else{
		$('login_sub').onmouseover = function(){
			$('btn_login').style.backgroundImage = 'url(/login/img/btn_login_o.png)';
			
		}
		$('login_sub').onmouseout = function(){
			$('btn_login').style.backgroundImage = 'url(/login/img/btn_login.png)';
		}
	}
}


/* ------------------------------------------------------------
	ログインダイアログ: 初期設定
------------------------------------------------------------ */
function dialog_ini(){
	if(login_dialog_flg){
		var elment = find_coverd_element();
		$('login_bg_transparent').style.height = elment.offsetHeight+'px';
		$('login_bg_transparent').style.top = -1+'px';
		$('login_dialog').style.top = Number((elment.offsetHeight/2)-($('login_dialog').offsetHeight/2))+'px';
		$('login_dialog').style.left = Number((elment.offsetWidth/2)-($('login_dialog').offsetWidth/2))+'px';
	}
}
function find_coverd_element(){
	if($('contents')){
		element = $('contents');
	}
	else if($('contents_area')){
		element = $('contents_area');
	}
	else{
		element = document.body;
	}
	return element;
}
/* ------------------------------------------------------------
	ログインダイアログ: CSS読込
------------------------------------------------------------ */
function load_login_CSS(url){
	//IE
	if(navigator.userAgent.match(/MSIE (\d\.\d+)/)) {
		document.createStyleSheet(url);
	}
	//mozilla
	else{
		var link = document.createElement('link');
		link.setAttribute('rel', 'stylesheet');
		link.setAttribute('href', '/login/ajax/login_js.css');
		link.setAttribute('type', 'text/css');
		document.getElementsByTagName('head')[0].appendChild(link);
	}
}
/* -----------------------------------------------------
	ログイン処理
----------------------------------------------------- */
function doLogin(id, passwd) {
	$('msg').innerHTML = '';

	// 一番古い待機プロセスを取得
	var process = process_stack[0];
	// POSTパラメータにID・パスワードを追加
	process.param.stb04id = id;
	process.param.stb04pw = passwd;

	// AJAX通信
	doAjax(process.param, process.func, process.url, process.mode);
}
/* -----------------------------------------------------
	文字列をevalして返す
----------------------------------------------------- */
function evalStr(str){
	eval('var ret = ' + str + ';');
	return ret;
}





/* -----------------------------------------------------
	XML
----------------------------------------------------- */
function doXml(str){
	xml = createXmlObject(str);
}
/* -----------------------------------------------------
	XSLT
----------------------------------------------------- */
function doXslt(str){
	xslt = createXmlObject(str);
	if (! xml) {
		// XML未取得
		setTimeout(function(){doXslt(str)}, 1000);
	}
	else {
		// XML取得済
		$('from_xml').innerHTML = xslTransform(xml, xslt).text;
	}
}
/* -----------------------------------------------------
	XMLをJSONに変換
----------------------------------------------------- */
function xmlToJson(str){
	xslt = createXmlObject(str);
	if (! xml) {
		// XML未取得
		setTimeout(function(){xmlToJson(str)}, 1000);
	}
	else {
		// XML取得済
		var s = xslTransform(xml, xslt);
		var xmlData = evalStr(s);
//		eval('var xmlData = {' + s + '};');
// alert(xmlData);
// alert(xmlData.document.name);
// $('from_xml').innerHTML = xmlData.text;
alert(xmlData.document.name);
	}
}




/* -----------------------------------------------------
	Ajax (ポーリング)
----------------------------------------------------- */
function doAjaxPoll(url, urlParam, func, funcParam) {
	// POSTするパラメータを生成
	var post = createParameter(urlParam);

	// ブラウザ判定用(もう少し整理できる?)
	var ua			= navigator.userAgent;
	var safari		= ua.indexOf('Safari')!=-1;
	var konqueror	= ua.indexOf('Konqueror')!=-1;
	var mozes		= ((a=navigator.userAgent.split('Gecko/')[1] )?a.split(' ')[0]:0) >= 20011128;

	// XMLHTTPオブジェクト生成
	var xmlhttppoll = createXmlHttp();
	xmlhttppoll.open('POST', url, true);
	xmlhttppoll.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	// コールバック関数を定義
	if (window.opera || safari || konqueror || mozes) {
		xmlhttppoll.onload = function () { xhrCallbackPoll(xmlhttppoll, urlParam, func, funcParam); };
	} else {
		xmlhttppoll.onreadystatechange = function () { xhrCallbackPoll(xmlhttppoll, urlParam, func, funcParam); };
	}
	// XMLHTTP経由でPOST
	xmlhttppoll.send(post);
	delete xmlhttppoll;
}
/* -----------------------------------------------------
	XMLHTTPの結果を処理
----------------------------------------------------- */
function xhrCallbackPoll(xmlhttp, urlParam, func, funcParam) {
	if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
		response = xmlhttp.responseText;
		xmlhttp.abort();
		xmlhttp = null;
		// ログインしていない
		if (response.match(/^NO=([0-9]+)$/)) {
			// ログインステータス
			var st = RegExp.$1;
			// ログイン画面を表示
			showLoginPrompt(st);
		}
		// ログインOK
		else {
			// ログインダイアログが表示されていれば非表示にする
			if (login_dialog_flg) {
				disp_login_dialog(false);
			}
/*
			// 待機ファンクションを取り出す
			var process = process_stack.shift();
			// 待機プロセスが残っていれば Ajax 通信に回す
			if (process_stack.length > 0) {
				var process_left = process_stack[0];
				doAjax(process_left.param, process_left.func, process_left.url, process_left.mode);
			}
			// 待機ファンクションを実行
			this[process.func](response);
*/
			this[func](response, funcParam);
		}
	}
}

