//------------------------------- Declare External Funtions


PUBLIC FUNCTION long  HexToDec(ref string  Hex)LIBRARY "HUNERF.dll" alias for "HexToDec;Ansi"	            


PUBLIC FUNCTION long KeyCard(long  ComNumber,long  CardNo,long  nBlock,long  Encrypt,ref string  CardPass, &
   ref string  SystemCode,      ref string  HotelCode, ref string  Pass, ref string  Address,           &
   ref string  SDIn,ref string  STIn, ref string  SDOut,ref string  STOut,      long  LEVEL_Pass,long  PassMode,   &
  long  AddressMode,long  AddressQty,long  TimeMode,      long  V8, long  V16, long  V24, long  AlwaysOpen, long  OpenBolt,  &
  long  TerminateOld, long  ValidTimes)LIBRARY "HUNERF.dll" alias for "KeyCard;Ansi"
  
  
  PUBLIC FUNCTION long ReadMessage(long ComNumber,long  nBlock,long  Encrypt,ref long  DBCardno,ref long  DBCardtype,&
    ref long  DBPassLevel, ref string  CardPass,ref string  DBSystemcode,ref string  DBAddress,&
   ref string  SDateTime)LIBRARY "HUNERF.dll" alias for "ReadMessage;Ansi"







//-------------------------------Զ庯
global type gf_changejz from function_object
end type

forward prototypes
global function string gf_changejz (longlong shi, integer how)
end prototypes

global function string gf_changejz (longlong shi, integer how);string   two,sixteen,eight   //ַĽֵ   
long     lentwo,duan,i,j     
string   aa[50],a[50],b[4]   //   
 //Ȱ10ͨȡת2   
  //10Ƶ2Ƶתͨȡʵ֣õmod()ͨʵ//4дͿ԰10ת2   
do   while   shi>0     
	two   =   two   +   string(mod(shi,2))   
	shi=shi   /   2   
loop   
    
 choose   case   how   //ѡ   
    
  case   2   //ѡ2   
  //õ2Ƶݷ෴ģ11011101101Ҫͨreverse()//ߵ   
  two=reverse(two)   //õȷ210110111011   
  return   two   //غֵ   
    
  case   8   //ѡ8   
  //2Ƶ8Ƶתģÿ3λΪһΣ8Ƶһλ   
  lentwo=len(two)   //ȡ2Ƶĳ   
  if   mod(lentwo,3)   >   0   then   //ֶ   
  duan=lentwo   /   3   +   1   
  else   
  duan=lentwo   /3   
  end   if   
    
  for   i=   duan   to   1   step   -1   //ûеߵ2Ǵģ//ֳĶδҾɴС   
    
  aa[duan]=mid(two,i   *   3   -   2   ,3)   //ȡÿһε2ֵ   
  a[duan]='0'   
  for   j=1   to   3     
    
  b[j]=mid(aa[duan],j,1)   //ÿһδȡֵ   
    
  if   b[j]<>   ''   then   
  a[duan]=string(integer(a[duan])   +   2^(j   -1   )   *   integer(b[j]))   
  //2^0   *   x   +   2^1   *x   +2^2   *   x   
  //xΪֱΪҵ2Ƶֵۼӵõÿһε8ֵ   
  end   if   
    
    
  next   
  eight=eight   +   a[duan]   //8ƶۼӵõ8ֵ   
  next   
  return   eight   
  //16Ƶķͬ8ƣֻÿ4λΪһζ   
  case   16   //16   
    
  lentwo=len(two)   
  if   mod(lentwo,4)   >   0   then   
  duan=lentwo   /   4   +   1   
  else   
  duan=lentwo   /4   
  end   if   
    
    
  for   i=   duan   to   1   step   -1   
    
  aa[duan]=mid(two,i   *   4   -   3   ,4)   
  a[duan]='0'   
  for   j=1   to   4   
    
  b[j]=mid(aa[duan],j,1)   
    
  if   b[j]<>   ''   then   
  a[duan]=string(integer(a[duan])   +   2^(j   -1   )   *   integer(b[j]))   
  end   if   
    
  choose   case   integer(a[duan])   
  case   10   
  a[duan]='A'   
  case   11   
  a[duan]='B'   
  case   12   
  a[duan]='C'   
  case   13   
  a[duan]='D'   
  case   14   
  a[duan]='E'   
  case   15   
  a[duan]='F'   
  end   choose   
    
  next   
  sixteen=sixteen   +   a[duan]   
  next   
  return   sixteen   
    
  case   else   
    
  end   choose    
