Array.implement({
	
	invoke: function(fn, args){
		var result = [];
		
		for (var i = 0, l = this.length; i < l; i++){
			if(this[i] && this[i][fn])
				result.push(args ? this[i][fn].pass(args, this[i])() : this[i][fn]());
		}
		return result;
	}
	
});

var GMapHandler = new Class({
	Implements: Options,
	options: {
		zoom: 8,
		addMarkerToCentre: true
	},

	map: false,
	
	initialize: function(el, lat, long, options) {
		this.setOptions(options);
	
		window.addEvent('unload', function() {
			GUnload();
		});
		
		if (GBrowserIsCompatible()) {		
			this.map = new GMap2($(el));
			this.map.addControl(new GSmallMapControl());
				
			var point = new GLatLng(parseFloat(lat), parseFloat(long));
			this.map.setCenter(point, this.options.zoom);
			if (this.options.addMarkerToCentre) this.map.addOverlay(new GMarker(point));
		}
	}
	
});

var Shared = new Class({

	initialize: function() {
		var buttons = $$('.btn_delete');
		if (buttons.length) {
			buttons.each(function(btn) {
				btn.addEvent('click', function(e) {
					this.confirmDelete(e);
				}.bind(this));
			}.bind(this));
		}

		if ($('gmap')) new GMapHandler('gmap', $('lat').get('value'), $('lon').get('value'));
		
		this.addAccordions();
		this.initGrid();
		
		if ($('holiday_home_map')) this.initHolidayHome();
		else this.initHolidayMaps();
		
		if (document.location.href.contains('popout')) {
			var oUri = new URI(document.location.href);
			var highlightId = oUri.getData('id');
			var el = $('popout_'+highlightId);
			if (el) {
				el.set('tween', {duration: 2000});
				el.highlight('#fff');
				var coords = el.getCoordinates();
				
				var popout = new Element('div', {
					'class': 'xhr_popout',
					'styles': {
						'top': coords.top,
						'left': coords.left+coords.width
					},
					'text': 'Changes saved'
				}).inject(document.body);
				(function() { popout.fade('out'); }).delay(2000);
			}
		}
	},

	addAccordions: function() {
		var accHeadings = $$('h2.acc_toggler');
		var accDivs = $$('div.acc_content');
		if (accHeadings.length && !accDivs.length) {
			accHeadings.each(function(heading) {
				var accContent = new Element('div', {'class': 'acc_content'});
				var el = heading.getNext();

				while (el && (el.get('tag') != 'h2') && (!el.hasClass('acc_toggler') && (el.getStyle('position') != 'absolute'))) {
					var next = el.getNext();
					accContent.adopt(el);
					el = next;
				}
				accContent.inject(heading,'after');
			});
			
			var acc = new Fx.Accordion($$('h2.acc_toggler'), $$('div.acc_content'), {
				onActive: function(toggler, element) {
					toggler.removeClass('acc_inactive');
				},
				onBackground: function(toggler, element) {
					toggler.addClass('acc_inactive');
				}
			});
		}
	},

	confirmDelete: function(e) {
		var btn = $(e.target).getParent('a');

		var parts = btn.get('title').split(' | ');
		switch (parts.length) {
			case 1: var msg = 'Are you sure you want to delete?'; break;
			case 2: var msg = 'Are you sure you want to delete this '+parts[1]+'?'; break;
			case 3: var msg = 'Are you sure you want to delete this '+parts[1]+'?\n- '+parts[2]; break;
		}

		if (!confirm(msg)) e.stop();
		else {
			if (btn.href.indexOf('xhr') > -1) {
				e.stop();
				var link = btn.href.split('&xhr');
				var parts = link[0].split('?');
				var date = new Date();

				parts[1] += '&rowIndex='+(btn.getParent().getParent().rowIndex-1)+'&time='+date.getTime();
				return new Request.JSON({
					method: 'get',
					url: parts[0],
					onSuccess: function(json) {
						if (json.status == 'deleted') {
							var row = btn.getParent().getParent();
							return this.removeTableRow(row);
						} else if (json.status == 'error') {
							alert('It was not possible to complete your request!');
							return false;
						}
					}.bind(this)
				}).send(parts[1]);
			}
		}
	},

	initGrid: function() {
		$$('div.thumb_grid_large, div.thumb_grid_small').each(function(grid) {
			grid.getChildren('div.thumb').addEvents({
				'click': function() {
					document.location.href = this.getElement('a').get('href');
				},
				'mouseenter': function() {
					this.getElement('p').setStyle('visibility','visible');
				},
				'mouseleave': function() {
					this.getElement('p').setStyle('visibility','hidden');
				}
			});
		});
	},
	
	initHolidayHome: function() {
		var gmap = new GMapHandler('holiday_home_map', 54, -2, {zoom: 6, addMarkerToCentre: false});
		
		var mapMarkers = [];
		$$('a.home_map_link').each(function(link, i) {
			var uri = new URI(link);
			var latLong = new GLatLng(uri.getData('lat','fragment'), uri.getData('lon','fragment'))
			mapMarkers[i] = new GMarker(latLong);
			gmap.map.addOverlay(mapMarkers[i]);
			mapMarkers[i].bindInfoWindowHtml(link.getParent().getParent().getElement('div').get('html'), {maxWidth: 200});
			
			link.addEvent('click', function(e) {
				e.stop();
				gmap.map.panTo(mapMarkers[i].getLatLng());
				gmap.map.setZoom(10);
				GEvent.trigger(mapMarkers[i],'click');
			});
		});
	},
	
	initHolidayMaps: function() {
		var maps = $$('a.map_link');
		if (maps) {
/*
			SqueezeBox.initialize({ size: {x: 550, y: 450} });
			maps.addEvent('click', function(e) {
				e.stop();
				var uri = new URI(e.target);
			    SqueezeBox.open($('holiday_map'), {handler: 'clone'});
			    SqueezeBox.addEvent('open', function() {
					new GMapHandler('sbox-content', uri.getData('lat','fragment'), uri.getData('lon','fragment'));
				});
			});
*/
		}
	},
	
	removeTableRow: function(row) {
		var children = row.getChildren();
		
		var cellHeight = 0;
		children.each(function(child) {
			if (parseInt(child.getStyle('height')) > cellHeight) cellHeight = parseInt(child.getStyle('height'));
		});
		children.invoke('setStyle', ['height',cellHeight]);

		var fx = new Fx.Tween(row);
		fx.start('opacity','0.2').chain(function() {
			var childFx = [];
			children.each(function(child) {
				childFx.push(new Fx.Tween(child));
			});
			children.invoke('set', ['html','']);
			childFx.invoke('start', ['height','0px']);
			
			this.start('border','0').chain(function() {
				row.dispose();
				return true;
			});
		});
	}

});

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