MG.namespace("MG.widget.JobScroller");
MG.widget.JobScroller = (function() {
	var xhrobj;
	var indexStart = 0;
	var totalResults = 0;
	var viewableResults = 0;
	var bufferRows = 3;
	var intervalReset = true;
	var rowHeight = 167;//115;//140;
	var mainContentHeight;
	var numRowsNeeded;

	var acDelay = 350;
	var acTimeout;
	
	var busy = $("#loading");
	
	var scrollerRoot = $("#scroller_wrapper");
	var xhr = {
		cache		: false,
		url			: 'rest.php',
		data		: {},
		success		: _appendPositionsToScroller
	};
	
	var templates = {
		row : [
			'<div class="scroller-job-wrapper">',
				'<h4>{job_name}</h4>',
				'<div class="scroller-job-buttonset">',
					'<input type="button" onclick="MG.widget.JobPosting.showJob(\'{id}\', true);" value="Show More Details"/>',
				'</div>',
				'<div class="job-meta-wrapper">',
					'<dl>',
						'<dt>Compensation</dt><dd>{compensation}</dd>',
						'<dt>Location</dt><dd>{location}</dd>',
						'<dt>Category</dt><dd>{job_category_enum}</dd>',
					'</dl>',
					'<p class="scroller-job-description">{job_description_short}</p>',
					'<div style="clear:both;"></div>',
				'</div>',
			'</div>'		
		].join(""),
		
		no_results : [
			'<div class="scroller-job-wrapper">',
				'<h4>{no_postings_available}</h4>',
			'</div>'		
		].join("")
	};
	
	
	function baseArgs() {
		var kw = $("#job_keywords");

		this.job_category		= $("#job_category").val();
		this.job_industry		= $("#job_industry").val();
		this.employment_type	= $("#employment_type").val();
		this.job_keywords		= (kw.val && kw.val().length > 2) ? kw.val() : '';
		this.action				= 'getMorePositions',
		this.startIndex			= indexStart,
		this.sort				= 'date_modified',
		this.results			= numRowsNeeded,
		this.dir				= 'DESC';
		this.locations			= __getCheckedLocations();
	}
	function __getCheckedLocations() {
		var ret = '';
		$("#location_wrapper input[type=checkbox]").each(function() {
			if(this.checked === true) {
				if(ret != "") {
					ret += ",";
				}
				ret += this.value;
			}
		});
		
		return ret;
	}
	
	
	function newSearch() {
		$("#main_content").scrollTop(0);
		indexStart = 0;
		totalResults = 0;
		viewableResults = 0;
		$("#scroller_wrapper, #viewableResults, #totalResults").empty();
		_setRowsNeeded($("#main_content"));
		_handleGetMorePositions();
	}
	function _handleGetMorePositions() {
		if(totalResults === 0 || viewableResults < totalResults) {
			getMore();
		}
	}
	function getMore() {
		if(numRowsNeeded > 0) {
			xhr.data = new baseArgs();
			busy.show(0);
			if(typeof xhrobj != "undefined" && typeof xhrobj.abort != "undefined") xhrobj.abort();
			xhrobj = $.ajax(MG.util.Async.getConfig(xhr));
		}
	}
	/**
	 * Callback to add 5+ new positions to the scroller
	 */
	function _appendPositionsToScroller(json) {
		var o = $.parseJSON(json);
//gel("burn").innerHTML = o.burned;
		var t = new MG.util.Template(templates.row);
		
		totalResults = o.totalRecords;
		viewableResults += o.recordsReturned;
		
		$("#totalResults").text(totalResults);
		$("#viewableResults").text(viewableResults);
		$("#scroller_wrapper").height(o.totalRecords * rowHeight);
		
		for(var k in o.items) {
			if(o.items.hasOwnProperty(k)) {
				t.applyValues(o.items[k]);
				t.append("scroller_wrapper");
			}
		}
		
		busy.hide(0);
		
		if(indexStart === 0) {
			setTimeout(function() {
				$("#main_content").scrollTop(0);
			}, 10);
		}
		
		indexStart += o.recordsReturned;

		// handle no-results situation
		if(totalResults < 1) {
			t = new MG.util.Template(templates.no_results);
			t.applyValues(MG.strings);
			t.append("scroller_wrapper");
		}
	}
	
	
	function _setRowsNeeded(main) {
		numRowsNeeded = Math.round((main.scrollTop() + main.height()) / rowHeight) + bufferRows - viewableResults;
/*
gel("delta").innerHTML = Math.round((main.scrollTop() + main.height()) / rowHeight);
gel("rn").innerHTML = numRowsNeeded;
gel("st").innerHTML = main.scrollTop();
gel("mh").innerHTML = gel("scroller_wrapper").offsetHeight;
*/
	}
	
	
	
	/**
	 * Initializes the scrolling widget.
	 */
	function initJobScroller() {
		var main = $("#main_content");
		_setRowsNeeded(main);
		var offset = main.height();
		
		var cooldown;
		main.bind("scroll", function() {
			_setRowsNeeded(main);
			if(main.scrollTop() >= ((viewableResults) * rowHeight) - (offset + 1 * rowHeight)) {
				clearTimeout(cooldown);
				cooldown = setTimeout(_handleGetMorePositions, 150);
			}
		});
		
		// bind to selects
		$("#job_filter").find("select").bind("change", newSearch);
		
		// bind to input
		$("#job_keywords").bind("keyup", function() {
			clearTimeout(acTimeout);
			
			if(this.value.length > 1) {
				acTimeout = setTimeout(function() {
					newSearch();
				}, acDelay);
			}
		});
		
		// bind to location checkboxes
		$("#location_wrapper input[type=checkbox]").bind("change, click", function(e) {
			if(this.id == 'location_any') {
				$("#location_wrapper input[class=location_filter]").attr("checked", false);
			}
			newSearch();
		});
		
		// bind toggle adv search link
		var advSearch = $("#advanced_search");
		$("#toggle_advanced_search").bind("click", function() {
			var link = this;
			
			if(advSearch.css("display") == 'none') {
				advSearch.slideDown("500", function() {
					link.innerHTML = "Hide Advanced Search";
					scrollerRoot.css("marginTop", gel('job_filter_wrapper').offsetHeight + 15 + "px");
				});
				
			} else {
				advSearch.slideUp("400", function() {
					link.innerHTML = "Advanced Search";
					scrollerRoot.css("marginTop", "65px");
				});
			}
			
			gel("job_keywords").focus();
		});
		
		_handleGetMorePositions();
	}
	
	return {
		getMore	: getMore,
		init	: initJobScroller
	}
})();
