/**
 * 	The javascript backend for the AOL Mail Gadget
 */

// Used for removing whitespace in subject
String.prototype.trim = function () {return this.replace(/^\s*/, "").replace(/\s*$/, "")}

var Mail = {
	/**
	* The initial call to the gadget.
	* @param {number} numMail The number of e-mail messages to preview
	* @param {String} col The banding color of every other e-mail (eg. #FFFFFF)
	*/
	launch: function(numMail, col) {
		window.resizeTo(400, 500);
		Mail.init();
		Mail.params.mailDispNum = numMail;
		Mail.params.color = col;
		Mail.params.token = Mail.core.getTokenCookie();
		if (!Mail.params.token)
			Mail.transactions.getToken();
		else {
			document.getElementById("LaunchLink").style.display = "none";
			document.getElementById("MailContainer").style.display = "";
			Mail.transactions.getInfo();
		}
	},
	init: function() {
		if (!Mail.params.devId) Mail.params.devId = document.getElementById("MailContainer").getAttribute("devId");
		var inboxLink = document.getElementById("InboxLink").href;
		//Mail.params.mailLink = inboxLink.substr(0,inboxLink.indexOf("Suite"));
		Mail.params.mailLink = inboxLink.substr(inboxLink.indexOf("webmail"));
		Mail.params.mailLink = Mail.params.mailLink.substr(0, Mail.params.mailLink.indexOf("Suite"));
		var locPos = Mail.params.mailLink.indexOf("-");

		if (locPos > -1)
			Mail.params.locale = Mail.params.mailLink.substr(locPos - 2, 5);
		if (Mail.params.locale == "de-de" || Mail.params.locale == "nl-nl" || Mail.params.locale == "es-es")
			document.getElementById("Compose").style.width = "120px";
	},

	signout: function() {
		document.cookie = null;
		this.kill();

	},
	/**
	* Ends a user's session, logging him/her out of OpenAuth and SNS and resetting the 
	* gadget's ui.
	*/
	kill: function() {
		clearTimeout(Mail.core.refresh);
		clearTimeout(Mail.core.listTimeout);
		Mail.core.refresh = null;
		Mail.core.listTimeout = null;
		var authFrame = document.getElementById("AuthFrame");
		authFrame.style.height = "0px";
		authFrame.style.display = "";
		// Logout of OpenAuth and SNS
		authFrame.src = Mail.params.baseAuthURI + Mail.params.transactions.logout + "?k=" + Mail.params.devId + "&doSNSLogout=1&succUrl=about:blank&a=" + Mail.params.token;
		Mail.params.token = null;
		Mail.core.userName = null;
		Mail.core.showMail = true;
		Mail.ui.reset();
		document.getElementById("LaunchLink").style.display = "";
		//alert("in kill, about to get token");
		Mail.transactions.getToken();
		//window.location.href = 'http://www.google.com';
	}
}

Mail.params = {
	baseAuthURI: "https://api.screenname.aol.com/",
	baseMailURI: "https://api.mail.aol.com/mail/newMail",
	// TestPea links
	//baseAuthURI: "https://authapi-certify.mc.aol.com/",
	//baseMailURI: "http://mailflac.mda.aol.com:1050/mail/newMail",
        subjPromo: "http://pr.atwola.com/promoclk/100001269x1139930023x1078971526/aol?redir=http%3A%2F%2F",
        subjPromoImage: "http://pr.atwola.com/promoimp/100001269xx1078971526/aol",
        defaultInboxSuffix: "Suite.aspx?app=mail",
	mailLink: null,
	locale: "en-us",
	devId: null,
	token: null,
	mailDispNum: -1,
	color: null,
	callbacks: {
		getToken:["Mail.callbacks.getToken"],
		getInfo:["Mail.callbacks.getInfo"],
		logout:["Mail.callbacks.logout"],
		getList:["Mail.callbacks.getList"],
		getCount:["Mail.callbacks.getCount"]
	},
	transactions: {
		getToken:"auth/getToken",
		getInfo:"auth/getInfo",
		logout:"auth/logout",
		getList:"List",
		getCount:"Count"
	},
	SAFARI: navigator.userAgent.indexOf("Safari")>-1 && !document.all,
	MOZILLA: navigator.userAgent.indexOf("Firefox")>-1 && !document.all,
	MSIE: document.all && !window.opera,
	OPERA: window.opera
}

