var KEY_SESSIONID = "SID";
var KEY_USER = "USR";
var KEY_BOT = "BOT";
var KEY_COMMAND = "CMD";
var KEY_FRIENDLYNAME = "FRN";
var KEY_SIGNATURE = "SIG";
var KEY_FONTSTYLE = "FTS";
var KEY_FONTNAME = "FTN";
var KEY_FONTCOLOR = "FTC";
var KEY_MESSAGE = "MSG";
var KEY_EMOTICON = "EMO";
var KEY_VALUE = "VAL";
var KEY_URI = "URI";
var KEY_RESOURCENAME = "CRN";
var KEY_APP = "APP";
var KEY_URL = "URL";
var KEY_DATA = "DAT";
var KEY_RESULT = "RET";
var KEY_STATUS_CODE = "SCO";
var KEY_STATUS_REASON = "SRE";
var KEY_SESSION_TIMEOUT = "TIMEOUT";
var KEY_LOGIN_TICKET = "TICKET";
var KEY_IP = "IP";

var COMMAND_JOIN_SESSION = "JOIN";
var COMMAND_PART_SESSION = "PART";
var COMMAND_CHAT = "CHAT";
var COMMAND_NUDGE = "NUDGE";
var COMMAND_CHANGE_DISPLAY_NAME = "CDN";
var COMMAND_CHANGE_PERSONAL_MESSAGE = "CPM";
var COMMAND_CHANGE_DISPLAY_PICTURE = "CDP";
var COMMAND_P4 = "P4";
var COMMAND_P4_RESPONSE = "P4RESP";
var COMMAND_FAULT = "FAULT";
var COMMAND_KEEPALIVE = "KEEPALIVE";

var L_IDS_SEND_MESSAGE_URL = "http://sp.incesoft.com:8100/engine/SP015544/send.js?";
var L_IDS_RECV_MESSAGE_URL = "http://sp.incesoft.com:8100/engine/SP015544/recv.js?";
var L_IDS_GET_RESOURCE_URL = "http://sp.incesoft.com:8100/engine/SP015544/getres.do";

var L_IDS_FORMAT_IM = "{0}\r\n{1}";
var L_IDS_FORMAT_ACTION = "<hr class='controlLine' align='left'>{0}<hr class='controlLine' align='left'>";

var L_IDS_TEXT_IM = "{0} says:";
var L_IDS_TEXT_NUDGE_SEND = "You have just sent a Nudge!";
var L_IDS_TEXT_NUDGE_RECV = "{0} just sent you a Nudge!";
var L_IDS_TEXT_ACTIVITY_INVITE = "";
var L_IDS_TEXT_ACTIVITY_INVITED = "";
var L_IDS_TEXT_ACTIVITY_CANCEL = "";
var L_IDS_TEXT_ACTIVITY_ACCEPT = "";
var L_IDS_TEXT_ACTIVITY_ACCEPTED = "";
var L_IDS_TEXT_ACTIVITY_REJECT = "";
var L_IDS_TEXT_ACTIVITY_REJECTED = "";

var L_IDS_DEFAULT_DISPLAY_NAME = "you";
var L_IDS_DEFAULT_FONT = "Arial";
var L_IDS_DEFAULT_SIZE = 9;
var L_IDS_DEFAULT_COLOR = "#000000";
var L_IDS_DEFAULT_STYLE = "";

var ACTIVITY_DOMAIN = "xiaoi.com";
var MAX_HISTORY_SIZE = 16000;

var ALWAYS_ACCEPT_APPIDS = {70:7,99995225:99995225};

function $(id) {
	return document.getElementById(id);
}


function IsIE(version) {
    var rc = false;
    if (navigator.userAgent.indexOf("MSIE") > -1) {
        if (navigator.userAgent.indexOf("Opera") == (-1)) {
            if (null != version) {
                if (navigator.userAgent.indexOf(version) > -1) {
                    rc = true;
                }
            } else {
                rc = true;
            }
        }
    }
    return rc;
}
function pause(millisecondi) {
    var now = new Date();
    var exitTime = now.getTime() + millisecondi;
    while (true) {
        now = new Date();
        if (now.getTime() > exitTime) {
            return;
        }
    }
}
function FormatString(f, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) {
    var args = new Array(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9);
    for (var i = 0; i < args.length; i++) {
        if (args[i] != null) {
            var replacementText = "{" + i + "}";
            while (-1 != f.indexOf(replacementText)) {
                f = f.replace(replacementText, args[i]);
            }
        }
    }
    return f;
}
function givehex(dec) {
    if (dec == 10) {
        val = "A";
    } else {
        if (dec == 11) {
            val = "B";
        } else {
            if (dec == 12) {
                val = "C";
            } else {
                if (dec == 13) {
                    val = "D";
                } else {
                    if (dec == 14) {
                        val = "E";
                    } else {
                        if (dec == 15) {
                            val = "F";
                        } else {
                            val = "" + dec;
                        }
                    }
                }
            }
        }
    }
    return val;
}
function rgb2hex(r, g, b) {
    h1 = givehex(Math.floor(r / 16));
    h2 = givehex(r % 16);
    h3 = givehex(Math.floor(g / 16));
    h4 = givehex(g % 16);
    h5 = givehex(Math.floor(b / 16));
    h6 = givehex(b % 16);
    hex = h1 + h2 + h3 + h4 + h5 + h6;
    return hex;
}

