﻿/// <reference path="jQuery.intellisense.js" />

Gallery = function (baseRootElement, baseDlDefinition) {

    var ulNewWidth;

    var rootElement = baseRootElement;
    var dlDefinition = baseDlDefinition;

// ------------------------------------------------------

    this.makeConfig = function(params) {
    
        var config = new Object;
        
        config = {
                
                maxWidth    :   "600px",
                maxHeight   :   "500px",
                scrollType  :   "imagelist",
                rootElement :   baseRootElement
        }
 
        $.extend(config, params);
 
        return config;
    }
    
    var ErrorMsg = "";
    
    function requiredFields(params) {
    
            for(i = 0; i < params.length; i++)
            {
                if (params[i] == null || typeof(params[i]) == 'undefined' || params[i] == 'undefined' ) {
                
                    ErrorMsg = "Required parameter missing:  \n";
                }
            }
        
           if (ErrorMsg != "") {
            alert(ErrorMsg);
            return false;
        } 
        
        return true;
    }
    
    function errorAlert() {
    
        
    }

// ------------------------------------------------------

    function addOnloadFadeIn (imgSelector) {
    
        $(imgSelector).attr("onload", "$(this).fadeIn(\"slow\")");
    }
    
// ------------------------------------------------------

    function replaceImage(selector, srcSelector, tag) {
    
        newSource = $(srcSelector).attr(tag);
        
        $(selector).fadeOut("fast", function() {
        
            $(selector).attr("src", newSource);
            
            resizeLargeImage();
            
            $(selector).fadeIn("slow");          
        });
    }

// ------------------------------------------------------    

    function slideThumbnail(params) {
    
        var defaultParams = new Object;
        
        defaultParams = {
        
                    selector            :   "undefined",
                    distance            :   0,
                    axis                :   "y",
                    color               :   "transparent",
                    highlight           :   "no",
                    highlightSelector   :   "undefined"
        }
        
        $.extend(defaultParams, params);
        
        if(!requiredFields(new Array(defaultParams.selector)))
        {
            return;
        }        
    
        switch(defaultParams.highlight) {
        
            case "yes":
                $(defaultParams.highlightSelector).effect("highlight");
                break;
            default:
                break;             
        }
    
        switch(defaultParams.axis) {
    
            case "y": 
                $(defaultParams.selector).animate( { marginTop: defaultParams.distance+"px" }, "fast", "swing" ); 
                break;
            
            case "x":
                $(defaultParams.selector).animate( { marginLeft: defaultParams.distance+"px" }, "fast", "swing" ); 
                break;
        }
    
        $(defaultParams.selector).animate( { backgroundColor: defaultParams.color }, "fast");               
    }

// ------------------------------------------------------      

    function fadePrevButton(fade) {
        
        switch(fade) {
            case "out":
                $(rootElement+" div.GalleryWidgetScroll a.SliderButton.Prev").fadeOut("fast");
                break;
            
            case "in":
                $(rootElement+" div.GalleryWidgetScroll a.SliderButton.Prev").fadeIn("fast"); 
                break;
        }     
    };

    // -------------------------

    function fadeNextButton(fade) {

        switch(fade) {
            case "out":
                $(rootElement+" div.GalleryWidgetScroll a.SliderButton.Next").fadeOut("fast");
                break;
            
            case "in":
                $(rootElement+" div.GalleryWidgetScroll a.SliderButton.Next").fadeIn("fast"); 
                break;
        }     
    };
    
// ------------------------------------------------------    

    function stopSlider(timerId) {
    
        clearInterval(timerId);
        clearTimeout(timerId);    
    }

// ------------------------------------------------------    

    function navButtonClick(params) {
    
        var defaultParams = new Object;
        
        defaultParams = {
        
                buttonSelector  :   "undefined",
                buttonDirection :   "undefined",
                scrollSelector  :   "undefined",
                jumpDistance    :   130
        }
        
        $.extend(defaultParams, params);

//        if(!requiredFields(new Array(defaultParams.buttonSelector, defaultParams.scrollSelector)))
//        {
//            return;
//        }    
    
        var semaphore;
        
        switch(defaultParams.buttonDirection) {
        
            case "prev":
                //PREV
                $(defaultParams.buttonSelector).click( function () {
                    
                    fadeNextButton("in");
                    
                    if(semaphore == true) {
                    
                        return false;
                    }
                    
                    var scrollPosition = $(defaultParams.scrollSelector).position();
//                  $(defaultParams.buttonSelector).unbind("click", navButtonClick());
                    
                    semaphore = true;
                    
                    $(defaultParams.scrollSelector).animate({ left: scrollPosition.left + defaultParams.jumpDistance }, 100, "linear", function () {
                    
                        semaphore = false;
                    
                    });
                    
                    if(scrollPosition.left >= 0) {
                    
                        fadePrevButton("out");
                                                
                        
                    }
                
                });
                break;
        
            case "next":
                //NEXT
                $(defaultParams.buttonSelector).click( function () {
                    
                    fadePrevButton("in");
                    
                    if(semaphore == true) {
                    
                        return false;
                    }
                    
                    var scrollPosition = $(defaultParams.scrollSelector).position();
//                  $(defaultParams.buttonSelector).unbind("click", navButtonClick());
                    
                    semaphore = true;
                    
                    $(defaultParams.scrollSelector).animate({ left: scrollPosition.left - defaultParams.jumpDistance }, 100, "linear", function () {
                    
                        semaphore = false;
                    
                    });
                    
                    if( scrollPosition.left <= $(defaultParams.scrollSelector).parent().width() - $(defaultParams.scrollSelector).width() + 20 ) {
                    
                        fadeNextButton("out");
                                                
                        
                    }
                
                });
                break;  
        }
    }

// ------------------------------------------------------    
    
    function navButtonHold(params) {
    
    var defaultParams = new Object;
    
    defaultParams = {
    
                buttonSelector  :   "undefined",
                buttonDirection :   "undefined",
                scrollSelector  :   "undefined",
                interval        :   200,
                jumpDistance    :   20
    }
    
    $.extend(defaultParams, params);
    
    if(!requiredFields(new Array(defaultParams.buttonSelector, defaultParams.scrollSelector)))
    {
        return;
    }
 
    
    $(defaultParams.buttonSelector).effect("highlight");
    
//        var elementLeftPadding = new String($(defaultParams.scrollSelector).parent().css("padding-left"));                
//        var elementRightPadding = new String($(defaultParams.scrollSelector).parent().css("padding-right"));                
//            
//        elementLeftPadding = elementLeftPadding.substring(0, elementLeftPadding.length-2)
//        elementRightPadding = elementRightPadding.substring(0, elementRightPadding.length-2)
//        
//        elementLeftPadding = parseInt(elementLeftPadding);
//        elementRightPadding = parseInt(elementRightPadding);
//        
//        var scrollContainerPadding = elementLeftPadding + elementRightPadding;                  
    
        switch(defaultParams.buttonDirection) {
            case "prev":
                $().mouseup(function () {
                
                    stopSlider(intervalId);
                });     
                

                
                fadeNextButton("in");
                
                if (typeof(intervalId) == "undefined") {
                    var intervalId = setInterval(function() {
                        var scrollPosition = $(defaultParams.scrollSelector).position();                         
                        $(defaultParams.scrollSelector).animate( { left: scrollPosition.left + defaultParams.jumpDistance }, 10, "swing");
                        
                        if(scrollPosition.left >= 0) {
                        //if( $(defaultParams.scrollSelector).width() - $(defaultParams.scrollSelector).parent().width() < scrollPosition.left + $(defaultParams.scrollSelector).children().width() + 90  ) {
                        
                            stopSlider(intervalId);
                            fadePrevButton("out");
                        }
                        else {
                        
                            fadePrevButton("in")
                            
                        }
                                                        
                    }, defaultParams.interval);
                }
            break;

            case "next":
            
                $().mouseup(function () {
                
                    stopSlider(intervalId);
                });     

                fadePrevButton("in");

                if (typeof(intervalId) == "undefined") {
                    var intervalId = setInterval(function() {
                        var scrollPosition = $(defaultParams.scrollSelector).position();                         
                        $(defaultParams.scrollSelector).animate( { left: scrollPosition.left - defaultParams.jumpDistance }, 10, "swing");
                        
                        
                        
                        if( scrollPosition.left <= $(defaultParams.scrollSelector).parent().width() - $(defaultParams.scrollSelector).width() + 20 ) {
                        //if( $(defaultParams.scrollSelector).width() - $(defaultParams.scrollSelector).parent().width() < -scrollPosition.left  ) {
                        
                            stopSlider(intervalId);
                            fadeNextButton("out");
                        }
                        else {
                        
                            fadeNextButton("in")
                            
                        }
                                                        
                    }, defaultParams.interval);
                }
            break;
        }
                       
   
    
    }

// ------------------------------------------------------

    function animateScrollbar(direction, scrollWrapperSelector, scroll) {
    
        var scrollSelector = scrollWrapperSelector+" "+scroll;
    
        var nextButton = scrollWrapperSelector+" a.SliderButton.Next";
        var prevButton = scrollWrapperSelector+" a.SliderButton.Prev";    
        
        var scrollWidth = $(scrollSelector).width();
            
            if(direction == "left") {
                                          
                navButtonClick({
                    buttonSelector  :   prevButton, 
                    buttonDirection :   "prev", 
                    scrollSelector  :   scrollSelector 
                });
            } 
            if(direction == "right") {

                navButtonClick({
                    buttonSelector  :   nextButton, 
                    buttonDirection :   "next", 
                    scrollSelector  :   scrollSelector 
                });
            }      
 
    }
    
    this.setNewScrollerWidth = function(scrollWrapperSelector, scroll) {
    
        var scrollSelector = scrollWrapperSelector+" "+scroll;
    
        if(config.scrollType == "imagelist"){
        
            var newScrollWidth = 0;
            var elementWidth = $(scrollSelector+" li").width();
            
            var elementLeftMargin = new String($(scrollSelector+" li").css("margin-left"));
            var elementRightMargin = new String($(scrollSelector+" li").css("margin-right"));            
            
            elementLeftMargin = elementLeftMargin.substring(0, elementLeftMargin.length-2)
            elementRightMargin = elementRightMargin.substring(0, elementRightMargin.length-2)
            
            elementLeftMargin = parseInt(elementLeftMargin);
            elementRightMargin = parseInt(elementRightMargin);
            
            var elementMargin = elementLeftMargin + elementRightMargin;
            
            $(scrollSelector+" li").each(function () {
            
                newScrollWidth =+ newScrollWidth + elementWidth + elementMargin;
            });
  
            $(scrollSelector).width(newScrollWidth);
        }    
    }
    
// ------------------------------------------------------    
    
    this.scrollbarBindClick = function(type) {

        switch(type) {
            
            case "imagelist":     
                $(rootElement+" div.GalleryWidgetScroll ul.GalleryWidget li a").click(function () {

                    replaceImage(rootElement+" img.LargeImage", this, "href");
                    
                    var kups = $(this).attr("src");
                    
                    slideThumbnail({
                        
                        selector            :   rootElement+" li div",
                        distance            :   10, 
                        color               :   "#FFFFFF"
                    });

                    $(rootElement+" p.LargeImageDescription").empty();
                    $(rootElement+" p.LargeImageDescription").append("Kupa");
            
                    var kupsior = $(this).parent("div").siblings("h2");
                        
                    slideThumbnail({
                    
                        selector            :   $(this).parent("div"), 
                        distance            :   0,
                        color               :   "#DDDDDD", 
                        highlight           :   "yes", 
                        highlightSelector   :   $(this).parent("div")
                    });
               
                return false;
                });          
                
                break; 
            
            case "div":
            
                break;
                
        }
                
        fadePrevButton();
        
        $(rootElement+" div.GalleryWidgetScroll a.SliderButton.Prev").mousedown(function() { 
            animateScrollbar("left", rootElement+" div.GalleryWidgetScroll", "ul.GalleryWidget");
        });

                             
        $(rootElement+" div.GalleryWidgetScroll a.SliderButton.Next").mousedown(function() { 
            animateScrollbar("right", rootElement+" div.GalleryWidgetScroll", "ul.GalleryWidget")        
        });  
                    
    }

// ------------------------------------------------------

    addNavigationButtons = function () {

        var prevButton   = document.createElement("a");
        var nextButton   = document.createElement("a");
        
        $(prevButton).addClass("SliderButton");
        $(prevButton).addClass("Prev");
        $(prevButton).text("<");
            
        $(nextButton).addClass("SliderButton"); 
        $(nextButton).addClass("Next");
        $(nextButton).text(">");
        
        $(rootElement+" div.GalleryWidgetScroll").prepend( prevButton );
        $(rootElement+" div.GalleryWidgetScroll").append( nextButton );
        

        
    };

// ------------------------------------------------------

    function imageInfo(image) {
    
        var img = new Object();
        
        img.width = $(image).width();
        img.height = $(image).height();
        
        return img;
    }

// ------------------------------------------------------

    function resizeLargeImage(width, height) {

        width = (typeof width == 'undefined') ?
        config.maxWidth : width;
        
        height = (typeof height == 'undefined') ?
        config.maxHeight : height;
        
//        if(width != config.MaxWidth ) {
//        
//            $(rootElement+" img.LargeImage").width(width);
//        
//        }
//        if(height != config.MaxHeight) {
//        
//            $(rootElement+" img.LargeImage").height(height);
//        }
//        if(height == config.MaxHeight && width == config.MaxWidth) {
        
            var largeImageInfo = new imageInfo(rootElement+" img.LargeImage");

            if (largeImageInfo.width >= largeImageInfo.height) {

                $(rootElement+" img.LargeImage").height("auto");            
                $(rootElement+" img.LargeImage").width(width);
            } 
            else {
            
                $(rootElement+" img.LargeImage").width("auto");               
                $(rootElement+" img.LargeImage").height(height);
            }
//        }
    }
    // ------------------------------------------------------
    this.addLargeImage = function(position) {

        var largeImageHolder = document.createElement("div");
        var largeImage = document.createElement("img");
        var largeImageDescription = document.createElement("p");
        
        $(largeImageHolder).addClass("LargeImageHolder");
        
        largeImage.setAttribute("class", "LargeImage");
        largeImage.setAttribute("alt", "");
        largeImage.setAttribute("src", "");
        largeImage.setAttribute("alt", "");    
        largeImage.setAttribute("onload", "$(this).fadeIn(\"slow\")");
   
        $(largeImageDescription).addClass("LargeImageDescription");
            
        if (position == "above") {
        
            $(rootElement+" div.GalleryWidgetScroll").before(largeImageHolder);
            $(largeImageHolder).append(largeImage);
            $(largeImageHolder).append(largeImageDescription);   
            $(largeImageHolder).addClass("Above");             
        }
        if (position == "below") {
        
            $(rootElement+" div.GalleryWidgetScroll").after(largeImageHolder);
            $(largeImageHolder).append(largeImageDescription);        
            $(largeImageHolder).append(largeImage);
            $(largeImageHolder).addClass("Below");             
        }
     
        resizeLargeImage();
     

    };

    // ------------------------------------------------------
    
    function generateGallery() {
        

    }
//    var galleryData = new parseMarkup();

    this.newConfig = function (params)
    {
        config = new this.makeConfig(params);
        return config;
    }
    
    var config = new this.makeConfig();    
    
};
// ------------------------------------------------------
// ------------------------------------------------------


$(function() {
    var gallery = new Gallery(".GalleryWidgetWrapper", ".GalleryWidget");
  //  var gallery2 = new Gallery(".Gallery2WidgetWrapper", ".GalleryWidget");

        gallery.newConfig({
                maxWidth    : "400px",
                maxHeight   : "400px"
        });

        gallery.scrollbarBindClick (gallery.makeConfig().scrollType);
        gallery.setNewScrollerWidth (gallery.makeConfig().rootElement+" div.GalleryWidgetScroll", "ul.GalleryWidget");        
        gallery.addLargeImage("above");
        

        
        
});