/**
 * スターマインヘルパ
 * VSS Path		:	$Archive: /typhoon/js/mgr/starminehelper.js $
 * Checkin		:	$Date: 08/10/31 18:18 $
 * Modify Date	:	$Modtime: 08/10/30 11:40 $
 * Author		:	$Author: Masumi $
 */
 
/*******************************/ 
String.prototype.trim = function() {
    return this.replace(/^[ ]+|[ ]+$/g, '');
}

/*******************************/ 
function StarmineHelper(){};

StarmineHelper = {
    Browser: {
        IE: !!(window.attachEvent && !window.opera),
        Opera:  !!window.opera,
        WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
        Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
        MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
    }
};

/**
フォーム内の指定した名前を持つPHP配列型のコントロール要素を取得します。
*/
StarmineHelper.getFormArrayElementsByName = function(formName, baseName)
{
    if (formName == null || formName == "" || baseName == null || baseName == "")
    {
        return null;
    }
    var form = document.forms[formName];
    if (form == null)
    {
        return null;
    }
    var elements = form.elements;
    var ary = StarmineHelper.findArrayElements(elements, baseName);
    
    return ary;
};

/**
エレメントが格納されたDOMから、指定した名前のPHP配列型の要素をすべて取得します。
*/
StarmineHelper.findArrayElements = function(elements, baseName)
{
    if (elements == null || baseName == null || baseName == '')
    {
        return null;
    }
    var pattern = new RegExp(baseName + "\\[.*\\]$", "i");
    var elemCnt = elements.length;
    var ary = new Array();
    var idx = 0;
    for (var i = 0; i < elemCnt; i++)
    {
        var ctl = elements[i];
        if (ctl.name == null || ctl.name.search(pattern) < 0)
        {
            continue;
        }
        ary[idx++] = ctl;
    }
    
    return ary;
};

/**
エレメントが格納されたDOMから、指定した名前のPHP配列型の要素を１つだけ取得します。
*/
StarmineHelper.getArrayFirstElement = function(elements, baseName)
{
    var ary = StarmineHelper.findArrayElements(elements, baseName);
    if (ary != null && ary.length > 0)
    {
        return ary[0];
    } else {
        return null;
    }
};

/**
チェックボックスグループのオン／オフを切り替えます。
@param checkGroupName xxx[0] のように、PHP配列型コントロールのベース名(xxx)を指定します。
@param state true/false を指定します。
@author 2008/10/21 Masumi.K 追加
*/
StarmineHelper.switchCheckBoxArray = function (formName, checkGroupName, state)
{
    if (formName == "" || checkGroupName == "")
    {
        return false;
    }
    try {
        var form = document.forms[formName];
        var items = StarmineHelper.findArrayElements(form.elements, checkGroupName);
        for (var i = 0; i < items.length; i++)
        {
            items[i].checked = state;
        }
    } catch (e) {
    }
    return true;
};

/**
コントロールの入力可能状態を切り替えます。
@param sw 有効にする場合は true
*/
StarmineHelper.setControlAccept = function(control, sw)
{
    if (control == null)
    {
        return;
    }
    if (sw == null)
    {
        sw = true;
    }
    try
    {
        control.disabled = !sw;
        control.readOnly = !sw;
    } catch (ex)
    {
    }    
};

/**
プルダウンで現在選択されている項目のTEXT情報を、テキストボックスにセットします。
@author  2008/10/21 追加
*/
//StarmineHelper.copyDropdownTextTo = function(form, dropdownName, textboxName)
//{
//    if (form == null || dropdownName == "" || textboxName == "")
//    {
//        return false;
//    }
//    var dropdown = form.elements[dropdownName];
//    var textbox = form.elements[textboxName];
//    if (dropdown == null || textbox == null)
//    {
//        return false;
//    }
//    //
//    try {    
//        var idx = dropdown.selectedIndex;
//        textbox.value = dropdown[idx].text;
//        
//        return true;
//    } catch (e) {
//        return false;
//    }
//};

/**
プルダウンで現在選択されている項目のTEXT情報を、テキストボックスにセットします。
プルダウンのVALUE値がない、または空欄のときはテキストボックスに空欄をセットします。
題4引数の文字より前を取り除きます。指定がない場合は全て返します。
@author Eguchi-T 2009/02/06 追加
*/
StarmineHelper.copyDropdownTextTo = function(form, dropdownName, textboxName, delimiter)
{
    if (form == null || dropdownName == "" || textboxName == "")
    {
        return false;
    }
    var dropdown = form.elements[dropdownName];
    var textbox = form.elements[textboxName];
    if (dropdown == null || textbox == null)
    {
        return false;
    }
    //
    try {
        var idx = dropdown.selectedIndex;
        var temp = textbox.value = dropdown[idx].text;
        var pointer = 0;
        if (delimiter)
        {
			pointer = dropdown[idx].text.indexOf(delimiter, 0) + 1;
        }
        if (dropdown[idx].value)
        {
			textbox.value = temp.substring(pointer);
		} else {
			textbox.value = "";
		}
        return true;
    } catch (e) {
        return false;
    }
};

