/************************************************************************
 * 		Tab Editor 														*
 * 		C 2008 by René Lange & Thomas Müller & Steve Rohrlack @ mindbox	*
 ************************************************************************/

var Editor = AbstractTab.extend({	
	tabArray: new Array(),
	tabs : '',
 	
	initialize : function() {
		this.selector = 'editor';
		this.title = 'My Tour';
	},

	// EventHandler
	sendMessage : function (target, todo, args) {
		if ((this.selector == target) || (this.title == target)) {
			this.handleEvent(todo, args);
		}
	},

	// Nachrichten verarbeiten
	handleEvent : function (todo, args) {
		switch (todo) {
			case 'rebuildOn':				this.rebuild = true;
											break;
			case 'rebuild':					this.rebuildContent();
											break;
			case 'changeTour':				this.changeTour();								
											break;
			case 'addElement':				this.addElement(args);
											break;
			case 'removeElement':			this.removeElement(args);
											break;
			case 'updateEntryListInfos':	this.updateEntryListInfos(args);
											break;
		}
	},
	
	// Inhalte zusammensetzen
	buildContent : function(){
		// Slider zurücksetzen
		this.accs = '';
		
		// Tourinfo
		this.ti = new TourInfo();
		this.fillContent(this.ti.build(null));
		
		
		// Karte und Legende
		this.tm = new TourMap();
		this.fillContent(this.tm.build());
		
		// die legende und die buttons zum drucken und darstellen einer tour
		this.tmf = new TourMapFunctions(TourPlanner.instance.currentTour);
		this.fillContent(this.tmf.build());
		this.tmpEl = new Element('div',{'id':'tourMapSidebarBottom'});
		this.fillContent(this.tmpEl);	

		this.tmpEl = new Clearer();
		this.fillContent(this.tmpEl);	

		this.tmpEl = new Element('div',{'id':'pageBreaker'});
		this.fillContent(this.tmpEl);	

		this.tmpEl = new Clearer();
		this.fillContent(this.tmpEl);	
		
		// die Liste zum Organisieren der Tagesabläufe 
		this.pl = new PlannerList(TourPlanner.instance.currentTour);
		this.fillContent(this.pl.build(null));

		// Events und Inhalte
		this.addAccordion(false);
		this.addEvents();
		this.fillTourInfos();
	},
	
	// Events an Buttons hängen
	addEvents : function(toAdd) {
		if($type(toAdd) != false){
			elem = toAdd;
		}else{
			elem = $('editorContent');
		}
		// Event beim Verlassen der Select-Box zur Auswahl des Tages eines Entries
		elem.getElements('select').each(function(el){
			if (el.getProperty('class') == 'tpDayOfEntry') {
				el.addEvent('change',function(ev){
					newDay = TourPlanner.instance.changeDayOfEntry(el);
					if (newDay < 0) {
						TourPlanner.instance.log('def_ems', '');
						this.copyEntryToStart(el);
					}
					else {
						TourPlanner.instance.log('def_em', '');
						this.moveEntryToDay(el, newDay);
					}
					new Event(ev).stop();
					TourPlanner.instance.currentTourChanged = true;
				}.bind(this));
			}
			if (el.hasClass('tpStayTimeOfEntry')) {
				el.addEvent('blur',function(ev){
					TourPlanner.instance.changeValueOfEntry(el, el.getProperty('class'));
					TourPlanner.instance.currentTourChanged = true;
					return false;
				});
			}
		}.bind(this));
		
		// Event ausgelöst wenn der Wert eines Eingabefeldes geändert wurde
		elem.getElements('input').each(function(el){
			if (el.hasClass('tpPersonsOfEntry')) {
				el.addEvent('blur',function(ev){
					TourPlanner.instance.changeValueOfEntry(el, el.getProperty('class'));
					TourPlanner.instance.currentTourChanged = true;
					return false;
				});
			}
			if (el.getProperty('id') == 'tourName') {
				el.addEvent('blur',function(ev){
					if (TourPlanner.instance.changeValueOfTour(el)) {
						TourPlanner.instance.currentTourChanged = true;
						TourPlanner.instance.log('def_tnc', '');
					}
					return false;
				});
			}
			if(el.hasClass('tpAccoItem')){
				el.addEvent('click',function(ev){
					TourPlanner.instance.changeAccoEntryOfDay(el);
					TourPlanner.instance.currentTourChanged = true;
//					TourPlanner.instance.log('def_aec', '');
					new Event(ev).stopPropagation();
				});
			}
		});
		
		// Hotel als Startpunkt der Reise setzen
		elem.getElements('a.tpStartItem').each(function(el){
			el.addEvent('click',function(ev){
				new Event(ev).stop();
				TourPlanner.instance.changeDayOfEntry(el);
				TourPlanner.instance.log('def_ems', '');
				this.copyEntryToStart(ev.target);
				TourPlanner.instance.currentTourChanged = true;
			}.bind(this));
		}.bind(this));
		
		
		// Sorting Options
		elem.getElements('a').each(function(el){
			var elClass = el.getProperty('class');
			switch(elClass){
				case 'tpRemoveItem':
					el.addEvent('click', function(ev){
						var ev = new Event(ev);
						TourPlanner.instance.removeItem(el);
						ev.stop();
						TourPlanner.instance.currentTourChanged = true;
					}.bind(this));
					break;
				case 'tpMoveUp':
				case 'tpMoveDown':
					el.addEvent('click', function(ev){
						var ev = new Event(ev);
						ev.stop();
						cDayNo = TourPlanner.instance.moveElement(ev.target);
						if(cDayNo){
							this.pl.updateTourList(ev.target,'move');
							TourPlanner.instance.currentTourChanged = true;
						}else{
							return false;
						}
					}.bind(this));
					break;
				}
		}.bind(this));

	
		if ($type(toAdd) == false) {
			// Änderung der Tour, wenn Tage geupdated wurden
			var el = $('tpChangeDays');
			el.addEvent('click',function(ev){
				this.updateDays();
				new Event(ev).stop();
				return false;
			}.bind(this));
			
			
			// Tour speichern + ändern
			if (TourPlanner.instance.userStatus == 'true') {
				$('saveTour').addEvent('click',function(ev) {
					if (TourPlanner.instance.saveCurrentTour() != false) {
						TourPlanner.instance.log('def_ts', '');
					}
					new Event(ev).stop();
				});
			}		
			// Draw Button
			$('tpDrawMap').addEvent('click',function(ev) {
				TourPlanner.instance.sendMessage('tourplanner', 'updatePlannerMap');
				new Event(ev).stop();
			}.bind(this));

			// Print Button
			$('tpPrint').addEvent('click',function(ev) {
				path = '/tp/';
				if(location.href.search(/tpdev/) != -1){
					// phpPath automatisch auf Entwicklungsumgebung setzen
					file = location.href.replace(/(.*\/)|(\.html.*)/g,'').replace(/tpdev/,'tp_dev_');
					path = path.replace(/tp/,file);
				}
				var url = path + 'popup.html';
				var printWindow = window.open(url, "PrintView", "width=1000,height=750,status=yes,scrollbars=yes,resizable=yes");
//			 	var printWindow = window.open(url);
				printWindow.focus();
			}.bind(this));
			
			// Legende
			$E('.legend').getElements('a').each(function(el) {
				el.addEvent('click',function(ev) {
					//default Klickverhalten abfangen
					new Event(ev).stop();
					this.tm.handleLegendEvent(ev.target);
				}.bind(this));
			}.bind(this));
		}
		
		this.stopLinkHopping();
	},
	
	// Accordion hinzufügen
	addAccordion : function(isUpdate) {
		if (isUpdate) {
			this.accs = new Accordions('accElNew',this.selector + 'Content', 'dayEntrys');
			$('dayEntrys').getElements('.accElNew').each(function(el){
				el.removeClass('accElNew');
			});
		} else {
			this.accs = new Accordions('accEl',this.selector + 'Content', '');			
		}
	},
	
	
	// Tour Infos schreiben
	fillTourInfos : function() {
		var tour = TourPlanner.instance.currentTour
		$('tourName').value = tour.title;
		$('tourLength').value = tour.length;
	},
	
	// Aktualisiert die Anzahl der Tage in der aktuellen Tour
	updateDays : function() {
		var tour = TourPlanner.instance.currentTour;
		var del = false;
		// Holt die Anzahl an Tagen 
		var newNumberOfDays = $('tourLength').get('value');
		// alte Länge
		numberOfDays = tour.length;
		// neue Länge in Tour ablegen
		
		var diff = newNumberOfDays - numberOfDays;
		// tagzahl unverändert
		if(numberOfDays == newNumberOfDays){
			TourPlanner.instance.log('def_tdsl');
			return false;
		}
		
		// anpassen des Tourobjekts
		// tagzahl größer
		if (numberOfDays < newNumberOfDays) {
			newdcDays = new Array();
			tour.dcDays.each(function(day) {
				newdcDays.push(day);
			}.bind(this));
			for (var i = numberOfDays; i < newNumberOfDays; i++) {
				newdcDays.push(new DcDay());
			}
			tour.dcDays = newdcDays;

			var i = 0;
			tour.dcDays.each(function(day,i) {
				if (day.id_day == '') {
					day.id_day = i;
					day.no = i;	
				}	
			}.bind(this));
			tour.length = newNumberOfDays;
		} 
		// tagzahl kleiner
		else if (numberOfDays > newNumberOfDays) {
			del = confirm('Should the last ' + (Math.abs(diff) > 1 ? Math.abs(diff) + ' ' : '')  + 'day' + (Math.abs(diff) > 1 ? 's' : '' ) + ' really be deleted?');
			if(del){
				var cDays = tour.dcDays;
				tour.dcDays = new Array();
				for(i = 0; i < newNumberOfDays; ++i){
					tour.dcDays.push(cDays[i]);
				}
				tour.length = newNumberOfDays;
			}
		}
		// Farben zuordnen
		for (var i = 0; i < tour.dcDays.length; i++) {
			switch(i % 7) {
				case 0: tour.dcDays[i].color = 'blue';
				break;
				case 1: tour.dcDays[i].color = 'green';
				break;
				case 2: tour.dcDays[i].color = 'red';
				break;
				case 3: tour.dcDays[i].color = 'azure';
				break;
				case 4: tour.dcDays[i].color = 'purple';
				break;
				case 5: tour.dcDays[i].color = 'yellow';
				break;
				case 6: tour.dcDays[i].color = 'brown';
				break;
			}
		}		
		
		TourPlanner.instance.currentTour = tour; // Zurückspeichern		
		
		// Neu aufbauen
		TourPlanner.instance.currentTourChanged = true;
		this.updateTourLength(diff, del);
		this.updateDaySelector(diff, tour.length);
		if ((del && diff < 0) || (!del && diff > 0)) {
			TourPlanner.instance.log('def_tdc');
		}else{
			TourPlanner.instance.log('def_tdsl');
		}
		return false;	
	},
	
	updateTourLength: function(diff, del){
		if(diff < 0){
			if(del){
				var accEls = $('dayEntrys').getChildren('.accEl');
				var accElCount = accEls.length - 1;
				for (var i = accElCount; i > accElCount + diff; --i) {
					accEls[i].destroy();
				}
				accEls[accElCount + diff].adopt(new Element('div', {'class':'last'}));
			}
		} else {
			var tl = TourPlanner.instance.currentTour.length;
			var day = null;
			var last = false;
			
			// Abschlussdiv entfernen (runde Ecken)
			this.pl.container.getElement('.last').destroy();
			
			// neue Tage anhängen
			for(var i = tl - diff; i < tl; i++){
				day = TourPlanner.instance.currentTour.dcDays[i];
				if(TourPlanner.instance.currentTour.dcDays.length-1 == i) {
					last = true;
				}
				nAccEl = this.pl.buildToggler(day,i,last);
				nAccEl.addClass('accElNew');
				
				if (nAccEl.getElement('.accAccoList')) {
					nAccEl.getElement('.accAccoList').getElements('.accEl').each(function(item){
						item.addClass('accElNew');
					})
				}
				this.pl.container.adopt(nAccEl);
				this.addEvents(nAccEl);
			}
			
			
			var prevLastDay = tl-diff-1;
			if (prevLastDay != 0) {
				day = TourPlanner.instance.currentTour.dcDays[prevLastDay];
				var prevLastDayAcc = $('accContent_' + prevLastDay);
				prevLastDayAcc.adopt(this.pl.buildDescElement('Choose your overnight accommodation for this day'));
				nAccAccoEl = this.pl.buildAccomodationList(day.id_acco, prevLastDay);
				nAccAccoEl.getElements('.accEl').each(function(item){
					item.addClass('accElNew');
				});
				prevLastDayAcc.adopt(nAccAccoEl);
				this.addEvents(nAccAccoEl);
			}
			
			this.addAccordion(true);
		}
	},
	
	updateDaySelector: function(diff, length){
		if (diff > 0) {
			$('dayEntrys').getElements('.tpDayOfEntry').each(function(el){
				for (var i = diff; i > 0; i--) {
					el.adopt(new Element('option', {
						'value': length - i
					}).set('text', 'day ' + (length - i + 1)));
				}
			});
		} else {
			$('dayEntrys').getElements('.tpDayOfEntry').each(function(el){
				var opts = el.getElements('option');
				for(var i = length - 1; i > length - diff; i--){
					opts[i].destroy();
				}
			});
		}
	},
	
	// Neuladen der Inhalte des Tabs
	rebuildContent : function() {
		this.clear();
		this.buildContent();
	},
	
	// Aktualisierung
	update : function(mode,id) {
		this.tabArray.each(function(tab) {
			tab.update(mode,id);
		});
	},
	
	copyEntryToStart: function(el){
		// building the content of the new starting point
		var entry = TourPlanner.instance.currentTour.tourStart.dcEntries[0];
		var day = TourPlanner.instance.currentTour.tourStart;
		var startItem = this.pl.buildTogglerEntryContent(entry, day, 'start', 0, ' greenBg', 0)
		if ($type($('accContentItem_start')) != false) {
			startItem.replaces($('accContentItem_start'));
		} else {
			startItem.inject($('accContent_0').getFirst('.accContentDesc'), 'after');
			this.addEvents(startItem);
		}
		// reseting the value of the day-selector 
		if(el.get('tag') == 'select'){
			el.set('value',0);
		}
	},
	
	moveEntryToDay: function(el,newDay){
		var accContentItem = el.getParent('.accContentItem');
		var oldDay = accContentItem.getParent();	
		var newDay = $('accContent_'+newDay);
		var accElDescAcco = newDay.getElement('.accAccoList').getPrevious('.accContentDesc');
		accContentItem.inject(accElDescAcco,'before');
		this.updateClasses(oldDay);
		this.updateClasses(newDay);
	},
	
	updateClasses: function(accContent){
		var items = accContent.getChildren('.accContentItem');
		var day = accContent.getProperty('id').replace(/[^\_]+\_/,'')
		var j = k = 0;
		for(var i = 0; i < items.length; i++){
			if(items[i].getProperty('id') != 'accContentItem_start'){
				if(j++ == 1){
					items[i].addClass('blueBg');
					j = 0;
				}else{
					items[i].removeClass('blueBg');
				}
				items[i].setProperty('id',items[i].getProperty('id').replace(/[0-9]+\_[0-9]+$/,day + '_' + (k++)));
			}
		}
	},
	
	addElement: function(args){
		if (args.has('acco')) {
			this.pl.dcAcco = TourPlanner.instance.currentTour.dcAcco;
			var accAccLists = $$('.accAccoList');
			var newAccoIndex = TourPlanner.instance.currentTour.dcAcco.length - 1;
			TourPlanner.instance.currentTour.dcDays.each(function(day,i){
				
				newEl = new Element('div', {'class':'accEl accElNew accAccoListItem'});	
				newEl.adopt(this.pl.buildAccoTogglerHead(TourPlanner.instance.currentTour.dcAcco[newAccoIndex],i,newAccoIndex));
				newEl.adopt(this.pl.buildAccoTogglerContent(TourPlanner.instance.currentTour.dcAcco[newAccoIndex]));
				if (accAccLists[i]) {
					accAccLists[i].adopt(newEl);
				}
				this.addEvents(newEl);
			}.bind(this));
			this.addAccordion(true);
		} else {
			var day0 = TourPlanner.instance.currentTour.dcDays[0];
			var day0Length = day0.dcEntries.length;
			var newEl = this.pl.buildTogglerEntryContent(day0.dcEntries.getLast(), day0, 0, day0Length, (day0Length % 2 == 0 ? ' blueBg' : ''), day0Length - 1);
			newEl.inject(($('accContentItem_0_' + (day0Length - 2))? $('accContentItem_0_' + (day0Length - 2)) : $('accContent_0').getChildren('.accContentDesc')[1]), 'after');
			this.addEvents(newEl);
		}
		
	},
	
	removeElement: function(args){
		if(args.has('start')){
			this.removeStartElement(args);
		}
		if(args.has('entry')){
			this.removeEntryElement(args);
		}
		if(args.has('acco')){
			this.removeAccoElement(args);
		}
	},
	
	removeStartElement: function(args){
		if ($type($('accContentItem_start')) != false) {
			$('accContentItem_start').destroy();
		}
	},
	
	removeEntryElement: function(args){
		$('tpRemoveItem_' + args.get('entry')).getParent('.accContentItem').destroy();
	},
	
	removeAccoElement: function(args){
		days = TourPlanner.instance.currentTour.dcDays;
		var dl = (days.length == 1 ? days.length : days.length - 1); 
		// -1 da im letzten tag keien accos vorhanden
		for (var i = 0; i < dl; i++) {
			$('tpRemoveItem_' + i + '_' + args.get('acco')).getParent('.accAccoListItem').destroy();
		}
	},
	
	updateEntryListInfos: function(){
		var dayList = $('dayEntrys').getChildren('.accEl');
		dayList.each(function(dayEl,i){
			this.updateDayInfos(dayEl,i);
		}.bind(this));
	},
	
	updateDayInfos: function(dayEl,i){
		if(dayEl.getElement('h5').getElement('.infos')){
			var infoEl = dayEl.getElement('h5').getElement('.infos');
		}else{
			var infoEl = new Element('div', {'class':'infos'});
			infoEl.inject(dayEl.getElement('h5').getElement('.clear'),'before');
		}
		infoEl.set('text',this.getDayInfos(i));
	},
	
	getDayInfos: function(i){
		day = TourPlanner.instance.map.tour.dcDays[i];
		var time = TourPlanner.instance.getFormattedTime(day.journeyTime);
		var dist = Math.round(day.distance);
		return 'Distance: ' + dist + ' km | Drive time: ' + time;
	},
	
	changeTour: function(){
		pl2 = new PlannerList(TourPlanner.instance.currentTour);
		pl2.build(true).replaces(this.pl.container);
		pl2.container.getElements('.accEl').each(function(el){
			el.addClass('accElNew');
		});
		this.fillTourInfos();
		$('editorTitle').set('text','Edit Tour - "' + TourPlanner.instance.currentTour.title + '"');
		this.pl = pl2;
		this.addEvents(this.pl.container);
		this.addAccordion(true);
	},
	
	updateTour: function(){
		this.rebuildContent();
	}
});