;Array.prototype.contains = function(el) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == el)
			return true;
	}
	
	return false;
}
Array.prototype.index = function(el) {
	var result = -1;
	for (var i = 0; i < this.length; i++) {
		if (el == this[i])
			return i;
	}
	
	return result;
}
Array.prototype.addAll = function(list) {
	for (var i = 0; i < list.length; i++) {
		this.push(list[i]);
	}
}
Array.prototype.implode = function(char) {
	var s = '';
	for (var i = 0; i < this.length; i++) {
		s+= this[i] + char;
	}
	
	return s.replace(/\s\./g, '.').replace(/\s,/g, ',').substring(0, s.length - 1);
}
Array.prototype.one = function() {
	return this[Math.floor(Math.random() * this.length)];
}

var IceCream = new Class({
	initialize: function(container) {
		this._container = container;
		this._scoops    = [];
		this._latest    = [];
		this._order     = {scoops: [], toppings: []};
	},
	hasScoop: function() {
		return (this._scoops.length > 0);
	},
	isFullOfScoops: function() {
		return (this._scoops.length > 2);
	},
	stepBack: function() {
		if (this._latest.length == 0)
			return;
		
		var t = this._latest.pop();
		
		if (t.get && t.get('src').indexOf('/icecream/') >= 0) {
			t.dispose();
			var scoop = this._scoops.pop();
			this._order.scoops.pop();
		} else {
			this._order.toppings.pop();
			for (var j = 0; j < t.length; j++) {
				t[j].dispose();
			}
		}

		this._buildStory();
	},
	_findScoopName: function(scoop) {
		var result = '';
		icecreams.each(function(element, index) {
			if (element.image == scoop)
				result = element.descriptor;
		});
		
		return result;
	},
	_findToppingName: function(topping) {
		var result = '';
		toppings.each(function(element, index) {
			if (element.image == topping)
				result = element.descriptor;
		});
		
		return result;
	},
	addScoop: function(scoop, name) {
		if (this.isFullOfScoops())
			return;
		
		this._order['scoops'].push(scoop);
		this._scoops.push(scoop);
		this._morphScoop(scoop, this._scoops.length - 1);
		
		this._buildStory();
	},
	addTopping: function(topping, name) {
		var l = [];
		
		if (this._order.toppings.contains(topping)) {
			return;
		}
		
		this._order.toppings.push(topping);
		
		for (var i = 0; i < this._scoops.length; i++) {
			var m = this._createImage('/images/icecreamer/toppings/' + topping + '_' + (i + 1) + '.png');
			m.setStyle('zIndex', '15');
			
			l.push(m);
			
			var top = 120;
			var left = 95;
			
			if (i == 1) {
				left = 142;
				top  = 128;
			}
			if (i == 2) {
				left = 125;
				top  = 90;
				m.setStyle('zIndex', '14');
			}
			m.morph({
				top: top,
				left: left
			});
		}
		this._latest.push(l);
		
		this._buildStory();
	},
	_morphScoop: function(image, index) {
		var element = this._createImage('/images/icecreamer/icecream/' + image + '.png');
		element.setStyle('zIndex', '10');
		
		this._latest.push(element);
		
		var top = 120;
		var left = 95;
		
		if (index == 1) {
			left = 142;
			top  = 128;
			element.setStyle('zIndex', '12');
		}
		if (index == 2) {
			left = 125;
			top  = 90;
			element.setStyle('zIndex', '11');
		}
		element.set('morph', {
			transition: Fx.Transitions.Quad.easeIn,
			duration: 200
		});
		element.morph({
			top: top,
			left: left
		});
	},
	_createImage: function(src) {
		return new Element('img').set('src', src).setStyles({border: 0, position: 'absolute', top: '-50px', left: '-25px'}).inject(this._container);
	},
	_buildStory: function() {
		if (this._order.scoops.length == 0) {
			$('story').set('text', '');
			return;
		}
		
		var buffer = '<p><strong>Bas:</strong> ' + this._getStoryStart() + '</p>';
		
		for (var i = 0; i < this._order.scoops.length; i++) {
			if (i == 0) {
				buffer += '<p><strong>Glass:</strong><br />';
			} else {
				buffer += ', ';
			}
			
			buffer += this._findScoopName(this._order.scoops[i]);
			
			if (i == this._order.scoops.length - 1)
				buffer += '</p>';
		}
		
		for (var i = 0; i < this._order.toppings.length; i++) {
			if (i == 0) {
				buffer += '<p><strong>Topping:</strong><br />';
			} else {
				buffer += ', ';
			}
			
			buffer += this._findToppingName(this._order.toppings[i]);
			
			if (i == this._order.toppings.length - 1)
				buffer += '</p>';
		}
		
		buffer += '<h2 style="color:#D65B7A; font-size:15px; line-height:15px; font-weight:bold; font-family:georgia;">Så gör jag min drömstrut!</h2>';
		$('story').set('html', buffer);
		
		/*
		var usedAdjectives = [];
		var story = this._getStoryStart();
		for (var i = 0; i < this._order.scoops.length; i++) {
			var name  = this._findScoopName(this._order.scoops[i]);
			var index = story.index(name);
			
			if (index >= 0 && story[index - 3] == 'två') {
				story[index - 3] = 'tre';
			} else if (index >= 0 && story[index - 3] == 'en') {
				var adj;
				while (true) {
					adj = adjectives.one();
					if (!usedAdjectives.contains(adj)) {
						usedAdjectives.push(adj);
						break;
					}
				}
				
				story[index - 3] = 'två';
				story[index - 2] = adj;
				story[index - 1] = 'kulor';
			} else {
				if (i > 0)
					story.push(separators.one());
				
				var adj;
				while (true) {
					adj = adjective.one();
					if (!usedAdjectives.contains(adj)) {
						usedAdjectives.push(adj);
						break;
					}
				}
				
				story.addAll(['en', adj, 'kula', name]);
			}
		}
		
		story.push('.');
		if (this._order.toppings.length > 0) {
			story.addAll(['Därefter', 'tar', 'jag']);
			
			for (var i = 0; i < this._order.toppings.length; i++) {
				var name  = this._findToppingName(this._order.toppings[i]);
				if (i > 0) {
					if (this._order.toppings.length >= 2 && i == (this._order.toppings.length - 1))
						story.push('och');
					else
						story.push(',');
				}
				
				story.push(name);
			}
			
			story.push('.');
		}
		
		var t = 'strut';
		if (this.getType() == 'cup')
			t = 'bägare';
		
		story.addAll(['Så', 'gör', 'jag', 'min', 'dröm' + t + '.']);
		$('story').set('text', '"' + story.implode(' ') + '"');
		*/
	},
	showScoops: function(container) {
		this.closeNaming();
		$('toppings-container').getElement('.separator').setStyle('border-top', '1px solid #C5C5C5');
		
		container.empty();
		var me = this;
		
		var ul = new Element('ul');
		ul.inject(container);
		icecreams.each(function(icecream, index) {
			var news = (icecream['is-news']) ? '<span class="new">Nyhet!</span> ' : '';
			new Element('li')
				.set('html', '<img src="/images/icecreamer/icecream/' + icecream.image + '.png" style="float: left; width: 25px; height: 25px;" /> ' + news + icecream['name'])
				.inject(ul)
				.addEvents({
					'mouseenter': function(e) {
						this.morph({
							'background-color': '#e7e7e7'
						});
					},
					'mouseleave': function(e) {
						this.morph({
							'background-color': '#fff'
						});
					},
					'click': function(e) {
						me.addScoop(icecreams[index]['image'], icecream.descriptor);
					}
				});
		});
	},
	showToppings: function(container) {
		this.closeNaming();
		$('toppings-container').getElement('.separator').setStyle('border-top', '1px solid #C5C5C5');
		
		container.empty();
		var me = this;
		
		var ul = new Element('ul');
		ul.inject(container);
		toppings.each(function(topping, index) {
			new Element('li')
				.set('html', '<img src="/images/icecreamer/toppings/' + topping.image + '_1.png" style="float: left; width: 25px; height: 25px;" /> ' + topping['name'])
				.setStyles({
					'width': '250px'
				})
				.inject(ul)
				.addEvents({
					'mouseenter': function(e) {
						this.morph({
							'background-color': '#e7e7e7'
						});
					},
					'mouseleave': function(e) {
						this.morph({
							'background-color': '#fff'
						});
					},
					'click': function(e) {
						me.addTopping(toppings[index]['image'], topping.descriptor);
					}
				});
		});
	},
	showNaming: function(container) {
		container.empty();
		$('toppings-container').getElement('.separator').setStyle('border', 'none');
		
		var name = '';
		var me   = this;
		if (this._name)
			name = this._name;
		
		$('naming').getElement('input').setStyles({
			'background-image': 'url(/images/icecreamer/input-background.jpg)',
			'padding-left': '10px'
		});
		$('naming').getElement('img').setStyle('display', 'inline');
		$('naming').setStyle('display', 'block');
	},
	showCreation: function(container) {
		if ($('naming').getElement('input').get('value').replace(/^\s\s*/, '').replace(/\s\s*$/, '') == '') {
			return;
		}
		container.empty();
		$('toppings-container').getElements('.heading-text').removeEvents(['click']);
		$('toppings-container').getElements('.heading-text').setStyle('cursor', 'default');
		$('undo').dispose();
		this.closeNaming();
		
		var me = this;
		new Request.JSON({
			url: '/spara',
			method: 'post',
			data: {
				'name': $('naming').getElement('input').get('value'),
				'data': toJSONString(me._order),
				'story': $('story').get('html'),
				'type': me.getType()
			},
			onRequest: function() {
				new Element('div')
					.set('id', 'icecreamer-loader')
					.setStyles({
						'position': 'absolute',
						'top': '150px',
						'left': '0',
						'width': '800px',
						'text-align': 'center'
					})
					.set('html', '<img src="/images/icecreamer/loader.gif" />')
					.inject($('icecream-container'));
				$('icecream').setStyle('opacity', '.5');
			},
			onComplete: function(json) {
				$('icecreamer-loader').dispose();
				$('icecream').setStyle('opacity', '1');
				me.showSharing('http://dromstrut.siaglass.se/visa/' + json.id + '-' + json.slug, json.id, json.slug);
			}
		}).send();
	},
	showSharing: function(url, id, slug) {
		$('toppings-container').getElement('.heading-container').empty();
		$('toppings-container').getElement('.heading-container').setStyles({
			'width': '725px',
			'text-align': 'right'
		});
		
		new Element('img')
			.set('src', '/images/icecreamer/share-w-email.jpg')
			.setStyles({
				'cursor': 'pointer'
			})
			.addEvent('click', function(e) {
				new Event(e).stop();
				
				if ($defined($('email-sender')))
					$('email-sender').dispose();
				
				var f = new Element('form')
					.set('id', 'email-sender')
					.set('html', '<input type="text" class="input" name="name" id="share-name" value="Ditt namn" onfocus="this.value=\'\';" /><br /><input type="text" class="input" name="email" id="share-email" value="Din väns e-postaddress" onfocus="this.value=\'\';" /><br />')
					.inject($('toppings-container').getElement('.content'));
				
				new Element('img')
					.set('src', '/images/icecreamer/submit.jpg')
					.setStyles({
						'cursor': 'pointer',
						'border': '0'
					})
					.addEvent('click', function(e) {
						new Event(e).stop();
						
						new Request({
							'url': '/index/send',
							'method': 'post',
							'data': {
								'name': $('share-name').get('value'),
								'email': $('share-email').get('value'),
								'id': id,
								'slug': slug
							},
							'onRequest': function() {
								f.set('html', '<img src="/images/icecreamer/loader.gif" />');
							},
							'onComplete': function(response) {
								f.set('html', 'Skickat!');
							}
						}).send();
					})
					.inject(f);
			})
			.inject($('toppings-container').getElement('.heading-container'));
		new Element('img')
			.set('src', '/images/icecreamer/share-w-fb.jpg')
			.setStyles({
				'cursor': 'pointer'
			})
			.addEvent('click', function(e) {
				new Event(e).stop();
				
				window.open('http://www.facebook.com/sharer.php?u=' + encodeURI(url), 'fb', 'status=0,toolbar=0,menubar=0,scollbars=0,directories=0,location=0,width=550,height=400');
			})
			.inject($('toppings-container').getElement('.heading-container'));
		
		$('toppings-container').getElements('.clear').dispose();
		$('toppings-container').getElement('.content').setStyles({
			'border': 'none',
			'text-align': 'right'
		});
		$('toppings-container').getElement('.separator').dispose();
	},
	closeNaming: function() {
		$('naming').getElement('input').setStyles({
			'background-image': 'none',
			'padding': '0'
		});
		$('naming').getElement('img').setStyle('display', 'none');
	}
});

