//Purpose : to check if credit card number is valid
//Return : true/false
function validCcNumber(p_strNumber){
	
	var v_counter;
	var v_blnIsEven= false;
	var v_total= 0;
	var v_decodeNumber= "";

	if(p_strNumber== "") return false;

	for(v_counter=p_strNumber.length-1; v_counter>=0; v_counter--){
		if(v_blnIsEven){
			v_decodeNumber+= parseInt(p_strNumber.substr(v_counter, 1), 10) * 2;
		}
		else{
			v_decodeNumber+= parseInt(p_strNumber.substr(v_counter, 1), 10);
		}//End if
	
		v_blnIsEven= !v_blnIsEven;
	}//End for

	for(v_counter=v_decodeNumber.length-1; v_counter>=0; v_counter--){
		v_total+= parseInt(v_decodeNumber.substr(v_counter, 1), 10)
	}
	
	return (v_total%10== 0);
	
}

// Function untuk mengecek apakah value termasuk format Time
// Parameter emailStr = value
// mengembalikan nilai true(jika termasuk format Time) / false(jika bukan)
function isTime(strValue)
{  
	var formatTime = /^\d{2}[\:]\d{2}$/
	if (formatTime.test(strValue))
	{
		if (((parseInt(strValue.substr(0,2),10)) > 23) || ((parseInt(strValue.substr(3,2),10))>59))
			return false;
		else
			return true;
	}
	else
		return false;
}

// Function untuk mengecek apakah value termasuk format e-mail
// Parameter emailStr = value
// mengembalikan nilai true(jika termasuk format e-mail) / false(jika bukan)
function isEmail(who) {
	var email=/^[A-Za-z0-9]+([_\.-][A-Za-z0-9]+)*@[A-Za-z0-9]+([_\.-][A-Za-z0-9]+)*\.([A-Za-z]){2,6}$/i;
	return(email.test(trim(who)));
}

function isEmail2(emailStr) {
	var checkTLD=1;
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	//var matchArray=emailStr.match(emailPat);
	var matchArray=emailStr.toLowerCase();
	matchArray=matchArray.match(emailPat);

	if (matchArray==null) {
		return false;
	}
		
	var user=matchArray[1];
	var domain=matchArray[2];

	for (i=0; i<user.length; i++) {
		if (user.charCodeAt(i)>127) {
			return false;
	  }
	}
	for (i=0; i<domain.length; i++) {
		if (domain.charCodeAt(i)>127) {
			return false;
		}
	}

	if (user.match(userPat)==null) {
		return false;
	}

	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) {
		for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				return false;
		  }
		}
		return true;
	}

	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for (i=0;i<len;i++) {
		if (domArr[i].search(atomPat)==-1) {
			return false;
		}
	}

	if (checkTLD && domArr[domArr.length-1].length!=2 && 
	domArr[domArr.length-1].search(knownDomsPat)==-1) {
		return false;
	}

	if (len<2) {
		return false;
	}

	return true;
}

//Function to check if value/s is Numeric type
//By Midi lho!!
//Date 12 July 2000
//Parameter sValue - string to check
function notInt(sValue){
var lnexp = /^[-]?\d+$|^\d+$/
	return (lnexp.test(sValue)) ? false : true
}
//End Function

/////////////////////////////////////////////////
// Function Untuk Mengecek DATE3 dan DATE4 harus berada diantara DATE1 dan DATE2
// Function checkDate
// SEP 6, 2000 By. Herman
/////////////////////////////////////////////////
function checkDate(date1, date2, date3, date4) {
	//var date1 = Date.UTC (date1);
	//var date2 = Date.UTC (date2);
	//var date3 = Date.UTC (date3);
	//var date4 = Date.UTC (date4);

	if (date3 < date1 ) {
		return false;	
	}
	if (date4 > date2 ) {
		return false;
	}
}
// END FUNCTION checkDate

