// this function returns TRUE if a string contains only white space characters.
function isblank(s)
{
    s = s.toString();

    for (var i=0; i<s.length; i++)
    {
	var c = s.charAt(i);
	if ((c != ' ' && c != '\n' && c != '\t')) return false;
    }
    return true;
}

// this function returns TRUE if a string contains only numeric digits
function isdigit(s)
{
    s = s.toString();
    for (var i=0; i<s.length; i++)
    {
	var digit = s.charAt(i);
	if (digit < "0" || digit > "9") return false;
    }
    return true;
}

// this function returns TRUE if a string contains only alphabets in upper/lower cases
function isalpha(s)
{
    for (var i=0; i<s.length; i++)
    {
	var Char = s.charAt(i);
	if ((Char < "a" || Char > "z") && (Char < "A" || Char > "Z")) return false;
    }
    return true;
}

// this function returns TRUE if a string represents a valid date
function isDate(d)
{
    if (isdigit(d) == false)
	return false;
    if (d.length != 8)
	return false;

    var year = parseInt(d.substring(0,4),10);
    var month = parseInt(d.substring(4,6),10);
    var day = parseInt(d.substring(6,8),10);

    if (month <= 0 || month > 12)
	return false;

    if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && (day <= 0 || day > 31))
	return false;

    if ((month == 4 || month == 6 || month == 9 || month == 11) && (day <= 0 || day > 30))
	return false;

    if (month == 2)
    {
	if (day <= 0 || day > 29)
	return false;
	if (day > 28)
	{
	    if (year % 4 != 0 || ((year % 100) == 0 && (year % 400) != 0))
		return false;
	}
    }
    return true;
}

// this function return TRUE if the date is a future date
function isFutureDate(d)
{
    if (isdigit(d) == false)
	return false;
    if (d.length != 8)
	return false;

    var year = parseInt(d.substring(0,4),10);
    var month = parseInt(d.substring(4,6),10);
    var day = parseInt(d.substring(6,8),10);

    var today = new Date();
    var today_mm = (today.getMonth()+1).toString();
    var today_dd = (today.getDate()).toString();
    var today_yyyy = (today.getFullYear()).toString();
    if (today_mm.length==1) today_mm = "0" + today_mm;
    if (today_dd.length==1) today_dd = "0" + today_dd;

    var lowerbound = parseInt(today_yyyy+""+today_mm+today_dd,10); // today 
    var iDate = parseInt(d,10);

    if (iDate < lowerbound)
	return false;
    else
	return true;
}


// this function return TRUE if email represents a valid email format
function isEmail(email) 
{
    // valid format "a@b.cd"
    invalidChars = " /;,:{}[]|*%$#!()`<>?";
    if (email == "") 
    {
	return false;
    }
    for (i=0; i< invalidChars.length; i++)
    {
	badChar = invalidChars.charAt(i)
	if (email.indexOf(badChar,0) > -1)
	{
	    return false;
	}
    }
    atPos = email.indexOf("@",1)
    // there must be one "@" symbol
    if (atPos == -1)
    {
	return false;
    }

    if (email.indexOf("@", atPos+1) != -1)
    {
    // and only one "@" symbol
	return false;
    }

    periodPos = email.indexOf(".",atPos)
    if(periodPos == -1)
    {
	// and at least one "." after the "@"
	return false;
    }

    if ( atPos +2 > periodPos)
    // and at least one character between "@" and "."
    {
	return false;
    }

    if ( periodPos +3 > email.length)
    {
	return false;
    }
    return true;
}

// this function return TRUE if a radio button has been clicked
function isRadioChecked(obj)
{
    for (var index =0; index < obj.length; index++)
	if (obj[index].checked)
	    return true
    return false
}

function getRadioCheckedIndex(obj)
{
    for (var index =0; index < obj.length; index++)
	if (obj[index].checked)
	    return index
    return (-1)
}

// this function returns TRUE if an option list has been selected
function isSelected(obj)
{
    if(obj.selectedIndex < 0) return false
    return true 
}

