Friday, January 18, 2008

/**
* @fileoverview WIMZI Widget
* @author Steven G. Chipman - AOL - http://developer.aim.com
* @filename wimzi.js
* @copyright Copyright (c) 2007 AOL LLC. All rights reserved
* @version 0.05r3
* @revision 08.23.2007
* @dependency http://o.aolcdn.com/aim/web-aim/aimapi.js
*/

var wimzi = {
key:null,
creator:null,
cssURI: "http://o.aolcdn.com/aim/wimzi/snowdust_standard.css",
link: {
href:"http://wimzi.aim.com",
text:"Get your widget at wimzi.com"
},
text: {
offlineMsg:null,
greetingMsg:null,
widgetTitle:null,
initialInputValue:"Type here, press \"Enter\" to send.",
nicknameLabel:"Your Name: "
},
init: function() {
var fn = function() {
AIM.params.DEBUG = false;
AIM.params.RENDER_SEND_BUTTON = false;
AIM.params.USE_EMOTICONS = true;
AIM.params.callbacks.startSession = ["wimzi.callbacks.startSession"];
AIM.params.callbacks.changeFriendly = ["wimzi.callbacks.changeFriendly"];
AIM.params.callbacks.endSession = ["wimzi.callbacks.endSession"];
AIM.params.callbacks.listener.buddylist = ["wimzi.callbacks.buddylist"];
AIM.params.callbacks.listener.presence = ["wimzi.callbacks.updatePresence","AIM.ui.displayStatusChange"];
AIM.params.SHOW_TIMESTAMP = false;
AIM.core.subscriptions = "buddylist,presence,im"
wimzi.key = document.getElementById("wimziContainer").getAttribute("wimzi_key");
AIM.params.wimKey = wimzi.key;
// much of the WIM API requires this element as a container element for various things it creates. Create it if its not there.
if(!document.getElementById("AIMBuddyListContainer")) {
var o = document.createElement("div");
o.setAttribute("id","AIMBuddyListContainer");
o.style.height = "1px"; o.style.width="1px";
document.getElementsByTagName("body")[0].appendChild(o);
}
AIM.util.createSoundObjects();
wimzi.startSession();

}
window.addEventListener?window.addEventListener("load",fn,false):window.attachEvent("onload",fn);
window.addEventListener?window.addEventListener("beforeunload",wimzi.endSession,false):window.attachEvent("onbeforeunload",wimzi.endSession);
},

startSession: function() {
var tObj = {
dataURI:AIM.params.baseTransactionURI + AIM.params.transactions.startSession + "?anonymous=1&k=" + wimzi.key + "&f=json&events=" + AIM.core.subscriptions + "&c=AIM%2Ecore%2EacceptData",
type:"startSession"
}
AIM.core.requestData(tObj);
},

endSession: function() {
var tObj = {
dataURI: AIM.params.baseTransactionURI + AIM.params.transactions.endSession + "?k=" + AIM.params.wimKey + "&aimsid=" + AIM.params.sessionId + "&f=json&c=AIM%2Ecore%2EacceptData",
type:"endSession"
}
AIM.core.requestData(tObj);
},

changeFriendly: function(fName) {
if(fName.length > 16) fName = fName.substring(0,16);
var tObj = {
dataURI: AIM.params.baseTransactionURI + "presence/setState?aimsid=" + AIM.params.sessionId + "&view=online&f=json&c=AIM%2Ecore%2EacceptData&friendly=" + fName,
type:"changeFriendly",
friendlyName:fName
}
AIM.core.requestData(tObj);
},

createWidget: function(json) {
var data = json.groups[0].buddies[0];
var windowId = data.aimId;
var aimId = windowId;
AIM.util.createStyleSheet(wimzi.cssURI);
wimzi.greeting = data.greetingMsg;
wimzi.goodbye = data.offlineMsg;

if(document.getElementById(windowId + "_AIMwindow")) return;
var mObj = document.getElementById("wimziContainer");
var win = AIM.ui.createWindowFrame(windowId,"AIMBuddyListIMWindow", wimzi.text.widgetTitle);
win.style.display = "block";
var txtArea = document.createElement("div");
txtArea.className = "AIMBuddyListIMWindowTextArea";
txtArea.setAttribute("id","AIMTextArea_" + windowId);

var h2 = win.getElementsByTagName("h2")[0];
var ownerStatus = document.createElement("div");
ownerStatus.setAttribute("id","wimziOwnerStatus");
ownerStatus.className = "wimziOwnerStatus_" + data.state;
ownerStatus.innerHTML = data.displayId + " is " + data.state + ".";
wimzi.creator = data.displayId;
win.insertBefore(ownerStatus,h2.nextSibling);

var txtInput = document.createElement("input");
txtInput.setAttribute("type","text");
txtInput.className = "AIMBuddyListIMWindowTextInput";
txtInput.setAttribute("id","AIMTextInput_" + windowId);
txtInput.setAttribute("wim_aimId",aimId);
txtInput.setAttribute("maxlength","1024");
txtInput.setAttribute("value",wimzi.text.initialInputValue);
txtInput.onfocus = function() {
if(!this.cleared) {
this.value = "";
this.cleared = true;
}
}
AIM.util.addEvent(txtInput,AIM.eventHandlers.handleKeyUp,"keyup");

if(AIM.params.RENDER_SEND_BUTTON) {
var okBtn = document.createElement("button");
okBtn.setAttribute("type","button");
okBtn.className="AIMBuddyListIMWindowButton";
okBtn.setAttribute("id","AIMBuddyListIMWindowButton_" + windowId);
okBtn.setAttribute("wim_aimId",aimId);
okBtn.appendChild(document.createTextNode(AIM.params.text.sendButtonText));
AIM.util.addEvent(okBtn,AIM.eventHandlers.handleClick,"click");
}

var typingStatus = document.createElement("span");
typingStatus.className = "AIMBuddyListTypingStatus";
typingStatus.setAttribute("id",windowId + "_typingStatus");

//if(AIM.params.CREATE_AVAILABILITY_MENU_IM) win.appendChild(AIM.ui.createAvailabilityMenu());
win.appendChild(txtArea);
win.appendChild(txtInput);
if(AIM.params.RENDER_SEND_BUTTON) win.appendChild(okBtn);
win.appendChild(typingStatus);


var oNick = document.createElement("input");
oNick.setAttribute("type","text");
oNick.setAttribute("maxlength","16");
oNick.className = "AIMBuddyListIMWindowTextInput";
oNick.setAttribute("value",AIM.params.user);
oNick.onkeyup = function(e) {
var keyCode = e?e.keyCode:event.keyCode;
if(keyCode == 13) {
if(this.value.trim() == "") return;
wimzi.changeFriendly(this.value);
}
}
oLbl = document.createElement("label");
oLbl.style.display = "block";
oLbl.appendChild(document.createTextNode(wimzi.text.nicknameLabel));
oLbl.appendChild(oNick);
win.appendChild(oLbl);

var promoLink = document.createElement("a");
promoLink.appendChild(document.createTextNode(wimzi.link.text));
promoLink.setAttribute("href",wimzi.link.href);
promoLink.setAttribute("target","_blank");
promoLink.className = "wimziPromoLink";
win.appendChild(promoLink);

mObj.appendChild(win);

if(data.state == "offline") { // || data.state == "away") {
var msg = decodeURIComponent(wimzi.text.offlineMsg);
} else {
var msg = decodeURIComponent(wimzi.text.greetingMsg);
}
AIM.params.text.errors.serverErrors["401"] = "The connection has been lost. Click here to reload the page to continue your conversation.";
AIM.params.text.errors.serverErrors["602"] = "That user is offline and unable to receive messages at this time.";
var ts = AIM.params.SHOW_TIMESTAMP?AIM.util.formatTimeStamp(new Date()):"";
document.getElementById("AIMTextArea_" + data.aimId).innerHTML = "

" + msg + "

";
},

callbacks: {
startSession: function(json) {
var obj = json.response;
switch(obj.statusCode) {
case 200:
AIM.params.user = obj.data.myInfo.displayId;
AIM.params.sessionId = obj.data.aimsid;
AIM.params.listenerURI = obj.data.fetchBaseURL + "&f=json&c=AIM%2Ecore%2Elisten&timeout=" + AIM.params.REQUEST_TIMEOUT;
AIM.core.destroyListenerObject(true);
AIM.core.activeSession = true;
wimzi.text.widgetTitle= obj.data.widgetTitle;
wimzi.text.greetingMsg = obj.data.greetingMsg;
wimzi.text.offlineMsg = obj.data.offlineMsg;
if(obj.data.cssURI) wimzi.cssURI = obj.data.cssURI;
break;
case 603:
//widget is disabled. stub out the data needed to build the widget
AIM.params.user = "AIMGuest";
wimzi.text.widgetTitle = obj.data.widgetTitle;
wimzi.text.offlineMsg = obj.data.offlineMsg;
var oData = {
groups:[{
buddies:[{
aimId:obj.data.creatorDisplayName,
state:"offline",
displayId:obj.data.creatorDisplayName
}]
}]
}
wimzi.createWidget(oData);
break;
default:
return alert("Unable to start anonymous IM session.");
break;
}
},

endSession: function(json) {

},

changeFriendly: function(json) {
if(json.response.statusCode == 200) {
AIM.params.user = AIM.core.AIMData[json.response.requestId].objData.friendlyName;
}
},

buddylist: function(json) {
wimzi.createWidget(json);
},

updatePresence: function(json) {
var oElement = document.getElementById("wimziOwnerStatus");
if(oElement) {
oElement.innerHTML = wimzi.creator + " is " + json.state;
oElement.className = "wimziOwnerStatus_" + json.state;
}
}
}
}

wimzi.init();

No comments: