<!--#include file="const.asp"-->
<%
Admin_header
'=====================================================================
' 软件名称：新云网站管理系统
' 当前版本：NewAsp Content Management System Version 4.0
' 文件名称：admin_replace.asp
' 更新日期：2008-05-16
' 官方网站：新云网络(www.NewAsp.net www.NewAsp.cn) QQ：94022511
'=====================================================================
' Copyright 2003-2008 NewAsp.net - All Rights Reserved.
' newasp is a trademark of NewAsp.net
'=====================================================================
%>
<table class="table1" cellspacing="1" cellpadding="3" align="center" border="0">
	<tr>
		<td class="tableline linetitle" width="200" align="left">在线列表管理</td>
		<td class="tableline" width="*" align="right"><a href="admin_setting.asp">问吧设置</a>
			 - <a href="admin_online.asp">管理首页</a>
			 - <a href="admin_online.asp?action=zone&ChannelID=<%=ChannelID%>">详细地址</a>
			 - <a href="admin_online.asp?action=refer&ChannelID=<%=ChannelID%>">访问来源</a>
			 - <a href="admin_online.asp?action=delall" onclick="{if(confirm('您确定要删除所有在线人数吗?')){return true;}return false;}"><font color="blue">删除所有在线人数</font></a>
		</td>
	</tr>
</table>
<%
Dim maxperpage,totalrec,Pcount,pagelinks,showmode,pagenow,count
Dim Action,OnlineArry

maxperpage = 30 '###每页显示数
count=NewAsp.ChkNumeric(Request("count"))
pagenow=NewAsp.ChkNumeric(Request("page"))
If pagenow=0 Then pagenow=1
Action = LCase(Request("action"))
If Not ChkAdmin("Online") Then
	Call Transfer_error()
End If
Select Case Trim(Action)
Case "refer"
	Call OnlineReferer()
Case "zone"
	Call OnlineZone()
Case "del"
	Call DelOnline()
Case "delall"
	Call DelAllOnline()
Case "remove"
	Call DelCount()
Case "removeall"
	Call DelAllCount()
Case Else
	Call showmain()
End Select
If FoundErr = True Then
	ReturnError(ErrMsg)
End If
Admin_footer
SaveLogInfo(AdminName)
NewAsp.PageEnd
Ask_CloseConn

Sub showmain()
	Dim i,iCount,lCount
	iCount=2:lCount=2
%>
<table id="tablehovered" border="0" align="center" cellpadding="3" cellspacing="1" class="tableborder">
<tr>
	<th width='5%' nowrap>选择</th>
	<th nowrap>用 户 名</th>
	<th nowrap>访 问 时 间</th>
	<th nowrap>活 动 时 间</th>
	<th nowrap>用 户 IP 地 址</th>
	<th nowrap>操 作 系 统</th>
	<th nowrap>浏 览 器</th>
</tr>
<tr>
	<td class="tablerow1" colspan="7" align="left" id="showNextPage">&nbsp;</td>
</tr>
<form name="selform" method="post" action="?action=del">
<%
	Call showMainOnline()
	If IsArray(OnlineArry) Then
		For i=0 To Ubound(OnlineArry,2)
			If Not Response.IsClientConnected Then Response.End
			If (i mod 2) = 0 Then
				iCount=2:lCount=1
			Else
				iCount=1:lCount=2
			End If
%>
<tr align="center">
	<td class="tablerow<%=iCount%> hovered"><input type="checkbox" name="OnlineID" value="<%=OnlineArry(0,i)%>"></td>
	<td class="tablerow<%=iCount%> hovered"><%=OnlineArry(1,i)%></td>
	<td class="tablerow<%=iCount%> hovered"><%=OnlineArry(2,i)%></td>
	<td class="tablerow<%=iCount%> hovered"><%=OnlineArry(3,i)%></td>
	<td class="tablerow<%=iCount%> hovered"><%=OnlineArry(4,i)%></td>
	<td class="tablerow<%=iCount%> hovered"><%=usersysinfo(OnlineArry(5,i), 0)%></td>
	<td class="tablerow<%=iCount%> hovered"><%=usersysinfo(OnlineArry(5,i), 1)%></td>
