/**
* Methods for making calls on framework services and statics describing application services
*/

var Service = {

	SCOPE_SEPARATOR: '-',
	ID_SEPARATOR: '_',
	INSTANCE_SEPARATOR: "|",

	// The URL of the request broker which handles all requests for services
	URL: 'requestBroker.php',

	// Keep this next section synchronised with Service.php
	DOWNLOAD: 'download',
	REPORTS: 'reports',
	SEARCHER: 'searcher',
	BUTTONS: 'buttons',
	FSTREE: 'fstree',
	FSTREE_CONTROLS: 'fstreeControls',
	FSTREE_EDITOR: 'fstreeEditor',



	LISTER: 'lister',
	VIEWER: 'viewer',

	EDITOR_CREATE: 'editor.create',
	EDITOR_EDIT: 'editor.edit',
	EDITOR_SAVE: 'editor.save',
	EDITOR_REMOVE: 'editor.remove',
	EDITOR_CANCEL: 'editor.cancel',
	EDITOR_REFRESH: 'editor.refresh',

	TREE_NODE_SELECT: 'tree.node.select',
	TREE_NODE_CREATE: 'tree.node.create',
	TREE_NODE_REMOVE: 'tree.node.remove',
	TREE_NODE_RENAME: 'tree.node.rename',
	TREE_ENTITY_TREE: 'tree.entity.tree',
	TREE_EDITOR: 'tree.editor',
	TREE_PICKER: 'tree.picker',
	TREE_REORDER: 'tree.reorder',

	// File system tree services
	FSTREE_NODE_CREATE: 'fstree.node.create',
	FSTREE_NODE_REMOVE: 'fstree.node.remove',
	FSTREE_NODE_RENAME: 'fstree.node.rename',
	
	FILE_UPLOAD: 'file_upload',
	FILE_CREATE: "file_create",
	FILE_CHECKPROGRESS: "file_checkprogress",
	FILE_LIST: "file_list",
	FILE_REMOVE: "file_remove",
	FILE_COMPARE: "file_compare",
	FILE_CHECK: 'file_check',
	FILE_DOWNLOAD: 'file_download',
	
	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;
		try{
			$(target).update(content)
		}catch(err){;}
		switch(service) {
			case "file_checkprogress":
				if(content=="-1"){
					var data = root.getElementsByTagName('data')[0].firstChild.data;
					['busy'].each(Element.hide);
					alert("Failed to upload the file - "+data);
					break;
				}
				else if(content=="0"){
					var entity = root.getElementsByTagName('entity')[0].firstChild.data;
					Service.ListFiles(context,entity);
					Service.fileCompare(context,entity);
					['busy'].each(Element.hide);
					alert("The upload is complete");
					
					break;
				}
				else{
					setTimeout("Service.CheckUploadProgress()",1000);
					break;
				}
			case Service.FILE_CREATE:
				//find out what entity the form is so we can create the id to submit the form
				switch(context){
					case Context.QATASKS:
						formEntity = Entity.TASK;
						break;
					default:
						formEntity = root.getElementsByTagName('entity')[0].firstChild.data;
						break;
				}
		 		Service.FormSubmit(context+Service.SCOPE_SEPARATOR+formEntity+Service.SCOPE_SEPARATOR+'form');
		 		break;
			case Service.EDITOR_REMOVE:
				var entity = root.getElementsByTagName('entity')[0].firstChild.data;
				var entityID = root.getElementsByTagName('entityID')[0].firstChild.data;
				switch(entity) {
					case Entity.NOTE:
					case Entity.ACTION:
						var relatedEntityField = context + Service.SCOPE_SEPARATOR + 'entity';
						var relatedEntity = $(relatedEntityField).value;
						var relatedEntityIDField = context + Service.SCOPE_SEPARATOR + 'instanceID';
						var relatedEntityID = $(relatedEntityIDField).value;
				  		var filter = new ListFilter(relatedEntity, relatedEntityID);
					default:
						var eventHandler = 'Entity.view(\'' + context + '\',\'' + entity + '\',\'@id\')';
						Entity.list(context, entity, eventHandler, null, filter);
						break;
				}
				Entity.closeViewer(context, entity);
				break;
			case Service.EDITOR_CANCEL:
				var dirtyID = dirty.getDirty(context);
				if (dirtyID > 0) dirty.remove(context);
				var entity = root.getElementsByTagName('entity')[0].firstChild.data;
				Entity.cancelEditor(context, entity);
				break;
			case Service.EDITOR_SAVE:
				var dirtyID = dirty.getDirty(context);
				if (dirtyID > 0) dirty.remove(context);
				var entity = root.getElementsByTagName('entity')[0].firstChild.data;
				var entityID = root.getElementsByTagName('entityID')[0].firstChild.data;
				switch(entity) {
					case Entity.NOTE:
					case Entity.ACTION:
						var relatedEntityField = context + Service.SCOPE_SEPARATOR + 'entity';
						var relatedEntity = $(relatedEntityField).value;
						var relatedEntityIDField = context + Service.SCOPE_SEPARATOR + 'instanceID';
						var relatedEntityID = $(relatedEntityIDField).value;
				  		var filter = new ListFilter(relatedEntity, relatedEntityID);
					default:
						dirty.remove(context);
						var selection = new Selection(entity, entityID);
						var eventHandler = 'Entity.view(\'' + context + '\',\'' + entity + '\',\'@id\')';
						Entity.list(context, entity, eventHandler, selection, filter);
						break;
				}
				Entity.edit(context, entity, entityID);
				break;
			case Service.EDITOR_CREATE:
				var entity = root.getElementsByTagName('entity')[0].firstChild.data;
				// Call the entity type to do additional related entity stuff
				try {
					var call = entity.ucFirst() + '.create(\'' + context + '\')';
					eval(call);
				} catch(err) {alert(err + ' error calling create for: ' + entity);}
				// Request the edit buttons
				var target = context + Service.SCOPE_SEPARATOR + Service.BUTTONS + Service.SCOPE_SEPARATOR + entity;
				if (entity == Entity.CASE) {
					Service.buttons(target, context, Widget.CASE_EDITOR_BUTTONS, entity, null);
				} else {
					Service.buttons(target, context, Widget.EDITOR_BUTTONS, entity, null);
				}
				dirty.add(context);
				break;
			case Service.EDITOR_EDIT:
			
				var entity = root.getElementsByTagName('entity')[0].firstChild.data;
				var entityID = root.getElementsByTagName('entityID')[0].firstChild.data;
				// Call the entity type
				try {
					var call = entity.ucFirst() + '.edit(\'' + context + '\',\'' + entityID + '\')';
					eval(call);
				} catch(err) {alert(err + 'error calling edit for: ' + entity);}
				// Request the edit buttons
				var target = context + Service.SCOPE_SEPARATOR + Service.BUTTONS + Service.SCOPE_SEPARATOR + entity;
				if (entity == Entity.CASE) {
					Service.buttons(target, context, Widget.CASE_EDITOR_BUTTONS, entity, entityID);
				} else {
					Service.buttons(target, context, Widget.EDITOR_BUTTONS, entity, entityID);
				}
				dirty.add(context, entityID);
				break;
			case Service.VIEWER:
				var entity = root.getElementsByTagName('entity')[0].firstChild.data;
				var entityID = root.getElementsByTagName('entityID')[0].firstChild.data;
				try {
					var call = entity.ucFirst() + '.view(\'' + context + '\',\'' + entityID + '\')';
					eval(call);
				} catch(err) {;}
				// Request the view buttons
				var target = context + Service.SCOPE_SEPARATOR + Service.BUTTONS + Service.SCOPE_SEPARATOR + entity;
				if (entity == Entity.CASE) {
					Service.buttons(target, context, Widget.CASE_VIEWER_BUTTONS, entity, entityID);
				} else if (entity == Entity.EA) {
					Service.buttons(target, context, Widget.EA_VIEWER_BUTTONS, entity, entityID);
				} else {
					Service.buttons(target, context, Widget.VIEWER_BUTTONS, entity, entityID);
				}
				break;
			case AdminService.LOGIN:
				document.location = 'workbench.php';
				break;
			default:
				break;
		}
	},


	/**
	* General success handler for services that are not returning XHTML, i.e. services without a widget
	*/
	success: function(xhrObject) {
		document.body.style.cursor = "";
		var xmlObject = XML.getXMLObject(xhrObject);
		var message ="";
		// Look for an error
		var error = xmlObject.getElementsByTagName('error')[0];
		if (error != undefined) {
			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 service = root.getElementsByTagName('service')[0].firstChild.data;
		if (message.length > 0 && !gotError && service != Service.FILE_CHECK) {
			alert(message);
		}
		switch(service) {
			case Service.FILE_REMOVE:
				Service.ListFiles(context,Entity.QACASE);
				Service.fileCompare(context,Entity.QACASE);
				break;
			case Service.FILE_CHECK:
				var fileID = root.getElementsByTagName('message')[0].firstChild.data;
				Service.fileDownload(fileID);
				break;
			case Service.REPORTS:
				// If we get here then there is something to report so back to the server to force a file save dialog
				var pars = 'service=' + Service.REPORTS;
				var reportID = root.getElementsByTagName('reportID')[0].firstChild.data;
				pars += '&' + 'reportID=' + reportID;
				pars += '&' + 'generateReport=' + 'true';
				// Forces a file save dialog
				document.location = 'requestBroker.php?' + pars;		
				break;
			case AdminService.LOGOUT:
				document.location = 'workbench.php';
				break;
			case AdminService.REMOVED_PURGE:
			case AdminService.REMOVED_RESTORE:
				//AdminService.refreshRemoved(Context.ADMIN, 'admin-lister-entity-select');
				AdminService.refreshRemoved(Context.ADMIN);
				break;
			case AdminService.CHANGE_PASSWORD:
				alert('Password updated');
				// Clear the form fields
				var textInputElements = $(Context.PROFILE + Service.SCOPE_SEPARATOR + 'password' + Service.SCOPE_SEPARATOR + 'form').getInputs('password');
				for (i = 0; i < textInputElements.length; i++) {
					$(textInputElements[i]).value = '';
				}
				break;
			
			default:
				break;
		}
	},


	failure: function(xhrObject) {
		document.body.style.cursor = "";
		alert('Sorry there was a problem servicing your request');
	},


	/**
	* Make reports service request
	* @param reportID id defining requested report
	*/
	reports: function(reportID) {
		var pars = 'service=' + Service.REPORTS;
		pars += '&' + 'reportID=' + reportID;
		// Check whether report status
		var onSuccessFunction = 'Service.success';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
	},

	/**
	* Make searcher service request
	* @param context the context of the request
	* @param entity the name of the entity being edited
	* @param service the editor service required
	* @param widget the buttons widget to use
	* @param entity the entity type
	* @param filterOptions array of filter values used when a filter searcher is required
	*/
	searcher: function(target, context, widget, entity, filterOptions) {
		var pars = 'service=' + Service.SEARCHER;
		pars += '&' + 'target=' + target;
		pars += '&' + 'context=' + context;
		pars += '&' + 'widget=' + widget;
		pars += '&' + 'entity=' + entity;
		if (filterOptions != undefined && filterOptions != null) pars += '&' + filterOptions.serialize();
		var onSuccessFunction = 'Service.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
	},

	/**
	* Make buttons service request
	* @param context the context of the request
	* @param entity the name of the entity being edited
	* @param service the editor service required
	* @param widget the buttons widget to use
	* @param entity the entity type
	* @param entityID the id of an entity instance
	*/
	buttons: function(target, context, widget, entity, entityID) {
		var pars = 'service=' + Service.BUTTONS;
		pars += '&' + 'target=' + target;
		pars += '&' + 'context=' + context;
		pars += '&' + 'widget=' + widget;
		pars += '&' + 'entity=' + entity;
		if (entityID != undefined && entityID != null) pars += '&' + 'entityID=' + entityID;
		var onSuccessFunction = 'Service.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
	},
	

	/**
	* Make lister service request
	*
	* @param target the target element into which widget XHTML is placed
	* @param context the context in which the lister is required
	* @param entity the entity type being listed
	* @param label label for list overrides the default
	* @param eventHandler the event handler for the select (required to support option selection in IE which does not support bubbling up to an enclosing div for select elements)
	* @param size the size attribute of the list's select element created by a ListerWidget
	* @param multiple the size attribute of the list's select element created by a ListerWidget
	* @param filter optional filter which reduces the list options to those related to another entity instance defined by the filter
	* @param widget optional - if defined overrides the default Lister widget, e.g. FlatListWidget
	* @param selection optional - defines the selected options of the select element created by a ListerWidget
	* @param exclusions optional - defines the excluded items of the select element created by a ListerWidget
	* @param suffix optional - defines an suffix for the id of a select element created by a ListerWidget. This permits multiple listings of the
	* same entity in a given context. For example, product descriptors and category descriptors of a collection. Usage:
	* <context>-lister-<entity>-<suffix>-select
	*/
	lister: function(target, context, entity, label, eventHandler, size, multiple, filter, widget, selection, exclusions, suffix) {
		var pars = 'service=' + Service.LISTER;
		pars += '&' + 'target=' + target;
		pars += '&' + 'context=' + context;
		pars += '&' + 'entity=' + entity;
		if (label != undefined && label != null && label.length > 0) pars += '&' + 'label=' + label;
		pars += '&' + 'eventHandler=' + eventHandler;
		if (size == undefined || size.length == 0) pars += '&' + 'size=15';
		else pars += '&' + 'size=' + size;
		pars += '&' + 'disabled=false';
		if (multiple != undefined && multiple != null && multiple) pars += '&' + 'multiple=' + multiple;
		if (filter != undefined && filter != null) pars += '&' + filter.serialize();
		if (widget != undefined && widget != null && widget.length > 0) pars += '&' + 'widget=' + widget;
		else pars += '&' + 'widget=' + Widget.LISTER;
		if (selection != undefined && selection != null) pars += '&' + selection.serialize();
		if (exclusions != undefined && exclusions != null) pars += '&' + exclusions.serialize();
		if (suffix != undefined && suffix != null && suffix.length > 0) pars += '&' + 'suffix=' + suffix;
		var onSuccessFunction = 'Service.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
	},

	/**
	* Make editor service request
	* @param context the context of the request
	* @param entity the name of the entity being edited
	* @param service the editor service required
	* @param entityID the id of the edited entity - null if creating an entity
	* @param data form data
	* @param subContext optional parameter for entity types with sub-contexts with individual forms
	*/
	editor: function(target, context, entity, service, entityID, data, subContext) {
		var pars = 'service=' + service;
		pars += '&' + 'target=' + target;
		pars += '&' + 'context=' + context;
		switch(entity) {
			case Entity.CASE:
				pars += '&' + 'widget=' + Widget.CASE_EDITOR;
				break;
			case Entity.EA:
				pars += '&' + 'widget=' + Widget.EA_EDITOR;
				break;
			default:
				pars += '&' + 'widget=' + Widget.EDITOR;
				break;
		}		
		pars += '&' + 'entity=' + entity;
		pars += '&' + 'disabled=false';
		if (entityID != undefined && entityID != null) pars += '&' + 'entityID=' + entityID;
		if (data != undefined && data != null) pars += '&' + data;
		if (subContext != undefined && subContext != null && subContext.length > 0) pars += '&' + 'subContext=' + subContext;
		var onSuccessFunction = 'Service.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
	},

	/**
	* Make viewer service request on an entity
	* @param target the target element into which widget XHTML is placed
	* @param context the context in which the viewer is required
	* @param entity the entity type being listed
	* @param entityID the id of the instance being listed
	*/
	viewer: function(target, context, entity, entityID, profileID) {
		var pars = 'service=' + Service.VIEWER;
		pars += '&' + 'target=' + target;
		pars += '&' + 'context=' + context;
		switch(entity) {
			case Entity.CASE:
				pars += '&' + 'widget=' + Widget.CASE_VIEWER;
				break;
			case Entity.EA:
				pars += '&' + 'widget=' + Widget.EA_VIEWER;
				break;
			default:
				pars += '&' + 'widget=' + Widget.VIEWER;
				break;
		}		
		pars += '&' + 'entity=' + entity;
		pars += '&' + 'disabled=false';
		if (entityID != undefined) pars += '&' + 'entityID=' + entityID;
		if (profileID != undefined && profileID != null && profileID.length > 0) {
			pars += '&' + 'profileID=' + profileID;
		}
		var onSuccessFunction = 'Service.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
	},
	
	/**
	* Make download request
	* @param member id whose document we want to downlaod
	*/
	download: function(fileName, fileSystem) {
		var pars = 'service=' + Service.DOWNLOAD;
		pars += '&' + 'fileName=' + fileName;
		pars += '&' + 'fileSystem=' + fileSystem;
		document.location = Service.URL + '?' + pars;
	},
	
	Upload: function(elementID,formID) {
		//we need to check the element id to find out if the entity instance id is defined within the
		//prefix or if the id is defined in a hidden field. If the instance id is defined in the element id 
		//it will be separated by a pipe |
		
		var instanceID = Names.getIDInstance(elementID);
		var idPrefix = Names.getScopePrefix(elementID);
   		
                try {
                        var file = $F(idPrefix + Service.SCOPE_SEPARATOR + 'file');
                        if (file.length == 0) {
                                        alert("Please select a file.");
                                        return;
                         }
                         //Check file type is zip if this is an upload from the EA QA screen

                        var fileType = $F('file-file_type');
                        if (fileType == 7) {
                            if (!file.endsWith('.zip') && !file.endsWith('.ZIP')) {
                                alert ('The selected file must be a ZIP file');
                                return;
                            }
                        }

               } catch(err) {
                                        alert(err);
                                        return;
                }
                

 		
		// Ask for confirmation
		var answer = confirm('Upload may take a few minutes and cannot be interrupted. Click OK to continue.');
		if (answer) {		
			// File upload is not supported by XMLHTTP so we don't have asynchronous upload. Means we sit here for a bit
	 		var context = Names.getContext(elementID);
	 		var entity = Names.getEntity(elementID);
	 		$('file-context').value = context;
	 		$('file-entity').value = entity;
	 		$('file-service').value = Service.FILE_UPLOAD;
	 		$('file-entityID').value = instanceID;
	 		fileType = $('file-file_type').value;
			/*var pars = 'context=' + context;
			pars += '&' + 'service=' + Service.FILE_UPLOAD;
			pars += '&' + 'entity=' + entity;
			pars += '&' + 'entityID=' + instanceID;*/
			['busy'].each(Element.show);
	 		Service.AjaxContentServiceCall(context,entity,instanceID,Service.FILE_CREATE,'file-file_id',"&file_type_id="+fileType);
	 		$(formID).action = Service.URL;
	 		$(formID).target="file-upload";
			
	 		
			
			// Back to the default action URL
	 		 
		}	
	},
	
	CheckUploadProgress: function(){
		try{
			
			context = $('file-context').value;
			entity = $('file-entity').value;
			file_id = $('file-file_id').value;
			if(file_id.length==0){
				alert("Failed to create a file id");
				return "";
			}
			Service.AjaxContentServiceCall(context,entity,"",Service.FILE_CHECKPROGRESS,'file-uploadstatus',"&file-file_id="+file_id);
		}catch(err){
			alert("Failed to upload");
		}
	},
	
	FormSubmit: function(formID){
		document.test = Service;
		$(formID).method="post";		
		$(formID).submit();
		$(formID).action = 'javascript:void(0);';
		
		/*
		$(formID).method="post";  
		$(formID).encoding=form.enctype="multipart/form-data";
		$(formID).action=Service.URL;
		$(formID).submit();
		$(formID).action = 'javascript:void(0);';
		//Event.stop(event);
		Service.CheckUploadProgress();*/
		
		
	},

	ListFiles: function(context,entity){
		try{

			//try and find the id for the entity we are going to list for
			switch(context){
				case Context.QATASKS:
					entityID = $(context+Service.SCOPE_SEPARATOR+Widget.QA_TASK_VIEWER+Service.SCOPE_SEPARATOR+entity+Service.SCOPE_SEPARATOR+"id").value;
					break;
				case Context.QACASES:
					entityID = $(context+Service.SCOPE_SEPARATOR+entity+Service.SCOPE_SEPARATOR+"id").value;
					break;
				case Context.AS_EXTERNAL:
				case Context.AS_PRE_APEL_APPLICANT:
				case Context.AS_APEL_APPLICANT:
					entityID = ASApel.getID(context);
					break;
				default:
					entityID = "";
					break;
			}
			if(entityID=="")return "";
			target = context+Service.SCOPE_SEPARATOR+'files';
			pars = "";
			try{
				fileTypeID = $('file-file_type').value;
				pars = "&file-file_type="+fileTypeID;
			}catch(err){}
			Service.AjaxContentServiceCall(context,entity,entityID,Service.FILE_LIST,target,pars);
			
		}catch(err){;}
	},
	
	RemoveFile: function(elementID){
		context = Names.getContext(elementID);
		entity = Names.getEntity(elementID);
		entityID = Names.getIDInstance(elementID);
		service = Service.FILE_REMOVE;
		Service.AjaxServiceCall(context,entity,entityID,service,"");
	},
	
	fileCompare: function(context,entity){
		try{
			//try and find the id for the entity we are going to list for
			switch(context){
				case Context.QATASKS:
					entityID = $(context+Service.SCOPE_SEPARATOR+Widget.QA_TASK_VIEWER+Service.SCOPE_SEPARATOR+entity+Service.SCOPE_SEPARATOR+"id").value;
					break;
				default:
					entityID = "";
					break;
			}
			target = context+Service.SCOPE_SEPARATOR+'compare';		
			Service.AjaxContentServiceCall(context,entity,entityID,Service.FILE_COMPARE,target,"");
			
		}catch(err){;}
	},
	
	/**
	 * Make a trip to the server to check for the existence of a requested file
	 * 
	 * @param integer downloadID identifer for pre-APEL/APEL and the file ID
	 */
  	fileCheck: function(downloadID) {
		var message = '';
		var pars = 'service=' + Service.FILE_CHECK;;
		pars += '&' + 'downloadID=' + downloadID;
		
    	var onSuccessFunction = 'Service.success';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});   	
	},

	/**
	 * Download a file
	 * 
	 * @param integer downloadID identifer for pre-APEL/APEL and the file ID
	 */
 	fileDownload: function(downloadID,context) {
		var pars = 'service=' + Service.FILE_DOWNLOAD;
		pars += '&' + 'downloadID=' + downloadID;
		if(typeof(context) != undefined && context != "") pars += '&' + 'context=' + context;
		document.location = Service.URL + '?' + pars;
	},
	
	
	AjaxServiceCall: function(context,entity,entityID,service,extrapars){
		document.body.style.cursor = 'wait';
		pars = '&' + 'context='+ context;
		pars += '&' + 'service=' + service;
		pars += '&' + 'entity=' + entity;
		pars += '&' + 'entityID=' + entityID;
		pars += extrapars;
		var onSuccessFunction = 'Service.success';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
	},
	AjaxContentServiceCall: function(context,entity,entityID,service,target,extrapars){
		document.body.style.cursor = 'wait';
		pars = '&' + 'context='+ context;
		pars += '&' + 'service=' + service;
		pars += '&' + 'entity=' + entity;
		pars += '&' + 'entityID=' + entityID;
		pars += '&' + 'target=' + target;
		if(extrapars != null)pars += extrapars;
		var onSuccessFunction = 'Service.contentSuccess';
		var onFailureFunction = 'Service.failure';
		new Ajax.Request(Service.URL, {parameters:pars, onSuccess:eval(onSuccessFunction), onFailure:eval(onFailureFunction)});
	},
	/**
	 * @abstract checks to see if the context is the active tab
	 * @return boolean true if it is active false if it is not
	 */
	isActiveTab:function(context) {
	
		parentid = $(context).up(1).id;
		
		var hiddenTabs = document.getElementsByClassName('tabbertabhide');
		
				
		for(j = 0; j< hiddenTabs.length; j++){	
			if (hiddenTabs[j].id == context) {
				return false
			}
			if (hiddenTabs[j].id == parentid) {
				return false
			}
		}
		return true;
	}
	
	
}
