var GMapHandler = new Class( {
	Implements: Options,
	
	options: {
		addMarkerToCentre: true,
		center: '',
		latitude: 'lon',
		longitude: 'lat',
		controls: false,
		oMap: 'gmap',
		zoom: 14
	},

	map: false,
	
	initialize: function(gmap, options) {
		var self = this;
	
		options.oMap = gmap;
		this.setOptions(options);

		latitude = this.options.latitude.toFloat();
		longitude = this.options.longitude.toFloat();
	    myLatlng = new google.maps.LatLng(latitude, longitude);

	    var myOptions = {
			zoom: this.options.zoom.toInt(),
			center: myLatlng,
			mapTypeControl: this.options.controls,
			mapTypeId: google.maps.MapTypeId.ROADMAP
	    }
		var points = this.options.oMap.getElements('span.marker');
	    this.map = new google.maps.Map((this.options.oMap), myOptions);
		if (points.length) {
			points.each(function(point){
				var options = JSON.decode(point.getAttribute('rel'));
				loc = new google.maps.LatLng(options.latitude, options.longitude);
				var info = point.get('html');
				if (options.marker !== false) {
				    var marker = new google.maps.Marker({
				        position: loc,
				        map: self.map
			        })
					if (info.length) {
				        var popup = new google.maps.InfoWindow({
				        	content: info
				        })
						google.maps.event.addListener(marker, 'click', function() {
							popup.open(self.map, marker);
						});
					}
				}
			});
		}
		
		gmap.store('gmap', this);
	},
	
	setCenter: function(lat, lon, zoom) {
		this.map.setCenter(new google.maps.LatLng(lat, lon));
		this.map.setZoom(zoom);
	}
	
});

