var SPLIT_CHAR = "#;:^:;#" ;

//============================================================================//
// 自訂日期物件
//============================================================================//
function TDateParser( AssignDate ) {
	var DateObject = null ;
	var MonthValue = "" ;
	var DayValue = "" ;
	this.Year = 0 ;
	this.Month = 0 ;
	this.Day = 0 ;
	this.Week = 0 ;
	if ( AssignDate == "" ) {
		DateObject = new Date() ;
	} else {
		DateObject = new Date( AssignDate ) ;
	} ;
	this.Year  = DateObject.getFullYear() ;
	this.Month = DateObject.getMonth() + 1 ;
	this.Day   = DateObject.getDate() ;
	this.Week  = DateObject.getDay() ;	
	MonthValue = this.Month ;
	DayValue   = this.Day ;
	if ( MonthValue < 10 ) { MonthValue = "0" + MonthValue ; } ;
	if ( DayValue   < 10 ) { DayValue   = "0" + DayValue   ; } ;
	this.Date = this.Year + "/" + MonthValue + "/" + DayValue ;
	DateObject = null ;
} ;

//============================================================================//
// 去除指定字串之前後空白
//============================================================================//
function ProTrim( AssignString ) {
	if ( AssignString != "" ) {
		while ( AssignString.substring( 0 , 1 ) == " " ) {
			AssignString = AssignString.substring( 1 , AssignString.length ) ; 
			if ( AssignString == "" ) { break ; } ;
		} ;
		if ( AssignString != "" ) {
			while ( AssignString.substring( AssignString.length-1 , AssignString.length ) == " " ) {
				AssignString = AssignString.substring( 0 , AssignString.length - 1 ) ;
				if ( AssignString == "" ) { break ; } ;
			} ;
		} ;
	} ;
	return ( AssignString ) ;
} ;

//============================================================================//
// 擷取指定範圍之子字串
//============================================================================//
function ProSubString( SourceString , CutPos , CutLength ) {
	var Result = "" ;
	SourceString = ProTrim( SourceString ) ;
	if ( SourceString == "" ) { return( Result ) ; } ;
	if ( CutPos < 1 ) { return( SourceString ) ; } ;
	if ( CutLength == 0 ) { return( SourceString ) ; } ;
	CutLength = CutPos + CutLength - 1 ;
	if ( CutLength > SourceString.length ) {
		CutLength = SourceString.length ;
	} ;
	Result = SourceString.substring( CutPos - 1 , CutLength ) ;
	return ( Result ) ;
} ;



//============================================================================//
// 取代指定字串
//============================================================================//
function ProReplaceString( SourceString , OldString , NewString ) {
	var Result = "" ;
	var CharPos = -1 ;
	var StringLength = 0 ;
	if ( SourceString == "" ) { return( Result ) ; } ;
	if ( OldString == "" ) { return( SourceString ) ; } ;

	do {
		CharPos = SourceString.indexOf( OldString ) ;
		if ( CharPos < 0 ) {
			Result = Result + SourceString ;
		} else {
			if ( CharPos == 0 ) {
				Result = Result + NewString ;
			} else {
				Result = Result + ProSubString( SourceString , 1 , CharPos ) + NewString ;
			} ;
			SourceString = ProSubString( SourceString , ( CharPos + OldString.length + 1 ) , SourceString.length ) ;
		} ;
	} while ( CharPos >= 0 ) ;
	
	return( Result ) ;
} ;

//============================================================================//
// 取得指定視窗之中心值
//============================================================================//
function ProGetScreenCenter( AssignWidth , AssignHeight ) {
	var LeftPosition = ( screen.width - AssignWidth ) / 2 ;
  var TopPosition  = ( screen.height - AssignHeight - 20 ) / 2 ;
  var Parameter = "top=" + TopPosition + ",left=" + LeftPosition + ",width=" + AssignWidth + ",height=" + AssignHeight ;
  return ( Parameter ) ;
} ;	

//============================================================================//
// 顯示指定分隔符之日期 ( yyyy[分隔符號]mm[分隔符號]dd 格式 ) ;
//============================================================================//
function ProGetDateString( DateValue , SplitChar ) {
	var Result ;
	var DateObject ;
	if ( DateValue == "" ) {
		DateObject = new Date() ;
	} else { 
		DateObject = new Date( DateValue ) ;
	} ;
	var CurrentYear = DateObject.getFullYear() ;
	var CurrentMonth = DateObject.getMonth() + 1 ;
	var CurrentDay   = DateObject.getDate() ;
	if ( CurrentMonth < 10 ) { CurrentMonth = "0" + CurrentMonth ; } ;
	if ( CurrentDay   < 10 ) { CurrentDay   = "0" + CurrentDay ; } ;   
	Result = CurrentYear + SplitChar + CurrentMonth + SplitChar + CurrentDay ;
	return ( Result ) ;         
} ;

//============================================================================//
// 顯示指定分隔符之時間 ( hh[分隔符號]mm[分隔符號]ss 格式 ) ;
//============================================================================//
function ProGetTimeString( TimeValue , SplitChar ) {
	var Result ;
	var TimeObject ;
	if ( TimeValue == "" ) {
		TimeObject = new Date() ;
	} else { 
		TimeObject = new Date( TimeValue ) ;
	} ;
	var CurrentHour    = TimeObject.getHours() ;
	var CurrentMinute  = TimeObject.getMinutes() ;
	var CurrentSecond  = TimeObject.getSeconds() ;
	if ( CurrentHour   < 10 ) { CurrentHour   = "0" + CurrentHour ; } ;
	if ( CurrentMinute < 10 ) { CurrentMinute = "0" + CurrentMinute ; } ;
	if ( CurrentSecond < 10 ) { CurrentSecond = "0" + CurrentSecond ; } ;
	Result = CurrentHour + SplitChar + CurrentMinute + SplitChar + CurrentSecond ;
	return ( Result ) ;         
} ;

//============================================================================//
// Enable 或 Disable 指定物件，並改變其相對應顏色
//============================================================================//
function ProEnableControl( AssignControl , EnableMode ) {
	if ( EnableMode ) {
		AssignControl.disabled = false ;
		AssignControl.className = ProReplaceString( AssignControl.className , "twDisableObject" , "twFormObject" ) ;
	} else {
		AssignControl.disabled = true ;
		AssignControl.className = ProReplaceString( AssignControl.className , "twFormObject" , "twDisableObject" ) ;
	} ;
} ;

//=============================================================================//
//
//=============================================================================//
function ProEnableControlEx( AssignControl , EnableMode , DisableBackgroundColor, DisableFontColor, EnableBackgroundColor , EnableFontColor ) {
	if ( EnableMode ) {
		AssignControl.disabled = false ;
		AssignControl.style.backgroundColor = EnableBackgroundColor ;
		AssignControl.style.color = EnableFontColor ;
	} else {
		AssignControl.disabled = true ;
		AssignControl.style.backgroundColor = DisableBackgroundColor ;
		AssignControl.style.color = DisableFontColor ;
	} ;
} ;


//============================================================================//
// Enable 或 Disable 指定 Radio 群組物件
//============================================================================//
function ProEnableRadio( RadioControl , EnableMode ) {
	for ( var index = 0 ; index < RadioControl.length ; index++ ) {
		RadioControl[index].disabled = !EnableMode ;
	} ;
} ;

//=============================================================================//
//
//=============================================================================//
function ProEnableDateSelector( EnableMode , SelectorName ) {
	var YearSelector = document.getElementById( "cmbx" + SelectorName + "Year" ) ;
	var MonthSelector = document.getElementById( "cmbx" + SelectorName + "Month" ) ;
	var DaySelector = document.getElementById( "cmbx" + SelectorName + "Day" ) ;
		
	ProEnableControl( YearSelector , EnableMode ) ;
	ProEnableControl( MonthSelector , EnableMode ) ;
	ProEnableControl( DaySelector , EnableMode ) ;
		
	YearSelector = null ;
	MonthSelector = null ;
	DaySelector = null ;
} ; 	

//============================================================================//
// 
//============================================================================//
function ProTrimForm( AssignForm ) {
	with ( AssignForm ) {
		for ( var Index = 0 ; Index < AssignForm.length ; Index++ ) {
			FormObject = AssignForm.elements[ Index ] ;
			if ( FormObject.type == "text" ) {
					FormObject.value = ProTrim( FormObject.value ) ;
      } ;    			
			if ( FormObject.type == "password" ) {
					FormObject.value = ProTrim( FormObject.value ) ;
      } ;    			
			if ( FormObject.type == "textarea" ) {
					FormObject.value = ProTrim( FormObject.value ) ;
      } ;    			
		} ;
	} ;	
} ;

