Calendar = function()
{
	/* === Private Area === */
	function GetArguments(href) {
		query = href.substring(1 + location.href.indexOf('?'));
		args = query.split('&');
		result = {};
		for (i=1;i<args.length;i++)
		{
			key = args[i].split('=')[0];
			if (key != 'articleid')
			{
				val = args[i].split('=')[1].replace(/#.*/, '');
				result[key] = val;
			}
		}
		return result;
	}

	/* === Public Area === */
	return {
		Initialise: function(target, isdrilldown, headerId, tableId, panelId, footerId, footerAjax) {
			// We have header 'next' & 'previous' month links that need to be an AJAX request
			if (headerId) {
				links = Ext.get(headerId).query('a');
				for (var link=0;link<links.length;link++) {
					theLink = links[link];

					var req = iCM.NewRequest(target);
					if (panelId) {
						req.target.push(panelId);
					}
					data = iCM.SetHREF(req, theLink.href);
					data.isdrilldown = isdrilldown;
					data.header = headerId;
					data.table = tableId;
					data.footer = footerId;
					data.arguments.aday = null;
					data.panel = panelId;
					data.footerAjax = footerAjax;
					theLink.onclick = new Function('args', 'iCM.Calendar.Change(' + Ext.util.JSON.encode(data) + '); return false');
				}
			}

			if (footerId && footerAjax) {
				// We have a footer "show all" link that needs to be an AJAX request
				links = Ext.get(footerId).query('a');
				for (var link=0;link<links.length;link++) {
					theLink = links[link];

					var req = iCM.NewRequest(target);
					if (panelId) {
						req.target.push(panelId);
					}
					data = iCM.SetHREF(req, theLink.href);
					data.isdrilldown = isdrilldown;
					data.header = headerId;
					data.table = tableId;
					data.footer = footerId;
					data.arguments.aday = null;
					data.arguments.showall = true;
					data.panel = panelId;
					data.footerAjax = footerAjax;
					theLink.onclick = new Function('args', 'iCM.Calendar.Change(' + Ext.util.JSON.encode(data) + '); return false');
				}
			}
			
			if (!isdrilldown)
			{
				// If this is not a drilldown calendar, make all of the links for the various days into AJAX requests
				links = Ext.get(tableId).query('a');
				for (var link=0;link<links.length;link++) {
					theLink = links[link];

					var req = iCM.NewRequest(target);
					if (panelId) {
						req.target.push(panelId);
					}
					data = iCM.SetHREF(req, theLink.href);
					data.arguments.aday = theLink.innerHTML;
					data.isdrilldown = isdrilldown;
					data.header = headerId;
					data.table = tableId;
					data.footer = footerId;
					data.panel = panelId;
					data.target.push(panelId);
					data.footerAjax = footerAjax;
					theLink.onclick = new Function('args', 'iCM.Calendar.Change(' + Ext.util.JSON.encode(data) + '); return false');
				}
			}
		},
		
		Change: function(data) {
			iCM.Get(data,
				function(target, response) {
					if (target == data.target[0]) {
						iCM.Calendar.Initialise(data.target[0], data.isdrilldown, data.header, data.table, data.panel, data.footer, data.footerAjax);
					}
				},
				function(error) {
					alert('Could not display calendar: ' + error);
				}
			);
		}
	}
}();

iCM.Calendar = Calendar;