Mail.core = {
	MailData: [],
	initCall: false, //set to true if we want to show the 'sign in' link if you are not signed in.
	showMail: true,
	userName: null,
	messageCount: -1,
	messages: null,
	refresh: null,
	authTimeout: null,
	listTimeout: null,
	deepLink: 1,
	requestData: function(transactionObject) {
		var len = Mail.core.MailData.length;
		transactionObject.timestamp = Date.parse(new Date());
		Mail.core.MailData[len] = {};
		Mail.core.MailData[len].oScript = document.createElement("script");
		Mail.core.MailData[len].oScript.setAttribute("id", "MailData-" + len);
		Mail.core.MailData[len].oScript.setAttribute("type", "text/javascript");
		Mail.core.MailData[len].objData = transactionObject;
		if (transactionObject.dataURI.indexOf("?") == -1) {
			transactionObject.dataURI += "?r=" + len + "&nocache=" + Date.parse(new Date());
		} else {
			transactionObject.dataURI += "&r=" + len + "&nocache=" + Date.parse(new Date());
		}
		//alert("requestData: " + transactionObject.dataURI);
		Mail.core.MailData[len].oScript.setAttribute("src", transactionObject.dataURI);
		document.getElementsByTagName("head")[0].appendChild(Mail.core.MailData[len].oScript);
	},
	acceptData: function(json) {
		var requestId = parseInt(json.response.requestId);
		var code = parseInt(json.response.statusCode);
		var type = Mail.core.MailData[requestId].objData.type;
		//alert(type + " w/ code= " + code);
		if (code != 200) {
			if (code == 401 && type != "getToken") {
				// only getToken expects a 401 - if we get it on any other, kill the session

				//Mail.kill();
				//experiment - instead of killing, get token here
				Mail.transactions.getToken();
				return;
			}
		}
		eval("Mail.callbacks." + type + "(json)");
	},
	showAuthWindow: function(url) {
		//debugger;
		//document.write("This is where we would normally show the auth window");

		var authFrame = document.getElementById("AuthFrame");
		authFrame.style.height = "100%";
//		if (Mail.params.MSIE)
//			authFrame.style.height = "443px";
//		else
//			authFrame.style.height = "402px";
		authFrame.src = "about:blank";
		authFrame.src = url + "&language=" + Mail.params.locale + "&nocache=" + Date.parse(new Date());
		setTimeout("document.getElementById('AuthFrame').style.display = '';", 200);
		//AIM.core.debug("createAuthWindow: " + url + "&nocache=" + Date.parse(new Date()));
		Mail.core.watchAuthRequest();
		Mail.core.authTimeout = setTimeout("location.replace('#AUTHCANCEL')", 120000);

	},
	watchAuthRequest: function() {
		var oLoc = location.href;
		if (oLoc.indexOf("#AUTHDONE") > -1) {
			clearTimeout(Mail.core.authTimeout);
			location.replace("#mail");
			document.getElementById("AuthFrame").style.display = "none";
			Mail.transactions.getToken();
		} else if (oLoc.indexOf("#AUTHCANCEL") > -1) {
			clearTimeout(Mail.core.authTimeout);
			location.replace("#mail");
			//setTimeout(Mail.transactions.getToken,100);
			document.getElementById("AuthFrame").style.display = "none";
			document.getElementById("LaunchLink").style.display = "";
			alert("in watchAuthRequest, about to get token");
			Mail.transactions.getToken();
			//window.location.href = 'http://www.google.com';
		} else {
			clearTimeout(oTimeout);
			var oTimeout = setTimeout(Mail.core.watchAuthRequest, 500);
		}
	},
	saveTokenCookie: function(token) {
		var cookieToken = "FlacToken=" + escape(token);
		var expires = new Date();
		expires.setFullYear(expires.getFullYear() + 1, expires.getMonth(), expires.getDate());
		cookieToken += "; expires=" + expires.toGMTString();
		document.cookie = cookieToken;
	},
	getTokenCookie: function() {
		var results = document.cookie.match('(^|;) ?' + "FlacToken" + '=([^;]*)(;|$)');

		if (results)
			return (unescape(results[2]));
		else
			return null
	}
}

