﻿//客户端
function IMCore(name)
{
    /*************************/
    //  属性定义
    /*************************/
    
    //实例名称
    this.InstanceName = (name != null || name != "") ? name :"im";    
    //用户Guid
    this.Guid = null;    
    //帐号
    this.Uin = null;  
    //时间间隔函数Id
    this.IntervalId = null;    
    //取数据的时间间隔
    this.GetDataInterva = 1000;    
    //发送心跳数据间隔
    this.KeepDataSpace = 100;    
    //计数器(作用:每取100次[this.KeepDataSpace的值]数据，发送一次[.keep]心跳数据)    
    this.counter = 0;
    
    /*************************/
    //  事件定义
    /*************************/
        
    //接收数据
    this.OnReceive = null; 
    //发生错误
    this.OnError = null;
    //连接成功
    this.OnConnected = null;    
    
    //产生错误事件
    IMCore.prototype.RaiseEventError = function(response)
    {    
        if(typeof(this.OnError) == "function")
        {
            this.OnError(response);
        }
    }
	
	//初始化
    IMCore.prototype.Init = function()
    {
        Client.ClearSession();
        Client.GetUserGuid(this.GetUserGuidCallBack,this);              
    }
    
    //连接服务器
    IMCore.prototype.GetUserGuidCallBack = function(response)
    {
		var me = response.context;
        if (response.error == null)
        {
            me.Guid = response.value;
            me.Connect();
        }else
        {
            me.RaiseEventError(response);
        }
    }   
    
    
    //连接服务器
    IMCore.prototype.Connect = function()
    {
        Client.SendData(".Connect",this.ConnectCallBack,this);
        window.Obj = this;
       this.IntervalId = window.setInterval("Obj.OnInterval()",this.GetDataInterva);       
    }
    
    //调整间隔时间
    IMCore.prototype.SetDataInterva = function(time)
    {
       window.clearInterval(this.IntervalId); 
       window.Obj = this;
       this.GetDataInterva = time;
       this.IntervalId = window.setInterval("Obj.OnInterval()",this.GetDataInterva);       
    }
    
    //连接服务器
    IMCore.prototype.ConnectCallBack = function(response)
    {
		var me = response.context;
        if (response.error == null)
        {
            if (typeof(me.OnConnected) == "function")
            {
                me.OnConnected();
            }
        }else
        {
            me.RaiseEventError(response);
        }
    } 
    
    //断开与服务器连接
    IMCore.prototype.Disconnect = function()
    {
        //这里还要做刷新处理，用cookie保持
        Client.Disconnect();
        window.clearInterval(this.IntervalId);     
    }        
    
    //间隔执行
    IMCore.prototype.OnInterval = function()
    {
          this.SendKeepData();
          this.GetData(this.GetDataCallBack);
    }  
    
    //发送心跳数据
    IMCore.prototype.SendKeepData = function()
    {
        //发送心跳数据
        if (this.counter == this.KeepDataSpace)
        {
            this.counter = 0;
            this.SendData(".Keep");
        }else
        {
            this.counter ++;
        }
    }

    
    //发送数据
    IMCore.prototype.SendData = function(data,callBack)
    {
        var context = {};
        context.CallBack = callBack;
        context.Data = data;
		context.me = this;       
        Client.SendData(data,this.SendDataCallBack,context);

    }  
    
    //发送数据完成
    IMCore.prototype.SendDataCallBack = function(response)
    {
		var me = response.context.me;
        if (typeof(response.context.CallBack) == "function")
        {
           me.CallBack(response);    
        }

    }      
  
    //接收数据
    IMCore.prototype.GetData = function()
    {
        Client.GetData(this.GetDataCallBack,this);
    }
    
    //接收数据
    IMCore.prototype.GetDataCallBack = function(response)
    {
		var me = response.context;
        /*try
        {  
        */          
            var dataList = response.value;
            if (me.OnOriginal != null && dataList != null&& dataList != [])
            {
               me.OnOriginal(dataList.toJSON());
            }
            if (dataList == null || dataList.length == 0)
            {
                return;
            }
            for(i = 0; i < dataList.length;i++)
            {
                me.DataProcess(dataList[i]);
            }
       //}
		/*
		 * catch(e)
        {
            errMsg = e.message;
			alert(errMsg);
        }
        */
        return ;        
    }
    
    
    //数据处理
    IMCore.prototype.DataProcess = function(data)
    {
        var cmd = IMCore.ParseCmd(data);     
        if (this.OnReceive != null)       
        {
            this.OnReceive(data);
        }
    }
    

}
//解析命令
IMCore.ParseCmd = function(data)
{
	var pos = data.indexOf(" ");
	if (pos > 0)
	{
		return data.substring(0, pos);
	}
	return data;
}
IMCore.ParseData=function(data)
{
	var Start=data.indexOf("{");
	var End=data.lastIndexOf("}");
	if(Start!=-1&&End!=-1)
	{
		End=End+1;
		var json = data.substring(Start,End);
		var obj = eval("(" + data.substring(Start,End) + ")");
		//alert(obj+":"+json);
		return obj;
	}
	var pos=data.indexOf("[.end]");
	var datas="";
	if (pos!=-1)
	{
		dataArray=data.split(" ");
		var max=dataArray.length-1;
		for (var i=1; i<max;i++)
		{
			if (datas != "") {
				datas += " " + dataArray[i];
			}
			else
			{
				datas=dataArray[i];
			}
		}
	}
	eval("var Obj="+datas);
	return Obj	
}