var SECTOR_NOSELECTION = 'Geen selectie';
var PAGE_LEAVE = 'De pagina bevat niet-opgeslagen gegevens.';

window.addEvent('domready', function(e) {

	$$('body').addClass('js');

	// Login box
	if ($('loginbox') && $$('.loginpos') && $$('.loginpos').length == 1) {
		var loginbox_in  = 24;
		var loginbox_out = 103;

		var loginpos = $$('.loginpos')[0];

		var posleft;
		if (Browser.Engine.trident && Browser.Engine.version == 4) {
			posleft  = $('loginbox').getCoordinates($('container')).right.toInt() - $('loginbox').getSize().x.toInt();
			posleft += loginpos.getSize('div').x.toInt() + 9;
		} else {
			posleft = loginpos.getParent('ul').getSize().x.toInt() + loginpos.getParent('div').getStyle('left').toInt();
			posleft -= $('loginbox').getSize().x.toInt();
		}

    posleft += 106;

		$('loginbox').setStyles({
			'top': loginbox_in,
			'left': posleft
		});
		
		var loginfx = new Fx.Tween($('loginbox'), {
			onComplete: function() {
				if ($('loginbox').getStyle('top').toInt() == loginbox_out) {
					$('loginbox').addClass('loginbox-open');
					if ($('loginbox_email')) {
						$('loginbox_email').focus();
					}
				} else {
					$('loginbox').removeClass('loginbox-open');
				}
			}
		});
		$$('.loginopener').addEvent('click', function(e) {
			new Event(e).stop();
			if ($('loginbox').getStyle('top') == loginbox_out) {
				loginfx.start('top', loginbox_in);
			} else {
				loginfx.start('top', loginbox_out);
			}
		});
		$('loginbox_close').addEvent('click', function(e) {
			new Event(e).stop();
			loginfx.start('top', loginbox_in);
		});

		document.addEvent('click', function(e) {
			var target = $(new Event(e).target);
			if (!target.getParent('div#loginbox') && !target.hasClass('loginopener')) {
				loginfx.start('top', loginbox_in);
			}
		});
	}

	// Submit on <return> in IE
	if (Browser.Engine.trident) {
		$$('form').addEvent('keyup', function(e) {
			var e = new Event(e);
			if (e.target.tagName.toLowerCase() == 'input' && e.code == 13) {
				this.submit();
			}
		});
	}
	
	// Put label in value
	$$('input.labelinvalue').each(function(inp) {
		var lbl = inp.getPrevious('label').setStyle('display', 'none').get('html');
		inp.addEvent('focus', function(e) {
			if (inp.get('value') == lbl) {
				inp.select();
			}
		});
		inp.addEvent('blur', function(e) {
			if (inp.get('value') == '') {
				inp.set('value', lbl);
			}
		});
		inp.fireEvent('blur');
	});

	function initExpandingList(list) {
		var defopen = -1;

		list.getElements('.toggler').each(function(toggler, i) {
			toggler.setStyle('cursor', 'pointer');
			if (defopen == i) {
				toggler.getParent('li').addClass('open');
			}

			toggler.addEvent('click', function(e) {
				new Event(e).stop();
				if (toggler.getParent('li').hasClass('open')) {
					list.getElements('li.open').removeClass('open');
				} else {
					list.getElements('li.open').removeClass('open');
					toggler.getParent('li').addClass('open');
				}
			});
		});

		list.store('accordion',
			new Accordion(list.getElements('.toggler'), list.getElements('.toggled'), {
				'display': defopen,
				'show': defopen,
				'alwaysHide': true
			})
		);
	}

	function initItemsSelected() {
		$$('.itemsselected').each(function(li) {
			var numselected = li.getElements('input[type=checkbox]:checked').length;
			li.store('numselected', numselected);
			li.getElement('span.numselected-none').setStyle('display', numselected==0?'inline':'none');
			li.getElement('span.numselected-one').setStyle('display', numselected==1?'inline':'none');
			li.getElement('span.numselected-more').setStyle('display', numselected>1?'inline':'none');
			li.getElement('span.numselected').set('html', numselected);
		});
		$$('.itemsselected input[type=checkbox]').each(function(inp) {
			inp.addEvent('click', function(e) {
				var parent = inp.getParent('.itemsselected');
				var numselected = parent.retrieve('numselected');
				
				numselected += inp.get('checked')?1:-1;
				parent.store('numselected', numselected);
				parent.getElement('span.numselected-none').setStyle('display', numselected==0?'inline':'none');
				parent.getElement('span.numselected-one').setStyle('display', numselected==1?'inline':'none');
				parent.getElement('span.numselected-more').setStyle('display', numselected>1?'inline':'none');
				parent.getElement('span.numselected').set('html', numselected);
			});
		});
	}

	$$('.expandinglist').each(function(list) {
		initExpandingList(list);
	});

	initItemsSelected();

	document.addEvent('click', function(e) {
  	var a = $(e.target)
  	if (a.tagName.toLowerCase() != 'a') {
  		a = a.getParent('a');
  	}
  	if (a && a.hasClass('selectall')) {
			e.stop();
			a.getParent().getElements('input[type=checkbox]').each(function(el){
				if (!el.get('checked')) {
					el.set('checked', 'checked');
					el.fireEvent('click');
				}
			});
		} else if (a && a.hasClass('deselectall')) {
			e.stop();
			a.getParent().getElements('input[type=checkbox]').each(function(el){
				if (el.get('checked')) {
					el.set('checked', '');
					el.fireEvent('click');
				}
			});
		}
	});

	// Price of adv
	if ($('adv_price')) {
		function updatePrice(e) {
			var type = $('adv_price').hasClass('jobs')?'jobs':'courses';
			var qs = '';
			costprice_els.each(function(el) {
				if (el.get('checked')) {
					qs += ','+el.get('value')
				}
			});
			costprice.get(BASE_URL + 'ajax/advertisingcosts/'+type+'/'+qs.substr(1));
		}
		var costprice_els = $('sectors').getElements('input[type=checkbox]');
		var costprice = new Request.JSON({
			link: 'cancel',
			onComplete: function(costdata) {
				var price = formatAsMoney(costdata.costs);
				$('adv_price').set('text', price.toString().replace(".", ","));
				$('adv_students').set('text', costdata.numberofstudents);
			}
		});
		costprice_els.addEvent('change', updatePrice.bindWithEvent());
		$$('a.selectall', 'a.deselectall').each(function(a) {
			a.addEvent('click', updatePrice.bindWithEvent());
		});
	}	

	if ($('sectors')) {
		var state = true;

		$('sectors').setStyle('position', 'relative');
		var list = $('sectors').getElement('ul.expandinglist');

		var selecteditems = '';
		$('sectors').getElements('label').each(function(lbl) {
			if (lbl.getFirst().get('checked')) {
				selecteditems += '<li>' + lbl.get('text') + '</li>';
			}
		});
		if (selecteditems == '') {
			selecteditems = SECTOR_NOSELECTION;
			state = false;
		}
		else {
			selecteditems = '<ul style="list-style-type: none;">' + selecteditems + '</ul>';
		}

		var flatlist = new Element('div', {
			'styles': {
				'position': 'absolute',
				'top': 30,
				'left': 0,
				'padding': '0px 20px'
			}
		})
			.set('html', selecteditems)
			.inject($('sectors'));

		if (state) {
			list.setStyles({
				'height': flatlist.getSize().y,
				'overflow': 'hidden'
			});

			flatlist.fade('show');
			list.fade('hide');
		} else {
			list.setStyles({
				'height': 'auto',
				'overflow': 'visible'
			});
			
			flatlist.fade('hide');
			list.fade('show');
		}

		new Element('a', {
			'styles': {
				'position': 'absolute',
				'top': 10,
				'right': 10,
				'cursor': 'pointer'
			},
			'events': {
				'click': function(e) {
					new Event(e).stop();

					list.fade(state?'in':'out');
					flatlist.fade(state?'out':'in');

					this.set('html', state?'Sluiten':'Wijzigen');

					if (state) {
						list.setStyles({
							'height': 'auto',
							'overflow': 'visible'
						});
						
						/*$$('li.itemsselected').each(function(li, i) {
							if (li.getElement('span.numselected-none').getStyle('display') == 'none') {
								li.getParent('ul').retrieve('accordion').display(i);
							}
						});*/
					} else {
						selecteditems = '';
						$('sectors').getElements('label').each(function(lbl) {
							if (lbl.getFirst().get('checked')) {
								selecteditems += '<li>' + lbl.get('text') + '</li>';
							}
						});
						if (selecteditems == '') {
							selecteditems = SECTOR_NOSELECTION;
						}
						else {
							selecteditems = '<ul style="list-style-type: none;">' + selecteditems + '</ul>';
						}
						flatlist.set('html', selecteditems);
						list.setStyles({
							'height': flatlist.getSize().y,
							'overflow': 'hidden'
						});
					}
					
					state = !state;
				}
			}
		}).set('html', state?'Wijzigen':'Sluiten').inject($('sectors'));
	}

	$$('#sectors .dependsoncity').each(function(list) {
		var basename = list.get('rel');
		var postalcodefld  = $(basename + '_postalcode');
		var housenumberfld = $(basename + '_housenumber');

		if (postalcodefld && housenumberfld) {
			housenumberfld.addEvent('blur', function(e) {
				var requesturl = BASE_URL + 'ajax/clustersbypostalcode/' +
							encodeURIComponent(postalcodefld.get('value')) + '/' +
							encodeURIComponent(housenumberfld.get('value'));

				if (postalcodefld.get('value') != '' && housenumberfld.get('value') != '') {
					var selected = [];
					$$('input[type=checkbox]:checked', list).each(function(inp, i) {
						selected[i] = inp.get('value');
					});
					new Request.HTML({
						url: requesturl,
						onComplete: function(responseTree, responseElements, responseHTML, responseJavaScript) {
							list.set('html', responseHTML);
							$$('input[type=checkbox]:checked', list).set('checked', false);
							selected.each(function(val) {
								$$('input[value='+val+']', list).set('checked', true);
							});
							initExpandingList(list);
							initItemsSelected();
						}
					}).get();
				}
			});
			postalcodefld.addEvent('blur', function(e) {
				housenumberfld.fireEvent('blur');
			});
		}
	});

	$$('legend.closed').each(function(lgnd) {
		var fieldset = lgnd.getParent('fieldset');
		if (!fieldset) return;
		var fldsetparent = fieldset.getParent('div');
		if (!fldsetparent) return;

		fldsetparent.setStyle('position', 'relative');
		lgnd.setStyle('display', 'none');
		
		fieldset.fade('hide');
		fieldset.setStyles({
			'height': 20,
			'overflow': 'hidden'
		});

		new Element('a', {
			'styles': {
				'position': 'absolute',
				'top': 20,
				'left': 10,
				'cursor': 'pointer'
			},
			'events': {
				'click': function(e) {
					new Event(e).stop();

					this.fade('out');
					fieldset.fade('in');
					fieldset.setStyles({
						'height': 'auto',
						'overflow': 'visible'
					});
          fieldset.getElements('.focus_on_open').each(function(el) {
						(function(){el.select();}).delay(500);
          });
				}
			}
		})
			.set('html', lgnd.get('text'))
			.inject(fldsetparent);
	});

	if ($('startDate')) {var startDateCalendar = new Calendar({startDate: 'd-m-Y'}, {classes: ['calendar-dashboard']});}
	if ($('endDate')) {var endDateCalendar = new Calendar({endDate: 'd-m-Y'}, {classes: ['calendar-dashboard']});}
	if ($('closeDate')) {var closeDateCalendar = new Calendar({closeDate: 'd-m-Y'}, {classes: ['calendar-dashboard']});}

	$$('input.calendar-dashboard').each(function(el) {
		new Element('a', {
			'href': '#',
			'class': 'clear-calendar',
			'events': {
				'click': function(e) {
					e.stop();
					el.set('value', '');
				}
			}
		})
			.set('html', '<img src="'+BASE_URL+'img/icons/delete.png" width="13" height="13" alt="verwijderen" title="Datum verwijderen" />')
			.inject(el, 'before');
	});
	
	// Sponsors
	if ($('logo_partners')) {
		new imageFader($$('div#logo_partners img'), {duration: 1500, interval: 5000, parent: $('logo_partners')});
	}

	var notices = new Array();
	notices[0] = ['info',  '#8cff8c'];
	notices[1] = ['error', '#ff8c8c'];
	
	notices.each(function(notice) {
		if ($(notice[0])) {
			var origcolor = $(notice[0]).getStyle('background-color');
			var fx = new Fx.Tween($(notice[0]), {
				onComplete: function() {
					new Fx.Tween($(notice[0]), {
						transition: Fx.Transitions.Back.easeOut,
						duration: 1000
					}).start('background-color', origcolor);
				},
				duration: 1000
			});
			fx.start.delay(500, fx, ['background-color', notice[1]]);
		}
	});

  /*
	new iMask({
		onValid: function(event, obj) {
			obj.removeClass('imask-invalid');
		},

		onInvalid: function(event, obj) {
			if(!event.shift) {
   			obj.addClass('imask-invalid');
			}
		}
	});
  */
 
	$$('form.validate').each(function(form) {
		new fValidator(form, {
			required: {msg: "Dit veld is verplicht."},
			alpha: {msg: "Dit veld mag alleen letters bevatten."},
			alphanum: {msg: "Dit veld mag alleen letters en cijfers bevatten."},
			integer: {msg: "Dit veld mag alleen gehele getallen bevatten."},
			real: {msg: "Dit veld mag alleen getallen bevatten."},
			date: {
				re: /^(((([1-9])|([0-2][0-9])|(3[01]))[\-]((0[13578])|([13578])|(1[02])))|((([1-9])|([0-2][0-9])|(30))[\-]((0[469])|([469])|(11)))|((([1-9])|([0-2][0-9]))[\-](2|02)))[\-]\d{4}$|^\d{4}$/,
				msg: "Dit is geen geldige datum (dd-mm-yyyy)."
			},
      email: {
        re: /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i, 
        msg: "Dit is geen geldig e-mailadres."
      },
			phone: {msg: "Dit is geen geldig telefoonnummer."},
			url: {msg: "Dit is geen geldige url/link."},
			confirm: {msg: "De wachtwoorden komen niet overeen."},
			zipcode: {type: "zipcode", re: /^\d{4} [a-zA-Z]{2}$/, msg: "Dit is geen geldige postcode."},
			int_or_empty: {re: /^\d*$/, msg: "Dit veld mag alleen getallen bevatten of leeg zijn."},

			quietTillSubmit: true,
			scrollDelay: 750
		});
	});

	var pageUnsaved = false;
	changeState = function(e) {
		if (!$(e.target).hasClass('ignore-state')) {
			pageUnsaved = true;
		}
	};
	$$('input').addEvent('change', changeState.bindWithEvent());
	$$('select').addEvent('change', changeState.bindWithEvent());
	$$('textarea').addEvent('change', changeState.bindWithEvent());
	$$('form').addEvent('submit', function(e) {
		pageUnsaved = false;
	});
	window.onbeforeunload = function() {
		if (pageUnsaved) {
			return PAGE_LEAVE;
		}
	};

	$$('input.pclookup').addEvent('blur', function(e) {
		var basename = this.get('id').substring(0, this.get('id').indexOf('_'));
		
		var postalcodefld  = $(basename + '_postalcode');
		var housenumberfld = $(basename + '_housenumber');

		if (postalcodefld && housenumberfld) {
			var requesturl = BASE_URL + 'ajax/address/' +
						encodeURIComponent(postalcodefld.get('value')) + '/' +
						encodeURIComponent(housenumberfld.get('value'));

			if (postalcodefld.get('value') != '' && housenumberfld.get('value') != '') {
				new Request.JSON({
					url: requesturl,
					onComplete: function(address) {
						if (!address) {
							address = {street: 'Onbekende postcode/huinummer-combinatie', city: ''};
						}
						
						if ($(basename + '_street')) {
							$(basename + '_street').set('value', address.street);
						}
						if ($(basename + '_city')) {
							$(basename + '_city').set('value', address.city);
						}
					}
				}).get();
			}
		}
	});

	new Tips('a[href=info-pupup]', {
		'className': 'info'
	});
	$$('a[href=info-pupup]')
		.addEvent('click', function(e) {
			new Event(e).stop();
		});
	
});

