/*
Name:	jobs.js
Purpose:	


*/
//[ Edit the stuff below this line - but be careful!
// -------------------------------------------------

	var regions	= ["Central London", "Greater London (inside the M25)","Home Counties", "other"];
	var types 	= ["Contract/Permanent","Contract","Permanent"];
	var roles =
		["other"
		,"Business Analyst"
		,"Database Administration"
		,"Dealing Room/Market Data Support"
		,"Email & Messaging"
		,"Internet/Intranet"
		,"IT Project Management"
		,"IT Security & Audit"
		,"IT Line Management"
		,"LAN/WAN Management"
		,"Microsoft XP/W2K/NT Server/Desktop"
		,"Mid-range System Integration"
		,"Software Development"
		,"System & Acceptance Testing"
		,"Technical Architect"
		,"Technical Author"
		,"Technical Consultancy"
		,"Unix System Administration"
		];

	var contactNames 	= [];
	var contactEMails 	= [];

	addContact('Brian Carr');
	addContact('Chelsea Palmer');
	addContact('Shianne King');
	addContact('Jackie Smith');
	addContact('Kamlesh Umeria');
	addContact('Nik Robinson');
	addContact('Steve Sellers');
    addContact('Vanessa Ellis');
	addContact('David Howes');
	addContact('Ewa Kaczanowska');
	addContact('Eran Donders');
	addContact('Tahlia Conway');
	addContact('Joseph Nordoff');
	addContact('Phil Carr');
	addContact('Imelda Lyons');
	
//---------------------------------------------------
// Don't touch anything from here onwards!
//]

	function addContact(name,eMailAddress) {
		var em = eMailAddress;
		if (em==null) {
			var y = name.toLowerCase().split(' ');
//			em = y[0].substring(0,1) + '.' + y[1] + '@computappoint.co.uk';
			em = y[0] + '@cajobs.co.uk';
		};
		contactNames[contactNames.length] = name;
		contactEMails[contactNames.length-1] = em;
	}

//]

//[--------------------------------------------------------
//	Job constructor


Job.prototype.getFullHtml01 = jobGetFullHtml01;
Job.prototype.getBriefHtml = jobGetBriefHtml;
Job.prototype.htmlForm = jobHtmlForm;
Job.prototype.js = jobJs;
Job.prototype.fillRandom = jobFillRandom;
Job.prototype.toForm = jobToForm;
Job.prototype.fromForm = jobFromForm;
Job.prototype.resetJob = resetJob;
Job.prototype.validate = jobValidate;
Job.prototype.htmlForm = jobHtmlForm;
Job.prototype.setValueEscaped = jobSetValueEscaped;

