var JobSearch = {
	/**/
	/*Setup everything on the page when it first loads*/
	/**/
	initializePage: function() {
		//Hijack the submit function for our Indeed search
		$('#search').submit(function () {
			JobSearch.initiateNewSearch();
			//Track new searches
			pageTracker._trackPageview('/indeed/newSearch/?'+$('#search').serialize());
			return false;
		});
		//Setup the advanced options link in the search form
		$('#searchAdvancedOptions').toggle(function() {
			$('#searchAdvancedOptions').html('Hide Options');
			$('#searchTabFormAdvancedOuter').slideDown(500);
		}, function() {
			$('#searchAdvancedOptions').html('Show Options');
			$('#searchTabFormAdvancedOuter').slideUp(500);
		});
		//If Google returns a location load it into the appropriate form field
		if (google.loader.ClientLocation) {
			var city = google.loader.ClientLocation.address.city;
			var state = google.loader.ClientLocation.address.region;
			var country = google.loader.ClientLocation.address.country;
			$('#l').val(city +', ' + state);
		};
	//Launch a new search on page load. Use form field elements to drive search.
	this.initiateNewSearch();	
	},
	/**/
	/*Functions to initiate ajax calls*/
	/**/
	//initiates a new search with a new query
	initiateNewSearch: function() {
		var that = this;
		this.clearOldSearch();
		this.setNewSearchTransition();
		var url = 'php/indeedProxy.php';
		var handler = this.handleNewResultsSet;
		$('#searchStart').val(0);
		var formData = $('#search').serialize();
		$.get(url,formData,handler,"xml");
	},
	//Initiates a scroll through the current result set. Activated by clicking on next or prev links
	scrollSearchResults: function(context) {
		var that = this;
		var searchStart = parseInt($('#searchStart').val());
		var searchLimit = parseInt($('#searchLimit').val());
		switch (context) {
			case 'Next':
				$('#searchStart').val(searchStart + searchLimit);
				break;
			case 'Prev':
				$('#searchStart').val(searchStart - searchLimit);
				break;
		}
		this.setScrollSearchTransition();
		var url = 'php/indeedProxy.php';
		var handler = this.handleScrollCurrentResultsSet;
		var formData = $('#search').serialize();
		pageTracker._trackPageview('/indeed/scrollSearch/'+context+'/?'+formData);	
		$.get(url,formData,handler,"xml");
	},
	/**/
	/*Ajax call helpers*/
	/**/
	//A helper function to make sure the old stuff gets cleared out on a new search
	clearOldSearch: function() {
		$('#searchTabResultsHeader').html('');
		$('#searchTabResultsNav').html('');
		$('#searchTabResultsTableBody').html('');
		this.clearOldSearchErrors();
	},
	//A helper function to clear out errors once a new search is initiated
	clearOldSearchErrors: function() {
		$('#searchTabResultsTableOuter').show();
		$('#searchTabResultsError').removeClass('searchTabError').addClass('hidden');
		$('#searchTabResultsError p').html('');
	},
	//A helper function to show a spinner as a new search is taking place
	setNewSearchTransition: function() {
		var outerResultsHeight = $('#searchTabResultsOuter').outerHeight();
		var height = (outerResultsHeight > 400)? outerResultsHeight + 'px' : '400px';
		$('#searchTabResultsOuter').css("height", height)
		$('#searchTabResultsInner').hide();
		$('#searchTabResultsOuter').addClass('loading');
	},
	//A helper function to show a spinner while scrolling the results set
	setScrollSearchTransition: function() {
		var outerResultsHeight =$('#searchTabResultsTableOuter').outerHeight();
		var height = (outerResultsHeight > 200)? outerResultsHeight + 'px' : '200px';
		$('#searchTabResultsTableOuter').css("height", height);
		$('#searchTabResultsTable').hide();
		$('#searchTabResultsOuter').addClass('loading');
	},
	/**/
	/*Callback functions*/
	/**/
	//The callback function for marshalling a new results set
	handleNewResultsSet: function(xml) {
		var meta = JobSearch.calculateSearchMetaData(xml);
		if (meta.totalResults >0) {
			$('#searchTabResultsHeader').html(JobSearch.createSearchResultsHeader(xml));
			JobSearch.insertSearchResultsNav(meta);
			$('#searchTabResultsTableBody').html(JobSearch.createSearchResultsRows(xml));
			$('#searchTabResultsTableBody a[rel*="jobLink1"]').click(function () {
				var pageTracker = _gat._getTracker("UA-2248942-1");
				pageTracker._trackPageview('/indeed/jobClick/firstPresent');
			});
			$('#searchTabResultsTableBody a[rel*="jobLink2"]').click(function () {
				var pageTracker = _gat._getTracker("UA-2248942-1");
				pageTracker._trackPageview('/indeed/jobClick/secondPresent');
			});
			$('#searchTabResultsOuter').removeClass('loading').css("height","");
			$('#searchTabResultsInner').fadeIn(500);
		} else{
			//use JobSearch instead of this because object context lost in callback
			JobSearch.issueSearchResultsError(xml);
		};
	},
	//The callback function for marshalling scrolled results
	handleScrollCurrentResultsSet: function(xml) {
		//use jobSearch instead of this because object context lost in callback
		var meta = JobSearch.calculateSearchMetaData(xml);
		JobSearch.insertSearchResultsNav(meta);
		$('#searchTabResultsTableBody').html(JobSearch.createSearchResultsRows(xml));
		$('#searchTabResultsTableBody a[rel*="jobLink1"]').click(function () {
			var pageTracker = _gat._getTracker("UA-2248942-1");
			pageTracker._trackPageview('/indeed/jobClick/firstPresent');
		});
		$('#searchTabResultsTableBody a[rel*="jobLink2"]').click(function () {
			var pageTracker = _gat._getTracker("UA-2248942-1");
			pageTracker._trackPageview('/indeed/jobClick/secondPresent');
		});
		$('#searchTabResultsTable').fadeIn(500);
		$('#searchTabResultsOuter').removeClass('loading');
		$('#searchTabResultsTableOuter').css("height","");
	},
	/**/
	/*Callback helper functions*/
	/**/
	//A helper function for pulling out meta data from the search results
	calculateSearchMetaData: function(xml) {
		return {
			totalResults: $(xml).find('response > totalresults').eq(0).text(),
			start: $(xml).find('response > start').eq(0).text(),
			end: $(xml).find('response > end').eq(0).text(),
			searchLimit: $('#searchLimit').val()
		};
	},
	//A helper function for  inserting search results navigation
	insertSearchResultsNav: function(meta) {
		var that = this;
		$('#searchTabResultsNav').html(this.createSearchResultsNav(meta.start, meta.end, meta.totalResults, meta.searchLimit));
		$('#searchTabResultsPrevious').click(function(){
			that.scrollSearchResults('Prev');
			return false;
		});
		$('#searchTabResultsNext').click(function(){
			that.scrollSearchResults('Next');
			return false;
		});
	},
	//A helper function to create navigation to scroll through the results set
	createSearchResultsNav: function(start, end, totalResults, searchLimit) {
		var searchResultsNav = '';
		if (start > searchLimit) {
			searchResultsNav += '<a href="#" id="searchTabResultsPrevious">&laquo; Pevious|</a> ';				
		};
		searchResultsNav += start 
			+ '&ndash;' 
			+ end 
			+ ' of ' 
			+ totalResults 
			+ ' total jobs.';
		if (totalResults != end) {
			searchResultsNav += ' <a href="#" id="searchTabResultsNext">|Next &raquo;</a>';				
		};
		return searchResultsNav;
	},	
	//A helper function to insert search errors
	issueSearchResultsError: function(xml) {
		$('#searchTabResultsError p').html(this.createSearchResultsError(xml));	
		$('#searchTabResultsError').removeClass('hidden').addClass('searchTabError');
		$('#searchTabResultsTableOuter').hide();
		$('#searchTabResultsInner').fadeIn(500);
		$('#searchTabResultsOuter').removeClass('loading');
	},
	//Generates the html for search results errors
	createSearchResultsError: function(xml) {
		var query = $(xml).find('response > query').eq(0).text();
		var location = $(xml).find('response > location').eq(0).text();
		return 'Your search for &ldquo;' + query + '&rdquo;' + ' near ' + location + ' failed. Please consider dropping search terms or conditions from the original query. Often searches fail when people try to get too specific.';
	},
	//A helper function to create the header for the results set
	createSearchResultsHeader: function(xml) {
		var query = $(xml).find('response > query').eq(0).text();
		var location = $(xml).find('response > location').eq(0).text();
		if (query=="") {
			return 'Jobs in ' + location;
		} else{
			return '&ldquo;' + query + '&rdquo;' + ' in ' + location;
		};
	},
	//A helper function to create the body of the results set
	createSearchResultsRows: function(xml) {
		var jobResults = $(xml).find('response > results > result')
		var toAppend = '';
		jobResults.each(function(){
			var jobTitle = $(this).find('jobtitle').eq(0).text();
			var company = $(this).find('company').eq(0).text();
			var city = $(this).find('city').eq(0).text();
			var state = $(this).find('state').eq(0).text();
			var snippet = $(this).find('snippet').eq(0).text();
			var url = $(this).find('url').eq(0).text();
			var clickText = $(this).find('onmousedown').eq(0).text();
			var re = /\d+/;
			var jsa = re.exec(clickText);
			payURL = url + '&jsa=' + jsa + '&inchal=apiresults';
			toAppend += '<div class=\"singleResult\">' 
			+ '<p><a href=\"'
			+ payURL
			+ '\" target=\"blank_\"'
			+ 'rel=\"jobLink1\" class=\"jobLink1\">'
			+ jobTitle
			+ '</a></p>' 
			+ '<p class=\"company\">'
			+ '<span class=\"companyName\">' 
			+ company
			+ '</span>'
			+ ' - ' 
			+ '<span class=\"cityState\">'
			+ city + ', ' + state
			+ '</span>'
			+ '</p>'
			+ '<p class=\"snippet\">'
			+ snippet
			+ '</p>'
			+ '<p>'
			+ ' <a href=\"'
			+ payURL
			+ '\" target=\"blank_\"'
			+ 'rel=\"jobLink2\" class=\"jobLink2\">Learn more and apply!</a>'
			+ '</p>'
			+ '</div>';
		});
		return toAppend;
	}
};