////////////////////////////////////////////////////
//Function Untuk Mencari Jarak diantara dua tanggal
//Function DaysBetweenDate
//SEP 4, 2000 By. Budi
////////////////////////////////////////////////////
function DaysBetweenDate(yr1, mo1, dy1, yr2, mo2, dy2) {
  var r, t1, t2, t3;
  var MinMilli = 1000 * 60
  var HrMilli = MinMilli * 60
  var DyMilli = HrMilli * 24
  t1 = Date.UTC(yr1, mo1, dy1);
  t2 = Date.UTC(yr2, mo2, dy2);
  if (t2 >= t1) 
    t3 = t2 - t1;
  else
    t3 = t1 - t2;
  r = Math.round(t3 / DyMilli);
  return(r);
}
//END FUNCTION DaysBetweenDate

//Function to Resize Navigator to Maximum Monitor Size
//By Midi lho!!
//Date 12 July 2000
function resizeMax() 
{
  window.moveTo(0,0);
  window.resizeTo(window.screen.width,window.screen.height);
}
//End function

//Function to return index of combo box display value
//By Midi lho!!
//Date 25 Aug 2000
//Parameter oname - Name of Combo box
//					ovalue - display value to set
//					blstat - true to set value, false to set text
//Return value : index pada combo box untuk value yang dicari
function getListIndex(oname,ovalue,blstat){
  var lnobjlen= oname.length
  var blfound= false
  var lnlastindex= oname.selectedIndex
  ovalue= ovalue + ""
  ovalue= ovalue.toUpperCase()
  with(oname){
		if(blstat==true){
			for(var i=0;i<lnobjlen;i++){
			  if(options[i].value.toUpperCase()==ovalue){
				  blfound= true;
				  break;
			  }
			}
		}
		else{
			for(var i=0;i<lnobjlen;i++){
				  if(options[i].text.toUpperCase()==ovalue){
					  blfound= true;
					  break;
				  }
			}
		}
  }
	return (blfound) ? i : lnlastindex
}
//End Function

//Function to set index of combo box display value
//By Midi lho!!
//Date 25 Aug 2000
//Parameter oname - Name of Combo box
//					ovalue - display value to set
//					blstat - true to set value, false to set text
//No return value
function setListIndex(oname,ovalue,blstat){
  var lnobjlen= oname.length
  var blfound= false
  var lnlastindex= oname.selectedIndex
  ovalue= ovalue + ""
  ovalue= ovalue.toUpperCase()
  with(oname){
		if(blstat==true){
			for(var i=0;i<lnobjlen;i++){
			  if(options[i].value.toUpperCase()==ovalue){
				  blfound= true;
				  break;
			  }
			}
		}
		else{
			for(var i=0;i<lnobjlen;i++){
				  if(options[i].text.toUpperCase()==ovalue){
					  blfound= true;
					  break;
				  }
			}
		}
  }
  oname.selectedIndex= (blfound) ? i : lnlastindex
}
//End Function

//Function to fill Combo box with month and year between n last
//year and n next year from today
//By Midi lho!!
//Date 12 July 2000
//Parameter nbase - Number of range by year
//          oname - combo box id/name
function fillPeriod(nbase,oname){
var ldnow = new Date();
ldnow.setFullYear(ldnow.getFullYear()-nbase);
lnbulan=ldnow.getMonth();
var lncount;
var lntemp=25*nbase;
	for(lncount=0;lncount<lntemp;lncount++){
		addOption = document.createElement("OPTION");
		addOption.text = monthName(ldnow.getMonth()) + String.fromCharCode(32) + y2k(ldnow.getYear())
		oname.add(addOption)
		ldnow.setMonth(ldnow.getMonth()+1)	
	}
}
//End Function

//Function to return month, base 0
//By Midi lho!!
//Date 12 July 2000
//Parameter nindex - Number of month, base 0
function monthName(nindex){
nindex= parseInt(nindex, 10);
var laBulan = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
return(laBulan[nindex])
}
//End Function

//Function to truncate unuse spaces at front and at end of string
//By Midi lho!!
//Date 12 July 2000
//Parameter svalue - string to truncate
function trim(svalue){
	if(svalue!=""){
		while (svalue.charAt(0)==" ")
			svalue=svalue.substring(1,svalue.length)
		while (svalue.charAt(svalue.length-1)==" ")
			svalue=svalue.substring(0,svalue.length-1)
		return svalue
	}
	return ""
}
//End Function

