var _shoretelChat = new Object({ // Persons name (Can only have 1 name) name:"", // Array of all active chat windows chatWindows:[], // Chrome Objects chromeLoaded:false, chatArea:undefined, chatBar:undefined, // Asynchronous Communication Object checkXHR:false, // Utility Functions used by ALL chat objects startListening:function (obj,evnt,func) { if (obj.addEventListener) { obj.addEventListener(evnt,func,false); } else if (obj.attachEvent) { obj.attachEvent("on" + evnt,func); } }, getXHR:function () { if (typeof XMLHttpRequest != 'undefined') { try {return new XMLHttpRequest()} catch(e) {return false} } else if (typeof ActiveXObject != 'undefined') { try {return new ActiveXObject("Msxml2.XMLHTTP")} catch(e) { try {return new ActiveXObject("Microsoft.XMLHTTP")} catch(e) {return false} } } else { return false; } }, getShoretelCCChat:function (id) { var g = this; if (id > -1 || id == "new") { if (!g.chatWindows[id]) { if (g.chatWindows["new"]) { g.chatWindows["new"].id = id; g.chatWindows[id] = g.chatWindows["new"]; delete g.chatWindows["new"]; } else { g.chatWindows[id] = new g.shoretelCCChat(id); } } return g.chatWindows[id]; } else { // Full disconnect, empty array g.chatWindows = new Array(); return false; } }, init:function () { var g = _shoretelChat; if (0 > 0) { g.name = ""; } else if (document.getElementById("shoretelCCChatArea")) { g.getShoretelCCChat("new").init(); } else if (document.getElementById("shoretelCCLink")) { var shoreLink = document.getElementById("shoretelCCLink"); shoreLink.innerHTML = "Live Chat"; g.startListening(shoreLink, "click", g.startNewConversation); } }, initChrome:function () { var g = this; if (!g.chromeLoaded) { if (!(g.chatArea = document.getElementById("shoretelCCChatArea"))) { g.chatArea = document.createElement("div"); g.chatArea.id = "shoretelCCChatArea"; document.getElementsByTagName("body")[0].appendChild(g.chatArea); } g.chatBar = document.createElement("div"); g.chatBar.id = "shoretelCCChatBar"; g.chatArea.appendChild(g.chatBar); var chatBarPowered = document.createElement("div"); chatBarPowered.id = "shoretelCCChatBarPowered"; chatBarPowered.appendChild(document.createTextNode("Powered By: ShoreTel")); g.chatBar.appendChild(chatBarPowered); g.chromeLoaded = true; } }, minimizeAll:function () { var g = _shoretelChat; for (var i in g.chatWindows) { g.chatWindows[i].chatWindow.style.display = "none"; g.chatWindows[i].chatBarNotify.className = "shoretelCCChatBarNotify closed"; } }, startNewConversation:function (evnt) { var g = _shoretelChat; g.getShoretelCCChat("new").init(); if (evnt && evnt.preventDefault != undefined) evnt.preventDefault(); return false; }, // The prototype Chat object shoretelCCChat:function (id) { var a = this, g = _shoretelChat; a.id = id; a.status = "Loading..."; a.lastTalker = ""; // Display (Page) Elements var uiLoaded; a.chatWindow=""; a.chatWindowBar=""; a.chatForm=""; a.chatText=""; a.enterMessage=""; a.sendMessage=""; a.chatBarNotify=""; // Communications Objects var sendXHR; // Internal Status Variables var meTyping = false; a.init = function () { g.initChrome(); if (!uiLoaded) { a.chatWindow = document.createElement("div"); a.chatWindow.className = "shoretelCCChatWindow"; a.chatWindow.style.display = "none"; g.chatArea.insertBefore(a.chatWindow,g.chatBar); a.chatBarNotify = document.createElement("div"); a.chatBarNotify.className = "shoretelCCChatBarNotify"; a.chatBarNotify.innerHTML = a.status; g.startListening(a.chatBarNotify, "click", toggleChatWindow); g.chatBar.appendChild(a.chatBarNotify); a.chatWindowBar = document.createElement("div"); a.chatWindowBar.className = "shoretelCCChatWindowBar"; a.chatWindow.appendChild(a.chatWindowBar); a.chatForm = document.createElement("form"); a.chatForm.className = "shoretelCCChatWindowForm"; g.startListening(a.chatForm, "submit", submitForm); a.chatWindow.appendChild(a.chatForm); uiLoaded = true; } if (g.name) { showChatBox(); sendMessage("reload",""); } else { showNewChatForm(); } toggleChatWindow(); }; a.sendTyping = function (evnt) { var e = (evnt.srcElement) ? evnt.srcElement : this; if (!meTyping) { sendMessage("typing", "typing"); meTyping = true; } }; // UI / Display Functions function showNewChatForm () { if (uiLoaded) { a.chatForm.innerHTML = ""; a.chatText = undefined; var p = document.createElement("p"); p.appendChild(document.createTextNode("Please enter your name")); a.chatForm.appendChild(p); var enterName = document.createElement("input"); enterName.name = "userName"; enterName.type = "text"; enterName.className = "text"; enterName.value = ""; a.chatForm.appendChild(enterName); var enterSR = document.createElement("input"); enterSR.name = "srNum"; enterSR.type = "hidden"; enterSR.value = window.shoretelSRNumber; a.chatForm.appendChild(enterSR); var submitName = document.createElement("input"); submitName.type = "submit"; submitName.value = "Start Chat"; submitName.style.clear = "both"; a.chatForm.appendChild(submitName); a.status = "Ready"; a.chatBarNotify.innerHTML = a.status; } } function showChatBox () { if (uiLoaded) { var chatWindowClose = document.createElement("div"); chatWindowClose.className = "shoretelCCChatWindowBarClose"; chatWindowClose.appendChild(document.createTextNode("X")); g.startListening(chatWindowClose, "click", endConversation); a.chatWindowBar.appendChild(chatWindowClose); var chatWindowMinimize = document.createElement("div"); chatWindowMinimize.className = "shoretelCCChatWindowBarMinimize"; chatWindowMinimize.appendChild(document.createTextNode("_")); g.startListening(chatWindowMinimize, "click", toggleChatWindow); a.chatWindowBar.appendChild(chatWindowMinimize); a.chatWindowBar.appendChild(document.createTextNode("Live Chat")); a.chatForm.innerHTML = ""; a.chatText = document.createElement("dl"); a.chatText.className = "shoretelCCChatWindowChatText"; a.chatForm.appendChild(a.chatText); } } function toggleChatWindow () { if (a.chatWindow.style.display != "none") { a.chatWindow.style.display = "none"; a.chatBarNotify.className = "shoretelCCChatBarNotify closed"; } else { g.minimizeAll(); a.chatWindow.style.display = "block"; a.chatBarNotify.className = "shoretelCCChatBarNotify"; } } function endConversation (evnt) { var e = (evnt.srcElement) ? evnt.srcElement : this; if (a.status != "Disconnected" && confirm("Do you want to end your chat session?")) { sendMessage("disconnect", ""); } g.chatArea.removeChild(a.chatWindow); g.chatBar.removeChild(a.chatBarNotify); } // Input Handler function submitForm (evnt) { var e = (evnt.srcElement) ? evnt.srcElement : this; if (g.name) { sendMessage("message", encodeURIComponent(e.elements[0].value)); meTyping = false; e.elements[0].value = ""; e.elements[0].focus(); } else { if (e.elements[0].value) { g.name = e.elements[0].value; var sr = e.elements[1].value; a.chatBarNotify.innerHTML = "Connecting..."; showChatBox(); sendMessage("new", sr); } else { alert("Please enter your name"); e.elements[0].focus(); } } if (evnt.preventDefault != undefined) evnt.preventDefault(); return false; }; // Communications Functions function sendMessage (type, txt) { if (!sendXHR) sendXHR = g.getXHR(); if (sendXHR) { sendXHR.open("POST", "/chat/shoretelCCChat.php?rand=" + (new Date().getTime()), true); sendXHR.onreadystatechange = receiveSend; sendXHR.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); sendXHR.send("id=" + a.id + "&type=" + type + "&txt=" + txt + "&name=" + g.name); } } function receiveSend () { if (sendXHR.readyState == 4) { g.parseMessage(sendXHR.responseText); g.checkMessages(); } else { return false; } } }, // Heartbeat function for all chat windows checkMessages:function () { var g = this; if (!g.checkXHR) g.checkXHR = g.getXHR(); if (g.checkXHR && (g.checkXHR.readyState == 0 || g.checkXHR.readyState == 4)) { g.checkXHR.open("POST", "/chat/shoretelCCChat.php?rand=" + (new Date().getTime()), true); g.checkXHR.onreadystatechange = g.receiveCheck; g.checkXHR.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); g.checkXHR.send("type=hb"); } }, receiveCheck:function () { var g = _shoretelChat; if (g.checkXHR.readyState == 4) { g.parseMessage(g.checkXHR.responseText); if (g.chatWindows.length > 0) g.checkMessages(); } else { return false; } }, parseMessage:function (msg) { var g = this; if (msg) { try { var incoming = eval(msg); } catch (e) {} var textFragments = new Array(); for (var i = 0; i < incoming.length; i++) { if (typeof(incoming[i][0]) != "undefined") { var id = incoming[i][0]; if (id == "-2") g.chatWindows[-2] = g.chatWindows.shift(); var cw = g.getShoretelCCChat(id); if (cw) { if (!textFragments[id]) textFragments[id] = document.createDocumentFragment(); var message = incoming[i][1]; if (message.type == "new user reply") { cw.enterMessage = document.createElement("input"); cw.enterMessage.type = "text"; cw.enterMessage.name = "txt"; cw.enterMessage.className = "text"; cw.chatForm.appendChild(cw.enterMessage); cw.enterMessage.focus(); g.startListening(cw.enterMessage, "keypress", cw.sendTyping); cw.submitName = document.createElement("input"); cw.submitName.type = "submit"; cw.submitName.value = "Send"; cw.chatForm.appendChild(cw.submitName); var dt = document.createElement("dt"); dt.appendChild(document.createTextNode(message.text)); textFragments[id].appendChild(dt); cw.status = "Waiting for Agent..."; cw.chatBarNotify.innerHTML = cw.status; } else if (message.type == "string") { if (cw.lastTalker != message.from) { var dt = document.createElement("dt"); dt.className = (message.from == g.name) ? "shoretelCCMe" : "shoretelCCOthers"; dt.appendChild(document.createTextNode(message.from)); textFragments[id].appendChild(dt); } var dd = document.createElement("dd"); dd.appendChild(document.createTextNode(message.text)); textFragments[id].appendChild(dd); if (cw.chatWindow.style.display == "none") a.chatBarNotify.className = "alert"; cw.chatBarNotify.innerHTML = cw.status; cw.lastTalker = message.from; } else if (message.type == "agent connect") { var dt = document.createElement("dt"); dt.appendChild(document.createTextNode(message.text)); textFragments[id].appendChild(dt); cw.status = "Connected"; cw.chatBarNotify.innerHTML = cw.status; cw.lastTalker = ""; } else if (message.type == "typing") { if (message.properties.typingStatus == "typing") { cw.chatBarNotify.innerHTML = message.from + " is typing"; } else { cw.chatBarNotify.innerHTML = cw.status; } } else if (message.type == "system string") { var dt = document.createElement("dt"); dt.appendChild(document.createTextNode(message.text)); textFragments[id].appendChild(dt); cw.lastTalker = ""; } else if (message.type == "disconnect") { var dt = document.createElement("dt"); dt.appendChild(document.createTextNode(message.text)); textFragments[id].appendChild(dt); cw.lastTalker = ""; if (message.properties) { cw.chatForm.removeChild(cw.enterMessage); cw.chatForm.removeChild(cw.submitName); cw.status = "Disconnected"; cw.chatBarNotify.innerHTML = cw.status; } } } } } for (var i in textFragments) { var chatText = g.getShoretelCCChat(i).chatText; chatText.appendChild(textFragments[i]); chatText.scrollTop = chatText.scrollHeight; } } } }); _shoretelChat.startListening(window,"load", _shoretelChat.init);