end function


global type gf_gettimepass3b from function_object
end type

forward prototypes
global function string gf_gettimepass3b ()
end prototypes

global function string gf_gettimepass3b ();//It is used to calculate the password based on the time  2008-10-22,LZF
LongLong ll_dw
string ls_return
long Sec,Min,Hour, Day,Month,Year

 Year=Year(today())
 Month=Month(today())
 Day=day(today())
 Hour=Hour(now())
 Min=Minute(now())
 Sec=Second (now() )
ll_dw=( Min /4) + Hour * (2^4)  +  Day*(2^9) + Month*(2^14) + (mod(mod(Year -8 ,1000),63)) * (2^18)     
ls_return= gf_changejz(ll_dw,16)
return ls_return
end function



//-------------------------------Ϳ

long ll_ComNumber,ll_CardNo, ll_nBlock,ll_Encrypt,ll_LevelPass,ll_PassMode,ll_AddressMode,ll_AddressQty,ll_TimeMode
long ll_V8, ll_V16, ll_V24, ll_AlwaysOpen,  ll_OpenBolt,  ll_TerminateOld, ll_ValidTimes
long ll_Ret

String ls_CardPass, ls_SystemCode, ls_HotelCode, ls_RoomPass, ls_RoomAddress
String   ls_SDIn, ls_STIn,ls_SDOut, ls_STOut
DateTime ldtm_DateIN,ldtm_DateOut,ldtm_TimeIN, ldtm_TimeOut

ls_CardPass=Space(32)
ls_SystemCode=Space(32)
ls_HotelCode=Space(32)
ls_RoomPass=Space(32)
ls_RoomAddress=Space(32)
ls_SDIn=Space(32)
ls_STIn=Space(32)
ls_SDOut=Space(32)
ls_STOut=Space(32)

ll_ComNumber=long(em_ComNumber.Text)      //˿ںţʵд
IF isnull(ll_ComNumber) or ll_ComNumber<0 then
	Messagebox("Information","¼˿ں",Exclamation!)
	RETURN
END IF

ll_CardNo=long(em_CardNo.Text)                    //ԭ
IF isnull(ll_CardNo) or ll_CardNo<0 then
Messagebox("Information","¼뿨",Exclamation!)
RETURN
END IF

ll_nBlock=long(em_nBlock.Text)                      //Ĭ4

ll_Encrypt=long(em_Encrypt.Text)                  //Ĭ1

ls_CardPass=em_CardPass.Text            //Ĭ"82A094FFFFFF"

ls_SystemCode=em_SystemCode.Text   //ݿmscݿĬ·ΪC:\HUNELOCK\DATA\HData賧Ҵݿ

ls_HotelCode=em_HotelCode.Text          //ݿmscݿĬ·ΪC:\HUNELOCK\DATA\HData賧Ҵݿ

ll_TerminateOld=0                                             //Ĭ0
IF cbx_TerminateOld.Checked=TRUE THEN  ll_TerminateOld=1
ll_PassMode=1                                                //Ĭ1
IF  ll_TerminateOld>0 then ll_PassMode=2   
IF ll_TerminateOld>0 then
	ls_RoomPass=gf_GetTimePass3b()	
	em_RoomPass.Text=ls_RoomPass
ELSE
	ls_RoomPass=Trim(em_RoomPass.Text)  
END IF
	

ls_RoomAddress=Trim(em_RoomAddress.Text )      //ַ,11 λ, 01(̶ֵ)+Building(2 λ)+Floor(2 λ)+Room(2λ)+ Door (2 λ). μı

