﻿/**
 * DHTML date validation script for dd/mm/yyyy. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 */
// Declaring valid date character, minimum year and maximum year
var dtCh= "/";
var minYear=1900;
var maxYear=2100;
var TYPE_DATE = 'date';
var TYPE_NUMERIC = 'numeric';
var TYPE_EMAIL = 'email';

var m_errPleaseInputValue = 'Please input value';
var m_errPleaseInputValueLength = 'Please input value length = ';
var m_errPleaseInputNumeric = 'Input numeric data';
var m_errPleaseInputDate = 'Input date data (dd/mm/yyyy) - US format';
var m_infoPleaseInputDate = '* All date field must input in format dd/MM/yyyy for US only such as 01/12/2009';
var m_infoPleaseInpuEmail = 'Invalid email format';

function setLang(en){
    m_errPleaseInputValue = en ? 'Please input value' : 'กรุณาใส่ข้อมูล';
    m_errPleaseInputValueLength = en ? 'Please input value length = ' : 'กรุณาใส่ข้อมูลที่มีความยาวเป็น ';
    m_errPleaseInputNumeric = en ? 'Input numeric data' : 'กรุณาใส่ข้อมูลตัวเลข';    
    m_errPleaseInputDate = en ? 'Input date data (dd/mm/yyyy) - US format' : 'กรุณาใส่ข้อมูลวันที่ (dd/mm/yyyy) เป็นปีคริศศักราช'; 
    m_infoPleaseInputDate = en ? '* All date field must input in format dd/MM/yyyy for US only such as 01/12/2009' : '* ข้อมูลวันที่ให้ใส่ในรูปแบบ dd/MM/yyyy สำหรับปีคริศตศักราชเท่านั้น เช่น 01/12/2009';
    m_infoPleaseInpuEmail = en ? 'Invalid email format' : 'รูปแบบของอีเมล์ไม่ถูกต้อง';
}

function ValidatedControl(controlname, type, isRequired, len){
    this.controlName = controlname;
    this.type = type;
    this.len = len;
    this.isRequired = isRequired;   
}

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function IsNumeric(value){
	if (value == null)
		return false;

	if (value == "")
		return false;
		
    value = value.replace(',', '');
   
	if (isNaN(value)){
		return false;
	}

	return true;
}    

function isEmail(value){
    if (value == null)
        return false;
         
//    var status = false;     
    var emailRegEx = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
     if (value.search(emailRegEx) == -1) {
          return false;
          //alert("Please enter a valid email address.");
     }
     return true;
//     else if (document.myform.email1.value != document.myform.email2.value) {
//          alert("Email addresses do not match.  Please retype them to make sure they are the same.");
//     }
//     else {
//          alert("Woohoo!  The email address is in the correct format and they are the same.");
//          status = true;
//     }
//     return status;
}

function ErrorControl(control, bError, msg){
    if (bError == true){
        control.style.background = '#FFFFC0';
        control.title = msg; 
    }else{
        control.style.background = 'white';
        control.title = '' ;
    }
}

function ClearErrorControl(oDocument, controlNames){
    for ( i=0;i<controlNames.length;++i){
        try{
            var control = oDocument.getElementById(controlNames[i]);
            ErrorControl(control, false, '');
        }catch(err) {
            prompt('Err ' + err.message, controlNames[i]); 
        }                 
    }
}

