﻿Event.attach(document, "DOMContentLoaded", function() {
	var searchStatus = $i("search-status");
	var events = {
		ie6: false /*@cc_on || @_jscript_version < 5.7 @*/,
		copyNode: $i("copy"),
		eventsList: new EventsList($i("events")),
		noResultsMsg: null,
		loadingMsg: null,
		search: new Search($i("search")),
		searchStatus: searchStatus,
		searchSummary: $t("p", searchStatus)[0],
		searchCategory: $t("h5", searchStatus)[0],
		typeTabs: new Tabs($c("tabs", "ul", $i("cap"))[0], null, null, null, 0),
		calendar: new Calendar($i("calendar"), new Date()),
		categories: new Categories($i("navCategories")),
		categoryName: $t("h5", searchStatus)[0],
		sidebar: {
			ongoing: $i("sidebar-ongoing"),
			allOngoingLink: null,
			upcoming: $i("sidebar-upcoming"),
			allUpcomingLink: null
		},
		pagination: $i("pagination")
	};
	
	events.noResultsMsg = $c("noResultsMsg", "tbody", events.eventsList.list)[0];
	events.loadingMsg = $c("loadingMsg", "tbody", events.eventsList.list)[0];
	
	// Ongoing, upcoming tabs
	Event.attach(events.typeTabs, "change", function(newTab, oldTab) {
		var type = Search.searchTypes[(newTab.anchor.id == "upcoming-tab" ? "UPCOMING" : "ONGOING")];
		Class[type == Search.searchTypes.UPCOMING ? "add" : "remove"](this.sidebar.ongoing, "selected");
		Class[type == Search.searchTypes.ONGOING ? "add" : "remove"](this.sidebar.upcoming, "selected");
		
		this.search.setSearchType(type);
		this.search.setPage(1);
	}, events);
	
	// Sidebar events list
	events.sidebar.allOngoingLink = $c("more", "a", events.sidebar.ongoing)[0];
	events.sidebar.allUpcomingLink = $c("more", "a", events.sidebar.upcoming)[0];
	var selectTab = function() { this.container.select(this); };
	Event.attach(events.sidebar.allOngoingLink, "click", selectTab, events.typeTabs.tabs[1], [ Event.actions.PREVENT_DEFAULT ]);
	Event.attach(events.sidebar.allUpcomingLink, "click", selectTab, events.typeTabs.tabs[0], [ Event.actions.PREVENT_DEFAULT ]);
	
	// Clear search link
	Event.attach($t("a", searchStatus)[0], "click", function() { this.search.clearSearch(); }, events, [ Event.actions.PREVENT_DEFAULT ]);
	
	// Categories list
	Event.attach(events.categories, "change", function(categoryID) {
		this.search.setCategory(categoryID);
		this.search.setPage(1);
		//this.search.submit();
	}, events);
	
	// Calendar
	Event.attach(events.calendar, "change", function(newDate, oldDate) {
		this.setDate(newDate);
		this.setPage(1);
	}, events.search);
	
	// Pagination
	Event.attach($t("a", $c("prev", "li", events.pagination)[0])[0], "click", events.search.prevPage, events.search, [ Event.actions.PREVENT_DEFAULT ]);
	Event.attach($t("a", $c("next", "li", events.pagination)[0])[0], "click", events.search.nextPage, events.search, [ Event.actions.PREVENT_DEFAULT ]);
	Event.attach(events.search, "page", function(page, total) {
		Class[page == 1 ? "add" : "remove"](this, "first");
		Class[page == total || total === 0 ? "add" : "remove"](this, "last");
	}, events.pagination);
	
	// Loading indicator on search
	Event.attach(events.search, "beforesubmit", function() {
		Class.remove(this.eventsList.list, "noresults");
		Class.add(this.eventsList.list, "loading");
		
		// Hide pagination while loading.
		Class.add(this.pagination, "first");
		Class.add(this.pagination, "last");
		
		// Select the current date
		var date = this.search.getDate();
		this.calendar.setDate(date ? new Date(Date.parse(date)) : new Date());
		
		// Select the current type tab
		var type = this.search.getSearchType();
		this.typeTabs.select(this.typeTabs.tabs[type == "ongoing" ? 1 : 0]);
		
		// Select the current category tab
		var category = this.search.getCategory();
		if (category) {
			this.categories.selectID(category);
		} else {
			this.categories.clear();
		}
	}, events);
	
	// RSS subscription link
	Event.attach($i("subscribe"), "click", function() {
		var hash = this.hash.getValues();
		var url = "/subscribe/Default.aspx";
		if (hash.categoryIDs) {
			url += "?categoryID=" + hash.categoryIDs;
		}
		
		window.location.href = url;
		
		/*
		var p=this.hash.getValues();
		delete p["pageNumber"];
		delete p["pageSize"];
		window.location.href="/subscribe/Default.aspx?q="+escape(JSON.toJSON(p));
		*/
	}, events.search, [ Event.actions.PREVENT_DEFAULT ]);
	
	// Search response
	var categoryRe = /[^\w]/g;
	Event.attach(events.search, "submit", function(response) {
		this.searchSummary.innerHTML = (response.Description || "");
		this.searchStatus.className = (response.Description ? "hassearch" : "");
		
		var types = this.search.getProperty("types");
		var categoryNode = $i("category-" + this.categories.selected);
		this.searchCategory.innerHTML = (types == "ongoing" ? "Ongoing" : "Upcoming") + " " + (categoryNode ? categoryNode.innerHTML + " " : "") + "Events";
		this.searchCategory.className = (response.CssFriendlyCategory.length > 0 ? response.CssFriendlyCategory : "nocategory");
		
		try {
			Class.remove(this.searchCategory, "sIFR-replaced");
			sIFRize();
		} catch(er) {}
		
		var list = this.eventsList;
		var parent = list.list;
		
		// Remove tbody tags
		var tbodys = Array.toArray($t("tbody", parent));
		var tbody;
		while (tbody = tbodys.pop()) {
			if (this.ie6) {
				// Can't remove tbody tags in IE6. Hide them instead.
				tbody.style.display = "none";
			} else {
				tbody.parentNode.removeChild(tbody);
			}
		}
		
		// Add new events to the list
		var dates = response.Results;
		var count = 0;
		var search = Hash.getHash();
		for (var i = 0, date; date = dates[i]; i++) {
			var tbody = createElement("tbody");
			var evs = date.Events;
			for (var j = 0, ev; ev = evs[j]; j++) {
				var row = list.rows[count];
				row.populate(tbody, ev, search);
				Class[j == 0 ? "add" : "remove"](row.row, "first");
				count++;
			}
			parent.appendChild(tbody);
		}
		
		var ongoing = (this.search.getProperty("types") == "ongoing");
		Class[ongoing ? "add" : "remove"](parent, "ongoing");
		Class[!ongoing ? "add" : "remove"](parent, "upcoming");
		
		// No results message
		var noResults = (response.TotalPages === 0);
		Class[noResults ? "add" : "remove"](parent, "noresults");
		if (noResults) {
			parent.appendChild(this.noResultsMsg);
		}
		
		// Loading message
		parent.appendChild(this.loadingMsg);
		Class.remove(parent, "loading");
	}, events);
	
	// Grab the current page and total pages from the global variables.
	if (!events.search.getPage()) {
		events.search.setPage(eventPageNumber, eventTotalPages);
	}
});