//============================================================================//
// 使指定清單聚焦在指定項目 ( Select Object ) 
//============================================================================//
function ProFocusSelectorItem( AssignSelector , ItemValue ) {
	for ( var index = 0 ; index < AssignSelector.options.length ; index++ ) {
		if ( AssignSelector.options[index].value == ItemValue ) {      	 
			AssignSelector.selectedIndex = index ;
			break ;
		} ;
	} ;
} ;

//============================================================================//
// 取得前置 0 之數字字串
//============================================================================//
function ProGetLeadingZero( NumberValue , NumberLength ) {
	var OffsetLength = NumberLength - NumberValue.toString(10).length ; 
	var Result = "" ;
	for ( var index = 1 ; index <= OffsetLength ; index++ ){
		Result = Result + "0" ;
	} ;
	Result = Result + NumberValue.toString(10) ;
	return( Result ) ;
} ;

//============================================================================//
// 核取指定條件之 Radio Button ( Radio Object ) 
//============================================================================//
function ProCheckRadioButton( RadioObject , CheckValue ) {
	if ( RadioObject == null ) { return( false ) ; } ;
	if ( RadioObject == undefined ) { return( false ) ; } ;
	try {
		RadioObject[0].checked = true ;
		for ( var Index = 0 ; Index < RadioObject.length ; Index++ ) {
			if ( RadioObject[Index].value == CheckValue ) {
				RadioObject[Index].checked = true ; 
				break ;
			} ;
		} ;
	} catch(E) {
		alert( E.message ) ;
	} ;
} ;

//============================================================================//
// 核取符合指定條件之 checkbox 群 ( 特定 checkbox 群 ) 
//============================================================================//
function ProCheckCheckboxList( DataString , Delimiter , LeadingZero , CheckName ) {
	var CheckDataList = "" ;
	var NameValue = "" ;
	var CheckboxName = "" ;
	var CheckboxObject = null ;
	
	if ( DataString == "" ) { return( false ) ; } ; 
	
	CheckDataList = DataString.split( Delimiter ) ;
	for ( var aIndex = 0 ; aIndex < CheckDataList.length ; aIndex++ ) {
		NameValue = ProTrim( CheckDataList[aIndex] ) ;
		if ( NameValue != "" ) {
			if ( LeadingZero > 0 ) {
				NameValue = parseInt( NameValue , 10 ) ;
				NameValue = ProGetLeadingZero( NameValue , LeadingZero )  ;
			} ;
			CheckboxName = CheckName + NameValue ;
			CheckboxObject = document.getElementById( CheckboxName ) ;
			if ( CheckboxObject != null ) {
				CheckboxObject.checked = true ;
			} ;
		} ;
	} ;
} ;

//============================================================================//
// 
//============================================================================//
function ProGetRadioSelectedIndex( RadioObject ) {
	for ( var Index = 0 ; Index < RadioObject.length ; Index++ ) {
		if ( RadioObject[Index].checked ) { break ; } ;
	} ;
	return ( Index ) ;
} ;


//========================================================================================//
//
//========================================================================================//
function ProGetArrayIndex( AssignArray , ItemValue ) {
	var Result = -1 ;
	if ( AssignArray.length > 0 ) {
		for ( var index = 0 ; index < AssignArray.length ; index++ ) {
			if ( AssignArray[index] == ItemValue ) {
				Result = index ;
				break ;
			} ;
		} ;
	} ;
	return ( Result ) ;
} ;

//============================================================================//
// 檢查所輸入之字串是否為整數或負值
//============================================================================//
function ProIsInteger( AssignValue , AllowMinus ) {
	var Result = false ;
	if ( !isNaN( AssignValue ) ) {
		Result = true ;
		if ( !AllowMinus ) {
			AssignValue = parseInt( AssignValue , 10 ) ;
			Result = ( AssignValue >= 0 ) ;
		} ;
	} ;
	return ( Result ) ;
} ;

