/**
201606

基于WebSocket的坐席客户端范例

1 验证码赋值 这个是向服务端验证身份的 变量名称固定为 authCode
2 new一个TLWSA对象，每个页面只能有一个实例
3 在页面载入完成后，调用一次 tlwsa的 initTLWSA方法，用于初始化
4 写事件callack函数，并赋值给tlwsa的callback

5 依次调用tlwsa的tlaOpen 方法连接服务器，tlaLogin方法登录，如果是IP坐席，还要调用 tlaSetPhoneNumber方法报告坐席使用的ip话机的电话号码
6 等待呼入，或者调用 tlwsa的 tlaCallagc方法/tlaCall方法呼叫坐席和外线

其他功能的调用方法请参考相关代码

**/
// var phoneNumber = '';
var authCode="tlwsab"; //验证码，必须与服务端配置的验证码相同，否则不能通过验证，无法登录到服务器

var tlwsa=new TLWSA(); //生成一个坐席客户端实例 每个页面只能有一个实例
window.onload=function() //必须第一个调用的方法，初始化websocket相关变量
{
	tlwsa.initTLWSA();
}

//函数调用的应答  注意 是类TLWSA 不是实例tlwsa
// TLWSA.onOpenreturn=onopenreturn;
TLWSA.onOpenslaveserverreturn=onopenslaveserverreturn;

// TLWSA.onLoginreturn=onloginreturn;
TLWSA.onMutereturn=onmutereturn;
TLWSA.onUnmutereturn=onunmutereturn;
// TLWSA.onSetphonenumberreturn=onsetphonenumberreturn;
// TLWSA.onLogoffreturn=onlogoffreturn; //主动注销结果
// TLWSA.onAcwreturn=onacwreturn;
// TLWSA.onWcareturn=onwcareturn;

// TLWSA.onCallreturn=oncallreturn;
TLWSA.onCancelcallreturn=oncancelcallreturn;
// TLWSA.onTransferreturn=ontransferreturn;//调用转移方法之后，返回该事件 如果错误码为0，仅仅表示开始转移，不代表转移目标已经接听或已经拒绝
TLWSA.onCanceltransferreturn=oncanceltransferreturn;
TLWSA.onBlindtransferreturn=onblindtransferreturn;
TLWSA.onTransfertoivrreturn=ontransfertoivrreturn;
TLWSA.onTransfertoivrandwaitreturn=ontransfertoivrandwaitreturn;
TLWSA.onStartlistenreturn=onstartlistenreturn;
TLWSA.onStoplistenreturn=onstoplistenreturn;
// TLWSA.onKillreturn=onkillreturn;
TLWSA.onForceonhookreturn=onforceonhookreturn;
TLWSA.onIntrudereturn=onintrudereturn;
TLWSA.onGetcallreturn=ongetcallreturn;
TLWSA.onAnswercallreturn=onanswercallreturn;
TLWSA.onOnhookreturn=ononhookreturn;
TLWSA.onHoldcallreturn=onholdcallreturn;
TLWSA.onSwapcallreturn=onswapcallreturn;
TLWSA.onActivatecallreturn=onactivatecallreturn;
TLWSA.onUnholdcallreturn=onunholdcallreturn;
TLWSA.onLoginotheragentreturn=onloginotheragentreturn;
TLWSA.onSendmessagetoagentreturn=onsendmessagetoagentreturn;
TLWSA.onAnswerqueuereturn=onanswerqueuereturn;
// TLWSA.onSubscribestateinforeturn=onsubscribestateinforeturn;

