/**
 *	Script for Entix Form modules.
 *		copyright 2008-2011 Entix, http://entix.nl/
 */

var formElement;

function placeholderFallback() {
	$$('input').each(function(el) {
		if (el.get('placeholder')) {
			blurPlaceholder(el);
			el.addEvents({
				focus: function() {
					focusPlaceholder(el);
				},
				blur: function() {
					blurPlaceholder(el);
				}
			});
		}
	});
	if (!$$('form')[0])
		return;
	$$('form')[0].addEvent('submit', function() {
		$$('input.placeholder').each(function(el) {
			el.value = '';
		});
	});
}
function focusPlaceholder(input) {
	if(input.hasClass('placeholder') && input.value == input.get('placeholder')) {
		input.value = '';
		input.removeClass('placeholder');
	}
}
function blurPlaceholder(input) {
	if(input.value == '') {
		input.value = input.get('placeholder');
		input.addClass('placeholder');
	}
}

function autofocusFallback() {
	var inpfocus = $$('input[autofocus]')[0];
	if (inpfocus)
		inpfocus.focus();
}

function userDefFieldVal(text) {
	var rad_id = text.id.substr(0,text.id.length-5);
	var amount = parseInt(text.value);
	if (isNaN(amount) || amount <= 0) {
		//$(rad_id).checked = false;
		$(rad_id).value = 0;
		text.value = '';
	} else {
		$(rad_id).checked = true;
		$(rad_id).value = amount;
		text.value = amount;
		updateBedrag($(rad_id));
	}
}
function userDefSelect(inp) {
	var text = $(inp.id+'-user');
	if (text)
		userDefFieldVal(text);
}
function updateBedrag(inp) {
	var button_bedrag = $('kdj_form_button').getElements('var')[0];
	button_bedrag.set('html', inp.value);
}

function tabSelect(sel) {
	var sel_sibs = $(sel).getParent().getChildren('li').erase($(sel));
	sel_sibs.removeClass('selected');
	var tab_id = 'tab-'+sel.id.substring(4);
	sel.addClass('selected');
	if ($(tab_id)) {
		var tab_sibs = $(tab_id).getParent().getChildren('div.tab').erase($(tab_id));
		tab_sibs.removeClass('selected');
		tab_sibs.each(function(el, i){
			el.getElements('input').each(function(el, i){
				el.disabled = true;
			})
		});
		
		$(tab_id).addClass('selected');
		$(tab_id).getElements('input').each(function(el, i){
			el.disabled = false;
		});
		
	}
}
function checkErrorTab() {
	if ($(document.body).hasClass('ipad')) {
		var at = animTime;
		animTime = 0;
		scrollTab('formcontain');
		animTime = at;
	}
}
function errorField(field) {
	var num=0;
	if ($(field)) {
		$(field).addClass('input_error');
		$(field).addEvent('change', function(event){
			if (this.value != '')
				unErrorField(field);
		});
	} else {
		while (num < 16) {
			if ($(field+num))
				errorField(field+num);
			num++;
		}
	}
}
function unErrorField(field) {
	if ($(field))
		$(field).removeClass('input_error');
}
function errorTableField(field) {
	var name = field;
	var num = 0;
	while (!$(field) && num < 32) {
		field = name+num;
		num++;
	}
	if ($(field)) {
		var row = $(field).getParent('td').getParent('tr');
		if ($(row)) {
			$(row).addClass('input_error');
			$(field).addEvent('change', function(event){
				if (this.value != '')
					$(row).removeClass('input_error');
			});
			return field;
		}
	}
}

function getTableRowFromInput(field) {
	var name = field;
	var num = 0;
	while (!$(field) && num < 32) {
		field = name+num;
		num++;
	}
	if ($(field))
		return $(field).getParent('tr');
	return false;
}

function enablePostalCheck(fields) {
	fields.each(function(name){
		var inp = $$('input#'+name)[0];
		if (inp) {
			inp.addEvent('keydown:pause(500)', function(e){
				postalCodeCheck(this);
			});
		}
	});
}

