/**
* Methods and fields for making calls on QA process services
*/

var QAService = {
	
	// QA SERVICES -------------------------------------------------------	
	
	QA_TASK_ASSIGN: 'qa.task.assign',
	QA_TASK_VIEWER: 'qa.task.viewer',
	QA_TASK_LISTER: 'qa.task.lister',
	QA_TASK_FILTER: 'qa.task.filter',
	QA_TASK_SAVE: 'qa.task.save',
	QA_TASK_COMPLETE: 'qa.task.complete',
	QA_TASK_BACK: 'qa.task.back',
	QA_TASK_APPROVE: 'qa.task.approve',
	QA_TASK_FAIL: 'qa.task.fail',
	QA_CASE_ASSIGN: 'qa.case.assign',
	QA_CASE_LISTER: 'qa.case.lister',
	QA_CASE_VIEWER: 'qa.case.viewer',
	QA_FORM_VIEWER: 'qa.form.viewer',
	QA_CASE_SEARCHER: 'qa.case.searcher',
	QA_CASE_SAVE:'qa.case.save',
	QA_CASE_CANCEL:'qa.case.cancel',
	QA_CASE_SKIP:'qa.case.skip',
	QA_EA_VIEWER: 'qa.ea.viewer',
	CASE_ADD_TO_QA:'case.add_to_qa',
	/**
	 * Handle AP events. Invoked from workbench.js
	 * @param {Object} event The event we are handling
	 * @param String context The AP interface framework context (see Context.js)
	 */
	handleEvent: function(event, context) {
		var element = Event.element(event);	
		if (element.id.startsWith('qaexternal-task-')) {
			// Get the task ID so we can view the task
			var taskID = Names.getInstanceID(element.id);
			var target = 'qaexternal-task';
			QAService.taskViewer(context, target, taskID);
		} else if (element.id.startsWith('qatasks-task-')) {
			// Get the task ID so we can view the task
			var taskID = Names.getInstanceID(element.id);
			var target = 'qatasks-task';
			
			QAService.taskViewer(context, target, taskID);
		} else if (element.id.startsWith('qatasks-qATaskViewer-') || element.id.startsWith('qaexternal-qATaskViewer-')) {
			if (element.id.endsWith('-approve')) {
				if($('qatasks-qAFormViewer-confirmed').checked){
					QAService.approveAPEL(context);	
				}else{
					alert("Please check the confirm box before submitting");
				}			
			} else if (element.id.endsWith('-fail')) {
				//L.D need to stop this if apel form is not checked
				if($('qatasks-qAFormViewer-confirmed').checked){
					QAService.failAPEL(context);
				}else{
					alert("Please check the confirm box before submitting");
				}			
			} else if (element.id.endsWith('-save')) {
				QAService.saveTask(context);			
			} else if (element.id.endsWith('-complete')) {
				QAService.completeTask(context);
			} else if (element.id.endsWith('-back')) {
				QAService.backTask(context);
			}
			
		}		
		else if (element.id.startsWith('qatasks-')) {
			if (element.id.endsWith('-upload')) {
				formID = "qatasks-task-form";
				Service.Upload(element.id,formID);
			}		
			else if (element.id.endsWith('-remove_file')) {
				Service.RemoveFile(element.id);
			}
			else if (element.id.endsWith('-download')) {
				fileID = Names.getIDInstance(element.id);
				Service.fileCheck(fileID);
			}
			else if (element.id.endsWith('-search')) {
				QAService.refreshTaskList(Context.QATASKS);
			}
			else if (element.id.endsWith('-clear')) {
				$(Context.QATASKS + Service.SCOPE_SEPARATOR + Widget.QA_TASK_FILTER + Service.SCOPE_SEPARATOR + 'term').value = '';
				QAService.refreshTaskList(Context.QATASKS);
				Entity.closeViewer(Context.QATASKS);
				Entity.closeViewer(context, "lowerform");
			}
			else if (element.id.endsWith('-upload_documentation')) {
				
				if($(element.id).checked){
					$("emailContainer").show();
				}
				else{
					$("emailContainer").hide();
				}
			}
		}
		else if (element.id.startsWith('qacases-')) {
			if (element.id.endsWith('-download')) {
				fileID = Names.getIDInstance(element.id);
				Service.fileCheck(fileID);
			}
			else if (element.id.endsWith('-remove_file')) {
				Service.RemoveFile(element.id);
			}
			else if (element.id.endsWith('cancelQACase')){
				QAService.cancelQACase(element.id);
			}
			else if (element.id.endsWith('skip')){
				QAService.skip(element.id);
			}
		}
	},
	
	/**
	 * Invoked when an AJAX request which does not expect content to be delivered in
	 * the response succeeds
	 * @param {Object} xhrObject
	 */		
	success: function(xhrObject) {
		document.body.style.cursor = "";
		var gotError = false;
		var xmlObject = XML.getXMLObject(xhrObject);
		// Look for an error
		var root = xmlObject.getElementsByTagName('error')[0];
		var message = "";
		if (root != undefined) {
			gotError = true;
			message = root.getElementsByTagName('message')[0].firstChild.data;
			alert(message);			
			//return;
		} else {
			root = xmlObject.getElementsByTagName('success')[0];
			try {
				message = root.getElementsByTagName('message')[0].firstChild.data;
			} catch(err) {alert(err);};
		}

		if (message.length > 0 && !gotError && service != CasaService.CASE_XML) {
			alert(message);
		}

		var service = root.getElementsByTagName('service')[0].firstChild.data;
		if (service == QAService.QA_TASK_COMPLETE || service == QAService.QA_TASK_APPROVE || service == QAService.QA_TASK_FAIL) {
			var context = root.getElementsByTagName('context')[0].firstChild.data;
			QAService.refreshTaskList(context);
			Entity.closeViewer(context, "lowerform");
		} else if (service == QAService.QA_TASK_SAVE) {
			var taskID = $('qatasks-qATaskViewer-task-id').value;
			var target = 'qatasks-task';			
			QAService.taskViewer(Context.QATASKS, target, taskID);
		} else if (service == QAService.QA_TASK_ASSIGN) {
			var context = root.getElementsByTagName('context')[0].firstChild.data;
			QAService.refreshTaskList(context);
			Entity.closeViewer(context, "lowerform");
		}
		else if (service == QAService.QA_CASE_ASSIGN) {
			var context = root.getElementsByTagName('context')[0].firstChild.data;
			QAService.caseViewer('qacases','Qacase','qacases-lister-Qacase-select')
		}
		else if(service == QAService.QA_CASE_SAVE){
			QAService.refreshCaseList(Context.QACASES);
		}
		else if(service == QAService.QA_CASE_CANCEL){
			QAService.caseViewer('qacases','Qacase','qacases-lister-Qacase-select')
		}	
		else if(service == QAService.QA_CASE_SKIP){
			QAService.caseViewer('qacases','Qacase','qacases-lister-Qacase-select')
		}	
		

		
	},

	/**
	 * Invoked when an AJAX request that expects content in the response succeeds
	 * @param {Object} xhrObject Success XML - see Service.php
	 */
	contentSuccess: function(xhrObject) {
		document.body.style.cursor = "";
		var xmlObject = XML.getXMLObject(xhrObject);
		// Look for an error
		var error = xmlObject.getElementsByTagName('error')[0];
		if (error != undefined) {
			var message = error.getElementsByTagName('message')[0].firstChild.data;
			alert(message);
			return;
		}
		
		var root = xmlObject.getElementsByTagName('success')[0];
		var service = root.getElementsByTagName('service')[0].firstChild.data;
	    var context = root.getElementsByTagName('context')[0].firstChild.data;
		var target = root.getElementsByTagName('target')[0].firstChild.data;
		var content = root.getElementsByTagName('content')[0].firstChild.data;
		
		//Only update if we have a target
		if(target.length>0) $(target).update(content);
		
		if (context == Context.QATASKS) {
			
			var taskID = root.getElementsByTagName('entityID')[0].firstChild.data;
			
			switch(service){
			
			case QAService.QA_TASK_BACK:
				
					Entity.closeViewer(context, "lowerform");
					Entity.closeViewer(context, "task");
					
					//if we have successfully reverted a task load up the previous tasks view
					QAService.taskViewer(context, target, taskID);
					
					//reload the task list
					QAService.refreshTaskList(context);
									
				break;
				
			default:
				
				//On completion handle the task specific stuff
				
				var taskTypeIdentifier = root.getElementsByTagName('data')[0].firstChild.data;
				switch(taskTypeIdentifier) {				
					case 'qa_task_1':
					case 'qa_task_2':
					case 'qa_task_4':
					case 'qa_task_5':
					case 'qa_task_8':
					case 'qa_task_16':
					case 'qa_task_17':
					case 'qa_task_18':
					case 'qa_task_19':	
						if(service==QAService.QA_TASK_VIEWER){
							target = 'qatasks-lowerform';
							QAService.formViewer(context, target, taskID);
						}
						break;
					case 'qa_task_10':
						if(service==QAService.QA_TASK_VIEWER){
							target = 'qatasks-lowerform';
							QAService.formViewer(context, target, taskID);
						}
						if(service==QAService.QA_FORM_VIEWER){
							if($("emailStatus").value==1){
								$("emailContainer").show();
							}
							else{
								$("emailContainer").hide();
							}
						}
						break;
					case 'qa_task_11':
					case 'qa_task_14':
					case 'qa_task_15':		
						if(service==QAService.QA_TASK_VIEWER){
							target = 'qatasks-lowerform';
							QAService.formViewer(context, target, taskID);
						
						}
						else if(service==QAService.QA_FORM_VIEWER){
							Service.ListFiles(context,Entity.QACASE);
							//only in task 14 do we show compared data
							if(taskTypeIdentifier=='qa_task_14'){
								Service.fileCompare(context,Entity.QACASE);
							}
						}				
						break;
					case 'qa_task_3':
					case 'qa_task_7':
						if(service==QAService.QA_TASK_VIEWER){
							target = 'qatasks-lowerform';
							QAService.formViewer(context, target, taskID);
							try{
								Entity.view('qatasks','case',context+Service.SCOPE_SEPARATOR+Widget.QA_TASK_VIEWER+Service.SCOPE_SEPARATOR+'savedcase');
							}catch(err){;}
						}
						break;
					default:
						Entity.closeViewer(context, "lowerform");
						break;
				}
				break;
			}
		}	
	
	},

	/**
	 * Controls the initial state of an QA sub-tab
	 * Called by tabSelect() in workbench.js
	 * @param String context The QA interface framework context (see Context.js)
	 */
	controller: function(context) {
		switch(context) {
			case Context.QA:
				break;
			case Context.QACASES:
			// List the qa cases
				QAService.caseLister(context);
				break;
			case Context.QATASKS:
				target = context+Service.SCOPE_SEPARATOR+'lister'+Service.SCOPE_SEPARATOR+Entity.TASK;
				QAService.taskLister(context,target);
				break;
			case Context.QAREPORTS:
				break;
			default:
				break;
		}

		try {
			// Request a filter for the NAU task list. It goes in the searcher div
			var target = Context.QATASKS + Service.SCOPE_SEPARATOR + "filter" + Service.SCOPE_SEPARATOR + Entity.TASK;
			QAService.taskFilter(Context.QATASKS, target);
		} catch(err) {;}

		try {
			QAService.searcherQACases();
		} catch(err) {;}
		
	},



	/**
	 * Make a request on the QA_CASE_LISTER service
	 * Delivers a list of applicants in the LISTER widget.
	 * @param String context The AP interface framework context (see Context.js)
	 * @param {Object} selected Defines the currently selected user
	 */
	caseLister: function(context, selected, doSearch) {
		var entity = Entity.QACASE;
 		var pars = 'service=' + QAService.QA_CASE_LISTER;
		pars += '&' + 'context=' + context;
		pars += '&' + 'target=' + 'qacases-lister-qacase';
		pars += '&' + 'widget=' + Widget.LISTER;
		pars += '&' + 'entity=' + entity;
		if (selected != undefined && selected != null && selected.length > 0) {
			pars += '&' + 'entityID=' + selected;
		}
		pars += '&' + 'size=15';
		pars += '&' + 'disabled=false';
		var eventHandler = 'QAService.caseViewer(\'' + context + '\',\'' + entity + '\',\'@id\')'
		pars += '&' + 'eventHandler=' + eventHandler;
		// Collect the searcher radio option
		if (doSearch) {
			try {
				var radioID = context + Service.SCOPE_SEPARATOR + Widget.QA_CASE_SEARCHER + Service.SCOPE_SEPARATOR + 'radio';
				var option = getRadioValue(radioID);

				var termID = context + Service.SCOPE_SEPARATOR + Widget.QA_CASE_SEARCHER + Service.SCOPE_SEPARATOR + 'term';
				var term = $(termID).value;
				if (term.trim().length > 0) {
					// Check term is OK and matches selected radio option
					if (option == 'ea') {
						if (term.length == 0) {
							document.body.style.cursor = '';
							alert('Please enter a 6 digit EA certificate number without the LCEA prefix');
							return;
						}
						var regex = /^[0-9]{6}$/;
					    var value = term.replace(regex, '');
						if (value.length > 0) {
							document.body.style.cursor = '';
							alert('Your EA Certificate Number is invalid: A 6 digit number is required');
							return;			
						}
					} else if (option == 'name') {
						if (term.length == 0) {
							document.body.style.cursor = '';
							alert('Please enter a QA Case name');
							return;
						}
					} else if (option == 'case') {
						if (term.length == 0) {
							document.body.style.cursor = '';
							alert('Please enter an integer case ID');
							return;
						}
						var regex = /^\d+$/;
					    var value = term.replace(regex, '');
						if (value.length > 0) {
							document.body.style.cursor = '';
							alert('Your Case ID is invalid: An integer is required');
							return;			
						}
					}
					pars += '&' + 'option=' + option;
					pars += '&' + 'term=' + term;
					
				}
				else if (option == 'mine') {
					pars += '&' + 'option=' + option;
				}
			} catch(err) {;}
			
		}
		//Attempt to add the filter, regardless of search
		var filterID = null;
		try {
			var elementID = context + Service.SCOPE_SEPARATOR  + Entity.QACASE + Service.SCOPE_SEPARATOR + 'filter';
			pars += '&'+ 'filterID='+$(elementID).value;		
			
		} catch(err) {;}

   		var onSuccessFunction = 'QAService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
	},

	refreshCaseList: function(context) {
		var selected = null;
		var termID = context + Service.SCOPE_SEPARATOR + Widget.QA_CASE_SEARCHER + Service.SCOPE_SEPARATOR + 'term';
		var term = $(termID).value;
		var radioID = context + Service.SCOPE_SEPARATOR + Widget.QA_CASE_SEARCHER + Service.SCOPE_SEPARATOR + 'radio';
		var option = getRadioValue(radioID);
		
		if (term.trim().length == 0&&option!='mine') {
			QAService.caseLister(context, selected, false);			
		} else {
			QAService.caseLister(context, selected, true);			
		}
		Qacase.closeViewer(context);
		Entity.closeViewer(context, "lowerform");
	},

	caseViewer: function(context, entity, entityIDPrefix) {
		var entity = Entity.QACASE;
		var pars = 'service=' + QAService.QA_CASE_VIEWER;
		pars += '&' + 'target=' + context+Service.SCOPE_SEPARATOR+entity;
		pars += '&' + 'context=' + context;
		pars += '&' + 'entity=' + entity;
		if(entityIDPrefix.length>0){
			try{
				temp = $(entityIDPrefix).value;
				temp = temp.split(Service.SCOPE_SEPARATOR);
				entityID = temp[temp.length-1];
				
			}catch(err){entityID=""}
		}
		else{entityID=""}
			
		pars += '&' + 'entityID=' + entityID;
		pars += '&' + 'widget=' + Widget.QA_CASE_VIEWER;
		var onSuccessFunction = 'CasaService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
	},
	
	caseSearch: function(context, event) {
		var element = Event.element(event);
		if (element.id.endsWith('clear')) {
			$(context + Service.SCOPE_SEPARATOR + Widget.QA_CASE_SEARCHER + Service.SCOPE_SEPARATOR + 'term').value = '';
			QAService.refreshCaseList(context);
			QACase.closeViewer(context);
			Entity.closeViewer(context, "lowerform");
		} else if (element.id.endsWith('search') || element.id.endsWith('term')) {
			QAService.refreshCaseList(context);
		}
	},
		
	searcherQACases: function() {
		var entity = Entity.QACASE;
		var pars = 'service=' + QAService.QA_CASE_SEARCHER;
		pars += '&' + 'target=' + 'qacases-searcher-qacase';
		pars += '&' + 'context=' + Context.QACASES;
		pars += '&' + 'entity=' + entity;
		pars += '&' + 'widget=' + Widget.QA_CASE_SEARCHER;
		var onSuccessFunction = 'CasaService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
	},


//**********************************************************************


	
	/**
	 * Get the ID of a selected task instance in an AP context
	 * @param String context The AP interface framework context (see Context.js)
	 */
	getTaskID: function(context){
		var idElement = context + Service.SCOPE_SEPARATOR + Widget.QA_TASK_VIEWER + Service.SCOPE_SEPARATOR + Entity.TASK + Service.SCOPE_SEPARATOR + 'id';
		return $F(idElement);
	},
	
	/**
	 * Make a request on the QA_TASK_ASSIGN service
	 * Assign a task to another administrative user.
	 * @param String context The AP interface framework context (see Context.js)
	 * @param Number taskID The ID of the task stored in a hidden field
	 * @param Number assigneeID The user ID of the asignee
	 */
	assignTask: function(context, taskID) {
		// Get the assignee
   		var message = 'You are about to assign this Task to another user. You will no longer see the task in your list. Click OK to continue.';
 		var answer = confirm(message);
		if (answer) {
			var elementID = Context.QATASKS + Service.SCOPE_SEPARATOR + Widget.QA_TASK_VIEWER + Service.SCOPE_SEPARATOR + 'assign';
			//var assigneeID = $(elementID).options.selectedIndex;
			var assigneeID = $(elementID).options[$(elementID).options.selectedIndex].value;
			var pars = 'service=' + QAService.QA_TASK_ASSIGN;
			pars += '&' + 'context=' + context;
			pars += '&' + 'entityID=' + taskID;
			pars += '&' + 'instanceID=' + assigneeID;
			
			var onSuccessFunction = 'QAService.success';
			var onFailureFunction = 'Service.failure';
			new Ajax.Request(Service.URL, {
				parameters: pars,
				onSuccess: eval(onSuccessFunction),
				onFailure: eval(onFailureFunction)
			});
		} else {
			var taskID = $('qatasks-qATaskViewer-task-id').value;
			var target = 'qatasks-task';			
			QAService.taskViewer(Context.QATASKS, target, taskID);			
		}
	},
	
	assignCase: function(context, QACaseID) {
		// Get the assignee
   		var message = 'You are about to assign this QA case to another user. Click OK to continue.';
   		var answer = confirm(message);
		if (answer) {
			var elementID = Context.QACASES + Service.SCOPE_SEPARATOR + Entity.QACASE + Service.SCOPE_SEPARATOR + 'assign';
			//var assigneeID = $(elementID).options.selectedIndex;
			var assigneeID = $(elementID).options[$(elementID).options.selectedIndex].value;
			var pars = 'service=' + QAService.QA_CASE_ASSIGN;
			pars += '&' + 'context=' + context;
			pars += '&' + 'entityID=' + QACaseID;
			pars += '&' + 'instanceID=' + assigneeID;
			
			var onSuccessFunction = 'QAService.success';
			var onFailureFunction = 'Service.failure';
			new Ajax.Request(Service.URL, {
				parameters: pars,
				onSuccess: eval(onSuccessFunction),
				onFailure: eval(onFailureFunction)
			});
		} else {
			var QACaseID = $('qacases-qacase-id').value;
			var target = 'qacases-qacase';			
			QAService.caseViewer(Context.QACASES, target, QACaseID);			
		}
	},
	
	/**
	 * Make a request on the QA_TASK_SAVE service
	 * Saves the state of a task. This means any comments as well as task-specific
	 * data, if any, will be saved.
	 * @param String context The AP interface framework context (see Context.js)
	 */
	saveTask: function(context) {
  		var message = 'You are about to save this Task. Click OK to continue.';
 		var answer = confirm(message);
		if (answer) {			
 	 		var formID = context + Service.SCOPE_SEPARATOR + Entity.TASK + Service.SCOPE_SEPARATOR + 'form';
	 		var pars = 'service=' + QAService.QA_TASK_SAVE;
			pars += '&' + 'context=' + context;
			pars += '&' + 'entityID=' + QAService.getTaskID(context);
			var data = $(formID).serialize();				
			pars += '&' + data;
	   		var onSuccessFunction = 'QAService.success';
			var onFailureFunction = 'Service.failure';
			new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
		}	
	},
	
	/**
	 * Make a request on the QA_TASK_COMPLETE service
	 * Assigns a non-APEL task as complete.
	 * @param String context The AP interface framework context (see Context.js)
	 */
	completeTask: function(context) {		
    	var message = 'You are about to assign this Task as completed. Click OK to continue.';
    	try{
    		message = $(context+Service.SCOPE_SEPARATOR+QAService.QA_TASK_COMPLETE+Service.SCOPE_SEPARATOR+'message').value;
    	}catch(err){;}
 		var answer = confirm(message);
		if (answer) {
 	 		var formID = context + Service.SCOPE_SEPARATOR + Entity.TASK + Service.SCOPE_SEPARATOR + 'form';
			
	 		var pars = 'service=' + QAService.QA_TASK_COMPLETE;
			pars += '&' + 'context=' + context;
			pars += '&' + 'entityID=' + QAService.getTaskID(context);
			var data = $(formID).serialize();				
			pars += '&' + data;
	
	   		var onSuccessFunction = 'QAService.success';
			var onFailureFunction = 'Service.failure';
			new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
		}	
	},
	
	/**
	 * Make a request on the QA_TASK_BACK service
	 * Reverts back a non-APEL task to the previous task.
	 * @param String context The QA interface framework context (see Context.js)
	 */
	backTask: function(context) {		
    	var message = 'You are about to revert back to the previous task. Data entered here will be lost, Click OK to continue.';
    	try{
    		message = $(context+Service.SCOPE_SEPARATOR+QAService.QA_TASK_COMPLETE+Service.SCOPE_SEPARATOR+'message').value;
    	}catch(err){;}
 		var answer = confirm(message);
		if (answer) {
 	 		var formID = context + Service.SCOPE_SEPARATOR + Entity.TASK + Service.SCOPE_SEPARATOR + 'form';
			
	 		var pars = 'service=' + QAService.QA_TASK_BACK;
			pars += '&' + 'context=' + context;
			pars += '&' + 'target=' + context + Service.SCOPE_SEPARATOR + Entity.TASK;
			pars += '&' + 'entityID=' + QAService.getTaskID(context);
			var data = $(formID).serialize();				
			pars += '&' + data;
	
	   		var onSuccessFunction = 'QAService.contentSuccess';
			var onFailureFunction = 'Service.failure';
			new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
		}	
	},

	/**
	 * Make a request on the QA_TASK_APPROVE service
	 * Assigns a APEL as approved and the task as complete.
	 * @param String context The AP interface framework context (see Context.js)
	 */
	approveAPEL: function(context) {
   		var message = 'You are about to approve an APEL submission. Click OK to continue.';
 		var answer = confirm(message);
		if (answer) {
 	 		var formID = context + Service.SCOPE_SEPARATOR + Entity.TASK + Service.SCOPE_SEPARATOR + 'form';
			
	 		var pars = 'service=' + QAService.QA_TASK_APPROVE;
			pars += '&' + 'context=' + context;
			pars += '&' + 'entityID=' + QAService.getTaskID(context);
			var data = $(formID).serialize();				
			pars += '&' + data;
			
	   		var onSuccessFunction = 'QAService.success';
			var onFailureFunction = 'Service.failure';
			new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
		}	
	},
	
	/**
	 * Make a request on the QA_TASK_FAIL service
	 * Assigns a APEL as failed and the task as complete.
	 * @param String context The AP interface framework context (see Context.js)
	 */
	failAPEL: function(context) {		
    	var message = 'You are about to fail an APEL submission. Click OK to continue.';
 		var answer = confirm(message);
		if (answer) {
 	 		var formID = context + Service.SCOPE_SEPARATOR + Entity.TASK + Service.SCOPE_SEPARATOR + 'form';
			
	 		var pars = 'service=' + QAService.QA_TASK_FAIL;
			pars += '&' + 'context=' + context;
			pars += '&' + 'entityID=' + QAService.getTaskID(context);
			var data = $(formID).serialize();				
			pars += '&' + data;
			
	   		var onSuccessFunction = 'QAService.success';
			var onFailureFunction = 'Service.failure';
			new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
		}	
	},

	/**
	 * Make a request on the QA_APPLICANT_VIEWER service
	 * Delivers data for a selected applicant in the QA_APPLICANT_VIEWER widget.
	 * @param String context The AP interface framework context (see Context.js)
	 */
	applicantViewer: function(context) {
		// Get the user ID
		var elementID = Context.QAAPPLICANTS + Service.SCOPE_SEPARATOR + 'aPUserLister-select';	
		var optionID = $(elementID).options[$(elementID).options.selectedIndex].value;
		var userID = Names.getInstanceID(optionID);
		
 		var pars = 'service=' + QAService.QA_APPLICANT_VIEWER;
		pars += '&' + 'context=' + context;
		pars += '&' + 'target=' + 'apapplicants-user';
		pars += '&' + 'widget=' + Widget.QA_APPLICANT_VIEWER;
		pars += '&' + 'entityID=' + userID;

   		var onSuccessFunction = 'QAService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
	},

	/**
	 * Make a request on the QA_CIBSE_USER_VIEWER service
	 * Delivers data for a selected CIBSE administrative user
	 * in the QA_CIBSE_USER_VIEWER widget.
	 * @param String context The AP interface framework context (see Context.js)
	 */
	cibseUserViewer: function(context) {
		// Get the user ID
		var elementID = Context.QACIBSEUSERS + Service.SCOPE_SEPARATOR + 'aPUserLister-select';	
		var optionID = $(elementID).options[$(elementID).options.selectedIndex].value;
		var userID = Names.getInstanceID(optionID);

		var pars = 'service=' + QAService.QA_CIBSE_USER_VIEWER;
		pars += '&' + 'context=' + context;
		pars += '&' + 'target=' + 'apcibseusers-user';
		pars += '&' + 'widget=' + Widget.QA_CIBSE_USER_VIEWER;
		pars += '&' + 'entityID=' + userID;
		
   		var onSuccessFunction = 'QAService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
	},

	/**
	 * Make a request on the QA_CIBSE_USER_LISTER service
	 * Delivers data for a selected external administrative user (referee or assessor)
	 * in the QA_CIBSE_USER_LISTER widget.
	 * @param String context The AP interface framework context (see Context.js)
	 */
	externalUserViewer: function(context) {
		// Get the user ID
		var elementID = Context.QAEXTERNALUSERS + Service.SCOPE_SEPARATOR + 'aPUserLister-select';	
		var optionID = $(elementID).options[$(elementID).options.selectedIndex].value;
		var userID = Names.getInstanceID(optionID);

		var pars = 'service=' + QAService.QA_CIBSE_USER_LISTER;
		pars += '&' + 'context=' + context;
		pars += '&' + 'target=' + 'qaexternalusers-user';
		pars += '&' + 'widget=' + Widget.QA_CIBSE_USER_LISTER;
		pars += '&' + 'entityID=' + userID;
		
   		var onSuccessFunction = 'QAService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
	},

	/**
	 * Make a request on the QA_APPLICANT_LISTER service
	 * Delivers a list of applicants in the QA_USER_LISTER widget.
	 * @param String context The AP interface framework context (see Context.js)
	 * @param {Object} selected Defines the currently selected user
	 */
	applicantLister: function(context, selected) {
 		var pars = 'service=' + QAService.QA_APPLICANT_LISTER;
		pars += '&' + 'context=' + context;
		pars += '&' + 'target=' + 'apapplicants-lister-user';
		pars += '&' + 'widget=' + Widget.QA_USER_LISTER;
		if (selected != undefined && selected != null && selected.length > 0) {
			pars += '&' + 'entityID=' + selected;
		}
   		var onSuccessFunction = 'QAService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
	},

	/**
	 * Make a request on the QA_EXTERNAL_USER_LISTER service
	 * Delivers a list of external administrative users in the QA_USER_LISTER widget.
	 * @param String context The AP interface framework context (see Context.js)
	 * @param {Object} selected Defines the currently selected user
	 */
	externalUserLister: function(context, selected) {
		var pars = 'service=' + QAService.QA_EXTERNAL_USER_LISTER;
		pars += '&' + 'context=' + context;
		pars += '&' + 'target=' + 'qaexternalusers-lister-user';
		pars += '&' + 'widget=' + Widget.QA_USER_LISTER;
		if (selected != undefined && selected != null && selected.length > 0) {
			pars += '&' + 'entityID=' + selected;
		}
		
   		var onSuccessFunction = 'QAService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
	},

	/**
	 * Make a request on the QA_CIBSE_USER_LISTER service
	 * Delivers a list of CIBSE administrative users in the QA_USER_LISTER widget.
	 * @param String context The AP interface framework context (see Context.js)
	 * @param {Object} selected Defines the currently selected user
	 */
	cibseUserLister: function(context, selected) {
		var pars = 'service=' + QAService.QA_CIBSE_USER_LISTER;
		pars += '&' + 'context=' + context;
		pars += '&' + 'target=' + 'apcibseusers-lister-user';
		pars += '&' + 'widget=' + Widget.QA_USER_LISTER;
		if (selected != undefined && selected != null && selected.length > 0) {
			pars += '&' + 'entityID=' + selected;
		}
		
   		var onSuccessFunction = 'QAService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
	},

	/**
	 * Force a refresh of a list of users
	 * Delivers a refreshed list of users in the QA_USER_LISTER widget.
	 * @param String context The AP interface framework context (see Context.js)
	 */
	refreshUserList: function(context) {		
		switch(context) {
			case Context.QAAPPLICANTS:
				QAService.applicantLister(context);
				break;
			case Context.QAEXTERNALUSERS:
				QAService.externalUserLister(context);
				break;
			case Context.QACIBSEUSERS:
				QAService.cibseUserLister(context);
				break;
		}
		Entity.closeViewer(context, Entity.USER);
		Entity.closeViewer(context, "lowerform");
	},

	/**
	 * Make a request on the QA_TASK_LISTER service
	 * Delivers a list of tasks in the QA_TASK_LISTER widget.
	 * @param String context The AP interface framework context (see Context.js)
	 * @param String}target Defines the target DOM objects for the list widget
	 * @param target filterID Defines the currently selected task list filter
	 */
	taskLister: function(context, target, filterID) {
		var pars = 'service=' + QAService.QA_TASK_LISTER;
		pars += '&' + 'context=' + context;
		pars += '&' + 'target=' + target;
		pars += '&' + 'widget=' + Widget.QA_TASK_LISTER;
		if (filterID != undefined && filterID != null) {
			pars += '&' + 'filterID=' + filterID;
		}
		
		try{
			var radioID = context + Service.SCOPE_SEPARATOR + Widget.QA_TASK_FILTER + Service.SCOPE_SEPARATOR + 'radio';
			var option = getRadioValue(radioID);
			
			var termID = context + Service.SCOPE_SEPARATOR + Widget.QA_TASK_FILTER + Service.SCOPE_SEPARATOR + 'term';
			var term = $(termID).value;
		
			if(typeof(option) != undefined && typeof(term) != undefined){
			
				// Check term is OK and matches selected radio option
				if (option == 'ea') {
					if (term.length == 0) {
						document.body.style.cursor = '';
						alert('Please enter a 6 digit EA certificate number without the LCEA prefix');
						return;
					}
					var regex = /^[0-9]{6}$/;
				    var value = term.replace(regex, '');
					if (value.length > 0) {
						document.body.style.cursor = '';
						alert('Your EA Certificate Number is invalid: A 6 digit number is required');
						return;			
					}
				}
			}
		}catch(err){;}
				
   		var onSuccessFunction = 'QAService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
	},
	
	/**
	 * Make a request on the QA_TASK_LISTER service
	 * Delivers a set of task list filter options in the QA_TASK_LISTER widget.
	 * @param String context The AP interface framework context (see Context.js)
	 * @param String}target Defines the target DOM objects for the filter
	 */
	taskFilter: function(context, target) {
		var pars = 'service=' + QAService.QA_TASK_FILTER;
		pars += '&' + 'context=' + context;
		pars += '&' + 'target=' + target;
		pars += '&' + 'widget=' + Widget.QA_TASK_FILTER;
		var onSuccessFunction = 'QAService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
	},

	/**
	 * Force a refresh of a list of tasks
	 * Delivers a refreshed list of tasks in the QA_TASK_LISTER widget.
	 * @param String context The AP interface framework context (see Context.js)
	 */
	refreshTaskList: function(context) {
		// Get the current filter value
		var filterID = null;
		var userID = null;
		try {
			var elementID = context + Service.SCOPE_SEPARATOR + Widget.QA_TASK_FILTER + Service.SCOPE_SEPARATOR + Entity.TASK + Service.SCOPE_SEPARATOR + 'filter';
			filterID = $(elementID).value;		
			
		} catch(err) {;}
		try{
			var elementID = context + Service.SCOPE_SEPARATOR + Widget.QA_TASK_FILTER + Service.SCOPE_SEPARATOR + Entity.USER + Service.SCOPE_SEPARATOR + 'id';
			userID = $(elementID).value;
		} catch(err) {;}
		switch(context) {
			case Context.QATASKS:
				var target = 'qatasks-lister-task';
				try{
					var radioID = context + Service.SCOPE_SEPARATOR + Widget.QA_TASK_FILTER + Service.SCOPE_SEPARATOR + 'radio';
					var option = getRadioValue(radioID);
					var termID = context + Service.SCOPE_SEPARATOR + Widget.QA_TASK_FILTER + Service.SCOPE_SEPARATOR + 'term';
					var term = $(termID).value;
					filterID += "&term="+term+"&option="+option+"&userID="+userID;
					
					
					var radioID = context + Service.SCOPE_SEPARATOR + Widget.QA_CASE_SEARCHER + Service.SCOPE_SEPARATOR + 'radio';
					var option = getRadioValue(radioID);

					if (term.trim().length > 0) {
						// Check term is OK and matches selected radio option
						if (option == 'ea') {
							if (term.length == 0) {
								document.body.style.cursor = '';
								alert('Please enter a 6 digit EA certificate number without the LCEA prefix');
								return;
							}
							var regex = /^[0-9]{6}$/;
						    var value = term.replace(regex, '');
							if (value.length > 0) {
								document.body.style.cursor = '';
								alert('Your EA Certificate Number is invalid: A 6 digit number is required');
								return;			
							}
						}
					}
				
				}catch(err){;}
				QAService.taskLister(context, target, filterID);
				break;
			case Context.QAEXTERNAL:
				var target = 'qaexternal-lister-task';
				QAService.taskLister(context, target, filterID);
				break;
		}
		Entity.closeViewer(context, Entity.TASK);
		Entity.closeViewer(context, "lowerform");
		Entity.closeViewer(context, Entity.APEL);
	},

	/**
	 * Make a request on the QA_TASK_VIEWER service
	 * Delivers data for a selected task in the QA_TASK_VIEWER widget.
	 * @param String context The AP interface framework context (see Context.js)
	 * @param String target The ID of the DOM object for the viewer
	 * @param Number taskID The ID of the task stored in a hidden field
	 */
	taskViewer: function(context, target, taskID) {
 		var pars = 'service=' + QAService.QA_TASK_VIEWER;
		pars += '&' + 'context=' + context;
		pars += '&' + 'target=' + target;
		pars += '&' + 'widget=' + Widget.QA_TASK_VIEWER;
		pars += '&' + 'entityID=' + taskID;
		var prefix = context+Service.SCOPE_SEPARATOR+Widget.QA_TASK_VIEWER+Service.SCOPE_SEPARATOR;
		try{
			pars += '&'+prefix+'reportTypeID='+$(prefix+'reportTypeID').value; 
		}catch(err){;}
   		var onSuccessFunction = 'QAService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
	},


	/**
	 * Make a request on the QA_FORM_VIEWER service
	 * Delivers data for a task's Pre-APEL or ALEL form in the QA_FORM_VIEWER widget.
	 * Invoked automatically when viewing these tasks:
	 * task_3, task_5, task_6, task_8, task_10, task_11
	 * @param String context The AP interface framework context (see Context.js)
	 * @param String target The ID of the DOM object for the viewer
	 * @param Number taskID The ID of the task stored in a hidden field.
	 */
	formViewer: function(context, target, taskID) {
		
  		var pars = 'service=' + QAService.QA_FORM_VIEWER;
		pars += '&' + 'context=' + context;
		pars += '&' + 'target=' + target;
		pars += '&' + 'widget=' + Widget.QA_FORM_VIEWER;
		pars += '&' + 'entityID=' + taskID;
		var onSuccessFunction = 'QAService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
	},
	
	EAformViewer: function(context, target, taskID) {
		
  		var pars = 'service=' + QAService.QA_FORM_VIEWER;
		pars += '&' + 'context=' + context;
		pars += '&' + 'target=' + target;
		pars += '&' + 'widget=' + Widget.QA_FORM_VIEWER;
		pars += '&' + 'entityID=' + taskID;
		
		var prefix = context+Service.SCOPE_SEPARATOR+Widget.QA_FORM_VIEWER+Service.SCOPE_SEPARATOR;
		try{
			pars +='&'+prefix+'eaSelectionMethodID='+$(prefix+'eaSelectionMethodID').value;
		}catch(err){;}
		try{
			pars +='&'+prefix+'ea='+$(prefix+'ea').value;
		}catch(err){;}
		try{
			pars +='&'+prefix+'reportTypeID='+$(prefix+'reportTypeID').value;
		}catch(err){;}
		
  		var onSuccessFunction = 'QAService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
	},
		
	saveQACase: function (context,entity,entityID,data){
		var pars = 'service=' + QAService.QA_CASE_SAVE;
		pars += '&' + 'context=' + context;
		pars += '&' + 'entity=' + Entity.QACASE;
		pars += '&' + 'entityID=' + entityID;
		pars += data;
  		var onSuccessFunction = 'QAService.success';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   
	},
	
	cancelQACase: function(elementID){
		var reason = $(Context.QACASES+Service.SCOPE_SEPARATOR+Entity.QACASE+Service.SCOPE_SEPARATOR+'reason').value;
		if(reason.length==0){
			alert("You must state why you are cancelling this QACase");
			return "";
		}
		var message = 'You are about cancel the QA Case this action cannot be undone. Click OK to continue.';
 		var answer = confirm(message);
		if (answer) {
			var pars = 'service=' + QAService.QA_CASE_CANCEL;
			pars += '&' + 'context=' + Context.QACASES;
			pars += '&' + 'entity=' + Entity.QACASE;
			try{
				pars += '&' + 'entityID=' + $(Context.QACASES+Service.SCOPE_SEPARATOR+Entity.QACASE+Service.SCOPE_SEPARATOR+'id').value;
			}catch(err){;}
			pars += '&' + 'reason=' + reason;
	  		var onSuccessFunction = 'QAService.success';
			var onFailureFunction = 'Service.failure';
			new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
		}
	},
	
	skip: function(elementID){
		
		var message = 'You are about skip the current task. Are you sure?';
 		var answer = confirm(message);
		if (answer) {
			var pars = 'service=' + QAService.QA_CASE_SKIP;
			pars += '&' + 'context=' + Context.QACASES;
			pars += '&' + 'entity=' + Entity.QACASE;
			try{
				pars += '&' + 'entityID=' + $(Context.QACASES+Service.SCOPE_SEPARATOR+Entity.QACASE+Service.SCOPE_SEPARATOR+'id').value;
			}catch(err){;}
			var onSuccessFunction = 'QAService.success';
			var onFailureFunction = 'Service.failure';
			new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
		}
	},
	
	addCaseToQA:function(){
		var pars = 'service=' + QAService.CASE_ADD_TO_QA;
		pars += '&' + 'context=' + Context.ADMINCASES;
		pars += '&' + 'entity=' + Entity.CASE;
		try{
			pars += '&' + 'entityID=' + $(Context.ADMINCASES+Service.SCOPE_SEPARATOR+'viewer'+Service.SCOPE_SEPARATOR+'case-id').value;
		}catch(err){;}
  		var onSuccessFunction = 'QAService.success';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
	},
	QALowerFormViewer:function(context,service,target,taskID,widget,selectID){
		var pars = 'service=' + service;
		pars += '&' + 'context=' + context;
		pars += '&' + 'target=' + target;
		pars += '&' + 'widget=' + widget;
		pars += '&' + 'entityID=' + taskID;
		
		try{
			selectname = selectID.split(Service.SCOPE_SEPARATOR);
			selectname=selectname[selectname.length-1];
			pars +='&' +selectname +'ID='+$(selectID).value;
		}catch(err){;}
  		var onSuccessFunction = 'QAService.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
	}
	
	
}