</tr>
<%
		Next
	End If
%>
<tr>
	<td class="tablerow<%=lCount%>" colspan="7">
	<input class="button" type="button" name="chkall" value="全选" onClick="CheckAll(this.form)"><input class="button" type="button" name="chksel" value="反选" onClick="ContraSel(this.form)">
	<input class="button" type="submit" name="submit_button2" value="删除" onclick="{if(confirm('您确定要删除此在线人员吗?')){return true;}return false;}">
	<input class="button" type="button" name="submit_button3" value="清空所有在线人数" onclick="{if(confirm('您确定要清空所有在线人数吗?')){location.href='admin_online.asp?action=delall';return true;}return false;}"></td>
</tr>
</form>
<tr>
	<td class="tablerow<%=iCount%>" colspan="7" id="NextPageText"><var class="morePage"><%=showlistpage(pagenow,Pcount,maxperpage,totalrec,pagelinks)%></var></td>
</tr>
</table>
<script type="text/javascript">
document.getElementById("showNextPage").innerHTML = document.getElementById("NextPageText").innerHTML;
</script>
<%
	OnlineArry=Null
End Sub

Sub showMainOnline()
	Dim Rs,SQL
	If count=0 Then
		totalrec=NewAsp.Ask_Execute("SELECT COUNT(*) FROM [NC_Ask_Online]")(0)
	Else
		totalrec=count
	End If
	Pcount = CLng(totalrec / maxperpage)
	If Pcount < totalrec / maxperpage Then Pcount = Pcount + 1
	If pagenow>Pcount Then pagenow=1
	pagelinks="?ChannelID="&ChannelID&"&count="&totalrec&"&"
	Set Rs=NewAsp.CreateAXObject("ADODB.Recordset")
	SQL = "SELECT id,username,accesstime,activetime,ip,browser FROM [NC_Ask_Online] ORDER BY accesstime DESC"
	Rs.Open SQL,Ask_Conn,1,1
	If pagenow >1 Then
		Rs.Move (pagenow-1) * maxperpage
	End If
	If Not (Rs.BOF And Rs.EOF) Then
		OnlineArry=Rs.GetRows(maxperpage)
	Else
		OnlineArry=Null
	End If
	Rs.close()
	Set Rs=Nothing
End Sub

Sub OnlineReferer()
	Dim i,iCount,lCount
	iCount=2:lCount=2
%>
<table id="tablehovered" border="0" align="center" cellpadding="3" cellspacing="1" class="tableborder">
<tr>
	<th width='5%' nowrap>选择</th>
	<th width='15%' nowrap>来访时间/IP</th>
	<th>访 问 来 源</th>
	<th>当 前 位 置</th>
</tr>
<tr>
	<td class="tablerow1" colspan="4" align="left" id="showNextPage">&nbsp;</td>
</tr>
<form name="selform" method="post" action="?action=del">
<%
	Call showRefererList()
	If IsArray(OnlineArry) Then
		For i=0 To Ubound(OnlineArry,2)
			If Not Response.IsClientConnected Then Response.End
			If (i mod 2) = 0 Then
				iCount=2:lCount=1
			Else
				iCount=1:lCount=2
			End If
%>
<tr>
	<td align="center" class="tablerow<%=iCount%> hovered"><input type="checkbox" name="OnlineID" value="<%=OnlineArry(0,i)%>"></td>
	<td align="center" class="tablerow<%=iCount%> hovered" nowrap><%=OnlineArry(2,i)%><br/><%=OnlineArry(3,i)%></td>
	<td class="tablerow<%=iCount%> hovered"><a href="javascript:" onclick="window.open('<%=Replace(OnlineArry(4,i), "'", "&#39;")%>')"><%=Server.HTMLEncode(URLDecode(OnlineArry(4,i)))%></a></td>
	<td class="tablerow<%=iCount%> hovered"><a href="<%=OnlineArry(7,i)%>" target="_blank"><%=Server.HTMLEncode(OnlineArry(6,i))%></a></td>