function postalCodeCheck(inp) {
	formElement = $(inp).getParent('form');
	
	var postal_name = 'postcode';
	var house_name = 'huisnummer';
	var code, house;
	var inp_num, inp_let, inp_house;
	
	if (inp.name.indexOf(postal_name) > -1) {
		if (inp.name.indexOf('_num') > -1) {
			var letname = inp.name.substring(0,inp.name.length-4)+'_let';
			inp_let = formElement.elements[letname];
			inp_num = inp;
		} else if (inp.name.indexOf('_let') > -1) {
			var numname = inp.name.substring(0,inp.name.length-4)+'_num';
			inp_num = formElement.elements[numname];
			inp_let = inp;
		}
		var hname = inp.name.substring(0,inp.name.length-postal_name.length-4)+house_name;
		inp_house = formElement.elements[hname];
	} else if (inp.name.indexOf(house_name) > -1) {
		var pname = inp.name.substring(0,inp.name.length-house_name.length)+postal_name;
		inp_let = formElement.elements[pname+'_let'];
		inp_num = formElement.elements[pname+'_num'];
		inp_house = inp;
	}

	if (inp_num && inp_let && inp_house) {
		code = inp_num.value+inp_let.value;
		house = inp_house.value;
	}
	
	if (code.length == 6 && house.length > 0) {
		getAddress(code, house);
	}
}

function updateAddress(address) {
	var error = (typeof(address.straatnaam) == 'undefined' || typeof(address.plaatsnaam) == 'undefined');
	postalFields.each(function(name, i){
		if (error)
			errorField(name);
		else
			unErrorField(name);
	});
	if (!error) {
		formElement.elements['straat'].value = address.straatnaam;
		formElement.elements['plaats'].value = address.plaatsnaam;
	}
}

function getAddress(postcode, huisnummer) {
	// this code will send a data object via a GET request and alert the retrieved data.
	var jsonRequest = new Request.JSON({url: '/postcode.json', onSuccess: function(resultData){
		updateAddress(resultData);
	}}).get({'p': postcode, 'h': huisnummer});
}

function fieldLengthAutoTab() {
	var fields = $$('input[maxlength]');
	fields.each(function(field) {
		field.addEvent('keyup',function(e) {
			var max = this.get('maxlength');
			if (max>0 && field.value.length >= max) {
				var nexttab = field.get('tabindex').toInt() + 1;
				var frm = field.getParents('form')[0];
				var next = frm.getElements('input[tabindex='+nexttab+']')[0];
				next.focus();
			}
		});
	});
}

function updateFieldEdited() {
	var fields = $$('input.txt');
	fields.each(function(field) {
		field.addEvent('keyup',function(e) {
			if (field.value.length > 0) {
				field.addClass('edited');
			}
		});
	});
}

function formDependencies(fields) {
	/* initial check */
	checkDependencies(fields);
	var dependsOn = [];
	$each(fields,function(on, dep){
		$each(on,function(list, el){
			dependsOn.include(el);
		});
	});
	dependsOn.each(function(field) {
		var form = document.forms[0];
		if (!form.elements[field] && form.elements[field+'[]'])
			field += '[]';
		var input = $(form).getElements('*[name="'+field+'"]');
		if (input.length > 1) {
			$each(input,function(inp){
				inp.addEvent('change',function(e) {
					checkDependencies(fields);
				});
			});
		} else {
			$(input[0]).addEvent('change',function(e) {
				checkDependencies(fields);
			});
		}
	});
}

function checkDependencies(fields) {
	var form = document.forms[0];
	$each(fields,function(on, dep){
		var met = false;
		$each(on,function(list, el){
			if (!form.elements[el] && form.elements[el+'[]'])
				el += '[]';
			var input = $(form).getElements('*[name="'+el+'"]');
			var val;
			if (input.length > 1) {
				$each(input,function(inp){
					if (inp.checked)
						val = inp.value;
				});
			} else
				val = input[0].value;
			if (list.indexOf(val) != -1)
				met = true;
		});
		/* disable field */
		var inp_field = form.elements[dep];
		if (inp_field)
			inp_field.disabled = (!met);

		/* hide row */
		var row = getTableRowFromInput(dep);
		if (row) {
			if (met)
				row.setStyle('display','');
			else
				row.hide();
		}
		/* seperate label row */
		var lbl = $$('label[for="'+dep+'"]')[0];
		if (lbl) {
			var row = getTableRowFromInput(lbl);
			if (row) {
				if (met)
					row.setStyle('display','');
				else
					row.hide();
			}
		}
	});	
}

/** DOMREADY **/
window.addEvent('domready',function(){
	if (!Modernizr.input.placeholder)
		placeholderFallback();
	if (!Modernizr.input.autofocus)
		autofocusFallback();
	if (typeof postalFields != 'undefined')
		enablePostalCheck(postalFields);
	fieldLengthAutoTab();
	if (typeof fieldDepends != 'undefined')
		formDependencies(fieldDepends);
	updateFieldEdited();
});