TLWSA.onConsulttransferreturn=onconsulttransferreturn;
TLWSA.onCompleteconsulttransferreturn=oncompleteconsulttransferreturn;
TLWSA.onGetnodestatereturn=ongetnodestatereturn;
TLWSA.onTransfernodereturn=ontransfernodereturn;
//会议相关
TLWSA.onConferencestartreturn=onconferencestartreturn;
TLWSA.onConferenceappendmemberreturn=onconferenceappendmemberreturn;
TLWSA.onConferencequeryreturn=onconferencequeryreturn;
TLWSA.onConferencedismissreturn=onconferencedismissreturn;
TLWSA.onConferencekickoutreturn=onconferencekickoutreturn;
TLWSA.onConferencechangememberstatereturn=onconferencechangememberstatereturn;
//主动事件
// TLWSA.onCallin=oncallin;
// TLWSA.onCallend=oncallend;
// TLWSA.onAcw=onacw;
// TLWSA.onWca = onwca;
TLWSA.onLogoff = onlogoff; //被强制注销事件
// TLWSA.onCallresult=oncallresult;
// TLWSA.onTransferresult=ontransferresult;
TLWSA.onConsulttransfercalleeanswer=onconsulttransfercalleeanswer;
TLWSA.onBlindtransferresult=onblindtransferresult;
// TLWSA.onAnswer=onanswer;
// TLWSA.onClosed=onclosed;
TLWSA.onSlaveserverclosed=onslaveserverclosed; //备用服务器网络中断
TLWSA.onHoldcallreleased=onholdcallreleased;
TLWSA.onKeepcallreleased=onkeepcallreleased;
TLWSA.onCalleealerting=oncalleealerting;
TLWSA.onQueue=onqueue;
TLWSA.onQuitqueue=onquitqueue;
TLWSA.onRecvmsg=onrecvmsg;
TLWSA.onHookstate=onhookstate;
TLWSA.onHardwarefail=onhardwarefail;
// TLWSA.onMisscall=onmisscall;
TLWSA.onConferencememberstate=onconferencememberstate;
TLWSA.onSlaveserverfail=onslaveserverfail; //备用服务器故障 例如硬件故障或者中继失步
TLWSA.onSwitchtoslaveserver=onswitchtoslaveserver;
// TLWSA.onStatechange=onstatechange;
//应答回调
// function onopenreturn(err)
// {
// 	err = Number(err);
// 	if(!err){
// 		console.log('呼叫中心连接成功-----seimin');
// 		//如果设置过话机
// 		if(localStorage.getItem('phoneNumber')){
// 			// 登录并设置号码
// 			phoneNumber = localStorage.getItem('phoneNumber');
// 			tlwsa.tlaLogin(phoneNumber,1,-1);
// 		}
// 	}else{
// 		console.log('呼叫中心连接失败-----seimin');
// 	}
// 	// console.log('应答:连接服务器结果 '+err);
// }
function onopenslaveserverreturn(err)
{
	console.log('应答:连接备用服务器结果 '+err);
}

// function onloginreturn(err) //登录结果
// {
// 	err = Number(err);
// 	if(!err){
// 		console.log('登录成功-----seimin');
// 		setTimeout(function(){
// 			console.log('开始设置号码【'+phoneNumber+'】-----seimin');
// 			tlwsa.tlaSetphonenumber(phoneNumber);
// 		},0)
// 	}else{
// 		console.log('登录失败-----seimin');
// 	}
// 	console.log('应答:登录请求结果 '+err);
// }
function onmutereturn(err)
{
	console.log('应答:静音请求结果 '+err);
}
function onunmutereturn(err)
{
	console.log('应答:取消静音请求结果 '+err);
}
// function onsetphonenumberreturn(err)
// {
// 	err = Number(err);
// 	if(!err){
// 		console.log('设置号码成功-----seimin');
// 	}else{
// 		console.log('设置号码失败-----seimin');
// 	}
// 	console.log('应答:报告坐席电话号码请求结果 '+err);
// }
// function onlogoffreturn(err) //注销请求结果
// {
// 	console.log('应答:注销请求结果 '+err);
// }

