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) {
			// Alter month changing links for title
			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;
				theLink.onclick = new Function('args', 'iCM.Calendar.Change(' + Ext.util.JSON.encode(data) + '); return false');
			}

			if (footerId) {
				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.panel = panelId;
					theLink.onclick = new Function('args', 'iCM.Calendar.Change(' + Ext.util.JSON.encode(data) + '); return false');
				}
			}
			
			if (!isdrilldown)
			{
				// If this is not a drilldown calendar, 
				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);
					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);
					}
				},
				function(error) {
					alert('Could not display calendar: ' + error);
				}
			);
		}
	}
}();

iCM.Calendar = Calendar;
