var page = {
	init: function() {
	// GLOBAL OPERATIONS
		// init correspondance table
		this.cor_table = new Hash({
			'2':		3,
			'3':		2.7,
			'4':		2.39,
			'5':		2.08,
			'6':		1.77,
			'7':		1.46,
			'8':		1.15,
			'9':		0.84,
			'10':	0.5
		});
		// init results params
		this.res_params = new Hash({
			nurses:	77000,
			pharmas:	95000,
			physics:	200000,
			beds:		5000,
			ultras:		1500,
			aeds:		4000
		});
		// set target display area
		this.target_display = $('calc_area');
		// load initial content from template (form)
		this.resetDisplay();
	},
	
	activateButton: function (but_id, action) {
		var target_button = $(but_id);
		switch (action) {
			case 'calculate':
				// set calculate button event
				target_button.addEvents({
					click: function() {
						this.calculateDisplay();
					}.bind(this)
				});
				break;
			case 'reset':
				// set recalculate button event
				target_button.addEvents({
					click: function() {
						this.resetDisplay();
					}.bind(this)
				});
				break;
		}
	},
	
	calculateDisplay: function () {

		// recover form values
		var form_fields = new Hash();
		var target_form = $('hospital_data');
		// get input and select values
		target_form.getElementsBySelector('input,select').each(function (element) {
			if (element.getProperty('type') != 'button') { form_fields.set(element.getProperty('id'), element.getProperty('value')); }
		});
		// check values requirements
		var errors = new Array;
		form_fields.each( function(value, index) {
			switch(index) {
				case 'revenue':
					// check not empty
					if (!validateNotEmpty(value)) { errors.push('Revenue is not specified.\n'); }
					// check is integer
					if (!validateInteger(value)) { errors.push('Revenue must be an numerical value (integer).\n'); }
					break;
				case 'percent':
					// check not empty
					if (!validateNotEmpty(value)) { errors.push('Percent is not specified.\n'); }
					// check is numeric and check range
					if (!validateNumeric(value)) { errors.push('Percent must be an numerical value.\n');
					} else { if (!(0 <= value) || !(value <= 100 )) { errors.push('Percent must be between 0 and 100.\n'); } }
					break;
			}
		});
		if (errors.length == 0) {
			// no errors we go on
			// compute result values
			// lookup correspondence table
			var P = this.cor_table.get((form_fields.get('complexity')-0)+(form_fields.get('control')-0));
			// define recovery value
			var recovery = Math.floor((form_fields.get('revenue') * (form_fields.get('percent') / 100)) * (P/100));
			// define substitute hash
			var substitute_hash = new Hash({
				_recovery_:	recovery,
				_recovery$currency_:	formatCurrency ( recovery), // 10-sept-2007 :: Matt
				_nurses_:		Math.floor(recovery / page.res_params.get('nurses')),
				_pharmas_:	Math.floor(recovery / page.res_params.get('pharmas')),
				_physics_:		Math.floor(recovery / page.res_params.get('physics')),
				_beds_:		Math.floor(recovery / page.res_params.get('beds')),
				_ultras_:		Math.floor(recovery / page.res_params.get('ultras')),
				_aeds_:		Math.floor(recovery / page.res_params.get('aeds')),
				_maxH_:		Math.floor(recovery / page.res_params.get('nurses')),
				_maxP_:		Math.floor(recovery / page.res_params.get('ultras'))
			});
			// load result template
			new Ajax('templates/results.part.html', {
				method: 'get',
				onComplete: function(feedback) {
					page.dataSubstitute(feedback,page.target_display,substitute_hash);
					// set bars widths (display with effects)
					var ref_width = $('nurses').getSize().size.x;
					var fx_duration = 2000;
					var nursesFx = new Fx.Style('nurses_bar', 'width', {
						duration: fx_duration, 
						transition: Fx.Transitions.Quart.easeInOut
					});
					nursesFx.start(0,ref_width
						).chain( function() {
							$('nurses').setStyle('visibility','visible');
							var pharmasFx = new Fx.Style('pharmas_bar', 'width', {
								duration: fx_duration*substitute_hash.get('_pharmas_')/substitute_hash.get('_nurses_'),
								transition: Fx.Transitions.Quart.easeInOut
							});
							pharmasFx.start(0,(ref_width*substitute_hash.get('_pharmas_')/substitute_hash.get('_nurses_'))
								).chain( function() {
									$('pharmas').setStyle('visibility','visible');
									var physicsFx = new Fx.Style('physics_bar', 'width', {
									duration: fx_duration*substitute_hash.get('_physics_')/substitute_hash.get('_nurses_'), 
									transition: Fx.Transitions.Quart.easeInOut
									});
									physicsFx.start(0,(ref_width*substitute_hash.get('_physics_')/substitute_hash.get('_nurses_'))
										).chain( function() {
											$('physics').setStyle('visibility','visible');
											var bedsFx = new Fx.Style('beds_bar', 'width', {
												duration: fx_duration*substitute_hash.get('_beds_')/substitute_hash.get('_ultras_'), 
												transition: Fx.Transitions.Quart.easeInOut
											});
											bedsFx.start(0,(ref_width*substitute_hash.get('_beds_')/substitute_hash.get('_ultras_'))
												).chain( function() {
													$('beds').setStyle('visibility','visible');
													var ultrasFx = new Fx.Style('ultras_bar', 'width', {
														duration: fx_duration, 
														transition: Fx.Transitions.Quart.easeInOut
													});
													ultrasFx.start(0,ref_width
														).chain( function() {
															$('ultras').setStyle('visibility','visible');
															var aedsFx = new Fx.Style('aeds_bar', 'width', {
																	duration: fx_duration*substitute_hash.get('_aeds_')/substitute_hash.get('_ultras_'), 
																	transition: Fx.Transitions.Quart.easeInOut
																});
															aedsFx.start(0,(ref_width*substitute_hash.get('_aeds_')/substitute_hash.get('_ultras_'))
																).chain( function() {
																	$('aeds').setStyle('visibility','visible');
																})
														})
												})
										})
								})
						});
					page.activateButton('calc_button','reset');
				},
				onFailure: function() {
					alert("An error occured during the result calculation...");
					page.target_display.empty();
					page.target_display.setHTML(feedback);
				}
			}).request();
		} else {
			// errors during fields validation
			var alert_msg = 'Your request couldn\'t validate, please check the following:\n\n';
			errors.each(function (value){ alert_msg += value; });
			alert(alert_msg);
		}
	},
	
	resetDisplay: function () {
		new XHR({
			method: 'get',
			onSuccess: function(feedback) {
				this.target_display.empty();
				this.target_display.setHTML(feedback);
				this.activateButton('calc_button','calculate');
			}.bind(this),
			onFailure: function (feedback) {
				this.target_display.empty();
				this.target_display.setHTML(feedback);
			}.bind(this)
		}).send('templates/form.part.html');
	},
	
	dataSubstitute: function(feedback,targetElement,subHash) {

		// perform template data substitution

		subHash.each( function (value, key) {
			// alert ( "key " + key + " : " + " value " + value );
				var regexp = (key).escapeRegExp();
				regexp = '/'+regexp+'/g';
				feedback = feedback.replace(eval(regexp),value);
			});


		targetElement.empty();
		targetElement.setHTML(feedback);

	}
}

// OPERATIONS TRIGGER
window.addEvent('domready', function() {
	page.init();
});
