$.fn.gmSlide = function(options) {
    var defaults = {
        imageWidth: 1000,
        imageHeight: 350,
        cycle:true,
        controls: true,
        indicators: true,
        canvas:false
    }
        
    options = $.extend(defaults, options);  
    return this.each(function() {

    	$(this).css('display','block'); 
    	Obj = $(this);
    	lis = $(this).find('li');
    	num = lis.length;
    	
    	lis.wrapAll('<div class="gm-slider-container"></div>');
    	
    	if(options.indicators == true && num > 1){
    	Obj.indID = giveUnusedID();
    	$(this).find('.gm-slider-container').append("<ul id='"+Obj.indID+"' class='nostyle indicators'></ul>");
    	var indi = 0;
    	lis.each(function(){
    	if(indi == 0){
    		var Aclass = 'active';
    	}
    	else{
    		var Aclass = '';
    	}
    	$('#'+Obj.indID).append("<li class='ind "+Aclass+"'><img width='10' height='10' src='"+source+"includes/blank.gif' /></li>");
    	indi++;
    	});
    	$('#'+Obj.indID).find('.ind').click(function(){
    		
    		curr = $('#'+Obj.indID).find('.active').index();
    		toGo = $(this).index();
    		
    		if(toGo > curr){
    			clearInterval(Obj.interval)
    			Obj.slide2next(toGo - curr);
    		}
    		else if(toGo < curr){
   				clearInterval(Obj.interval)
   				Obj.slide2prev(curr - toGo);	
    		}
    	})
    	}
    	
    	if(options.canvas){$(this).find('.gm-slider-container').append('<div class="canvas"></div>');};
    	lis.wrapAll('<div class="wrapper"></div>');
    	lis.wrapAll('<div class="slide-box"></div>');
   
   		imgs = lis.find('img,iframe');
   		
   		imgs.wrap('<div class=\'table\'></div>');
   		imgs.wrap('<div class=\'tr\'></div>');
   		imgs.wrap('<div class=\'td\'></div>');
   		
   		
   		lis.addClass('item');
   		
   		slideBox = $(this).find('.slide-box');
   		
   		slideBox.css('width',options.imageWidth*num+'px');
   		
   		if($(lis[0]).children('a').length > 0){
   			Obj.css('cursor','pointer');
   			Obj.click(function(){
   				window.location.href = $(lis[0]).children('a')[0].href;
   			});
   		}
   		
   		if(num > 1){
   		
   		Obj.find('.gm-slider-container').append("<a href='javascript:void(0)' class='arw2next'></a>");
   		Obj.find('.gm-slider-container').append("<a href='javascript:void(0)' class='arw2prev'></a>");
   		
   		}
   		
   		Obj.find('.arw2next').click(function(e){
   			e.stopImmediatePropagation()
   			Obj.slide2next();
   			window.clearInterval(Obj.interval);
   		
   		})
   		
   		Obj.find('.arw2prev').click(function(e){
   			e.stopImmediatePropagation()
   			Obj.slide2prev();
   			window.clearInterval(Obj.interval);
   		
   		})
   		
   		total = 0;
   		
   		Obj.slide2next = function(times){
   			if(!times){
   			times = 1;
   			}
   			if(isInt(parseInt(slideBox.css('marginLeft')) / 1000) || slideBox.css('marginLeft') == '0px' || slideBox.css('marginLeft') == 'auto') {
   				//for(i=0;i<times;i++){
   		   			if(total >= num-1){
	   				$(this).find('li:first').appendTo(Obj.find('.slide-box'));
	   				slideBox.animate({marginLeft:'+=1000'},0);
	   				total = num-1;
	   			}else{
	   			for(i=0;i<times;i++){
	   			total++;
	   			}
	   			}
	   			if(!$.browser.msie){
	   				$($(this).find('li')[total]).find('.desc').delay(700).fadeIn(500);
	   				$($(this).find('li')[total]).find('.desc').hide();	   			
	   			}else{
	   				$($(this).find('li')[total]).find('.desc').delay(700).fadeIn(0);	
	   			}
	   			/*ease = 'easeInOutCirc';
	   			if(times != 1){
	   			ease = 'easeInCirc';
	   			}
	   			if(i == times){
	   			ease = 'easeOutCirc';	   			
	   			}*/
	   			slideBox.animate({marginLeft:'-='+1000*times},400,'easeInOutCirc',function(){
	   				for(i=0;i<times;i++){ActOne = slideBox.parent().parent().find('.indicators').find('li.active');
	   				ActOne.removeClass('active');
	   				if(ActOne.next().length > 0){ActOne.next().addClass('active')}else
	   				{
	   					slideBox.parent().parent().find('.indicators').find('li:first-child').addClass('active');
	   				}
	   				}
	   			});
	   			
	   			if($(Obj.find('li')[total]).children('a').length > 0){
		   			Obj.css('cursor','pointer');
		   			Obj.unbind();
		   			Obj.click(function(){window.location.href = $(Obj.find('li')[total]).children('a')[0].href});
		   		}
		   		else{
			   		Obj.css('cursor','default');
		   			Obj.unbind();
		   		}
		   		}
	   			
	   			//}
   		}
   		
   		Obj.slide2prev = function(times){
   			if(!times){
   			times = 1;
   			}
   			if(isInt(parseInt(slideBox.css('marginLeft')) / 1000) || slideBox.css('marginLeft') == '0px' || slideBox.css('marginLeft') == 'auto') {
	   			if(total <= 0){
 
	   				$(this).find('li:not(.ind):last').prependTo(Obj.find('.slide-box'));
	   				slideBox.animate({marginLeft:'-=1000'},0);
	   				total = 0;
	   			}else{
	   			for(i=0;i<times;i++){
	   			total--;
	   			}
	   			}
	   			$($(this).find('li')[total]).find('.desc').hide();
	   			if(!$.browser.msie){
	   				$($(this).find('li')[total]).find('.desc').delay(700).fadeIn(500);
	   				$($(this).find('li')[total]).find('.desc').hide();	   			   			
	   			}else{
	   				$($(this).find('li')[total]).find('.desc').delay(700).fadeIn(0);	
	   			}	   			
	   				slideBox.animate({marginLeft:'+='+1000*times},400,'easeInOutCirc',function(){
	   				
	   			for(i=0;i<times;i++){
	   				ActOne = slideBox.parent().parent().find('.indicators').find('li.active');
	   				ActOne.removeClass('active');
	   				if(ActOne.prev().length > 0){ActOne.prev().addClass('active')}else
	   				{
	   					slideBox.parent().parent().find('.indicators').find('li:last-child').addClass('active');
	   				}
	   				}
	   			});
	   			
	   			if($(Obj.find('li')[total]).children('a').length > 0){
		   			Obj.css('cursor','pointer');
		   			Obj.unbind();
		   			Obj.click(function(){window.location.href = $(Obj.find('li')[total]).children('a')[0].href});
		   		}
		   		else{
			   		Obj.css('cursor','default');
		   			Obj.unbind();
		   		}
   			}
   		}
   		
   		if(num > 1){
   			Obj.interval = window.setInterval('Obj.slide2next()',3000);
   		}
   		
    });
};

 function isInt(x) {
   var y=parseInt(x);
   if (isNaN(y)) return false;
   return x==y && x.toString()==y.toString();
 }
 
 
 function giveUnusedID(){

   var chars = '0123456789abcdef'.split('');

   var uuid = [], rnd = Math.random, r;
   uuid[8] = uuid[13] = uuid[18] = uuid[23] = '';
   uuid[14] = '4'; 

   for (var i = 0; i < 30; i++)
   {
      if (!uuid[i])
      {
         r = 0 | rnd()*16;

         uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r & 0xf];
      }
   }

   return "lo" + uuid.join('');
}