function ValidateFields(oDocument, validatedControls){
    var bHasError = false;
    var controlFocused = null;
    for (i=0;i<validatedControls.length;++i){
		try{
			var controlError = false;
			var msg = new Array();
			var idxMsg = 0;
			var control = oDocument.getElementById(validatedControls[i].controlName);
			var isValueEmpty = control.value == null || trim(control.value) == '';
			control.value = (control.value == null ? '' : trim(control.value));
			// If not require field and value is empty, then continue next control
			if (validatedControls[i].isRequired == false){
				if (isValueEmpty){
				    if (validatedControls[i].type == TYPE_DATE){
				        control.title = m_infoPleaseInputDate;
				    }else if (validatedControls[i].type == TYPE_EMAIL){
				        control.title = m_infoPleaseInpuEmail;
				    }
					continue;
				}
			}else{
				if (isValueEmpty){
					controlError = true;
					msg[idxMsg++] = m_errPleaseInputValue; 
				}
			}
			if (validatedControls[i].len > 0){
				if (control.value.length != validatedControls[i].len){
					controlError = true;
					msg[idxMsg++] = m_errPleaseInputValueLength + validatedControls[i].len; 
				}                
			}
			switch (validatedControls[i].type){
				case TYPE_DATE:
					if (isDate(control.value) == false){
						controlError = true;
						msg[idxMsg++] =  m_errPleaseInputDate;
					}                 
					break; 
				case TYPE_NUMERIC:
					if (IsNumeric(control.value) == false){
						controlError = true;
						msg[idxMsg++] = m_errPleaseInputNumeric; 
					}
					break; 
				case TYPE_EMAIL:
				    if (isEmail(control.value) == false){
				        controlError = true;
				        msg[idxMsg++] = m_infoPleaseInpuEmail;
				    }
				    break;
			}
			if (controlError){
			    var msgStr = "";
			    for (x=0;x<msg.length;++x){
			        msgStr = msg[x];
			        if (x < msg.length-1){
			            msgStr += "\n";
			        } 
			    } 
				ErrorControl(control, true, msgStr);
				bHasError = true;
				if (controlFocused == null){
				    if (control.style.visibility != 'hidden'){
				        controlFocused = control;
				    }
				}
			}else{
				ErrorControl(control, false, '');
			}
		} catch(Err){
			alert(validatedControls[i].controlName + '\n' + Err.message);
		}
	}
	
	if (controlFocused != null){
	    controlFocused.focus();
	}
    return bHasError; 
}

function ValidateDateField(oDocument, controlNames){
    for ( i=0;i<controlNames.length;++i){
        try{
            var control = oDocument.getElementById(controlNames[i]);
            if (control.value == null || control.value == ''){
                ErrorControl(control, false, ''); 
                continue; 
            }
            if (isDate(control.value) == false){
                ErrorControl(control, true, 'Input date data (dd/mm/yyyy)'); 
            } else{
                ErrorControl(control, false, ''); 
            } 
        }catch(err) {
            prompt('Can not get date object', controlNames[i]); 
        }                 
    }
}

function ValidateNumericField(oDocument, controlNames){
    for (i=0;i<controlNames.length;++i){
        try{
            var control = document.getElementById(controlNames[i]);
            if (control.value == null || control.value == ''){
                ErrorControl(control, false, ''); 
                continue; 
            }
            if (IsNumeric(control.value) == false){
                ErrorControl(control, true, 'Input numeric data'); 
                bError = true;
            } else{
                ErrorControl(control, false, ''); 
            } 
        }catch(err) {
            prompt('Can not get object', controlNames[i]); 
        } 
    }
}
      
function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function isDate(dtStr){
	var daysInMonth = DaysArray(12);
	var pos1=dtStr.indexOf(dtCh);
	var pos2=dtStr.indexOf(dtCh,pos1+1);
	var strDay=dtStr.substring(0,pos1);
	var strMonth=dtStr.substring(pos1+1,pos2);
	var strYear=dtStr.substring(pos2+1);
	strYr=strYear;
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1);
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1);
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1);
	}
	month=parseInt(strMonth);
	day=parseInt(strDay);
	year=parseInt(strYr);
	if (pos1==-1 || pos2==-1){
		//alert("The date format should be : dd/mm/yyyy")
		return false;
	}
	if (strMonth.length<1 || month<1 || month>12){
		//alert("Please enter a valid month")
		return false;
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		//alert("Please enter a valid day")
		return false;
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		//alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
		return false;
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		//alert("Please enter a valid date")
		return false;
	}
return true;
}

function trim(str) {
    var chars = ' ';
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}



