google.load( 'visualization', '1', {'packages': ['geomap']} );
google.setOnLoadCallback( drawVisualizationGeo );

var siedlerMapData = false;
var largeMapLoaded = false;

function getData() {
	if ( !siedlerMapData ) {
		siedlerMapData = new google.visualization.DataTable();

		siedlerMapData.addColumn( 'number', 'LATITUDE' );
		siedlerMapData.addColumn( 'number', 'LONGITUDE' );
		siedlerMapData.addColumn( 'number', 'Siedler' );
		siedlerMapData.addColumn( 'string', 'HOVER' );

		siedlerMapData.addRows( locationData );
	}

	return siedlerMapData;
}

function drawVisualizationGeo( event, container, size ) {
	if ( !$defined( container ) ) {
		container = document.getElementById('siedlerMap');
		size = 380;
	}
	
	var geomap = new google.visualization.GeoMap( container );

	var options = {};
	options['region'] = 'DE';
	options['colors'] = [0xFF8747, 0xFF8747];
    options['dataMode'] = 'markers';
    options['showLegend'] = false;
    options['width'] = options['height'] = size; 

	geomap.draw( getData(), options );
}

Controller = new Class({
	
	acceptTermsCheckbox: null
	,currentGuy: 0
	,districtName: ''
	
	,initialize: function() {
	
		missioncontrol.track( 'access' );
		
		$$( 'a,area' ).each( function( a ) { a.addEvent( 'click', function( e ) { 
			e.stop();
			if( a.hasClass( 'blank' ) ) { 
				window.open( a.href );
				a.get( 'class' ).split( /\s+/ ).each( function ( className ) {
					if ( className != 'blank' ) {
						missioncontrol.track( className );
					}
				});
			} 
			return false; 
		});});
		
		this.acceptTermsCheckbox = new GM.Checkbox( $('terms') );
	
		// Lottery Formular
		$( 'enterAddress' ).addEvent( 'click', this.sendLottery.bindWithEvent( this ) );

		// Preise
		$( 'btnPrices' ).addEvent( 'click', function() {
			this._openMessageBox( '<div id="pricebox"><p id="price1">1. & 2. Preis:</p><p id="price1desc">Gamer-Laptop "MSI GT640"<br/>Intel Core i7 QM720 (1,6 GHz)<br/>4 GByte DDR2<br/>Nvidia Geforce GTS 250M<br/>15,4-Zoll WSXGA (1680 x 1050)<br/>500 GByte SATA hdd (5400 rpm)<br/>3x USB, eSATA, HDMI, VGA,<br/>Ethernet, Modem, Webcam</p><p id="price2">3.-12. Preis:</p><p id="price2desc">"Die Sieder 7 - Limitierte<br/>Edition"<br/>Mit:<br/>Hochwertiger Figur (15-16 cm),<br/>Castle Forge (1x Gargoyle, 2x Fenster, 1x Torbogen, 2x Erker),<br/>Exklusive Map,<br/>Poster A2 und<br/>1 Packung Pflanzensamen</p><img src="images/notebook.png" id="notebook" /><img src="images/packshot.png" id="packshot" /></div>' );
		}.bindWithEvent( this ) );
		
		// Karte
		$( 'btnMap' ).addEvent( 'click', this.openLayer.bindWithEvent( this, [ $( 'showMap' ), 'showMap' ] ) );
		$( 'closeMap' ).addEvent( 'click', this.closeLayer.bindWithEvent( this ) );
		
		// Karte zoomen
		$( 'lupe-open' ).addEvent( 'click', this.zoomMap.bind( this ) );
		$( 'lupe-close' ).addEvent( 'click', this.closeZoomedMap.bind( this ) );
		
		// Spielregeln
		$( 'rules' ).addEvent( 'click', function () {
			this._openMessageBox( 'Ausgenommen von der Teilnahme sind Mitarbeiter von Ubisoft und sonstige an der Entwicklung und Durchführung dieser Aktion beteiligte Dritte. Eine Haftung von Ubisoft für im Zusammenhang mit der Bereitstellung, Benutzung und/oder Inanspruchnahme des Gewinnes entstandene Schäden ist ausgeschlossen. Der Gewinner wird innerhalb von 30 Tagen nach Beendigung des Gewinnspieles benachrichtigt. Ubisoft ist der Veranstalter dieses Gewinnspieles und kann über Beginn, Ende sowie Abbruch bestimmen. Ubisoft wählt den Gewinner per Losverfahren aus. Keine Gewinngarantie. Der Preis kann von der Beschreibung abweichen. Dieses Gewinnspiel gilt nur für Anwohner aus Deutschland. Gewinne können nicht ausgezahlt werden. Ubisoft allein bestimmt über die Gewinner des Gewinnspieles. Der Rechtsweg ist ausgeschlossen.<br/><strong>Einsendeschluss ist der 25.03.2010.</strong>' );
			missioncontrol.track( 'rules' );
		}.bindWithEvent( this ));
		
		// TAF
		$( 'btnTaf' ).addEvent( 'click', this.openLayer.bindWithEvent( this, [ $( 'tafForm' ) ] ) );
		$( 'sendTaf' ).addEvent( 'click', this.submitTafForm.bindWithEvent( this ) );
		
		// Messagebox close Event
		$( 'closeMessageBox' ).addEvent( 'click', this.closeLayer.bindWithEvent( this ) );
		
		// Fenster schliessen Buttons (X)
		$$( 'img.scrollCloseButton' ).each( function( img ) {
			img.addEvent( 'click', this.closeLayer.bindWithEvent( this ) );
		}.bind( this ));

		missioncontrol.addEvent( 'lotteryparticipation', this.lotteryResultHandler.bindWithEvent( this ) );
		missioncontrol.addEvent( 'sendecard', this.sendEcardResultHandler.bindWithEvent( this ) );
		
		// Confirmtoken Lottery in URL?
		var confirmToken = this._getUrlParam( 'lotteryToken' );
		if ( confirmToken ) {
			missioncontrol.track( 'confirmLottery' );
			
			var postcode = this._getUrlParam( 'postcode' );
			if ( postcode ) {
				missioncontrol.addEvent( 'districtname', this.receiveDistrictName.bindWithEvent( this ) );
				missioncontrol.getDisctrictName( postcode );
			}
			
			missioncontrol.addEvent( 'confirmlottery', this.confirmLotteryResultHandler.bindWithEvent( this ) );
			missioncontrol.confirmLottery( missioncontrol.lottery, confirmToken );
		}
		
		// Confirmtoken TAF in URL?
		confirmToken = this._getUrlParam( 'tafToken' );
		if ( confirmToken ) {
			missioncontrol.track( 'confirmTaf' );
			missioncontrol.addEvent( 'confirmecard', this.confirmEcardResultHandler.bindWithEvent( this ) );
			missioncontrol.confirmEcard( missioncontrol.defaultEcard, confirmToken );
		}
	}

	,_getUrlParam: function( name ) {
		name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
		var regexS = "[\\?&]"+name+"=([^&#]*)";
		var regex = new RegExp( regexS );
		var results = regex.exec( window.location.href );
		if( results == null )
			return null;
		else
			return results[1];
	}

	,sendLottery: function() {
		// Eingabe "validieren"
		var errors = [];
		if ( !$( 'postcode' ).get( 'value' ) ) {
			errors.push( 'Bitte gib Deinen Postleitzahl ein.' );
		}
		if ( $( 'postcode' ).get( 'value' ).match( /[^0-9]/ ) ) {
			errors.push( 'Die Postleitzahl darf nur Ziffern enthalten.' );
		}
		if ( $( 'postcode' ).get( 'value' ).length < 5 ) {
			errors.push( 'Bitte gib alle 5 Stellen der Postleitzahl an.' );
		}
		if ( $( 'postcode' ).get( 'value' ).length > 5 ) {
			errors.push( 'Die Postleitzahl darf nur aus 5 Ziffern bestehen.' );
		}
		if ( !$( 'firstname' ).get( 'value' ) ) {
			errors.push( 'Bitte gib Deinen Vornamen ein.' );
		}
		if ( !$( 'lastname' ).get( 'value' ) ) {
			errors.push( 'Bitte gib Deinen Nachnamen ein.' );
		}
		if ( !$( 'email' ).get( 'value' ) ) {
			errors.push( 'Bitte gib Deine E-Mail-Adresse ein.' );
		}
		if ( !this.acceptTermsCheckbox.getIsChecked() ) {
			errors.push( 'Bitte lies und akzeptiere unsere Nutzungsbedingungen.' );
		}
		if ( errors.length > 0 ) {
			this.showError( $( 'lotteryForm' ), errors );
			return;
		}
		
		// Landkreis abfragen und dadurch gleichzeitig PLZ validieren
		missioncontrol.addEvent( 'districtname', this.districtNameResultHandler.bindWithEvent( this ) );
		missioncontrol.getDisctrictName( $( 'postcode' ).get( 'value' ) );
	}
	
	,districtNameResultHandler: function( event, response ) {
		if ( !$defined( response ) || response.status == 'FAILED' ) {
			var errors = [ 'Deine Postleitzahl ist uns nicht bekannt, gib bitte eine andere Postleitzahl in Deiner Nähe an.' ];
			this.showError( $( 'lotteryForm' ), errors );
			return;
		}
		
		this.districtName = response.result[0];
		
		// Vote abschicken
		missioncontrol.addLotteryParticipation( 
				$( 'email' ).get( 'value' ),
				{ 'postcode': $( 'postcode' ).get( 'value' ), 'firstname': $( 'firstname' ).get( 'value' ), 'lastname': $( 'lastname' ).get( 'value' ) }
		);
	}
	
	,showError: function( form, errors ) {
		// Fehler
		if ( form.getElement( 'ul.addressFormErrors' ) ) {
			var errorMessage = form.getElement( 'ul.addressFormErrors' );
			errorMessage.empty();
		} else {
			var errorMessage = new Element( 'ul', {	'class': 'addressFormErrors' } );
			errorMessage.inject( form.getElement( 'div.scrollButton' ), 'after' );
		}
		
		errors.each( function ( m ) {
			var message = new Element( 'li', { 'html': this._transformText( m ) } );
			message.inject( errorMessage );
		}.bind( this ));
	}
	
	,lotteryResultHandler: function( event, response ) {
		
		if ( !$defined( response ) ) {
			var errors = [ 'Unter dieser E-Mail-Adresse hat bereits jemand teilgenommen.' ];
			this.showError( $( 'lotteryForm' ), errors );
			return;
		} else if ( response.status == 'FAILED' ) {
			var errors = [ 'E-Mail-Adresse ist ungültig.' ];
			this.showError( $( 'lotteryForm' ), errors );
			return;
		}
		
		// Danke Seite zeigen
		missioncontrol.track( 'lotterycomplete' );
		
		// Formular leeren
		$( 'postcode' ).set( 'value', '' );
		$( 'firstname' ).set( 'value', '' );
		$( 'lastname' ).set( 'value', '' );
		$( 'email' ).set( 'value', '' );
		this.acceptTermsCheckbox.setIsChecked( false );
		
		var message = 'Deine Stimme wurde der Region <strong>' + this.districtName + '</strong> zugeordnet.<br/><br/>';
		message += 'Danke, dass Du mithilfst, die fleissigste Siedler-Region zu finden. Jetzt musst Du nur noch den Dir per E-Mail zugesandten Link bestätigen, um Deine Postleitzahl zur Karte hinzuzufügen.'
		this._openMessageBox( message );
	}
	
	,confirmLotteryResultHandler: function( event, response ) {
		if ( !$defined( response ) || response.status == 'FAILED' ) {
			this._openMessageBox( 'Problem:	Deine Teilnahme am Gewinnspiel kann leider nicht bestätigt werden. Hast Du den Link aus der E-Mail exakt eingegeben? ' );
			return;
		}
		
		if ( this.districtName ) {
			var districtMessage = new Element( 'p' );
			var message = 'Deine Stimme wurde der Region <strong>' + this.districtName + '</strong> zugeordnet.';
			districtMessage.set( 'html', this._transformText( message ) )
			districtMessage.inject( $( 'confirmLotterySuccess' ), 'after' );
		}
		
		// Karte zeigen
		new Asset.javascript('/js/data.php', {
		    onload: function(){
				$( 'confirmLotterySuccess' ).setStyle( 'display', 'block' );
				this.openLayer( undefined, $( 'showMap' ) );
		    }.bindWithEvent( this )
		});
	}
	
	,receiveDistrictName: function ( event, response ) {
		if ( $defined( response ) && response.status != 'FAILED' ) {
			this.districtName = response.result[0];
		}
	}
	
	,openLayer: function( event, element, track ) {
		
		if ( $defined( track ) ) {
			missioncontrol.track( track );
		}
		
		var guyId = element.get( 'id' ) + 'Guy';
		this.currentGuy = (this.currentGuy + 1) % 3;
		var randomGuy = new Asset.image( 
			'images/char_' + this.currentGuy  + '.png', 
			{
				id: guyId, 
				onload: function () {
					this._openLayer( $('lotterylayer') );
					element.setStyle( 'display', 'block' );
				}.bind( this, element )
			} 
		);
		randomGuy.replaces( $( guyId ) );
	}
	
	,_openLayer: function( layer ) {
		var height = document.getScrollHeight() + 'px';
		layer.setStyle( 'height', height );
		layer.setStyle( 'display', 'block' );
	}
	
	,closeBoxes: function( element ) {
		if ( !$defined( element ) ) {
			element = $( 'lotterylayer' );
		}
		element.getElements( 'div.scrollWindow' ).each( function ( box ) {
			box.setStyle( 'display', '' );
		});
	}

	,_closeLayer: function( element ) {
		if ( !$defined( element ) ) {
			element = $( 'lotterylayer' );
		}
		element.setStyle( 'display', '' );
		this.closeBoxes( element );
	}

	,closeLayer: function() {
		this._closeLayer( $( 'lotterylayer' ) );
	}

	,zoomMap: function() {
		var layer = $( 'mapzoomlayer' );
		this._openLayer( layer );
		if ( !largeMapLoaded ) {
			largeMapLoaded = true;
			drawVisualizationGeo( null, $( 'siedlerMapLarge' ), 650 );
		}
	}
	
	,closeZoomedMap: function() {
		this._closeLayer( $( 'mapzoomlayer' ) );
	}

	// TAF
	,submitTafForm: function() {
		// Eingabe "validieren"
		var errors = [];
		if ( !$( 'senderName' ).get( 'value' ) ) {
			errors.push( 'Bitte gib Deinen Namen ein.' );
		}
		if ( !$( 'senderEmail' ).get( 'value' ) ) {
			errors.push( 'Bitte gib Deine E-Mail-Adresse ein.' );
		}
		if ( !$( 'friendName' ).get( 'value' ) ) {
			errors.push( 'Bitte gib den Namen Deines Freundes ein.' );
		}
		if ( !$( 'friendEmail' ).get( 'value' ) ) {
			errors.push( 'Bitte gib die E-Mail-Adresse Deines Freundes ein.' );
		}
		if ( errors.length > 0 ) {
			this.showError( $( 'tafForm' ), errors );
			return false;
		}
		
		missioncontrol.sendEcard(
                $( 'senderEmail' ).get( 'value' ),
                $( 'friendEmail' ).get( 'value' ),
                null,
                null,
                { 'fromname' : $( 'senderName' ).get( 'value' ), 'toname' : $( 'friendName' ).get( 'value' ) }
        );
		return false;
	}
	
	,sendEcardResultHandler: function( event, response ) {
		if ( !$defined( response ) ) {
			var errors = [ 'Deine Empfehlung konnte nicht verschickt werden.' ];
			this.showError( $( 'tafForm' ), errors );
			return;
		} else if ( response.status == 'FAILED' ) {
			var errors = [];
			response.result.each( function ( errorEntry ) {
				if ( errorEntry.param == 'from' ) {
					errors.push( 'Deine E-Mail-Adresse ist ungültig.' )
				} else if ( errorEntry.param == 'to' ) {
					errors.push( 'Die E-Mail-Adresse Deines Freundes ist ungültig.' )
				}
			});
			
			this.showError( $( 'tafForm' ), errors );
			return;
		}
		
		missioncontrol.track( 'tafsend' );
		this._openMessageBox( 'Danke, dass Du das Siedler Gewinnspiel weiterempfiehlst. Jetzt musst Du nur noch den Dir per Mail zugesandten Link bestätigen, dann wird Deine Empfehlung verschickt.' );
		$( 'friendName' ).set( 'value', '' );
		$( 'friendEmail' ).set( 'value', '' );
	}
	
	,confirmEcardResultHandler: function( event, response ) {
		if ( response.status == 'FAILED' ) {
			this._openMessageBox( 'Bestätigungslink fehlerhaft! Deine Empfehlung konnte nicht bestätigt werden. Hast Du den Link aus der E-Mail korrekt eingegeben?' );
		} else {
			this._openMessageBox( 'Vielen Dank! Du hast das Siedler Gewinnspiel erfolgreich weiterempfohlen.' );
		}
	}
	
	,_transformText: function ( message ) {
		return message.replace( /([A-ZÖÜÄ]+)/g, '<span class="capital">$1</span>' );
	}
	
	,_openMessageBox: function ( message ) {
		$( 'message' ).set( 'html', this._transformText( message ) );
		this.closeBoxes();
		this.openLayer( undefined, $( 'messageBox' ) );
	}

});

window.addEvent( 'domready', function() {
	new Controller();
});