function Job() {


		function jobWidget(descr,value) {

			this.descr = descr;
			this.value = value;
			this.defaultValue = value;
			this.isAWidget = true;
			this.disabled = false;
			this.required = false;
			this.showFull = true;
			this.presentInJobServe = true;
		};

		jobWidget.prototype.displayText = displayText;
		jobWidget.prototype.pokeForm = pokeForm;
		jobWidget.prototype.setValueFromForm = setValueFromForm;
		jobWidget.prototype.setValue = setValue;
		jobWidget.prototype.displayFormElement = displayFormElement;

		function textString (descr,value) {
			var w = new jobWidget(descr,value);
			w.type='text';
			return w
		};
		function hidden (descr,value) {
			var w = new jobWidget(descr,value);
			w.type='hidden';
			return w
		};

		function textArea (descr,value) {
			var w = new jobWidget(descr,value);
			w.type = 'textarea';
			this.disabled = false;
			w.rows = 8;
			w.cols = 40;
			return w;
		};

		function selectOne (descr,allowedValues,selectOptions) {
			var w = new jobWidget(descr,allowedValues[0]);
			w.type='select-one';
			w.selectOptions = selectOptions;
			// w.selectedIndex = 0;
			w.allowedValues = allowedValues;
			return w;
		};
		function selectMultiple (descr,allowedValues,selectOptions) {
			var w = new jobWidget(descr,allowedValues[0]);
			w.type='select-multiple';
			w.selectOptions = selectOptions;
			// w.selectedIndex = 0;
			w.allowedValues = allowedValues;
			w.selected = new Array();
			for (var k=0;k<allowedValues.length; k++){
				w.selected[k] = false;
			};
			return w;
		};

		function displayFormElement() {
			var ops = '';
			var html = '';
			if (this.disabled) ops+=' disabled';
			if (this.type=='text') {
				html = '<input type="text" name="' + this.descr + '" value="' + this.value + '" ' + ops + ' >';
			};
			if (this.type=='textarea') {
				html = '<textarea name="' + this.descr + '" rows="'+this.rows+'" cols="'+this.cols+'">'
				+ this.value + '</textarea>';
			};
			if (this.type=='hidden') {
				html = '<input type="hidden" name="' + this.descr + '" value="' + this.value + '" ' + ops + ' >';
				// html = '<input type="text" name="' + this.descr + '" value="' + this.value + '" ' + ops + ' >'; //debug
			};
			if (this.type=='select-one') {
				html = '<select name="' + this.descr + '"' + this.selectOptions + '>';
				for (var i=0; i<this.allowedValues.length; i++) {
					var selected  = '';
					if (this.allowedValues[i]==this.value) {selected = ' selected';};
					html += '<option' + selected + '>' + this.allowedValues[i] + '</option>';
				};
				html += '</select>';
			};
			if (this.type=='select-multiple') {
				html = '\n<SELECT MULTIPLE NAME="' + this.descr + '" SIZE="' + this.allowedValues.length + '" WIDTH=20>';
				for (var k=0;k<this.allowedValues.length;k++) {
					var selected  = '';
					if (this.selected[k]) {selected = ' selected';};
					html+='\n        <option ' + selected + '>' + this.allowedValues[k] + '</option>';
				};
				html+='\n</SELECT>';
				// alert(html); 
			};	
			if (html=='') {
				return '<br>displayFormElement error: cannot handle this.type='+this.type;
			};
			return html
		};

		function pokeForm(aform) {
			if (this.type==='select-one') {
				var i = getIndex(this.value,this.allowedValues);
				if (i==-1) {
					// this.selectedIndex= -1;
					window.alert('setValue error: no such value as "'+this.value+'"\nin '+this.descr);
					return;
				}
				aform[this.descr].selectedIndex = i;
			} else if (this.type==='select-multiple') {
				for (var i=0;i<this.selected.length;i++) {
					aform[this.descr].options[i].selected = this.selected[i];
				};	
			}
			else { aform[this.descr].value = this.value;};
		};

		function displayText() {
			// if (this.type=='select-one') {return  this.allowedValues[this.selectedIndex]; }
			if (this.type=='select-multiple') {
				var val = '';
				for (var k=0;k<this.selected.length;k++) {
					if (this.selected[k]) {val += '|' + this.allowedValues[k] };
				};
				val = val.slice(1,255);	// Remove leading '|'
				return val;
			};
			return this.value;
		};

		function getIndex(somevalue,allowedValues) {
				var i=-1;
				for (var j=0; j<allowedValues.length; j++) {if (allowedValues[j]==somevalue) {i=j} };
				return i;
		};

		function setValueFromForm(someElement) {
			// window.alert('setValueFromForm: someElement.name='+someElement.name);
			// window.alert('setValueFromForm: someElement.type='+someElement.type);
			if (someElement.type=='select-one') {
				var val = someElement.options[someElement.selectedIndex].text;
				var i = getIndex(val,this.allowedValues);
				if (i==-1) {
					// this.selectedIndex= -1;
					window.alert('setValueFromForm error: no such value as "'+val+'"\nin '+this.descr
					+ '\n .selectedIndex = '+ someElement.selectedIndex
					+ '\nsomeElement.type='+someElement.type);
					return;
				} else {this.value=val};
			} else if (someElement.type=='select-multiple') {
				for (var k=0;k<someElement.options.length;k++) {
					this.selected[k] = someElement.options[k].selected;
				};
			} else  { this.value = someElement.value};
		};


		// Here someValue is a text string
		// - usually the string returned by .displayText()
		// i.e. this is the reverse of displayText() ...
		
		function setValue(someValue) {
			errmsg = '';	// Contains display of invalid values
			if (this.type=='select-one') {
				var i = getIndex(someValue,this.allowedValues);
				if (i==-1) {errmsg += '\n - "'+someValue + '"'};
			};
			if (this.type=='select-multiple') {
				var errmsg = '';
				var sel = someValue.split('|');
				for (var k=0;k<this.allowedValues.length;k++) {
					this.selected[k] = false;
				};
				for (var k=0;k<sel.length;k++) {
					var i = getIndex(sel[k],this.allowedValues);
					if (i==-1)  {errmsg += '\n - "'+someValue+'"';} 
					else {this.selected[i] = true;} ;
				};
			};
			if (errmsg=='') { 
				this.value = someValue;
			} else {
				errmsg = '*** WARNING ***\nThe following value(s) are not valid '+ this.descr + errmsg;
				errmsg+= '\nCheck the entry for '+this.descr+' - it may not be valid';
				alert(errmsg)
			};
			return;
		};


		this["Contact"]		= new selectOne	('Contact',contactNames	,'onChange="Job.contactNameChanged(this.form)"');
		this["Email"]		= selectOne('Email',contactEMails, ' onChange="Job.contactEmailChanged(this.form)"');
		this["Type"]		= selectOne("Type", types);
		this["Position"]	= textString('Position'		, '');
		this["Skills"]		= textArea("Skills","");
		this["Location"] 	= textString('Location'		,'');
		this["Region"] 		= selectOne('Region'		,regions);
		this["Start Date"] 	= textString	('Start Date'	, '');
		this["Duration"] 	= textString	('Duration'		,'');
		this["Rate/Salary"] 	= textString	('Rate/Salary'	,'');
		this["Reference"] 	= textString	('Reference'	,'JS');
		this["Posted"] 		= textString	('Posted'		,''	);
		
		this["Roles"] 		= selectMultiple ('Roles'	,roles);
		
		this["briefFile"] 	= hidden	('briefFile'		,''	);
		this["fullFile"] 	= hidden	('fullFile'		,''	);

		this["Position"].required = true;
		this["Skills"].required = true;
		this["Location"].required = true;
		this["Roles"].required = true;
		this["Region"].presentInJobServe = false;
		this["Reference"].required = true;
		this["Posted"].disabled=true;



};

