///////////////////////////////////////////////////////////////////////////////////
/*
	Basic string funtions
*/
function trim(value) {
	return value.replace(/^\s+|\s+$/g, '') ;
}

///////////////////////////////////////////////////////////////////////////////////
/*
	Basic "is" functions
*/

function isEmpty(value) {
	var trimmed = trim(value);
	return ((trimmed == null) || (trimmed.length == 0));
}

function isDigit(character) {
	return ((character >= "0") && (character <= "9"));
}

function isAlphabet(character) {
	return (((character >= "a") && (character <= "z")) || ((character >= "A") && (character <= "Z")));
}

function isAlphanumeric(character) {
	return (isDigit(character) || isAlphabet(character));
}

function isInteger(value) {
	var character;
	for (var i=0; i < value.length; i++) {
		character = value.charAt(i);
		if (!isDigit(character))
			return false;
	}
	return true;
}

function isAllAlphabet(value) {
	var character;
	for (var i=0; i < value.length; i++) {
		character = value.charAt(i);
		if (!isAlphabet(character))
			return false;
	}
	return true;
}

function isAllAlphanumeric(value) {
	var character;
	for (var i=0; i < value.length; i++) {
		character = value.charAt(i);
		if (!isAlphanumeric(character))
			return false;
	}
	return true;
}

function isDate(iYear, iMonth, iDate) {
	var checkDate = new Date();

	checkDate.setFullYear(iYear, iMonth-1, iDate);
	if (iYear == checkDate.getFullYear() &&
		iMonth == checkDate.getMonth()+1 &&
		iDate == checkDate.getDate()) {
			return true;
	} else {
		return false;
	}
}

///////////////////////////////////////////////////////////////////////////////////
/*
	Textbox
*/

// Number of characters in textbox
function numOfChar(objTextbox) {
	var trimmed = trim(objTextbox.value) ;
	if (trimmed == null)
		return 0
	else
		return objTextbox.value.length;
}

// Number of byte of Unicode characters in textbox (Within ASCII is 1 byte, others are 2 bytes)
function numOfByteUnicode(objTextbox) {
    // Return number of bytes (in Unicode)
    String.prototype.Blength = function() {
        var arr = this.match(/[^\x00-\xff]/ig);
        return  arr == null ? this.length : this.length + arr.length;
    }

	var trimmed = trim(objTextbox.value) ;
	if (trimmed == null)
		return 0
	else
		return objTextbox.value.Blength();
}

// Empty Textbox
function checkTextboxEmpty(objTextbox, textboxName) {
	if (isEmpty(objTextbox.value)) {
		alert("請填寫\""+textboxName+"\"。");
		objTextbox.focus();
		return false;
	}
	else {
		return true;
	}
}

// Check Textbox Character

// Check Textbox Integer
//
// "DC" - Don't Care
//
// numOfDigit = "DC"
// min = "DC"
// max = "DC"
function checkTextbox(objTextbox, textboxName, minNumOfChar, maxNumOfChar) {
	var numChar = numOfChar(objTextbox);

	if (numChar < minNumOfChar || numChar > maxNumOfChar) {
		alert("\""+textboxName+"\"必須填寫"+minNumOfChar+"到"+maxNumOfChar+"個英文字母, 數字或符號。");
		objTextbox.focus();
		return false;
	}
	else {
		return true;
	}
}

function checkTextboxUnicode(objTextbox, textboxName, maxNumOfByte) {
	var numByte = numOfByteUnicode(objTextbox);

	if (numByte > maxNumOfByte) {
        alert("\""+textboxName+"\"必須填寫不多於"+Math.floor((maxNumOfByte/2))+"個中文字或"+maxNumOfByte+"個英文字母, 數字或符號。");
		objTextbox.focus();
		return false;
	}
	else {
		return true;
	}
}

function checkTextboxInteger(objTextbox, textboxName, needValue, numOfDigit, min, max) {
							// (numOfDigit, min, max) can be "DC" - Don't Care
	var isIntegerInRange = false;
	var value = objTextbox.value;

	// Check number of digits
	if (numOfDigit == "DC") {
		if (needValue) {
			if (isEmpty(value)) {
				alert("\""+textboxName+"\"必須填寫。");
				objTextbox.focus();
				return false;
			}
		}
	}
	else {
		if (numOfChar(objTextbox) != numOfDigit) {
			alert("\""+textboxName+"\"必須為"+numOfDigit+"位數字。");
			objTextbox.focus();
			return false;
		}
	}

	// Is integer
	if (isInteger(value)) {
		// Check minimum and maxium
		if ((min != "DC" && parseInt(value, 10) < min) ||
			(max != "DC" && parseInt(value, 10) > max)) {
				isIntegerInRange = false;
		}
		else {
			isIntegerInRange = true;
		}
	}

	if (!isIntegerInRange) {
		var msg = "";
		if (min == "DC" && max == "DC") {
			msg = "輸入\""+textboxName+"\"的數字必須為"+numOfDigit+"位";
		}
		else {
			msg = "輸入\""+textboxName+"\"的數字必須";
			if (min != "DC") msg += "大過或等於" + min;
			if (min != "DC" && max != "DC") msg += "及";
			if (max != "DC") msg += "少過或等於" + max;
		}

		alert(msg+"。");
		objTextbox.focus();
		return false;
	}
	else {
		return true;
	}
}