// this function returns TRUE if the date in mm/dd/yyyy represents a valid date
function isValidDate(dateStr)
{
    var rtn = false;
//    var unit = dateStr.split('/');
    var unit = dateStr.split('-');

    if (dateStr.length < 11 && unit.length == 3) {
//	var m = unit[0] - 1;
//	var d = unit[1];
	var d = unit[0];
	var m = unit[1] - 1;
	var y = unit[2];

	var tempDate = new Date(y, m, d);

	if (! isNaN(tempDate) && tempDate.getMonth() == m) {
	    rtn = true;
	}
    }

    return rtn;
}

function isEmpty(s)
{
    s = trim(s);

    return(s == null || s.length <= 0);
}
 
function trim(s)
{
    var result = '';
    var i, len;

    if (s == null)
	return(s);

    len = s.length;

    for (i = 0; i < len; i++) {
	if (s.charAt(i) != ' ')
	    break;
    }

    result = s.substring(i, len);
    len = result.length;

    for (i = len - 1; i >= 0; i--) {
	if (result.charAt(i) != ' ')
	    break;
    }

    s = result.substring(0, i + 1);

    return(s);
}

function isValidCreditCard(n1, n2, n3, n4)
{
    return(n1 != null && n2 != null && n3 != null && n4 != null &&
	n1.length == 4 && n2.length == 4 &&
	n3.length == 4 && n4.length == 4 &&
	isdigit(n1) && isdigit(n2) && isdigit(n3) && isdigit(n4));
}
 
function addLeadingZero(str, strlen) {
    var rs=str;

    while (rs.length < strlen)
	rs = "0" + rs;
    return rs;
}

function combineDateFields(form, y,m,d)
{
    var date = addLeadingZero(form[m].value, 2)+"/";
    date += addLeadingZero(form[d].value, 2)+"/";
    date += addLeadingZero(form[y].value, 4);
    return date;
}

function combineDateFields1(form, y,m,d)
{
 var date = addLeadingZero(form[y].value, 4);
 date += addLeadingZero(form[m].value, 2);
 date += addLeadingZero(form[d].value, 2);
 return date;
}
 
function checkdob(tf, b, d, flag) 
{
// tf = year in format YYYY, type string or number
// b = month in format MM, type string or number
// d = date in format DD, type string or number
// flag is a boolean value [0/1], 
//      0=use client clock as reference date, 
//      1=use hard print hidden field values
// hidden fields name, 
//    current year="current_year" in YYYY format,
//   current month= "current_month" in MM format,
//    current date= "current_date" in DD format.
//
 
        var err=0
 var UPPER_BOUND = 0;
 var MAX = 66;
 
if ( flag == 1 ) {
        var year = parseInt(document.form[0].current_year.value);
        var currdate= parseInt(document.form[0].current_date.value);
        var currmonth= parseInt(document.form[0].current_month.value);
} else { 
        var today = new Date()
        var year = today.getFullYear()
        var currdate = today.getDate()
        var currmonth = today.getMonth() + 1
}
 
        var curryear=0
 curryear = year
        //b = f.dobmm[document.appform.dobmm.selectedIndex].value
        //d = f.dobdd.value
        //tf = f.dobyyyy.value 
 
 d = parseInt(d, 10)
 b = parseInt(b, 10)
 f = parseInt(tf, 10)
 UPPER_BOUND = curryear - MAX ;
 
        if (f < UPPER_BOUND) {
               err =7 
        }
        else {
           if ( (!isNaN(d)) && (!isNaN(f)) ) {
                if (b<1 || b>12)        err = 1
                if (d<1 || d>31)        err = 1
                if (f<0 || f > curryear )   err = 2   
                if (f>0 && f > curryear-18 && f<curryear ) {
    err = 6; // alert("1"); 
  }
                if (f == curryear-18 ) {
                   if (b > currmonth)  {               
                         err = 6         
                   } else {
                        if (b == currmonth && d > currdate ) {   
                              err = 6      
                        }
                   }
                }
                if (f== UPPER_BOUND ) { 
                   if ( b < currmonth ) { 
                     err = 7 
                   } else {
                    if ( b==currmonth && d < currdate )  err = 7                     
                   }
                }
                if ( (b==4 || b==6 || b==9 || b==11) && (d > 30) ) {
                       err=1 
                }
                if ( b==2 ) {
                        var g=parseInt(f/4, 10)
                        if (isNaN(g)) { err=1 }
                        if (d>29) err=1
                        if (d==29 && ((f/4)!=parseInt(f/4, 10)))  err=1 
                }                                         
               
           } else { err = 1 }
        }
        if (err==1) {
                // alert("This is NOT a valid Birthday Date! Please enter in format (MM/DD/YYYY).\n")
          alert("生日日期無效, 請依照 (日/月/年) 之格式填寫");
         
        } else {
           if ( err == 2 || err == 5 ) {
                // alert("Wrong is your birthday year! Please enter in format (DD/MM/YYYY).\n")
              alert("生日日期之年份無效, 請依照 (日/月/年) 之格式填寫");
         
           } else {
                 if (err == 6) {
                      // alert("Applicant must be over 18 years old.\n")
                      alert("申請人之年齡必須為十八歲或以上");
                 }
           } 
        } 
        if  ( err == 7) { 
    alert("Applicant is over 65 years old.\n申請人之年齡超過65歲");
 }
        if ( err == 0 )  { 
         return true } 
        else return false 
}
 