Mail.transactions = {
	/**
	 * Attempts to get an OpenAuth token to access mail services. If the user is not authenticated
	 * then this will call a login screen.
	 */
	getToken: function() {
		var tObj = {
		dataURI: Mail.params.baseAuthURI + Mail.params.transactions.getToken + "?k=" + Mail.params.devId + "&tokenType=longterm&f=json&c=Mail%2Ecore%2EacceptData",
			type:"getToken"
		}
		Mail.core.requestData(tObj);
	},
	// No longer used
	logout: function() {
		var tObj = {
			dataURI: Mail.params.baseAuthURI + Mail.params.transactions.logout + "?k=" + Mail.params.devId + "&doSNSLogout=1&f=json&a=" + Mail.params.token + "&c=Mail%2Ecore%2EacceptData",
			type:"logout"
		}
		//Mail.core.requestData(tObj);
	},
	/**
	 * Gets the userName.
	 */
	getInfo: function() {
		var tObj = {
		dataURI: Mail.params.baseAuthURI + Mail.params.transactions.getInfo + "?k=" + Mail.params.devId + "&f=json&a=" + Mail.params.token + "&c=Mail%2Ecore%2EacceptData",
			 type:"getInfo"
		}
		Mail.core.requestData(tObj);
	},
	/**
	 * Retrieves a list of the user's new mail. Max number of items is 75.
	 */
	getList: function() {
		if(Mail.core.refresh) {
			clearTimeout(Mail.core.refresh);
			Mail.core.refresh = null;
		}
		var tObj = {
			dataURI: Mail.params.baseMailURI + Mail.params.transactions.getList + "?f=json&items=75&a=" + 
				Mail.params.token + "&devId=" + Mail.params.devId + "&c=Mail%2Ecore%2EacceptData",
			type:"getList"
		}
		Mail.core.requestData(tObj);
		Mail.core.listTimeout = setTimeout('document.getElementById("ErrorMessage").style.display = "";',5000);
	},
	// Called only if user has more than 75 new emails
	getCount: function() {
		var tObj = {
			dataURI: Mail.params.baseMailURI + Mail.params.transactions.getCount + "?f=json&a=" + 
				Mail.params.token + "&devId=" + Mail.params.devId + "&c=Mail%2Ecore%2EacceptData",
			type:"getCount"
		}
		Mail.core.requestData(tObj);
	}
}

Mail.callbacks = {
	getToken: function(json) {
		//alert("Code = " + json.response.statusCode);
		if (Mail.core.initCall) {
			Mail.core.initCall = false;
			if (json.response.statusCode != 200)
				return;
		}
		document.getElementById("LaunchLink").style.display = "none";
		//window.location.href = 'http://www.askapache.com';
		if (json.response.statusCode == 200) {
			Mail.params.token = json.response.data.token.a;
			Mail.core.saveTokenCookie(Mail.params.token);
			document.getElementById("MailContainer").style.display = "";
			Mail.transactions.getInfo();
		} else if (json.response.statusCode == 450 || json.response.statusCode == 401) {
			document.getElementById("AuthFrame").style.display = "none";
			/*if (navigator.userAgent.indexOf("Safari") > -1 && navigator.userAgent.indexOf("Version/3") > -1)
			Mail.core.showAuthWindow(json.response.data.redirectURL + "?uiType=mini&k=" + Mail.params.devId + "&succUrl=" + location.href);
			else*/
			Mail.core.showAuthWindow(json.response.data.redirectURL + "?uiType=mini&tokenType=longterm&k=" + Mail.params.devId);
		} else if (json.response.statusCode == 330) {
			Mail.kill();
		} else {
			//alert("Error! Status Code = " + json.response.statusCode);
			document.getElementById("ErrorMessage").style.display = "";
		}
	},
	logout: function(json) {
		// Nothing need be done
	},
	getInfo: function(json) {
		Mail.core.userName = json.response.data.userData.loginId;
		Mail.transactions.getList();
		var userName = document.getElementById("UserName");
		var greeting = userName.firstChild.data;
		userName.removeChild(userName.firstChild);
		var text = greeting.substr(0, greeting.indexOf("("));
		userName.appendChild(document.createTextNode(text + Mail.core.userName));
		userName.style.display = "";
	},
	getList: function(json) {
		if (json.response.statusCode == 200) {
			clearTimeout(Mail.core.listTimeout);
			Mail.core.listTimeout = null;
			document.getElementById("ErrorMessage").style.display = "none";
			Mail.core.messageCount = json.response.data.mailList.messageList[0].messageCount;
			//alert("Message count: " + Mail.core.messageCount);
			Mail.core.messages = json.response.data.mailList.messageList[0].messages;
			if (Mail.core.messageCount == 75)
				Mail.transactions.getCount();
			else
				Mail.ui.displayMail();
			Mail.core.refresh = setTimeout("Mail.transactions.getList()", 300000);
		}
		else if (json.response.statusCode == 451 || json.response.statusCode == 500) {
			//alert(json.response.statusCode);
			document.getElementById("MailContainer").style.display = "none";
			document.getElementById("ErrorMessage").style.display = "";
		}
	},
	getCount: function(json) {
		Mail.core.messageCount = json.response.data.mailFolderCount.mailFolderData.mailFolderType[0].count;
		//alert("getCount called! Message count: " + Mail.core.messageCount);
		Mail.ui.displayMail();
	}
}