function checkTextboxAlphabet(objTextbox, textboxName, minNumOfChar, maxNumOfChar) {
	var value = objTextbox.value;
	var numChar = numOfChar(objTextbox);
	var msg = "\""+textboxName+"\"必須為字母。";

	// Check number of characters
	if (numChar < minNumOfChar || numChar > maxNumOfChar) {
		if (minNumOfChar == maxNumOfChar) {
			alert("\""+textboxName+"\"必須填寫"+minNumOfChar+"個英文字母。");
		}
		else {
			alert("\""+textboxName+"\"必須填寫"+minNumOfChar+"到"+maxNumOfChar+"個英文字母。");
		}
		objTextbox.focus();
		return false;
	}

	// Check Alphabet
	if (minNumOfChar > 0) {
		if (isAllAlphabet(value)) {
			return true;
		}
		else {
			alert(msg);
			objTextbox.focus();
			return false;
		}
	}
	else {
		return true;
	}
}

function checkTextboxAlphanumeric(objTextbox, textboxName, minNumOfChar, maxNumOfChar) {
	var value = objTextbox.value;
	var numChar = numOfChar(objTextbox);
	var msg = "\""+textboxName+"\"必須為字母或數字。";

	// Check number of characters
	if (numChar < minNumOfChar || numChar > maxNumOfChar) {
		if (minNumOfChar == maxNumOfChar) {
			alert("\""+textboxName+"\"必須填寫"+minNumOfChar+"個英文字母或數字。");
		}
		else {
			alert("\""+textboxName+"\"必須填寫"+minNumOfChar+"到"+maxNumOfChar+"個英文字母或數字。");
		}
		objTextbox.focus();
		return false;
	}

	// Check Alphabet
	if (minNumOfChar > 0) {
		if (isAllAlphanumeric(value)) {
			return true;
		}
		else {
			alert(msg);
			objTextbox.focus();
			return false;
		}
	}
	else {
		return true;
	}
}

function checkDateYMD(objTextbox, textboxName) {
	var YMD = objTextbox.value.split("-");

	if (YMD[0] != null && YMD[1] != null && YMD[2] != null &&	// Not Null
		YMD[0].length == 4 && YMD[1].length <= 2 && YMD[2].length <= 2 &&	// Length 4-2-2
		isDate(YMD[0], YMD[1], YMD[2]) ) {	// isDate
			return true;
	}
	else {
		alert("\""+textboxName+"\"格式應為\"YYYY-MM-DD\"。");
		objTextbox.focus();
		return false;
	}
}

function checkDateDMY(objTextbox, textboxName) {
	var DMY = objTextbox.value.split("\/");

	if (DMY[0] != null && DMY[1] != null && DMY[2] != null &&	// Not Null
		DMY[0].length <= 2 && DMY[1].length <= 2 && DMY[2].length == 4 &&	// Length 2/2/4
		isDate(DMY[2], DMY[1], DMY[0]) ) {	// isDate
			return true;
	}
	else {
		alert("\""+textboxName+"\"格式應為\"DD\/MM\/YYYY\"。");
		objTextbox.focus();
		return false;
	}
}

function checkDateRangeYMD(objStartDateTextbox, startDateTextboxName, objEndDateTextbox, endDateTextboxName, dateRangeMinDays, maxDaysFromToday) {
    var today = new Date();
    var startDate = new Date();
    var endDate = new Date();
    var minDate = new Date();
    var maxDate = new Date();
    var startDateArray;
    var endDateArray;

    // Max date from today
    maxDate.setFullYear(today.getFullYear(), today.getMonth(), today.getDate() + maxDaysFromToday);
    if (checkDateYMD(objStartDateTextbox, startDateTextboxName)) {
        if (objStartDateTextbox==objEndDateTextbox || checkDateYMD(objEndDateTextbox, endDateTextboxName)) {
            startDateArray = objStartDateTextbox.value.split("-");
            endDateArray = objEndDateTextbox.value.split("-");
            startDate.setFullYear(startDateArray[0], startDateArray[1]-1, startDateArray[2]);
            endDate.setFullYear(endDateArray[0], endDateArray[1]-1, endDateArray[2]);
            // Min date from startDate
            minDate.setFullYear(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + dateRangeMinDays - 1);
            // Today or later
            if (startDate < today) {
                alert("\""+startDateTextboxName+"\"必須為今日或之後。");
                objStartDateTextbox.focus();
                return false;
            }
            // End date must same day or later than start date
            if (endDate < startDate) {
                alert("\""+endDateTextboxName+"\"不能早於\""+startDateTextboxName+"\"。");
                objEndDateTextbox.focus();
                return false;
            }
            // Date range more than minimum days
            if (endDate < minDate) {
                alert("日期範圍最少要橫跨"+dateRangeMinDays+"日。");
                objEndDateTextbox.focus();
                return false;
            }
            // End date less than or equal to Max Date
            if (endDate > maxDate) {
                alert("\""+endDateTextboxName+"\"必須在"+maxDaysFromToday+"日之內。");
                objEndDateTextbox.focus();
                return false;
            }
            return true;
        }
    }
    return false;
}

function checkDateRange(minDate, maxDate, maxDays, name) {
    var today = new Date();
    var minDateR = new Date();
    var maxDateR = new Date();
    var minDateRplusMaxDays = new Date();
    var minDateArray = minDate.split("-");
    var maxDateArray = maxDate.split("-");

    minDateR.setFullYear(minDateArray[0], minDateArray[1]-1, minDateArray[2]);
    maxDateR.setFullYear(maxDateArray[0], maxDateArray[1]-1, maxDateArray[2]);
    minDateRplusMaxDays.setFullYear(minDateR.getFullYear(), minDateR.getMonth(), minDateR.getDate()+maxDays-1);
   
    if(minDateR < today) {
        alert(name+"必須為今日或之後。");
        return false;
    }
    if(minDateRplusMaxDays < maxDateR) {
        alert("你所選擇的日期範圍:"+ minDate+"至"+maxDate+"已橫跨多於"+maxDays+"日，請修改\""+name+"\"。");
        return false;
    }
    return true;
}


function checkEmailAddress(objTextbox, textboxName, needValue) {
	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	var value = objTextbox.value;

	if (needValue) {	// Not allow empty
		if (isEmpty(value)) {
			alert("\""+textboxName+"\"必須填寫。");
			objTextbox.focus();
			return false;
		}
	}
	else {	// Allow empty
		if (isEmpty(value)) {
			return true;
		}
	}

	if (!reg.test(value)) {
		alert("\""+textboxName+"\"的格式錯誤。");
        objTextbox.focus();
		return false;
	}
	else {
		return true;
	}
}

///////////////////////////////////////////////////////////////////////////////////
/*
	Selection Box
*/

// Simply get selection value
function getSelectionValue(objSelection) {
	for (var i=0; i<objSelection.length; i++) {
		if (objSelection[i].selected == true) {
			return objSelection[i].value;
		}
	}
	return "";
}

function checkSelection(objSelection, selectionBoxName, dataStartFrom) {
	if (objSelection.options.selectedIndex < dataStartFrom) {
		alert("請在\""+selectionBoxName+"\"中選擇一個項目。");
		objSelection.focus();
		return false;
	}
	else {
		return true;
	}
}

///////////////////////////////////////////////////////////////////////////////////
/*
	Radio Button
*/

// Simply get radio value
function getRadioValue(objRadio) {
	for (var i=0; i<objRadio.length; i++) {
		if (objRadio[i].checked == true) {
			return objRadio[i].value;
		}
	}
	return "";
}

function checkRadio(objRadio, radioName) {
	if (getRadioValue(objRadio) == "") {
		alert("請在\""+radioName+"\"中選擇一個項目。");
		objRadio[0].focus();
		return false;
	}
	else {
		return true;
	}
}

///////////////////////////////////////////////////////////////////////////////////
/*
	Checkbox
*/

// Simply get checkbox value
function getCheckboxValue(objCheckbox) {
	var outputValue = "";
	for (var i=0; i<objCheckbox.length; i++) {
		if (objCheckbox[i].checked == true) {
			outputValue += "," + objCheckbox[i].value;
		}
	}
	return outputValue.substring(1);
}

function checkCheckbox(objCheckbox, checkboxName) {
	var anyoneChecked = false;
	for (var i=0; i<objCheckbox.length; i++) {
		if (objCheckbox[i].checked == true) {
			anyoneChecked = true;
		}
	}

	if (anyoneChecked) {
		return true;
	}
	else {
		alert("請在\""+checkboxName+"\"中選擇最少一個項目。");
		objCheckbox[0].focus();
		return false;
	}
}
