//-------------------------------
// Class
//-------------------------------

function NewsController() {

	var _self = this;
	

	//-------------------------------
	// Constants
	//-------------------------------


	//-------------------------------
	// Properties
	//-------------------------------
	
	for (var n in arguments[0]) { this[n] = arguments[0][n]; }
	
	var _dataCollectionArr = _self.data || [], _currentDataCollectionArr, _current;
	
	var _newsView;
	
	//-------------------------------
	// Constructor
	//-------------------------------
	
	$j(function() {
		_newsView = new NewsView();
		
		$j(_newsView).bind(_newsView.CLEAR_SEARCH, onSearchClear);

		init();
	});
	
	//-------------------------------
	// Public Methods
	//-------------------------------
	
	//-------------------------------
	// Private Methods
	//-------------------------------
	
	function init() {
		
		$j("ul#categories").accordion({ active: false, autoHeight: false, collapsible: true, header: "h3.hdr" });
		
		$j("ul#categories h3.hdr").bind("click", onCategoryClick);
		$j("ul#categories h3.hdr.dropdown").toggle(onDropdownDisplay, onDropdownHide);
		$j("ul#categories ul.stretcher > li").bind("click", onSubCategoryClick);
		$j("a#submit").bind("click", onSearchFilterClick);
		$j("ul#categories ul.stretcher").css("visibility", "visible");
		$j("#overlay-a").click(function() { $j("ul#categories h3.hdr.selected").trigger("click"); });
		$j("input#search").bind("keyup", onInputEnter).keyup();
		
		$j("#pagination").show();
		$j("h3#all").click();
	}
	
	function filterAll(data) {
		var firstArr = [];
		var secondArr = [];

		for (var type in data) {
			data[type].sort(sortDate);
			
			$j(data[type]).each(function(i, item) {
				if(i < ((item.type == "news") ? 5 : 2)) firstArr.push(item);
				else secondArr.push(item);
			});
		}

		firstArr.sort(sortDate);
		secondArr.sort(sortDate);
		
		var tmpArr = firstArr.concat(secondArr);
		
		setPagination(_currentDataCollectionArr = tmpArr);
	}
		
	function filterCategory(data) {
		setPagination(_currentDataCollectionArr = data);
	}
	
	function filterNewsCategory(category, data) {
		var tmpArr = [];
		
		//alert($j(data[0].content).find("category").text());
		
		$j(data).each(function(i, item) {
			if($j(item.content).find("category").text() == category) tmpArr.push(item);
		});
		
		if(tmpArr.length) setPagination(_currentDataCollectionArr = tmpArr);
		else _newsView.noresult(category);
	}
	
	function filterSourceCategory(category, data) {
		var tmpArr = [];
		
		$j(data).each(function(i, item) {
			if(item.com == category) tmpArr.push(item);
		});
		
		setPagination(_currentDataCollectionArr = tmpArr);
	}
	
	function setPagination(data) {
		$j("#pagination").pagination(data.length, { callback: pageselectCallback, data: data, items_per_page: 15, num_display_entries: 15 });
	}
	
	function sortDate(a, b) {
		return new Date($j(b.content).find("pubDate").text()) - new Date($j(a.content).find("pubDate").text());
	}
	
	function displayOverlay() {
		$j("#overlay-a").show().css("height", ($j("body").height() - $j("#overlay-a").offset().top) + "px");
	}
	
	function hideOverlay() {
		$j("#overlay-a").hide();
	}
	
	//-------------------------------
	// Listeners
	//-------------------------------
	
	function pageselectCallback(index, data, jq){
        _newsView.deploy(data, index);
        return false;
    }
    
    function onDropdownDisplay(event) {
    	$j(this).removeClass("chosen");
    	
    	if($j("#overlay-a").is(":visible")) $j("#overlay-a").hide();
		else displayOverlay();	
    }

	function onDropdownHide(event) {
		$j(this).addClass("chosen");
		
		if($j("#overlay-a").is(":visible")) $j("#overlay-a").hide();
		else displayOverlay();
	}
		
	function onCategoryClick(event) {
		if($j(event.target).attr("selected") == true || $j(event.target).attr("selected") == "true") return false;

		if(event.target.id != "news" || event.target.id != "blogs") {
			$j("#overlay-a").hide();
		}
				
		_newsView.search.hide();

		switch(event.target.id) {
			case "all" :
				filterAll(_dataCollectionArr);
				break;
			default :
				$j("ul.stretcher > li", $j(event.target).parent()).removeClass("selected");
				$j("ul.stretcher > li.all", $j(event.target).parent()).addClass("selected");
				filterCategory(_dataCollectionArr[event.target.id]);
				break;
		}
		
		_current = event.target.id;
		
		$j("ul#categories h3.hdr").removeClass("selected chosen").attr("selected", false);
		$j(event.target).addClass("selected").attr("selected", true);
		
	}
	
	function onSubCategoryClick(event) {
		var parent = $j(event.target).parent().parent();
		
		_newsView.search.hide();
		
		if($j(event.target).text() == "All") {
			filterCategory(_dataCollectionArr[$j("h3", parent).attr("id")]);
		} else {
			switch($j("h3", parent).attr("id")) {
				case "news" :
					filterNewsCategory($j(event.target).text(), _dataCollectionArr[$j("h3", parent).attr("id")]);
					break;
				default :
					filterSourceCategory($j(event.target).attr("class"), _dataCollectionArr[$j("h3", parent).attr("id")]);
					break;			
			}
		}
		
		_current = $j("h3", parent).attr("id");
	
		
		$j("ul#categories").accordion({ active: false });
		$j("ul#categories ul.stretcher > li").removeClass("selected");
		$j(event.target).addClass("selected");
		hideOverlay();
	}

	function onSearchFilterClick() {
		
		if($j("ul#categories li ul.stretcher").is(":visible")) $j("ul#categories").accordion({ active: false });
		var result = $j("input#search").xmlsearch(_currentDataCollectionArr);
		var terms = (_current == "news" || _current == "blogs") ? $j("ul#categories li ul.stretcher li.selected").text() : $j("#" + _current).text();
		
		if(result.length) {
			
			_newsView.search.result(result.length, $j("input#search").val(), terms);
			setPagination(result);	
		}
		else {
			_newsView.search.noresult(result.length, $j("input#search").val(), terms);
		}
		
		return false;
	}
	
	function onSearchClear() {
		
		$j("ul#categories").accordion({ active: false });
		filterAll(_dataCollectionArr);
		_newsView.search.hide();
	}
	
	function onInputEnter(event) {
		if($j(event.target).val()) $j("label#label-clear").show();
		else $j("label#label-clear").hide();
	}
	
	//-------------------------------
	// Setters/Getters
	//-------------------------------

	_self.__defineGetter__("currentData", function() { return _currentDataCollectionArr; });
}