//] End Job constrrcutor


//[--------------------------------------------------------
// Job form events

Job.prototype.contactNameChanged = jobContactNameChanged;
Job.prototype.contactEmailChanged = jobContactEmailChanged;

function jobContactNameChanged(aform) {
	aform["Email"].selectedIndex = aform["Contact"].selectedIndex;
};

function jobContactEmailChanged(aform) {
	aform["Contact"].selectedIndex = aform["Email"].selectedIndex;
};

//]

//[--------------------------------------------------------
// Job methods

// For internal use only
Job.prototype.briefItem = jobBriefItem;
Job.prototype.contactAsLink = jobContactAsLink;

function parseInputBrief(someValue) {
	var x = someValue;
	x = x.replace(/&#61623;/g,"&#149;"); //bullet point when copy&paste from Word...
	return x;
};
function parseInputFull(someValue) {
	var x = someValue;
	x = x.replace(/\r\n/g,"<br>");
	x = x.replace(/\r/g,"<br>");
	x = x.replace(/\n/g,"<br>");
//	x = x.replace(/&#61623;/g,"&#149;"); //bullet point when copy&paste from Word...
	x = x.replace(/&#61623;/g,"[[$]]"); //bullet point when copy&paste from Word...
	return x;
};


//==============================================================
// Job display 

function jobContactAsLink() {
	var val = this["Contact"].value;
	return val.link("mailto:"+this["Email"].value + "?subject="
		+escape("Re: " + this.Reference.value + ": " + this.Position.value) 
	);
};			

function jobBriefItem(xname,xvalue) {
	// alert('xname='+xname);
	if (xvalue==null) xvalue = this[xname].value;  // Default to straight value if no value specified
	if (xvalue=='') return '';  //Don't display empty items...
	return '<em>' + this[xname].descr + ':&nbsp;</em>&nbsp;' + xvalue + ' &nbsp;';
};

function jobGetBriefHtml() {
	var html = '';
	var fullRef = '/jobs/' + this["fullFile"].value
	var s = parseInputBrief(this["Skills"].displayText());
	html += '<a href="http://www.computappoint.co.uk" '
	+ 'onClick="jobShow(' + "'" + this.fullFile.value + "'" 
		+'); return false">'
	+'<h5>' + '<em>' + this["Position"].value + '</em></a>';
	html +='\n<br>'  + s.substring(0,200)
	if (s.length>200)  {html += '...';};
	// if (s.length>200)  {var s = "here"; html += '... (click '+ s.link(fullRef) + ' for full details)'; }

	html +='\n<br>' 
	+ this.briefItem("Type") + this.briefItem("Location") 
	+ this.briefItem("Start Date") ;
	+ this.briefItem("Duration");
	// alert('this.Type.value = [' + this.Type.value + ']');
	html +=this.briefItem("Rate/Salary") 
	 + '\n<br>' + this.briefItem('Posted',this.Posted.value.substring(0,10))+ this.briefItem("Reference") 
	 + this.briefItem( 'Contact',this.contactAsLink() )
	 + '\n';
	 html += '\n' +'</h5>'
	 + '<!--Reference="'+ escape(this["Reference"].value)	+ '"-->'
	 + '<!--Region="'	+ escape(this["Region"].value)		+ '"-->'
	 + '<!--Type="'		+ escape(this["Type"].value)		+ '"-->'
	 + '<!--Contact="'	+ escape(this["Contact"].value)		+ '"-->' 
	 ;
	 //
	// There may  e multiple Roles selected - do a separate entry for each..
	 for (var k=0; k<this.Roles.allowedValues.length;k++) {
	 	if (this.Roles.selected[k]) {
	 		html += '\n<!--Role="'		+ escape(this.Roles.allowedValues[k])		+ '"-->';
	 	};
	 };
	return html;
};

function jobGetFullHtml01() {
	var html = '\n<h2>&nbsp;'+this["Position"].value + '</h2><hr>'
	+'\n<table border="0">'
	for (var x in this) {
		var t = this[x]
		if (t["isAWidget"] && t["type"]!='hidden' && t["showFull"]
		&& x!="Email" && x!="Position" 
		&& x.value!=''
		// && (x!='Duration' || this.Type.value!='Permanent')
		) {
			var descr = this[x].descr;
			var val = parseInputFull(this[x].displayText());
			// if (x=="Email") val = val.link("mailto:"+val);
			// if (x=="Agency") val = val.link("http://www.computappoint.co.uk");
			if (x=="Contact") {val = this.contactAsLink(); };
			if (x=="Posted") {val = val.substring(0,10); };
			html += '\n<tr><td align=right valign=top><em>' + descr + ':</em></td>'
			+ '<td valign=top>' + val + '&nbsp;</td></tr>';
		};
	};
	html += '\n</table>\n<hr><p>For more information, please contact ' + this.contactAsLink()
	+ ' by clicking on this link or calling 020 7287 2550.<br>&nbsp;</p>';
	return html;
};


//===================================================================
// Form display/management

function jobHtmlForm() {
	var html = '<td><table><tr><td>';
	var req = '<font color=red>*</font>';
	var notreq = '&nbsp;';
	for (var x in this) {
		if (this[x]["isAWidget"] && this[x].descr!="Roles") {
			var x1 = '<b>'; var x2 = '</b>';
			if (!this[x].presentInJobServe) {x1='<font color=blue>'; x2='</font>';};
			if (this[x].disabled) 			{x1='<font color=gray>'; x2='</font>';};
			html += '<tr><td align=right valign=top>'
			if (this[x].type!='hidden') {html += x1 + x + ":" + x2};
			if (this[x].required) {html +=req} else {html+=notreq};
			html+='</td>';
			html +='<td valign=top>' + this[x].displayFormElement() + '</td></tr>';
		};
	};
	html +='</table></td><td valign=top><b>Roles:</b>' + req + '<br>' + this.Roles.displayFormElement();
	html+= '<p>Press the Control key and click with your mouse to select more than one Role.';
	html+= '<p>Fields marked '+req+' are compulsory.';
	html += '</td></tr>';
	return html;
};

function resetJob() {
	for (var x in this) {
		if (this[x]["isAWidget"]) {
			this[x].setValue(this[x].defaultValue);
		};
	};
};



function jobJs() {
	var js = '<script>';
	for (var x in this) {
		if (this[x]["isAWidget"]) {
			js += '\njob.setValueEscaped("' + x + '","'+ escape(this[x].displayText()) + '");';
		};
	};
	js+='\n</script>';
	// window.alert(js); //debug
	return js;
};


function jobSetValueEscaped(xname,xvalue) {
	var yname = xname;
	if (yname=="Role") {yname = "Roles"};   // Kludge because I changed Role to Roles...!
	if (!this[yname]) {alert('Error is SetValueUnescaped: this["'+yname+'"] does not exist...'); return };
	this[yname].setValue(unescape(xvalue));
};


//[ This creates jobs for testing purposes...
function jobFillRandom() {
		var d = new Date();
		var skillsList =
		['An experienced professional with investment banking backgropund, preferrably in FX in LOndon or Amsterdam. Some knowledge of TCP/IP and SWIFT would be an advantage'
		,'5+ years experience in Telecoms'
		,'Anybody who wants to randomly send their CV through is welcome to apply for this one.'
		+ '\nPlease include 100 other agencies in the To: field, to make sure we take he application really seriously'
		];
		var i = pickIndex(contactNames);
		this["Contact"].setValue(contactNames[i]);
		this["Email"].setValue(contactEMails[i]);
		this["Roles"].setValue(pickOne(roles));
		this["Position"].value		= pickOne( ["Senior","Junior","Experienced"])
								+ " " + pickOne(["Consultant","Manager","Trainee"]);
		this["Type"].setValue(pickOne(types));
		this["Skills"].value		= pickOne(skillsList);
		this["Location"].value		= pickOne(['London','City']);
		this["Rate/Salary"].value	= pickOne(['£500/day or £65k','Market rates', 'good','competetitive','not treally very good']);
		this["Start Date"].value	= pickOne(['Monday','ASAP','Yesterday','End of the month','In due course']);
		if (this.Type.value!='Permanent')  {this.Duration.value = pickOne(['3 months','6 months','6 weeks']); }
		else {this.Duration.value='';};
		var s = Math.floor(Math.random()*100);
		var e = this.Email.value.toUpperCase();  
		var y = '' + d.getYear(); 
		// alert('test839='+ e.substring(0,1) + e.substring(2,3)  );
		this["Reference"].value		= 'JS' + e.substring(0,1) + e.substring(2,3)
		+ y.substring(2,4) + Job.rJustify(d.getMonth()+1,2) + '-'  + s;
		this.Posted.value = '';
		//this.briefFile.value = '';
		// this.fullFile.value = '';
	};

	function pickIndex (someArray) {
		var i = Math.floor(Math.random()*someArray.length);
		return i;
	};

	function pickOne (someArray) {
		var i = Math.floor(Math.random()*someArray.length);
		return someArray[i];
	};

//]


function jobToForm(aform) {
	for (var x in this) {
		if (this[x]["isAWidget"]) {this[x].pokeForm(aform);};
	};
};

function jobFromForm(aform) {
	for (var x in this) {
		if (this[x]["isAWidget"]) {
			// window.alert('.fromForm: x='+x);
			if (!aform[x]) {
				var msg = 'Job.fromForm error: form does not contain: x='+x +'\n';
				for (var j=0;j<aform.length;j++) {msg+=aform[j].name+","};
				// window.alert(msg);
			};
			this[x].setValueFromForm(aform[x])
		};
	};
	// this.validate();
};

Job.prototype.rJustify = jobRJustify;
function jobRJustify(n,ndigits) {
	var s = '000000' + n;
	var digits = -1*ndigits;
	return s.substring(s.length-ndigits);
};

function jobValidate() {
	var msg = '';
	this.validationMsg = '';

	if (this["Posted"].value=="") {
		var d = new Date();
		this["Posted"].value = '' 
		+  Job.rJustify(d.getDate(),2) + '/' + Job.rJustify(d.getMonth()+1,2) + '/' +  d.getYear()
		+ ' ' + Job.rJustify(d.getHours(),2) + ':' + Job.rJustify(d.getMinutes(),2)
		+ ':' + Job.rJustify(d.getSeconds(),2) + '.' + Job.rJustify((d.getTime() % 1000),3);
		var fname = 'job-'
		+ d.getYear() + '-' + Job.rJustify(d.getMonth()+1,2) + '-' + Job.rJustify(d.getDate(),2)
		+ '-' + Job.rJustify(d.getHours(),2)  + Job.rJustify(d.getMinutes(),2)
		+ '-' + Job.rJustify(d.getSeconds(),2)
		+ Job.rJustify((d.getTime() % 1000),3);  // milliseconds...
		this["briefFile"].value = fname + "-brief.htm";
		this["fullFile"].value = fname + "-full.htm";
	};
	// this["briefHtml"].value = this.getBriefHtml();
	// this["fullHtml"].value = this.getFullHtml();
	
	for (x in this) {
		if (this[x]["isAWidget"]) {
			if (this[x].required && this[x].displayText()=='') {msg+='\n   - '+x+' must be filled in'};
		};
	};
	
	this.Reference.value = this.Reference.value.toUpperCase();
	this.Reference.value = this.Reference.value.replace(/ /g,"");
	msg += Job.validateReference(this.Reference.value); 
	
	
	if (msg=='') {return true;}
	else {
		this.validationMsg = 'The following errors occurred:' + msg +'\nThese must be corrected before proceeding';
		return false;
	};
};

// This returns a null string if ref is OK, error message otherwise
// ref is a string
Job.prototype.validateReference = jobValidateReference;
function jobValidateReference (ref) {
	if (ref=="JS")  return '\n   - Reference must contain more than just JS';
	if (ref.substring(0,2)!="JS") return '\n   - Reference must begin with JS';
//	if (ref.length<9 || ref.substring(8,9)!="-" || ref.substring(4,5)!='0') {
//	    return '\n   - Reference must be of form JSccyymm-j, where cc=consultant, yy/mm=year/month, j=job number';
//	};
	return '';
};

//  Same as above, but for Joe Public
Job.prototype.validateReference2 = jobValidateReference2;
function jobValidateReference2 (ref) {
	return  Job.validateReference (ref);
//	if (ref=="JS")  return '\n   - Reference must contain more than just JS';
//	if (ref.substring(0,2)!="JS") return '\n   - Reference must begin with JS';
//	if (ref.length<9 || ref.substring(8,9)!="-" || ref.substring(4,5)!='0') {
//	    return '\n - Reference should be of form JSxxyymm-n';
//	};
//	return '';
};

Job.prototype.validateForm = jobValidateForm;
function jobValidateForm(aform) {
	var j = new Job();
	j.fromForm(aform);
	var r = j.validate();
	if (r) {j.toForm(aform); return true}
	else {window.alert(j.validationMsg); return false};
};

Job.prototype.submitForm = jobSubmitForm;
function jobSubmitForm(aform) {
	if (Job.validateForm(aform)) {aform.submit()};
};

Job.prototype.xxxrolesAsCheckBoxes = jobXxxrolesAsCheckBoxes;
function jobXxxrolesAsCheckBoxes() {
	var html = '';
	for (var i=0;i<roles.length;i++){
		html+='\n<input type="checkbox" name="'+roles[i]+'" value="'+roles[i]+'">'+roles[i]+'<br>';
	};
	return html;
};

//------------------------------------------------------------
// SEarch form routines...


// The only field we needto check is JobServe reference...
Job.prototype.validateReferenceInForm = jobValidateReferenceInForm;
function jobValidateReferenceInForm(aform) {
	if (!aform["Reference"]) return true;
	var msg = Job.validateReference2(aform.Reference.value);
	if (msg!='') {msg = 'Not a valid Computappoint JobServe refernce...'+msg; alert(msg); return false};
	return true;
}

Job.prototype.putSearchForm = jobPutSearchForm;
function jobPutSearchForm() {
	putSelectPlusAny('Contact',contactNames);
	putSelectPlusAny('Role',roles);
	putSelectPlusAny('Type',Array('Contract','Permanent'));
	putSelectPlusAny('Region',regions);
	putString('Reference','<input name="Reference" type="text" value="JS" size=10>');
};


// This one is for Joe Public...
Job.prototype.putSearchForm2 = jobPutSearchForm2;
function jobPutSearchForm2() {
	// putSelectPlusAny('Contact',contactNames);
	putSelectPlusAny('Role',roles);
	putSelectPlusAny('Type',Array('Contract','Permanent'));
	putSelectPlusAny('Region',regions);
	// putString('Reference','<input name="Reference" type="text" value="JS" size=10>');
};

// This one is for Joe Public...
Job.prototype.putSearchFormRef = jobPutSearchFormRef;
function jobPutSearchFormRef() {
	// putSelectPlusAny('Contact',contactNames);
	putString('Reference','<input name="Reference" type="text" value="JS" size=10 ' 
	+ 'onChange="Job.validateReferenceFormElement(this);">');
};

Job.prototype.putSendCvOptions = jobPutSendCvOptions;
function jobPutSendCvOptions() {
	// putSelectPlusAny('Contact',contactNames);
	putSelectPlusAny('Role',roles);
	// putSelect('Type',Array('Permanent','Contract','Either'));
	putSelectPlusAny('Region',regions);
	// putString('Reference','<input name="Reference" type="text" value="JS" size=10>');
};

//[ These routines write form elements in a consistent format...

	function putString(descr,html,tdOptions) {
		if (tdOptions==null) {tdOptions=''};
		document.write('\n<tr><td valign="top"><p class="cvtitles">' + descr + ':</p></td>');
		document.write('<td ' + tdOptions + '>' + html + '</td></tr>');
	};

	function putText (descr,text,inputTextOptions) {
		if (inputTextOptions==null) {inputTextOptions=''};
		putString(descr,'<input type="text" name="' + descr + '" value="' + text + '" '+ inputTextOptions + '>');
	};

	function putSelect(descr,aList,selectOptions) {
		// this.alert(aList.length);
		if (selectOptions==null) {selectOptions=''};
		var html = '<select name="' + descr + '" ' + selectOptions + '>';
		for (var i=0; i<aList.length; i++) {
			var selected  = '';
			// if (i=0) {selected = ' selected';};
			html += '<option' + selected + '>' + aList[i] + '</option>';
		};
		html += '</select>';
		// this.alert(html);
		putString(descr,html);
	}

	function putSelectPlusAny(descr,aList,selectOptions) {
		var list2 = new Array ('any');
		for (var i=0; i<aList.length;i++) {
			list2[list2.length] = aList[i];  // I'm sure this'd be easier in PERL...
		};
		putSelect(descr,list2,selectOptions);
	}

//]

Job.prototype.getSearchCriteria = jobGetSearchCriteria;
function jobGetSearchCriteria(formName) {
	var f = document.forms[formName];
	function crit(fieldName) {
		var s = document.forms[formName][fieldName];
		if (!s) return '';  // Field is not on this search form
		if (s.selectedIndex==0) {return '';}; // First entry is always 'any'
		var aval = s[s.selectedIndex].text;
		if (aval=='any') {return '';};
		if (fieldName=='Type') {
			if (aval=='Permanent') return 'Permanent"--';
			if (aval=='Contract') return '--Type="Contract';
		};
		return '--' + fieldName + '="' + escape(aval) + '"--\n';
	};
	var x = crit("Role") + crit("Contact") + crit("Region") + crit("Type");
	if (f["Reference"]) { if (f.Reference.value!='JS') {x+= '--Reference="' + f.Reference.value + '"--\n';} };
	return x;
	
};


//[ These fill appropriate values in listJobsInputs

	Job.prototype.fillPreviewSearchForm = jobFillPreviewSearchForm;
	function jobFillPreviewSearchForm(frm,searchFormName) {
		// storeCookieValues();
		if (searchFormName==null) {alert('ABORTING: null searchFormName parameter passed to Job.fillPreviewSearchForm'); return}
		frm["pass6word"].value = pwd.value;
		frm["SearchType"].value = 'MAINT';
		var r = '';
		var x = getSelection("Contact",searchFormName);
		if (x!='any') { r+= '>' + x + '</a>\n';};
		r += getCondition("Role",searchFormName);
		var x = getSelection("Type",searchFormName);
		if (x=="Contract") {r+='</b> Contract\n'};
		if (x=="Permanent") {r+='Permanent\n'};
		r += getCondition("Region",searchFormName);
		frm.criteria.value = r;
		return true;
	};
	
	// If selectedIndex==0 then we have the first selection,
	// which is 'any' or 'contract/permanent' - ignore these for selection criteria
	function getCondition(aName,searchFormName) {;
		var x = getSelection(aName,searchFormName);
		var i = document[searchFormName][aName].selectedIndex;
		if (i!=0) { return '<b>' + aName + ':</b> ' + x + '\n';}
		else return '';
	};

		function getSelection (selName,formName) {
			var msg = 'getSelection err\n';
			if (document.forms[formName]==null) {this.alert(msg+'No such form as '+formName); return}
			if (document[formName][selName]==null) {this.alert(msg+'Element '
			+selName + ' not found in form '+formName);}
			return document[formName][selName][document[formName][selName].selectedIndex].text;
		};


//]