/**
フィルタ用フォーム内のコントロール内容をクリアします。
@author 2008/10/21
*/
StarmineHelper.clearFileterFormControl = function(formName)
{
    if (formName == "")
    {
        return;
    }
    var form = document.forms[formName];
    if (form == null)
    {
        return;
    }
    //
    for (var i = 0; i < form.length; i++)
    {
        var elm = form.elements[i];
        switch (elm.type.toLowerCase())
        {
            case "text":
                elm.value = "";
                break;
            case "checkbox":
                elm.checked = false;
                break;
            case "select-one":
                if (elm.name.toLowerCase() != "pagerows" && elm.length > 0)
                {
                    elm.selectedIndex = 0;
                }
            default:
        }
    }
};

/**
一覧画面の全表示用のヘルパです。
条件をクリアして、フォームをサブミットします。
@author 2008/10/21
*/
StarmineHelper.viewAllList = function(formName)
{
    if (formName == "")
    {
        return false;
    }
    var form = document.forms[formName];
    if (form == null)
    {
        return false;
    }
    //
    StarmineHelper.clearFileterFormControl(formName);
    form.submit();
    
    return true;
};

/**
確認MSG表示後、データを削除するURLに遷移します。
@author 2008/10/21
*/
StarmineHelper.deleteCurrentData = function(url)
{
    if (url == null || url == "")
    {
        return false;
    }
    if (window.confirm('削除します。よろしいですか？'))
    {
        location.href = url;
    } else {
		return false;
    }
};

/**
確認後、フォーム内容をサブミットします。
@innerSubmit true: サブミット機能を持たないコントロールの場合、サブミットします。
*/
StarmineHelper.submitCurrentData = function(formName, submitBtnName, innerSubmit)
{
    var form = document.forms[formName];
    if (form == null)
    {
        return false;
    }
    var datamode = "";
    if (form.dm)
    {
        datamode = form.dm.value;
    }
    var msg = "";
    switch (datamode)
    {
        case "insert":
			// 200906/15 Eguchi-T ID:1714 食健様向けに修正
            // msg = "追加します。\nよろしいですか？";
            msg = "登録します。\nよろしいですか？";
            break;
        case "update":
            msg = "更新します。\nよろしいですか？";
            break;
        default:
            msg = "登録します。\nよろしいですか？";
            break;
    }
    if (window.confirm(msg) == false)
    {
        return false;
    }
    // サブミットボタンを無効に
    var submitButton = document.getElementById(submitBtnName);
    if (submitButton)
    {
        submitButton.style.visibility = "hidden";
    }
    // disabled になっているフォーム要素を有効に(でないと送信されない)
    for (var i = 0; i < form.elements.length; i++)
    {
        form.elements[i].disabled = false;
    }
    // サブミットします。
    if (innerSubmit == true)
    {
        form.submit();
    }
    
    return true;
};

/**
HTML内で指定されているBASEURLを取得し、引数と結合して返します。
@author 2009/01/30 Eguchi-T
*/
StarmineHelper.combineBaseUrl = function(url) {
	// for DOM LEVEL 3 Browser
	baseUri = document.baseURI;
	// for IE series
	if (baseUri == null || baseUri == "")
	{
		baseUri = document.baseUrl;
		// for IE/Opera series
		if (baseUri == null || baseUri == "")
		{
			elements = document.getElementsByTagName("base");
			baseUri = elements[0].href;
		}
	}
	
	 return baseUri + url;
};

/**
余分な小数部を切り捨てます。
*/
StarmineHelper.trimExtraDecimal = function(value, decimalLength)
{
    var str = value.toString();
    var idx = str.indexOf('.');
    if (idx >= 0)
    {
        var intStr = str.substr(0, idx);
        var decStr = str.substr(idx + 1);
        if (decStr.length > decimalLength)
        {
            decStr = decStr.substring(0, decimalLength);
        }
        str = intStr + '.' + decStr;
    }
    
    return str;
};

/**
小数部をフォーマットして取得します。
*/
StarmineHelper.formatDecimal = function(value, decimalLength)
{
    var str = value.toString();
    var idx = str.indexOf(".");
    var intStr = value;
    var decStr = "";
    if (idx >= 0)
    {
        intStr = str.substr(0, idx);
        decStr = str.substr(idx + 1);
    }
    if (decStr.length < decimalLength)
    {
        // 指定した長さまでゼロパディング
        var len = decimalLength - decStr.length;
        for (var i = 0; i < len; i++)
        {
            decStr = decStr + "0";
        }
    }
    
    return intStr + "." + decStr;
};

/**
文字列が時刻形式かどうかチェックします。
*/
StarmineHelper.isTime = function(text)
{
    if (text == null || text == '')
    {
        return false;
    }
    //
    var p = new RegExp("^([0-1]?[0-9]|[2][0-3]):([0-5][0-9])$");
    if (text.match(p))
    {
        return true;
    } else {
        return false;
    }
};