function getAge(d, a)
{
 var today = new Date();
 var dy = today.getFullYear() - d.getFullYear();
 var dm = today.getMonth()+1 - d.getMonth();
 var dd = today.getDate() - d.getDate();
 
 if (dy < 0 || (dy == 0 && dm < 0) || (dy == 0 && dm == 0 && dd <= 0) ) // error case
 {
  a[0] = -1;
  a[1] = -1;
 }
 if ((dm < 0) || (dm == 0 && dd < 0))
 {
  dy--;
 }
 a[0] = dy;
 if (dy == 0)
 {
  if (dm == 0)
  {
   a[1] = 0;
  } else if (dm > 0) {
   if (dd < 0)
    dm--;
   a[1] = dm;
  }
 }
 
 return dy;
}
//-->
 

function agelimit(currDay, currMonth, currYear, dDay, dMonth, dYear, upperLimit, lowerLimit)
{
   currDay=parseInt(currDay, 10);
   currMonth=parseInt(currMonth, 10);
   currYear=parseInt(currYear, 10);
   dDay=parseInt(dDay, 10);
   dMonth=parseInt(dMonth, 10);
   dYear=parseInt(dYear, 10);
   upperLimit=parseInt(upperLimit,10);
   lowerLimit=parseInt(lowerLimit,10);
 
   var endDate=10000*(currYear-lowerLimit+1) + 100*currMonth + currDay;
   var startDate=10000*(currYear-upperLimit-1) + 100*currMonth + currDay;
   var dob=10000*dYear + 100*dMonth + dDay;
   if(dob >startDate && dob <=endDate)
      return true;
   return false;
}
 
