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({
	map: false,
	
	initialize: function(el, lat, long) {
		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, 13);
			this.map.addOverlay(new GMarker(point));
		}
	}
});

var RoundedCorners = new Class({
	
	Implements: Options,
	options: {
		radius: '10'
	},
	
	initialize: function(divs, options) {
		this.setOptions(options);
	
		if (divs.length) {
			divs.each(function(div) {
				this.addCorners(div);
			}, this);
		}
	},
	
	addCorners: function(div) {
		if (Browser.Engine.gecko) {
			div.setStyle('-moz-border-radius', this.options.radius+'px')
		} else if (Browser.Engine.webkit) {
			div.setStyle('-webkit-border-radius', this.options.radius+'px')
		}
	},
	
	getDivMargin: function(div, margin) {
		return parseInt(div.getStyle('margin-'+margin));
	}
	
});

var Shared = new Class({

	initialize: function() {
		new RoundedCorners($$('div.c240, div.c320, div.c480, div.c640, #body div.c960, #brands, #brands_home'));
		new RoundedCorners($$('div.product_full, div.product_half, div.product_third, div.product_quarter'));

		this.initCategories();
	
		$('basket').addEvent('click', function() {
			document.location.href = '/shop/basket';
		});
		
		var basketAdded = null;
		if ((basketAdded = $('basket_added')) != null) {
			var coord = basketAdded.getCoordinates();
			var topBottom = 'bottom';
			var startVal = 10;
			var endVal = 53;

			basketAdded.setStyle('bottom', startVal);
			basketAdded.setStyle('display','block');
			var fx = basketAdded.get('tween');
			fx.start(topBottom, endVal).chain(function() {
				(function() { fx.start(topBottom, startVal); }).delay(3000);
			});
		}
		
		var buttons = $$('.btn_delete');
		if (buttons.length) {
			buttons.each(function(btn) {
				btn.addEvent('click', function(e) {
					this.confirmDelete(e);
				}.bind(this));
			}.bind(this));
		}
		
		if ($('basket_contents')) {
			var btnDeletes = $('basket_contents').getElements('a.btn_delete');
			if (btnDeletes.length) {
				btnDeletes.each(function(btn) {
					btn.removeEvents('click');
					btn.addEvent('click', function(e) {
						if (this.confirmDelete(e)) {
							var row = $(e.target).getParent().getParent().getParent();
							var tbl = row.getParent().getParent();
							if (tbl.rows.length == 4) document.location.reload();
							else $('shipping_category').fireEvent('change');
						}
					}.bind(this));
				}.bind(this));
			}
			
			if ($('shipping_destination')) {
				var objDestination = $('shipping_destination');
				var objCategory = $('shipping_category');
				var objShippingPrice = $('shipping_price');
				var objTotalPrice = $('basket_total');
				
				objDestination.addEvent('change', function() {
					objCategory.empty();
					objShippingPrice.empty();
					new Element('div', {'class': 'spinner', 'html': '&nbsp;'}).inject(objShippingPrice);
					
					new Request.JSON({
						url: '/shop/update-basket',
						onSuccess: function(json) {
							json.categories.each(function(category)  {
								new Element('option', {'value': category.id, 'text': category.name}).inject(objCategory);
							});
							objCategory.fireEvent('change');
						}
					}).get({'action': 'shipping', 'destination_id': objDestination.get('value')});
				});
				
				objCategory.addEvent('change', function() {
					objShippingPrice.empty();
					new Element('div', {'class': 'spinner', 'html': '&nbsp;'}).inject(objShippingPrice);
					objTotalPrice.empty();
					new Element('div', {'class': 'spinner', 'html': '&nbsp;'}).inject(objTotalPrice);
	
					var date = new Date();
					new Request.JSON({
						url: '/shop/update-basket',
						onSuccess: function(json) {
							$('basket_items').set('html',json.basket_items);
							$('basket_items_price').set('html',json.basket_items_price);
							objShippingPrice.empty().set('html',json.shipping_price);
							objTotalPrice.empty().set('html',json.total_price);
						}
					}).get({'action': 'shipping', 'category_id': this.get('value'), 'time': date.getTime()});
				});
			}
			
			if ($('purchased_yes')) {
				var yesDiv = $('purchased_yes');
				var noDiv = $('purchased_no');
				var yesQuestion = $('already_purchased_yes');
				var noQuestion = $('already_purchased_no');
				if (yesQuestion.get('checked')) {
					noDiv.setStyle('display','none');
				}
				if (noQuestion.get('checked')) {
					yesDiv.setStyle('display','none');
				}
				yesQuestion.addEvent('click', function() {
					if (yesQuestion.get('checked')) {
						yesDiv.setStyle('display','block');
						noDiv.setStyle('display','none');
					}
				});
				noQuestion.addEvent('click', function() {
					if (noQuestion.get('checked')) {
						yesDiv.setStyle('display','none');
						noDiv.setStyle('display','block');
					}
				});
			
				var registerForm = ($('purchased_no')) ? $('purchased_no') : $('confirm_details');
				var inputs = registerForm.getElements('input[type="text"]');
				inputs.each(function(input) {
					if (!input.get('name').contains('delivery_')) {
						input.addEvent('blur', function() {
							var sibling = $('delivery_'+input.get('name'));
							if (sibling && (sibling.get('value') == '')) sibling.set('value',input.get('value'));
						});
					}
				});
			}
		}
		
		if ($('gmap')) new GMapHandler('gmap', $('lat').get('value'), $('lon').get('value'));

		var pgId = this.getPageId();
		if ($type(this[pgId]) == 'function') this[pgId]();
	},
	
	confirmDelete: function(e) {
		var btn = $(e.target).getParent();

		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();
	},

	getPageId: function() {
		return $(document.body).get('id').replace(/_/g,'-').camelCase();
	},

	initCategories: function() {
		var categories = $('categories');
		categories.getChildren('li').each(function(li) {
			var holder = li.getElement('div.holder');
			var subsub = false;
			if (holder) {
				var sublis = holder.getElement('ul').getChildren('li');
				sublis.each(function(subli) {
					if (subli.getElements('li').length) {
						subsub = true;
					}
				});
				
				if (!subsub) {
					holder.addClass('standalone');
				} else {
					holder.setStyle('width',(150*sublis.length)+'px');

					var liCoords = li.getCoordinates(categories);
					var holderCoords = holder.getCoordinates();
					if (holderCoords.right > 940) {
						var leftOffset = holderCoords.width-(940-liCoords.left);
						holder.setStyle('left', -leftOffset);
					}
				}
			}
		});
	},
	
	pgShopBasket: function() {
		$('basket_contents').getElements('a.update').addEvent('click', function(e) {
			e.stop();
			$('js_frm_basket-update').submit();
		});
		
		var objShippingPrice = $('shipping_price');
		var objTotalPrice = $('basket_total');
		$('shipping').addEvent('change', function() {
			var date = new Date();
			new Request.JSON({
				url: '/shop/update-basket',
				onSuccess: function(json) {
					$('basket_items').set('html',json.basket_items);
					$('basket_items_price').set('html',json.basket_items_price);
					var price = json.shipping_price.substr(json.shipping_price.indexOf(';')+1);
					objShippingPrice.empty().set('html', ((price == '0.00') ? 'FREE' : json.shipping_price));
					objTotalPrice.empty().set('html',json.total_price);
				}
			}).get({'action': 'shipping', 'category_id': this.get('value'), 'time': date.getTime()});
		});
	},
	
	pgShopRegister: function() {
		$('reg-delivery_to_billing').getElement('input[type="checkbox"]').addEvent('click', function() {
			$('js_delivery_address').setStyle('display', (this.get('checked') ? 'none' : 'block'));
		});
	},
	
	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();
});