var Shared = new Class({

	passSelector: 'input[type="checkbox"].day',

	initialize: function() {
		var self = this;
	
		var gmaps = $$('div.gmap');
		if (gmaps.length) {
			gmaps.each(function(gmap){
				var options = gmap.getAttribute('rel');
				options = JSON.decode(options);
				new GMapHandler(gmap, options);
			});
		}
		
		if ($('add_adult')) {
			// on the booking page, so handle events
			$('add_adult').addEvent('click', function(e) {
				e.stop();
				self.addAdult();
			});
			
			if ($('add_child')) {
				$('add_child').addEvent('click', function(e) {
					e.stop();
					self.addChild();
				});
			}
			
			$$('a.delegate_remove').addEvent('click', function(e) {
				e.stop();
				this.getParent().dispose();
			});
			
			$$('a.tr_remove').removeEvents('click').addEvent('click', function(e) {
				e.stop();
				self.removeTableRow(e);
			});
			
			$$('select.conference_attendance').addEvent('change', function(e) {
				self.updateAttendance(e);
			});
			self.initPasses($$(self.passSelector));
		}
	},

	addAdult: function() {
		var self = this;
	
		var delegate = $$('div.delegate').getLast();
		var newDelegate = delegate.clone();
		newDelegate.inject(delegate,'after');

		var rowNo = this.getNextRowNo(newDelegate);

		newDelegate.getElements('input, label, select, textarea').each(function(el) {
			var elProperty = el.getProperty((el.get('tag') == 'label') ? 'for' : 'name');
			var newProperty = elProperty.substring(0, elProperty.lastIndexOf('_')+1)+rowNo;
			if (el.get('tag') == 'label') {
				el.setProperty('for', newProperty);
			} else {
				el.setProperty('name', newProperty).setProperty('id', newProperty);
			}
		});
		
		newDelegate.getElement('a.delegate_remove').addEvent('click', function(e) {
			e.stop();
			this.getParent().dispose();
		});
		
		newDelegate.getElement('select.conference_attendance').addEvent('change', function(e) {
			self.updateAttendance(e);
		});
		self.initPasses(newDelegate.getElements(self.passSelector));
	},

	addChild: function() {
		var self = this;
	
		var table = $('children');
		var tbody = table.getElement('tbody');
		
		var rowNo = self.getNextRowNo(tbody.getLast('tr'), 'childname_([0-9]+)');

		if (rowNo == 1) {
			if (tbody.rows.length == 1) tbody.getElement('tr').dispose();
		}

		var tr = new Element('tr').inject(tbody);
		
		new Element('input', {
			'type': 'text',
			'name': 'childname_'+rowNo,
			'size': '25',
			'maxlength': '50',
			'styles': {
				'width': '90%'
			}
		}).inject(new Element('td').inject(tr));

		new Element('input', {
			'type': 'text',
			'name': 'dob_'+rowNo,
			'size': '10',
			'maxlength': '10'
		}).inject(new Element('td').inject(tr));
		
		var tdOptions = new Element('td').inject(tr);
		new Element('div', {
			'class': 'input_holder clearfix ficheckbox'
		}).adopt(
			new Element('label', {
				'for': 'lunch_'+rowNo,
				'class': 'lbl_heading'
			}).set('text','Tuesday lunch will be bought from NLC for this child')
		).adopt(
			new Element('input', {
				'type': 'checkbox',
				'name': 'lunch_'+rowNo,
				'size': '10',
				'maxlength': '10'
			})
		).inject(tdOptions);
		
		new Element('div', {
			'class': 'input_holder clearfix ficheckbox'
		}).adopt(
			new Element('label', {
				'for': 'nursing_'+rowNo,
				'class': 'lbl_heading'
			}).set('text','This is a nursing child that does not require childcare')
		).adopt(
			new Element('input', {
				'type': 'checkbox',
				'name': 'nursing_'+rowNo,
				'size': '10',
				'maxlength': '10'
			})
		).inject(tdOptions);
		
		new Element('a', {
			'href': '#',
			'class': 'tr_remove button',
			'html': 'Remove',
			'events': {
				'click': function(e) {
					e.stop();
					self.removeTableRow(e);
				}.bind(this)
			}
		}).inject(new Element('td').inject(tr));
	},

	getNextRowNo: function(row) {
		var pattern = (arguments.length == 2) ? arguments[1] : 'name_([0-9]+)';

		var rowNo = 1;

		var input = row.getElement('input');
		if (!input) input = row.getElement('select');
		
		if (input) {
			var inputName = input.getProperty('name');
			var regex = new RegExp(pattern);
			var results = regex.exec(inputName);
			if (results != null) {
				rowNo = results[1].toInt()+1;
			}
		}

		return rowNo;
	},
	
	initPasses: function(dayCheckboxes) {
		dayCheckboxes.each(function(cbox) {
			var inputName = 'evening'+cbox.get('name').substring(3);
			var eveMatch = $(document.body).getElement('input[name="'+inputName+'"]');
			
			if (cbox.get('checked')) eveMatch.set('disabled', true);
			
			cbox.addEvent('click', function(cbox) {
				eveMatch.set('disabled', this.get('checked'));
			});
		});
	},
	
	removeTableRow: function(e) {
		var tr = $(e.target).getParent().getParent();
		var tbody = tr.getParent();
		tr.dispose();
		
		if (tbody.rows.length == 0) tbody.adopt(new Element('tr').adopt(new Element('td', {'colspan': 5}).adopt(new Element('p', {'class': 'highlight', 'text': 'I have no children attending the conference'}))));
	},
	
	updateAttendance: function(e) {
		var select = $(e.target);
		var fieldset = select.getParent('fieldset.conference_details');
		var divAttendance = fieldset.getElement('div.attendance_options');
		
		if (select.get('value') == 'specific') {
			divAttendance.setStyle('display','block');
		} else {
			divAttendance.setStyle('display','none');
		}
		
/*
		divAttendance.getElements('input[type="checkbox"].day').addEvent('click', function(cbox) {
			var inputName = 'evening'+this.get('name').substring(3);
			var eveMatch = divAttendance.getElement('input[name="'+inputName+'"]');
			eveMatch.set('disabled', this.get('checked'));
		});
*/
	}

});

var shared = null;
window.addEvent('domready', function() {
	shared = new Shared();
});