var imageFader = new Class({

	Extends: Fx.Elements,

	options: {
		auto: true,
		interval: 10000,
		parent: null
	},

	initialize: function(elements, options) {
		this.elements = elements;
		this.setOptions(options);

		if (!$(this.options.parent) && this.elements[0]) {
			this.options.parent = this.elements[0].getParent();
		}

		this.elements.setStyles({
			'opacity': 0,
			'position': 'absolute',
			'top': 0,
			'left': 0
		});

		if (this.elements[0]) {
			this.elements[0].setStyle('opacity', 1);
			if (this.options.parent.getStyle('position') != 'absolute' && this.options.parent.getStyle('position') != 'relative') {
				this.options.parent.setStyle('position', 'relative');
			}
			this.options.parent.setStyles({
				'width': this.elements[0].getSize().x,
				'height': this.elements[0].getSize().y 
			});
		}

		this.curel = 0;
		if (this.options.auto) {
			this.auto.periodical(this.options.interval, this);
		}
	},

	auto: function() {
		if (!this.elements[this.curel]) {
			this.curel = 0;
		}
		this.display(this.curel);
		
		this.curel += 1;
	},

	display: function(idx) {
		var obj = {};
		this.elements.each(function(el, i) {
			if (el.getStyle('opacity') != 0 && i != idx) {
				obj[i] = {'opacity': 0};
				el.setStyle('z-index', 1);
			} else if (i == idx) {
				obj[i] = {'opacity': 1};
				el.setStyle('z-index', 2);
			}
		});
		return this.start(obj);
	}
});

function formatAsMoney(mnt) {
	mnt -= 0;
	mnt = (Math.round(mnt*100))/100;
	return (mnt == Math.floor(mnt)) ? mnt + '.00'
		: ( (mnt*10 == Math.floor(mnt*10)) ?
		 mnt + '0' : mnt);
}

