(function ($, adcell) {
	DialogNavigator = function (options) {
		var HTMLtemplate = '<div class="dlgnav-container" style="overflow: hidden;"><div class="dlgnav-nav-container"><div id="dlgnav-nav" class="dlgnav-nav"></div></div><div id="dlgnav-content" class="dlgnav-content" style=" overflow: scroll;"></div>';
		var navId = 'dlgnav-nav';
		var contentId = 'dlgnav-content';

		var currentPageIndex = 0;
		var pages = [];
		var currentPage = {};
		var dialog = {};
		var defaultOptions = {};
		var onPageShow;
		var onPageLeave;

		var init = function (options) {
			defaultOptions = $.extend(defaultOptions, options);
			currentPageIndex = options.currentPageIndex ? options.currentPageIndex : 0;
			pages = options.pages ? options.pages : [];
			if (pages.length > currentPageIndex) {
				currentPage = pages[currentPageIndex];
			} else {
				currentPage = pages[0];
			}

			if (options.pageShow && typeof options.pageShow == 'function') {
				onPageShow = options.pageShow
			}

			if (options.pageLeave && typeof options.pageLeave == 'function') {
				onPageLeave = options.pageLeave
			}
		}

		var nextPage = function () {
			if (pageLeave()) {
				pages[currentPageIndex].content = '';
				currentPageIndex = (currentPageIndex + 1) % pages.length;
				currentPage = pages[currentPageIndex];
				loadPageContent(currentPage);
			}
		}

		var previousPage = function () {
			if (pageLeave()) {
				pages[currentPageIndex].content = '';
				currentPageIndex = (currentPageIndex - 1) < 0 ? (pages.length - 1) : currentPageIndex - 1;
				currentPage = pages[currentPageIndex];
				loadPageContent(currentPage);
			}
		}

		var savePage = function () {
		    if (pageLeave()) {
		        $('.ui-icon-closethick').trigger('click');
		    }
		}

		var nthPage = function (n) {
			if (n < pages.length && n != currentPageIndex) {
				if (pageLeave()) {
					currentPageIndex = n;
					if (pages[n].hasOwnProperty('directLink')) {
					    activeProgramActions(currentPageIndex);
					} else {
    					currentPage = pages[currentPageIndex];
    					loadPageContent(currentPage);
					}
				}
			}
		}

		var activeProgramActions = function (n) {
            if (pages[n].hasOwnProperty('directLink')) {
                location.href = pages[n].directLink;
            }
		}

		var close = function () {
			if (!$.isEmptyObject(dialog)) {
				$('.ui-dialog-content').dialog("close").dialog("destroy");
			}
		}

		var showDialog = function () {
			if (!$.isEmptyObject(dialog)) {
				return;
			}


			var buttons = {};
			if (defaultOptions.buttons) {
				buttons[defaultOptions.buttons.buttonTitle] = {
					icon: (defaultOptions.buttons.icon ? defaultOptions.buttons.icon : ''),
					callback: (defaultOptions.buttons.callback ? defaultOptions.buttons.callback : '')
				}
			}

			if (defaultOptions.programStatus == 'active') {
			    buttons['speichern'] = {
                    icon: 'check',
                    callback: this.savePage
                }
			} else {
    			buttons['zurück'] = {
    				icon: 'arrowthick-1-w',
    				callback: this.previousPage
    			}
    			buttons['weiter'] = {
    				icon: ('arrowthick-1-e'),
    				callback: this.nextPage
    			}
			}

			dialog = adcell.dialog.template({
			    dialogClass: 'btn-no-highlight',
				data: {
					title: currentPage.dialogTitle ? currentPage.dialogTitle : '',
                    template: HTMLtemplate,
				},
                buttons: buttons,
                height: 'auto',
                maxHeight: window.innerHeight-100,
                width: 900,
                minWidth: 900,
                position: {
	                my: 'top',
	                at: 'top+50',
	                of: window
	            }
			});
			// next & prev Button
			addNavigation();
			loadPageContent();
		}

		var addNavigation = function () {
			var navbar = $('#' + navId);

			// add prev button
			if (defaultOptions.programStatus != 'active') {
			    navbar.append('<div class="dlgnav-prev"></div>');
			}

			navbar.append('<div class="dlgnav-navgroup-container"><center><ul class="dlgnav-navgroup"></ul></center></div>')
			var navgroup = $('.dlgnav-navgroup', navbar);
			// add page nav
			for (var i = 0; i < pages.length; i++) {
				if (pages[i].CSSclass || pages[i].navItem) {
					navgroup.append('<li style="display: inline-block;" class="dlgnav-item' + i + '' + (pages[i].CSSclass ? (' ' + pages[i].CSSclass) : '') + '">' + (pages[i].navItem ? pages[i].navItem : '') + '</li>');
				}

			}
			// add next button
			if (defaultOptions.programStatus != 'active') {
			    navbar.append('<div class="dlgnav-next"></div>');
			}

			bind();
		}

		var bind = function () {
			var navbar = $('#' + navId);
			// bind next/prev click
			if (defaultOptions.programStatus != 'active') {
    			$('.dlgnav-prev', navbar).click(previousPage);
    			$('.dlgnav-next', navbar).click(nextPage);
			}

			// bind nav click
			var scope = this;
			for (var i = 0; i < pages.length; i++) {
				if (pages[i].CSSclass || pages[i].navItem) {
					$('.dlgnav-item' + i, navbar).click($.proxy(nthPage, scope, i));
				}
			}

		} 

		var showPageContent = function() {
			var currentPage = pages[currentPageIndex];
			var content = $('#' + contentId);
			content.children().remove();
			content.append(currentPage.content);
			if (currentPage.dialogTitle) {
				dialog.dialog('option', 'title', currentPage.dialogTitle);
			}
			pageShow();
			adcell.ui.initPageQtips();
		}

		/**
		 * Lade Content per AJAX, wenn URL angegeben
		 * @return {[type]} [description]
		 */
		var loadPageContent = function () {
			if (currentPage.url.length > 0) {
				var url = currentPage.url;
				adcell.fn.load(
					url,
					(currentPage.data ? currentPage.data : {}),
					{
						success: function(result){
							if(typeof(result.data) == 'object'){
								currentPage.content = result.data.template;
								currentPage.dialogTitle = result.data.dialogTitle;
								currentPage.buttonTitle = result.data.buttonTitle;
								currentPage.icon = result.data.icon;
								if (result.data.pageLeave) {
									currentPage.pageLeave = result.data.pageLeave;
								}
								if (result.data.pageShow) {
									currentPage.pageShow = result.data.pageShow;
								}
								pages[currentPageIndex] = currentPage;
								showPageContent();
							} else if(result.hasOwnProperty('errors')){
								for(var key in result.errors){
					                if(result.errors.hasOwnProperty(key)){
					                	adcell.message.error('Fehler', result.errors[key]);
					                }
					            }
								close();
							}
							else{
								alert('Fehler: '+result);
							}
						}
					}
				);
			} else {
				showPageContent();
			}
		}

		var addPage = function (page) {
			options.pages.push(page);
		}

		var showSpinner = function () {
			$('#' + contentId).append(
				'<div class="spinner-bg"><span class="spinner"></span></div>'
			);
		}

		var stopSpinner = function () {
			$('#' + contentId).remove('div.spinner-bg');
		}

		var pageLeave = function () {
			var result = true;
			$('.dlgnav-item' + currentPageIndex).removeClass('active');
			if (pages[currentPageIndex].pageLeave && typeof eval(pages[currentPageIndex].pageLeave) == 'function') {
				result = pages[currentPageIndex].pageLeave = eval(pages[currentPageIndex].pageLeave);
				if (result == false) {
					return false;
				}
			}

			if (pages[currentPageIndex].pageLeave && typeof pages[currentPageIndex].pageLeave == 'function') {
				result = pages[currentPageIndex].pageLeave();
				if (result == false) {
					return false;
				}
			}

			if (onPageLeave && typeof onPageLeave == 'function') {
				result = onPageLeave();
				if (result == false) {
					return false;
				}
			}

 			return true;
		}

		var pageShow = function () {
			$('.dlgnav-item' + currentPageIndex).addClass('active');
			if (pages[currentPageIndex].pageShow && typeof eval(pages[currentPageIndex].pageShow) == 'function') {
				pages[currentPageIndex].pageShow = eval(pages[currentPageIndex].pageShow);
			}

			if (pages[currentPageIndex].pageShow && typeof pages[currentPageIndex].pageShow == 'function') {
				pages[currentPageIndex].pageShow();
			}

			if (onPageShow && typeof onPageShow == 'function') {
				onPageShow();
			}
		}

		var reload = function (additionalData) {
			currentPage.data = $.extend({}, currentPage.data, additionalData);
			loadPageContent();
		}

		var setPageData = function(dataObject) {
			if(!pages[currentPageIndex].hasOwnProperty('data')){
				pages[currentPageIndex].data = {};
			}
			for (var property in dataObject) {
			    if (dataObject.hasOwnProperty(property)) {
			    	pages[currentPageIndex].data[property] = dataObject[property];
			    }
			}
		}

		var setAllPagesData = function(dataObject){
			for(var index in pages){
				if(!pages[index].hasOwnProperty('data')){
					pages[index].data = {};
				}
				for (var property in dataObject) {
				    if (dataObject.hasOwnProperty(property)) {
				    	pages[index].data[property] = dataObject[property];
				    }
				}
			}
		}

		var getDialog = function(){
			return dialog;
		}

		init(options);
		return {
			nextPage: nextPage,
			previousPage: previousPage,
			savePage: savePage,
			nthPage: nthPage,
			close: close,
			showDialog: showDialog,
			reload: reload,
			setPageData: setPageData,
			setAllPagesData: setAllPagesData,
			getDialog: getDialog
		}
	}

	adcell.dialog.dialognavigator = function (options) {
		return DialogNavigator(options);
	}

} (jQuery, adcell))
