﻿/**
*	@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: "",
    link: {
        href: "http://www.w3bdev.com",
        text: "Visit w3bdev"
    },
    text: {
        offlineMsg: null,
        greetingMsg: null,
        widgetTitle: null,
        initialInputValue: "Chat with w3bdev here",
        nicknameLabel: ""
    },
    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;
        
        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", "W3bdev Chat");
        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. <a href=\"javascript:location.reload();\">Click here</a> 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 = "<p class=\"odd\">" + msg + "</p>";
    },

    callbacks: {
        startSession: function(json) {
            var obj = json.response;
            switch (obj.statusCode) {
                case 200:
                    AIM.params.user = "W3bdevGuest";
                    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 = "W3bdevGuest";
                    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();