//============================================================================//
// 檢測所指定之電子郵件信箱是否正確
//============================================================================//
function ProCheckEmailAddress( EmailAddress ) {
	this.UserName = "" ;
	this.DomainName = "" ;
		
	var Result = false ;
	var AtPos = 0 ;
	var ValidChar = 'abcdefghijklmnopqrstuvwxyz0123456789-_.' ;
	var vUserName = "" ;
	var vDomainName = "" ;
	var TestChar = "" ;
	var DomainSection = new Array() ;
	var TopDomain = "" ;
	var TopDomainLength = 0 ;
	var DomainList = "" ;
	var VALID_DOMAIN3 = '.com.net.gov.org.biz.idv.pro.edu.mil' ;
	var VALID_DOMAIN4 = '.info.name.aero.coop' ;
	var VALID_DOMAIN6 = '.museum' ;   
	var VALID_DOMAIN2 = '.ac.ad.ae.af.ag.ai.al.am.an.ao.aq.ar.as.at.au.aw.az.ba.bb.bd.be.bf.bg.bh.bi.bj' +
                      '.bm.bn.bo.br.bs.bt.bv.bw.by.bz.ca.cc.cd.cf.cg.ch.ci.ck.cl.cm.cn.co.cr.cs.cu.cv' +
                      '.cx.cy.cz.de.dj.dk.dm.do.dz.ec.ee.eg.eh.er.es.et.fi.fj.fk.fm.fo.fr.fx.ga.gb.gd' +
                      '.ge.gf.gg.gh.gi.gl.gm.gn.gp.gq.gr.gs.gt.gu.gw.gy.hk.hm.hn.hr.ht.hu.id.ie.il.im' +
                      '.in.io.iq.ir.is.it.je.jm.jo.jp.ke.kg.kh.ki.km.kn.kp.kr.kw.ky.kz.la.lb.lc.li.lk' +
                      '.lr.ls.lt.lu.lv.ly.ma.mc.md.mg.mh.mk.ml.mm.mn.mo.mp.mq.mr.ms.mt.mu.mv.mw.mx.my' +
                      '.mz.na.nc.ne.nf.ng.ni.nl.no.np.nr.nt.nu.nz.om.pa.pe.pf.pg.ph.pk.pl.pm.pn.pr.pt' +
                      '.pw.py.qa.re.ro.ru.rw.sa.sb.sc.sd.se.sg.sh.si.sj.sk.sl.sm.sn.so.sr.st.su.sv.sy' +
                      '.sz.tc.td.tf.tg.th.tj.tk.tm.tn.to.tp.tr.tt.tv.tw.tz.ua.ug.uk.um.us.uy.uz.va.vc' +
                      '.ve.vg.vi.vn.vu.wf.ws.ye.yt.yu.za.zm.zr.zw' ;   
   
	EmailAddress = ProTrim( EmailAddress ) ;   
	if ( EmailAddress == "" ) { return( Result ) ; } ;
	AtPos = EmailAddress.indexOf( '@' ) ;
	if ( AtPos <= 0 ) { return( Result ) ; } ;  
	
  this.UserName = ProSubString( EmailAddress , 1 , AtPos ) ;
	vUserName = ProSubString( EmailAddress , 1 , AtPos ).toLowerCase() ;
	vDomainName = ProSubString( EmailAddress , AtPos + 2 , 1000 ).toLowerCase() ;
	if ( vUserName == "" ) { return( false ) ; } ;
	if ( vUserName == "." ) { return( false ) ; } ;
	if ( vUserName.indexOf( ".." ) >= 0 ) { return( false ) ; } ;
	if ( vDomainName == "" ) { return( false ) ; } ;  
	if ( vDomainName.length < 4 ) { return( false ) ; } ;
	if ( vDomainName.substring( vDomainName.length - 1 , vDomainName.length ) == "." ) { return( false ) ; } ;
	if ( vDomainName.indexOf( "." ) <= 0 ) { return( false ) ; } ;
	if ( vDomainName.indexOf( ".." ) >=0 ) { return( false ) ; } ;   

	Result = true ;
	for ( var Index = 0 ; Index < vUserName.length ; Index++ ) {
		TestChar = vUserName.substring( Index , Index + 1 ) ;
		if ( ValidChar.indexOf( TestChar ) < 0 ) {
			Result = false ;
			break ;
		} ;
	} ;
	if ( !Result ) { return( Result ) ; } ;   
	
	for ( var Index = 0 ; Index < vDomainName.length ; Index++ ) {
		TestChar = vDomainName.substring( Index , Index + 1 ) ;
		if ( ValidChar.indexOf( TestChar ) < 0 ) {
			Result = false ;
			break ;
		} ;
	} ; 
	if ( !Result ) { return( Result ) ; } ;
   
	DomainSection = vDomainName.split( "." ) ;
	TopDomain = DomainSection[ DomainSection.length - 1 ] ;
	TopDomainLength = TopDomain.length ;
	switch ( TopDomainLength ) {
		case 2: { Result = ( VALID_DOMAIN2.indexOf( TopDomain ) >= 0 ) ; break ; } ;
		case 3: { Result = ( VALID_DOMAIN3.indexOf( TopDomain ) >= 0 ) ; break ; } ;
		case 4: { Result = ( VALID_DOMAIN4.indexOf( TopDomain ) >= 0 ) ; break ; } ;
		case 6: { Result = ( VALID_DOMAIN6.indexOf( TopDomain ) >= 0 ) ; break ; } ;      
		default: { Result = false ; } ;
   } ;

	DomainSection = null ;
	this.DomainName = vDomainName ;
   
	return( Result ) ;
} ;

