//环信开发文档：http://docs.easemob.com/im/400webimintegration/25intiate
function 环信即时通讯(name,登录成功,出现错误,连接断开,网络状态改变,注册完毕,收到文本消息,收到命令消息,收到图片消息,收到音频消息,
							发送文本消息完毕,发送命令消息完毕,发送图片消息完毕,发送音频消息完毕,下载音频文件完毕,							
    						获取好友列表完毕,收到添加好友请求,对方同意添加好友,对方拒绝添加好友,删除好友完毕,
							创建群组完毕,加入群组完毕,获取群组列表完毕,获取群组成员完毕){
        this.名称 = name;
        var conn = null;
		var rtcCall = null;
		var userName = "";
		
        this.初始化 = function(){
            conn = new WebIM.connection({
                https: WebIM.config.https,
                url: WebIM.config.xmppURL,
                isAutoLogin: WebIM.config.isAutoLogin,
                isMultiLoginSessions: WebIM.config.isMultiLoginSessions
            }); 
            conn.listen({
                onOpened: function ( message ) { //登录成功回调
                    //console.log("onOpened："+ JSON.stringify(message));
                    if(登录成功!=null){ 
                        登录成功(message); 
                    }
                },  
                onClosed: function ( message ) { //连接关闭回调
                    //console.log("onClosed："+ JSON.stringify(message));
                    if(连接断开!=null){ 
                        连接断开(message); 
                    }                    
                },         
                onTextMessage: function ( message ) { //收到文本消息
                    //console.log("onTextMessage："+ JSON.stringify(message));
                    if(收到文本消息!=null){ 
						if(message.type=="chat"){
							收到文本消息(1, message.id, message.data, message.from, message.to); 
						}else if(message.type=="groupchat"){
 							收到文本消息(2, message.id, message.data, message.from, message.to); 
						}
                    }  					           
                },    
                onEmojiMessage: function ( message ) {},   //收到表情消息
                onPictureMessage: function ( message ) {   //收到图片消息
                    //console.log("onPictureMessage：", message.url);					
                    if(收到图片消息!=null){ 
						if(message.type=="chat"){
							收到图片消息(1, message.id, message.url, message.from, message.to); 
						}else if(message.type=="groupchat"){
 							收到图片消息(2, message.id, message.url, message.from, message.to); 
						}
                    } 										
                }, 
                onCmdMessage: function ( message ) {//收到命令消息
					//console.log("onCmdMessage：", message);	
					//console.log(message.ext.type);
                    if(收到命令消息!=null){ 
						if(message.ext.type=="singleChat"){
							收到命令消息(1, message.id, message.action, message.from, message.to); 
						}else if(message.ext.type=="chatRoom"){
 							收到命令消息(2, message.id, message.action, message.from, message.to); 
						}
                    }  
				},     
                onAudioMessage: function ( message ) {     //收到音频消息
                    if(收到音频消息!=null){ 
						if(message.type=="chat"){
							收到音频消息(1, message.id, message.url, message.from, message.to); 
						}else if(message.type=="groupchat"){
 							收到音频消息(2, message.id, message.url, message.from, message.to); 
						}
                    } 				
				}, 
                onLocationMessage: function ( message ) {},//收到位置消息
                onFileMessage: function ( message ) {},    //收到文件消息
                onVideoMessage: function ( message ) {},   //收到视频消息
                onPresence: function ( message ) { //收到联系人订阅请求、处理群组、聊天室被踢解散等消息
                    //console.log("onPresence："+ JSON.stringify(message));
                    if ( message.type === "subscribe" ) {
                        //若message.status中含有[resp:true],则表示为对方同意好友后反向添加自己为好友的消息，demo中发现此类消息，默认同意操作，完成双方互为好友；如果不含有[resp:true]，则表示为正常的对方请求添加自己为好友的申请消息。
                        if(message.status === "[resp:true]"){
                            //对方同意好友后反向添加自己为好友
                        }else{
                            if(收到添加好友请求!=null){
                                收到添加好友请求(message.from,message.status);
                            }
                        }
                        return;
                    }
                    
                    //（发送者允许接收者接收他们的出席信息），即别人同意你加他为好友
                    if ( message.type === "subscribed" ) {
                        if(对方同意添加好友!=null){
                            对方同意添加好友(message.from);
                        }
                        return;
                    }

                    //（订阅者的请求被拒绝），即对方拒绝了你加他为好友
                    if ( message.type === "unsubscribed" ) {
                        if(对方拒绝添加好友!=null){
                            对方拒绝添加好友(message.from,message.status);
                        }
                        return;
                    }   

                    //（发送者取消订阅另一个实体的出席信息）,即对方删除了你
                    if ( message.type === "unsubscribe" ) {
                        if(被对方删除好友!=null){
                            被对方删除好友(message.from);
                        }
                        return;
                    }
            
                },       
                onRoster: function ( message ) {},         //处理好友申请
                onInviteMessage: function ( message ) {},  //处理群组邀请
                onOnline: function () {//网络已连接
					if(网络状态改变!=null){
						网络状态改变(1);
					}
				},                  
                onOffline: function () {//网络已掉线
					if(网络状态改变!=null){
						网络状态改变(2);
					}				
				},                 
                onError: function ( message ) {//登录失败或者发送消息失败回调
                    //错误代码：http://docs.easemob.com/im/450errorcode/40weberrorcode
                    //console.log("onError："+ JSON.stringify(message));
                    var str = message.data.data;
                    var description = "";
                    if(str != null){
                        var str2 = str.replace(/\\/g,"");
                        //console.log(str2);
                        var obj = eval("("+ str2 + ")"); 
                        var description = obj.error_description;
                        //console.log(description);                          
                    }
                    if(出现错误!=null){
                        出现错误(description,message.type);  
                    }                
                },
                onBlacklistUpdate: function (list) {       //黑名单被更新
                    // 查询黑名单，将好友拉黑，将好友从黑名单移除都会回调这个函数，list则是黑名单现有的所有好友信息
                    //console.log(list);
                }
            });                       
        }
        
        this.注册 = function(账号,昵称,密码){
            if(conn==null){
                return;
            }          
            var options = { 
                username: 账号,
                nickname: 昵称,
                password: 密码,
                appKey: WebIM.config.appkey,
                success: function () { 
                    if(注册完毕!=null){ 
                        注册完毕(true,""); 
                    }              
                },  
                error: function (e) { 
                    if(注册完毕!=null){ 
                        注册完毕(false,e.data); 
                    }                  
                }, 
                apiUrl: WebIM.config.apiURL
            }; 
            conn.signup(options);
        }
        
        this.登录 = function(账号,密码){
            if(conn==null){
                return;
            }        
            var options = { 
                    apiUrl: WebIM.config.apiURL,
                    user: 账号,
                    pwd: 密码,
                    appKey: WebIM.config.appkey
                };
            conn.open(options); 
			userName = 账号;   
        }

        this.登录2 = function(账号,令牌){
            if(conn==null){
                return;
            }        
            var options = { 
                    apiUrl: WebIM.config.apiURL,
                    user: 账号,
                    pwd: 令牌,
                    accessToken: 令牌,
                    appKey: WebIM.config.appkey
                };
            conn.open(options); 
			userName = 账号;        
        }
        
        this.退出 = function(){
            if(conn!=null){
                conn.close();
            }        
        }
        
        this.发送文本消息 = function(消息类型,接收账号,消息内容){
            if(conn==null){
                return "";
            }
            var id = conn.getUniqueId();             // 生成本地消息id
            var msg = new WebIM.message("txt", id);      // 创建文本消息
			var type = "singleChat";
			if(消息类型==1){
				type = "singleChat";//单聊
			}else{
				type = "chatRoom";//群聊
			}
            var option = {
                msg: 消息内容,                 
                to: 接收账号,       
                roomType: false,
				chatType: type,
                success: function (id, serverMsgId) {
                    console.log("send private text Success");
                    if(发送文本消息完毕!=null){
                        发送文本消息完毕(消息类型,true,id,serverMsgId);
                    }
                },
                fail: function () {
                    console.log("failed");
                    if(发送文本消息完毕!=null){
                        发送文本消息完毕(消息类型,false,id,"");
                    }                    
                }                
            };
			msg.set(option);
			if(消息类型==2){
				msg.setGroup("groupchat");//群聊
			}
            conn.send(msg.body); 
            return id;                  
        }

        this.发送命令消息 = function(消息类型,接收账号,消息内容){
            if(conn==null){
                return "";
            }
            var id = conn.getUniqueId();             // 生成本地消息id
            var msg = new WebIM.message("cmd", id);      // 创建命令消息
			var type = "singleChat";
			if(消息类型==1){
				type = "singleChat";//单聊
			}else{
				type = "chatRoom";//群聊
			}
            var option = {                
                to: 接收账号,   
				action : 消息内容,	
				ext :{"type":type}, 		    
                roomType: false,
				chatType: type,
                success: function (id, serverMsgId) {
                    //console.log("send private text Success");
                    if(发送命令消息完毕!=null){
                        发送命令消息完毕(消息类型,true,id,serverMsgId);
                    }
                },
                fail: function () {
                    //console.log("failed");
                    if(发送命令消息完毕!=null){
                        发送命令消息完毕(消息类型,false,id,"");
                    }                    
                }                
            };
			msg.set(option);
			if(消息类型==2){
				msg.setGroup("groupchat");//群聊
			}
            conn.send(msg.body); 
            return id;                  
        }

        this.发送图片消息 = function (消息类型,接收账号,文件选择器名称) {
            if(conn==null){
                return "";
            }		
            var id = conn.getUniqueId();              // 生成本地消息id
            var msg = new WebIM.message("img", id);        // 创建图片消息
            var input = document.getElementById(文件选择器名称);  // 选择图片的input
            var files = WebIM.utils.getFileUrl(input);      // 将图片转化为二进制文件
			//console.log(files.url);
			//console.log(files.filename);
			//console.log(files.filetype);
			//console.log(files.data);
            var allowType = {
                "jpg": true,
                "gif": true,
                "png": true,
                "bmp": true
            };
			if(消息类型==1){
				type = "singleChat";//单聊
			}else{
				type = "chatRoom";//群聊
			}			
            if (files.filetype.toLowerCase() in allowType) {
                var option = {
                    apiUrl: WebIM.config.apiURL,
                    file: files,
                    to: 接收账号,                           // 接收消息对象
                    roomType: false,
                    chatType: type,
                    fail: function () {                   // 消息发送失败
                        //console.log("failed");
                        if(发送图片消息完毕!=null){
                            发送图片消息完毕(消息类型,false,id,"");
                        }                           
                    },
                    success: function (id,serverMsgId) {                // 消息发送成功
                        //console.log("Success");
                        if(发送图片消息完毕!=null){
                            发送图片消息完毕(消息类型,true,id,serverMsgId);
                        }                         
                    },
                    flashUpload: WebIM.flashUpload
                };
                msg.set(option);
				if(消息类型==2){
					msg.setGroup("groupchat");//群聊
				}				
                conn.send(msg.body);
            }
			return id;
        }

        this.发送图片消息2 = function (消息类型,接收账号,图片路径) {
            if(conn==null){
                return "";
            }			
            var id = conn.getUniqueId();              // 生成本地消息id
            var msg = new WebIM.message("img", id);        // 创建图片消息
			var files = {
                url: 图片路径,
                filename: "",
                filetype: "",
                data: ""
            };
			var pos1 = 图片路径.lastIndexOf("/");
	        var pos2 = 图片路径.lastIndexOf("\\");
	        var pos = Math.max(pos1, pos2);
	        if (pos < 0){
				files.filename = 图片路径;
			}else{
				files.filename = 图片路径.substring(pos + 1);  
			} 
	        var index = files.filename.lastIndexOf(".");
	        if (index != -1) {
	            files.filetype = files.filename.substring(index + 1).toLowerCase();
	        }			         			
            var allowType = {
                "jpg": true,
                "gif": true,
                "png": true,
                "bmp": true
            };
			if(消息类型==1){
				type = "singleChat";//单聊
			}else{
				type = "chatRoom";//群聊
			}				
            if (files.filetype.toLowerCase() in allowType) {
                var option = {
                    apiUrl: WebIM.config.apiURL,
                    file: files,
                    to: 接收账号,                           // 接收消息对象
                    roomType: false,
                    chatType: type,
                    fail: function () {                   // 消息发送失败
                        //console.log("failed");
                        if(发送图片消息完毕!=null){
                            发送图片消息完毕(消息类型,false,id,"");
                        }                           
                    },
                    success: function (id,serverMsgId) { // 消息发送成功
                        //console.log("Success");
                        if(发送图片消息完毕!=null){
                            发送图片消息完毕(消息类型,true,id,serverMsgId);
                        }                         
                    },
                    flashUpload: WebIM.flashUpload
                };
                msg.set(option);
				if(消息类型==2){
					msg.setGroup("groupchat");//群聊
				}					
                conn.send(msg.body);
            } 					
  			return id;
        }

        this.发送音频消息 = function (消息类型,接收账号,文件选择器名称) {
            if(conn==null){
                return "";
            }				
            var id = conn.getUniqueId();              // 生成本地消息id
            var msg = new WebIM.message("audio", id);        // 创建音频消息
            var input = document.getElementById(文件选择器名称);  // 选择图片的input
            var files = WebIM.utils.getFileUrl(input);      // 将图片转化为二进制文件
			//console.log(files.url);
			//console.log(files.filename);
			//console.log(files.filetype);
			//console.log(files.data);
            var allowType = {
                "mp3": true,
                "amr": true,
                "wav": true
            };
			if(消息类型==1){
				type = "singleChat";//单聊
			}else{
				type = "chatRoom";//群聊
			}			
            if (files.filetype.toLowerCase() in allowType) {
                var option = {
                    apiUrl: WebIM.config.apiURL,
                    file: files,
                    to: 接收账号,                           // 接收消息对象
                    roomType: false,
                    chatType: type,
                    fail: function () {                   // 消息发送失败
                        //console.log("failed");
                        if(发送音频消息完毕!=null){
                            发送音频消息完毕(消息类型,false,id,"");
                        }                           
                    },
                    success: function (id,serverMsgId) {  // 消息发送成功
                        //console.log("Success");
                        if(发送音频消息完毕!=null){
                            发送音频消息完毕(消息类型,true,id,serverMsgId);
                        }                         
                    },
                    flashUpload: WebIM.flashUpload
                };
                msg.set(option);
				if(消息类型==2){
					msg.setGroup("groupchat");//群聊
				}				
                conn.send(msg.body);
            }
			return id;
        }

        this.发送音频消息2 = function (消息类型,接收账号,音频路径) {
            if(conn==null){
                return "";
            }		            
			var id = this.conn.getUniqueId();              // 生成本地消息id
            var msg = new WebIM.message("audio", id);        // 创建音频消息
			var files = {
                url: 音频路径,
                filename: "",
                filetype: "",
                data: ""
            }; 		        
			var pos1 = 音频路径.lastIndexOf("/");
	        var pos2 = 音频路径.lastIndexOf("\\");
	        var pos = Math.max(pos1, pos2);
	        if (pos < 0){
				files.filename = 音频路径;
			}else{
				files.filename = 音频路径.substring(pos + 1);  
			} 
	        var index = files.filename.lastIndexOf(".");
	        if (index != -1) {
	            files.filetype = files.filename.substring(index + 1).toLowerCase();
	        }			         			
            var allowType = {
                "mp3": true,
                "amr": true,
                "wav": true
            };
			if(消息类型==1){
				type = "singleChat";//单聊
			}else{
				type = "chatRoom";//群聊
			}				
            if (files.filetype.toLowerCase() in allowType) {
                var option = {
                    apiUrl: WebIM.config.apiURL,
                    file: files,
                    to: 接收账号,                           // 接收消息对象
                    roomType: false,
                    chatType: type,
                    fail: function () {                   // 消息发送失败
                        //console.log("failed");
                        if(发送音频消息完毕!=null){
                            发送音频消息完毕(消息类型,false,id,"");
                        }                           
                    },
                    success: function (id,serverMsgId) { // 消息发送成功
                       // console.log("Success");
                        if(发送音频消息完毕!=null){
                            发送音频消息完毕(消息类型,true,id,serverMsgId);
                        }                         
                    },
                    flashUpload: WebIM.flashUpload
                };
                msg.set(option);
				if(消息类型==2){
					msg.setGroup("groupchat");//群聊
				}					
                conn.send(msg.body);
            } 					
  			return id;
        }

        this.下载音频文件 = function (音频地址,音频格式,消息ID) {
			var options = { url: 音频地址 };			    
    		options.onFileDownloadComplete = function ( response ) { 
				//console.log("response：" + response);
				//console.log("filename：" + response.type);
				//alert("音频下载成功" + JSON.stringify(response) + "\n" + response.type);
				if(下载音频文件完毕!=null){
					window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
					var objectUrl = window.URL.createObjectURL(response);  //将Blob对象转换成ObjectURL
					下载音频文件完毕(true,objectUrl,消息ID);
				}
    		};  

    		options.onFileDownloadError = function () {
				//alert("音频下载失败");
				if(下载音频文件完毕!=null){
					下载音频文件完毕(false,null,消息ID);
				}				
    		};  
    		//通知服务器将音频转换为指定格式
    		options.headers = { 
      			"Accept": "audio/" + 音频格式
    		};
    		WebIM.utils.download.call(conn, options);		
		}

        this.获取好友列表 = function(){
            if(conn==null){
                return;
            } 
            conn.getRoster({
                success: function ( roster ) {
                    //获取好友列表，并进行好友列表渲染，roster格式为：
                    /** [
                          {
                            jid:'asemoemo#chatdemoui_test1@easemob.com',
                            name:'test1',
                            subscription: 'both'
                          }
                        ]
                    */
                    /*for ( var i = 0, l = roster.length; i < l; i++ ) {
                        var ros = roster[i];    
                        //ros.subscription值为both/to为要显示的联系人，此处与APP需保持一致，才能保证两个客户端登录后的好友列表一致
                        if ( ros.subscription === 'both' || ros.subscription === 'to' ) {
                            
                        }
                    }*/
					//console.log(roster);
                    if(获取好友列表完毕!=null){
                        获取好友列表完毕(true,roster);
                    }
                },
                fail: function () {
                    //console.log("failed");
                    if(获取好友列表完毕!=null){
                        获取好友列表完毕(false,null);
                    }
                }                    
            });                   
        }

        this.发送添加好友请求 = function(对方账号,附加消息){
            if(conn==null){
                return;
            }
            conn.subscribe({
                to: 对方账号,
                // Demo里面接收方没有展现出来这个message，在status字段里面
                message: 附加消息   
            });
        }
        
        this.同意添加好友请求 = function(对方账号){
            if(conn==null){
                return;
            }
            conn.subscribed({ //同意添加好友
                to: 对方账号,
                message: "[resp:true]" 
            });
            conn.subscribe({ //同时申请反向添加对方为好友
                to: 对方账号,
                message: "[resp:true]" 
            });            
        }        
        
        this.拒绝添加好友请求 = function(对方账号,拒绝理由){
            if(conn==null){
                return;
            }
            this.conn.unsubscribed({ //拒绝添加好友
                to: 对方账号,
                message: 拒绝理由 
            });          
        }         
        
        this.删除好友 = function(对方账号){
            if(conn==null){
                return;
            }
            conn.removeRoster({
                to: 对方账号,
                success: function (message) {  // 删除成功
                    //console.log(message);
                    conn.unsubscribe({ //取消订阅对方出席
                        to: 对方账号
                    });
                    if(删除好友完毕!=null){
                        删除好友完毕(true,对方账号);
                    }
                },
                error: function (message) {    // 删除失败
                    //console.log(message);
                    if(删除好友完毕!=null){
                        删除好友完毕(false,对方账号);
                    }
                }
            });       
        }          
        
        this.获取群组列表 = function(){
            if(conn==null){
                return;
            }
            var option = {
                success: function (rooms) {
                    //console.log(rooms);
                    if(获取群组列表完毕!=null){
                        获取群组列表完毕(true,rooms);
                    }
                },
                error: function (message) {
                    //console.log(message);
                    if(获取群组列表完毕!=null){
                        获取群组列表完毕(false,message);
                    }
                }
            };
            conn.listRooms(option);
        }        
        
        this.获取群组成员 = function(群组账号){
            if(conn==null){
                return;
            }
            var option = {
                roomId: 群组账号,
                success: function (members) {
                    // 查询出来的member的结构为{affiliation: 'member', jid: 'easemob-demo#chatdemoui_wjy6@easemob.com'}
                    // 注意，这里的jid格式，成员的用户名是chatdemoui_之后，@easemob.com之前的字符串，如本例的wjy6是用户名
                    //console.log(members);
					if(获取群组成员完毕!=null){
                        获取群组成员完毕(true,members);
                    }              
                },
                error: function (message) {
                    //console.log(message);
                    if(获取群组成员完毕!=null){
                        获取群组成员完毕(false,message);
                    }
                } 
            };  
            conn.queryRoomMember(option);                 
        }        
        
        
        this.创建群组 = function(群组名称,群组简介,群组成员){
            if(conn==null){
                return;
            }
            var option = {
                subject: 群组名称,               // 群名称
                description: 群组简介,           // 群简介
                members: 群组成员,               // 以数组的形式存储需要加群的好友ID，例如：['wjy6', 'asdfghj']
                optionsPublic: true,                        // 允许任何人加入
                optionsModerate: false,                     // 加入需审批
                optionsMembersOnly: false,                  // 不允许任何人主动加入
                optionsAllowInvites: false,                  // 允许群人员邀请            
                success: function (message) {
                    //console.log(message);
                    if(创建群组完毕!=null){
                        创建群组完毕(true,message);
                    }
                },
                error: function (message) {
                    //console.log(message);
                    if(创建群组完毕!=null){
                        创建群组完毕(false,message);
                    }
                }
            };
            conn.createGroup(option);
        }         
        
        this.加入群组 = function(群组账号,群组成员){
            if(conn==null){
                return;
            }
            var option = {
                list: 群组成员,   // 以数组的形式存储需要加群的好友ID，例如：['wjy6', 'asdfghj']
                roomId: 群组账号,                 
                success: function (message) {
                    //console.log(JSON.stringify(message));
					//console.log(message);
                    if(加入群组完毕!=null){
                        加入群组完毕(true,message);
                    }
                },
                error: function (message) {
                    //console.log(message);
                    if(加入群组完毕!=null){
                        加入群组完毕(false,message);
                    }
                }
            };
            conn.addGroupMembers(option);
        }          
        
}  