// function onacwreturn(err)
// {
// 	console.log('应答:离席请求结果 '+err);
// }
// function onwcareturn(err)
// {
// 	console.log('应答:复席请求结果 '+err);
// }
// function oncallreturn(err)
// {
// 	console.log('应答:呼叫请求结果 '+err);
// }
function oncancelcallreturn(err) {
    console.log('应答:停止呼叫请求结果 ' + err);
}
// function ontransferreturn(err) {
//     console.log('应答:转移请求结果 ' + err);
// }
function oncanceltransferreturn(err) {
    console.log('应答:停止转移请求结果 ' + err);
}
function onblindtransferreturn(err) {
    console.log('应答:盲转请求结果 ' + err);
}
function ontransfertoivrreturn(err) {
    console.log('应答:转ivr请求结果 ' + err);
}
function ontransfertoivrandwaitreturn(err) {
    console.log('应答:转ivr并等待请求结果 ' + err);
}
function onstartlistenreturn(err) {
    console.log('应答:监听请求结果 ' + err);
}
function onstoplistenreturn(err) {
    console.log('应答:停止监听请求结果 ' + err);
}
// function onkillreturn(err) {
//     console.log('应答:强制处理请求结果 ' + err);
// }
function onforceonhookreturn(err) {
    console.log('应答:强拆坐席请求结果 ' + err);
}
function onintrudereturn(err) {
    console.log('应答:强插请求结果 ' + err);
}
function ongetcallreturn(err,caller,callee,data,crs) {
    console.log('应答:代接请求结果 ' + err+' '+caller);
}
function onanswercallreturn(err) {
    console.log('应答:应答请求结果 ' + err);
}
function ononhookreturn(err) {
    console.log('应答:挂机请求结果 ' + err);
}
function onholdcallreturn(err) {
    console.log('应答:保持请求结果 ' + err);
}
function onswapcallreturn(err) {
    console.log('应答:切换呼叫请求结果 ' + err);
}
function onactivatecallreturn(err) {
    console.log('应答:激活呼叫请求结果 ' + err);
}
function onunholdcallreturn(err) {
    console.log('应答:取回保持呼叫请求结果 ' + err);
}
function onloginotheragentreturn(err) {
    console.log('应答:登录其他坐席请求结果 ' + err);
}
function onsendmessagetoagentreturn(err) {
    console.log('应答:发送消息请求结果 ' + err);
}
function onanswerqueuereturn(err) {
    console.log('应答:应答队列中的外线请求结果 ' + err);
}
// function onsubscribestateinforeturn(err){
// 	console.log('应答:订阅状态变化消息请求结果 ' + err);
// }
function onconsulttransferreturn(err){
	console.log('应答：咨询转移请求结果 '+err);
}