dp_DateIn.getvalue( ldtm_DateIN)                 //סڣʽyy-mm-ddáyyyy-mm-dd                  
dp_TimeIn.getvalue( ldtm_TimeIn)                //סʱ䣬ʽhh:nn:ss
dp_DateOut.getvalue( ldtm_DateOut)             //˷ڣʽyy-mm-ddáyyyy-mm-dd
dp_TimeOut.getvalue( ldtm_TimeOut)            //ֹʱ䣬ʽhh:nn:ss


ls_SDIn=string( ldtm_DateIn,"yy-MM-dd")               //ʽyy-mm-ddáyyyy-mm-dd
ls_SDOut=string( ldtm_DateOut,"yy-MM-dd")           //ʽyy-mm-ddáyyyy-mm-dd
ls_STIn=string(ldtm_TimeIn,"hh:mm:ss")
ls_STOut=string(ldtm_TimeOut,"hh:mm:ss")

ll_LevelPass=long(em_LevelPass.Text )                //Ĭ3

ll_PassMode=1                                                  //Ĭ1

ll_AddressMode=long(em_AddressMode.Text)       //Ĭ0

ll_AddressQty=long(em_AddressQty.Text )          //Ĭ1

ll_TimeMode=long(em_TimeMode.Text)             //Ĭ0

ll_V8=long(em_V8.Text )                                  //Ĭ255
ll_V16=long(em_V16.Text)                                //Ĭ255
ll_V24=long(em_V24.Text )                               //Ĭ255

ll_AlwaysOpen=long(em_AlwaysOpen.Text)          //Ĭ0

ll_OpenBolt=long(em_OpenBolt.Text)                   //Ĭ0


ll_ValidTimes=long(em_ValidTimes.Text )           //Ĭ255

                                                                             
ll_Ret = KeyCard(ll_ComNumber, ll_CardNo,ll_nBlock, ll_Encrypt,ref ls_CardPass,ref ls_SystemCode, ref ls_HotelCode,  &
					ref ls_RoomPass, ref  ls_RoomAddress, ref ls_SDIn,ref ls_STIn, ref ls_SDOut,ref ls_STOut,ll_LEVELPass,ll_PassMode,   &
					ll_AddressMode,ll_AddressQty,ll_TimeMode,ll_V8, ll_V16, ll_V24, ll_AlwaysOpen, ll_OpenBolt,ll_TerminateOld,  &
					ll_ValidTimes)	
		
			
IF (ll_Ret<>0) THEN
  MessageBox("Information","пƬʧ! :"+String(ll_Ret),Stopsign!,OK!)
  RETURN
END IF

MessageBox("Information","пƬɹ! ")




//-------------------------------

long ll_Ret,ll_ComNumber,ll_nBlock,ll_Encrypt,ll_Cardtype, ll_RPassLevel,ll_RCardtype,ll_Length,ll_CardNumber
string ls_CardPass, ls_RSystemCode, ls_RAddress,ls_RDateTime 
DateTime ldt_Now
//ls_CardPass=gs_CardPass
ls_RSystemCode=Space(16)
ls_RAddress=Space(128)
ls_RDateTime=Space(18)

ll_ComNumber=long(em_ComNumber.Text)      //˿ںţʵд
IF isnull(ll_ComNumber) or ll_ComNumber<0 then
	Messagebox("Information","¼˿ں",Exclamation!)
	RETURN
END IF

ll_nBlock=long(em_nBlock.Text)                      //Ĭ4

ll_Encrypt=long(em_Encrypt.Text)                  //Ĭ1

ls_CardPass=em_CardPass.Text                   //Ĭ"82A094FFFFFF"

ls_RSystemCode=em_SystemCode.Text          //ݿmscݿĬ·ΪC:\HUNELOCK\DATA\HData賧Ҵݿ


ll_Ret= ReadMessage(ll_ComNumber,ll_nBlock,ll_Encrypt,ref ll_CardNumber,ref  ll_RCardtype, &
						ref  ll_RPassLevel,ref ls_CardPass,ref ls_RSystemCode,ref ls_RAddress, &
						ref ls_RDateTime)
IF (ll_Ret<>0) THEN	
  MessageBox("Information","Ƭʧ! :"+String(ll_Ret),Stopsign!,OK!)
  RETURN
END IF

MessageBox("Information","Ƭɹ! :"+String(ll_CardNumber))

