/* Copyright (c) 2006-2009, Apple Inc. All rights reserved. */


var UpcomingEventsSidebar = Class.createWithSharedInstance('upcomingEventsSidebar', true);
UpcomingEventsSidebar.prototype = {
	initialize: function()
	{
		var element = $('UpcomingEventsList');
		if (!element) return invalidate;
		
		// ##6259078
		UpcomingEventsService.DayRange = parseInt(getMetaTagValue('caldav_upcoming_events_date_range')) || 30;
		this.controller = new UpcomingEventsViewController(element, uid().mBaseLocation+'calendar/');
	}
};


var SidebarUpdater = Class.createWithSharedInstance('sidebarUpdater', true);
SidebarUpdater.prototype = {
	mRefreshTimeout: 30000, // refresh every 30 seconds
	enabled: true,
	initialize: function() {
		this.mPageListingElm = $('page_listing');
		if ($$('#page_listing ul').length <= 0) return invalidate;
		if ($('HotList')) Element.cleanWhitespace('HotList'); // ##5389056
		this.buildIndexFromPage();
		publisher().subscribe(this.handleAuthenticated.bind(this), 'AUTHENTICATED');
		publisher().subscribe(this.startEdit.bind(this), 'DID_START_EDITING');
		publisher().subscribe(this.endEdit.bind(this), 'DID_FINISH_EDITING');
		// populate asynchronously so Safari's progress bar finishes
		var callback = function() {
			if (!this.enabled) return false;
			serverui().ensureLogin(this.getSidebarContents.bind(this), 'read', true);
		};
		this.mTimer = setTimeout(callback.bind(this), 10);
	},
	buildIndexFromPage: function() {
		this.mIndex = {};
		$$('#page_listing li.EntryListItem').each(function(li) {
			var parentKey = li.up().id;
			if (!this.mIndex[parentKey]) this.mIndex[parentKey] = {};
			var a = li.down('a');
			if (a) {
				var uid = li.getAttribute('name'); // #5957049
				if (!uid) {
					var uid = li.down('a').getAttribute('href').replace(/^(https?:\/\/[^\/]+\/|\/)/, '').replace(/(\/|\/[^\/]+.html)$/, '');
				}
				this.mIndex[parentKey][uid] = { mElement:li };
			}
		}.bind(this));
	},
	getSidebarContents: function() {
		if (this.mTimer) {
			clearTimeout(this.mTimer);
			delete this.mTimer;
		}
		server().wiki.getSidebarEntries([this.gotSidebarContents.bind(this), invalidate], uid().mBasePath, Loc.getBrowserLocale());
	},
	gotSidebarContents: function(inRequestObj, inResponseObj) {
		$H(inResponseObj).each(function(parentObj) {
			if (!parentObj.value.each) return; // if this one's not an array then bail
			if (!this.mIndex[parentObj.key]) this.mIndex[parentObj.key] = {};
			
			// empty list string -- that means no values
			if (parentObj.value.length == 1 && parentObj.value[0]['emptyListString']) {
				this.mIndex[parentObj.key] = {};
				removeAllChildNodes(parentObj.key);
				var li = Builder.node('li', {className:'EntryListItem emptyList'}, parentObj.value[0]['emptyListString']);
				$(parentObj.key).appendChild(li);
				return;
			}
			
			var syncStatus = Array.syncKeyedArrayWithRows(this.mIndex[parentObj.key], parentObj.value);
			// if we have rows and have an emptyList placeholder, remove the placeholder
			var emptyListPlaceholder = $(parentObj.key).down('li.emptyList');
			if (emptyListPlaceholder && syncStatus.addedRows.length > 0) {
				Element.remove(emptyListPlaceholder);
			}
			// add new rows
			syncStatus.addedRows.each(function(item) {
				// create DOM stuff
				var href = item.url;
				var subDate = createDateObjFromISO8601(item.subtitle, true);
				var li = Builder.node('li', {className:'EntryListItem', style:'display:none'}, [
					Builder.node('a', {href:href}, [item.title]),
					' ', /* space for printing */
					Builder.node('span', {className:'snippet'}, [subDate ? Loc.getLongDateString(subDate) : item.subtitle])
				]);
				// add item to the index
				this.mIndex[parentObj.key][item.uid]['mElement'] = li;
				// add the element to the parent list
				insertAtBeginning(li, $(parentObj.key));
				if (this.mAnimate) var effect = new Effect.BlindDown(li, {duration:0.2, scaleContent:false});
				else Element.show(li);
			}.bind(this));
			// remove deleted rows
			syncStatus.deletedRows.each(function(item) {
				tooltipManager().stopObserving(item.mElement.firstChild);
				var removeAfterFinish = function(inEffect) {
					Element.remove(inEffect.element);
				};
				var effect = new Effect.BlindUp(item.mElement, {duration:0.2, afterFinish:removeAfterFinish});
			});
		}.bind(this));
		// force reflow in Tiger Safari
		if (SafariFixes.isTigerSafari) $A(d.getElementsByClassName('endmain')).each(function(forceElm) {Element.forceReflow(forceElm);});
		// turn on animation in other browsers
		else this.mAnimate = true;
		// reset the timer
		if (this.mTimer) {
			clearTimeout(this.mTimer);
			delete this.mTimer;
		}
		this.mTimer = setTimeout(this.getSidebarContents.bind(this), this.mRefreshTimeout);
		publisher().publish('DID_GET_SIDEBAR_CONTENT', this, inResponseObj);
		if (window.unitTestHandler) unitTestHandler.messageFromJS_('gotSidebarContents');
	},
	startEdit: function() {
		Element.hide(this.mPageListingElm); // ##6759256
		$A(this.mPageListingElm.getElementsByTagName('a')).each(function(elm) {
			elm.target = '_blank';
		});
	},
	endEdit: function() {
		Element.show(this.mPageListingElm); // ##6759256
		$A(this.mPageListingElm.getElementsByTagName('a')).each(function(elm) {
			elm.target = '';
		});
	},
	handleAuthenticated: function(inMessage, inObject, inUserInfo) {
		// shut down the refresh timer
		if (this.mTimer) {
			clearTimeout(this.mTimer);
			delete this.mTimer;
		}
		// callback happens when content is reloaded (or fails... no real need to draw a distinction here)
		var callback = function(inSuccess) {
			// rebuild the index
			this.buildIndexFromPage();
			// restart the refresh timer
			this.getSidebarContents();
		};
		Element.reload('page_listing', callback.bind(this));
	}
};

if (window.loaded) loaded('grouphome.js');