var maria_diashowController = function (images, imgContainer, navBack, navForw, postChangeCB, picScale, zoomable, hoverButtonClass, overlayCloseButtonClass, appendOverlayTo, overlayClass, overlayBackgroundClass) {
    
	var pics = images,
        currentPic = 0,
        preloadedImages = [],
        ids = {
            "imgContainer": imgContainer,
            "navBack": navBack,
            "navForw": navForw
        },
        timerId,
        locked = false,
        lastFailedImg,
        stopped = false;
    
    if (typeof(hoverButtonClass) != "string") {
        hoverButtonClass = "overlayButton";
    }

    if (typeof(overlayCloseButtonClass) != "string") {
        overlayCloseButtonClass = "overlayCloseButton";
    }
    
    if (typeof(appendOverlayTo) != "string" && typeof(appendOverlayTo) != 'object') {
        appendOverlayTo = 'body';
    }
    
    if (typeof(overlayClass) != "string") {
        overlayClass = "diashowOverlay";
    }

    if (typeof(overlayBackgroundClass) != "string") {
        overlayBackgroundClass = "diashowOverlayBackground";
    }

    var imgContainerDisplayProp = jQuery("#" + ids.imgContainer).css('display');
	var imageContainer = jQuery("#" + ids.imgContainer);

	if(zoomable) {

		var overlay = new $.maria.Overlay({
            'class': overlayClass,
            'backgroundClass': overlayBackgroundClass
        });
		var overlayButton = $("<div/>", {
			"class": hoverButtonClass,
			css: {
				width: 50,
				height: 50,
				position: "absolute",
				top: 0,
				left: 0
			}
		});
	
		overlay.html.append($("<img/>"), $("<div/>", { "class": overlayCloseButtonClass, click: function(){ overlay.close(); }}) );
	
		overlayButton.bind("click", function() {
			overlay.html.children("img").attr("src", preloadedImages[controller.index]['zoom'].src);
			setTimeout(function(){
				overlay.html.css({
					top: (parseInt($("html").height(), 10) - parseInt(overlay.html.height(), 10)) / 2,
					left: (parseInt($("html").width(), 10) - parseInt(overlay.html.width(), 10)) / 2
				});
				overlay.open();
			}, 50);
		});
	
		$(appendOverlayTo).append(overlay.html, overlay.background);
	
		imageContainer.parent().append(overlayButton);
		imageContainer.parent().hover(
			function() {
				overlayButton.css("display", "block");
				overlayButton.stop().fadeTo(300, 1);
			},
			function() {
				overlayButton.stop().fadeTo(300, 0, function() {
					overlayButton.css("display", "none");
				});
			}
		);
	
	}

	// Preload Images
	var preloader,
		controller;
	
	//safety controller for early use of object methods
	controller = new jQuery.maria.DiashowController({
		maxIndex: 1,
		interval: 30000,
		automaticLoop: false
	});
	
	var self = this;
    
	var loadImages = function() {
        
        var preparePreload = function (img) {
            var tmp = new Image();
            tmp.onload = partial(function () {
                if (typeof (picScale) === "object" && (tmp.width > picScale.width || tmp.height > picScale.height)) {
                    var newSize = {
                        'width': tmp.width,
                        'height': tmp.height
                    };
                    if ( tmp.width > picScale.width) {
                        newSize["width"] = picScale.width;
                        newSize["height"] = Math.round((picScale.width / tmp.width) * tmp.height);
                    }
                    if ( newSize["height"] > picScale.height) {
                        newSize["width"] = Math.round((picScale.height / newSize["height"]) * newSize["width"]);
                        newSize["height"] = picScale.height;
                    }
                    tmp.width =  newSize["width"];
                    tmp.height =  newSize["height"];
                }

                changeImgTo(0, false);

            });

            tmp.src = img;
                
            return tmp;
        };
        
        var flattenedPics =[];
        
        for (var i = 0; i < pics.length; i++) {
            if (typeof(pics[i]) == 'object') {
                for (var j in pics[i]) {
                    if (typeof(pics[i][j]) == "string") {
                        flattenedPics[flattenedPics.length] = pics[i][j];
                    }
                }
            } else {
                flattenedPics[flattenedPics.length] = pics[i];
            }
        }
		
		preloader = new jQuery.maria.ImagePreloader(flattenedPics, function() {
            
			for(var i = 0; i < pics.length; i++) {
                if (typeof(pics[i]) == 'object') {
                    preloadedImages[i] = {};
                    for (var j in pics[i]) {
                        if (typeof(pics[i][j]) == "string") {
                            preloadedImages[i][j] = preparePreload(pics[i][j]);
                        }
                    }
                } else {
                    preloadedImages[i] = {
                        'std': preparePreload(pics[i]),
                        'zoom': preparePreload(pics[i])
                    };
                }
			}

			// Initialize Controller
			controller = new jQuery.maria.DiashowController({
				maxIndex: pics.length - 1,
				interval: 30000,
				automaticLoop: true
			});
			
			self.controller = controller;
			
			controller.changeTo(0);

			jQuery(controller).bind("Change.slider", function(e, oldIndex, index) {
				changeImgTo(index);
			});

		});
	};

    var changeImgTo = function (id, autoChange) {
	
        if (stopped) {
			return;
		}
        
		if (id < 0) {
			return;
		}

        if (locked) {
			return;
		}
        
		locked = true;
        
		if (!autoChange) {
			controller.stopTimer();
        }

		var imageContainer = jQuery("#" + ids.imgContainer);
		
        
        
        imageContainer.fadeTo("normal", 0, function () {
            imageContainer.attr("src", preloadedImages[id]['std'].src);
            imageContainer.css("width", preloadedImages[id]['std'].width + "px");
            imageContainer.css("height", preloadedImages[id]['std'].height + "px");
            imageContainer.fadeTo("normal", 1, function () {
                postChangeCB(currentPic, id);
                currentPic = id;

                timerControlledImgChange(30000);

                locked = false;

            });

        });

    
    };

    var timerControlledImgChange = function (interval) {
        controller.interval = interval;
		controller.startTimer();
    };

    var stdTimerControlledImgChange = function () {
        timerControlledImgChange(10000);
    };

    this.setPic = function (id) {
        controller.changeTo(id);
    };

    this.next = function () {
		controller.changeBy(1);
    };

    this.prev = function () {
        controller.changeBy(-1);
    };

    this.changeImgs = function (images) {
        pics = images;
        jQuery("#" + ids.imgContainer).attr("src", '');
        loadImages();
    };

    this.deactivate = function () {
        stopped = true;
		controller.stopTimer();
    };

    this.activate = function () {
        stopped = false;
    	controller.startTimer();
	};
    
	loadImages();

};