//============================================================================//
// 
//============================================================================//
function ProGetDateSelectorDate( YearSelector , MonthSelector , DaySelector ) {
	var Result = "" ;
	Result = YearSelector.value + "/" + MonthSelector.value + "/" + DaySelector.value ;
	Result = ProGetDateString( Result , "/" ) ;
	return ( Result ) ;
} ;

//============================================================================//
// 
//============================================================================//
function CreateRandomValue() {   
	return (((1+Math.random())*0x10000)|0).toString(16).substring(1);   
} ;

//============================================================================//
// 
//============================================================================//
function ProCreateGUID( CodeLength ) {
	var Result = "" ;
	for ( var index = 0 ; index < 8 ; index++ ) {
		Result = Result + CreateRandomValue() ;
	} ;
	if ( CodeLength > 0 ) {
		Result = ProSubString( Result , 1 , CodeLength ) ;
	} ;
	return( Result ) ;
} ;	

//============================================================================//
// 檢查所輸入之字串是否為整數或負值
//============================================================================//
function ProIsNumber( AssignValue ) {
	var Result = false ;
	try {
		if ( !isNaN( AssignValue ) ) {
			Result = parseFloat( AssignValue ) ;
			Result = true ;
		} ;
	} catch(E) {
		Result = false ;
	} ;	
	return ( Result ) ;
} ;

//============================================================================//
// 取得千分位分隔之數字字串
//============================================================================//
function ProGetSplitNumber( AssignNumber ) {
	var Result = "" ;
	var ModValue = 0 ;
	var NumberString = ( AssignNumber + "" ) ;
	var IsMinus = false ;
	var IsDecimal = false ;
	var DecimalValue = "" ;
	var PointPos = NumberString.indexOf( "." ) ;

	IsDecimal = ( PointPos >= 0 ) ;	
	if ( IsDecimal ) {
		DecimalValue = ProSubString( NumberString , PointPos + 2 , 10000 ) ;
		if ( DecimalValue == "" ) { DecimalValue = "0" ; } ; 
		AssignNumber = ProSubString( NumberString , 1 , PointPos ) ;
		AssignNumber = parseInt( AssignNumber , 10 ) ;
	} else {
		AssignNumber = parseInt( NumberString , 10 ) ;
	} ;
	
	IsMinus = ( AssignNumber < 0 ) ;
	if ( IsMinus ) { 
		AssignNumber = ( AssignNumber * -1 ) ; 
	} ;

	try {
		if ( AssignNumber < 1000 ) {
			if ( IsMinus ) { 
				AssignNumber = AssignNumber * -1 ; 
			} ;
			if ( IsDecimal ) {
				AssignNumber = AssignNumber + "." + DecimalValue ;
			} ;
			return( AssignNumber ) ;
		} ;

		while ( AssignNumber >= 1000 ) {
			ModValue = parseInt( AssignNumber % 1000 , 10 ) ;			
			Result = "," + ProGetLeadingZero( ModValue , 3 ) + Result ;
			AssignNumber = parseInt( ( AssignNumber / 1000 ) , 10 ) ;
		} ;
		if ( AssignNumber > 0 ) {
			Result = AssignNumber + Result ;
		} ;

		if ( IsMinus ) { Result = "-" + Result ; } ;
		if ( IsDecimal ) { Result = Result + "." + DecimalValue ; } ;
	} catch(E) {
		Result = "[ERR]" ;
	} ;
	return( Result ) ;   
} ;