//Function to return year in 19th century if it's less then 1000
//By Midi lho
//Date 13 July 2000
//Parameter nyear - number to evaluate
function y2k(nyear){
	return((nyear < 1000) ? nyear+1900 : nyear)
}
//End Function

//Function to check if value/s is Date type
//By Midi lho!!
//Date 13 July 2000
//Parameter nday   - number of day base 1
//          nmonth - number of month base 1
//          nyear  - number of year(2 digits will be assume as 19th century)

function isDate(nday,nmonth,nyear){
	if(nyear<1) return false;
	nmonth-=1
	nyear=y2k(nyear)
	var dtemp=new Date(nyear,nmonth,nday)
	var dyear=dtemp.getFullYear()
	if((dyear==nyear) && (dtemp.getMonth()==nmonth) && (dtemp.getDate()==nday))
		return true
	else
		return false
}

//End Function

//Function to return difference between 2 date in days
//By Midi lho!
//Date 17 July 2000
//Parameter dfrom - low date
//	    dto   - high date
function daysElapsed(dfrom,dto){
var ndiff
	ndiff= Date.UTC(dto.getFullYear(),dto.getMonth(),dto.getDate(),0,0,0)-
				 Date.UTC(dfrom.getFullYear(),dfrom.getMonth(),dfrom.getDate(),0,0,0)
return ndiff/1000/60/60/24
}
//End Function

//Function to clear all item from Combo box
//By Midi lho!!
//Date 14 July 2000
//Parameter oname - id/name of Combo box
function clrCombo(oname){
	for(var i=0;i<oname.options.length;i++){
		oname.remove(oname.options(i).index)
		i--;
	}
}
//End Function

//Function to count number of days in a specified month
//By Midi lho!!
//Date 19 July 2000
//Parameter nmon  - number of month base 1
//          nyear - number of year
//	    (2 digits will be assume as 19th century)
//	    (none will be assume as today's year)
function numDays(nmon,nyear){
var dtemp= new Date()
	if (nmon<1 || nmon>12) return false
	nyear= ((!nyear)? dtemp.getFullYear(): nyear)
	dtemp = new Date(nyear,nmon,1)
	dtemp.setDate(0)
	return (dtemp.getDate())
}//End Function

//Function remove space in textbox
//for simulation only!!!!!!
//By Toto
//Date 21 July 2000
//
//Parameter isi - value of textbox
//return value - boolean
function delSpace(isi)
{
  var kata="";
  for(i=0;i<isi.length;i++)
  {    
    if(isi.charAt(i) != " " && isi.charCodeAt(i) != 13 && isi.charCodeAt(i) != 10)
    {    	  
	  kata += isi.charAt(i);
    }     
  }
  return kata
}


//Function to check values is number or not
//for simulation only!!!!!!
//By Toto
//Date 21 July 2000
//
//Parameter isi - value of textbox
//return value - boolean
function isNumber(isi)
{
//  var myExp = /^[-]?[0-9]+$|^[-]?[0-9]+[\.]?[0-9]+$/
  var myExp = /^[-]?[0-9]+$|^[-]?[0-9]+[\.]?[0-9]+$|^[-]?[\.][0-9]+$/
  return myExp.test(isi)  
}


//Function to check values is letter or not
//for simulation only!!!!!!
//By Toto
//Date 21 July 2000
//
//Parameter isi - value of textbox
//return value - boolean
function isLetter(isi) 
{
  var myExp = /^[a-z ]+$/i  
  return myExp.test(delSpace(isi))  
}


//Function to check values is alphanumeric or not
//for simulation only!!!!!!
//By Toto
//Date 21 July 2000
//
//Parameter isi - value of textbox
//return value - boolean
function isAlpha(isi) 
{
  var myExp = /^[a-z|0-9 ]+$/i  
  return myExp.test(delSpace(isi))  
}


//Function to check if value/s is Date type
//By Midi lho!!
//Date 13 July 2000
//Parameter nday   - number of day base 1
//          nmonth - number of month base 1
//          nyear  - number of year(2 digits will be assume as 19th century)
//function isDate(nday,nmonth,nyear){
//nmonth-=1
//nyear=y2k(nyear)
//var dtemp=new Date(nyear,nmonth,nday)
//var dyear=dtemp.getFullYear()
//if((dyear==nyear) && (dtemp.getMonth()==nmonth) && (dtemp.getDate()==nday))
//		return true
//	else
//		return false
//}


//Function convert to currency format 
//parameter : lsAmount - is Numeric String [ex: formatCurr("12345") | formatCurr(varNumeric.toString())]
function formatCurr(lsAmount)
{	var lbMinus = false;
	if (lsAmount.substr(0,1)=="-")
	{	lbMinus = true;
		lsAmount = lsAmount.substr(1,lsAmount.length); 
	}
	var vsplit = lsAmount.split(".");
	var j = vsplit[0].length;	
	var jmlstr = parseInt(j/3);
	if ((j%3)==0) jmlstr-=1	
	var vtemp="";
	for(var k=0;k<jmlstr;k++)	
	{	j = j-3;	
		if (vtemp=="") 
			vtemp = vsplit[0].substr(j,3);									
		else
			vtemp = vsplit[0].substr(j,3) + "," + vtemp;				
	}	
	if ((vsplit[0].length%3)==0) 		
	{	if (vtemp=="")
			vtemp = vsplit[0].substr(0,3)
		else
			vtemp = vsplit[0].substr(0,3) + "," + vtemp;		
	}
	else	
	{	if (vtemp=="")
			vtemp = vsplit[0].substr(0,vsplit[0].length%3)
		else	
			vtemp = vsplit[0].substr(0,vsplit[0].length%3) + "," + vtemp;		
	}
	if (vsplit.length==2) 
	{
		var vnum = vsplit[1].substr(0,2);	
		vtemp += "." + vnum
		//vtemp += "." + vsplit[1]
	}
	if (lbMinus) vtemp = "- " + vtemp;	
	return vtemp;
}

function dateDiff(p_strType, p_dtFrom, p_dtTo){
	var v_dblMicroSecond;

	v_dblMicroSecond = Date.UTC( p_dtTo.getFullYear(), p_dtTo.getMonth(), p_dtTo.getDate() ) -
	Date.UTC( p_dtFrom.getFullYear(), p_dtFrom.getMonth(), p_dtFrom.getDate() );
	
	switch(p_strType){
		case "d":
			return v_dblMicroSecond/1000/60/60/24;
			break;
		case "m":
			return v_dblMicroSecond/1000/60/60;
			break;
		case "n":
			return v_dblMicroSecond/1000/60;
			break;
		case "s":
			return v_dblMicroSecond/1000;
			break;
	}
	return true;
}

function inc_allowFloatNumeric(p_objText){
	var v_regExp1= /^\d+$/;
	var v_regExp2= /^[0-9]+[\.]?[0-9]+$|^[0-9]+[\.]?$/;
	var v_strTemp= "";
	var v_strReturn= "";
	var v_blnValid;
	
	with(p_objText){
		if(value.length<2){
			v_strTemp= value;
			if( !v_regExp1.test(v_strTemp) ) value= "";
		}
		else{

			v_blnValid= ( v_regExp1.test(value) || v_regExp2.test(value) );
			
			if(!v_blnValid){

				for(var v_intCounter=0; v_intCounter<value.length; v_intCounter++){
					
					v_strTemp+= value.substring(v_intCounter, v_intCounter+1);
					
					v_blnValid= ( v_regExp1.test(v_strTemp) || v_regExp2.test(v_strTemp) );
					
					if(!v_blnValid) v_strTemp= v_strReturn;
					else v_strReturn= v_strTemp;
					
				}//End for
				
				value= v_strReturn;

			}//End if
			
		}//end if
	}//end with
	return true;
}

//	Category		:	Math function
//	Function		:	Cek panjangnya decimal number
//	Return			:	Integer (length dr angka di blkg . )
//	By				:	Aciang (May 31, 04)
function getDecimalen(p_dblValue) {
	var v_intPos = p_dblValue.lastIndexOf(".")
	var v_intReturn = 0;
		
	if (v_intPos >= 0) {
		v_intReturn = p_dblValue.substr(v_intPos + 1).length;
				
	}
	return v_intReturn;
}