﻿	
	/***************************** GLOBAL PATHS : MUST UPDATE ****************************************/
	var recruiterURL =  '/resultsrecdir';//url for AJAX request: BOTH recruter and company search call this same page
	var jobSearchURL = 'results';//job search AJAX url	
	var divertSearchEngineFlag = '';
	/**************************************************************************************************/

	//add slider controls
//	function addControls() {
	function addControls(isal, isah, idt) {
 		try{

			isal = isal / 1000;
			isah = isah / 1000;
			var salarray = new Array(isal, isah);
	 		var handles= ['salaryHandle1', 'salaryHandle2'];
			 var slider = new Control.JJJSlider(handles,'salaryTrack',{
//			sliderValue:[jjjApp.savedSettings.getMember('sal')/1000,jjjApp.savedSettings.getMember('sah')/1000],
			sliderValue:[isal ,isah],
			range:$R(0,200),
			restricted:true,
			onSlide:updateSalary,
	        onChange:updateSalary});
			
			var handle = 'dateHandle';
			 var slider2 = new Control.Slider(handle,'dateTrack',{
//			sliderValue:jjjApp.savedSettings.getMember('dt'),
			sliderValue:idt,
			range:$R(1,30),
			onSlide:updateDate,
	        onChange:updateDate});

			updateSalaryDisplay(salarray);
			jjjApp.savedSettings.setMember('sal', isal * 1000);
			jjjApp.savedSettings.setMember('sah', isah * 1000);
			updateDateDisplay(idt);
			jjjApp.savedSettings.setMember('dt',idt);
			jjjApp.savedSettings.saveSettings();

 		}catch(e){
 			printDebug("addControls()",e);
 		}
 	}

	//updates Salary Slider object with low and high salary selected, fetches search results.
	function updateSalary(v) {

		updateSalaryDisplay(v);
		var update = false;
		try{
			var sal = parseInt(v[0]) * 1000;
			//only update user select new settings
			if(jjjApp.savedSettings.getMember('sal') != sal){
				jjjApp.savedSettings.setMember('sal', sal);
				update = true;
			}

			var sah = parseInt(v[1]) * 1000;
			if(jjjApp.savedSettings.getMember('sah') != sah){
				jjjApp.savedSettings.setMember('sah', sah);
				update = true;
			}

			jjjApp.savedSettings.saveSettings();

			if(update)
			{
				//jjjSearch.searchRecruiters();
				//jjjSearch.getResults();
				jjjSearch.lazyFetch();

			}
		}
		catch(e){
			printDebug("updateSalary()",e);
		}
		
	}

	//updates the GUI
	function updateSalaryDisplay(v) {
		$('lowSalary').innerHTML = '￥' + parseInt(v[0]);

		if (parseInt(v[0]) != 0)  {
			$('lowSalary').innerHTML += ",000";
		}
		$('highSalary').innerHTML = '￥' + parseInt(v[1]);
		if (parseInt(v[1]) != 0)  {
			$('highSalary').innerHTML += ",000";
		}

		// Add a Plus sign if highSalary = 200,000.
		if (parseInt(v[1]) == 200) {
			$('highSalary').innerHTML += "+";
		}

		$('lowSalary2').innerHTML = '(from <b>' + $('lowSalary').innerHTML + '</b>';
		$('highSalary2').innerHTML = '<b>' + $('highSalary').innerHTML + '</b>)';

	}
	
	//updates Date Slider object with date selected, fetches search results. 
	function updateDate(v) {

		updateDateDisplay(v);
		var update = false;
		try{
			//only update user select new settings
			if(jjjApp.savedSettings.getMember('dt') != parseInt(v)){
				jjjApp.savedSettings.setMember('dt',parseInt(v));
				update = true;
			}
			
			jjjApp.savedSettings.saveSettings();

			if(update) {
				//jjjSearch.searchRecruiters();
				//jjjSearch.getResults();
				jjjSearch.lazyFetch();
			}
		} catch(e){
			printDebug("updateDate()",e);
		}
		
	}
	
	//updates the GUI
	function updateDateDisplay(v) {
		if (parseInt(v) == 1) {
			$('dateLabel').innerHTML = '(<b>Jobs Listed Today</b>)';
		} else {
			$('dateLabel').innerHTML = '(last <b>' + parseInt(v) + ' days</b>)';
		}
	}

	/******* begin search controller *********/

	 function JJJSearchController(template, extraParams) {

		// Initialise default values
		this.resultshidden = false;
		this.templateToUse = (template) ? template : 'searchAsyncSimple.tmpl';
		this.extraParams = (extraParams) ? extraParams : '';
		this.ajaxObjects = new Object();//assocative array to hold ajax objects

		// Register global responders that will occur on all AJAX requests
		var obj = this;
		Ajax.Responders.register({
			
			onCreate: function(request) {

				request['timeoutId'] = window.setTimeout(
					
					function() {
						
						// If we have hit the timeout and the AJAX request is active, abort it and let the user know
						
						if (callInProgress(request.transport)) {
							request.transport.abort();
							//showFailureMessage();
							obj.hideLoader();
							obj.printError('The server did not respond.');

							// Run the onFailure method if we set one up when creating the AJAX object
							if (request.options['onFailure']) {							
								request.options['onFailure'](request.transport, request.json);
							}
						}
				
					},30000);
			},

			onComplete: function(request) {
				// Clear the timeout, the request completed ok
					window.clearTimeout(request['timeoutId']);
				}
		});
	 }
 	
	JJJSearchController.prototype.printError = function(message) {
		
		var el = $('infoBox');
		if(el != undefined)
			el.parentNode.removeChild(el);

		//create div and set attributes
		el = document.createElement('div');
		el.setAttribute('id','infoBox' );
		el.innerHTML = message;

		//insert the div before all else in the DOM's body
		var parent = document.getElementsByTagName('body').item(0);
		parent.insertBefore(el,parent.firstChild);
		new Effect.Center('infoBox');
		new Effect.Fade('infoBox',{duration:6,transition: Effect.Transitions.sinoidal});
	}

	/*********************************
	* Called by XMLHttpRequest
	* when complete updates content with
	* requested document
	**********************************/
	JJJSearchController.prototype.updateJobSearch = function(dr) {
 
		this.hideLoader();
		
		//get the string from the request object
		var doc = dr.responseText;
		//create a new node to store html dom passed from ajax
		var tempNode = document.createElement('div');
		//create the html
		tempNode.innerHTML = doc;

		//get array of the container divs
		var nodes = tempNode.childNodes;

		//update content for required elements

		//find and update paging links
		var page = findNodeById('paging',nodes);
		this.updatePaging(page);
		
		//find and update jotd results
		if (document.getElementById('jobsOfTheDay')) {
			this.updateResultsJOD(findNodeById('jobsOfTheDay',nodes));
		}

		//find and update results
		var results = findNodeById('results',nodes);
		if (divertSearchEngineFlag) {
			this.updateResults(results, 0);
		} else {
			this.updateResults(results, 1);
		}

		var count = findNodeById('resultCount',nodes);
		if (count) {
		} else {
			var resultsHeader = findNodeById('resultsHeader',nodes);
			if (resultsHeader) {
				var nodes2 = resultsHeader.childNodes;
				count = findNodeById('resultCount',nodes2);
			}
		}
		if (count) {
			this.updateCount(count);
		}

		var header1 = findNodeById('header1',nodes);
		if (h1 = document.getElementById('header1')) {
			h1.innerHTML = header1.innerHTML;
		}

		jjjApp.selectBookmarkedJobs();
		
		//call the ujsCallback function, if there is one
		if (window.ujsCallback) {
		   ujsCallback()
		}

	}
	
	JJJSearchController.prototype.updateJobSearchAds = function(dr) {

		//get the string from the request object
		var doc = dr.responseText;
		//create a new node to store html dom passed from ajax
		var tempNode = document.createElement('div');
		//$('output').innerHTML = doc;
		//create the html
		tempNode.innerHTML = doc;

		//get array of the container divs
		var nodes = tempNode.childNodes;

		//find and update ads
		var ads = findNodeById('advertising',nodes);
		this.updateAds(ads);

	}
	
	//replace the add container with new content
	JJJSearchController.prototype.updatePaging = function(page) {

		try {
			if(page!=false) {
				//var children = ads.childNodes;
				replaceChildNode($('jobsForm'),page);
			}

		} catch(e) {
			printDebug("updatePaging",e);
		}
	}

	//replace the count container with new content
	JJJSearchController.prototype.updateCount = function(count) {
		try {
			if(count!=false) {
				//var children = ads.childNodes;
				if (document.getElementById('resultsHeader')) {
					replaceChildNode($('resultsHeader'),count);
				} else {
					replaceChildNode($('content'),count);
				}
			}
		} catch(e) {
			printDebug("updateCount",e);
		}
	}

	//replace the add container with new content
	JJJSearchController.prototype.updateAds = function(ads) {
		try {
			if(ads!=false) {
				//var children = ads.childNodes;
				replaceChildNode($('adreplace'),ads);
			}
		} catch(e) {
			printDebug("updateAds",e);
		}
	}

	//replace the results container with new content
	// and add a hotlist checkbox to each job
	JJJSearchController.prototype.updateResults = function(results, pyr) {
		try {
			if (results != false) {
				var children = results.childNodes;
				var activeFlag = 0;
				function _showHideDiv(div_id) {
					if (div = document.getElementById(div_id)) {
						div.style.display = (activeFlag) ? "none" : "block";
					}
				}
				//loop throught child jobs
				
				for(var i = 0;i<children.length;i++) {
					if((children[i].nodeName == "DIV")&&(children[i].className!="clear")) {
						//only worry about divs
						//hide for effects
						children[i].style.display = "none";	
					}
					if((children[i].nodeName == "DIV")&&(children[i].id == "jobsExceed")) {
						activeFlag = 1;
					}
				}

				// Either show or hide divs depending on "jobsExceed"
				_showHideDiv('resultLinks');
				_showHideDiv('sortMenu');
				_showHideDiv('paging');
				_showHideDiv('jsRegister');

				//Need to insert a heading only if we are called by the job search engine.
				//If we are called by Recruiter directory Don't print heading.
				//if (pyr) {
				//	var title = document.createElement('h5');
				//	title.innerHTML = 'Your Results';
				//	results.insertBefore(title, results.firstChild);
				//}
				//add the results
				replaceChildNode($('jobsForm'),results);
				
				//add effects to queue for each result
				for(var j = 0; j < children.length; j++) {
					if((children[j].nodeName == "DIV")&&(children[j].className!="clear")) {
						new Effect.Appear(children[j].id,{duration:0.015,queue: 'end'});//pretty effects
					}
				}
			}

		} catch(e) {
			printDebug("updateResults()",e);	
		}
		
	}

	// Replace the JOD container with new content and add a hotlist checkbox to each job.
	JJJSearchController.prototype.updateResultsJOD = function(results) {
		try {
			if(results != false) {
				var children = results.childNodes;
				//loop throught child jobs
				for(var i = 0;i < children.length ;i++) {
					if((children[i].nodeName == "DIV")&&(children[i].className != "clear")){
						//only worry about divs
						//hide for effects
						children[i].style.display = "none";
					}
				}
				var title = document.createElement('h5');
				title.innerHTML = 'Jobs of the Day';

				if (children.length > 2) {
					results.insertBefore(title, results.firstChild);
				}
				//add the results
				replaceChildNode($('jobsForm'), results);
				
				//add effects to queue for each result
				for(var j = 0; j < children.length; j++) {
					if((children[j].nodeName == "DIV")&&(children[j].className != "clear")) {
						//pretty effects
						new Effect.Appear(children[j].id,{duration:0.015,queue: 'end'});
					}
				}
			}
		} catch(e) {	
			printDebug("updateResultsJOD()",e);	
		}
	}
	
	//replace the tags container with new content
	JJJSearchController.prototype.updateTags = function(tags) {
		try {
			if(tags!=false) {
				var children = tags.childNodes;
				//loop through array oj child tags
				/*for(var i = 0;i<children.length;i++)
				{
					if(children[i].nodeName == "DIV"){
					children[i].style.color = "#ff0000";//set color for fun
					}
				}*/
				replaceChildNode($('tagContainer'),tags);
			}

		} catch(e) {
			printDebug("updateTags()",e);
		}
	}

	/*********************************
	* Called by XMLHttpRequest
	* when complete updates content with
	* requested document
	**********************************/
	JJJSearchController.prototype.updateRecruiter = function(dr) {

		this.hideLoader();

		//get the string from the request object
		var doc = dr.responseText;
		//create a new node to store html dom passed from ajax
		var tempNode = document.createElement('div');
		//$('output').innerHTML = doc;
		//create the html
		tempNode.innerHTML = doc;

		//get array of the container divs
		var nodes = tempNode.childNodes;

		//find and update results
		var results = findNodeById('results',nodes);
		this.updateResults(results, 0);

		var page = findNodeById('paging',nodes);
		this.updatePaging(page);

	}

	/**
	* Gets recruiters lazy by using a timer before calling
	* request
	*/
	JJJSearchController.prototype.lazyFetchRecruiters = function() {
		window.clearTimeout(this.ajaxWait);
		var app = this;
		this.ajaxWait = window.setTimeout(function(){ app.searchRecruiters(); },1000);
	}

	JJJSearchController.prototype.searchRecruiters = function() {
		var d = new Date();
		var time = d.getTime();
		var searchParams = jjjApp.savedSettings.toURLString();
		var app = this;//save this for callback
		var url = recruiterURL;//url to load

		//create  request object
		var pars = searchParams + '&tp=searchAsyncSimpleRecDir.tmpl' + '&bs=36' + '&time=' + time;//add time to ensure ie does not cache

		//abort all objects if they exist
		for (objects in this.ajaxObjects) {
			if (callInProgress(this.ajaxObjects[objects].transport)) {
				this.ajaxObjects[objects].transport.abort();
				//this.hideLoader();
				window.clearTimeout(this.ajaxObjects[objects]['timeoutId']);
			}
			this.ajaxObjects[objects] = null;
		}

		this.ajaxObjects['recruiterUpdater'] = new Ajax.Request( 
			url, 
			{
				method: 'get', 
				parameters: pars,
				onLoading:function(){app.showLoader();},
				onComplete: function(obj){ app.resultshidden = false; app.updateRecruiter(obj);}
			});
		this.hideResults();
	}
	
	/**
	* Gets results lazy by using a timer before calling
	* request
	*/
	JJJSearchController.prototype.lazyFetch = function() {
		window.clearTimeout(this.ajaxWait);
		var app = this;
		this.ajaxWait = window.setTimeout(function(){ app.getResults(); },1000);
	}

	/************************************
	* Call this when you wish to submit a
	* async search and update the page 
	* with the results
	*************************************/
	JJJSearchController.prototype.getResults = function() {
	 
		var d = new Date();
		var time = d.getTime();
		var searchParams = jjjApp.savedSettings.toURLString();
		var app = this;//save this for callback
		var url = jobSearchURL;
		
		//abort all objects if they exist
		for (objects in this.ajaxObjects) {
			if (callInProgress(this.ajaxObjects[objects].transport)) {
				this.ajaxObjects[objects].transport.abort();
				//this.hideLoader();
				window.clearTimeout(app.ajaxObjects[objects]['timeoutId']);
			}
			this.ajaxObjects[objects] = null;
		}

		//create request object to update jobs and jobs of the day
		var pars = searchParams + this.extraParams + '&tp=' + this.templateToUse + '&ss=' + divertSearchEngineFlag + '&time='+time;
		this.ajaxObjects['jobUpdater'] = new Ajax.Request( 
			url, 
			{
				method: 'get', 
				parameters: pars,
				onLoading:function(){app.showLoader();},
				onComplete: function(obj){app.resultshidden = false; app.updateJobSearch(obj);}		
			});
		
		this.hideResults(true);
	}
	
	JJJSearchController.prototype.hideResults = function(hideJOD) {
		//Effect.Fade('results',{ duration: 0.5});//pretty effects
		if(!this.resultshidden){
			new Effect.Opacity('results',
				{ duration: 0.5, 
				  transition: Effect.Transitions.linear, 
				  from: 1.0, to: 0 });
				
			if ((hideJOD) && (document.getElementById('jobsOfTheDay'))) {
				new Effect.Opacity('jobsOfTheDay',
					{ duration: 0.5, 
					  transition: Effect.Transitions.linear, 
					from: 1.0, to: 0 });
			}
			this.resultshidden = true;
		}
	}	     
			//create help div and set attributes
			//var loaderDiv = document.$('loader');//createElement('div');
			//loaderDiv.setAttribute('id','loader' );
			//loaderDiv.className = 'loading';
			//loaderDiv.style.display = "none";//hide it for effects
			///var parent = document.getElementsByTagName('body').item(0);
			//parent.insertBefore(loaderDiv,parent.firstChild);
			
	JJJSearchController.prototype.showLoader = function() {
			Effect.Appear('loader',{ duration: 1});//pretty effects
	}
	
	JJJSearchController.prototype.hideLoader = function() {
		Effect.Fade('loader',{ duration: 0.5});//pretty effects
	}
	
	// updates search object with users keyword an location
	/*function updateKeywordAndLocation() {
		try {
			var keys = form1.keyword.value;
			var suburb = form1.suburb.value;

			jjjApp.savedSettings.setMember('kw',keys);	
			jjjApp.savedSettings.setMember('loc',suburb);	
			getResults();
		} catch(e) {
			//alert(e);
			printDebug(e.message + ": updateKeywordAndLocation()");
		}
	}*/
	
	
  JJJSearchController.prototype.changeJobSearchUrl = function(changeURL){
 	 	divertSearchEngineFlag = changeURL;
   }
		
		

