/**
*	@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. <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 = 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();

