var ec = (function(jQuery)
{
	return 	{
		items: {},
		customer: "",
		page: "",
		calendarFilter: null,
		itemPerPage: 10,
		maxShownPages: 10,
		currentPage: 0,
		order: null, 
		timePeriod: null,
		basePath: "/eventcalendar/",
		eventsUrl: "/eventkalender/events.html",
		calendarsUrl: "/eventkalender/kalender.html",

		init: function(customer, page) 
		{
			ec.customer = customer;
			ec.page = page;
			
			jQuery(".search input").bind("keydown", function(event)
			{
				if (event.keyCode == '13') 
				{
					ec.search();
				}
			});
			jQuery(".search a.go").bind("click", function(event)
			{
				ec.search();
			});
			jQuery(".search img.clear").bind("click", function(event)
			{
				jQuery("#term").val("");
				ec.search();
			});
			jQuery(".paging .first").bind("click", function(event)
			{
				ec.first();
			});
			jQuery(".paging .prev").bind("click", function(event)
			{
				ec.prev();
			});
			jQuery(".paging .next").bind("click", function(event)
			{
				ec.next();
			});
			jQuery(".paging .last").bind("click", function(event)
			{
				ec.last();
			});
			jQuery(".toolbar .itemsPerPage").bind("change", function(event)
			{
				ec.itemPerPage = jQuery(this).val();
				ec.update();
			});
			jQuery(".toolbar .order").bind("change", function(event)
			{
				ec.order = jQuery(this).val();
				if (ec.calendarFilter != null)
				{
					ec.executeRestCall(ec.calendarFilter);
				}
				else
				{
					ec.executeRestCall("jcal/events");
				}
			});
			
			jQuery(".toolbar .timePeriod").bind("change", function(event)
			{
				ec.timePeriod = jQuery(".timePeriod select").val();
				ec.executeRestCall("jcal/events");
			});
			
		},
	
		executeRestCall: function(restUri)
		{
			if (ec.order != null)
			{
				restUri = ec.addParam(restUri, "order", ec.order);
			}
			
			if (ec.timePeriod != null)
			{
				restUri = ec.addParam(restUri, "timePeriod", ec.timePeriod);
			}

			jQuery.getJSON(ec.basePath + restUri, function(data) 
			{
				if (ec.calendarFilter != null)
				{
					ec.items = data.vevent;
					ec.addFilterCalendar(data);
					jQuery(".head").hide();
					jQuery(".search").hide();
					jQuery(".filterCalendar").show();
					jQuery(".toolbar a.back").css("display", "block");
				}
				else
				{
					ec.items = data;
				}
				ec.update();
			});
		},
		
		load: function()
		{
			if (ec.page == "events")
			{
				var calendarUri = jQuery.url.param("calendar");
				
				if (calendarUri != null)
				{
					ec.calendarFilter = "jcal/calendar/" + calendarUri;
					ec.executeRestCall(ec.calendarFilter);
				}
				else
				{
					ec.executeRestCall("jcal/events");
					jQuery(".timePeriod").show();
				}
			}
			else
			{
				ec.executeRestCall("jcal/calendars");
			}
		},
		
		search: function()
		{
			var searchTerm = escape(jQuery("#term").val());
			ec.currentPage = 0;
			if (ec.page == "events")
			{
				ec.executeRestCall("jcal/events/search/" + searchTerm);
			}
			else
			{
				ec.executeRestCall("jcal/calendars/search/" + searchTerm);
			}
		},
		
		update: function() 
		{
			jQuery(".list").empty();

			if (ec.items.length > ec.itemPerPage)
			{
				jQuery(".paging").show();
			}
			else
			{
				jQuery(".paging").hide();
			}
			
			var start = ec.currentPage * ec.itemPerPage;
			var end = (ec.currentPage + 1) * ec.itemPerPage;
			if (ec.items.length < end) end = ec.items.length;
			
			for ( var i = start; i < end; i++) 
			{
				if (ec.page == "events")
				{
					ec.addEvent(ec.items[i]);			
				}
				else
				{
					ec.addCalendar(ec.items[i]);			
				}
			}
			
			if (ec.currentPage == 0)
			{
				jQuery(".paging .prev").hide();
				jQuery(".paging .first").hide();
			}
			else
			{
				jQuery(".paging .prev").show();
				jQuery(".paging .first").show();
			}
			
			if (end < ec.items.length) 
			{
				jQuery(".paging .next").show();
				jQuery(".paging .last").show();
			}
			else
			{
				jQuery(".paging .next").hide();
				jQuery(".paging .last").hide();
			}
			
			ec.paging.update();
		},
		
		first: function()
		{
			ec.currentPage = 0;
			ec.update();
		},
		next: function()
		{
			ec.currentPage++;
			ec.update();
		},
		
		prev: function()
		{
			ec.currentPage--;
			ec.update();
		},
		last: function()
		{
			ec.currentPage = Math.ceil(ec.items.length / ec.itemPerPage) - 1;
			ec.update();
		},

		jumpTo: function(page)
		{
			ec.currentPage = page;
			ec.update();
		},
	
		addCalendar: function(item) 
		{
			var itemHtml = "<div class=\"item\">" + 
			"<div class=\"icon\"><img src=\"" + ec.basePath + "logo/" + item.xSbdId + "\"/></div>" +
			"<div class=\"properties\"><a href=\"" + ec.eventsUrl + "?c=" + ec.customer + "&calendar=" + item.xSbdUri + "\">Events</a></div>" +
			"<div class=\"description\"><h2><a href=\"" + ec.eventsUrl + "?c=" + ec.customer + "&calendar=" + item.xSbdUri + "\">" + item.xSbdName + "</a></h2><p>" + item.xSbdDescription + "</p></div>" +
			"</div>";

			jQuery(".list").append(itemHtml);
		},
		
		addFilterCalendar: function(item)
		{
			var itemHtml = "<div class=\"icon\"><img src=\"" + ec.basePath + "logo/" + item.xSbdId + "\"/></div>" +
			"<div class=\"description\"><h1>" + item.xSbdName + "</h1><p>" + item.xSbdDescription + "</p></div>";

			jQuery(".filterCalendar").empty();
			jQuery(".filterCalendar").append(itemHtml);
		},
		
		addEvent: function(item)
		{
			var itemHtml = "<div class=\"item\">" + 
			"<div class=\"icon\"><img src=\"" + ec.basePath + "logo/" + item.xSbdUserName + "\"/></div>" +
			"<div class=\"properties\"><p>" + item.xSbdDateAsString + "</p><p>" + item.xSbdTimeAsString + "</p><p>" + item.location + "</p></div>" +
			"<div class=\"description\"><h2>" + item.summary + "</h2><p>" + item.description + "</p></div>" +
			"</div>";

			jQuery(".list").append(itemHtml);
		},
		
		
		paging:
		{
			update: function()
			{
				var totalPages = Math.ceil(ec.items.length / ec.itemPerPage);
				var startPage = Math.min(Math.max(ec.currentPage - (ec.maxShownPages / 2), 0), Math.max(0, totalPages - ec.itemPerPage));
				var pages = Math.min(ec.maxShownPages, totalPages);
				var endPage = startPage + pages;
				var pageLinks = "";
				for (var i=startPage; i<endPage; i++)
				{
					if (i == ec.currentPage)
					{
						pageLinks += "<a class=\"selected\">" + (i + 1) + "</a>";
					}
					else
					{
						pageLinks += "<a onclick=\"ec.jumpTo(" + i + ");\">" + (i + 1) + "</a>";
					}
				}
				
				jQuery(".paging span").html(pageLinks);
			}
		},
		
		addParam: function(uri, key, value)
		{
			if (uri.indexOf("?") != -1)
			{
				return uri + "&" + key + "=" + value;
			}
			else
			{
				return uri + "?" + key + "=" + value;
			}
		}
	}
})(jQuery);