Mail.ui = {
	// Sets up mail module display
	displayMail: function() {
		var mailCount = document.getElementById("MailCount");
		if (mailCount.firstChild)
			mailCount.removeChild(mailCount.firstChild);
		var mailBody = document.getElementById("MailBody");
		mailBody.style.display = "none";
		while (mailBody.hasChildNodes())
			mailBody.removeChild(mailBody.lastChild);
		if (Mail.core.messageCount > 0) {
			mailCount.appendChild(document.createTextNode(" (" + Mail.core.messageCount + ")"));
			for (var i = 0; i < Mail.core.messages.length && i < Mail.params.mailDispNum; i++) {
				var row = document.createElement("tr");
				if (i % 2 == 1)
					row.style.backgroundColor = Mail.params.color;
				var sender = document.createElement("td");
				sender.width = "40%";
				var sendText = Mail.core.messages[i].sender;
				var compText = sendText.toLowerCase();
				if (compText.indexOf("@aol.com") > -1 || compText.indexOf("@aim.com") > -1 ||
					compText.indexOf(".aol.com") > -1) {
					var text = document.createElement("span");
					text.title = sendText;
					sendText = sendText.substr(0, sendText.indexOf("@"));
					text.appendChild(document.createTextNode(sendText));
					sender.appendChild(text);
				}
				else
					if (sendText.length > 15) {
					var text = document.createElement("span");
					text.title = sendText;
					text.appendChild(document.createTextNode(sendText.substr(0, 15) + "..."));
					sender.appendChild(text);
				}
				else
					sender.appendChild(document.createTextNode(sendText));
				var subject = document.createElement("td");
				var subText = Mail.core.messages[i].subject.trim();
				subText = Mail.ui.Utf8Encode(subText);

				if (Mail.core.deepLink) {
					var msgLink = Mail.core.messages[i].messageLink;
					if (Mail.params.SAFARI)
						var addr = Mail.params.subjPromo + Mail.params.mailLink + Mail.params.defaultInboxSuffix;
					else
						var addr = Mail.params.subjPromo + Mail.params.mailLink + encodeURIComponent(msgLink.substr(msgLink.indexOf("Display")));
				}
				else
					var addr = Mail.params.subjPromo + Mail.params.mailLink + Mail.params.defaultInboxSuffix;
				//document.getElementById("InboxLink").href;

				if (subText.length == 0)
					subText = "(" + document.getElementById("NoSubject").firstChild.nodeValue + ")";
				if (subText.length > 20) {
					var link = Mail.ui.createLink(subText.substr(0, 17) + "...", addr);
					link.title = subText;
				}
				else
					var link = Mail.ui.createLink(subText, addr);

				subject.appendChild(link);
				if (Mail.core.messages[i].read == 1) {
					sender.style.fontWeight = "normal";
					subject.style.fontWeight = "normal";
				}
				var sentOn = document.createElement("td");
				sentOn.style.textAlign = "right";
				sentOn.style.fontWeight = "normal";
				var sentText = Mail.ui.formatSentOn(i);
				sentOn.appendChild(document.createTextNode(sentText));
				row.appendChild(sender);
				row.appendChild(subject);
				row.appendChild(sentOn);
				mailBody.appendChild(row);
			}
		}
		if (Mail.core.showMail)
			setTimeout(Mail.ui.showMail, 50);
		else
			setTimeout(Mail.ui.hideMail, 50);
	},
	formatSentOn: function(msgPos) {
		var today = new Date();
		var year = today.getFullYear();
		var month = "" + (today.getMonth() + 1);
		var date = "" + today.getDate();
		if (month.length == 1)
			month = "0" + month;
		if (date.length == 1)
			date = "0" + date;
		var sendDate = Mail.core.messages[msgPos].sentOn;
		if (date == sendDate.substr(8, 2) && month == sendDate.substr(5, 2) && year == sendDate.substr(0, 4)) {
			var msgHour = parseInt(sendDate.substr(11, 2));
			var msgMin = sendDate.substr(14, 2);
			return Mail.ui.formatTime(msgHour, msgMin);
		} else {
			var msgMonth = sendDate.substr(5, 2);
			var msgDate = sendDate.substr(8, 2);
			return Mail.ui.formatDate(msgMonth, msgDate);
		}
	},
	formatTime: function(hour, min) {
		if (Mail.params.locale == "en-us" || Mail.params.locale == "en-ca" || Mail.params.locale == "en-in" ||
			Mail.params.locale == "en-gb" || Mail.params.locale == "es-us") {
			if (hour / 12 < 1) {
				if (hour == 0)
					hour = 12;
				return hour + ":" + min + "am";
			} else {
				if (hour != 12)
					hour %= 12;
				return hour + ":" + min + "pm";
			}
		} else {
			return hour + ":" + min;
		}
	},
	formatDate: function(mon, date) {
		if (mon.indexOf("0") == 0)
			mon = mon.substr(1);
		if (Mail.params.locale == "en-us" || Mail.params.locale == "es-us" || Mail.params.locale == "zh-cn")
			return mon + "/" + date;
		else if (Mail.params.locale == "de-de")
			return date + "." + mon;
		else
			return date + "/" + mon;
	},
	createLink: function(dispText, address) {
		var link = document.createElement("a");
		link.onclick = function() { window.openerContext = null; };
		link.href = address;
		link.target = "_blank";

		var img = document.createElement("img");
		img.setAttribute("src", Mail.params.subjPromoImage);
		img.setAttribute("border", 0);
		img.setAttribute("width", 1);
		img.setAttribute("height", 1);
		link.appendChild(img);

		link.appendChild(document.createTextNode(dispText));

		return link;
	},
	Utf8Encode: function(iText) {
		if (Mail.params.SAFARI)
			return decodeURIComponent(escape(iText));
		else
			return iText;
	},
	toggleMail: function() {
		if (Mail.core.showMail) {
			Mail.ui.hideMail();
			Mail.core.showMail = false;
		}
		else {
			Mail.ui.showMail();
			Mail.core.showMail = true;
		}
		document.getElementById("HideLink").blur();
	},
	hideMail: function() {
		document.getElementById("MailTop").style.display = "none";
		document.getElementById("MailBody").style.display = "none";
		document.getElementById("NoMail").style.display = "none";
		//document.getElementById("HideMail").style.display = "none";
		//document.getElementById("ShowMail").style.display = "";

	},
	showMail: function() {
		if (Mail.core.messageCount > 0) {
			document.getElementById("NoMail").style.display = "none";
			document.getElementById("MailTop").style.display = "";
			document.getElementById("MailBody").style.display = "";
		}
		else {
			document.getElementById("MailTop").style.display = "none";
			document.getElementById("MailBody").style.display = "none";
			document.getElementById("NoMail").style.display = "";
		}
		//document.getElementById("HideMail").style.display = "";
		//document.getElementById("ShowMail").style.display = "none";
	},
	reset: function() {
		var userName = document.getElementById("UserName");
		userName.style.display = "none";
		var greeting = userName.firstChild.data;
		userName.removeChild(userName.firstChild);
		var text = greeting.substr(0, greeting.indexOf(" ") + 1);
		userName.appendChild(document.createTextNode(text + "(screenname)"));
		document.getElementById("MailTop").style.display = "none";
		document.getElementById("MailContainer").style.display = "none";
		document.getElementById("NoMail").style.display = "none";
		var mailBody = document.getElementById("MailBody");
		while (mailBody.hasChildNodes())
			mailBody.removeChild(mailBody.lastChild);
		mailBody.style.display = "";
		//document.getElementById("HideMail").style.display = "none";
		//document.getElementById("ShowMail").style.display = "none";
		var mailCount = document.getElementById("MailCount");
		if (mailCount.firstChild)
			mailCount.removeChild(mailCount.firstChild);
		document.getElementById("ErrorMessage").style.display = "none";
	}
}