// validate and format HKID
// input: HKID in any format
// output: return formatted hkid if valid, return false if invalid
// e.g. a1234567, A1234567, a123456 (7), a123456(7) --> A123456(7)
function formatHKID(input_hkid)
{
 input_hkid = input_hkid.toString();
 
 var alpha = /[A-Za-z]/;
 var numeric = /[0-9]/;
 var checkdigit_range = /[0-9aA]/;
 var hkid = "";
 var arr_hkid;
 var char1;
 char1 = "";
 var checkdigit, lastdigit, sum, result;
 
 for (var i=0; i<input_hkid.length; i++) {
  char1 = input_hkid.charAt(i);
  if (!(char1==" " || char1=="(" || char1==")"))
   hkid += char1;
 }
 
 arr_hkid = hkid.split("");
 
 if (arr_hkid.length == 9) {
  if (!(arr_hkid[0].match(alpha) && arr_hkid[1].match(alpha)))
   return false;
  if (!(arr_hkid[2].match(numeric) && arr_hkid[3].match(numeric) && 
      arr_hkid[4].match(numeric) && arr_hkid[5].match(numeric) && 
      arr_hkid[6].match(numeric) && arr_hkid[7].match(numeric))) 
   return false;
  if (!arr_hkid[8].match(checkdigit_range))
   return false;
  
  arr_hkid[0] = arr_hkid[0].toUpperCase();
  arr_hkid[1] = arr_hkid[1].toUpperCase();
   
  sum = (arr_hkid[0].charCodeAt(0)-55)*9 + 
        (arr_hkid[1].charCodeAt(0)-55)*8 + 
         parseInt(arr_hkid[2],10)*7 + 
   parseInt(arr_hkid[3],10)*6 + 
   parseInt(arr_hkid[4],10)*5 + 
   parseInt(arr_hkid[5],10)*4 + 
   parseInt(arr_hkid[6],10)*3 + 
   parseInt(arr_hkid[7],10)*2;
  lastdigit = arr_hkid[8].toString.toUpperCase();
 
  result = arr_hkid[0]+arr_hkid[1]+arr_hkid[2]+
    arr_hkid[3]+arr_hkid[4]+arr_hkid[5]+
    arr_hkid[6]+arr_hkid[7]+"("+arr_hkid[8]+")";
 // if (result==10) result="A";
 
 } else if (arr_hkid.length == 8) {
  if (!arr_hkid[0].match(alpha))
   return false;
  if (!(arr_hkid[1].match(numeric) && arr_hkid[2].match(numeric) && 
      arr_hkid[3].match(numeric) && arr_hkid[4].match(numeric) && 
      arr_hkid[5].match(numeric) && arr_hkid[6].match(numeric))) 
   return false;
  if (!arr_hkid[7].match(checkdigit_range))
   return false;
  
  arr_hkid[0] = arr_hkid[0].toUpperCase();
 
  sum = (arr_hkid[0].charCodeAt(0)-64)*8 + 
   parseInt(arr_hkid[1],10)*7 + 
   parseInt(arr_hkid[2],10)*6 + 
   parseInt(arr_hkid[3],10)*5 + 
   parseInt(arr_hkid[4],10)*4 + 
   parseInt(arr_hkid[5],10)*3 + 
   parseInt(arr_hkid[6],10)*2;
  lastdigit = arr_hkid[7].toString().toUpperCase();
  result = arr_hkid[0]+arr_hkid[1]+arr_hkid[2]+
    arr_hkid[3]+arr_hkid[4]+arr_hkid[5]+
    arr_hkid[6]+"("+arr_hkid[7]+")";
 // if (result==10) result="A";
 
 } else {
  return false;
 }
 
 checkdigit = 11 - sum % 11;
 if (checkdigit.toString()=="10") checkdigit="A";
 if (checkdigit.toString()=="11") checkdigit="0";
 return ((checkdigit.toString()==lastdigit.toString()) ? result : false);
}
 
var currMonth =07;
var currYear=2001;
var currDay=05;
 

var Premium = new Array(4);
Premium[1] = "2500";
Premium[2] = "1700";
Premium[3] = "850";
 
var insured_amt = new Array(4);
insured_amt[1] = "1000000";
insured_amt[2] = "500000";
insured_amt[3] = "250000";
 
var insured_amt1 = new Array(4);
insured_amt1[1] = "50000";
insured_amt1[2] = "300000";
insured_amt1[3] = "150000";
 
var insured_amt2 = new Array(4);
insured_amt2[1] = "40000";
insured_amt2[2] = "40000";
insured_amt2[3] = "40000";
 
var insured_amt3 = new Array(4);
insured_amt3[1] = "10000000";
insured_amt3[2] = "5000000";
insured_amt3[3] = "2000000";
 
function init(){
}

function calDateValue(y,m,d)
{
    return (parseInt(10000*y, 10) + parseInt(100*m,10) + parseInt(d,10));
}

