//////////////////////////////////////////////////////////////////////
//                                                                  //
// ユニゾン共通                                                     //
//                                                                  //
// 　　　　　　　　　　　　　　　　　株式会社ユニゾンシステムズ     //
//                                                                  //
//                                                                  //
// Copyright (C) 2007. Unixon Systems Co.,Ltd. All Rights Reserved. //
//                                                                  //
//////////////////////////////////////////////////////////////////////


  // 共通：本日を返す
  function zGetToday()
  {
	var nowDate = new Date();
	return nowDate.getFullYear() * 10000 + (nowDate.getMonth()+1) * 100 + nowDate.getDate();
  }

  // 共通：現在時刻を返す
  function zGetNowHhmm()
  {
	var nowDate = new Date();
	return nowDate.getHours() * 100 + nowDate.getMinutes();
  }

  // 共通：指定日のｎ日後を返す
  function zYmdOpe(ymd, nDir)
  {
    var dd = new Date(Math.floor(ymd/10000), Math.floor(ymd/100%100)-1, ymd%100);
	dd.setTime(dd.getTime() + (nDir)*24*3600*1000);
	return dd.getFullYear() * 10000 + (dd.getMonth()+1) * 100 + dd.getDate();
  }

  // 共通：指定時刻のｎ分後を返す
  function zHhmmOpeTv(hhmm, width)
  {
  	var xxxx = Math.floor(hhmm / 100) *  60 + (hhmm % 100) + width;
  	return     Math.floor(xxxx /  60) * 100 + (xxxx %  60);
  }

  // 共通：指定時刻を秒に変換
  function zHms2Sec(hhmmss)
  {
  	  return Math.floor(hhmmss / 10000) *  3600 + (Math.floor(hhmmss / 100) % 100) * 60 + (hhmmss % 100);
  }
  
  // 共通：秒数を時刻に変換
  function zSec2Hms(sec)
  {
  	  return Math.floor(sec / 3600) * 10000 + Math.floor((sec % 3600) / 60) * 100 + (sec % 60);
  }
  
  // 共通：指定時刻の加減算
  function zHhmmssOpeTv(hhmmss1, hhmmss2)
  {
  	return zSec2Hms(zHms2Sec(hhmmss1) + zHms2Sec(hhmmss2));
  }

  // 共通：曜日を返す 月=1...日=7
  function zGetYobi(ymd)
  {
    var dd = new Date(Math.floor(ymd/10000), Math.floor(ymd/100%100)-1, ymd%100);
	var yobi = dd.getDay();
	if (yobi == 0)
	    yobi = 7;

	return yobi;
  }

  // 共通：指定日の週の月曜日を返す
  function zGetMonday(ymd)
  {
    var yobi = zGetYobi(ymd)
	if (yobi == 1)
	     return ymd;
	else return zYmdOpe(ymd, 1 - yobi);
  }

  // 共通：日付っぽい文字列データを年月日化する
  function zConvFuzzyYmd(sYmd, nArgHintYmd)
  {
	var nHintYmd = zGetToday();
	if (nArgHintYmd && nArgHintYmd != 0)
		nHintYmd = nArgHintYmd;

	var d1 = new Array("");
	
	var idx1=0;
	d1[idx1] = "";

	for (var k=0; k < sYmd.length; k++){
		var c = sYmd.substr(k, 1);
		if (c=="0" || c=="1" || c=="2" || c=="3" || c=="4" || c=="5" || c=="6" || c=="7" || c=="8" || c=="9"){
			// 数値
			d1[idx1] += c;
		}
		else{
			if (d1[idx1].length != 0){
				idx1++;
				d1[idx1] = "";
			}
		}
	}
	var nCnt = 0;
	for (var k=0; k < d1.length; k++){
		if (d1[k].length >= 1)
			nCnt++;
	}

	var yy = 0;
	var mm = 0;
	var dd = 0;

	if (1 == nCnt){
		// 区切り文字なし年月日
		var ymd = parseInt(d1[0], 10);
		yy = Math.floor(ymd / 10000);
		mm = Math.floor(ymd / 100) % 100;
		dd = ymd % 100;
		if ( 0 <= yy && yy <= 49) yy += 2000;
		if (50 <= yy && yy <= 99) yy += 1900;
	}
	else
	if (2 == nCnt){
		// 月日
		mm = parseInt(d1[0], 10);
		dd = parseInt(d1[1], 10);
		yy = Math.floor(nHintYmd / 10000);
		if (mm >= 7 && Math.floor(nHintYmd / 100) % 100 <= 6) yy--;
		if (mm <= 6 && Math.floor(nHintYmd / 100) % 100 >= 7) yy++;
	}
	else
	if (3 <= nCnt){
		// 年月日
		yy = parseInt(d1[0], 10);
		mm = parseInt(d1[1], 10);
		dd = parseInt(d1[2], 10);
		if ( 0 <= yy && yy <= 49) yy += 2000;
		if (50 <= yy && yy <= 99) yy += 1900;
	}

	return yy * 10000 + mm * 100 + dd;	
  }

  // 日付時刻文字列からＤＡＴＥを返す
  function getDateObjByStr(ymdhms)
  {
	var check = ymdhms.match(/^\d{14}$/);
	if (!check) return null;

	return new Date(parseInt(ymdhms.substr(0,4)), parseInt(ymdhms.substr( 4,2))-1, parseInt(ymdhms.substr( 6,2)),
					parseInt(ymdhms.substr(8,2)), parseInt(ymdhms.substr(10,2)),   parseInt(ymdhms.substr(12,2)));
  }
  
  // ＲＳＳ１形式日付からＤＡＴＥを返す
  function getDateObjByRss1(str)
  {
  	if (typeof(str) == "undefined" || str == null)
  		return str;
	//012345678901234567890
	//2009-06-21T09:57:24+09:00
	var date_y = str.substr(0,4);
	var date_m = str.substr(5,2);
	var date_d = str.substr(8,2);
	var time_h = str.substr(11,2);
	var time_m = str.substr(14,2);
	var time_s = str.substr(17,2);
	return new Date(date_y, date_m-1, date_d, time_h, time_m, time_s);
  }

  // ＲＳＳ２形式日付からＤＡＴＥを返す
  function getDateObjByRss2(str)
  {
    var me = { Jan:1, Feb:2, Mar:3, Apr:4, May:5, Jun:6, Jul:7, Aug:8, Sep:9, Oct:10, Nov:11, Dec:12 };
  	  
  	if (typeof(str) == "undefined" || str == null)
  		return str;

  	//0         1         2
	//0123456789012345678901234
	//Tue, 30 Jun 2009 15:20:00 +0900
	var date_y = str.substr(12,4);
	var date_m = str.substr(8,3);
	var date_d = str.substr(5,2);
	var time_h = str.substr(17,2);
	var time_m = str.substr(20,2);
	var time_s = str.substr(23,2);
	return new Date(date_y, me[date_m]-1, date_d, time_h, time_m, time_s);
  }

  // 共通：要素の位置を取得し、オブジェクトとして返す
  function getElementPosition(elem) {
	var obj = new Object();
	obj.x = elem.offsetLeft;
	obj.y = elem.offsetTop;

	while(elem.offsetParent) {
		elem = elem.offsetParent;
		obj.x += elem.offsetLeft;
		obj.y += elem.offsetTop;
	}
	return obj;
  }

	<!-- エレメントのＸ座標を取得 -->
	getElementPosX = function (e)
	{
		var x = 0;
		while(e) {
			x += e.offsetLeft;
			e = e.offsetParent;
		}
	　　return x;
	}
	
	<!-- エレメントのＹ座標を取得 -->
	getElementPosY = function (e)
	{
		var y = 0;
		while(e) {
			y += e.offsetTop;
			e = e.offsetParent;
		}
	　　return y;
	}
	
  var _broUxnCmn = (window.opera?4:(window.external?3:(window.controllers?1:(document.layers?2:0)))); 
  var _ie5UxnCmn = (navigator.appName.indexOf('Microsoft Internet Explorer')>=0 && document.getElementById)?1:0; 

  // 共通：要素の幅を取得
  function getElementWidth (ele){
	if (typeof(ele.offsetWidth) != "undefined" && ele.offsetWidth != 0) return ele.offsetWidth;
	if (_broUxnCmn==1||_broUxnCmn==4) return ele.offsetWidth;  
	if (_broUxnCmn==2) return ele.clip.width;
	if (_broUxnCmn==3) return _ie5UxnCmn ? ele.offsetWidth : ele.style.pixelWidth;
	return 0;
  }

  // 共通：要素の高さを取得
  function getElementHeight (ele){
	if (typeof(ele.offsetHeight) != "undefined" && ele.offsetHeight != 0) return ele.offsetHeight;
	if (_broUxnCmn==1||_broUxnCmn==4) return ele.offsetHeight;  
	if (_broUxnCmn==2) return ele.clip.height;
	if (_broUxnCmn==3) return _ie5UxnCmn ? ele.offsetHeight : ele.style.pixelHeight;
	return 0;
  }
  
  // 共通：スクロール位置の取得
  function getScrollTopY(){
	var scrollPos = 0;
	if (window.scrollY)
			scrollPos = window.scrollY;
	else	scrollPos = document.documentElement.scrollTop || document.body.scrollTop;
	return scrollPos;
  }

  // 共通：引数の解析
  var ARGV = new getArguments();

  function getArguments() {
    this.parameter = document.location.search.substring(1);
    var args  = this.parameter.split("&");
    var len   = args.length;
    for (var i = 0; i < len; i++) {
      var arr = args[i].split("=", 2);
      this[unescape(arr[0])] = arr[1];
    }
  }

  // 共通：ＸＭＬノード属性の取得
  function getXmlAttribute(XMLdata, attName)
  {
    if (XMLdata.attributes && XMLdata.attributes.length){
		for (var i=0; i < XMLdata.attributes.length; i++){
			if (XMLdata.attributes[i].name  == attName){
				return XMLdata.attributes[i].value;
			}
		}
	}
	return null;
  }

  // 共通：ＸＭＬエレメントの検索
  function findXmlFirstElement(XMLdata, nodeName, attName, attValue)
  {
	for (var i=0; i < XMLdata.childNodes.length; i++){
		if (XMLdata.childNodes[i].nodeName == nodeName){
			if (attName && attValue){
				var val = getXmlAttribute(XMLdata.childNodes[i], attName);
				if (val != null && val == attValue){
					return XMLdata.childNodes[i];
				}
			}
			else{
				return XMLdata.childNodes[i];
			}
		}
		if (XMLdata.childNodes[i].childNodes && XMLdata.childNodes[i].childNodes.length > 0){
			// 再帰呼出
			var res = findXmlFirstElement(XMLdata.childNodes[i], nodeName, attName, attValue);
			if (res)
				return res;
		}
	}
	return null;
  }

  // 共通：ＸＭＬエレメントの検索（配列版）
  function findXmlElement(XMLdata, nodeName, attName, attValue)
  {
	var arrData = new Array();

	for (var i=0; i < XMLdata.childNodes.length; i++){
		if (XMLdata.childNodes[i].nodeName == nodeName){
			if (attName && attValue){
				var val = getXmlAttribute(XMLdata.childNodes[i], attName);
				if (val != null && val == attValue){
					arrData.push(XMLdata.childNodes[i]);
				}
			}
			else{
				arrData.push(XMLdata.childNodes[i]);
			}
		}
		if (XMLdata.childNodes[i].childNodes && XMLdata.childNodes[i].childNodes.length > 0){
			// 再帰呼出
			var ans = findXmlElement(XMLdata.childNodes[i], nodeName, attName, attValue);
			if (ans != null)
				arrData = arrData.concat(ans);
		}
	}
	if (arrData.length > 0)
		   return arrData;
	else return null;
  }
  
  // 共通：ＸＭＬエレメントの検索（配列版）
  function findXmlElement2(XMLdata, nodeName, attName, attValue, attValue2)
  {
	var arrData = new Array();

	for (var i=0; i < XMLdata.childNodes.length; i++){
		if (XMLdata.childNodes[i].nodeName == nodeName){
			if (attName && attValue && attValue2){
				var val = getXmlAttribute(XMLdata.childNodes[i], attName);
				if (val != null && (val == attValue || val == attValue2)){
					arrData.push(XMLdata.childNodes[i]);
				}
			}
			else{
				arrData.push(XMLdata.childNodes[i]);
			}
		}
		if (XMLdata.childNodes[i].childNodes && XMLdata.childNodes[i].childNodes.length > 0){
			// 再帰呼出
			var ans = findXmlElement2(XMLdata.childNodes[i], nodeName, attName, attValue, attValue2);
			if (ans != null)
				arrData = arrData.concat(ans);
		}
	}
	if (arrData.length > 0)
		   return arrData;
	else return null;
  }

  // 共通：フラッシュプレイヤー	ＨＴＭＬ
  function createFlashHtml(width, height, movie, quality)
  {
	var html = 
			"<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0' width='" + width + "' height='" + height + "'>" +
			"<param name='movie' value='" + movie + "'>" +
			"<param name='quality' value='" + quality + "'>" +
			"<embed src='" + movie + "' quality='" + quality + "' pluginspage='http://www.macromedia.com/go/getflashplayer' type='application/x-shockwave-flash' width='" + width + "' height='" + height + "'></embed>" +
			"</object>";
	return html;
  }

  // 共通：フラッシュプレイヤーの埋め込み
  function writeFlash(width, height, movie, quality)
  {
	document.write(createFlashHtml(width, height, movie, quality));
  }
  
  // 共通：ＵＲＬ引数の分解
	function zGetUrlArg(url)
	{
	    var args0 = url.split("?");
	    var args  = args0[1].split("\&");
	    var len   = args.length;
		var h     = new Array();
	    for (var i = 0; i < len; i++) {
    		var arr = args[i].split("=", 2);
     		h[arr[0]] = arr[1];
    	}
		return h;
	}
	
	// 共通：クッキーの取得
	function zGetCookie(name) {
		var regexp = new RegExp('; ' + name + '(=([^;]*))?;'); // ←ここを変更
		var match  = ('; ' + document.cookie + ';').match(regexp);
		if (match) {
			return unescape(match[2]);
		}
		else {
			return null;
		}
	}

	// 共通：クッキーの保存
    function zSetCookie(name, value, expiredays){
        // 有効期限の日付
        var exdate = new Date();
		exdate.setTime(exdate.getTime() + (zNVL(expiredays,0))*24*3600*1000);
       var s = "";
        s += name + "=" + escape(value);
        s += (expiredays==null) ? "" : "; expires=" + exdate.toGMTString() + ";";
        // クッキーに保存
        document.cookie = s;
    }
	
	// 共通：クッキーのチェック
	function zCheckCookie(){
		var r = Math.random();
		zSetCookie("_checkCookie",r);
		return (zGetCookie("_checkCookie") == r)
	}

	// 共通：ログメッセージの出力
	function zWriteLog(message)
	{
  	  var obj = document.getElementById("logArea");
  	  if (obj){
			var nowDate = new Date();
			stump = "=== " + nowDate.getHours() + ":" + nowDate.getMinutes() + ":" + nowDate.getSeconds() + "." + 
							 nowDate.getMilliseconds() + " ===========<br>";
	  		message = message.replace("<", "&lt;");
	  		message = message.replace(">", "&gt;");
	  		obj.innerHTML += stump + message + "<br>";
  	  }
	}
	
	// 共通：ＮＶＬ
	function zNVL(val, nullVal)
	{
		if (typeof(val) == "undefined" || val == null)
				return nullVal;
		else	return val;
	}
	
	// 共通：ＮＶＬ２
	function zNVL2(val, notNullVal, nullVal)
	{
		if (typeof(val) == "undefined" || val == null)
				return nullVal;
		else	return notNullVal;
	}
	
	// 共通：トリム
	function zTrim(str)
	{
	  	if (typeof(str) == "undefined" || str == null)
	  		return str;
	  	
		return str.replace(/^\s+|\s+$/g, "");
	}
	
	// 共通：二点間の距離（ｍ）を求める（ヒュベニの距離計算式）
			// googleAPIでの計算とは誤差があるようです
	function zDistance(lat1, lng1, lat2, lng2)
	{
		var t1 = lat1 * Math.PI / 180;	// ラジアンに変換
		var g1 = lng1 * Math.PI / 180;
		var t2 = lat2 * Math.PI / 180;
		var g2 = lng2 * Math.PI / 180;
		var dp = Math.abs(t1 - t2); // 2点間の緯度差
		var dr = Math.abs(g1 - g2); // 2点間の経度差
		var p  = t1 + ((t2 - t1) / 2); // ２点の平均緯度
		var sp = Math.sin(p);
		var cp = Math.cos(p);
		var m  = 6335439 / Math.sqrt(Math.pow(1 - 0.006694 * Math.pow(sp, 2), 3));
		var n  = 6378137 / Math.sqrt(1 - 0.006694 * Math.pow(sp, 2));
		var dis= Math.sqrt(Math.pow(m * dp, 2) + Math.pow(n * cp * dr, 2));
		
		return dis;
	}
	
	// 共通：画面フェードアウト
	function zFadeout(obj, afterFunc)
	{
		var opa = obj.style.opacity;
		if (typeof(opa) == "undefined" || opa == null || opa == 0 || opa=="")
			opa = 1.0;
		var opa_start = opa;
		var tid = setInterval( 	function() {
									opa = opa - 0.1;
									if (opa > 0){
										obj.style.opacity = opa;
										obj.style.filter = 'alpha(opacity=' + (opa * 100) + ')';
									}
									else{
										obj.style.display = "none";
										obj.style.opacity = opa_start;
										clearInterval(tid);
										
										if (afterFunc){
											afterFunc(obj);
										}
									}
								}, 40);
	}
