Form = {
		submitted: false,
        init: function () {
			Form.setLiveEvents () ;
        },

        setLiveEvents: function () {
        	
        	$('#search_city_results_ul li')
        		.live('mouseenter', function () {
        			$('#search_city_results_ul li').removeClass('hover');
        			$(this).addClass('hover');
        			Form.cityFieldIndex = $('#search_city_results_ul li').index($(this)) + 1;
        		})
        	;
        	
        	$('#search_builder_results_ul li')
        	.live('mouseenter', function () {
        		$('#search_builder_results_ul li').removeClass('hover');
        		$(this).addClass('hover');
        		Form.cityFieldIndex = $('#search_builder_results_ul li').index($(this)) + 1;
        	})
        	;

			if ($('input[name=group_id]').val() == 'garantiebepaling') {
				$('form').submit(function(){ 
					if(Form.submitted == false) {
						Form.submitted = true;
						$('button.next-step').html('Aanvraag wordt verstuurd...').css({background:'inherit',right: '5px', cursor: 'default'});
					} else {
						return false; // Prevent the normal submission action
					}
				});
			}

			if ($('#form_aanvraag_project_builder_description').length > 0) {
				Form.checkMaxChars('form_aanvraag_project_builder_description', 250);
			}

        	
        },
        
		/*
		 * options:
		 *	  ElementId: string value of template element id.
		 *	  bValid: false, true or null for setting the field to 'error', 'ok', or 'neutral'
		 *
		 */
		setStatus: function (options) {
			eltId = options.elementId;
			formId = options.formId;
			bValid = options.isValid;
			
			if (eltId == 'project_workdays') {
				eltId = 'project_date_end';
				if (bValid) {
					$('#workdays').removeClass('select-wrap-disabled');
					$('#enddate').addClass('select-wrap-disabled');
				}
			} else if (eltId == 'project_date_end') {
				if (bValid) {
					$('#enddate').removeClass('select-wrap-disabled');
					$('#workdays').addClass('select-wrap-disabled');
				}
			}
			
			//set field to neutral.
			//$('#fieldcontainer_' + formId + '_' + eltId).find('span.form-icon-ok').hide();
			//$('#fieldcontainer_' + formId + '_' + eltId).find('span.form-icon-error').hide();
			$('#fieldcontainer_' + formId + '_' + eltId).find('span.form-icon').removeClass('form-icon-ok').removeClass('form-icon-error').removeClass('form-icon-load').addClass('form-icon-neutral');

			// set to 'ok' or 'error'
			if (bValid === true) {
				//$('#fieldcontainer_' + formId + '_' + eltId).find('span.form-icon-ok').show();
				$('#fieldcontainer_' + formId + '_' + eltId).find('span.form-icon').removeClass('form-icon-neutral').removeClass('form-icon-error').removeClass('form-icon-load').addClass('form-icon-ok');
			} else if (bValid === false) {
				//$('#fieldcontainer_' + formId + '_' + eltId).find('span.form-icon-error').show();
				$('#fieldcontainer_' + formId + '_' + eltId).find('span.form-icon').removeClass('form-icon-neutral').removeClass('form-icon-ok').removeClass('form-icon-load').addClass('form-icon-error');
			}

		},
		
		checkSwitchEnddate: function(jqeCaller) {
			
			sCallerName = jqeCaller.attr('id');
			sOtherName = (sCallerName == 'workdays') ? 'enddate' : 'workdays';
			
			sDutchCallerName = (sCallerName == 'workdays') ? 'het aantal werkbare dagen' : 'de einddatum';
			sDutchOtherName = (sCallerName == 'workdays') ? 'de einddatum' : 'het aantal werkbare dagen';
			
			if (jqeCaller.hasClass('select-wrap-disabled')) {
				if (confirm('U hoeft enkel één van de velden in te vullen bij "Einddatum of aantal werkbare dagen". '+"\n"+'U heeft '+sDutchOtherName+' reeds ingevuld.'+"\n\n"+'Wilt u '+sDutchOtherName+' wissen en '+sDutchCallerName+' invullen?')) {
					$('#'+sCallerName).removeClass('select-wrap-disabled').find('input').val('').select();
					$('#'+sOtherName).addClass('select-wrap-disabled').find('input').val('');
					$('#'+sCallerName).find('input').focus();
					return false;
				} else {
					$('#'+sOtherName).find('input').focus();
					return false;
				}
			}
		},
		
		filterNumbers: function(elm) {
			var rNumbers = /[^0-9]/g;
			$(elm).val($(elm).val().replace(rNumbers,''));
		},
		
		checkForNumbers: function(event, elm) {
			switch (event.keyCode) {
				case 190:
				case 188:
				case 110:
					var sId = $(elm).attr('id');
					sId = sId.replace('_euros','_cents');
					$('#'+sId).focus().get(0).select();
					return false;
					break;
				default:
					return (
							(event.keyCode >= 48 && event.keyCode <= 57 && event.altKey == false && event.shiftKey == false)
						|| 	(event.keyCode >= 96 && event.keyCode <= 105 && event.altKey == false && event.shiftKey == false) 
						|| 	(event.keyCode >= 35 && event.keyCode <= 40 && event.altKey == false && event.shiftKey == false)
						|| 	event.keyCode == 46 // delete
						|| 	event.keyCode == 8 // backspace
						|| 	event.keyCode == 16 // shift
						|| 	event.keyCode == 9 // tab
					); 
			}
		},

		/*
		 * Update form fields with street/city info.
		 */
		setZipcode: function (options) {
			// get variables from options
			formId = options.formId;
			streetEltId =  options.streetEltId;
			cityEltId = options.cityEltId;
			countryEltId = options.countryEltId;
			
			// set form values
			$('#' + formId + '_' + streetEltId).val(options.streetValue);
			$('#' + formId + '_' + cityEltId).val(options.cityValue);
			$('#' + formId + '_' + countryEltId).val(options.countryEltId);
			
			// set status to OK.
			Form.setStatus({elementId: streetEltId, formId: formId, isValid: options.success});
			Form.setStatus({elementId: cityEltId, formId: formId, isValid: options.success});
			Form.setStatus({elementId: countryEltId, formId: formId, isValid: options.success});
		},
		
		/*
		 * Update session data and set field status
		 */
		checkField: function (options) {
			Form.customCheckEvents(options);
			
			var value = $('#form_aanvraag_'+options.elementId).val();
			
			if (options.elementId == 'project_amount') {
				value = $('#form_aanvraag_'+options.elementId+'_euros').val() + '.' + $('#form_aanvraag_'+options.elementId+'_cents').val() 
			}
			
			$('#fieldcontainer_form_aanvraag_' + options.elementId).find('span.form-icon').removeClass('form-icon-ok').removeClass('form-icon-error').removeClass('form-icon-neutral').addClass('form-icon-load');

			$.ajax({
				url: aModules.form.url,
				data: {
					element_id: options.elementId,
					form_id: 'form_aanvraag',
					text:value
				},
				dataType: 'json',
				success: function(oResult){
					Form.setStatus(oResult);
					
					if (typeof oResult.zipcodeOptions != 'undefined') {
						
						Form.setZipcode(oResult.zipcodeOptions);
						
					} else if (typeof oResult.costs != 'undefined') {
						
						$('#form_aanvraag_project_amount_calculated_result').removeClass('form-project-amount-error').html(oResult.costs).css({'display':'block'});
						
					} else if (typeof oResult.costsError != 'undefined') {
						
						$('#form_aanvraag_project_amount_calculated_result').addClass('form-project-amount-error').html(oResult.costsError).css({'display':'block'});
						
					}
				}
			});
		},
		
		/*
		 * Custom actions for onblur events.
		 */
		customCheckEvents: function (options) {
			switch (options.elementId) {
				case 'project_new':
					Form.showWarning('new', $('#form_aanvraag_'+options.elementId).val() == 'yes');
					break;
			}
			
			
		},
		
		/*
		 * Copy address from personal data to project data.
		 * 
		 */
		copyAddress: function () {
			$.ajax({
				url: aModules.form.url + '/copy_address',
				success: function(oResult){
					for(key in oResult) {
						// get values from personal address, and copy to form object.
						$('#form_aanvraag_'+oResult[key]['element_id']).val(oResult[key]['value']);
						// set fields to valid.
						Form.setStatus({elementId: oResult[key]['element_id'], formId: 'form_aanvraag', isValid: oResult[key]['valid']});
					}
				},
				dataType:'json'
			});
		},
		
		searchCities: function (needle) {

			// strip city name of everything except letter, spaces and a dash.
			needle = needle.toLowerCase().replace(/[^a-z\-]+/g,'');
			
			// initialise html result and counter.
			resultHTML = ''; numResults=0;
			
			// start searching from 3 characters up.
			if ( !(needle.length  >= 3) ) {
				// TODO
				return false;
			}

			// search city array for input, use shortname for match
			for ( var index in Form.builderCities ) {
				city = Form.builderCities[index];
				
				if (index.search(needle) == 0) {
					numResults++;
					// List item with onclick event. city short name are used in id and in function parameter.
					resultHTML += '<li onclick="Form.searchBuilders(this, \''+ city[0] + '\')">';
					// display name and number of builders in this city.
					resultHTML += '<span>' + city[0] + '</span><em>(' + city[1] + ( city[1] == 1 ? ' bedrijf' : ' bedrijven')  + ')</em></li>';
				}
				
			}
			
			if (numResults > 0) {
				// show result in list.
				$('#search_city_results_ul').html(resultHTML).show();
			} else {
				Form.showCityHelp(true);
			}
		},
		
		searchBuilders: function (elt, shortCityName) {
			
			// get display name for city, then remove city list
			displayCityName = $(elt).find('span').html();
			$('#search_city_results_ul').html('').hide();

			// set city name
			$('#form_aanvraag_project_builder_user_search_city').val(displayCityName);
			
			// clear builder name
			$('#form_aanvraag_project_builder_user_display_builder').val('Aannemers zoeken, even geduld a.u.b.');
			
			$('#builder_list_loading').addClass('form-icon-load');
			
			// get new list of builders.
			$.ajax({
				url: aModules.searchbuilders.url + '/' + shortCityName,
				success: function(html){
				$('#builder_list_loading').removeClass('form-icon-load');
					$('#search_builder_results_ul').html(html).show();
					$('#form_aanvraag_project_builder_user_display_builder').val('');
				}
			});
			
		},
		
		selectBuilder: function (builderId) {
			$('#search_builder_results_ul').hide();
			
			$('#form_aanvraag_project_builder_user').val(builderId);
			
			$('#form_aanvraag_project_builder_user_display_builder').val($('#builder_'+builderId+' span').text());
			
			
			Form.checkField({elementId: 'project_builder_user'});
			
		},
		
		builderFieldIndex: 0,
		builderNRResults: 0,
		
		builderListKeyUp: function(evt, elt) {
			if (evt.keyCode == 13) return false;
		},
		
		builderListKeyDown: function(evt, elt) {
			switch (evt.keyCode) {
				case 40:
				case 38:
					if (evt.keyCode == 38) {
						if (Form.builderFieldIndex > 1) {
							Form.builderFieldIndex--;
						}
					} else if (evt.keyCode == 40) {
						if (Form.builderFieldIndex < $('#search_builder_results_ul li').length) {
							Form.builderFieldIndex++;
						}
					}
					$('#search_builder_results_ul li').removeClass('hover');
					var elmNewSelected = $('#search_builder_results_ul li:nth-child('+Form.builderFieldIndex+')');
					$(elmNewSelected).addClass('hover');
					
					iSelectedElementTop = $(elmNewSelected).offset().top - $('#search_builder_results_ul').offset().top + $('#search_builder_results_ul').scrollTop();
					iMaxTopPosition = $('#search_builder_results_ul').outerHeight() *.75;
					if (iSelectedElementTop > iMaxTopPosition) {
						$('#search_builder_results_ul').stop(true,true).animate({scrollTop:iSelectedElementTop-iMaxTopPosition},{duration:300});
					}
					break;
				case 13:
					Form.selectBuilder($('#search_builder_results_ul li:nth-child('+Form.builderFieldIndex+')').attr('id').replace('builder_',''));
					return false;
				case 9:
					return true;
				default:
					return false;
			}
		},
		
		citySearchFocus: function() {
			
			var iWindowHeight	= $(window).height();
			var iOffset			= $('#form_aanvraag_project_builder_user_search_city').offset().top;
			var iScrollTop		= $(document).scrollTop();
			
			var iPosition		= iOffset - iScrollTop;
			
			if (iPosition + 200 > iWindowHeight) {
				$('html').animate({scrollTop:iOffset-200},{duration:500});
			}
			
			var sEnteredText = $('#form_aanvraag_project_builder_user_search_city').val()
			if (sEnteredText == '') {
				Form.showCityHelp(false);
			} else if (sEnteredText.length >= 3) {
				Form.searchCities(sEnteredText);
			}
		},
		
		showCityHelp: function(bNoResults) {
			var sString = '';
			if (typeof bNoResults != 'undefined' && bNoResults) {
				sString += '<p><i>Er zijn geen plaatsen gevonden met de ingevulde zoektekst.</i></p>';
				
			}
			sString += '<p>Vul de eerste twee letters van uw plaatsnaam in. De gevonden plaatsnamen zullen in dit vak getoond worden.</p><p>Zodra uw plaatsnaam in deze lijst verschijnt, kunt u deze aanklikken, of met de pijltoetsen selecteren. Klikt u op de plaatsnaam, of drukt u op enter, zullen in het volgende veld de aannemers in uw plaats weergeven worden.</p>';
			$('#search_city_results_ul').html(sString).show();
		},
		
		cityFieldLength : 0,
		
		cityNRResults : 0,
		
		cityFieldIndex : 0,
		
		cityListKeyUp: function (evt, elt) {
			if (evt.keyCode == 13) return false;
			
			newLength = elt.val().length;
			if (newLength != Form.cityFieldLength) {
				Form.cityFieldIndex = 0;
				Form.builderFieldIndex = 0;
				Form.searchCities(elt.val());
				Form.cityNRResults = $('#search_city_results_ul li').length;
			}
			Form.cityFieldLength = newLength;
			//evt.stopPropagation();
		},
		
		cityListKeyDown: function (evt, elt) {
			switch (evt.keyCode) {
				case 40:
				case 38:
					if (evt.keyCode == 38) {
						//up
						if (Form.cityFieldIndex > 1) Form.cityFieldIndex--;
						
					} else if (evt.keyCode == 40) {
						//down
						if (Form.cityFieldIndex < Form.cityNRResults) Form.cityFieldIndex++;
					}
					$('#search_city_results_ul li').removeClass('hover');
					$('#search_city_results_ul li:nth-child('+Form.cityFieldIndex+')').addClass('hover');
					break;
					
				case 13:
					liElt = $('#search_city_results_ul li:nth-child('+Form.cityFieldIndex+')');
					longName = liElt.find('span').html();
					
					$('#form_aanvraag_project_builder_user_search_city').val(longName);
					$('#form_aanvraag_project_builder_user_display_builder').focus();
					
					shortName = longName.toLowerCase().replace(/[^a-z\s\-]+/g,'');
					
					Form.searchBuilders(liElt, shortName);
					
					return false;
					break;
			}
			//evt.stopPropagation();
		},
		
		/*
		 * show warnings for 'new project' or 'project on water'
		 * 
		 */
		showWarning: function (warningId, bWarningState) {
			formFields = $('#fieldset_form_aanvraag_personal_separator_fullname, #fieldset_form_aanvraag_personal_separator_address, #fieldset_form_aanvraag_personal_separator_phone, #form_aanvraag_submit_wrapper ');
			
			formNewContainer = $('#fieldcontainer_form_aanvraag_project_new');
			
			warningNew = $('#form_aanvraag_warning_new');
			warningWater = $('#form_aanvraag_warning_water');
			
			switch (warningId) {
				case 'new':
					if (bWarningState) {
						$(warningNew).show();
					} else {
						$(warningNew).hide();
					}
					break;
				case 'water':
					if (bWarningState) {
						$(warningWater).show();
						$(formFields).hide();
						$(formNewContainer).hide();
					} else {
						$(warningWater).hide();
						$(formFields).show();
						$(formNewContainer).show();
					}
					//Form.setStatus({elementId: 'project_on_water', formId: 'form_aanvraag', isValid: !bWarningState});
					Form.checkField({elementId: 'project_on_water', text: bWarningState?'yes':'no'});
					break;
			}
			
		},
		
		checkEmailRepeat: function (elementId) {
			
			formId = 'form_aanvraag';
			elementRepeatId = elementId + '_repeat';
			
			emailValue = $('#' + formId + '_' + elementId).val();
			emailRepeatValue = $('#' + formId + '_' + elementRepeatId).val();


			Form.setStatus({elementId: elementRepeatId, formId: formId, isValid: (emailValue == emailRepeatValue)});
		},
		
		checkMaxChars : function (sElementId, iMaxChars) {

				iCurrentLength = $('#' + sElementId).val().length;

				$('#' + sElementId + '_charcount_label .current_charcount').html(iCurrentLength);
				if (iCurrentLength > iMaxChars) {
					$('#' + sElementId + '_charcount_label').addClass('charcount-overlimit');
					$('#' + sElementId ).parentFindRecursive('li').find('.form-icon').addClass('form-icon-error');
				} else {
					$('#' + sElementId + '_charcount_label').removeClass('charcount-overlimit');
					$('#' + sElementId).parentFindRecursive('li').find('.form-icon').removeClass('form-icon-error').addClass('form-icon-ok');
				}

			
		}
		
		
}

$(document).ready(function(){
	Form.init();
});