// added by Cliff
function _formattext(str1) {
    var str2="";
    // go through the whole string
    for (i=0; i < str1.length;) {

	// get a line with newline character that is less than 60 chars. 
	for (j=1; str1.charAt(i+j) != "\012" && j < 60; ++j);

	// if the line is too long, terminate it after the last word. 
	if (j == 60) {
	    for (; str1.charAt(i+j) != " " && str1.charAt(i+j) != "\t" &&
		str1.charAt(i+j) != "\012" && (i+j) < str1.length; ++j);
	}

	// if no newline character, add one; adjust pointer.
	if (str1.charAt(i+j) == "\012") {
	    str2 += str1.substr(i,j);
	    i+=j;
	} else {
	    str2 += str1.substr(i,j)+"\012";
	    i+=j+1;
	}
    }
    return str2;
}

// added by Cliff
function getFileExt(s) {
    if (s == null) return s;
    var tempStart = s.lastIndexOf(".") + 1;
    var tempEnd = s.length;
    if (tempStart == -1) return null;
    return s.substring(tempStart, tempEnd);
}

// added by Cliff
// this function returns TRUE if the input is numeric value
function isNumeric(s)
{
    if(isblank(s)) {
      return false;
    }

    if(isdigit(s)) {
      return true;
    }
    
    pattern = /^\d+\.\d+$/;
    if (s.match(pattern)==null) {
      return false;
    } else {
      return true;
    }
}

function getAndCheckDateTime(s)
{
    var pattern = /(\d{1,2})-(\d{1,2})-(\d{4})\s(\d{1,2}):(\d{1,2})/;
    s = s.toString()
    var a = s.match(pattern);
    if (a == null) {
//	alert("a is null");
	alert("Invalid date");
	return null;
    } else {
//	alert(a[1] + ":" + a[2] + ":" + a[3] + ":" + a[4] + ":" + a[5]);
	var day = a[1];
	var month = a[2] - 1;
	var year = a[3];
	var hour = a[4];
	var minute = a[5];
	var targetDate = new Date(year, month, day, hour, minute, 0);
	if (targetDate == null) {
	    alert("Invalid date");
	    return null;
	} else {
	    if (targetDate.getMinutes() != minute) {
		alert("Invalid minute");
		return null;
	    }
	    if (targetDate.getHours() != hour) {
		alert("Invalid hour");
		return null;
	    }
	    if (targetDate.getDate() != day) {
		alert("Invalid day of month");
		return null;
	    }
	    if (targetDate.getMonth() != month) {
		alert("Invalid month");
		return null;
	    }
	    if (targetDate.getYear() != year) {
		alert("Invalid year");
		return null;
	    }
//	    alert("Your input date is : " + targetDate.toString());
	    return targetDate;
	}
    }
    return null;
}

function getAndCheckDate(s)
{
    var pattern = /(\d{1,2})-(\d{1,2})-(\d{4})/;
    s = s.toString()
    var a = s.match(pattern);
    if (a == null) {
	alert("Invalid date");
	return null;
    } else {
	var day = a[1];
	var month = a[2] - 1;
	var year = a[3];
	var targetDate = new Date(year, month, day);
	if (targetDate == null) {
	    alert("Invalid date");
	    return null;
	} else {
	    if (targetDate.getDate() != day) {
		alert("Invalid day of month");
		return null;
	    }
	    if (targetDate.getMonth() != month) {
		alert("Invalid month");
		return null;
	    }
	    if (targetDate.getYear() != year) {
		alert("Invalid year");
		return null;
	    }
	    return targetDate;
	}
    }
    return null;
}

function instantTrade(code) {
  document.frmOrder.stockCode.value=code;
  document.frmOrder.stockCode.focus();
}

function popup_window (url) {

  window.open(url, "_blank", "");
}

function gen_link(url) {
  var str=(new Date()).getTime();
  var pattern = /\?/;
  if (url.match(pattern) == null) {
    window.location=url+"?"+str;
  } else {
    window.location=url+"&"+str;
  }
}