</tr>
<%
		Next
	End If
%>
<tr>
	<td class="tablerow<%=lCount%>" colspan="4">
	<input class="button" type="button" name="chkall" value="全选" onClick="CheckAll(this.form)"><input class="button" type="button" name="chksel" value="反选" onClick="ContraSel(this.form)">
	<input class="button" type="submit" name="submit_button2" value="删除" onclick="{if(confirm('您确定要删除此在线人员吗?')){return true;}return false;}">
	<input class="button" type="button" name="submit_button3" value="清空所有在线人数" onclick="{if(confirm('您确定要清空所有在线人数吗?')){location.href='admin_online.asp?action=delall';return true;}return false;}"></td>
</tr>
</form>
<tr>
	<td class="tablerow<%=iCount%>" colspan="4" id="NextPageText"><var class="morePage"><%=showlistpage(pagenow,Pcount,maxperpage,totalrec,pagelinks)%></var></td>
</tr>
</table>
<script type="text/javascript">
document.getElementById("showNextPage").innerHTML = document.getElementById("NextPageText").innerHTML;
</script>
<%
	OnlineArry=Null
End Sub

Sub showRefererList()
	Dim Rs,SQL
	If count=0 Then
		totalrec=NewAsp.Ask_Execute("SELECT COUNT(*) FROM [NC_Ask_Online]")(0)
	Else
		totalrec=count
	End If
	Pcount = CLng(totalrec / maxperpage)
	If Pcount < totalrec / maxperpage Then Pcount = Pcount + 1
	If pagenow>Pcount Then pagenow=1
	pagelinks="?action=refer&ChannelID="&ChannelID&"&count="&totalrec&"&"
	Set Rs=NewAsp.CreateAXObject("ADODB.Recordset")
	SQL = "SELECT id,username,accesstime,ip,fromsite,browser,stats,url FROM [NC_Ask_Online] ORDER BY accesstime DESC"
	Rs.Open SQL,Ask_Conn,1,1
	If pagenow >1 Then
		Rs.Move (pagenow-1) * maxperpage
	End If
	If Not (Rs.BOF And Rs.EOF) Then
		OnlineArry=Rs.GetRows(maxperpage)
	Else
		OnlineArry=Null
	End If
	Rs.close()
	Set Rs=Nothing
End Sub

Sub OnlineZone()
	Dim i,iCount,lCount
	iCount=2:lCount=2
%>
<table id="tablehovered" border="0" align="center" cellpadding="3" cellspacing="1" class="tableborder">
<tr>
	<th width='5%' nowrap>选择</th>
	<th nowrap>用 户 名</th>
	<th nowrap>用 户 等 级</th>
	<th nowrap>IP 地 址</th>
	<th nowrap>详 细 地 址</th>
	<th nowrap>操 作 系 统</th>
	<th nowrap>浏 览 器</th>
</tr>
<tr>
	<td class="tablerow1" colspan="7" align="left" id="showNextPage">&nbsp;</td>
</tr>
<form name="selform" method="post" action="?action=del">
<%
	Call showZoneList()
	If IsArray(OnlineArry) Then
		For i=0 To Ubound(OnlineArry,2)
			If Not Response.IsClientConnected Then Response.End
			If (i mod 2) = 0 Then
				iCount=2:lCount=1
			Else
				iCount=1:lCount=2
			End If
%>
<tr align="center">
	<td class="tablerow<%=iCount%> hovered"><input type="checkbox" name="OnlineID" value="<%=OnlineArry(0,i)%>"></td>
	<td class="tablerow<%=iCount%> hovered" nowrap><%=OnlineArry(1,i)%></td>
	<td class="tablerow<%=iCount%> hovered"><%=OnlineArry(2,i)%></td>
	<td class="tablerow<%=iCount%> hovered"><%=Server.HTMLEncode(OnlineArry(4,i))%></td>
	<td class="tablerow<%=iCount%> hovered"><%=GetAddress(OnlineArry(4,i))%></td>
	<td class="tablerow<%=iCount%> hovered"><%=usersysinfo(OnlineArry(5,i), 0)%></td>
	<td class="tablerow<%=iCount%> hovered"><%=usersysinfo(OnlineArry(5,i), 1)%></td>