var randomColors = ["808080","1d1b11","17365d","365f91","943634","76923c","5f497a","31849b","e36c0a","c00000","ff0000","00b050","0070c0","002060","7030a0","c0504d","4f81bd","8064a2","404040"];
function GetRandomColor() {
/*
    var r = Math.floor(Math.random() * 256);
    var g = Math.floor(Math.random() * 256);
    var b = Math.floor(Math.random() * 256);
    if (r > 144 && g > 144 && b > 144) {
        r = 144;
        g = 144;
        b = 144;
    }
    return rgb2hex(r, g, b);
*/
	return randomColors[Math.floor(Math.random() * randomColors.length)];
}
function UBBReplace(str) {
    var re = /\[i\](.[^\[]*)\[\/i\]/gi;
    str = str.replace(re, "<i>$1</i>");
    re = /\[b\](.[^\[]*)\[\/b\]/gi;
    str = str.replace(re, "<b>$1</b>");
    re = /\[u\](.[^\[]*)\[\/u\]/gi;
    str = str.replace(re, "<u>$1</u>");
    re = /\[color=(.[^\[]*)\](.[^\[]*)\[\/color\]/gi;
    str = str.replace(re, "<font color=$1>$2</font>");
    re = /\[size=([1-7])\](.[^\[]*)\[\/size\]/gi;
    str = str.replace(re, "<font size=$1>$2</font>");
    re = /\[face=(.[^\[]*)\](.[^\[]*)\[\/face\]/gi;
    str = str.replace(re, "<font face=$1>$2</font>");
    re = /\[center\](.[^\[]*)\[\/center\]/gi;
    str = str.replace(re, "<div align='center'>$1</div>");
    re = /\[right\](.[^\[]*)\[\/right\]/gi;
    str = str.replace(re, "<div align='right'>$1</div>");
    re = /\[quote\](.[^\[]*)\[\/quote\]/gi;
    str = str.replace(re, "<table bgcolor='#E6FFE6' width='90%' style='border:1px #009900 dotted' align='center'><tr><td class='td1'>$1</td></tr></table>");
    re = /\[fly\](.*)\[\/fly\]/gi;
    str = str.replace(re, "<marquee width=90% behavior=alternate scrollamount=3>$1</marquee>");
    re = /\[move\](.*)\[\/move\]/gi;
    str = str.replace(re, "<marquee scrollamount=3>$1</marquee>");
    re = /\[SHADOW=*([0-9]*),*(#*[a-z0-9]*),*([0-9]*)\](.[^\[]*)\[\/SHADOW\]/gi;
    str = str.replace(re, "<table width=$1><tr><td style='filter:shadow(color=$2, strength=$3)'>$4</td></tr></table>");
    re = /\[GLOW=*([0-9]*),*(#*[a-z0-9]*),*([0-9]*)\](.[^\[]*)\[\/GLOW\]/gi;
    str = str.replace(re, "<table width=$1 ><tr><td style='filter:glow(color=$2, strength=$3)'>$4</td></tr></table>");
    re = /\[URL\](.[^\[]*)\[\/URL\]/gi;
    str = str.replace(re, "<a href='$1' target=_blank>$1</a>");
    re = /\[URL=(.[^\[]*)\](.[^\[]*)\[\/URL\]/gi;
    str = str.replace(re, "<a href='$1' target=_blank>$2</a>");
    re = /\[EMAIL\]([\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+)\[\/EMAIL\]/gi;
    str = str.replace(re, "<a href='mailto:$1'>$1</a>");
    re = /\[EMAIL=([\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+)\](.[^\[]*)\[\/EMAIL\]/gi;
    str = str.replace(re, "<a href='mailto:$1'>$4</a>");
    re = /\[img\](.[^\[]*)\[\/img\]/gi;
    str = str.replace(re, "<a href='$1' target=_blank><img src='$1' border='0' alt=''></a>");
    return str;
}
function LinkReplace(input) {
	var output = input.replace(/&nbsp;/g,"#nbsp;");
    output = output.replace(/((http|https|ftp):\/\/([\w-]+\.)+[\w-]+([\w-.\/?=;!*%$]*)?([\w-&=;!*%$]*)?)/gi, "<a href='$1' target='_new'>$1</a>");
    output = output.replace(/#nbsp;/g,"&nbsp;");
    return output;
}
var newlineRegExp = new RegExp("(\r\n|\n|\r)", "g");
function NewlineReplace(str) {
    result = "";
    if (str != null) {
        result = str.replace(newlineRegExp, "<br>");
    }
    return result;
}
var entityList = new Array();
entityList["<"] = "&lt;";
entityList["\uff1c"] = "&lt;";
entityList[">"] = "&gt;";
entityList["\uff1e"] = "&gt;";
entityList["&"] = "&amp;";
entityList["\uff06"] = "&amp;";
entityList["\""] = "&quot;";
entityList["\uff02"] = "&quot;";
entityList[";"] = "&#59;";
entityList[" "] = "&nbsp;";

function EntityReplace(str) {
    var result = "";
    if (str != null) {
        var len = str.length;
        var i = 0;
        while (i < len) {
            var j = i;
            var e = entityList[str.charAt(j)];
            while (j < len && null == e) {
                j++;
                e = entityList[str.charAt(j)];
            }
            result += str.substr(i, j - i);
            if (e != null) {
                result += e;
                j++;
            }
            i = j;
        }
    }
    return result;
}
function EmoticonInfo(image, keys, length, description) {
    this.IsLeaf = true;
    this.EmoticonToHtml = function () {
        return "<img src=\"" + L_IDS_GET_RESOURCE_URL + "?type=2&name=" + encodeURIComponent(image) + "\" title=\"" + (description == null ? keys : description) + "\">";
    };
    this.Length = function () {
        return length;
    };
}
function Emoticons() {
    var keysArray = new Array();
    var emoticonsArray = new Array();
    var mapLength = 0;
    this.Insert = function (image, keys) {
        var htmlKeys = EntityReplace(keys);
        var e = new EmoticonInfo(image, keys, htmlKeys.length, null);
        keysArray[mapLength] = htmlKeys;
        emoticonsArray[mapLength] = e;
        mapLength++;
    };
    this.Replace = function (str) {
        var result = str;
        for (var i = 0; i < mapLength; i++) {
            var oldr = "";
            while (oldr != result) {
                oldr = result;
                result = result.replace(keysArray[i], "$emoticon" + i + "$");
            }
        }
        for (var i = 0; i < mapLength; i++) {
            var oldr = "";
            while (oldr != result) {
                oldr = result;
                result = result.replace("$emoticon" + i + "$", emoticonsArray[i].EmoticonToHtml());
            }
        }
        return result;
    };
    this.Contains = function (key) {
        for (var i = 0; i < keysArray.length; i++) {
            if (keysArray[i] == key) {
                return true;
            }
        }
        return false;
    };
    this.Size = function () {
        return mapLength;
    };
}
var globalEmoticons;
function EmoticonReplace(s) {
    if (globalEmoticons == null) {
        globalEmoticons = new Emoticons();
        globalEmoticons.Insert("__default_airplane.gif", "(ap)");
        globalEmoticons.Insert("__default_help.gif", "(?)");
        globalEmoticons.Insert("__default_bat.gif", ":[");
        globalEmoticons.Insert("__default_bat.gif", ":-[");
        globalEmoticons.Insert("__default_beer.gif", "(b)");
        globalEmoticons.Insert("__default_beer.gif", "(B)");
        globalEmoticons.Insert("__default_blacksheep.gif", "(bah)");
        globalEmoticons.Insert("__default_bowl.gif", "(||)");
        globalEmoticons.Insert("__default_cake.gif", "(^)");
        globalEmoticons.Insert("__default_camera.gif", "(p)");
        globalEmoticons.Insert("__default_camera.gif", "(P)");
        globalEmoticons.Insert("__default_car.gif", "(au)");
        globalEmoticons.Insert("__default_cat.gif", "(@)");
        globalEmoticons.Insert("__default_clap.gif", "(h5)");
        globalEmoticons.Insert("__default_clock.gif", "(o)");
        globalEmoticons.Insert("__default_clock.gif", "(O)");
        globalEmoticons.Insert("__default_clock.gif", "(0)");
        globalEmoticons.Insert("__default_cloud_lightning.gif", "(li)");
        globalEmoticons.Insert("__default_cloud_rain.gif", "(st)");
        globalEmoticons.Insert("__default_coffee.gif", "(c)");
        globalEmoticons.Insert("__default_coffee.gif", "(C)");
        globalEmoticons.Insert("__default_computer.gif", "(co)");
        globalEmoticons.Insert("__default_dog.gif", "(&)");
        globalEmoticons.Insert("__default_envelope.gif", "(e)");
        globalEmoticons.Insert("__default_envelope.gif", "(E)");
        globalEmoticons.Insert("__default_film.gif", "(~)");
        globalEmoticons.Insert("__default_fingerscrossed.gif", "(yn)");
        globalEmoticons.Insert("__default_girl_handsacrossamerica.gif", "(x)");
        globalEmoticons.Insert("__default_girl_handsacrossamerica.gif", "(X)");
        globalEmoticons.Insert("__default_guy_handsacrossamerica.gif", "(z)");
        globalEmoticons.Insert("__default_guy_handsacrossamerica.gif", "(Z)");
        globalEmoticons.Insert("__default_handcuffs.gif", "(%)");
        globalEmoticons.Insert("__default_heart.gif", "(L)");
        globalEmoticons.Insert("__default_heart.gif", "(l)");
        globalEmoticons.Insert("__default_heart_broken.gif", "(U)");
        globalEmoticons.Insert("__default_heart_broken.gif", "(u)");
        globalEmoticons.Insert("__default_hug_dude.gif", "({)");
        globalEmoticons.Insert("__default_hug_girl.gif", "(})");
        globalEmoticons.Insert("__default_island.gif", "(ip)");
        globalEmoticons.Insert("__default_kiss.gif", "(k)");
        globalEmoticons.Insert("__default_kiss.gif", "(K)");
        globalEmoticons.Insert("__default_lightbulb.gif", "(i)");
        globalEmoticons.Insert("__default_lightbulb.gif", "(I)");
        globalEmoticons.Insert("__default_martini.gif", "(d)");
        globalEmoticons.Insert("__default_martini.gif", "(D)");
        globalEmoticons.Insert("__default_messenger.gif", "(M)");
        globalEmoticons.Insert("__default_messenger.gif", "(m)");
        globalEmoticons.Insert("__default_mobile.gif", "(mp)");
        globalEmoticons.Insert("__default_money.gif", "(mo)");
        globalEmoticons.Insert("__default_moon.gif", "(S)");
        globalEmoticons.Insert("__default_music_note.gif", "(8)");
        globalEmoticons.Insert("__default_phone.gif", "(t)");
        globalEmoticons.Insert("__default_phone.gif", "(T)");
        globalEmoticons.Insert("__default_pizza.gif", "(pi)");
        globalEmoticons.Insert("__default_plate.gif", "(pl)");
        globalEmoticons.Insert("__default_present.gif", "(g)");
        globalEmoticons.Insert("__default_present.gif", "(G)");
        globalEmoticons.Insert("__default_rainbow.gif", "(r)");
        globalEmoticons.Insert("__default_rainbow.gif", "(R)");
        globalEmoticons.Insert("__default_rose.gif", "(f)");
        globalEmoticons.Insert("__default_rose.gif", "(F)");
        globalEmoticons.Insert("__default_rose_wilted.gif", "(w)");
        globalEmoticons.Insert("__default_rose_wilted.gif", "(W)");
        globalEmoticons.Insert("__default_smile_angel.gif", "(a)");
        globalEmoticons.Insert("__default_smile_angel.gif", "(A)");
        globalEmoticons.Insert("__default_smile_angry.gif", ":@");
        globalEmoticons.Insert("__default_smile_angry.gif", ":-@");
        globalEmoticons.Insert("__default_smile_baringteeth.gif", "8o|");
        globalEmoticons.Insert("__default_smile_confused.gif", ":s");
        globalEmoticons.Insert("__default_smile_confused.gif", ":S");
        globalEmoticons.Insert("__default_smile_confused.gif", ":-s");
        globalEmoticons.Insert("__default_smile_confused.gif", ":-S");
        globalEmoticons.Insert("__default_smile_cry.gif", ":'(");
        globalEmoticons.Insert("__default_smile_devil.gif", "(6)");
        globalEmoticons.Insert("__default_smile_embaressed.gif", ":$");
        globalEmoticons.Insert("__default_smile_embaressed.gif", ":-$");
        globalEmoticons.Insert("__default_smile_eyeroll.gif", "8-)");
        globalEmoticons.Insert("__default_smile_nerd.gif", "8-|");
        globalEmoticons.Insert("__default_smile_omg.gif", ":-O");
        globalEmoticons.Insert("__default_smile_omg.gif", ":-o");
        globalEmoticons.Insert("__default_smile_omg.gif", ":O");
        globalEmoticons.Insert("__default_smile_omg.gif", ":o");
        globalEmoticons.Insert("__default_smile_party.gif", "<:o)");
        globalEmoticons.Insert("__default_smile_regular.gif", ":)");
        globalEmoticons.Insert("__default_smile_regular.gif", ":-)");
        globalEmoticons.Insert("__default_smile_sad.gif", ":(");
        globalEmoticons.Insert("__default_smile_sad.gif", ":-(");
        globalEmoticons.Insert("__default_smile_sad.gif", ":<");
        globalEmoticons.Insert("__default_smile_sad.gif", ":-<");
        globalEmoticons.Insert("__default_smile_sarcastic.gif", "^o)");
        globalEmoticons.Insert("__default_smile_secret.gif", ":-*");
        globalEmoticons.Insert("__default_smile_shades.gif", "(h)");
        globalEmoticons.Insert("__default_smile_shades.gif", "(H)");
        globalEmoticons.Insert("__default_smile_sick.gif", "+o(");
        globalEmoticons.Insert("__default_smile_sniff.gif", ":^)");
        globalEmoticons.Insert("__default_smile_speedy.gif", "(brb)");
        globalEmoticons.Insert("__default_smile_teeth.gif", ":D");
        globalEmoticons.Insert("__default_smile_teeth.gif", ":-D");
        globalEmoticons.Insert("__default_smile_teeth.gif", ":d");
        globalEmoticons.Insert("__default_smile_teeth.gif", ":-d");
        globalEmoticons.Insert("__default_smile_thinking.gif", "*-)");
        globalEmoticons.Insert("__default_smile_tongue.gif", ":p");
        globalEmoticons.Insert("__default_smile_tongue.gif", ":-p");
        globalEmoticons.Insert("__default_smile_tongue.gif", ":P");
        globalEmoticons.Insert("__default_smile_tongue.gif", ":-P");
        globalEmoticons.Insert("__default_smile_whatchutalkingabout.gif", ":|");
        globalEmoticons.Insert("__default_smile_whatchutalkingabout.gif", ":-|");
        globalEmoticons.Insert("__default_smile_wink.gif", ";-)");
        globalEmoticons.Insert("__default_smile_wink.gif", ";)");
        globalEmoticons.Insert("__default_smile_yawn.gif", "|-)");
        globalEmoticons.Insert("__default_smile_zipit.gif", ":-#");
        globalEmoticons.Insert("__default_smoking.gif", "(ci)");
        globalEmoticons.Insert("__default_snail.gif", "(sn)");
        globalEmoticons.Insert("__default_soccerball.gif", "(so)");
        globalEmoticons.Insert("__default_star.gif", "(*)");
        globalEmoticons.Insert("__default_sun.gif", "(#)");
        globalEmoticons.Insert("__default_thumbs_down.gif", "(n)");
        globalEmoticons.Insert("__default_thumbs_down.gif", "(N)");
        globalEmoticons.Insert("__default_thumbs_up.gif", "(y)");
        globalEmoticons.Insert("__default_thumbs_up.gif", "(Y)");
        globalEmoticons.Insert("__default_turtle.gif", "(tu)");
        globalEmoticons.Insert("__default_umbrella.gif", "(um)");
        globalEmoticons.Insert("__default_xbox.gif", "(xx)");
    }
    return globalEmoticons.Replace(s);
}
function getCookie(name) {
    var start = document.cookie.indexOf(name + "=");
    var len = start + name.length + 1;
    if ((!start) && (name != document.cookie.substring(0, name.length))) {
        return null;
    }
    if (start == -1) {
        return null;
    }
    var end = document.cookie.indexOf(";", len);
    if (end == -1) {
        end = document.cookie.length;
    }
    return unescape(document.cookie.substring(len, end));
}
function setCookie(name, value, expires, path, domain, secure) {
    var today = new Date();
    today.setTime(today.getTime());
    if (expires) {
        expires = expires * 1000;// * 60 * 60 * 24;
    }
    var expires_date = new Date(today.getTime() + (expires));
    document.cookie = name + "=" + escape(value) + ((expires) ? ";expires=" + expires_date.toGMTString() : "") + //expires.toGMTString()
    ((path) ? ";path=" + path : "") + ((domain) ? ";domain=" + domain : "") + ((secure) ? ";secure" : "");
}
function deleteCookie(name, path, domain) {
    if (getCookie(name)) {
        document.cookie = name + "=" + ((path) ? ";path=" + path : "") + ((domain) ? ";domain=" + domain : "") + ";expires=Thu, 01-Jan-1970 00:00:01 GMT";
    }
}



try {
	document.domain = ACTIVITY_DOMAIN;
}catch(e){}


function MessageFormat(font, size, styleCode, color){

        this.font = font;
        this.size = size;
        this.styleCode = (styleCode == null ? "" : styleCode);
        this.color = color;

        this.ToggleStyle = function(styleCodeToggle){
                ;
                ;
                var result = false;
                if (styleCodeToggle.length == 1){
                        if (this.styleCode != null){
                                var index = this.styleCode.indexOf(styleCodeToggle);
                                if ( - 1 == index){
                                        result = true;
                                        this.styleCode += styleCodeToggle;
                                }
                                else{
                                        this.styleCode = this.styleCode.substring(0, index) + this.styleCode.substring(index + 1, this.styleCode.length);
                                }
                        }
                        else{
                                result = true;
                                this.styleCode = styleCodeToggle;
                        }
                }
                return result;
        };
        this.IsBold = function(){
                return ( - 1 != this.styleCode.indexOf("B"));
        };
        this.IsItalic = function(){
                return ( - 1 != this.styleCode.indexOf("I"));
        };
        this.IsStrikethrough = function(){
                return ( - 1 != this.styleCode.indexOf("S"));
        };
        this.IsUnderline = function(){
                return ( - 1 != this.styleCode.indexOf("U"));
        };
        
        this.ApplyStyle = function(obj){
                ;
                ;
                if (obj != null && typeof(obj.style) != "undefined"){
                        obj.style.fontFamily = this.font;
                        obj.style.fontSize = (this.size + "pt");
                        obj.style.color = this.color;
                        obj.style.fontStyle = this.IsItalic() ? "italic" : "";
                        obj.style.fontWeight = this.IsBold() ? "bold" : "";
                        var textDecoration = "";
                        if (this.IsUnderline()){
                                textDecoration += "underline ";
                        }
                        if (this.IsStrikethrough()){
                                textDecoration += "line-through";
                        }
                        obj.style.textDecoration = textDecoration;
                }
        };
        this.ApplyFormat = function(str){
                var f = "<span style=\"";
                if (this.font != null){
                        f += "font-family:" + EntityReplace(this.font) + "; ";
                }
                if (this.color != null){
                        f += "color:" + EntityReplace(this.color) + "; ";
                }
                if (this.IsBold()){
                        f += "font-weight:bold; ";
                }
                if (this.IsItalic()){
                        f += "font-style:italic; ";
                }
                if (this.IsUnderline() || this.IsStrikethrough()){
                        f += "text-decoration:";
                        if (this.IsUnderline()){
                                f += "underline ";
                        }
                        if (this.IsStrikethrough()){
                                f += "line-through";
                        }
                        f += "; ";
                }
                str = f + "\">" + str + "</span>";
                return str;
        };
}

function FakeExternal(appid,appname,appurl) {

	
	var external = this;

	this.AppID = appid;
	this.AppName = appname;
	this.AppURL = appurl;

	this.Channel = {
		"Data":"",
		"Type":2,
		"Error":"",
		"IM":"",
		"Initialize":function() {
			sendActivityEvent(external.AppID,EVENT_ACTIVITY_LOADED);
		},
		"initialize":function() {
			this.Initialize();
		},
		"SendData":function(data) {
			sendActivityImpl(external.AppID,external.AppName,data);
		},
		"sendData":function(data) {
			this.SendData(data);
		},
		"EnterIM":function(im) {
		
		},
		"enterIM":function(im) {
			this.EnterIM(im);
		},
		"SendIM":function(im) {
			//globalConversation.SendMessage(im);
			globalConversation.ShowMessage(external.AppName,im,globalConversation.GetFormat());	
			sendMessageImpl(external.AppName,im,globalConversation.GetFormat());
		},
		"sendIM":function(im) {
			this.SendIM(im);
		},
		"SendIMAsUser":function(im) {
			globalConversation.SendMessage(im);
		},
		"sendIMAsUser":function(im) {
			this.SendIMAsUser(im);
		}
	}
	
	this.channel = this.Channel;
	
	this.Users = new Array();
	this.Users.Count = 0;
	this.Users.count = 0;
	this.Users.Me = null;
	this.Users.me = null;
	this.Users.Inviter = null;
	this.Users.inviter = null;
	this.users = this.Users;

	this.Users.Item = function(index) {
		return external.Users[index];
	};
	this.Users.item = function(index) {
		return external.Users.Item(index);
	}
	this.Users.AddUser = function(email,puid,name,globalip,localip) {
		var idx = external.Users.length;
		external.Users[idx] = {
			"EMail":email,
			"PUID":puid,
			"Name":name,
			"GlobalIP":globalip,
			"LocalIP":localip,
			"email":email,
			"name":name,
			"globalIP":globalip,
			"localIP":localip
		}
		external.Users.IncreaseCount();
		return external.Users[idx];
	};
	
	this.Users.SetMe = function(me) {
		external.Users.me = me;
		external.Users.Me = me;
	} 
	this.Users.SetInviter = function(inviter) {
		external.Users.inviter = inviter;
		external.Users.Inviter = inviter;
	} 
	
	this.Users.IncreaseCount = function() {
		external.Users.Count = external.Users.Count + 1;
		external.Users.count = external.Users.count + 1;
	}

	
}

/***************** protocol interface ****************/

var __sessionId = -769178341;
var __robotId = null;
var __robotName = null;
var __sessionTimeout = null;
var __IP = null;

function Packet(command) {

	var data = {};

	this.put = function(key,value){
		if (key != null && key != "") data[key] = encodeURIComponent(value);
	}
	this.toString = function() {
		var qs = "";
		for (var key in data) {
			qs = qs + key + "=" + data[key] + "&";
		}
		qs = qs + "r=" + Math.random();
		return qs;
	}
	
	if (__sessionId != null && __sessionId != "") {
		this.put(KEY_SESSIONID,__sessionId);
		this.put(KEY_USER,__sessionId);
	}
	if (command != null && command != "")this.put(KEY_COMMAND,command);
}


function sendPacket(packet) {
	var element = document.createElement('script');
    element.type = 'text/javascript';
    element.src = L_IDS_SEND_MESSAGE_URL + packet.toString();;
    document.getElementsByTagName('head')[0].appendChild(element);
}

var __recvFailedTimes = 0;
function recvPacket() {

	if (globalConversation.IsDisabled()) return;

	var element = document.createElement('script');
	//element.setAttribute("name","recvScript");
    element.type = 'text/javascript';
    element.src = L_IDS_RECV_MESSAGE_URL + new Packet().toString();
    if (IsIE()) {
    	element.onreadystatechange = function() {
			if (element.readyState == "loaded")
			{
				__recvFailedTimes = __recvFailedTimes + 1;
				if (__recvFailedTimes < 10)
					recvPacket();
				else {
					
					var error = {};
					error[KEY_STATUS_CODE] = EVENT_ERROR_CONNECTION_ERROR;
					error[KEY_STATUS_REASON] = "connection error!";
					processError(error);

					/*
					var scripts = document.getElementsByTagName("script");
					for (i=0;i<scripts.length ;i++ )
					{
						if (scripts[i].getAttribute("name") == "recvScript")
							scripts[i].parentNode.removeChild(scripts[i]);
					}
					*/
				}
			}
		}
    }
    document.getElementsByTagName('head')[0].appendChild(element);
	
	if (__timeoutID)window.clearTimeout(__timeoutID);
	__timeoutID = window.setTimeout("__keepAlive()",__sessionTimeout-30000);

}

var __timeoutID = null;
function __keepAlive() {
	
	if (globalConversation.IsDisabled()) return;
	
	__timeoutID = window.setTimeout("__keepAlive()",10000);
	sendPacket(new Packet(COMMAND_KEEPALIVE));
}

function processError(error) {
	
	try {
		if (!globalConversation.fireEvent(error[KEY_STATUS_CODE],error[KEY_STATUS_REASON])) {
			alert(error[KEY_STATUS_REASON]);
		}
	} catch (e) {alert(e.description);}	
	globalConversation.Disable();
}

function processMessageSent(message) {
	var command = message[KEY_COMMAND];
	if (command == COMMAND_JOIN_SESSION) {
		__sessionId = message[KEY_SESSIONID];
		__robotId = message[KEY_BOT];
		__IP = message[KEY_IP];
		globalConversation.ShowDisplayName(message[COMMAND_CHANGE_DISPLAY_NAME]);
		globalConversation.ShowPersonalMessage(message[COMMAND_CHANGE_PERSONAL_MESSAGE]);
		globalConversation.ShowDisplayPicture(message[COMMAND_CHANGE_DISPLAY_PICTURE]);
		
		__sessionTimeout = parseInt(message[KEY_SESSION_TIMEOUT]);
		recvPacket();
		
		try {
			globalConversation.fireEvent(EVENT_CONVERSATION_OPENED,globalConversation);
		} catch(e){}
		
	}
	else if (message[KEY_SESSION_TIMEOUT] != null) {
		__sessionTimeout = parseInt(message[KEY_SESSION_TIMEOUT]);
		if (!IsIE())recvPacket();
	}
}

function processMessageReceived(obj) {
	__recvFailedTimes = 0;
	try {
		if (obj instanceof Array) {
			for (var i=0;i<obj.length;i++) {
				processMessageReceived0(obj[i]);
			}
		}
		else {
			processMessageReceived0(obj);
		}
		if (!IsIE()) recvPacket();
	} catch (e) {
		if (!e.isServerError) {
			if (!IsIE()) recvPacket();
		}
	}

};

function processMessageReceived0(message) {

	if (message[KEY_COMMAND] == COMMAND_CHAT) {
		var displayname = message[KEY_SIGNATURE] == null ? __robotName : message[KEY_SIGNATURE]; 
		var msgText = message[KEY_MESSAGE];
		var c = message[KEY_FONTCOLOR];
		if (c == null || c == "") c = GetRandomColor();
		var format = new MessageFormat(message[KEY_FONTNAME],L_IDS_DEFAULT_SIZE ,message[KEY_FONTSTYLE],c);
		
		var emoticonsString = message[KEY_EMOTICON];
		var emoticons = null;
        if (emoticonsString != null) {
        	emoticons = new Emoticons();
            var entrys = emoticonsString.split("|");
            for (var i=0;i<entrys.length;i++) {
                var entry = entrys[i].split("=");
                if (entry.length != 2) continue;
                if (!globalEmoticons.Contains(entry[0]))
 	               emoticons.Insert(entry[1],entry[0]);
            }
        }
		
		globalConversation.ShowMessage(displayname,msgText,format,emoticons);	
	}

	else if (message[KEY_COMMAND] == COMMAND_NUDGE) {
		var displayname = message[KEY_SIGNATURE] == null ? __robotName : message[KEY_SIGNATURE]; 
		globalConversation.ShowNudge(EmoticonReplace(EntityReplace(FormatString(L_IDS_TEXT_NUDGE_RECV, displayname))));
	}
	else if (message[KEY_COMMAND] == COMMAND_CHANGE_DISPLAY_NAME) {
		var displayname = message[KEY_VALUE]; 
		globalConversation.ShowDisplayName(displayname);
	}
	else if (message[KEY_COMMAND] == COMMAND_CHANGE_DISPLAY_PICTURE) {
		var name = message[KEY_URI]; 
		globalConversation.ShowDisplayPicture(name);
	}
	else if (message[KEY_COMMAND] == COMMAND_CHANGE_PERSONAL_MESSAGE) {
		var personalmessage = message[KEY_VALUE]; 
		globalConversation.ShowPersonalMessage(personalmessage);
	}
	else if (message[KEY_COMMAND] == COMMAND_P4) {
		
		if (globalConversation.GetActivityDiv() == null) return;
		
		var activityFrame = $("activityFrame");
		var activityWindow = null;
		if (activityFrame != null)
			activityWindow = activityFrame.contentWindow;
	
		var displayname = message[KEY_SIGNATURE] == null ? __robotName : message[KEY_SIGNATURE]; 
		var appid = message[KEY_APP]; 
		var appname = message[KEY_RESOURCENAME]; 
		var appurl = message[KEY_URL]; 
		var data = message[KEY_DATA];
		if ( activityWindow == null || 
			window.fakeExternal == null || 
			window.fakeExternal.AppID != appid) {
			var fakeExternal = new FakeExternal(appid,appname,appurl);
			fakeExternal.Channel.Data = data;
			var channelID = new Date().getTime();
			globalConversation.activityMap[channelID] = fakeExternal;
			
			if (ALWAYS_ACCEPT_APPIDS[appid] != null) {
				//globalConversation.AcceptActivity(channelID);
				globalConversation.ShowActivity(FormatString(L_IDS_TEXT_ACTIVITY_INVITED, displayname,appname,channelID,channelID));			
				globalConversation.AcceptActivity();
			}
			else {
				globalConversation.ShowActivity(FormatString(L_IDS_TEXT_ACTIVITY_INVITED, displayname,appname,channelID,channelID));			
			}
		}
		else {
			globalConversation.ActivityReceived(data);
		}
	}
	else if (message[KEY_COMMAND] == COMMAND_FAULT) {
		processError(message);
		throw {"isServerError":true};
	}

}

function sendMessageImpl(displayname,msgText,format) {


	var packet = new Packet(COMMAND_CHAT);
	packet.put(KEY_SIGNATURE,displayname);
	packet.put(KEY_MESSAGE,msgText);
	
	if (format) {
		var color = format.color;
		if  (color.indexOf("#") == 0) color = color.substring(1); 

		packet.put(KEY_FONTNAME,format.font);
		packet.put(KEY_FONTSTYLE,format.styleCode);
		packet.put(KEY_FONTCOLOR,color);
	}
	sendPacket(packet);
};


function sendNudgeImpl() {
	
	var packet = new Packet(COMMAND_NUDGE);
	
	sendPacket(packet);
};

function sendActivityImpl(appid,resname,data) {

	var packet = new Packet(COMMAND_P4);
	packet.put(KEY_APP,appid);
	packet.put(KEY_RESOURCENAME,resname);
	packet.put(KEY_DATA,data);
	sendPacket(packet);

}

function sendActivityEvent(appid,result) {

	var packet = new Packet(COMMAND_P4_RESPONSE);
	packet.put(KEY_APP,appid);
	packet.put(KEY_RESULT,result);
	sendPacket(packet);

}

function sendCoversationOpenedEvent() {

	var packet = new Packet(COMMAND_JOIN_SESSION);
		sendPacket(packet);
	

}

function sendConversationClosedEvent() {

	globalConversation.CloseActivityWindow();

	globalConversation.Disable();
	
	var packet = new Packet(COMMAND_PART_SESSION);
	
	sendPacket(packet);
	
	try {
		globalConversation.fireEvent(EVENT_CONVERSATION_CLOSED,globalConversation);
	} catch(e){}
	
	pause(200);

};
/***************** protocol interface ****************/

var incomingScript = null;
var outgoingScript = null;

var globalConversation = null;

var EVENT_ACTIVITY_ACCEPTED = 0;
var EVENT_ACTIVITY_REJECTED = 1;
var EVENT_ACTIVITY_LOADED = 3;
var EVENT_ACTIVITY_CLOSED = 4;

var EVENT_CONVERSATION_OPENED = 10;
var EVENT_CONVERSATION_CLOSED = 11;

var EVENT_ERROR_INTERNAL = 10001;
var EVENT_ERROR_SP_UNAVAILABLE = 10002;
var EVENT_ERROR_INVALID_SPID = 10003;
var EVENT_ERROR_RESOURCE_NOT_FOUND = 10004;
var EVENT_ERROR_SESSION_TIMEOUT = 10005;
var EVENT_ERROR_SESSION_POLYGAMY = 10006;
var EVENT_ERROR_CONNECTION_ERROR = 10007;


function Conversation() {

	var transcriptDiv = null;
	var displayNameDiv = null;
	var displayPictureDiv = null;
	var personalMessageDiv = null;
	var activityDiv = null;
	
	var format = new MessageFormat();
	format.font = getCookie("webbot_font_name") == null ?  L_IDS_DEFAULT_FONT : getCookie("webbot_font_name");
	format.color = getCookie("webbot_font_color") == null ?  L_IDS_DEFAULT_COLOR : getCookie("webbot_font_color");
	format.size = getCookie("webbot_font_size") == null ?  L_IDS_DEFAULT_SIZE : getCookie("webbot_font_size");
	format.styleCode = getCookie("webbot_font_style") == null ?  L_IDS_DEFAULT_STYLE : getCookie("webbot_font_style");
	var displayName = getCookie("webbot_display_name") == null ?  L_IDS_DEFAULT_DISPLAY_NAME : getCookie("webbot_display_name");
	var conversationWindow = window;
	
	var disabled = false;
	
	this.activityMap = {};
	
	var eventListeners = [];
	
	this.IsDisabled = function() {
		return disabled;
	}
	
	this.Disable = function() {
	
		if (window.removeEventListener) {
			window.removeEventListener("unload", sendConversationClosedEvent,false);
		}
		else {
			window.detachEvent("onunload", sendConversationClosedEvent);
		}

		disabled = true;
	}
	
	this.Enable = function() {
		if (disabled) {
			if (window.addEventListener) {
				window.addEventListener("unload", sendConversationClosedEvent,false);
			}
			else {
				window.attachEvent("onunload", sendConversationClosedEvent);
			}
			disabled = false;
			transcriptDiv.innerHTML = "";
			sendCoversationOpenedEvent();
		}
	}
	
	this.GetTranscriptDiv = function() {
		return transcriptDiv;
	}
	
	this.GetDisplayNameDiv = function() {
		return displayNameDiv;
	}	
	
	this.GetDisplayPictureDiv = function() {
		return displayPictureDiv;
	}
	
	this.GetPersonalMessageDiv = function() {
		return personalMessageDiv;
	}
	
	this.GetActivityDiv = function() {
		return activityDiv;
	}
	
	this.ScrollToBottom0 = function(){
		if (disabled)return;
		if (transcriptDiv != null) {
			transcriptDiv.ownerDocument.body.scrollTop = transcriptDiv.ownerDocument.body.scrollTop + 32000;
		}
	};
	
	this.ScrollToBottom = function(){
		window.setTimeout('globalConversation.ScrollToBottom0()',20);
	};
	
	this.InsertMessageHtml = function(msgHtml){
		if (disabled)return;
		if (transcriptDiv != null) {
			var history = transcriptDiv.innerHTML + msgHtml;
			var length = history.length;
			if (history.length > MAX_HISTORY_SIZE) {
				history = history.substring(length-MAX_HISTORY_SIZE);
				
				var tagidx = history.indexOf("<");
				var i = history.indexOf("__dn");
				if (tagidx > i) {
					i = history.indexOf("__dn",tagidx);
				}

				for (i=i-1;i>=0;i--) {
					if (history.charAt(i) == "<") {
						history = history.substring(i);
						break;
					}
				}
			}
			transcriptDiv.innerHTML = history;
			this.ScrollToBottom();
		}
	};
	this.ShowMessage = function(displayname, msgText, format, emoticons){

			if (disabled)return;
			if (msgText != null && msgText.length > 0){
					var nameHtml = "<span id=\"__dn\" class=\"messageText\" >" + EmoticonReplace(EntityReplace(FormatString(L_IDS_TEXT_IM, displayname))) + "</span>";

					var msgHtml = EmoticonReplace(LinkReplace(UBBReplace(EntityReplace(msgText))));
					//var msgHtml = EmoticonReplace(LinkReplace(EntityReplace(msgText)));
					
					if (emoticons != null && emoticons.Size() > 0) {
						msgHtml = emoticons.Replace(msgHtml);
					}
					msgHtml = NewlineReplace(msgHtml);
				
					if (format != null){
							msgHtml = format.ApplyFormat(msgHtml);
					}
					msgHtml = "<div style=\"padding-left:15px\">" + msgHtml + "</div>";
					this.InsertMessageHtml(FormatString(L_IDS_FORMAT_IM, nameHtml, msgHtml));
			}
	};

	this.ShowNudge = function(nudgeText) {
		if (disabled)return;

		var nudgeHtml = "<span id=\"__dn\" class=\"messageText\" >" + FormatString(L_IDS_FORMAT_ACTION, nudgeText) + "</span>";
		this.InsertMessageHtml(nudgeHtml);

		if (IsIE() && conversationWindow.moveBy) {
			try {
				if (navigator.userAgent.indexOf("Tencent")>=0)return;
				for (var i = 8; i>0; i--) {
					for (var j = 8; j>0; j--) {
						conversationWindow.top.moveBy(0,i);
						conversationWindow.top.moveBy(i,0);
						conversationWindow.top.moveBy(0,-i);
						conversationWindow.top.moveBy(-i,0);
					} 
				} 
			} catch (e){}			
		}
	};
	
	
	
	this.ShowActivity = function(activityText) {
		if (disabled)return;

		var activityHtml = "<span id=\"__dn\" class=\"activityText\">" + FormatString(L_IDS_FORMAT_ACTION, activityText) + "</span>";
		this.InsertMessageHtml(activityHtml);
	};
	


	this.ActivityReceived = function(data) {
		var activityFrame = $("activityFrame");
		if (document.domain == ACTIVITY_DOMAIN) {
			var activityWindow = activityFrame.contentWindow;
			if (activityWindow != null) {
				window.fakeExternal.Channel.Data = data;
				try {
					activityWindow.Channel_OnDataReceived();
				} catch (e){}
			}
		}
		else {
			activityFrame.src = data;
		}
	};
	
	this.ActivityLoaded = function() {
		this.ScrollToBottom();
	
		if (window.fakeExternal == null)return;
		
		if (document.domain == ACTIVITY_DOMAIN) {
			var activityFrame = $("activityFrame");
			var activityWindow = activityFrame.contentWindow;
			
			window.fakeExternal.Channel.Type = 0;
			try {
				activityWindow.Channel_OnRemoteAppLoaded();
			} catch (e){}
			this.ActivityReceived(window.fakeExternal.Channel.Data);
		}
		else {
			sendActivityEvent(fakeExternal.AppID,EVENT_ACTIVITY_LOADED);
		}
		
		try {
			globalConversation.fireEvent(EVENT_ACTIVITY_LOADED,window.fakeExternal);
		} catch(e){}
	};
	
	this.AcceptActivity = function(arg){
		var channelID = null;
		var clickElement = null;
		if (typeof(arg) == "undefined") {
			var acceptActions = transcriptDiv.ownerDocument.getElementsByName("acceptAction");
			if (acceptActions.length > 0) {
				clickElement = acceptActions[acceptActions.length-1];
			}
		}
		else if (typeof(arg) == "object") {
			clickElement = arg;
		}
		
		if (clickElement != null) {
			channelID = clickElement.getAttribute("channelID");
			var actionElement = clickElement.parentNode;
			actionElement.innerHTML=actionElement.innerText?actionElement.innerText:actionElement.textContent;
			this.ShowActivity(FormatString(L_IDS_TEXT_ACTIVITY_ACCEPT, this.activityMap[channelID].AppName));
		}
		else {
			channelID = arg;
		}

		if (typeof(channelID) == "undefined") return;		
		
		var activityFrame = $("activityFrame");
		if (activityFrame == null) {
			var scrolling = "no";
			if (document.domain != ACTIVITY_DOMAIN) {
				scrolling = "auto";
			}
		    activityDiv.innerHTML = "<iframe id='activityFrame' scrolling ='" + scrolling + "' frameborder=no border=0 width=100% height=100% onload='globalConversation.ActivityLoaded();'></iframe>";
					    
		}
		activityFrame = $("activityFrame");
		activityFrame.channelID = channelID;
		
		this.CloseActivityWindow();
		
		window.fakeExternal = this.activityMap[channelID];

		var users = window.fakeExternal.Users;
		users.SetMe(users.AddUser(__sessionId,__sessionId,__sessionId,__IP,__IP));
		users.SetInviter(users.AddUser(__robotId));
	
		if (document.domain == ACTIVITY_DOMAIN) {
			activityFrame.src = this.activityMap[channelID].AppURL;
		}
		else {
			activityFrame.src = window.fakeExternal.Channel.Data;			
		}

		activityDiv.style.display = "block";
		
	    sendActivityEvent(this.activityMap[channelID].AppID,EVENT_ACTIVITY_ACCEPTED);
	    
   		this.activityMap[channelID] = null;

   		try {
			globalConversation.fireEvent(EVENT_ACTIVITY_ACCEPTED,window.fakeExternal);
		} catch(e){}
	}
	
	this.RejectActivity = function(arg) {
		var channelID = null;
		var clickElement = null;
		if (typeof(arg) == "undefined") {
			var rejectActions = transcriptDiv.ownerDocument.getElementsByName("rejectAction");
			if (rejectActions.length > 0) {
				clickElement = rejectActions[rejectActions.length-1];
			}
		}
		else if (typeof(arg) == "object") {
			clickElement = arg;
		}
		
		if (clickElement != null) {
			channelID = clickElement.getAttribute("channelID")

			var actionElement = clickElement.parentNode;

			actionElement.innerHTML=actionElement.innerText?actionElement.innerText:actionElement.textContent;
			this.ShowActivity(FormatString(L_IDS_TEXT_ACTIVITY_REJECT ,this.activityMap[channelID].AppName));
		}
		else {
			channelID = arg;
		}
		
		if (typeof(channelID) == "undefined") return;	
	
			
		sendActivityEvent(this.activityMap[channelID].AppID,EVENT_ACTIVITY_REJECTED);
		
		this.activityMap[channelID] = null;
		
		try {
			globalConversation.fireEvent(EVENT_ACTIVITY_REJECTED,window.fakeExternal);
		} catch(e){}
	}

	this.ShowDisplayPicture = function(name) {
		if (disabled)return;
		if (displayPictureDiv != null && name != null && name != "")
		{
			displayPictureDiv.innerHTML = "<img width=96 height=96 src=\"" + L_IDS_GET_RESOURCE_URL + "?type=3&name=" + encodeURIComponent(name) + "&r=" + Math.random() + "\">";
		}
	}

	this.ShowDisplayName = function(name) {
		if (disabled)return;
		if (name != null) {
			__robotName = name;
			if (displayNameDiv != null)
			{
				displayNameDiv.innerHTML = EmoticonReplace((EntityReplace(name)));
			}
		}
	}
	this.ShowPersonalMessage = function(message) {
		if (disabled)return;
		if (personalMessageDiv != null && message != null)
		{
			personalMessageDiv.innerHTML = EmoticonReplace((EntityReplace(message)));
		}
	}
	
	this.fireEvent = function(eventType, eventParam) {
		var i = 0;
		for (i=0;i<eventListeners.length;i++) {
			eventListeners[i](eventType,eventParam);
		}
		if (i == 0) return false;
		return true;
	}
	

	// ========================== user interface =============================

	this.GetFormat = function(){
			return format;
	};

	this.SetFont = function(f){
			format.font = f;
			setCookie("webbot_font_name",f);
	};
	this.SetColor = function(c){
			format.color = c;
			setCookie("webbot_font_color",c);
	};
	this.SetSize = function(s){
			format.size = s;
			setCookie("webbot_font_size",s);
	};
	this.ToggleStyle = function(styleCode){
			var result = false;
			result = format.ToggleStyle(styleCode);
			setCookie("webbot_font_style",format.styleCode);
			return result;
	};
	
	this.GetDisplayName = function() {
		return displayName;
	}
	
	this.SetDisplayName = function(dn) {
			displayName = dn;
			setCookie("webbot_display_name",dn);
	};
	this.SendMessage = function(messageText) {
			if (disabled)return;
			this.ShowMessage(displayName,messageText,format);	
			sendMessageImpl(displayName,messageText,format);
	};
	this.SendNudge = function() {
		if (disabled)return;
		this.ShowNudge(L_IDS_TEXT_NUDGE_SEND);
		sendNudgeImpl();
	}
	
	this.CloseActivityWindow = function() {
		if (disabled)return;
		if (window.fakeExternal) {
			activityDiv.style.display = "none";
			sendActivityEvent(fakeExternal.AppID,EVENT_ACTIVITY_CLOSED);
			try {
				globalConversation.fireEvent(EVENT_ACTIVITY_CLOSED,window.fakeExternal);
			} catch(e){}
			window.fakeExternal = null;
			var activityFrame = $("activityFrame");
			if (activityFrame != null)activityFrame.src="about:blank";
		}
	}

	this.InitializeTranscriptDiv = function(tDiv) {

		transcriptDiv = tDiv;
	}
	this.InitializeDisplayPictureDiv = function(dpDiv) {
		displayPictureDiv = dpDiv;
	}
	this.InitializeDisplayNameDiv = function(dnDiv) {
		displayNameDiv = dnDiv;
	}
	this.InitializePersonalMessageDiv = function(pmDiv) {
		personalMessageDiv = pmDiv;
	}
	
	this.InitializeActivityDiv = function(aDiv) {
		activityDiv = aDiv;
	}
	
	this.AddEventListener = function(listener) {
		if (typeof(listener)!="function") return;
		eventListeners[eventListeners.length] = listener;
	}
	
	this.RemoveEventListener = function(listener) {
		if (typeof(listener)!="function") return;
		for (var i=0;i<eventListeners.length;i++) {
			if (eventListeners[i] == listener) {
				eventListeners.splice(i,1);
				break;
			}
		}
	}
	
	// ========================== user interface =============================

	globalConversation = this;

	if (window.addEventListener) {
		window.addEventListener("load", sendCoversationOpenedEvent,false);
		window.addEventListener("unload", sendConversationClosedEvent,false);
	}
	else {
		window.attachEvent("onload", sendCoversationOpenedEvent);
		window.attachEvent("onunload", sendConversationClosedEvent);
	}

}


