(function(){

 angular
  .module('izApp', ['ui.router','ui.select','iz.gmap','iz.util','toastr','ngCookies','ngSanitize','iz.core','apiUserAuthModule', 'heuer.core','ngAnimate', 'ui.bootstrap', 'duScroll','pascalprecht.translate'])
  .constant("USER_ACCOUNT", HeuerConstants.account)
  .constant("COOKIE_NAME", HeuerConstants.cookieName)
  .constant("HEUER_URL", HeuerConstants.heuerUrl)
  .constant("CDN_URL", HeuerConstants.cdnUrl)
  .constant("MODULE_TEMPLATE_IDS",{
  	// 10.06.2016, barwicki@iz.de, provisional
		RABBATS : 184,
  		LOCATION : 198,
        APPENDIX : 189,
  		TICKETS : 117
  })

  .config(configureStates)
  .run(runOnModuleInit);
  
  
runOnModuleInit.$inject = ['$state','$rootScope','$location'];
  
function runOnModuleInit($state,$rootScope,$location){

	$rootScope.$on("$stateChangeError",stateChangeError);
	$rootScope.$on('$viewContentLoaded',viewContentLoaded);
  
 
    function stateChangeError(toState, toParams, fromState, fromParams, error) {
	  // Wenn ein Code vorhanden ist, wird die Detailsseite geladen. Wenn nicht das Listing
	  if(fromState.code){
		$state.go("veranstaltung", {'code':fromState.code, 'slug':fromState.slug});
	  } else {
		$state.go("veranstaltungen");
	  }
	}
  
  	function viewContentLoaded(event){
			
	  $rootScope.elementHeadlineTitle = angular.element(document.getElementById("headline-title"));
	  $rootScope.elementHeadlineTermin = angular.element(document.getElementById("headline-termin"));
	  if($rootScope.elementHeadlineTitle && $rootScope.elementHeadlineTermin){

		// Update Height
		$rootScope.$watch( function() {
		  $rootScope.__titleHeight = $rootScope.elementHeadlineTitle.outerHeight();
		});

		// Watch on Height updates
		$rootScope.$watch("__titleHeight", function(newValue, oldValue){
		  // Wenn das Dokument nun aber nur noch eine Breite von 768px hat sollte das hier nicht mehr gemacht werden
		  if(window.innerWidth >= 768){ // CSS Regel greift hier mit important!
			if(newValue != oldValue){ 
			  $rootScope.elementHeadlineTermin.outerHeight(newValue);
			}
		  }
		});
	  } 
	}
}  
  
configureStates.$inject=["$stateProvider", "$urlRouterProvider", "$locationProvider","$urlMatcherFactoryProvider"];
 
function configureStates($stateProvider, $urlRouterProvider, $locationProvider,$urlMatcherFactoryProvider) {
  $urlMatcherFactoryProvider.strictMode(false);
  $locationProvider.html5Mode({enabled:true,requireBase:false});
  $urlRouterProvider.otherwise('veranstaltungen');
  
  // Regel für Trailing slashes. Werden trailing slashes gefunden, wird die URL von trailing slashes bereinigt. Damit Twitter nicht // Links teilt -.-
  $urlRouterProvider.rule(function ($injector, $location) {
       //what this function returns will be set as the $location.url
        var path = $location.path();
        if (path.search(/(\/$|\/\/$)/) != -1) {
            //instead of returning a new url string, I'll just change the $location.path directly so I don't have to worry about constructing a new url string and so a new state change is not triggered
            $location.replace().path(path.replace(/(\/$|\/\/$)/, ''));
        }
    });
  getStates().forEach(function(state) {
        $stateProvider.state(state.state, state.config);
  });

}
  
  
  
 function getStates() {
	
   var States = [];
  
   States.push({
   	state : "quovadis",
	config : {
	url: "/quovadis",
	templateUrl: "/backend/resources/api/templates/name/heuer.veranstaltung/render",
	controller: "VeranstaltungController",
	controllerAs: "vm",
	resolve: { 
	  veranstaltung: function(VeranstaltungenService) {
		return VeranstaltungenService.get(10878).then(function(result){
		  return result;
		}, function(error){
		  return error;
		});
	  }
	}
  }
   });
   
   States.push({
   	state : "quovadis_en",
	config : {
	url: "/quovadis_en",
	templateUrl: "/backend/resources/api/templates/name/heuer.veranstaltung/render",
	controller: "VeranstaltungController",
	controllerAs: "vm",
	resolve: { 
	  veranstaltung: function(VeranstaltungenService) {
		return VeranstaltungenService.get(10878).then(function(result){
		  return result;
		}, function(error){
		  return error;
		});
	  }
	}
  }
   });   
   
   States.push({
  	state: "veranstaltungen",
	config : {
	url: "/veranstaltungen",
	templateUrl: "/backend/resources/api/templates/name/heuer.veranstaltungen/render",
	controller: "VeranstaltungenController",
	controllerAs: "vm",
	resolve : {
	  archiv : function() { return false; }
	}
  }
  });  
   
  States.push({
  	state: "veranstaltungen_archiv",
	config : {
	url: "/veranstaltungen/archiv",
	templateUrl: "/backend/resources/api/templates/name/heuer.veranstaltungen/render",
	controller: "VeranstaltungenController",
	controllerAs: "vm",
	resolve : {
	  archiv : function() { return true; }
	}
   }
  });  
   
   
  States.push({
	state : "veranstaltung",
	config : {
	url: "/veranstaltungen/{code}/{slug}",
	templateUrl: "/backend/resources/api/templates/name/heuer.veranstaltung/render",
	controller: "VeranstaltungController",
	controllerAs: "vm",
	resolve: { 
	  veranstaltung: function(VeranstaltungenService, $stateParams, $q) {
		var defer = $q.defer();
		if( ! $stateParams.code) {
		  defer.reject("Code ist nicht gesetzt");
		  return defer.promise();
		} else {
		  return VeranstaltungenService.get($stateParams.code).then(function(result){
			return result;
		  }, function(error){
			return error;
		  });
		}
	  }
	}
  }
  });	
   
  States.push({   
   state: 'veranstaltung_buchen_erfolg',
   config : {
	url: "/veranstaltungen/{code}/{slug}/buchen/erfolg",
	templateUrl: "/backend/resources/api/templates/name/heuer.veranstaltung.buchen.erfolg/render",
	controller: "VeranstaltungBuchenController",
	controllerAs: "vm",
	resolve: {
	  veranstaltung: function(VeranstaltungenService, $stateParams, $q) {
		var defer = $q.defer();
		if( ! $stateParams.code) {
		  defer.reject("Code ist nicht gesetzt");
		  return defer.promise();
		} else {
		  return VeranstaltungenService.get($stateParams.code).then(function(result){
			return result;
		  });
		}
	  },
	  preis: function($stateParams) {
		return null;
	  },
	  tickettitle: function($stateParams) {
		return null;
	  }
	}
   }
   });
	
   
  States.push({
   state : "veranstaltung_buchen",
   config : {
	url: "/veranstaltungen/{code}/{slug}/buchen",
	params: {
	  tickettitle: null,
	  tickettext: null
	},
	templateUrl: "/backend/resources/api/templates/name/heuer.veranstaltung.buchen/render",
	controller: "VeranstaltungBuchenController",
	controllerAs: "vm",
	resolve: {
	  veranstaltung: function(VeranstaltungenService, $stateParams,$q) {
		var defer = $q.defer();
		if(! $stateParams.tickettext ){
		  defer.reject("Tickettext ist leer");
		  return defer.promise();
		}
		if( ! $stateParams.code) {
		  defer.reject("Code ist nicht gesetzt");
		  return defer.promise();						
		} else {
		  return VeranstaltungenService.get($stateParams.code).then(function(result){
			return result;
		  });
		}
	  },
	  preis: function($stateParams) {
		return angular.element($stateParams.tickettext).filter(function(index, e) {
		  return e instanceof HTMLParagraphElement && e.className == 'ticket-price'; 
		}).html().replace('€','');
	  },
	  tickettitle: function($stateParams) {
		return $stateParams.tickettitle;
	  }
	}
  }
   });
   
    return States;
   
} 
  

}());