</tr>
<%
		Next
	End If
%>
<tr>
	<td class="tablerow<%=lCount%>" colspan="7">
	<input class="button" type="button" name="chkall" value="全选" onClick="CheckAll(this.form)"><input class="button" type="button" name="chksel" value="反选" onClick="ContraSel(this.form)">
	<input class="button" type="submit" name="submit_button2" value="删除" onclick="{if(confirm('您确定要删除此在线人员吗?')){return true;}return false;}">
	<input class="button" type="button" name="submit_button3" value="清空所有在线人数" onclick="{if(confirm('您确定要清空所有在线人数吗?')){location.href='admin_online.asp?action=delall';return true;}return false;}"></td>
</tr>
</form>
<tr>
	<td class="tablerow<%=iCount%>" colspan="7" id="NextPageText"><var class="morePage"><%=showlistpage(pagenow,Pcount,maxperpage,totalrec,pagelinks)%></var></td>
</tr>
</table>
<script type="text/javascript">
document.getElementById("showNextPage").innerHTML = document.getElementById("NextPageText").innerHTML;
</script>
<%
	OnlineArry=Null
End Sub

Sub showZoneList()
	Dim Rs,SQL
	If count=0 Then
		totalrec=NewAsp.Ask_Execute("SELECT COUNT(*) FROM [NC_Ask_Online]")(0)
	Else
		totalrec=count
	End If
	Pcount = CLng(totalrec / maxperpage)
	If Pcount < totalrec / maxperpage Then Pcount = Pcount + 1
	If pagenow>Pcount Then pagenow=1
	pagelinks="?action=zone&ChannelID="&ChannelID&"&count="&totalrec&"&"
	Set Rs=NewAsp.CreateAXObject("ADODB.Recordset")
	SQL = "SELECT id,username,usertitle,accesstime,ip,browser FROM [NC_Ask_Online] ORDER BY accesstime DESC"
	Rs.Open SQL,Ask_Conn,1,1
	If pagenow >1 Then
		Rs.Move (pagenow-1) * maxperpage
	End If
	If Not (Rs.BOF And Rs.EOF) Then
		OnlineArry=Rs.GetRows(maxperpage)
	Else
		OnlineArry=Null
	End If
	Rs.close()
	Set Rs=Nothing
End Sub

Sub DelAllOnline()
	NewAsp.Ask_Execute("DELETE FROM NC_Ask_Online")
	Call OutputScript ("在线人数全部清除完成！","admin_online.asp")
End Sub

Sub DelOnline()
	Dim OnlineID
	If Request("OnlineID") <> "" Then
		OnlineID = NewAsp.CheckIDlist(Request("OnlineID"))
		NewAsp.Ask_Execute("DELETE FROM NC_Ask_Online WHERE ID in (" & OnlineID & ")")
		Response.Redirect (Request.ServerVariables("HTTP_REFERER"))
	Else
		OutAlertScript("请选择正确的系统参数！")
	End If
End Sub

Function usersysinfo(info, getinfo)
	Dim usersys
	usersys = Split(info, "|")
	usersysinfo = usersys(getinfo)
End Function

Function GetAddress(sip)
	If Len(sip) < 5 Then
		GetAddress = "未知"
		Exit Function
	End If
	On Error Resume Next
	Dim Wry,IPType
	Set Wry = New TQQWry
	If Not Wry.IsIp(sip) Then
		GetAddress = " 未知"
		Exit Function
	End If
	IPType = Wry.QQWry(sip)
	GetAddress = Wry.Country & " " & Wry.LocalStr
