
(function(opt) {
    var env = {c:opt.compId,u:opt.UId,v:opt.VId,n:opt.userName,role:2,meeting:opt.meeting,cId:opt.chatId,site:opt.siteId},
            url = 'msg.dll?cmd=',msgTimer = null,inviteTimer = null,msgInterval = 3000,isConnected = false,parts = [],
            inviteWait = 30,robotChatting = false,shtcut = 'Enter',maxAllowLen = 400,emots={},
            lastMsgTime = new Date(),ackTime = null,alertNoChatTime = 110,maxReplyWaitTime = 1,inputtingTimer = null,
            inputTimer = null,lastPump = new Date(),lastMsg = '',opinioned = false,doc = document,force=opt.command =='forceChat',
            queueInited = false, notFirst = 0,notConnected = null,focusMsg=false,showTypes=false;
    opt.groupId && (env.g=opt.groupId);
 
    $.onReady(function(){
        force||initToolTip();
        initEvent();
        if( opt.visitorAuthen && !force) {
            var w = new $.win({title:i18n.visitorAuth,content:$('visitorAuth'),width:400,height:270,handler:function(){
                var ids=['visitor_name','visitor_email','visitor_tel'],param={},sqt='visitor_question_type';
                opt.showQType&&$(sqt)&&ids.push(sqt);
                for(var v=0;v<ids.length;v++){
                    var id=ids[v],el=$(id),vl=$.value(el);
                    if(!$.isBlank( vl)) param[id] = vl;
                    else{
                        alert(i18n.invalid);
                        return false;
                    }
                }
                param = $.apply({},env,param);
                $.get(url + 'startChat', param, function(data) {
                    recvChatData(data);
                });
                return true;
            }});
            w.show();
        }else{
            initChat();
        }
        !force &&opt.showChatType&&showChatType();
    });    
    window.onbeforeunload=function() {
        force|| openOpinion({auto:true});       
        if (isConnected) return i18n.exitConfirm;
    };
    $.attachE(window,'unload',function() {
        $.ajaxSetup({async:false});
        disconnect();
        clearInterval(msgTimer);
    });
    var initToolTip=function(){
        var tools = $('tool').getElementsByTagName('a');
        for(var v=0;v<tools.length;v++){
            var id = tools[v].id;
            id&&i18n[id]&&(tools[v].title=i18n[id]);
        }
    };
    var initUI=function(){
        var eles = document.getElementsByTagName('span');
        for(var v=0;v<eles.length;v++){
            var id = eles[v].id;
            if(id && id.indexOf('vr_')==0){
                eles[v].innerHTML = i18n[id.substring(3)];
            }
        }
        initToolTip();
    }
    var composeCard = function() {
        var p = {ldept:i18n.dept,vdept:opt.deptName,lname:i18n.name,vname:opt.realName,
            lemail:i18n.email,vemail:$.escapeNull(opt.mail)||'&nbsp;',lphone:i18n.phone,vphone:$.escapeNull(opt.phone)},
         m= p.vemail;
        if(m && m.length>15) m = m.substring(0,15) +'<br/>'+m.substring(15);
        p.semail = m;

        var tpl = '<div class="cust-card">'
                +'<span id="vr_dept">{ldept}</span><div>{vdept}</div>'
                +'<span id="vr_name">{lname}</span><div>{vname}</div>'
                +'<span id="vr_email">{lemail}</span><div><a href="mailto:{vemail}" title="{vemail}">{semail}</a></div>'
                +'<span id="vr_phone">{lphone}</span><div>{vphone}</div>'
                +'</div>';
        $('card').innerHTML =$.tpl(tpl,p);
    }
    var showChatType=function(){
        if(showTypes) return;
        showTypes = true;
        var html = '<div class="chat-type-div">',opts = $('visitor_question_type').options;
        html += opt.chatTypeTip;
        html +='<div  id="chatType" class="chat-types">';
        for(var o=0;o<opts.length;o++){
            html+='<a href="#" onclick="return false;" value="' + opts[o].value + '">'+opts[o].text +'</a>';
        }
        html +='</div></div>';
        doAppend(html,'evtMsg');

        var tdiv = $('chatType');
        tdiv.onclick=function(e){
            e=e||window.event;
            var tar = e.target||e.srcElement;
            if( tar.tagName.toLowerCase() == 'a'){
                $.hide(tdiv.parentNode);
                env.ctype=tar.value;
                env.ctypename=tar.innerHTML;
                env.cId&& sendEvent('CHAT_CATEGORY',tar.value,tar.innerHTML);
            }
        }
    }
    var initQueue=function(){
        var qt=opt.queueTip,qto=opt.queueTimeout,qtot=opt.queueTimeoutTip;
        var appM=function(m){
            m = $.tpl(m,{queue:'<span id="queueInfo">'+opt.queue+'</span>'});
            appendMsg(0,'evtMsg '+(notFirst++?'':'firstMsg'),m);
        };
        qt&&appM(qt);
        if( qt &&qtot){
            setTimeout(function(){
                if(!env.cId) appM(qtot);
            },qto*1000);
        }
        queueInited = true;
    };
    var recvChatData=function(data){
       if( data.cId ){
            opt.queue = 0;
            env.cId = data.cId;
            data.card && (env.n=data.card.userName)&&$.apply(opt,data.card);
        }else{
            opt.queue = data.queue;
        }
        initChat();
    };
    var msgChange=function(){
        var mm = $('message').value;
        if (lastMsg != mm) {
            return mm;
        }
        return false;
    };
    var initEvent =function(){
        var t = $('message');
        $.attachE(t,'focus',function(){
            focusMsg=true;
        });
        inputTimer = setInterval(function() {
            var mm = msgChange();
            if (mm!==false) {
                var d = new Date().getTime()- lastPump.getTime();
                (d  >= 1500) ||(sendEvent('GETFOCUS', mm) && (lastMsg = mm));
            }
        }, 1500);
        $.attachE(t,'blur',function(){
            false;
        });
        $.attachE(t,'keydown',function(event){
            var e = event || window.event,
            isHotKey = (shtcut=='Enter' && !e.ctrlKey && e.keyCode==13)||
                       (shtcut=='CtrlEnter' && e.ctrlKey && e.keyCode==13);
            if( isHotKey ){
                sendMessage();
                return false;
            }
            return true;            
        });
        $.attachE(t,'keyup',function(){return false;});
    };
    var showQueueInfo=function(qu){
       var dv = $('queueInfo');
       dv&&(dv.innerHTML=qu);       
       notConnected = $.tpl(i18n.queuing,[qu]);
    };
    var initChat = function(){
        if(env.cId <0){
            var errors=[i18n.onlyone, i18n.accountInvalid]
            appendMsg(errors[3+env.cId]);
            return;
        }
        if( opt.meeting ){
            if (env.cId) {
                $.get(url + 'acceptChat', env, function(data, rst) {
                    if( data.status == 'success'){meetingRoom.init(data.result);startChat();}
                });
            } else if (opt.meetingId) {
                var p = $.apply({}, env, {mId:opt.meetingId});
                $.get(url + 'joinMeeting', p, function(data, rst) {
                    if( data.status == 'success'){meetingRoom.init(data.result);startChat();}
                });
            }
        }else if(opt.queue){
             if(!queueInited) initQueue();
            showQueueInfo(opt.queue);

            setTimeout(function(){
                $.get(url+'queue',env,function(data){
                    if(data.status == 'error'){
                        appendMsg(i18n.onlyone);
                        return;
                    }
                    recvChatData(data);
                });
            },2*1000);
        }else{
            isConnected = true;
            env.ctype &&sendEvent('CHAT_CATEGORY',env.ctype,env.ctypename);
        
            appendMsg(2,'evtMsg ' +(notFirst++?'':'firstMsg'),i18n.connected,opt.realName,i18n.servicer);
            if( !$.isBlank(opt.hello) ){
                appendMsg(0,'helloDiv',opt.hello);
            }
            if(!opt.cardImage && !force) composeCard();
            startChat();
        }
    };

    var startChat = function() {
        msgTimer = window.setInterval(receiver, msgInterval);
    };
    var missing=(function(){
        var mtimer = null;
        return function(){
            mtimer&&clearTimeout(mtimer);
            var t = opt.missingTime||1,m=opt.custMissing;
            mtimer=setTimeout(function(){
                m&&appendMsg(m);
                //missing();
            },t*60*1000);
        }
    })();
    var receiver = function() { 
        if (env.cId == null) {
            clearInterval(msgTimer);
            msgTimer = null;
            isConnected = false;
            return;
        }
        lastPump = new Date();
        var p = $.apply({}, env, {check:checkActive()});
        var mm = msgChange();
        if(mm!==false){
            p.input = mm;
            lastMsg=mm;
        }
        
        $.get(url + 'pump', p, function(resp, st) {
            parseMsg(resp.result);
        });
    };

    var parseMsg = function(msgs) {
        var hasmsg = false,infomsg = 0;
        if (msgs.length > 0) {
            lastMsgTime = new Date();
            hasmsg = true;
        }
        for (var v = 0; v < msgs.length; v++) {
            var msg = msgs[v];
            if (msg.control) {
                if ($.isBlank(msg.msg)) continue;
                var reg = /^<(.*)>(.*)$/;
                reg.exec(msg.msg);
                var ctrl = RegExp.$1.toUpperCase(),m = RegExp.$2;
                switch (ctrl) {
                    case 'END':
                        if (env.meeting){meetingRoom.remove(msg.from); }
                        else disconnect();
                        break;
                    case 'CLOSE':disconnect();break;
                    case 'ACCEPT': acceptChat(m);break;
                    case 'CHANGE_NICK':
                        appendMsg($.shortId(msg.from),execTpl(3,[i18n.changeNick,m],0));
                        meetingRoom.update(msg.from, 'realName', m);
                        break;
                    case 'REMOVE': appendMsg(i18n.removed);env.cId = null;isConnected = false;break;
                    case 'TRANSCHAT':transBegin(m);break;
                    case 'TRANS':transFinn();break;
                    case 'FILE':receiveMsg(msg.from, 'file', m);break;
                    case 'SCREENSHOTS':receiveMsg(msg.from, 'image', m);break;
                    case 'SENDPHOTO':m = m.split('#')[1];receiveMsg(msg.from, 'image', m);break;
                    case 'SENDPAGE':receiveMsg(msg.from, 'url', m);break;
                    case 'SENDMAIL':receiveMsg(msg.from, 'mail', m);break;
                    case 'ACK_REQUEST': sendEvent('ACK_RESPONSE');infomsg++;break;
                    case 'ACK_RESPONSE':infomsg++;break;
                    case 'GETFOCUS':force||inputting();infomsg++;break;

                    case 'ROBOTCHAT':robotChat(m);break;
                    case 'OPINION': openOpinion();break;
                    case 'VHISTORY':infomsg++; break;
                    case 'VRECORDER':infomsg++; break;
                    case 'MSG_SEND_ERROR': appendMsg($.tpl(i18n.msgFail,[m]));break;
                    case 'SCREEN_SEND_ERROR':
                    case 'FILE_SEND_ERROR': appendMsg(i18n.fileFail);break;
                }
            } else {
                receiveMsg(msg.from, (env.meeting&&msg.to!=null?'private':null), msg.msg);                     
            }
        }
        if (hasmsg && (msgs.length > infomsg) ) {
            missing();
            if(!doc.hasFocus || !doc.hasFocus()){
                focusMsg||window.focus();
                msgArrived();
            }
        }
    };
    var msgArrived = (function(){
        var titleTimer = 0,titleFlag=0,titleArray=[ '-','-','-','>'];
        return function(){
            titleTimer && clearInterval(titleTimer);
            titleTimer=setInterval(function(){
                document.title= titleFlag++%2?'...':i18n.msgArrived; 
            },500);
            $.attachE($('message'),'focus',function(){
                clearInterval(titleTimer);
                titleTimer =0;
                titleFlag=0;
                document.title =  opt.title;
            });
        };
    })();
    var acceptChat = function(m) {
        var pms = m.split('#'),id = pms[0],name = pms[1],compId = pms[2],admin = pms[3];
        if (env.meeting) {
            meetingRoom.addPart(id, name, admin);
        } else {
            if(id == env.n || meetingRoom.initing) return;
            $.get(url + 'participants', env, function(data, rst) {
                meetingRoom.initing = true;
                meetingRoom.init(data.result);
                env.meeting = true;
            });
        }
        appendMsg($.shortId(id),i18n.inMeeting);
    }
    var disconnect = function() {
        if(opt.queue){
            $.get(url + 'exitQueue', env, function() {});
            opt.queue =0;
        }
        if (env.cId) {
            $.get(url + 'endChat', env, function() {});
            appendMsg(i18n.endChat);
            openOpinion({auto:true,
                onClose:function(){
                    env.cId = null;},
                closable:false
            });
            isConnected = false;
        }
    }
    var transBegin = function(m) {
        var ps = m.split(',');
        env.n = ps[1];
        opt.realName = ps[3];
        env.cId = ps[2];
        $.apply(opt, {dept:ps[4],email:ps[5],phone:ps[6]});
        isConnected = false;
        appendMsg(3, 'evtMsg', i18n.transChat, opt.realName);
        if(!opt.cardImage)
            composeCard();
    }
    var transFinn = function() {
        appendMsg(i18n.transChatFinn);
        isConnected = true;
    }
    var robotChat = function(m) {
        if (m == 'begin') {
            robotChatting = true;
            appendMsg(i18n.toRobot);
        } else {
            robotChatting = false;
            appendMsg(i18n.leaveRobot);
        }
    }
    var receiveMsg = function(who, type, m) {
        var cls = 'msg',name = null,say = i18n.say;
        var tstr = $.dateString();
        if (who == env.n) name = $.shortId(who, opt.realName);
        else if (env.meeting) name= meetingRoom.getName(who);
        else name=who;
        switch (type) {
            case 'file':
                say = i18n.sendFile;
                m = execTpl(5, [m,i18n.download], 0);
                break;
            case 'image':
                cls = 'imgMsg';
                say = i18n.sendImg;
                m = execTpl(6, [m,i18n.fullImg], 0);
                break;          
            case 'private':
                say = execTpl(i18n.whisper,[i18n.you],0);
            default:
                m = $.parseEmail($.parseURL(m));
                m = m.replace("\/",function(){
                    return "/";
                })
                break;
        }
        appendMsg(4, 'inMsg', name, say, tstr, cls, m);
    }
    var templates = ['{0}',
        '<span class="nameTag">{0}</span>{1}',
        '{0}<span class="nameTag">{1}</span>{2}',
        '{0}<span class="nameTag">{1}</span>',
        '<div class="titleTag"><span class="nameTag">{0}</span>{1}<span class="createTime">({2})</span></div><div class="{3}">{4}</div>',
        '<a href="{0}" target="_blank">{1}</a>',
        '<img src="{0}" height="100" width="100"/><div><a href="{0}" target="_blank">{1}</a></div>',
        '{0}{1}({2})',
        '<li class="ansItem"><div class="ansTitle"><a href="#" onclick="$.toggle(\'{0}\');return false">{1}</a></div><div class="ansContent" id="{0}" style="display:none">{2}</div></li>'
    ];   
    var appendMsg = function() {
        var args = arguments;
        var tId = args[0],cls = args[1],start = 2;
        if (args.length == 1 || args.length == 2) {
            tId = args.length - 1;
            cls = 'evtMsg';
            start = 0;
        }
        doAppend(execTpl(tId, args, start),cls);
    }
    var doAppend=function(msg,clz){
        var tar = doc.createElement('div');
        clz&&(tar.className = clz);
        tar.innerHTML = msg;
        var ca = $('chatDiv');
        ca.appendChild(tar);
        ca.scrollTop += 5000;
    }
    var execTpl = function(tId, args, start) {
        var tmp = (typeof tId=='number'?templates[tId]:tId);
        return $.tpl(tmp,Array.prototype.slice.call(args,start||0));
    }

    var inputting = function() {
        var id = 'vr_inputing';
        $.show(id)
        if (inputtingTimer != null) {
            clearTimeout(inputtingTimer);
            inputtingTimer = null;
        }
        inputtingTimer = setTimeout(function() {
            inputtingTimer = null;
            $.hide(id);
        }, 2000);
    }
    var checkActive = function() {
        var rtn = false;
        var now = new Date();
        if (isConnected && !env.meeting && ackTime == null && (now.getTime() - lastMsgTime.getTime()) / 1000 > alertNoChatTime) {
            ackTime = new Date();
            rtn = true;
        }
        if (ackTime != null && (now.getTime() - ackTime.getTime()) / 1000 > maxReplyWaitTime) {
            ackTime = null;
            lastMsgTime = new Date();
        }
        return rtn;
    }  

    $.apply(window,{
        sendMessage : function() {
            if (!env.meeting&&!isConnected) {
                alert(notConnected || i18n.disconnected);
                return;
            }
            var msg = $('message').value;
            if (msg.length == 0) {
                alert(i18n.empty);
                return;
            }
            msg = $.escapeHTML(msg);

            var smsg = $.parseEmail($.parseURL(msg));
            for (var e in emots) {
                if (smsg.indexOf(e) != -1) {
                    smsg = smsg.replaceAll(e, emots[e])
                }
            }
            if (msg.length > maxAllowLen) {
                alert(i18n.maxLen + ' ' + msg.length + '/' + maxAllowLen);
                return;
            }
            var say = (env.meeting && meetingRoom.getCurrent()!='')?execTpl(i18n.whisper,[meetingRoom.getName(meetingRoom.getCurrent())],0):i18n.say;
            appendMsg(4, 'outMsg', i18n.you, say, $.dateString(), 'msg', smsg);
            $('message').value = '';
            var p = $.apply({}, env, {flag:false,robot:robotChatting,msg:msg});
            if( env.meeting){ var curr = meetingRoom.getCurrent();if(curr==null||curr==''){delete p.n}else{p.n=curr;} }
            !p.robot || (p.type = -1);
            $.get(url + 'postMessage', p, function(dat) {
                if (dat.status == 'success') {
                    if (robotChatting && dat.robot) {
                        var ans = dat.answers;
                        if (!ans || ans.length == 0) {
                            appendMsg(4, 'inMsg', i18n.robot, i18n.say, $.dateString(), 'msg', opt.robotNoAnswer);
                        } else {
                            var mg = i18n.guess;
                            var aid = 'ans' + $.genID();
                            mg += '<ul>';
                            for (var i = 0; i < ans.length; i++) {
                                mg += execTpl(8, [aid + i,ans[i].question,ans[i].answer], 0);
                            }
                            appendMsg(4, 'inMsg', i18n.robot, i18n.say, $.dateString(), 'answer', mg);
                            mg += '</ul>';
                        }
                    }
                } else if (dat.status == 'error') {
                    var mg = i18n.sendFail;
                    mg += (dat.error == 'cancel' && i18n.empty || dat.error == 'toomany' && i18n.maxLen || i18n.unknown);
                    appendMsg(mg);
                }
            });
        },

        sendEvent : function() {
            var args = arguments;
            if (args.length == 0) return;
            var type = args[0],p1 = args[1],p2 = args[2],m=args[3];

            var p = $.apply({}, env, {flag:true,robot:false,type:type});
            if(env.meeting){p.n = meetingRoom.getCurrent();if(p.n=='')delete p.n;}
            if (p1 != null) {
                p.p1 = p1;
                p2 == null || (p.p2 = p2);
            }
            $.get(url + 'postMessage', p, function() {},m);
        },
        appendEmot : function(str, clz) {
            if (!emots[str]) emots[str] = '<div class="emot2 emot-inline ' + clz + '"></div>';
            $('message').value += str;
        },
        showEmot:(function(){
            var emotInited = false;
            return function(){
                if(!emotInited){
                    $('emotDiv').appendChild($.emotTable());
                    emotInited = true;
                }
                showDiv('emotDiv');
            }
        })(),
        showDiv :function(id,once) {
            setTimeout(function() {
                $.toggle(id);  
                var clk =   function(e) {
                    if(once||!$.clickIn(id,e)){
                        $.hide(id);
                        $.detachE(doc,'click',clk);
                    }
                };
                $.attachE(doc,'click',clk);

            }, 0);
    },

    sendFile : function() {
        var f = doc.forms['uploadForm'],v = f.file.value;
        if (v && v != '') {
            f.submit();
            $.show('fileSending');
        }
    } ,
    cancelFile : function() {
        if (confirm(i18n.cancelFile)) {
            $('uf').src = 'blank.html';
            $.hide('fileSending');
            $.hide('fileDiv');
        }
    } ,
    uploadComplete : function(status, info) {
        $.hide('fileSending');
        $.hide('fileDiv');
        if ($.isBlank(status)) {
            appendMsg(i18n.sendFinn);
            sendEvent('FILE', info);
        } else {
            var p1,p2;
            if (status == 'overMaxSize') {
                p1 = i18n.fileSize;
                p2 = info + 'M';
            } else if (status == 'invalidFileType') {
                p1 = i18n.fileType;
                p2 = info;
            } else {
                p1 = i18n.unknown;
                p2 = info;
            }
            appendMsg(7, 'evtMsg', i18n.fileFail, p1, p2);
        }
    },
    showLang:function(){
        if(!$('langDiv')){
            $.buildMenu('langDiv',{bottom:'57px',left:'80px'},
                    [{sid:$.genID(),lid:'lang_sc',text:'简体中文',cb:selectLang.delegate(null,['sc'])},
                     {sid:$.genID(),lid:'lang_tc',text:'繁體中文',cb:selectLang.delegate(null,['tc'])},
                     {sid:$.genID(),lid:'lang_en',text:'English',cb:selectLang.delegate(null,['en'])}])
        }
        showDiv('langDiv',true);
    },
    selectLang : function(lg) {
        if (opt.lang != lg) {
            $.removeClass(doc.body,'lg-'+opt.lang );
            $.addClass(doc.body,'lg-'+lg);
            opt.lang = lg;
            if (!lang[lg]) {
                var scr = doc.createElement('script');
                scr.setAttribute('type', 'text/javascript');
                doc.getElementsByTagName('head')[0].appendChild(scr);
                if ($.browser.msie) {
                    scr.onreadystatechange = initUI;
                }
                else scr.onload = initUI;
                scr.setAttribute('src', $.chatFile+'static/'+opt.version+'/lang/' + lg + '.js');
                return;
            }
            i18n = lang[lg];
            initUI();
        }
    },
    showHotKey:function(){
        if(!$('hotKeyDiv')){
            $.buildMenu('hotKeyDiv',{bottom:'14px',right:'145px'},
                    [{sid:'vr_enterSend',lid:"keyEnter",text:i18n.enter,cb:hotkey.delegate(null,['Enter'])},
                     {sid:'vr_ctrlEnterSend',lid:"keyCtrlEnter",text:i18n.ctrlEnter,cb:hotkey.delegate(null,['CtrlEnter'])}],(shtcut=='Enter'?0:1));
        }
        showDiv('hotKeyDiv',true);
    },

    saveRecord : function() {
        try {
            var ws = window.open(),time = new Date(), filename = time.toLocaleDateString() + i18n.save + ".htm",
                    savestyle = '<style type="text/css"> body{font-size:12px;line-height:20px} .evtMsg,.inMsg,.outMsg{ padding-left:10px;} .eventMsg{color:#000000;}.evtMsg .nameTag{ color:red;} .inMsg{color:blue} .outMsg{color:red} .inMsg .msg,.outMsg .msg{text-indent:24px} #inviteWaiter{margin-left:20px} .createTime {font-size: 11px;	font-family: "times new roman", times, serif;	color: #996633;}</style>';
            var d = ws.document||ws.documentElement;
            d.open("text/html", "utf-8");
            d.write("<html><body><head>" + savestyle + "</head>");
            d.write($('chatDiv').innerHTML);
            d.write("</body></html>");
            d.execCommand("SaveAs", true, filename);
            ws.close();
        } catch (e) {
            alert(e);
        }
    },
    showHotQ:function(){
        var ifm = $('hotQFrame');
        if( !ifm){
            $('hotMsgDiv').innerHTML = '<iframe frameborder="0" id="hotQFrame" src="hotQuestion.jsp?c='+env.c+'"></iframe>';
        }
        showDiv('hotMsgDiv');
    },
    showFAQ:function(){
        openWindow(basePath +'faq.jsp?c='+env.c,'FAQ',800,600);
    },
    appendHotQ : function(w) {
        var m = $('message');
        m.focus();
        m.value += w;
        $.hide('hotMsgDiv');
    },
    hotkey : function(k) {
        $.removeClass('key'+shtcut,'active');
        shtcut = k;
         $.addClass('key'+shtcut,'active');
    } ,
    exit : function() {
        openOpinion({auto:true,
            onClose:function(){
                disconnect();
                window.close()},
            closable:false
        });
    },
    changeNick :(function(){
        var nickWin,tpl = '<table cellpadding="0" cellspacing="0"><tr><td></td></tr><tr><td>'
                +i18n.nick +'</td><td><input type="text" id="nickname"/><span>'
                +i18n.maxNick+'</span></td></tr></table>';

       return  function(){
          if( ! nickWin ){
                p = doc.createElement("DIV");
                p.id = 'nickDiv';
                doc.body.appendChild(p);
                p.innerHTML = tpl;
               nickWin = new $.win({title:i18n.nick,width:300,height:200,content:p,handler:function(){
                    var n = $('nickname').value;
                    if(n=='') return false;
                    if( n.length > 7){
                        alert( i18n.nick + i18n.maxNick);
                        return false;
                    }
                    if( meetingRoom.hasNick(n)){
                        alert(i18n.exist);
                        return false;
                    }
                    meetingRoom.update(env.u,'realName',n);
                    sendEvent('CHANGE_NICK',n);
                   return true;
               }});
           }
           nickWin.show();
        }})(),
    startScreenShot : function (){
        var setupSCActivex = function(){
            var lscid = $("LOOYU_SC_OBJECT");
            if(lscid!=null)
                lscid.parentNode.removeChild(lscid);

            var chead=doc.getElementsByTagName('head')[0];
            var cobj=doc.createElement('object');
            cobj.setAttribute("id","LOOYU_SC_OBJECT");
            cobj.setAttribute("classid","clsid:011A91BE-8C61-4375-9479-F5B1F56E5178");
            //cobj.setAttribute("codebase","dylooyu.CAB#version=1,0,0,1");
            chead.appendChild(cobj);
            lscid = $("LOOYU_SC_OBJECT");
        }
        setupSCActivex();
        try	{
	    	var tm  = 2;
	    	var tvcom = null;        
            var ret = LOOYU_SC_OBJECT.AddCom(basePath+"activex/looyusc.dat" , "looyusc.dll", "1.0.0.4", 1 );
            if ( ret == 0 ){
                tvcom = LOOYU_SC_OBJECT.CreateCom("looyusc.dll" ,  "1.0.0.1" );
                if ( tvcom != null ){
                    var tmpfilename = tvcom.Snaper(tm ,basePath+ "upsc.jsp", "213232323");
                    if( tmpfilename.indexOf('error:') == 0) {alert( tmpfilename);  return;}
                    eval('var resp='+tmpfilename);
                    if( resp.result == 'success'){
                        var downfile = basePath + "/down.jsp?file="+resp.value;
                        sendEvent('SCREENSHOTS',downfile);
                        appendMsg(4, 'outMsg', i18n.you, i18n.sendImg, $.dateString(), 'imgMsg', appendMsg( execTpl(6, [downfile,i18n.fullImg], 0)));
                    }else{alert( resp.value);}
                }
            }
        }catch(e){
        	window.open(basePath + "/activex/plugin.jsp?ver="+opt.version,"activex"	);
        }
    },

    radioClick:function(ra){
        (ra.value < 2?$.show:$.hide)('descRequired');           
    },
    openOpinion:(function(){
        var opWin;
        return function(p){
            p=p||{};
            if((p.auto&&(opinioned||!opt.autoOpinion)) || !env.cId || force) {
                if(p.onClose) p.onClose();
                return;
            }
            if(!opWin)
                opWin = new $.win({title:i18n.opinion,content:$('opinionWin'),width:400,height:300,closable:true,
                     handler:function(){
                        var param={c:env.c,chatId:env.cId,command:'opnion'},form = document.forms['opinionForm'],eles = form.elements;
                        for(var v=0;v<eles.length;v++){
                            var name=eles[v].name,value = $.value(eles[v]);
                            if( value ) param[name] = value;
                        }
                        if(param['opinion']<2 && $.isBlank(param['description'])){
                            alert(i18n.reason);
                            return false;
                        }
                        $.get( 'chat.do', param, function(data, rst) {
                            opinioned =true;
                        });
                        return true;
                    }});
               $.apply(opWin,p);
               opWin.show();
            };
        })()
    });
    var openWindow = function(u, name, w, h) {
        var param = "location=no,scrollbars=yes,status=yes,toolbar=no,location=no,menu=no,top=100,left=200,resizable=yes";
        param += ',width=' + w + ',height=' + h;
        window.open(u, name, param);
    }

    function MeetingRoom(){
        this.parts=[];
        this.initing =false;
    }
    MeetingRoom.prototype = {
        init:function(o){
            $('card').innerHTML='<div class="meetingTitle"><span id="vr_meetingTitle">'+i18n.meetingTitle+'</span></div><div id="participant"></div>';            
            $('card').style.background='none';
            $('participant').onclick=function(e){
                  if (e)   e.stopPropagation();
                   else    window.event.cancelBubble = true;  
            };
            env.meeting = true;
            this.list = $('participant');            
            var p = o.parts;
            !p|| (env.cId  = o.cId);  p|| (p = o);
            this.add('',i18n.all,false);
            for( var v=0;v<p.length;v++){
                !$.isVisitor(p[v].name)||(p[v].realName = $.shortId(p[v].name,p[v].realName));
                this.add( p[v].name, p[v].realName,p[v].admin);
            }
            this.parts = this.parts.concat(p||[]);
            this.setCurrent('');

            appendMsg(i18n.joinMeeting);
        },
        addPart:function(name,real,adm){
           var rl = ($.isVisitor(name)||real==null)?$.shortId(name):real;
           this.parts.push({name:name,realName:rl,admin:adm});
           this.add(name,rl,adm);
        },
        add:function(name,real,adm) {
            var v = doc.createElement("div");
            var isMe= (name==env.u),isVst=$.isVisitor(name);
            var itid= "mp_"+name,itclass="partItem" + (isMe?" selfItem":"" )+ (isVst?" vstItem":" custItem") + (adm?" adminItem":"");
            v.id= itid;v.className=itclass;
            v.innerHTML = '<span>'+ real+'</span>';
            v.onmouseover = function(){ $.addClass(itid,'partItemOver') ;};
            v.onmouseout = function(){ $.removeClass(itid,'partItemOver');};
            var me = this;
            if( !isMe ) v.onclick = function(){ me.setCurrent(name)};
            else{ v.innerHTML += '<a  onclick="changeNick();return false;">&nbsp;&nbsp;'+i18n.nick+'</a>'}
            this.list.appendChild(v);
        },
        remove:function(id){
           appendMsg(this.getName(id),i18n.leave);
           if(id == this.current){this.setCurrent('')}
           this.list.removeChild($('mp_'+id));
           Array.prototype.splice( this.getSeq(id),1);
        },
        update : function(id, col, value) {
            var v = this.getPart(id);
            eval('v.'+col +'="'+value+'"');
            if(col == 'realName') $('mp_'+v.name).getElementsByTagName('span')[0].innerHTML=value;
        },
        getPart:function(id){
           for(var v in this.parts){
               if(this.parts[v].name == id ) return this.parts[v];
           }
            return null;
        },
        getName: function(id) {
            if( id==null || id=='')
                return i18n.all;
            var index = this.getSeq(id);
            return index==-1?"":this.parts[index].realName;
        },
        getSeq:function(id){
            var p = this.parts;
            for(var v=0;v<p.length;v++){ if( p[v].name==id) return v;}
            return -1;
        },
        getCurrent: function(){ return this.current },
        setCurrent:function(id){
             if(id==null) id='';
             if(this.current!=null){ $.removeClass('mp_'+this.current,'partSelect'); }
             $.addClass('mp_'+id,'partSelect');
             this.current = id;
        },
        hasNick:function(n){
            for(var v in this.parts){
               if(this.parts[v].realName == n ) return true;
           }
            return false;
        }
    }
    var meetingRoom = new MeetingRoom();

})(conf);
