﻿(function ($)
{
    var methods = {
        init: function (options)
        {
				var timer;

            // INIT
            var settings = {};
            var defaults = {
               // 'trigger': this,
               // 'objref': this.attr("rel"),
                'parent': this,
                'slides': '.slides',
                'thumbs': '.thumbs',
                'controls': '.controls',
                'event': 'click',
                'action': 'activate',
                'effect': 'fade',
                'effectoff': '0',
                'effectactive': '1',
                'effectspeed': 200,
								'timerobj': timer,
								'timerspeed': 5000,
								'timeron': false
            };

            return this.each(function ()
            {
                // If options exist, lets merge them
                // with our default settings
                if (options)
                {
                    $.extend(settings, defaults, options);
                }
					 
					 // setup data for (parent)
                var $this = $(this);
					 var $slides   = $($this.find(settings['slides']+' li'));
					 var $thumbs   = $($this.find(settings['thumbs']+' li a'));
					 var $control_prev = $($this.find(settings['controls']+' li.prev a'));
					 var $control_next = $($this.find(settings['controls']+' li.next a'));

                // set default position/settings
/*                switch ($this.data('effect'))
                {
                    case 'slide':

                        $($this.data('object')).css({
                            'top': $this.data('effectoff')
                        })
                        break;

                    case 'fade':
                    default:

                        $($this.data('object')).css({
                            'opacity': $this.data('effectoff')
                        })
                        break;
                }
*/
                
					 // setup data for each (control)
					 var control_settings = {};
					 
					 // bind event to each (control)
					 $control_prev.bind(settings['event'], function (e)
					 {
						  e.preventDefault();
						  $this.controlImageGallery('prevItem');
					 });
					 $control_next.bind(settings['event'], function (e)
					 {
						  e.preventDefault();
						  $this.controlImageGallery('nextItem');
					 });


					// setup data for each (thumb)
					 var thumb_settings = {};
					 $thumbs.each(function (index)
                {
                   thumb_settings = {
                      'parent': $this,
                      'trigger': this,
                      'index': index,
                      'object': $slides.eq(index),
							 'callback' : 'showItem'
                   };
                   $(this).data(thumb_settings);
						 
						 // bind event to each (thumb)
						 $(this).bind(settings['event'], function (e)
						 {
							  e.preventDefault();
							  $(this).controlImageGallery(settings['action']);
						 });
						 
                });
					 
					 // setup data for each (slide)
					 var slide_settings = {};
					 $slides.each(function (index)
                {
						slide_settings = {
							'parent': $this,
							'trigger': $thumbs.eq(index),
							'index': index,
							'object': this
						};
							$(this).data(slide_settings);
							
							$(this).css({
								'position':'absolute',
								'z-index':1
							});

							switch (settings['effect']) 
							{
								case 'slide':
									$(this).css({  'left':settings['effectoff']+'px'  });
									break;
								case 'fade' :
								default :
									$(this).css({  'opacity':settings['effectoff']  });
									break;
							}
								
                });
					 
					 // assign data to (parent)
					 settings['slides'] = $slides;
					 settings['thumbs'] = $thumbs;
                $this.data(settings);
					 
					 // once window is finished loading
					 $(window).load(function() {
						 // trigger first slide
						 //$this.find(defaults['slides']+' li:first a').trigger(settings['event']);
						 $slides.first().controlImageGallery('showItem');
					 });

            });

        },
        highlight: function ()
        {
            // Method: FOR TESTING PURPOSES
            var $object = $(this).data('object');
            $($object).css({ "border": "red 1px solid" });

        },
        activate: function (args)
        {
            // Method: ACTIVATE by Thumb -> SHOW current, HIDE others
				// args = direction

				var animating = false;
            var $trigger = $(this);
            var $parent = $trigger.data('parent');
            var $slides = $parent.data('slides');
				
            var $nextobject = $trigger.data('object');
				var $prevobject = false;
					$slides.each(function(){
						if ( $(this).hasClass('active') === true ) $prevobject = $(this);
						if ( $(this).is(":animated") === true ) animating=true;
					});
					
            if ($nextobject.hasClass('active') || animating)
				{
					// do nothing
            } else
            {
            	//$parent.controlImageGallery('hideItems',$trigger);
					if ($prevobject !== false) {
						$prevobject.controlImageGallery('hideItem');
					}
					$nextobject.controlImageGallery('showItem');
            }
        },
        activateItem: function (args)
        {
            // Method: ACTIVATE by Thumb -> SHOW current, HIDE others
				// args = direction

				var animating = false;
            var $object = $(this);
            var $parent = $object.data('parent');
            var $slides = $parent.data('slides');
				
            var $nextobject = $object;
				var $prevobject = false;
					$slides.each(function(){
						if ( $(this).hasClass('active') === true ) $prevobject = $(this);
						if ( $(this).is(":animated") === true ) animating=true;
					});
					
            if ($nextobject.hasClass('active') || animating)
				{
					// do nothing
            } else
            {
            	//$parent.controlImageGallery('hideItems',$trigger);
					if ($prevobject !== false) {
						$prevobject.controlImageGallery('hideItem',args);
					}
					$nextobject.controlImageGallery('showItem',args);
            }
				
        },
        showItem: function (args)
        {
			   // Method: HIDE single item
				// args = direction
				
				var $slide = $(this);
				var $thumb = $($slide.data('trigger'));
				var $parent = $($slide.data('parent'));
				
				var timeron = $parent.data('timeron');
				var timer   = $parent.data('timerobj');
				var timerspeed = $parent.data('timerspeed');
				
				var fx      = $parent.data('effect');
				var fxspeed = $parent.data('effectspeed');
				var fxstart = $parent.data('effectoff');
				var fxend   = $parent.data('effectactive');
				
				switch (fx) 
				{
					case 'slide':
						var direction;
						if (args == 'prev') {
							direction = -1;
						} else {
							direction = 1;
						}

						$slide.css({
								'left': (direction*fxstart)+'px'
						}).animate({
								'left': fxend+'px'
							},fxspeed,function() {
								$thumb.addClass('active');
								$slide.addClass('active').css({'z-index':2});
						});
						break;

					case 'fade' :
					default :
					
						$slide.css({
								'opacity': fxstart
						}).animate({
								'opacity': fxend									
							},fxspeed,function() {
								$thumb.addClass('active');
								$slide.addClass('active').css({'z-index':2});
						});
						break;
						
				}
				
				if (timeron===true) {
					clearTimeout(timer);
					//set timeout
					timer = setTimeout(function(){$parent.controlImageGallery('nextItem')},timerspeed);
					$parent.data('timerobj',timer);
				}
				
        },
        hideItem: function (args)
        {
			   // Method: HIDE single item
				// args = direction
				
				var $slide = $(this);
				var $thumb = $($slide.data('trigger'));
				var $parent = $($slide.data('parent'));
				
				var fx      = $parent.data('effect');
				var fxspeed = $parent.data('effectspeed');
				var fxstart = $parent.data('effectoff');
				var fxend   = $parent.data('effectactive');
				
				switch (fx) 
				{
					case 'slide':
					
						var direction;
						if (args == 'prev') {
							direction = -1;
						} else {
							direction = 1;
						}

						$slide.css({
								'left': (direction*fxend)+'px'
						}).animate({
								'left': -(direction*fxstart)+'px'
							},fxspeed,function() {
								$thumb.removeClass('active');
								$slide.removeClass('active').css({'z-index':1});
						});
						break;

					case 'fade' :
					default :
					
						$slide.css({
								'opacity': fxend
						}).animate({
								'opacity': fxstart
							},fxspeed,function() {
								$thumb.removeClass('active');
								$slide.removeClass('active').css({'z-index':1});
						});
						break;
						
				}
				
        },
        nextItem: function (args)
        {
			   // Method: NEXT item in sequence
				//console.log('function nextItem');

				var $parent    = $(this);
				var $slides    = $parent.data('slides');
				var $currslide, $nextslide;
				
				// get current slide
				$slides.each(function (index) {
					// set the default
					if (index == 0) {
						$currslide = $(this);
					}
					// check for current
					if ( $(this).hasClass('active') == true ) $currslide = $(this);
				});
				
				// get next slide
				if ( $currslide.next().length == 0 ) {
					$nextslide = $slides.first();
				} else {
					$nextslide = $currslide.next();
				}

				$nextslide.controlImageGallery('activateItem','next');
				
        },
        prevItem: function (args)
        {
			   // Method: NEXT item in sequence
				//console.log('function prevItem');

				var $parent    = $(this);
				var $slides    = $parent.data('slides');
				var $currslide, $nextslide;
				
				// get current slide
				$slides.each(function (index) {
					if ( $(this).hasClass('active') === true ) $currslide = $(this);
				});

				// get prev slide
				if ( $currslide.prev().length == 0 ) {
					$nextslide = $slides.last();
				} else {
					$nextslide = $currslide.prev();
				}

				$nextslide.controlImageGallery('activateItem','prev');
				
        }
    };

    $.fn.controlImageGallery = function (method)
    {

        // Method calling logic
        if (methods[method])
        {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method)
        {
            return methods.init.apply(this, arguments);
        } else
        {
            $.error('Method ' + method + ' does not exist on jQuery.controlToggleItem');
        }


    };
})(jQuery);