End Function

Class TQQWry
	' ============================================
	' 变量声名
	' ============================================
	Dim Country, LocalStr, Buf, OffSet
	Private StartIP, EndIP, CountryFlag
	Public QQWryFile
	Public FirstStartIP, LastStartIP, RecordCount
	Private Stream, EndIPOff
	' ============================================
	' 类模块初始化
	' ============================================
	Private Sub Class_Initialize
		On Error Resume Next
		Country 		= ""
		LocalStr 		= ""
		StartIP 		= 0
		EndIP 			= 0
		CountryFlag 	= 0
		FirstStartIP 	= 0
		LastStartIP 	= 0
		EndIPOff 		= 0
		QQWryFile = Server.MapPath("../../DataBase/IPAddress.dat") 'QQ IP库路径，要转换成物理路径
	End Sub
	' ============================================
	' IP地址转换成整数
	' ============================================
	Function IPToInt(IP)
		Dim IPArray, i
		IPArray = Split(IP, ".", -1)
		FOr i = 0 to 3
			If Not IsNumeric(IPArray(i)) Then IPArray(i) = 0
			If CInt(IPArray(i)) < 0 Then IPArray(i) = Abs(CInt(IPArray(i)))
			If CInt(IPArray(i)) > 255 Then IPArray(i) = 255
		Next
		IPToInt = (CInt(IPArray(0))*256*256*256) + (CInt(IPArray(1))*256*256) + (CInt(IPArray(2))*256) + CInt(IPArray(3))
	End Function
	' ============================================
	' 整数逆转IP地址
	' ============================================
	Function IntToIP(IntValue)
		p4 = IntValue - Fix(IntValue/256)*256
		IntValue = (IntValue-p4)/256
		p3 = IntValue - Fix(IntValue/256)*256
		IntValue = (IntValue-p3)/256
		p2 = IntValue - Fix(IntValue/256)*256
		IntValue = (IntValue - p2)/256
		p1 = IntValue
		IntToIP = Cstr(p1) & "." & Cstr(p2) & "." & Cstr(p3) & "." & Cstr(p4)
	End Function
	' ============================================
	' 获取开始IP位置
	' ============================================
	Private Function GetStartIP(RecNo)
		OffSet = FirstStartIP + RecNo * 7
		Stream.Position = OffSet
		Buf = Stream.Read(7)

		EndIPOff = AscB(MidB(Buf, 5, 1)) + (AscB(MidB(Buf, 6, 1))*256) + (AscB(MidB(Buf, 7, 1))*256*256)
		StartIP  = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256) + (AscB(MidB(Buf, 4, 1))*256*256*256)
		GetStartIP = StartIP
	End Function
	' ============================================
	' 获取结束IP位置
	' ============================================
	Private Function GetEndIP()
		Stream.Position = EndIPOff
		Buf = Stream.Read(5)
		EndIP = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256) + (AscB(MidB(Buf, 4, 1))*256*256*256)
		CountryFlag = AscB(MidB(Buf, 5, 1))
		GetEndIP = EndIP
	End Function
	' ============================================
	' 获取地域信息，包含国家和和省市
	' ============================================
	Private Sub GetCountry(IP)
		If (CountryFlag = 1 Or CountryFlag = 2) Then
			Country = GetFlagStr(EndIPOff + 4)
			If CountryFlag = 1 Then
				LocalStr = GetFlagStr(Stream.Position)
				' 以下用来获取数据库版本信息
				If IP >= IPToInt("255.255.255.0") And IP <= IPToInt("255.255.255.255") Then
					LocalStr = GetFlagStr(EndIPOff + 21)
					Country = GetFlagStr(EndIPOff + 12)
				End If
			Else
				LocalStr = GetFlagStr(EndIPOff + 8)
			End If
		Else
			Country = GetFlagStr(EndIPOff + 4)
			LocalStr = GetFlagStr(Stream.Position)
		End If
		' 过滤数据库中的无用信息
		Country = Trim(Country)
		LocalStr = Trim(LocalStr)
		If InStr(Country, "CZ88.NET") Then Country = "GZ110.CN"
		If InStr(LocalStr, "CZ88.NET") Then LocalStr = "GZ110.CN"
	End Sub
	' ============================================
	' 获取IP地址标识符
	' ============================================
	Private Function GetFlagStr(OffSet)
		Dim Flag
		Flag = 0
		Do While (True)
			Stream.Position = OffSet
			Flag = AscB(Stream.Read(1))
			If(Flag = 1 Or Flag = 2 ) Then
				Buf = Stream.Read(3)
				If (Flag = 2 ) Then
					CountryFlag = 2
					EndIPOff = OffSet - 4
				End If
				OffSet = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256)
			Else
				Exit Do
			End If
		Loop

		If (OffSet < 12 ) Then
			GetFlagStr = ""
		Else
			Stream.Position = OffSet
			GetFlagStr = GetStr()
		End If
	End Function
	' ============================================
	' 获取字串信息
	' ============================================
	Private Function GetStr()
		Dim c
		GetStr = ""
		Do While (True)
			c = AscB(Stream.Read(1))
			If (c = 0) Then Exit Do

			'如果是双字节，就进行高字节在结合低字节合成一个字符
			If c > 127 Then
				If Stream.EOS Then Exit Do
				GetStr = GetStr & Chr(AscW(ChrB(AscB(Stream.Read(1))) & ChrB(C)))
			Else
				GetStr = GetStr & Chr(c)
			End If
		Loop
	End Function
	' ============================================
	' 核心函数，执行IP搜索
	' ============================================
	Public Function QQWry(DotIP)
		Dim IP, nRet
		Dim RangB, RangE, RecNo

		IP = IPToInt (DotIP)

		Set Stream = CreateObject("ADodb.Stream")
		Stream.Mode = 3
		Stream.Type = 1
		Stream.Open
		Stream.LoadFromFile QQWryFile
		Stream.Position = 0
		Buf = Stream.Read(8)

		FirstStartIP = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256) + (AscB(MidB(Buf, 4, 1))*256*256*256)
		LastStartIP  = AscB(MidB(Buf, 5, 1)) + (AscB(MidB(Buf, 6, 1))*256) + (AscB(MidB(Buf, 7, 1))*256*256) + (AscB(MidB(Buf, 8, 1))*256*256*256)
		RecordCount = Int((LastStartIP - FirstStartIP)/7)
		' 在数据库中找不到任何IP地址
		If (RecordCount <= 1) Then
			Country = "未知"
			QQWry = 2
			Exit Function
		End If

		RangB = 0
		RangE = RecordCount

		Do While (RangB < (RangE - 1))
			RecNo = Int((RangB + RangE)/2)
			Call GetStartIP (RecNo)
			If (IP = StartIP) Then
				RangB = RecNo
				Exit Do
			End If
			If (IP > StartIP) Then
				RangB = RecNo
			Else
				RangE = RecNo
			End If
		Loop

		Call GetStartIP(RangB)
		Call GetEndIP()

		If (StartIP <= IP) And ( EndIP >= IP) Then
			' 没有找到
			nRet = 0
		Else
			' 正常
			nRet = 3
		End If
		Call GetCountry(IP)

		QQWry = nRet
	End Function
	' ============================================
	' 检查IP地址合法性
	' ============================================
	Public Function IsIp(IP)
		IsIp = True
		If IP = "" Then IsIp = False : Exit Function
		Dim Re
		Set Re = New RegExp
		Re.Pattern = "^(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5])\.(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5])\.(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5])\.(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5])$"
		Re.IgnoreCase = True
		Re.Global = True
		IsIp = Re.Test(IP)
		Set Re = Nothing
	End Function
	' ============================================
	' 类终结

	' ============================================
	Private Sub Class_Terminate
		On ErrOr Resume Next
		Stream.Close
		If Err Then Err.Clear
		Set Stream = Nothing
	End Sub
End Class

%>