﻿/*
 *   Announcement, System Status, and Known Issues modules and history pages
 *   for MobileMe product support page.
 *   Dependencies: Prototype Javascript Framework
 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 *
 *   Add these DIVs in HTML to display the module(s) :
 *
 *   <div id="announcements"></div>          -->  Announcement module on PSP
 *
 *   <div id="system_status"></div>          -->  System Status - Current module on PSP
 *   
 *   <div id="system_history"></div>         -->  System History module on PSP
 *
 *   <div id="announcement_history"></div>   -->  Announcement history page
 *
 *   <div id="system_status_history"></div>  -->  System Status history page
 * 
 *   <div id="system_status_more"></div>     -->  System Status details page
 *
 *   <div id="known_issues"></div>           -->  Known Issues page
 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

var PhotoServicesBrick = {
	
	feedDir: '/mestatus/',
	
	feedPrefix: 'ps_',
	
	feedLanguage: 'en', 
	
	errorMessage: {
		en: 'Sorry, we\'re experiencing some technical difficulties. Please try again later.',
		de: 'Leider haben wir zurzeit technische Schwierigkeiten. Bitte versuchen Sie es sp&auml;ter erneut.',
		fr: 'D&eacute;sol&eacute;, nous rencontrons actuellement quelques probl&egrave;mes techniques. R&eacute;essayez ult&eacute;rieurement.',
		ja: '申し訳ありませんが、技術的な問題が発生しております。しばらくしてからもう一度お試しください。'
	},
	
	headerAnnouncement: {
		en: 'Announcements',
		de: 'Ank&uuml;ndigungen',
		fr: 'Nouvelles',
		ja: 'お知らせ'
	},
	
	headerSystemStatus: {
		en: 'System Status',
		de: 'Systemstatus',
		fr: 'État du système',
		ja: 'システム状況'
	},
	
	headerSystemHistory: {
		en: 'System History',
		de: 'Systemverlauf',
		fr: 'Historique du syst&egrave;me',
		ja: 'システム履歴'
	},
	
	seeHistoryLink: {
		en: 'See history',
		de: 'Verlauf anzeigen',
		fr: 'Afficher l\'historique',
		ja: '履歴を見る'
	},
	
	readMoreLink: {
		en: 'See more',
		de: 'Weitere Informationen',
		fr: 'Voir davantage',
		ja: '詳細を表示'
	},
	
	moreLink: {
		en: 'More',
		de: 'Mehr',
		fr: 'Plus',
		ja: 'その他'
	},
	
	lastUpdated: {
		en: 'Last updated',
		de: 'Zuletzt aktualisiert',
		fr: 'Dernière mise à jour',
		ja: '最終変更日'
	},
	
	resolvedOn: {
		en: 'Resolved on',
		de: 'Problem behoben am',
		fr: 'Résolution',
		ja: '問題修復日'
	},
	
	resolvedBlurb: {
		en: 'Resolved a service issue with ',
		de: 'Behoben wurde das Problem mit ',
		fr: 'Résolution d\'un problème dans ',
		ja: '修復された問題点：'
	},
	
	maintenanceBlurb1: {
		en: 'Service update for ',
		de: 'Behoben wurde das Problem mit ',
		fr: 'Résolution d\'un problème dans ',
		ja: '修復された問題点：'
	},
	
	maintenanceBlurb2: {
		en: ' is complete.',
		de: '.',
		fr: '.',
		ja: '.'
	},
	
	getFeedLanguage: function() {
		/* JP feeds should be prefixed with 'ja' not 'jp', so this is a hack, for now */
		this.feedLanguage = (this.getPodLanguage() == 'ja') ? 'jp' : this.getPodLanguage();
	},
	
	getFeedLanguageForAnnouncements: function() {
		/* Three different Accouncement feeds */
		if (this.getPod() == 'us~en' || this.getPod() == 'ca~en') {
			this.feedLanguage = 'na';
		}
		else if (this.getPod() == 'be~nl' || this.getPod() == 'dk~da' || this.getPod() == 'fi~fi' || this.getPod() == 'ie~en' || this.getPod() == 'it~it' || this.getPod() == 'nl~nl' || this.getPod() == 'no~no' || this.getPod() == 'es~es' || this.getPod() == 'se~sv' || this.getPod() == 'gb~en') {
			this.feedLanguage = 'eu';
		}
		else if (this.getPod() == 'au~en' || this.getPod() == 'nz~en' || this.getPod() == 'ap~en' || this.getPod() == 'hk~en') {
			this.feedLanguage = 'apac';
		}
		else {
			this.feedLanguage = (this.getPodLanguage() == 'ja') ? 'jp' : this.getPodLanguage();
		}
	},
	
	getAnnouncements: function() {
		this.getFeedLanguageForAnnouncements();
		var feed = this.feedDir + this.feedPrefix + this.feedLanguage + '_announcement_feed.xml';
		var container = 'announcements';
		this.createAnnouncementBrick(feed, container);
	},
	
	getSystemStatus: function() {
		this.getFeedLanguage();
		var container = 'system_status';
		var feed = this.feedDir + this.feedPrefix + this.feedLanguage + '_system_status.xml';
		//if (this.getPodLanguage() == 'en') {
			this.createSystemStatusRevampBrick(feed, container);
		//}
		//else {
		//	this.createSystemStatusBrick(feed, container);
		//}
	},
	
	getSystemHistory: function() {
		this.getFeedLanguage();
		var feed = this.feedDir + this.feedPrefix + this.feedLanguage + '_system_status_history.xml';
		var container = 'system_history';
		this.createSystemHistoryBrick(feed, container);
	},
	
	getAnnouncementHistory: function() {
		this.getFeedLanguage();
		var feed = this.feedDir + this.feedPrefix + this.feedLanguage + '_announcement_history.xml';
		var container = 'announcement_history';
		this.createHistory(feed, container);
	},
	
	getSystemStatusHistory: function() {
		this.getFeedLanguage();
		var feed = this.feedDir + this.feedPrefix + this.feedLanguage + '_system_status_history.xml';
		var container = 'system_status_history';
		this.createHistory(feed, container);
	},
	
	getSystemStatusMore: function() {
		this.getFeedLanguage();
		var feed_1 = this.feedDir + this.feedPrefix + this.feedLanguage + '_full_system_status.xml';
		var feed_2 = this.feedDir + this.feedPrefix + this.feedLanguage + '_system_status.xml';
		var container = 'system_status_more';
		this.createSystemStatusMorePage(feed_1, feed_2, container);
	},
	
	getKnownIssues: function() {
		this.getFeedLanguage();
		var feed = this.feedDir + this.feedPrefix + this.feedLanguage + '_known_issues_feed.xml';
		var container = 'known_issues';
		this.createHistory(feed, container);
	},
	
	getAnnouncementBody: function(description) {
		var a = new Element('span').update(description);
		if ($(a).down('span') != undefined) {
			var p = new Element('p').update($(a).down('span').innerHTML);
			p.insert(new Element('br',{'clear':'all'}));
			return p;
		}
		return;
	},
	
	getAnnouncementImage: function(description) {
		var a = new Element('span').update(description);
		if ($(a).down('img') != undefined) {
			var img = new Element('img',{
				'src': $(a).down('img').readAttribute('src')
			}).addClassName('announcement_img');
			return img;
		}
		return;
	},
	
	getPod: function() {
		var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + escape('POD') + '=([^;\\s]*)'));
		var pod = cookie ? unescape(cookie[2]) : 'us~en';
		return pod;
	},
	
	getPodLanguage: function() {
		var pod = this.getPod();
		var locale = pod.split('~');
		var country = locale[0];
		var language = locale[1];
		if (language == 'de' || language == 'fr' || language == 'ja') {
			return language;
		}
		else {
			return 'en';
		}
	},
	
	createAnnouncementBrick: function(feed, container) {
		var req = new Ajax.Request(feed, { 
			method:'get',
			onSuccess: function(req){
				$(container).insert(new Element('h2').update(this.headerAnnouncement[this.getPodLanguage()]));
				
				var xmlDoc = req.responseXML;
				var items = $A(xmlDoc.getElementsByTagName('item'));
				items.each(function(item) {
					var title = $A(item.getElementsByTagName('title')).first();
					var description = $A(item.getElementsByTagName('description')).first();
					if (title!= null && title.hasChildNodes()) {
						var h3 = new Element('h3').update(title.firstChild.nodeValue);
						$(container).insert(h3);
					}
					if (description != null && description.hasChildNodes()) {
						$(container).insert(this.getAnnouncementImage(description.firstChild.nodeValue));
						$(container).insert(this.getAnnouncementBody(description.firstChild.nodeValue));
					}
				}.bind(this));
				
				var p = new Element('p');
				//p.insert(new Element('a',{
				//	'href': 'announcement_history.html'
				//}).update(this.seeHistoryLink[this.getPodLanguage()]));
				$(container).insert(p);
				this.slideDown(container);
				
			}.bind(this),
			onFailure: function() {
				$(container).insert(new Element('p').update(this.errorMessage[this.getPodLanguage()]));
			}.bind(this),
			onException: function() {
				$(container).insert(new Element('p').update(this.errorMessage[this.getPodLanguage()]));
			}.bind(this)
		});
	},
	
	createSystemStatusBrick: function(feed, container) {
		var req = new Ajax.Request(feed, { 
			method:'get',
			onSuccess: function(req) {
				$(container).insert(new Element('h2').update(this.headerSystemStatus[this.getPodLanguage()]));
				$(container).insert(new Element('div').addClassName('padtop10'));
				
				var xmlDoc = req.responseXML;
				var message = xmlDoc.getElementsByTagName('message')[0];
				if (message != null && message.hasChildNodes()) {
					var p = new Element('p').update(message.firstChild.nodeValue);
					$(container).insert(p);
				}
				var ul = new Element('ul');
				var items = $A(xmlDoc.getElementsByTagName('item'));
				items.each(function(item) {
					var jewel = $A(item.getElementsByTagName('jewel')).first();
					var string = $A(item.getElementsByTagName('string')).first();
					if (item.hasChildNodes() && jewel.hasChildNodes() && string.hasChildNodes()) {
						var li = new Element('li').addClassName(jewel.firstChild.nodeValue).update(string.firstChild.nodeValue);
						ul.insert(li);
					}
				});
				$(container).insert(ul);
				
				var p = new Element('p');
				p.insert(new Element('a',{
					'href': 'system_status_history.html'
				}).update(this.seeHistoryLink[this.getPodLanguage()]));
				$(container).insert(p);
				this.slideDown(container);
				
			}.bind(this),
			onFailure: function() {
				$(container).insert(new Element('p').update(this.errorMessage[this.getPodLanguage()]));
			}.bind(this),
			onException: function() {
				$(container).insert(new Element('p').update(this.errorMessage[this.getPodLanguage()]));
			}.bind(this)
		});
	},
	
	createSystemStatusRevampBrick: function(feed, container) {
		var req = new Ajax.Request(feed, { 
			method:'get',
			onSuccess: function(req) {
				$(container).insert(new Element('h2').update(this.headerSystemStatus[this.getPodLanguage()]));
				$(container).insert(new Element('div').addClassName('padtop10'));
				
				var xmlDoc = req.responseXML;
				var ul = new Element('ul').addClassName('message_items').setStyle({
					'paddingBottom':'0'  // TODO: move to css
				});
				var message_items = $A(xmlDoc.getElementsByTagName('message_item'));
				message_items.reverse();  // items are backwards in brick
				message_items.each(function(message_item) {
					var jewel = $A(message_item.getElementsByTagName('jewel')).first();
					var string = $A(message_item.getElementsByTagName('string')).first();
					var category = $A(message_item.getElementsByTagName('category')).first();
					if (message_item.hasChildNodes() && jewel.hasChildNodes() && string.hasChildNodes() && category.hasChildNodes()) {
						var li = new Element('li').addClassName(jewel.firstChild.nodeValue).setStyle({
							'padding': '2px 10px 13px 10px',   // TODO: move to css
							'textIndent': '18px',  // TODO: move to css
							'lineHeight': '18px'   // TODO: move to css
						});
						li.insert(new Element('b').update(category.firstChild.nodeValue));
						li.insert(new Element('br'));
						li.insert(string.firstChild.nodeValue + '...');
						li.insert(new Element('br'));
						li.insert(new Element('a',{
							'href': 'system_status_more.html'
						}).update(this.readMoreLink[this.getPodLanguage()]));
						ul.insert(li);
					}
				}.bind(this));
				$(container).insert(ul);
				
				var ul = new Element('ul').addClassName('items').setStyle({
					'paddingBottom':'0'  // TODO: move to css
				});
				var items = $A(xmlDoc.getElementsByTagName('item'));
				items.each(function(item) {
					var jewel = $A(item.getElementsByTagName('jewel')).first();
					var string = $A(item.getElementsByTagName('string')).first();
					if (item.hasChildNodes() && jewel.hasChildNodes() && string.hasChildNodes()) {
						if (jewel.firstChild.nodeValue == 'status_green') {
							var li = new Element('li').addClassName(jewel.firstChild.nodeValue).setStyle({
								'paddingTop': '2px',  // TODO: move to css
								'paddingBottom': '13px',  // TODO: move to css
								'lineHeight': '17px'
							}).update(string.firstChild.nodeValue);
							ul.insert(li);
						}
					}
				});
				$(container).insert(ul);
				
				var updates = $A(xmlDoc.getElementsByTagName('updates')).first();
				var lastupdated = $A(updates.getElementsByTagName('last_updated')).first();
				if (updates.hasChildNodes() && lastupdated.hasChildNodes()) {
					var p = new Element('p').setStyle({
						'fontSize':'10px',
						'color':'#666'
					}).update(this.lastUpdated[this.getPodLanguage()] + ': <b>' + lastupdated.firstChild.nodeValue + '</b>');
					$(container).insert(p);
				}
				
				var p = new Element('p');
				p.insert(new Element('a',{
					'href': 'system_status_history.html'
				}).update(this.seeHistoryLink[this.getPodLanguage()]));
				$(container).insert(p);
				this.slideDown(container);
				
			}.bind(this),
			onFailure: function() {
				$(container).insert(new Element('p').update(this.errorMessage[this.getPodLanguage()]));
			}.bind(this),
			onException: function() {
				$(container).insert(new Element('p').update(this.errorMessage[this.getPodLanguage()]));
			}.bind(this)
		});
	},
	
	createSystemHistoryBrick: function(feed, container) {
		var req = new Ajax.Request(feed, { 
			method:'get',
			onSuccess: function(req) {
				$(container).insert(new Element('h2').update(this.headerSystemHistory[this.getPodLanguage()]));
				$(container).insert(new Element('div').addClassName('padtop10'));
				
				var xmlDoc = req.responseXML;
				var items = $A(xmlDoc.getElementsByTagName('item'));
				var firstitem = items[0];
				var category = $A(firstitem.getElementsByTagName('category')).first();
				var pubdate = $A(firstitem.getElementsByTagName('pubDate')).first();
				if (firstitem.getElementsByTagName('maintenance:boolean').length > 0) {
					var maintenance = $A(firstitem.getElementsByTagName('maintenance:boolean')).first();
				}
				else if (firstitem.getElementsByTagNameNS('http://purl.org/my/rss/module/','boolean').length > 0) {
					var maintenance = $A(firstitem.getElementsByTagNameNS('http://purl.org/my/rss/module/','boolean')).first();
				}
				if (firstitem.hasChildNodes() && pubdate.hasChildNodes()) {
					var p = new Element('p').setStyle({
						'fontSize':'10px',
						'color':'#666',
						'paddingBottom':'2px'
					}).update(this.resolvedOn[this.getPodLanguage()] + ': <b>' + pubdate.firstChild.nodeValue + '</b>');
					$(container).insert(p);
				}
				if (firstitem.hasChildNodes() && category.hasChildNodes() && maintenance.hasChildNodes()) {
					var ul = new Element('ul').setStyle({
						'paddingBottom':'0'  // TODO: move to css
					});
					var li = new Element('li').addClassName('status_green').setStyle({
						'background':'url(/support/mobileme/images/status_green.png) no-repeat 10px 7px',
						'paddingLeft': '28px',
						'lineHeight': '18px'
					});
					if (maintenance.firstChild.nodeValue == '0') {
						li.update(this.resolvedBlurb[this.getPodLanguage()] + category.firstChild.nodeValue + '.');
					}
					else if (maintenance.firstChild.nodeValue == '1') {
						li.update(this.maintenanceBlurb1[this.getPodLanguage()] + category.firstChild.nodeValue + this.maintenanceBlurb2[this.getPodLanguage()]);
					}
					ul.insert(li);
					$(container).insert(ul);
				}
				
				var p = new Element('p');
				p.insert(new Element('a',{
					'href': 'system_status_history.html'
				}).update(this.moreLink[this.getPodLanguage()] + '...'));
				$(container).insert(p);
				this.slideDown(container);
				
			}.bind(this),
			onFailure: function() {
				$(container).insert(new Element('p').update(this.errorMessage[this.getPodLanguage()]));
			}.bind(this),
			onException: function() {
				$(container).insert(new Element('p').update(this.errorMessage[this.getPodLanguage()]));
			}.bind(this)
		});
	},
	
	createHistory: function(feed, container) {
		var req = new Ajax.Request(feed, { 
			method:'get',
			onSuccess: function(transport) {
				var response = transport.responseXML;
				var items = $A(response.getElementsByTagName('item'));
				items.each(function(item, index) {
					var ul = new Element('ul',{'id':'item' + (index + 1)});
					var title = $A(item.getElementsByTagName('title')).first();
					//var pubdate = $A(item.getElementsByTagName('pubDate')).first();
					var description = $A(item.getElementsByTagName('description')).first();
					if (title != null && title.hasChildNodes()) {
						var li_title = new Element('li',{'class':'title'}).update(title.firstChild.nodeValue);
						ul.insert(li_title);
					}
					/* REMOVED TIMESTAMP
					if (pubdate != null && pubdate.hasChildNodes()) {
						var cleandate = this.formatDate(pubdate.firstChild.nodeValue);
						if (!cleandate.empty()) {
							var li_pubdate = new Element('li',{'class':'pubdate'}).update(cleandate);
							ul.insert(li_pubdate);
						}
					}*/
					if (description != null && description.hasChildNodes()) {
						var announcement = new Element('span').update(description.firstChild.nodeValue);
						if (announcement.down('span') != undefined) {
							var li_description = new Element('li',{'class':'description'});
							if (announcement.down('img') != undefined) {
								var image = new Element('img',{
									'src': announcement.down('img').readAttribute('src')
								});
								li_description.insert(image);
							}
							li_description.insert(announcement.down('span').innerHTML);
							li_description.insert(new Element('br',{'clear':'all'}));
							ul.insert(li_description);
						}
					}
					if (!ul.empty()) {
						$(container).insert(ul);
					}
				}.bind(this));
				
			}.bind(this),
			onFailure: function() {
				$(container).update(this.errorMessage[this.getPodLanguage()]);
			}.bind(this),
			onException: function() {
				$(container).update(this.errorMessage[this.getPodLanguage()]);
			}.bind(this)
		});
	},
	
	createSystemStatusMorePage: function(feed_1, feed_2, container) {
		$(container).insert(new Element('div', {'id': 'system_status_items'}));
		$(container).insert(new Element('div', {'id': 'system_status_overall'}));
		
		var req_1 = new Ajax.Request(feed_1, { 
			method:'get',
			onSuccess: function(transport) {
				var response = transport.responseXML;
				var items = $A(response.getElementsByTagName('item'));
				items.each(function(item, index) {
					var ul = new Element('ul',{'id':'item' + (index + 1)});
					var title = $A(item.getElementsByTagName('title')).first();
					var description = $A(item.getElementsByTagName('description')).first();
					var jewel = $A(item.getElementsByTagName('category')).first();  // <category> is jewel
					if (title != null && title.hasChildNodes()) {
						var classname = 'title';
						if (jewel != null && jewel.hasChildNodes()) {
							classname += ' ' + jewel.firstChild.nodeValue;
						}
						var li_title = new Element('li').addClassName(classname).update(title.firstChild.nodeValue);
						ul.insert(li_title);
					}
					if (description != null && description.hasChildNodes()) {				
						var li_description = new Element('li').addClassName('description').update(description.firstChild.nodeValue);
						ul.insert(li_description);
					}
					if (!ul.empty()) {
						$('system_status_items').insert(ul);
					}
				}.bind(this));
				
			}.bind(this),
			onFailure: function() {
				$(container).update(this.errorMessage[this.getPodLanguage()]);
			}.bind(this),
			onException: function() {
				$(container).update(this.errorMessage[this.getPodLanguage()]);
			}.bind(this)
		});
		
		var req_2 = new Ajax.Request(feed_2, { 
			method:'get',
			onSuccess: function(transport) {
				var response = transport.responseXML;
				var items = $A(response.getElementsByTagName('item'));
				var div = new Element('div');
				items.each(function(item, index) {
					var ul = new Element('ul',{'id':'overall'});
					var jewel = $A(item.getElementsByTagName('jewel')).first();
					var string = $A(item.getElementsByTagName('string')).first();
					if (item.hasChildNodes() && jewel.hasChildNodes() && string.hasChildNodes()) {
						if (jewel.firstChild.nodeValue == 'status_green') {
							var li = new Element('li').addClassName(jewel.firstChild.nodeValue).update(string.firstChild.nodeValue);
							ul.insert(li);
						}
					}
					if (!ul.empty()) {
						$('system_status_overall').insert(ul);
					}
				}.bind(this));
				
				var updates = $A(response.getElementsByTagName('updates')).first();
				var lastupdated = $A(updates.getElementsByTagName('last_updated')).first();
				if (updates.hasChildNodes() && lastupdated.hasChildNodes()) {
					var p = new Element('p').setStyle({
						'fontSize':'10px',  // TODO: move to css
						'color':'#666'  // TODO: move to css
					}).update('Last updated: <b>' + lastupdated.firstChild.nodeValue + '</b>');
					$('system_status_overall').insert(p);
				}
				
			}.bind(this),
			onFailure: function() {
				$(container).update(this.errorMessage[this.getPodLanguage()]);
			}.bind(this),
			onException: function() {
				$(container).update(this.errorMessage[this.getPodLanguage()]);
			}.bind(this)
		});
	},
	
	formatDate: function(xmldate) {
		var d = new Date(xmldate);
		if (!isNaN(d.getMonth()) && !isNaN(d.getDate()) && !isNaN(d.getHours()) && !isNaN(d.getMinutes())) {
			var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
			var month = months[d.getMonth()];
			var date = d.getDate();
			var hour = (d.getHours() > 0 && d.getHours() < 12) ? d.getHours() : Math.abs(d.getHours() - 12);
			var minute = d.getMinutes().toPaddedString(2);
			var ampm = (d.getHours() < 12) ? 'AM' : 'PM';
			return month + ' ' + date + ', ' + hour + ':' + minute + ' ' + ampm;
		}
		return '';
	},
	
	slideDown: function(container) {
		/* IE doesn't like to slide */
		if (!Prototype.Browser.IE) {
			Effect.BlindDown(container);
		}
		else {
			$(container).show();
		}
	}
};

document.observe('dom:loaded', function() {
	if ($('announcements')) PhotoServicesBrick.getAnnouncements();
	if ($('system_status')) PhotoServicesBrick.getSystemStatus();
	if ($('system_history')) PhotoServicesBrick.getSystemHistory();
	if ($('announcement_history')) PhotoServicesBrick.getAnnouncementHistory();
	if ($('system_status_history')) PhotoServicesBrick.getSystemStatusHistory();
	if ($('system_status_more')) PhotoServicesBrick.getSystemStatusMore();
	if ($('known_issues')) PhotoServicesBrick.getKnownIssues();
});