/**
文字列が日付形式かどうかチェックします。
書式は yyyy-mm-dd 型です。

@author 2009/04/17 Masumi.K
*/
StarmineHelper.isDate = function(text)
{
    if (text == undefined || text == null || !text.match(/^\d{4}\-\d{2}\-\d{2}$/))
    {
        return false;
    }
    var year = text.substr(0, 4) - 0;
    var month = text.substr(5, 2) - 1;
    var day = text.substr(8, 2) - 0;
    //
    if (month >= 0 && month <= 11 && day >= 1 && day <= 31)
    {
        var dt = new Date(year, month, day);
        if (isNaN(dt))
        {
            return false;
        } else if (dt.getFullYear() == year && dt.getMonth() == month && dt.getDate() == day) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
};

/**
２つの時刻の時間間隔を計算し、時間単位で返します。
時刻として認識できなかった場合は、0:00として計算されます。
*/
StarmineHelper.timeDiff = function (time1, time2)
{
    var t1 = time1;
    var t2 = time2;
    if (StarmineHelper.isTime(time1) == false)
    {
        t1 = '0:00';
    }
    if (StarmineHelper.isTime(time2) == false)
    {
        t2 = '0:00';
    }
    var stamp1 = Date.parse("1970/02/01 " + t1 + ":00");
    var stamp2 = Date.parse("1970/02/01 " + t2 + ":00");
    var diff = (stamp2 - stamp1) / (60 * 60 * 1000);
    
    return diff;
};

/** ファイルパスの最後の部分（ファイル名）を取得します。 */
StarmineHelper.getBaseFileName = function (path)
{
    idx = path.lastIndexOf("\\");
    if (idx < 0)
    {
        idx = path.lastIndexOf("/");
    }
    if (idx < 0)
    {
        return path;
    }
    return path.substring(idx + 1);
}

/** 
HTML実体参照に変換されている文字列を戻します。
*/
StarmineHelper.decodeHtmlSpecialChars = function(str) {
  str = str.replace(/&gt;/g, ">");
  str = str.replace(/&lt;/g, "<");
  str = str.replace(/&#039;/g, "'");
  str = str.replace(/&quot;/g, "\"");
  str = str.replace(/&amp;/g, "&");
  return str;
};

/**
指定したフィールドで並べ替えるよう、フォームをサブミットします。
*/
StarmineHelper.sortByColHeader = function (targetField, sortDir, formId)
{
    var form = document.forms[formId];
    form.q.value = targetField;
    form.s.value = sortDir;
    form.submit();    
};

/**
文字列を数値に変換します。
@author 2009/05/13 Masumi.K
*/
StarmineHelper.getSafeNumber = function (text, decimalDigits)
{
    if (text == null || text == "")
    {
        return 0;
    }
    if (isNaN(decimalDigits))
    {
        decimalDigits = 0;
    }
    text = text.toString();
    var dppos = text.indexOf(".", 0);
    var intText = "";
    var decText = "";
    // 整数部を抜き出し
    if (dppos < 0)
    {
        intText = text;
    } else {
        intText = text.substring(0, dppos);
        decText = text.substring(dppos, text.length);
    }
    // 符号を検出します。
    var valueSign = "";
    if (text.substr(0, 1) == "-")
    {
        valueSign = "-";
    }
    // 整数部を正規化します。
    intText = StarmineHelper.correctNumber(intText);
    // 小数部を正規化します。
    decText = StarmineHelper.correctNumber(decText);
    decText = StarmineHelper.trimExtraDecimal(decText, decimalDigits);
    // 数値として結合します。
    var result;
    if (decimalDigits > 0)
    {
        result = valueSign + intText + "." + decText;
        result = StarmineHelper.formatDecimal(result, decimalDigits);
    } else {
        result = valueSign + intText;
    }
    return result - 0;
};

/** 
数値を抜き出します 
@author 2009/05/13 Masumi.K
*/
StarmineHelper.correctNumber = function(text)
{
    if (text == null || text == "")
    {
        return "";
    }
    var matchText = text.match (/\d+/g);
    if (matchText == null)
    {
        return "";
    }
    var corrected = "";
    for (var i = 0; i < matchText.length; i++)
    {
        corrected += matchText[i];
    }
    
    return corrected;
};

/**
数値にカンマを入れます
@author 2009/05/15 Eguchi-T
*/
StarmineHelper.insertComma = function(sourceStr)
{
	/*
	var destStr = sourceStr;
	var tmpStr = "";
	try {
		while (destStr != (tmpStr = destStr.replace(/^([+-]?\d+)(\d\d\d)/,"$1,$2"))) {
			destStr = tmpStr;
		}
	} catch(e) { return sourceStr; }
	return destStr;
	*/
	var num = new String(sourceStr).replace(/,/g, "");
	while(num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
	return num;
};

/** 変数がブランクか判断します。 
引数が文字列でない場合は常に false が帰ります。
@author 2009/06/10 Masumi.K
@author 2009/06/15 Masumi.K データ型チェック処理追加。
*/
StarmineHelper.isBlank = function(value)
{
    if (typeof(value) == "string" || value instanceof String)
    {
        if (value == undefined || value == null || value.trim() == "")
        {
            return true;
        } else {
            return false;
        }
    } else if (value == undefined || value == null) {
        return true;
    }
    return false;
};
