/**
 * Encapsulate the case entity type. See the case database table
 */ 
  
var EntityCase = {
			
	entityName: 'entityCase',
	
	CASETYPE_BOTH: 'both',
	CASETYPE_DEC: 'dec',
	CASETYPE_AR: 'ar',

	handleEvent: function(event, context) {
		var element = Event.element(event);
		elementID = element.id;
		if (elementID.startsWith('casedec' + Service.SCOPE_SEPARATOR + 'menu')) {
			ApplicationService.decMenu(elementID);
			ApplicationService.decContent(elementID);
		} else if (elementID.startsWith('casear' + Service.SCOPE_SEPARATOR + 'menu')) {
			ApplicationService.arMenu(elementID);
			ApplicationService.arContent(elementID);
		} else if (elementID == ('casegenerate' + Service.SCOPE_SEPARATOR + 'entityCase' + Service.SCOPE_SEPARATOR + 'ar')) {
			ApplicationService.arGenerate();
		} else if (elementID == ('casegenerate' + Service.SCOPE_SEPARATOR + 'entityCase' + Service.SCOPE_SEPARATOR + 'dec')) {
			ApplicationService.decGenerate();
		} else if (elementID == ('casegenerate' + Service.SCOPE_SEPARATOR + 'entityCase' + Service.SCOPE_SEPARATOR + 'combined')) {
			ApplicationService.combinedGenerate();
		}
		
		return;
	},
	
	search: function(context, event){
		var element = Event.element(event);
		if (element.id.endsWith('search') || element.id.endsWith('terms')) {
			var searchTerms = $(context + Service.SCOPE_SEPARATOR + Service.SEARCHER + Service.SCOPE_SEPARATOR + this.entityName + Service.SCOPE_SEPARATOR + 'terms').value;
			if (searchTerms.trim().length > 0) {
				var term = searchTerms.trim();
				var filter = new ListFilters();
				filter.addFilter('case-name', term);
				filter.addFilter('case-uprn', term);
				filter.addFilter('case-postcode', term);
				filter.addFilter('case-posttown', term);
			}
		} else if (element.id.endsWith('clear')) {
			$(context + Service.SCOPE_SEPARATOR + Service.SEARCHER + Service.SCOPE_SEPARATOR + this.entityName + Service.SCOPE_SEPARATOR + 'terms').value = '';
		}
		var closedCase=0
		if($("cases-searcher-entityCase-closed").checked)
			closedCase=1;
		EntityCase.searchRefreshList(context, filter,undefined,undefined,closedCase);
	},

	/**
	 * This method is used to save DEC data from all DEC screens.  It is called from a click on the
	 * save button on the widget.
	 */
	saveDEC: function(context, elementID, entityID) {
		document.body.style.cursor = 'wait';
		
		var parts = elementID.split(Service.SCOPE_SEPARATOR);
		var target = 'casedec-content';
		var widget = ApplicationWidget.CASE_DEC_CONTENT;
		var data = $('cases-casedec-form').serialize();
		data += '&section=' + parts[2];

		Service.editor(target, context, this.entityName, ApplicationService.DEC_SAVE, entityID, data, null, widget, 'ApplicationService.contentSuccess');
	
	},

	/**
	 * This method is used to save AR data from all AR screens.  It is called from a click on the
	 * save button on the widget.
	 */
	saveAR: function(context, elementID, entityID) {
	
		document.body.style.cursor = 'wait';
		
		// If there is a drag-and-drop ordering list, then store the order in a hidden field before submitting
		if ($("cases-casear-paybackrecommendations-list")) {
		  var junkdrawer = ToolMan.junkdrawer();
			$("cases-casear-paybackrecommendations-orderedlist").value = junkdrawer.serializeList($("cases-casear-paybackrecommendations-list"));
		}
		
		var parts = elementID.split(Service.SCOPE_SEPARATOR);
		var target = 'casear-content';
		var widget = ApplicationWidget.CASE_AR_CONTENT;
		var data = $('cases-casear-form').serialize();
		data += '&section=' + parts[2];

		Service.editor(target, context, this.entityName, ApplicationService.AR_SAVE, entityID, data, null, widget, 'ApplicationService.contentSuccess');
	},

	/*
	* This method is invoked in order to add a filter based on search criteria
	*/
	refreshList: function(context, filter, eventHandler, suppressDirty){
		if (dirty.getDirty(context) != undefined && (suppressDirty == undefined)){
			var answer = false;
			var dirtyID = dirty.getDirty(context);
			if (dirtyID > 0) answer = Entity.cancel(context, this.entityName);
			else answer = Entity.closeEditor(context, this.entityName);
			if (!answer) return;
		}
		var target = context + Service.SCOPE_SEPARATOR + Widget.LISTER + Service.SCOPE_SEPARATOR + this.entityName;
		if (eventHandler == undefined || eventHandler == null || eventHandler.length == 0) eventHandler = 'EntityCase.view(\'' + context + '\',\'' + this.entityName + '\',\'@id\')';
		Service.remove(target, context, this.entityName, null, eventHandler, '10', '', filter);
		Entity.closeViewer(context, this.entityName);
	},
	
	/*
	* This method is invoked in order to add a filter based on search criteria
	*/
	searchRefreshList: function(context, filter, eventHandler, suppressDirty,closedCase){
		if (dirty.getDirty(context) != undefined && (suppressDirty == undefined)){
			var answer = false;
			var dirtyID = dirty.getDirty(context);
			if (dirtyID > 0) answer = Entity.cancel(context, this.entityName);
			else answer = Entity.closeEditor(context, this.entityName);
			if (!answer) return;
		}
		var target = context + Service.SCOPE_SEPARATOR + Widget.LISTER + Service.SCOPE_SEPARATOR + this.entityName;
		if (eventHandler == undefined || eventHandler == null || eventHandler.length == 0) eventHandler = 'EntityCase.view(\'' + context + '\',\'' + this.entityName + '\',\'@id\')';
		Service.caseSearch(target, context, this.entityName, null, eventHandler, '10', '', filter,undefined,undefined,undefined,undefined,undefined,closedCase);
		Entity.closeViewer(context, this.entityName);
	},
	


	list: function(context) {
		var target = context + Service.SCOPE_SEPARATOR + Widget.LISTER + Service.SCOPE_SEPARATOR + this.entityName;
		var eventHandler = 'EntityCase.view(\'' + context + '\',\'' + this.entityName + '\',\'@id\')';
		Service.lister(target, context, this.entityName, null, eventHandler, null, '', null, null, null, null, null, 'ApplicationService.contentSuccess');
	},

	view: function(context, entity, elementID, entityID) {
		// Handle product sub-tabs
		if(dirty.getDirty(context) != undefined){
			var answer = false;
			var dirtyID = dirty.getDirty(context);
			if (dirtyID > 0) answer = Entity.cancel(context, entity);
			else answer = Entity.closeEditor(context, entity);
			if (!answer) {
				var selection = null;
				if (dirtyID > 0)var selection = new Selection(entity, dirtyID);
				Entity.list(context, entity, null, selection);
				return;
			}
		}
		var target = context + Service.SCOPE_SEPARATOR + entity;
		if (entityID == undefined || entityID == null) {
			var selectedID = $(elementID).value;
			var parts = selectedID.split(Service.SCOPE_SEPARATOR);
			entityID = parts[parts.length - 1];
		}

		Service.viewer(target, context, entity, entityID, null, 'ApplicationService.contentSuccess');
	},

	create: function(context){
	},

	edit: function(context, entityID){
	},
	
	closeEditor: function(context) {
	},

	editorLoaded: function(context) {
		alert ("enable and disable fields on initial load here");
	},

	closeViewer: function(context) {
		$(Context.CASES_ACTIONS + Service.SCOPE_SEPARATOR + 'instanceID').value = '';
		$(Context.CASES_NOTES + Service.SCOPE_SEPARATOR + 'instanceID').value = '';
		try {
			Action.refreshPanel(Context.CASES_ACTIONS);
		} catch(err) {;}
		try {
			Note.refreshPanel(Context.CASES_NOTES);
		} catch(err) {;}
	},
	
	validate: function(context) {
		var message = '';
		var textMessage = '';
		var mandatoryTextFields = new Array('name', 'uprn', 'occupier', 'postcode', 'assessment_start','property_type', 'assessment_end', 'nominated_date','related_party_disclosure','reason_id');
		var textInputElements = $(context + Service.SCOPE_SEPARATOR + this.entityName + Service.SCOPE_SEPARATOR + 'form').getElements();
		var validPostcode=false;
		for (i = 0; i < textInputElements.length; i++) {
			for (var key in mandatoryTextFields) {
				
				if (textInputElements[i].id.endsWith(Service.SCOPE_SEPARATOR + mandatoryTextFields[key]) && mandatoryTextFields[key]=="postcode") {
					var match = /(^[a-zA-Z]+)/.exec(textInputElements[i].value);
					if (match){
						var match=match[match.length-1];
						for(var i=0;i<document.postcodes.length;i++){
							if(document.postcodes[i]==match.toUpperCase())
								validPostcode=true;
						}
					}
					break;
				}

				if (typeof mandatoryTextFields[key] == "function") continue;
				
				if (textInputElements[i].id.endsWith(Service.SCOPE_SEPARATOR + mandatoryTextFields[key]) && textInputElements[i].value.replace(/^\s+|\s+$/g, '').length == 0) {
					textMessage += $(textInputElements[i].id).previous('label').firstChild.nodeValue.replace(':','') + '\n';
					break;
				}
				
				
				
				
			}
		}

		if (textMessage) message += 'Please provide  a value for:\n' + textMessage + '\n';
		if(validPostcode===false){
			message +='The postcode is not in the cip data \n';
		}

		// UPRN
		var uprn = $(context + Service.SCOPE_SEPARATOR + 'editor' + Service.SCOPE_SEPARATOR + this.entityName + Service.SCOPE_SEPARATOR + 'uprn').value;
		if (uprn.length != 12) message += 'The UPRN must be 12 digits';
		
		
		

		return message;
	},
	
	/**
	 *  Decided if a date is clickable (valid) in the calendar widget.
	 *
	 */
	getDateStatus: function(date, d, m, y) {
		var lastClicked = $("cases-entityCase-form").lastClicked;
		if (lastClicked == "cases-editor-entityCase-nominated_date"){
			if($("cases-editor-entityCase-assessment_start").selectedDate==undefined)
				return true
			var dateCopy=new Date(($("cases-editor-entityCase-assessment_start").selectedDate.valueOf()));
			//get end of assessment
			dateCopy.setDate($("cases-editor-entityCase-assessment_start").selectedDate.getDate()-1);
			dateCopy.setFullYear(dateCopy.getFullYear()+1);
			return EntityCase.dateMargin(y,m,d,date,dateCopy);
		}else if(lastClicked=="cases-editor-entityCase-assessment_start"){
			var rangeStart=$("cases-lister-entityCase-select").rangeStart;
			if(rangeStart!=undefined&&$("cases-lister-entityCase-select").rangeEnd!=undefined){
				var rangeEnd=new Date($("cases-lister-entityCase-select").rangeEnd.valueOf());
				var end=new Date((date.valueOf()));
				end.setFullYear(date.getFullYear()+1);
				rangeEnd.setDate(rangeEnd.getDate()-1);
				if(date>=rangeStart&&end<=rangeEnd)
					return false;
			}
			return true;
		}
	},
	
	/*
	 * Date is only vlid if it greater than the assessment end date and no later than 3 months from the end of the assessment
	 */
	dateMargin: function(year, month, day,sDate,aDate){
		var end=new Date((aDate.valueOf()));
		end.setMonth(aDate.getMonth()+3);
		if(sDate.getTime()>=aDate.getTime()&&sDate.getTime()<=end.getTime()){
			return false;
		}
		return true;
	},
	
	//Display msg if fuel period is more than 31 days out of alignment with assesment period
	catcalc: function(cal) { 
		var lastClicked=$("cases-entityCase-form").lastClicked
		$(lastClicked).selectedDate=cal.date;
		cal.hide();	
	}
}