function toJSONString(j) {
	var result = '{';
	for (prop in j) {
		result += '"' + prop + '":[';
		var i = 0;
		for (i = 0; i < j[prop].length; i++) {
			result += '"' + j[prop][i] + '",';
		}
		if (i > 0)
			result = result.substring(0, result.length - 1);
		result += '],';
	}
	result = result.substring(0, result.length - 1);
	result += '}';
	
	return result;
}

function updateActiveHeading(heading) {
	$$('.heading').removeClass('active');
	heading.addClass('active');
}

var Cone = new Class({
	Implements: IceCream,
	
	getElement: function() {
		return new Element('div')
			.set('html', '<img src="/images/icecreamer/cone.png" />')
			.setStyles({
				'position': 'absolute',
				'top': '170px',
				'left': '115px'
			});
	},
	getType: function() {
		return 'cone';
	},
	_getStoryStart: function() {
		return 'Rån'; //return ['I', 'ett', cones.one(), 'rån', 'bottnar', 'jag', 'med'];
	}
});

var Cup = new Class({
	Implements: IceCream,
	
	getElement: function() {
		var container = new Element('div');
		var back = new Element('div')
			.set('html', '<img src="/images/icecreamer/cup-top.png" />')
			.setStyles({
				'position': 'absolute',
				'top': '152px',
				'left': '100px',
				'zIndex': '1'
			})
			.inject(container);
		var front = new Element('div')
			.set('html', '<img src="/images/icecreamer/cup.png" />')
			.setStyles({
				'position': 'absolute',
				'top': '152px',
				'left': '100px',
				'z-index': '50'
			})
			.inject(container);
		
		return container;
	},
	getType: function() {
		return 'cup';
	},
	_getStoryStart: function() {
		return 'Bägare'; //return ['I', 'min', 'bägare', 'bottnar', 'jag', 'med'];
	}
});