function oncompleteconsulttransferreturn(err){
	console.log('应答：完成咨询转移请求结果 '+err);
}
function ongetnodestatereturn(jso)
{
	console.log('node state 结果 '+JSON.stringify(jso));
}
function ontransfernodereturn(jso)
{
	console.log('transfer node 结果 '+JSON.stringify(jso))
}
function onconferencestartreturn(jso)
{
	console.log('启动会议 结果 '+jso.err+' 会议ID='+jso.conferenceid);
	if(jso.err == 0)
		conferenceid.value=jso.conferenceid;
}
function onconferenceappendmemberreturn(jso)
{
	console.log('添加会议成员 结果 '+JSON.stringify(jso))
}
function onconferencequeryreturn(jso)
{
	console.log('会议状态查询 结果 '+JSON.stringify(jso))
}
function onconferencedismissreturn(jso)
{
	console.log('解散会议 结果 '+JSON.stringify(jso))
}
function onconferencekickoutreturn(jso)
{
	console.log('踢出成员 结果 '+JSON.stringify(jso))
}
function onconferencechangememberstatereturn(jso)
{
	console.log('改变成员状态 结果 '+jso.err)
}
//主动事件回调
// function oncallin(jso) //呼入通知
// {
// 	console.log('事件:呼入通知,相关数据:  '+JSON.stringify(jso));
// }
// function oncallend(jso) //呼叫结束通知
// {
// 	console.log('事件:通话结束' + JSON.stringify(jso));
// }
// function onacw()
// {
// 	console.log('事件:你已经进入离席状态');
// }
// function onwca()
// {
// 	console.log('事件:你已经进入就绪状态');
// }
function onlogoff() //被动注销事件（网络中断 / 被踢）
{
    console.log('事件:您已经被注销');
}
// function oncallresult(err)
// {
// 	console.log('事件:呼叫结果 '+JSON.stringify(err));
// }
// function ontransferresult(err) {
//     console.log('事件:转移结果 ' + JSON.stringify(err));
// }
function onconsulttransfercalleeanswer(crs){
	console.log('事件:咨询转移被叫应答 crs=' + crs);
}
function onblindtransferresult(err) {
    console.log('事件:盲转结果 ' + JSON.stringify(err));
}
// function onanswer(err) {
//     console.log('事件:应答'+err);
// }
// function onclosed(err) {
//     console.log('事件:与服务器的网络连接中断');
// }
function onslaveserverclosed(err)
{
	console.log('事件:与备用服务器的网络连接中断');
}
function onholdcallreleased(err) {
    console.log('事件:被保持的对方已挂机');
}
function onkeepcallreleased(err) {
    console.log('事件:转回ivr并等待的外线已挂机');
}
function oncalleealerting(err) {
    console.log('事件:呼叫的外线已经开始振铃');
}
function onqueue(crs,caller,callee,data)
{
    console.log('事件:外线进入队列，crs,caller,callee,data= '+crs+' '+caller+' '+callee+' '+data)
}
// function onstatechange()
// {
// 	console.log('事件:状态变化----------------------------------------------------');
// 	queryAgentState();
// }
function onmystatechange(jso)
{
	console.log('事件:状态变化----------------------------------------------------');
	console.log(JSON.stringify(jso));
}
function onquitqueue(crs)
{
    console.log('事件:外线退出队列,crs= '+crs)
}
function onrecvmsg(msg, from) {
    console.log('事件:收到来自'+ from+'的消息:' + msg);
}
function onhookstate(jso) {
    console.log('事件:坐席叉簧状态'+JSON.stringify(jso));
}
function onhardwarefail(err) {
    console.log('事件:keygoe交换机硬件故障');
}
// function onmisscall(err) {
//     console.log('事件:呼损');
// }
//新状态 1-呼叫失败  2-呼叫应答进入会议 3-会议中挂机退出会议
function onconferencememberstate(jso)
{
	console.log('会议成员状态发生变化 ' + JSON.stringify(jso));
}
function onslaveserverfail(jso)
{
	console.log('注意：备用服务器已失联');
}
function onswitchtoslaveserver(jso)
{
	console.log('注意：主服务器故障，已经切换到备用服务器');
}
//事件回调函数结束

function queryAgentState()
{
	console.log('排队外线数量 '+tlwsa.tlaGetacdlength());

	console.log('外线总数量 '+tlwsa.tlaGettrknumber());

	var agcount=tlwsa.tlaGetagentcount();
	console.log('登录坐席数量 '+agcount);
	for(var ind=0;ind<agcount;ind++)
	{
		console.log('agnet No. ' + ind + ' workid is '+tlwsa.tlaGetagentwid(ind) + ' state is ' + tlwsa.tlaGetagentstate(ind) + '  '+getStateInfo(tlwsa.tlaGetagentstate(ind) ) )
	}
}

function getLicenseInfo()
{
	ajo=tlwsa.tlaGetlicenseinfo();
	console.log('授权有效期 '+ajo.validdate+' 授权线数 '+ajo.lines+' 卡号 '+ajo.cardno);

}
function getStateInfo(state)
{
	switch(state)
	{
		case '0':
		return '未登录';
		case '1':
		return '空闲';
		case '2':
		return '离席';
		case '3':
		return '正在振铃';
		case '4':
		return '播报工号';
		case '5':
		return '通话中';
		case '6':
		return '正在外呼';
		case '7':
		return '正在转移';
		case '8':
		return '正在监听';
	}
}