var TravelPlanner = new Class({
	Implements: [Options, Events],
	options: {
		container: false,
		attractionUrl: '',
		serviceUrl: '',
		itenaryUrl: '',
		townUrl: ''
	},
	
	proxyUrls: {
		'northis': 'http://nordurland.is/map/ItenaryStorageProxy.swf',
		'northen': 'http://northiceland.atdev.is/map/ItenaryStorageProxy.swf',
		'visitis': 'http://is.visiticeland.com/map/ItenaryStorageProxy.swf',
		'visiten': 'http://visiticeland.com/map/ItenaryStorageProxy.swf',
		'visitde': 'http://de.visiticeland.com/map/ItenaryStorageProxy.swf',
		'visitda': 'http://dk.visiticeland.com/map/ItenaryStorageProxy.swf',
		'visitnb': 'http://no.visiticeland.com/map/ItenaryStorageProxy.swf',
		'visitsv': 'http://no.visiticeland.com/map/ItenaryStorageProxy.swf',
		'visitnl': 'http://nl.visiticeland.com/map/ItenaryStorageProxy.swf',
		'visitfr': 'http://fr.visiticeland.com/map/ItenaryStorageProxy.swf',
		'visites': 'http://es.visiticeland.com/map/ItenaryStorageProxy.swf',
		'visitit': 'http://it.visiticeland.com/map/ItenaryStorageProxy.swf',

		'northis': 'http://nordurland.is/map/ItenaryStorageProxy.swf',
		'northen': 'http://northiceland.is/map/ItenaryStorageProxy.swf',
		
		'reykjanesis': 'http://reykjanes.is/map/ItenaryStorageProxy.swf',
		'reykjanesen': 'http://visitreykjanes.is/map/ItenaryStorageProxy.swf',

		'westis': 'http://vesturland.is/map/ItenaryStorageProxy.swf',
		'westen': 'http://westiceland.is/map/ItenaryStorageProxy.swf',
		
		'southis': 'http://is.south.is/map/ItenaryStorageProxy.swf',
		'southen': 'http://south.is/map/ItenaryStorageProxy.swf',
		
		'eastis': 'http://is.east.igmdevsite.com/map/ItenaryStorageProxy.swf',
		'easten': 'http://east.igmdevsite.com/map/ItenaryStorageProxy.swf',
		
		'westfjordsis': 'http://is.westfjords.igmdevsite.com/map/ItenaryStorageProxy.swf',
		'westfjordsen': 'http://westfjords.igmdevsite.com/map/ItenaryStorageProxy.swf'
	},
	
	listSort: {},
	langs: {},
	
	initialize: function(options) {
		if (lang == 'is') {
			this.langs.Title = 'Ferðalisti';
			this.langs.View = 'Skoða';
			this.langs.Remove = 'Eyða úr lista';
			this.langs.Clear = 'Hreinsa';
			this.langs.ViewAll = 'Skoða alla';
			this.langs.ViewMap = 'Sjá á korti';
		}
		else {
			this.langs.Title = 'My Itinerary';
			this.langs.View = 'View';
			this.langs.Remove = 'Remove from list';
			this.langs.Clear = 'Clear';
			this.langs.ViewAll = 'View all';
			this.langs.ViewMap = 'View on map';
		}

		$(document.body).grab(new Element('div', {'id': 'itenarystorageWrapper', 'style': 'position:fixed; top:1px; left:1px;', 'html': '<div id="itenarystorage"></div>'}));
		
		swfobject.embedSWF(this.proxyUrls[site+lang], "itenarystorage", "1", "1", "9.0.0", null, null, {wmode: 'transparent', AllowScriptAccess: 'always'});

		this.setOptions(options);

	},
	
	initPlanner: function() {
		this.draw();

		// ef plannerinn er á .main-content þá sýnum við kortið
		if ($$('.main-content .travel-planner')[0] != null) {
			this.showOnMap(true);
			$$('.addthis_toolbox').setStyle('display', 'none');
		}
	
	},
	
	getData: function() {

		var strData = $$('object#itenarystorage')[0].getData();
		
		var obj = JSON.decode(strData);
		
		return obj;
	},
	
	writeData: function(data) {
		var dataStr = JSON.encode(data);
		
		$$('object#itenarystorage')[0].setData(dataStr)

	},
	
	addItem: function(id, name, x, y, type, location) {
		var travelList = this.getData();
		
		var listStatus = ((travelList == null) || (travelList.length == 0));
		
		if (travelList == null) {
			travelList = [];
		}
		
		if (travelList.length == 0) {
			travelList.push({i: id, n: name, x: x, y: y, t: type, l: location});
			this.writeData(travelList);
			
			this.draw();
		}
		else {
			travelList.push({i: id, n: name, x: x, y: y, t: type, l: location});
			this.drawItem({i: id, n: name, x: x, y: y, t: type, l: location}, travelList.length-1);
			this.writeData(travelList);
		}

		
	},
	
	removeItem: function(index) {
		var travelList = this.getData();
		
		for (var i = travelList.length-1; i >= 0; i--) {
			if (i == index) {
				travelList.splice(i, 1);
			}
		}

		this.writeData(travelList);
		
		if (travelList.length == 0) {
			this.draw();
		}
		
		if (this.numbersOnMap) {
			this.showOnMap(true, true);
		}
		
		this.updateCount();
	},
	
	clear: function() {
		$$('object#itenarystorage')[0].clear();
		
		this.draw(true);
	},
	
	getItemByID: function(id) {
		var travelList = this.getData();
		var ret;
		
		for (var i = travelList.length-1; i >= 0; i--) {
			if (travelList[i].i == id) {
				ret = travelList[i];
			}
		}
		
		return ret;
	},
	
	numbersOnMap: false,
	
	showOnMap: function(disableScrolling, disableMapScrolling) {
		this.numbersOnMap = true;
		
		var travelList = this.getData();
		var pointsArray = [];
		var pointStr;
		
		if (travelList != null) {
			for (var i = 0; i < travelList.length; i++) {
				if (travelList[i].x != '') {
					pointStr = '';
					pointStr += travelList[i].y+'|';
					pointStr += travelList[i].x+'|';
					pointStr += travelList[i].n+'|';
					pointStr += travelList[i].t+'|';
					pointStr += travelList[i].i+'|';
					pointStr += (i+1);
					
					pointsArray.push(pointStr);
				}
			}
		}
		
		var mapView = $$('object#mapView')[0];
		
		if (mapView) {

			mapView.displayPoints(pointsArray.join(';'), disableMapScrolling);
			
		}		
		else {
			
			ChangeView('map');
			MapInject(pointsArray.join(';'), disableMapScrolling);
			
		}
		
		if (!disableScrolling) {
			var banner = $$('#banner')[0];
			var scr = new Fx.Scroll(window).toElement(banner);
		}
		
	},
	
	drawItem: function(travelItem, index) {
		var cont = this.options.container;
		var list = cont.getElement('.items');

		if (travelItem.t.toInt() == 999) {
			href = this.options.attractionUrl+travelItem.i;
		}
		else if (travelItem.t.toInt() == 1001) {
			href = this.options.townUrl+travelItem.i;
		}
		else {
			href = this.options.serviceUrl+travelItem.i;
		}
		
		var wrapper = new Element('div', {'class': 'item-wrapper'});
		
		var item = new Element('div', {'class': 'item'});
		
		var counter = new Element('span', {'class': 'counter', text: (index+1)}).inject(item);
		var name = new Element('a', {'class': 'name', text: travelItem.n}).inject(item);
		item.grab(new Element('div', {'class': 'clear'}));
		wrapper.grab(item);
		
		var info = new Element('div', {'class': 'info', html: travelItem.l+'<br/><a href="'+href+'">'+this.langs.View+'</a> | '}).inject(wrapper);
		
		var clearItem = new Element('a', {'class': 'remove', text: this.langs.Remove, href: '', rel: index}).inject(info).addEvent('click', function(evt) {
			
			evt.stop();
			wrapper.dispose();
			this.removeItem(evt.target.get('rel'));
			
		}.bindWithEvent(this));
		info.grab(new Element('div', {'class': 'clear'}));
		
		list.grab(wrapper);
		wrapper.inject(list);

		if ($$('.main-content .travel-planner')[0] == null) {
			wrapper.getElement('.info').slide('hide');
		}
		
		wrapper.getElement('a.name').addEvent('click', function() {
			wrapper.getElement('.info').slide('toggle');
		});
		
		this.listSort.addItems(wrapper);
	},
	
	updateCount: function() {
		var counter = 1;
		var cont = this.options.container;
		
		var travelList = this.getData();
		var newTravelList = [];
		
		cont.getElements('.items .item-wrapper .item').each(function(el) {
			
			var id = el.getElement('.counter').get('text').toInt()-1;
			
			newTravelList.push(travelList[id]);
			
			el.getParent().getElement('.info .remove').set('rel', (counter-1));
			el.getElement('.counter').set('text', (counter));
			counter++;
		});
		
		return newTravelList;
	},
	
	draw: function(clear) {
		var travelList = this.getData();
		
		var cont = this.options.container;
		
		this.listSort = new Sortables(cont.getElements('.items'), {
			clone: true,
			constrain: true,
			opacity: 0.5,
			handle: '.counter',
			onComplete: function(el) {
											
				newTravelList = this.updateCount();
					
				this.writeData(newTravelList);
				
				if (this.numbersOnMap) {
					this.showOnMap(true, true);
				}
			}.bindWithEvent(this)
		});

		if (cont != null) {
			
			cont.set('html', '');
			if (this.options.itenaryUrl) {
				cont.grab(new Element('div', {'class': 'travel-planner-head', 'html': '<a href="'+this.options.itenaryUrl+'">'+this.langs.Title+'</a>'}));
			}
			else {
				cont.grab(new Element('div', {'class': 'travel-planner-head', 'text': this.langs.Title}));
			}
			
			if ((travelList != null) && (travelList.length > 0)) {

								
				var list = new Element('div', {'class': 'items'});
				cont.grab(list);
				
				
				for (var i = 0; i < travelList.length; i++) {
					this.drawItem(travelList[i], i);
				}
				
/*
				cont.getElements('.items .item-wrapper').each(function(el) {
					el.getElement('.info').slide('hide');
					el.getElement('a.name').addEvent('click', function() {
						el.getElement('.info').slide('toggle');
					});
				});
*/				
				this.drawUI();
			}
			
		}
		
	},
	
	drawUI: function() {
		var cont = this.options.container;
		
		if (cont != null) {
			var controls = new Element('div', {'class': 'controls'});
			
			if (cont != null) {
				var clearLink = new Element('a', {text: this.langs.Clear});
				controls.grab(clearLink);
				clearLink.addEvent('click', function() {
					this.clear();
				}.bindWithEvent(this));
				
				var mapDisplayLink = new Element('a', {text: this.langs.ViewMap, 'class': 'view-on-map'});
				controls.grab(mapDisplayLink);
				mapDisplayLink.addEvent('click', function() {
					this.showOnMap();
				}.bindWithEvent(this));
				
				if (this.options.itenaryUrl) {
					var viewAllLink = new Element('a', {'class': 'view-all', text: this.langs.ViewAll, 'href': this.options.itenaryUrl});
					controls.grab(viewAllLink);
				}
			}
			
			controls.grab(new Element('div', {'class': 'clear'}));
			
			cont.grab(controls);
		}
	}
});

window.addEvent('domready', function(){
	$$('.add-to-travellist').each(function(el) {
		if ((el.getElement('.x').get('text') == '0') || (el.getElement('.y').get('text') == '0')) {
			el.setStyle('display', 'none');
		}
		el.addEvent('click', function(evt) {
			evt.stop();
			var itemId = el.getElement('.id').get('text');
			var itemName = el.getElement('.name').get('text');
			var itemX = el.getElement('.x').get('text');
			var itemY = el.getElement('.y').get('text');
			var itemType = el.getElement('.type').get('text');
			var location = el.getElement('.location').get('text');
			
			planner.addItem(itemId, itemName, itemX, itemY, itemType, location);
		});
	});
});