//============================================================================//
// 取得檔案名稱
//============================================================================//
function ProExtractFileName( FileName ) {
	var Result = "" ;
	var CutPos = 0 ;
	FileName = ProTrim( FileName ) ;
	if ( FileName == "" ) { return( Result ) ; } ;
	if ( FileName.indexOf( "\\" ) < 0 ) {
		Result = FileName ;
		return ( Result ) ;
	} ;
	CutPos = FileName.lastIndexOf( "\\" ) ;
	Result = ProSubString( FileName , CutPos + 2 , 10000 ) ;
	return ( Result ) ;
} ;	

//========================================================================================//
//
//========================================================================================//
function ProGetAddDate( DateParser , PlusYear , PlusMonth , PlusDay ) {
	var Resullt = "" ;
	PlusYear = DateParser.Year + PlusYear ;
	PlusMonth = DateParser.Month + PlusMonth ;
	PlusDay   = DateParser.Day + PlusDay ;
	Result = ProGetDateString( PlusYear + "/" + PlusMonth + "/" + PlusDay , "/" ) ;
	return ( Result ) ;	
} ;

//============================================================================//
// 
//============================================================================//
function ProShowObject( AssignObject ) {
	var ShowText = "" ;	
   for ( I in AssignObject ) {
      ShowText = ShowText + ( I + ":" + AssignObject[I] + "<BR>" ) ;
   } ;
   document.write( ShowText ) ;
} ;

//============================================================================//
// AJAX
//============================================================================//
function loadXMLDoc(url) {
	var Result = "" ;
	if (window.XMLHttpRequest) {
    xmlhttp= new XMLHttpRequest();  // code for IE7+, Firefox, Chrome, Opera, Safari
  }	else  {
  	xmlhttp= new ActiveXObject("Microsoft.XMLHTTP"); // code for IE6, IE5
  } ;
	xmlhttp.open("GET",url,false);
	xmlhttp.send(null);
	Result = xmlhttp.responseText ;
	return( Result ) ;
}	

//============================================================================//
//
//============================================================================//
function ProSetCookie( Name, Value ) {
	var argv = ProSetCookie.arguments ;
	var argc = ProSetCookie.arguments.length ;
	var expires = ( argc > 2 ) ? argv[2] : null ;
	var CookieValue = "" ;
	var path = ( argc > 3 ) ? argv[3] : null ;
	var domain = ( argc > 4 ) ? argv[4] : null ;
	var secure = ( argc > 5 ) ? argv[5] : false ;
	CookieValue = Name + "=" + escape( Value ) +
										( ( expires == null ) ? "" : ( "; expires=" + expires.toGMTString() ) ) +
                    ( ( path    == null ) ? "" : ( "; path=" + path ) ) +
                    ( ( domain  == null ) ? "" : ( "; domain=" + domain ) ) +
                    ( ( secure  == true ) ? "; secure" : "" ) ;
	document.cookie = CookieValue ;                    
} ;

//============================================================================//
//
//============================================================================//
function ProGetCookie( Name ) {
	var CookieName = Name + "=";
	var CookieValue = document.cookie ;
	var BeginPos = 0 ;
	var EndPos = 0 ;

	if ( CookieValue.length > 0 ) {
		BeginPos = CookieValue.indexOf( CookieName ) ;
		if ( BeginPos > -1 ) {
			CookieValue = ProSubString( CookieValue , BeginPos + CookieName.length + 1 , CookieValue.length ) ;
			EndPos = CookieValue.indexOf( ";" ) ;
			if ( EndPos > -1 ) {
				CookieValue = ProSubString( CookieValue , 1 , EndPos ) ;
			} ;
			return( unescape( CookieValue ) ) ;
		} ;		
	} ;
	return( null ) ;
} ;	


