/**
* ----------------------------------------------------------common start--------------------------------------------------------------
*/
//采集指纹次数
var FINGERPRINT_NUMBER = 3;
//胁迫指纹数--胁迫指纹时,在普通指纹上加的数
var DURESS_FINGER_NUM = 16;
//胁迫指纹标记
var duressFingerFlag = null;
//是否显示胁迫指纹(用户登记指纹时,不需要胁迫指纹),默认显示胁迫指纹
var duressFingerShowFlag = true;
//手指标记数组
var fingerIdArray = new Array();//[]
//指纹模板数据数组
var templateDataArray = new Array();//[]
//定时器--关闭setTimeOut时用到
var timer = null;
//定时器--验证
var verifyTimer = null;
//判断当前手指是否正在采集中
var collectFlag = false;
//当前点击的手指标记
var fpIdNum = null;
//访问ISSOnline_server的ip
var serverIp = null;
//访问的ISSOnline_server端口
var serverPort = null;
//ISSOnline_server的url的公共部分:http://127.0.0.1:22001/ZKBIOOnline
//var issOnlineUrl = null;
var issOnlineUrl = "http://127.0.0.1:22001/ZKBIOOnline";
//是否是访客
var isVisPager = false;
//定义驱动的版本号
var fpDriverVersion = "5.0.0.1";
//是否为比对功能
var isComp = false;
/**
* 加载xml中ISSOnline_server的ip和port
* @author wenxin
* @create 2013-06-15 15:01:31 pm
* @param url 加载xml的url
*/
function loadXml(url) {
$.ajax({
type: "GET",
url: url,
dataType: "xml",
async: false,
success: function (xml) {
$(xml).find('service').each(function () {
var service = $(this);
serverIp = service.find('ISSOnline_serverIp').text();
serverPort = service.find('ISSOnline_serverPort').text();
})
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
//如果取配置文件出错,则设置默认
serverIp = "127.0.0.1";
serverPort = "22001";
}
});
//给issOnlineUrl赋值
issOnlineUrl = "http://" + serverIp + ":" + serverPort + "/ZKBIOOnline";
}
/**
* 获取编辑时,查询的数据库的指纹标记和指纹模板
* @author wenxin
* @create 2013-04-22 10:18:31 am
* @param fingerIdList 数据库查询的指纹标记
* @param templateList 数据库查询的指纹模板
*/
function loadFPDataTemplate(fingerIdList, templateList) {
if (fingerIdList == "[]") {
$("#fingerId").val(" ");
}
else {
$("#fingerId").val(fingerIdList);
}
if (templateList == "[]") {
$("#fingerTemplate10").val(" ");
}
else {
$("#fingerTemplate10").val(templateList);
}
}
/**
* 获取浏览器类型
* @author wenxin
* @create 2013-08-09 17:24:31 pm
*/
function getBrowserType() {
var browserFlag = "";
//是否支持html5的cors跨域
if (typeof (Worker) !== "undefined") {
browserFlag = "html5";
}
//此处判断ie8、ie9
else if (navigator.userAgent.indexOf("MSIE 8.0") > 0 || navigator.userAgent.indexOf("MSIE 9.0") > 0) {
browserFlag = "simple";
}
else {
browserFlag = "upgradeBrowser";//当前浏览器不支持该功能,请升级浏览器
}
return browserFlag;
}
/**
* 判断是否安装指纹驱动
* @author wenxin
* @create 2013-04-22 20:18:31 pm
* @param browserFlag 浏览器标记 simple:简易版本,表示是ie浏览器;html5:表示支持html5的浏览器
* @param paramArray 存放国际化元素的数组
* @param isFPLogin 是否是指纹登录 true:是;false:否
*/
function checkDriver(paramArray, browserFlag, isFPLogin) {
var hrefStr = "";
if (browserFlag == "html5") {
// 发送一个请求,检查是否安装驱动
getWebServerInfo(paramArray, isFPLogin, "0");
}
else if (browserFlag == "simple") {
//发送一个请求,检查是否安装驱动
getWebServerInfoForSimple(paramArray, isFPLogin, "0");
}
else if (browserFlag == "upgradeBrowser") {
if ($("#userLoginForm [name='fingerLogin']").val() != undefined) {
$("#userLoginForm [name='fingerLogin']").attr("onclick", "");
$("#userLoginForm [name='fingerLogin']").attr("title", "当前浏览器不支持改功能,请升级浏览器!");
}
if ($("#fpRegister").val() != undefined) {
$("#fpRegister").attr("onclick", "");
$("#fpRegister").attr("title", "当前浏览器不支持改功能,请升级浏览器!");
}
}
}
/**
* 获取webserver的信息
* @author wenxin
* @param
* @param paramArray 存放国际化元素的数组
* @param isFPLogin 是否是指纹登录 true:是;false:否
* @param type 0 表示发送完请求后,还有别的操作。1 表示发送完请求后,没有其余的操作了
* @create 2013-08-09 17:24:31 pm
*/
function getWebServerInfo(paramArray, isFPLogin, type) {
$.ajax({
type: "GET",
url: issOnlineUrl + "/info",
dataType: "json",
async: true,
//timeout:1000,
success: function (result) {
//检查驱动
if (type == "0") {
getWebServerInfoCallBack(result, paramArray, isFPLogin);
}
//检查动态库连接
else if (type == "1") {
getDLLConnectCallBack(result, isComp);
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
}
});
}
/**
* 获取webserver的信息
* @author wenxin
* @param paramArray 存放国际化元素的数组
* @param isFPLogin 是否是指纹登录 true:是;false:否
* @param type 0 表示发送完请求后,还有别的操作。1 表示发送完请求后,没有其余的操作了
* @create 2013-08-09 17:24:31 pm
*/
function getWebServerInfoForSimple(paramArray, isFPLogin, type) {
//创建XDomainRequest实例,用于ie8和ie9跨域访问
var xDomainRequest = new XDomainRequest();
//如果xDomainRequest存在,则可以使用xDomainRequest函数,否则,说明不是ie浏览器
if (xDomainRequest) {
xDomainRequest.open('GET', issOnlineUrl + "/info?random=" + getRandomNum());
xDomainRequest.onload = function () {
//检查驱动
if (type == "0") {
getInfoForSimpleCallBack(xDomainRequest, paramArray, isFPLogin);
}
//检查动态库连接
else if (type == "1") {
getDLLConnectCallBack(xDomainRequest, isComp);
}
};
xDomainRequest.onerror = function () {
//用完后,将对象置为空
xDomainRequest = null;
};
xDomainRequest.send();
}
}
/**
* 获取webserver信息的回调函数
* @author wenxin
* @create 2013-08-09 17:24:31 pm
*/
function getWebServerInfoCallBack(result, paramArray, isFPLogin) {
//返回码
var ret = null;
ret = result.ret;
//接口调用成功返回时
if (ret == 0) {
if (isFPLogin) {
//显示指纹登录
showFPVerify(paramArray);
}
else {
//显示登记--可以点击采集指纹
showRegister(paramArray);
//计算指纹数量${pers_person_templateCount}:指纹数
showFPCountInit(paramArray[5], paramArray[6]);
//鼠标over事件
//mouseOverEvent();
// 对比指纹驱动
if (result.data && result.data.server_version) {
compareFPDriver(result.data.server_version);
}
}
}
}
/**
* 显示指纹登录--点击进行指纹验证
* @author wenxin
* @create 2013-06-14 10:09:20 am
* @param paramArray 存放国际化元素的数组
*/
function showFPVerify(paramArray) {
$("#userLoginForm .but_fing_disabled").hide();
$("#userLoginForm .but_fing").show();
}
/**
* 显示登记--点击采集指纹
* @author wenxin
* @create 2013-06-14 10:09:20 am
* @param paramArray 存放国际化元素的数组
*/
function showRegister(paramArray) {
var hrefStr = "";
var param = '"' + paramArray[0] + '", "' + paramArray[1] + '", "' + paramArray[2] + '", ' + null + '';
$("#fpRegister").remove();
$("#downloadDriver").remove();
//webservice接口调用成功,说明驱动已经安装
hrefStr = "";
$("#fpRegisterDiv").append(hrefStr);
}
/**
* 在页面初始化时,计算指纹数量
* @author wenxin
* @create 2013-04-25 11:31:20 am
*
*/
function showFPCountInit(fingerIdCount, text) {
$("#fpCountMessage").text(text + " " + fingerIdCount);
}
/**
* 对比指纹驱动版本
* @author gordon.zhang
* @param oldVersion 旧驱动版本
* @create 2015-01-28 17:24:31 pm
*/
function compareFPDriver(oldVersion) {
var existVersion = fpDriverVersion
var curVersion = oldVersion;//3.5.2
var existVersionArr = existVersion.split(".");
var curVersionArr = curVersion.split(".");
var isLast = true;
var len = existVersionArr.length;
for (var i = len; i > 0; i--) {
var existVersionTemp = parseInt(existVersionArr[i - 1]);
var curVersionTemp = parseInt(curVersionArr[i - 1]);
if (existVersionTemp < curVersionTemp) {
isLast = false;
}
else if (existVersionTemp > curVersionTemp) {
isLast = true;
}
else {
//等于 忽略
}
}
}
/**
* 显示发现新驱动
* @author gordon.zhang
* @create 2015-01-28 17:24:31 pm
*/
function showNewDriver() {
var hrefStr = "下载新驱动";
$("#driverDownload").append(hrefStr);
}
/**
* 获取webserver的信息--简易版
* @author wenxin
* @param paramArray 存放国际化元素的数组
* @param isFPLogin 是否是指纹登录 true:是;false:否
* @create 2013-08-09 17:43:31 pm
*/
function getInfoForSimpleCallBack(xDomainRequest, paramArray, isFPLogin) {
//获取接口返回值
var resultData = xDomainRequest.responseText;
//转化为json对象
var obj = jQuery.parseJSON(resultData);
//返回码
var ret = null;
if (obj != null && obj.ret != undefined) {
ret = obj.ret;
}
//接口调用成功返回时
if (ret == 0) {
if (isFPLogin) {
//显示指纹比对
showFPVerify(paramArray);
}
else {
//显示登记--点击采集指纹
showRegister(paramArray);
//计算指纹数量${pers_person_templateCount}:指纹数
showFPCountInit(paramArray[5], paramArray[6]);
//鼠标over事件
//mouseOverEvent();
}
//用完后,将对象置为空
xDomainRequest = null;
}
}
//------
/**
* 点击登记,触发事件
* @author wenxin
* @create 2013-05-21 11:31:20 am
* @param title 页面标题国际化内容
* @param fpCount 指纹数国际化内容
* @param saveText 提示:是否保存国际化内容
* @param downloadText 驱动安装国际化内容
* @param isDriverInstall 是否安装了驱动
*/
function submitRegister(title, fpCount, saveText, downloadText, isDriverInstall) {
//支持html5
if (typeof (Worker) !== "undefined" && isDriverInstall) {
var box = document.getElementById("box");
var bg = document.getElementById("bg");
box.style.display = "block";//显示内容层,显示覆盖层
box.style.left = parseInt((document.documentElement.scrollWidth - box.offsetWidth) / 2) + document.documentElement.scrollLeft + "px";
box.style.top = Math.abs(parseInt((document.documentElement.clientHeight - box.offsetHeight) / 2)) + document.documentElement.scrollTop + "px"; //为内容层设置位置
bg.style.display = "block";
bg.style.height = document.documentElement.scrollHeight + "px";
isComp = false;
dataInitReg();
//关闭页面时,提示保存数据
//storeBeforeClose(fpCount, saveText);
}
else if (typeof (Worker) == "undefined" && isDriverInstall) {
//createWindow('base_baseFPRegisterSimple.action?random=' + getRandomNum() + '^0^0^465^460^' + title);//public/html/applet.html
showModalDialog('webapp/html/baseFPRegisterSimple.html', title, 'dialogWidth:465px;dialogHeight:460px;dialogLeft:600px;dialogTop:150px;center:yes;resizable:no;status:yes');
//关闭页面时,提示保存数据
//storeBeforeClose(fpCount, saveText);
}
else if (!isDriverInstall) {
alert("请安装指纹驱动或启动该服务!");
//messageBox({messageType: "alert", title: "提示", text: "请安装指纹驱动或启动该服务!"});
if (typeof ($("#downloadDriver").val()) == "undefined") {
var hrefStr = "" + downloadText + "";
$("#driverDownload").append(hrefStr);
}
}
}
/**
* 关闭页面时,如果有修改操作,则提示用户保存数据
* @author wenxin
* @create 2013-06-08 19:36:20 pm
* @param fpCount 指纹数国际化内容
* @param saveText 提示:是否保存国际化内容
*/
function storeBeforeClose(fpCount, saveText) {
//关闭页面时,监听关闭的onclick事件
getCurrentWindow().button("close").attachEvent("onClick", function () {
//判断是否修改了数据(包括新增和删除)
if ($("#whetherModify").val() != undefined && (fpModifyFlag != undefined && fpModifyFlag)) {
//获取指纹标记数据
var fingerIdData = fingerIdArray;
//获取指纹模板数据
var fingerTemplateData = templateDataArray;
var flag = confirm(saveText);
saveFPData(flag, fpCount);
}
else {
//取消采集
cancelRegister();
//将定时器的递归调用关闭
clearTimeout(timer);
//closeWindow();
close();
}
});
}
/**
* 获取页面的指纹数据
* @author wenxin
* @create 2013-05-13 10:18:31 am
* @param
*/
function getDataFromPage() {
var fingerId = $("#fingerId").val();
var fingerTemplate = $("#fingerTemplate10").val();
//如果有数据
if ($.trim(fingerId) != "") {
fingerId = fingerId.substr(1, fingerId.length - 2);
fingerTemplate = fingerTemplate.substr(1, fingerTemplate.length - 2);
fingerIdArray = fingerId.split(",");
templateDataArray = fingerTemplate.split(",");
} else {
fingerIdArray = new Array();
templateDataArray = new Array();
}
}
/**
* 初始化绘画手指、手掌、圆弧的起始坐标,并做成json格式
* @author wenxin
* @create 2013-06-15 15:40:31 pm
*/
function initCoordJson() {
var coordJson = [{ "num": 0, "coord": { "x": x + 3, "y": y - 37 } },
{ "num": 1, "coord": { "x": x + 25, "y": y - 37 } },
{ "num": 2, "coord": { "x": x + 47, "y": y - 34 } },
{ "num": 3, "coord": { "x": x + 67, "y": y - 26 } },
{ "num": 4, "coord": { "x": x + 77, "y": y + 18 } },
{ "num": 5, "coord": { "x": x + 153, "y": y + 34 } },
{ "num": 6, "coord": { "x": x + 159, "y": y - 19 } },
{ "num": 7, "coord": { "x": x + 177, "y": y - 30 } },
{ "num": 8, "coord": { "x": x + 198, "y": y - 36 } },
{ "num": 9, "coord": { "x": x + 220, "y": y - 36 } },
{ "num": 10, "coord": { "x": x, "y": y } },
{ "num": 11, "coord": { "x": x + 170, "y": y + 12 } },
{ "num": 12, "coord": { "x": x + 210, "y": y - 346 } }];
return coordJson;
}
/**
* 将绘画的坐标点放入数组
* @author wenxin
* @create 2013-05-31 18:01:33 pm
* @param coordArray 传入的数组,放入坐标后,返回
* @param x, y 绘画手指的起点的坐标
* @param num 手指、手掌编号0-9:手指编号;10:左手掌,11:右手掌,12:圆弧。
*/
function initCoordArray(coordArray, x, y, num) {
if (num == 0) {
coordArray[0] = new Coord(x, y);
coordArray[1] = new Coord(x + 2, y - 35);
coordArray[2] = new Coord(x + 5, y - 40);
coordArray[3] = new Coord(x + 11, y - 42);
coordArray[4] = new Coord(x + 16, y - 40);
coordArray[5] = new Coord(x + 18, y - 35);
coordArray[6] = new Coord(x + 18, y + 1);
coordArray[7] = new Coord(x + 15, y + 5);
coordArray[8] = new Coord(x + 9, y + 7);
coordArray[9] = new Coord(x + 3, y + 5);
coordArray[10] = new Coord(x, y);
}
else if (num == 1) {
coordArray[0] = new Coord(x, y);
coordArray[1] = new Coord(x + 8, y - 50);
coordArray[2] = new Coord(x + 12, y - 54);
coordArray[3] = new Coord(x + 19, y - 55);
coordArray[4] = new Coord(x + 22, y - 53);
coordArray[5] = new Coord(x + 24, y - 49);
coordArray[6] = new Coord(x + 18, y + 1);
coordArray[7] = new Coord(x + 15, y + 6);
coordArray[8] = new Coord(x + 8, y + 7);
coordArray[9] = new Coord(x + 3, y + 4);
coordArray[10] = new Coord(x, y);
}
else if (num == 2) {
coordArray[0] = new Coord(x, y);
coordArray[1] = new Coord(x + 14, y - 54);
coordArray[2] = new Coord(x + 16, y - 57);
coordArray[3] = new Coord(x + 23, y - 58);
coordArray[4] = new Coord(x + 28, y - 55);
coordArray[5] = new Coord(x + 29, y - 50);
coordArray[6] = new Coord(x + 17, y + 4);
coordArray[7] = new Coord(x + 13, y + 8);
coordArray[8] = new Coord(x + 6, y + 9);
coordArray[9] = new Coord(x + 1, y + 5);
coordArray[10] = new Coord(x, y);
}
else if (num == 3) {
coordArray[0] = new Coord(x, y);
coordArray[1] = new Coord(x + 19, y - 37);
coordArray[2] = new Coord(x + 21, y - 39);
coordArray[3] = new Coord(x + 28, y - 39);
coordArray[4] = new Coord(x + 32, y - 36);
coordArray[5] = new Coord(x + 33, y - 31);
coordArray[6] = new Coord(x + 17, y + 6);
coordArray[7] = new Coord(x + 12, y + 10);
coordArray[8] = new Coord(x + 6, y + 10);
coordArray[9] = new Coord(x + 1, y + 6);
coordArray[10] = new Coord(x, y);
}
else if (num == 4) {
coordArray[0] = new Coord(x, y);
coordArray[1] = new Coord(x + 30, y - 18);
coordArray[2] = new Coord(x + 34, y - 17);
coordArray[3] = new Coord(x + 37, y - 14);
coordArray[4] = new Coord(x + 39, y - 11);
coordArray[5] = new Coord(x + 39, y - 8);
coordArray[6] = new Coord(x + 38, y - 6);
coordArray[7] = new Coord(x + 12, y + 15);
coordArray[8] = new Coord(x + 8, y + 17);
coordArray[9] = new Coord(x + 2, y + 14);
coordArray[10] = new Coord(x - 2, y + 8);
coordArray[11] = new Coord(x, y);
}
else if (num == 5) {
coordArray[0] = new Coord(x, y);
coordArray[1] = new Coord(x - 26, y - 21);
coordArray[2] = new Coord(x - 27, y - 24);
coordArray[3] = new Coord(x - 26, y - 30);
coordArray[4] = new Coord(x - 21, y - 34);
coordArray[5] = new Coord(x - 16, y - 34);
coordArray[6] = new Coord(x + 12, y - 18);
coordArray[7] = new Coord(x + 15, y - 10);
coordArray[8] = new Coord(x + 13, y - 3);
coordArray[9] = new Coord(x + 7, y + 1);
coordArray[10] = new Coord(x, y);
}
else if (num == 6) {
coordArray[0] = new Coord(x, y);
coordArray[1] = new Coord(x - 17, y - 46);
coordArray[2] = new Coord(x - 17, y - 50);
coordArray[3] = new Coord(x - 13, y - 56);
coordArray[4] = new Coord(x - 6, y - 56);
coordArray[5] = new Coord(x - 3, y - 54);
coordArray[6] = new Coord(x + 15, y - 11);
coordArray[7] = new Coord(x + 15, y - 4);
coordArray[8] = new Coord(x + 11, y + 2);
coordArray[9] = new Coord(x + 4, y + 2);
coordArray[10] = new Coord(x, y);
}
else if (num == 7) {
coordArray[0] = new Coord(x, y);
coordArray[1] = new Coord(x - 12, y - 54);
coordArray[2] = new Coord(x - 10, y - 58);
coordArray[3] = new Coord(x - 5, y - 62);
coordArray[4] = new Coord(x + 1, y - 61);
coordArray[5] = new Coord(x + 4, y - 58);
coordArray[6] = new Coord(x + 18, y - 4);
coordArray[7] = new Coord(x + 16, y + 1);
coordArray[8] = new Coord(x + 11, y + 5);
coordArray[9] = new Coord(x + 5, y + 4);
coordArray[10] = new Coord(x, y);
}
else if (num == 8) {
coordArray[0] = new Coord(x, y);
coordArray[1] = new Coord(x - 5, y - 50);
coordArray[2] = new Coord(x - 2, y - 54);
coordArray[3] = new Coord(x + 3, y - 57);
coordArray[4] = new Coord(x + 9, y - 55);
coordArray[5] = new Coord(x + 11, y - 52);
coordArray[6] = new Coord(x + 18, y - 1);
coordArray[7] = new Coord(x + 14, y + 4);
coordArray[8] = new Coord(x + 9, y + 6);
coordArray[9] = new Coord(x + 4, y + 5);
coordArray[10] = new Coord(x, y);
}
else if (num == 9) {
coordArray[0] = new Coord(x, y);
coordArray[1] = new Coord(x, y - 37);
coordArray[2] = new Coord(x + 3, y - 41);
coordArray[3] = new Coord(x + 7, y - 43);
coordArray[4] = new Coord(x + 13, y - 41);
coordArray[5] = new Coord(x + 15, y - 37);
coordArray[6] = new Coord(x + 17, y + 1);
coordArray[7] = new Coord(x + 15, y + 3);
coordArray[8] = new Coord(x + 10, y + 6);
coordArray[9] = new Coord(x + 3, y + 4);
coordArray[10] = new Coord(x, y);
}
else if (num == 10) {
coordArray[0] = new Coord(x, y);
coordArray[1] = new Coord(x + 2, y - 8);
coordArray[2] = new Coord(x + 6, y - 16);
coordArray[3] = new Coord(x + 13, y - 23);
coordArray[4] = new Coord(x + 27, y - 27);
coordArray[5] = new Coord(x + 37, y - 25);
coordArray[6] = new Coord(x + 43, y - 23);
coordArray[7] = new Coord(x + 64, y - 16);
coordArray[8] = new Coord(x + 69, y - 11);
coordArray[9] = new Coord(x + 73, y - 3);
coordArray[10] = new Coord(x + 73, y + 10);
coordArray[11] = new Coord(x + 71, y + 18);
coordArray[12] = new Coord(x + 57, y + 40);
coordArray[13] = new Coord(x + 50, y + 46);
coordArray[14] = new Coord(x + 41, y + 49);
coordArray[15] = new Coord(x + 34, y + 49);
coordArray[16] = new Coord(x + 14, y + 43);
coordArray[17] = new Coord(x + 10, y + 41);
coordArray[18] = new Coord(x + 6, y + 36);
coordArray[19] = new Coord(x + 2, y + 29);
coordArray[20] = new Coord(x, y);
}
else if (num == 11) {
coordArray[0] = new Coord(x, y);
coordArray[1] = new Coord(x - 2, y - 10);
coordArray[2] = new Coord(x + 1, y - 20);
coordArray[3] = new Coord(x + 14, y - 31);
coordArray[4] = new Coord(x + 47, y - 39);
coordArray[5] = new Coord(x + 55, y - 38);
coordArray[6] = new Coord(x + 61, y - 34);
coordArray[7] = new Coord(x + 68, y - 26);
coordArray[8] = new Coord(x + 72, y - 16);
coordArray[9] = new Coord(x + 72, y + 13);
coordArray[10] = new Coord(x + 68, y + 22);
coordArray[11] = new Coord(x + 62, y + 29);
coordArray[12] = new Coord(x + 60, y + 30);
coordArray[13] = new Coord(x + 39, y + 36);
coordArray[14] = new Coord(x + 34, y + 36);
coordArray[15] = new Coord(x + 20, y + 33);
coordArray[16] = new Coord(x + 16, y + 29);
coordArray[17] = new Coord(x, y);
}
else if (num == 12) {
coordArray[0] = new Coord(x - 10, y);
coordArray[1] = new Coord(x + 212, y);
coordArray[2] = new Coord(x + 212, y + 129);
coordArray[3] = new Coord(x + 201, y + 130);
coordArray[4] = new Coord(x + 191, y + 131);
coordArray[5] = new Coord(x + 174, y + 131);
coordArray[6] = new Coord(x + 159, y + 129);
coordArray[7] = new Coord(x + 142, y + 127);
coordArray[8] = new Coord(x + 133, y + 125);
coordArray[9] = new Coord(x + 114, y + 120);
coordArray[10] = new Coord(x + 97, y + 113);
coordArray[11] = new Coord(x + 86, y + 108);
coordArray[12] = new Coord(x + 72, y + 100);
coordArray[13] = new Coord(x + 52, y + 87);
coordArray[14] = new Coord(x + 40, y + 76);
coordArray[15] = new Coord(x + 29, y + 64);
coordArray[16] = new Coord(x + 16, y + 48);
coordArray[17] = new Coord(x + 5, y + 30);
coordArray[18] = new Coord(x - 10, y);
}
return coordArray;
}
/**
* 坐标点对象
* @author wenxin
* @create 2013-05-31 18:01:33 pm
*/
var Coord = function (x, y) {
this.x = x;
this.y = y;
}
/**
* 绘画手指
* @author wenxin
* @create 2013-05-31 18:01:33 pm
* @param context 2d画布上下文
* @param pointArray 坐标点数组
* @param renderFlag 渲染标记 stroke:绘画边线;fill:填充
* @param color 渲染颜色
*/
var renderFinger = function (context, pointArray) {
this.context = context;
this.pointArray = pointArray;
this.isClick = false;
this.drawFinger = function (renderFlag, color) {
if (renderFlag == "stroke") {
this.context.strokeStyle = color;
}
else if (renderFlag == "fill") {
this.context.fillStyle = color;
}
this.context.lineWidth = 1;
this.context.beginPath();
for (var i = 0; i < this.pointArray.length; i++) {
if (i == 0) {
this.context.moveTo(this.pointArray[0].x, this.pointArray[0].y);
}
else {
this.context.lineTo(this.pointArray[i].x, this.pointArray[i].y);
}
}
if (renderFlag == "stroke") {
this.context.stroke();
}
else if (renderFlag == "fill") {
this.context.fill();
}
};
};
/**
* 页面加载和重画时渲染手指
* @author wenxin
* @create 2013-05-13 15:26:31 pm
* @param context 2d画布上下文
* @param num 当前需要渲染的手指编号
* @param browserFlag 浏览器标记 simple:简易版本,表示是ie浏览器;html5:表示支持html5的浏览器
*/
function renderInit(context, num, browserFlag) {
var fingerId;
for (var i = 0; i < fingerIdArray.length; i++) {
fingerId = eval(fingerIdArray[i]);
if (fingerId >= DURESS_FINGER_NUM) {
fingerId = fingerId - DURESS_FINGER_NUM;
if (browserFlag == "html5") {
if (fingerId == num) {
context.fillStyle = "red";
context.fill();
}
}
}
else {
if (browserFlag == "html5") {
if (fingerId == num) {
context.fillStyle = "rgb(122,193,66)";
context.fill();
}
}
}
if (browserFlag == "simple") {
document.getElementById("finger" + fingerId).checked = true;
}
}
}
/**
* 显示指纹图像
* @author wenxin
* @create 2013-05-18 11:22:31 am
* @param context 2d画布上下文
* @param browserFlag 浏览器标记 simple:简易版本,表示是ie浏览器;html5:表示支持html5的浏览器
*/
function showImage(context, base64FPImg, browserFlag) {
var img;
var imgSrc = "data:image/jpg;base64," + base64FPImg;
if (browserFlag == "html5") {
img = new Image();
//img.src = sysCfg.rootPath + "/public/html/bmpFile1.jpg";
img.src = "";
img.src = imgSrc;
img.onload = function () {
// 保存当前的绘图状态
context.save();
// 开始创建路径
context.beginPath();
// 画一个椭圆
context.oval(125, 142, 112, 145);
// 关闭路径
context.closePath();
// 剪切路径
context.clip();
//将图片画到画布上
context.drawImage(img, 70, 70, 112, 145);
//调用restore最后一次存储的状态会被恢复
context.restore();
}
}
else if (browserFlag == "verification") {
img = new Image();
img.src = "";
img.src = imgSrc;
img.onload = function () {
// 保存当前的绘图状态
context.save();
// 开始创建路径
context.beginPath();
// 画一个椭圆
context.oval(92, 159, 100, 128);
// 关闭路径
context.closePath();
// 剪切路径
context.clip();
//将图片画到画布上
context.drawImage(img, 37, 90, 112, 145);
//调用restore最后一次存储的状态会被恢复
context.restore();
}
}
else if (browserFlag == "clearForVerify" || browserFlag == "clearForRegister") {
img = new Image();
img.src = "";
img.src = base64FPImg;
img.onload = function () {
// 保存当前的绘图状态
context.save();
// 开始创建路径
context.beginPath();
// 画一个椭圆
if (browserFlag == "clearForVerify") {
context.oval(91, 160, 112, 145);
}
else if (browserFlag == "clearForRegister") {
context.oval(125, 142, 132, 165);
}
// 关闭路径
context.closePath();
// 剪切路径
context.clip();
//将图片画到画布上
if (browserFlag == "clearForVerify") {
context.drawImage(img, 12, 54, 160, 213);
}
else if (browserFlag == "clearForRegister") {
context.drawImage(img, 60, 60, 132, 165);
}
//调用restore最后一次存储的状态会被恢复
context.restore();
}
}
else if (browserFlag == "simple") {
$("#showFPImageDiv").html("");
}
else if (browserFlag == "verifySimple") {
$("#showSeachingDiv").show();
$("#showSeachingDiv").html("
");
}
else if (browserFlag == "clearForSimple") {
$("#showFPImageDiv").html("");
}
}
/**
* 绘画手掌
* @author wenxin
* @create 2013-06-01 09:01:33 am
* @param context 2d画布上下文
* @param pointArray 坐标点数组
* @param color 渲染颜色
*/
var renderHand = function (context, pointArray) {
this.context = context;
this.pointArray = pointArray;
this.isClick = false;
this.drawHand = function (color) {
this.context.strokeStyle = color;
this.context.lineWidth = 1;
this.context.beginPath();
for (var i = 0; i < this.pointArray.length; i++) {
if (i == 0) {
this.context.moveTo(this.pointArray[0].x, this.pointArray[0].y);
}
else {
this.context.lineTo(this.pointArray[i].x, this.pointArray[i].y);
}
}
this.context.stroke();
};
};
/**
* 检查指纹采集器
* @author wenxin
* @create 2013-06-17 20:18:31 pm
* @param context 2d画布上下文
* @param paramArray 存放国际化元素的数组
* @param browserFlag 浏览器标记 simple:简易版本,表示是ie浏览器;html5:表示支持html5的浏览器
*/
function checkFPReader(context, paramArray, browserFlag) {
if (browserFlag == "html5") {
$.ajax({
type: "GET",
url: issOnlineUrl + "/fingerprint/beginCapture?type=1&FakeFunOn=0&random=" + getRandomNum(),
dataType: "json",
async: false,
//timeout:1000,
success: function (result) {
//返回码
var ret = null;
ret = result.ret;
//接口调用成功返回时
if (ret == 0) {
//显示框--采集提示
collectTips(context, paramArray[0], "html5");
}
else if (ret == -2001) {
//显示框--采集提示
collectTips(context, paramArray[1], "html5");
}
else if (ret == -2002) {
getWebServerInfo(null, null, "1");
}
else if (ret == -2005) {
//显示框--采集提示
collectTips(context, paramArray[3], "html5");
}
collectFlag = true;
//取消采集
cancelRegister();
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("请安装指纹驱动或启动该服务!");
//messageBox({messageType: "alert", title: "${common_prompt_title}", text: "${base_fp_connectPrompt}"});
}
});
}
else if (browserFlag == "simple") {
//创建XDomainRequest实例,用于ie8和ie9跨域访问
var xDomainRequest = new XDomainRequest();
//如果xDomainRequest存在,则可以使用xDomainRequest函数,否则,说明不是ie浏览器
if (xDomainRequest) {
xDomainRequest.open('GET', issOnlineUrl + "/fingerprint/beginCapture?type=1&FakeFunOn=0&random=" + getRandomNum());
xDomainRequest.onload = function () {
//获取接口返回值
var resultData = xDomainRequest.responseText;
//转化为json对象
var obj = jQuery.parseJSON(resultData);
//返回码
var ret = null;
if (obj != null && obj.ret != undefined) {
ret = obj.ret;
}
//接口调用成功返回时
if (ret == 0) {
//显示框--采集提示
collectTips(null, paramArray[0], "simple");
}
else if (ret == -2001) {
//显示框--采集提示
collectTips(null, paramArray[1], "simple");
}
else if (ret == -2002) {
getWebServerInfoForSimple(null, null, "1");
}
collectFlag = true;
//取消采集
cancelRegister();
};
xDomainRequest.onerror = function () {
//用完后,将对象置为空
xDomainRequest = null;
};
xDomainRequest.send();
}
}
}
/**
* 显示框--显示采集次数、采集成功、失败等信息
* @author wenxin
* @create 2013-05-16 16:56:31 pm
* @param context 2d画布上下文
* @param text 显示信息内容
* @param browserFlag 浏览器标记或比对验证标记 simple:简易版本,表示是ie浏览器;html5:表示支持html5的浏览器
* --verification:指纹验证标记
*/
function collectTips(context, text, browserFlag) {
if (browserFlag == "simple") {
$("#showCollInfoDiv").html("" + text + "");
}
else if (browserFlag == "html5") {
context.fillStyle = bgColor;//bgColor;
context.fillRect(205, 18, 240, 16);
//文字右对齐
context.fillStyle = "rgb(122,193,66)";
context.font = "12px Arial,微软雅黑";
//context.shadowColor = 'white';
//context.shadowBlur = 10;
//context.strokeText(text, 230, 30);
context.textAlign = "end";
context.fillText(text, 400, 30);
}
else if (browserFlag == "verification") {
//#6BA5D7
context.fillStyle = "#F3F5F0";//#6BA5D7
context.fillRect(2, 8, 600, 30);
//获取canvas对象
var canvas = "";
if (isComp) {
canvas = document.getElementById("canvasComp");
} else {
canvas = document.getElementById("canvas");
}
// canvas.width = canvas.width;
//返回一个文本的度量信息对象metrics
var metrics = context.measureText(text);
//文本宽度
var textWidth = metrics.width;
//canvas宽度
canvas != null ? canvasWidth = canvas.width : canvasWidth = 450;
//文本开始x坐标
var x = textWidth / 2 + (canvasWidth - textWidth) / 2;
//context.fillStyle = bgColor;
//context.fillRect(0, 18, 445, 16);
//文字右对齐
context.fillStyle = "rgb(122,193,66)";
context.font = "24px Arial,微软雅黑";
context.textAlign = "center";
//自动换行
autoWordBreak(context, text, canvasWidth, x);
context.restore();
}
else if (browserFlag == "verifyForSimple") {
$("#showCollInfoDiv").html("" + text + "");
}
}
/**
* 画进度条
* @author wenxin
* @create 2013-05-16 16:56:31 pm
* @param context 2d画布上下文
* @param x,y,width,height 进度条底框的坐标和宽度、高度
*/
function drawProgressBar(context, collCount) {
var x = 300;
var y = 60;
var width = 90;
var height = 20;
context.fillStyle = bgColor;
context.fillRect(x, y, width, height);
if (collCount == 0) {
context.fillStyle = "rgb(175,181,185)";
context.fillRect(x + 4, y + 2, width - 52, height - 4);
context.fillRect(x + 46, y + 2, width - 52, height - 4);
context.fillRect(x + 86, y + 2, width - 52, height - 4);
}
else if (collCount == 1) {
context.fillStyle = "rgb(122,193,66)";
context.fillRect(x + 4, y + 2, width - 52, height - 4);
context.fillStyle = "rgb(175,181,185)";
context.fillRect(x + 46, y + 2, width - 52, height - 4);
context.fillRect(x + 86, y + 2, width - 52, height - 4);
}
else if (collCount == 2) {
context.fillStyle = "rgb(122,193,66)";
context.fillRect(x + 4, y + 2, width - 52, height - 4);
context.fillRect(x + 46, y + 2, width - 52, height - 4);
context.fillStyle = "rgb(175,181,185)";
context.fillRect(x + 86, y + 2, width - 52, height - 4);
}
else if (collCount == 3) {
context.fillStyle = "rgb(122,193,66)";
context.fillRect(x + 4, y + 2, width - 52, height - 4);
context.fillRect(x + 46, y + 2, width - 52, height - 4);
context.fillRect(x + 86, y + 2, width - 52, height - 4);
}
}
/**
* 判断当前手指是否在fingerIdArray中,如果在,则说明此手指已经采集指纹
* @author wenxin
* @create 2013-05-15 16:26:31 pm
* @param num 手指编号
* @param fingerIdArray 存放手指编号的数组
* @return 返回boolean值 true:num包含在fingerIdArray中;false:没有包含
*/
function isContains(fingerIdArray, num) {
var fingerId;
var isCollected = false;
for (var j = 0; j < fingerIdArray.length; j++) {
fingerId = eval(fingerIdArray[j]);
if (fingerId >= DURESS_FINGER_NUM) {
fingerId = fingerId - DURESS_FINGER_NUM;
}
if (fingerId == num) {
isCollected = true;
}
}
return isCollected;
}
/**
* 清空指纹图像
* @author wenxin
* @create 2013-09-05 15:15:11 pm
*/
function clearFPImage(context, browserFlag) {
if (browserFlag == "verification") {
// showImage(context, "${base}/base/images/base_fpVerify_clearImage.png", "clearForVerify");
}
else if (browserFlag == "register") {
showImage(context, "image/base_fpVerify_clearImage.png", "clearForRegister");
}
else if (browserFlag == "verifyForSimple" || browserFlag == "registerForSimple") {
showImage(null, "", "clearForSimple");
}
}
/**
* 获取指纹模板
* @author wenxin
* @create 2013-05-22 19:51:31 pm
* @param paramArray 存放国际化元素的数组
* @param flag 判断是登记和验证标记 register:登记;verification:验证
*/
function getFPTemplate(paramArray, flag) {
var fpTemplate = "";
var collectSuccessFlag = false;
$.ajax({
type: "GET",
url: issOnlineUrl + "/fingerprint/getTemplate?random=" + getRandomNum(),
dataType: "json",
async: false,
success: function (result) {
//返回码
var ret = null;
ret = result.ret;
if (ret == 0) {
fpTemplate = result.data.template;
console.log('fpTemplate', fpTemplate)
window.top.postMessage({
fingerCode: result.data.template,
});
}
//成功
if (ret == 0) {
collectSuccessFlag = true;
if (flag == "register") {
//判断手指是否已经采集指纹
var compareRet = "";
//如果前面已经录入指纹
if (templateDataArray.length > 0) {
//发送请求,进行后台指纹比对yls
//compareRet = fpComparision(fpTemplate, templateDataArray, paramArray[3]);
}
if ($.trim(compareRet) == "dllNotExist") {
//采集完指纹,渲染手指
renderAfterColl(globalContext, fpIdNum, bgColor, false);//bgColor判断
//显示框--采集提示
collectTips(globalContext, "动态库加载失败", "html5");
}
else {
if (compareRet == "noFingerServer") {
//采集完指纹,渲染手指
renderAfterColl(globalContext, fpIdNum, bgColor, false);//bgColor判断
//显示框--采集提示
collectTips(globalContext, "未启动比对服务", "html5");
}
else {
//此手指未采集指纹
if (compareRet != "ok") {
//采集完指纹,渲染手指
renderAfterColl(globalContext, fpIdNum, bgColor, true);//bgColor判断
//显示框--采集提示
collectTips(globalContext, paramArray[0], "html5");
//胁迫指纹
if (duressFingerFlag) {
//将手指标记保存到数组中
fingerIdArray[fingerIdArray.length] = fpIdNum + DURESS_FINGER_NUM;
}
else {
//将手指标记保存到数组中
fingerIdArray[fingerIdArray.length] = fpIdNum;
}
//将指纹模板保存到数组中
templateDataArray[templateDataArray.length] = fpTemplate;
}
else {
//采集完指纹,渲染手指
renderAfterColl(globalContext, fpIdNum, bgColor, false);//bgColor判断
//Please don't repeat input fingerprint!
//显示框--采集提示
collectTips(globalContext, paramArray[2], "html5");
}
}
}
}
else if (flag == "verification") {
verifyFlag = false;
//指纹比对
fpComparison(fpTemplate);
}
}
else if (ret == -2003) {
//采集完指纹,渲染手指
renderAfterColl(globalContext, fpIdNum, bgColor, false);
//显示框--采集提示
collectTips(globalContext, paramArray[1], "html5");
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(paramArray[3]);
//messageBox({messageType: "alert", title: "${common_prompt_title}", text: paramArray[3]});
}
});
return collectSuccessFlag;
}
/**
* 发送请求到后台,进行比对
* @author wenxin
* @create 2013-08-05 16:20:31 pm
* @param fpTemplate 指纹模板
* @param templateArray 指纹模板数组
* @param errorMsg ajax请求报错,错误信息
*/
function fpComparision(fpTemplate, templateArray, errorMsg) {
var ret = "";
var templates = templateArray.toString();
console.log('fpTemplate', fpTemplate)
//特殊字符转义
fpTemplate = transferredMeaning(fpTemplate);
templates = transferredMeaning(templates);
console.log('fpTemplate', fpTemplate)
$.ajax({
type: "POST",
url: "baseBioVerifyAction!fpComparison.action",
contentType: "application/x-www-form-urlencoded;charset=UTF-8",
data: "verifyTemplate=" + fpTemplate + "&templates=" + templates,
dataType: "json",
async: false,
success: function (result) {
if (result.ret == "ok") {
ret = "ok";
}
if (result.msg == "noFingerServer") {
ret = "noFingerServer";
}
if (result.msg == "dllNotExist") {
ret = "dllNotExist";
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("服务器处理数据失败,请重试!错误码:");
//messageBox({messageType: "alert", title: "${common_prompt_title}", text: "${common_prompt_serverError}"});
}
});
return ret;
}
/**
* 采集完指纹后渲染手指
* @author wenxin
* @create 2013-05-18 11:33:31 am
* @param context 2d画布上下文
* @param num 当前需要渲染的手指编号
* @param fillColor 采集完后填充颜色
* @param successOrNot 采集是否成功--布尔值 true:采集成功;false:采集失败
*/
function renderAfterColl(context, num, fillColor, successOrNot) {
var canvas = "";
if (isComp) {
canvas = document.getElementById("canvasComp");
} else {
canvas = document.getElementById("canvas");
}
var localContext = canvas.getContext("2d");
var coordArray = new Array();
//初始化起始坐标,并返回json格式数据
var coordJson = initCoordJson();
//进来页面,点击删除
if (num == null) {
num = fpIdNum;
}
//点击的手指编号和json中num相等
if (coordJson[num].num == num) {
//初始化坐标数组和绘画手指
initCoordAndDrawFinger(context, coordArray, coordJson[num].coord.x, coordJson[num].coord.y, num);
}
//采集成功,填充颜色(红、绿)
if (successOrNot) {
if (duressFingerFlag) {
localContext.fillStyle = "red";//fillColor
localContext.fill();
fpModifyFlag = true;
}
else {
localContext.fillStyle = "rgb(122,193,66)";//fillColor
localContext.fill();
fpModifyFlag = true;
}
}
else {
//采集失败,填充背景色--消除颜色(黄)
localContext.fillStyle = fillColor;
localContext.fill();
}
}
/**
* 初始化坐标数组和绘画手指--获取当前的context
* @author wenxin
* @create 2013-05-31 18:01:33 pm
* @param context 2d画布上下文
* @param pointArray 坐标点数组
* @param x,y 绘画当前手指的起始坐标
* @param num 手指标记
*/
function initCoordAndDrawFinger(context, coordArray, x, y, num) {
coordArray = initCoordArray(coordArray, x, y, num);
new renderFinger(context, coordArray).drawFinger(strokeStyle, fingerBorderColor);
}
/**
* 点击取消按钮时,触发事件
* @author wenxin
* @create 2013-05-15 17:21:13 pm
* @param "${base_fp_save}":确认保存当前修改吗?
*/
function cancelEvent(saveText, fpCountText) {
if (!fpModifyFlag) {
if (collectFlag) {
//取消采集
cancelRegister();
//将定时器的递归调用关闭
clearTimeout(timer);
}
//closeWindow();
close();
}
else {
var flag = confirm(saveText);
if (flag) {
saveFPData(flag, fpCountText);
} else {
close();
}
}
}
/**
* 点击取消按钮和关闭页面时,弹出框保存数据
* cancelEvent()和submitRegister()函数中回调用到
* @author wenxin
* @create 2013-05-14 15:11:31 pm
* @param result 弹出框选择确定还是取消
* @param fpCount 指纹数国际化内容
* @param ${pers_person_templateCount}:指纹数
*/
var saveFPData = function (result, fpCount) {
if (collectFlag) {
//取消采集
cancelRegister();
//将定时器的递归调用关闭
clearTimeout(timer);
}
if (result) {
storeDataToHtml();
showFPCount(fpCount);
//closeWindow();
close();
}
else {
clearImageData();
//closeWindow();
close();
}
}
/**
* 判断指纹数量--页面加载时,没有计算。只是在采集完指纹后计算指纹数量
* @author wenxin
* @create 2013-04-22 21:26:31 pm
*/
function showFPCount(text) {
var fingerId = $("#fingerId").val();
if ($.trim(fingerId) == "") {
$("#fpCountMessage").text(text + " " + 0);
}
else {
fingerId = fingerId.substr(1, fingerId.length - 2);
var fingerIdArray = new Array();
fingerIdArray = fingerId.split(",");
$("#fpCountMessage").text(text + " " + fingerIdArray.length);
}
}
/**
* 将指纹数据保存到页面
* @author wenxin
* @create 2013-05-24 16:12:21 pm
*/
function storeDataToHtml() {
//没有手指标记数据
if (fingerIdArray.length == 0) {
$("#fingerId").val(" ");
}
else {
//将手指标记数据保存到页面
$("#fingerId").val("[" + fingerIdArray.toString() + "]");
}
//没有指纹模板数据
if (templateDataArray.length == 0) {
$("#fingerTemplate10").val(" ");
}
else {
//将指纹模板数据保存到页面
$("#fingerTemplate10").val("[" + templateDataArray.toString() + "]");
}
}
//关闭窗体
function close() {
$("#bg").css("display", "none");
$("#box").css("display", "none");
$("#comparisonDiv").css("display", "none");
globalContext = "";
}
/**
* 点击已经采集指纹的手指时,弹出框删除数据
* 删除时的回调函数
* @author wenxin
* @create 2013-05-14 17:12:21 pm
* @param result 弹出框选择确定还是取消
* @param context 2d画布上下文
* @param browserFlag 浏览器标记 simple:简易版本,表示是ie浏览器;html5:表示支持html5的浏览器
*/
var delFPData = function (result, context, browserFlag) {
var fingerId;
if (result) {
//将数组中的指定元素删除
for (var i = 0; i < fingerIdArray.length; i++) {
fingerId = eval(fingerIdArray[i]);
if (fingerId >= DURESS_FINGER_NUM) {
fingerId = fingerId - DURESS_FINGER_NUM;
if (fingerId == fpIdNum) {
//fingerIdArray.remove(i);
//templateDataArray.remove(i);
removeItem(fingerIdArray, i);
removeItem(templateDataArray, i);
}
}
else {
if (fingerId == fpIdNum) {
//fingerIdArray.remove(i);
//templateDataArray.remove(i);
removeItem(fingerIdArray, i);
removeItem(templateDataArray, i);
}
}
}
if (browserFlag == "simple") {
document.getElementById("finger" + fingerId).checked = false;
}
else if (browserFlag == "html5") {
//将手指颜色改变--重画时也要判断
context.fillStyle = bgColor;
context.fill();
if (lastFPIdNum != null && lastFPIdNum != lastFPIdNum) {
//消除原来手指的颜色
renderAfterColl(globalContext, lastFPIdNum, bgColor, false);
}
//消除需要删除的手指颜色
renderAfterColl(globalContext, fpIdNum, bgColor, false);
}
fpModifyFlag = true;
$("#duressFinger").attr("disabled", false);
$("#submitButtonId").attr("disabled", false);
}
else {
if (browserFlag == "simple") {
document.getElementById("finger" + fpIdNum).checked = true
collectFlag = true;
}
else if (browserFlag == "html5") {
//消除原来手指的颜色--有问题,如果原来手指和现在的一样,有问题
//renderAfterColl(globalContext, lastFPIdNum, bgColor, false);
}
}
}
/**
* 删除数组元素 -- 从dx下标开始,删除一个元素
* @author wenxin
* @create 2013-05-15 11:11:31 am
* @param dx 要删除元素的下标
*/
function removeItem(array, dx) {
array.splice(dx, 1);
}
/**
* 指纹验证
* @author wenxin
* @create 2013-06-21 11:09:20 am
* @param title 页面标题国际化内容
* @param isDriverInstall 是否安装了驱动
* @param downloadPrompt 提示安装驱动国际化内容
*/
{/*