(function($){
    var MediaGallery = function(elm, visible, type, data){
        if(typeof data !== "undefined") {
            
            // -- public vars
            this.curSlide = 0;            
            this.slideCount = 0;
			this.type = type;
            this.visibleSlides = visible;
            this.intervalTime = 8000;
            
            // -- private vars
            Prv.data = data;
            Prv.elm = $(elm);
            Prv.triggerNextSlide = visible - 1;
            Prv.$slider = $(Prv.slider);
            
            this.init();
        };
    },
    _mg = MediaGallery.prototype = {},
    
    // -- private variable store
    Prv = {
        counter: document.createElement("span"),
        data: null,
        elm: null,
        interval: null,
        largeImg: new Image(),
        largeImgHolder: document.createElement("a"),
        marginAccount: 0,
        navNext: document.createElement("a"),
        navPrev: document.createElement("a"),
		scrollNext: document.createElement("a"),
		scrollPrev: document.createElement("a"),
		slideIdx: 0,
        slider: document.createElement("div"),
        $slider: null,
        slides: [],
        slideWidth: 0,
        triggerPrevSlide: 0,
    },
    
    // -- private img slide constructor
    ImageSlide = function(data,idx,width){
        this.linkwrap = document.createElement("a");
        this.image = new Image();
        this.image.src = data.image;
        this.image.idx = idx;
		this.linkwrap.style.width = this.image.style.width = width + "px";
        this.linkwrap.appendChild(this.image);        
        idx == 0 && this.type === "full" && this.image.setAttribute(Fat.classAttribute,"on");
    };
    
    // -- check to see which type to init
	_mg.init = function(){
		if(!Fat.isEmpty(Prv.data)) {
		    switch(this.type) {
		        case "full":
		            this.fullInit(); break;
		        case "scroll":
		            this.scrollInit(); break;
		        default:
		            this.gridInit(); break;
		    };
		};
    };

    // -- method for moving the slider
    _mg.slide = function(i){
		if(!(Prv.slideIdx + i > (this.slideCount - this.visibleSlides) || Prv.slideIdx + i < 0)) {
			Prv.slideIdx += i;
			Prv.triggerNextSlide += i;
			Prv.triggerPrevSlide += i;
			Prv.$slider.stop().animate({"left":((Prv.slideWidth*Prv.slideIdx))*-1});
		};
		if(this.curSlide < Prv.slideIdx){
			this.moveForward();
		} else if (this.curSlide >= (Prv.slideIdx + this.visibleSlides)){
			this.moveBack();
		};
    };
    
    // -- method for setting the large img
    _mg.setCurImg = function(i) {
        Prv.navPrev.style.display = (i == 0) ? "none" : "block";
        Prv.navNext.style.display = (i == (this.slideCount-1)) ? "none" : "block";
        Prv.slides[this.curSlide].image.removeAttribute(Fat.classAttribute);
        Prv.slides[i].image.setAttribute(Fat.classAttribute,"on");
        var mg = this;
        $(Prv.largeImg).stop().animate({"opacity":0},150,function(){
            this.src = Prv.slides[i].image.src;
			Prv.largeImgHolder.href = this.src;
            $(this).animate({"opacity":1});
        });
		$(Prv.largeImgHolder).colorbox({slideshow: false});
        this.curSlide = i;
        Prv.counter.innerHTML = "Image " + (i+1) + "/" + this.slideCount;
    };
    
    // -- move forward and back with the full gallery
    _mg.moveForward = function(){
        var next = this.curSlide + 1;
        if(next < this.slideCount) {
            if(next > Prv.triggerNextSlide) {
                this.slide(1);
            };
            this.setCurImg(next);
        };
    };   
    _mg.moveBack = function(){
        var prev = this.curSlide - 1;
        if(prev >= 0) {
            if(prev < Prv.triggerPrevSlide) {
                this.slide(-1);
            };
            this.setCurImg(prev);
        };
    };
    
    // -- set the autocount interval
    _mg.setInterval = _mg.resume = function(){
        var mg = this,
        ltr = true;
        this.setCurImg(this.curSlide);
        this.interval = setInterval(function(){
            if(mg.curSlide == (mg.slideCount-1) || mg.curSlide == 0) { ltr = !ltr };
            ltr ? mg.moveForward() : mg.moveBack();
        },this.intervalTime);
    };
    
    // -- pause autocount
    _mg.pause = function(){
        clearInterval(this.interval);
    };
    
    // -- reset autocount
    _mg.reset = function(){
        this.pause();
        this.slideTo(0);
    };
    
    // -- init the full media gallery (including prelim scroll gallery init)
	_mg.fullInit = function(){
	    var mg = this;
	    
	    this.scrollInit();
	    
	    $(Prv.slides).each(function(){
            this.linkwrap.onclick = function(){
                var clickindex = $(this).find("img")[0].idx;
                mg.setCurImg(clickindex);
                mg.pause();
            };
        });

        Prv.navNext.setAttribute("id","moveNext");
        Prv.navPrev.setAttribute("id","movePrev");
        Prv.largeImg.setAttribute("id","largeImg");
        Prv.largeImgHolder.setAttribute("id","largeImgHolder");
        Prv.counter.setAttribute("id","counter");
        Prv.navNext.innerHTML = "Next";
        Prv.navPrev.innerHTML = "Previous";
        Prv.counter.innerHTML = "Image 1/" + this.slideCount;
        Prv.largeImg.src = Prv.largeImgHolder.href = Prv.slides[0].image.src;
        
        Prv.navNext.onclick = function(){
            mg.pause();
            mg.moveForward();
        };
        Prv.navPrev.onclick = function(){
            mg.pause();
            mg.moveBack();
        };

        Prv.largeImgHolder.appendChild(Prv.largeImg);
        Prv.elm.prepend(Prv.counter,Prv.largeImgHolder, Prv.navNext, Prv.navPrev);
        
	};
    
    // -- init the scroll-only media gallery
    _mg.scrollInit = function(){
        var mg = this,
		widthCounter = 0,
		sw = parseInt(Prv.elm.width() / this.visibleSlides),
		finalWidth = sw - Prv.marginAccount,
		dateStamp = new Date().getTime(),
		overflowDiv = document.createElement("div"),
		htmlLinks;
        
        Prv.slideWidth = sw;
		Prv.scrollNext.setAttribute("id","scrollNext");
        Prv.scrollPrev.setAttribute("id","scrollPrev");
        Prv.slider.setAttribute("id","scroller");
        Prv.scrollNext.innerHTML = "&raquo;";
        Prv.scrollPrev.innerHTML = "&laquo;";
        overflowDiv.setAttribute("id","scrollHolder");
        
        Prv.scrollNext.onclick = function(){
			mg.pause();
            mg.slide(1);
        };
        Prv.scrollPrev.onclick = function(){
			mg.pause();
            mg.slide(-1);
        };
        
        for(var x in Prv.data) {
			var slide = new ImageSlide(Prv.data[x],this.slideCount,finalWidth);
            Prv.slides.push(slide);
            Prv.slider.appendChild(slide.linkwrap);            
            this.slideCount++;
            
            widthCounter += (Prv.slideWidth+Prv.marginAccount);
            if(this.type === "scroll") {
                slide.linkwrap.rel = "gallery" + dateStamp;
                slide.linkwrap.href = slide.image.src;
            };
        };
        
        Prv.slider.style.width = widthCounter + "px";
        
		overflowDiv.style.width = Prv.slideWidth * this.visibleSlides + "px";
        overflowDiv.appendChild(Prv.slider);
        Prv.elm.html("").append(overflowDiv, Prv.scrollNext, Prv.scrollPrev);
        
        htmlLinks = $(Prv.slider.getElementsByTagName("a")).each(function(){
            var a = this,
            img = this.getElementsByTagName("img")[0];
		    img.onload = function() {
		        var height1 = this.clientHeight,
		        height2 = a.clientHeight;
		        this.style.marginTop = ((height1-height2)/2)*-1 + "px";
		    };
	    });
	    
        this.type === "scroll" && htmlLinks.colorbox();		    
        
        this.setInterval();
    };
	
	// -- init the grid-style media gallery
	_mg.gridInit = function(){
		var timeStamp = new Date().getTime();
		Prv.elm.addClass("clearfix gridGallery");
		for(var x in Prv.data) {
			var row = Prv.data[x],
			thumb = new Image(),
			link = document.createElement("a");
			
			thumb.src = link.href = row.image;
			$(thumb).hover(function(){
				$(this).stop().animate({"opacity":1});
			},function(){
				$(this).stop().animate({"opacity":0.5});
			});
			link.appendChild(thumb);
			link.rel = "gallery" + timeStamp;
			link.setAttribute(Fat.classAttribute,"galleryThumb");
			
			Prv.elm.append(link);
        };
		var thumbs = $(".galleryThumb").colorbox();
	};
	
    window.MediaGallery = MediaGallery;
})(window.jQuery);
