function trim(s) { return rtrim(ltrim(s)); }
function ltrim(s) { return s.replace(/^\s+/, ''); }
function rtrim(s) { return s.replace(/\s+$/, ''); }


jQuery.fn.gallerySlider = function( settings ) {
	settings = jQuery.extend({
        interval : 4000,
        speed : "slow",
	     	startFrom : 1,
	     	easing: "swing" //  "linear" or "swing"
    }, settings); 
    return this.each(function() {
		jQuery.fn.gallerySlider.run( jQuery( this ), settings );
    });
};
jQuery.fn.gallerySlider.run = function( $this, settings ) {
  var contWidth = jQuery ($this).width();
  var $next = jQuery("#next");
	var $back = jQuery("#prev");
  var addElemAmount= 0;   // количество добавляемых элементов в начало и конец списка
  var ul = jQuery( "ul:eq(0)", $this );	
  var li = ul.children();
  var liFirstLength = li.length; 
	var ulWidth=0;
  var liWidth = [];
  
  for (i=0; i<li.length; i++) liWidth.push(jQuery(li[i]).width());
  if (settings.startFrom==0) settings.startFrom++;
  while (settings.startFrom>liWidth.length) settings.startFrom-=liWidth.length;
  var amountOld = 0;
  var amount = amountr = 0;

  // amount of left blocks
  for (aa=0; aa<liWidth.length; aa++) {
    amount=0;
    s=0;                              
    for(i=1; i<settings.startFrom; i++) {
      if (aa-i >= 0) 
        s+=liWidth[aa-i];
      else
        s+=liWidth[liWidth.length+aa-i];
    } 
    while ((s+liWidth[aa]/2)<contWidth/2) {   //количество элементов, которые помещаются в экране
      amount++;
      if (amount>liWidth.length) tempAmount = amount-liWidth.length; else tempAmount = amount;      
      if (aa-(i-1+tempAmount)<0) tempAmount = aa-(tempAmount+i-1)+liWidth.length; else tempAmount = aa-(tempAmount+i-1);
      s+=liWidth[tempAmount];
    }
    if ((aa-1)<0) pos=aa-1+liWidth.length; 
    else pos=aa-1;
    while ((s-liWidth[pos]/2)<contWidth/2) {    //количество элементов, которые помещаются в экране после нажатия кнопки "back"
      amount++;
      if (amount>liWidth.length) tempAmount = amount-liWidth.length; else tempAmount = amount;
      if (aa-(i-1+tempAmount)<0) tempAmount = aa-(tempAmount+i-1)+liWidth.length; else tempAmount = aa-(tempAmount+i-1);
      s+=liWidth[tempAmount];
    }   
    if (amount>addElemAmount) addElemAmount=amount;
  }
  amount=addElemAmount;
  // --------
       
  // amount of right blocks 
  addElemAmountR=0;
  for (aa=0; aa<liWidth.length; aa++) {
    amountr=0;    
    s=0;                              
    for(i=1; i<=liWidth.length-settings.startFrom; i++) {
      if (aa+i < liWidth.length) 
        s+=liWidth[aa+i];
      else
        s+=liWidth[aa+i-liWidth.length];
    } 
    while ((s+liWidth[aa]/2)<contWidth/2) {   //количество элементов, которые помещаются в экране
      amountr++;
      if (amountr>liWidth.length) tempAmount = amountr-liWidth.length; else tempAmount = amountr ;      
      if (aa+i-1+tempAmount>=liWidth.length) tempAmount = aa+tempAmount+i-1-liWidth.length; else tempAmount = aa+tempAmount+i-1;
      s+=liWidth[tempAmount];
      
    }
    if (aa+1<liWidth.length) pos=aa+1; 
    else pos=aa+1-liWidth.length;
    while ((s-liWidth[pos]/2)<contWidth/2) {    //количество элементов, которые помещаются в экране после нажатия кнопки "next"
      amountr++;
      if (amountr>liWidth.length) tempAmount = amountr-liWidth.length; else tempAmount = amountr ;
      if (aa+i-1+tempAmount>liWidth.length) tempAmount = aa+tempAmount+i-1-liWidth.length; else tempAmount = aa+tempAmount+i-1;
      s+=liWidth[tempAmount];
    } 
    if (amountr>addElemAmountR) addElemAmountR=amountr;
 }      
  // -----------

  // add new items in list
  startingUlHtml=ul.html();
  startingUlHtml=trim(startingUlHtml);  
  st=startingUlHtml.split("\n");
  startingUlHtml='';
  addElemFirst='\n';
  addElemLast='';
  for (i=0; i<st.length; i++) {
    st[i]=trim(st[i])+"\n"; 
    startingUlHtml+=st[i];
  }
  i=0;
  for (count=0; count<addElemAmountR; count++) {
    if (i==st.length) i=0; 
    addElemLast+=st[i];
    i++;  
  } 
  newAddElemAmount = addElemAmount-st.length*parseInt(addElemAmount/st.length);
  if (st.length<addElemAmount) {
    for (i=st.length - newAddElemAmount; i<st.length; i++) 
      addElemFirst+=st[i]; 
    for (count=0; count<parseInt(addElemAmount/st.length); count++)  
      for (i=0; i<st.length; i++) addElemFirst+=st[i];    
  } else {
    for (i=st.length-addElemAmount; i<st.length; i++) addElemFirst+=st[i];
  }  
  ul.html(addElemFirst+startingUlHtml+addElemLast);
  //------------- 
    
  li = ul.children();
  for (i=0; i<li.length; i++) {
    liWidth[i]=parseInt(jQuery(li[i]).width());
    ulWidth+=liWidth[i];
    jQuery(li[i]).css("width", liWidth[i]);
  }       
  centerImg = addElemAmount + settings.startFrom - 1;  
  s=0;
  for (i=0; i<centerImg; i++) { s+=liWidth[i]; }
  offsetLeft=  - ( (liWidth[centerImg] + liWidth[centerImg+1])/2 ); 
	ul.css( {'width': ulWidth, 'left': offsetLeft, 'position':'relative', 'overflow':'hidden' } );
  
  // autoscrolling
  if (settings.interval!=0) {
  intervalId=setInterval (function(){
        offsetLeft = parseInt(offsetLeft - ( (liWidth[centerImg] + liWidth[centerImg+1])/2 ));        			 
        ul.animate({ left: offsetLeft }, settings.speed, settings.easing, function(){          
          ul.append("<li style=\""+li.eq(li.length - liFirstLength).attr("style")+"\">"+li.eq(li.length - liFirstLength).html()+"</li>");                    
          liWidth.push(liWidth[li.length - liFirstLength]);
          offsetLeft = offsetLeft + liWidth[0];
          ulWidth=ulWidth-liWidth[0]+liWidth[liWidth.length-1];
          liWidth.shift();                                      
          ul.css({'left':offsetLeft, 'width': ulWidth}).children("li:first").remove();          
          li = ul.children();
          });
          }, settings.interval);
  jQuery($this).parent("div").mouseout(function () {
  intervalId=setInterval (function(){
        offsetLeft = parseInt(offsetLeft - ( (liWidth[centerImg] + liWidth[centerImg+1])/2 ));        			 
        ul.animate({ left: offsetLeft }, settings.speed, settings.easing, function(){          
          ul.append("<li style=\""+li.eq(li.length - liFirstLength).attr("style")+"\">"+li.eq(li.length - liFirstLength).html()+"</li>");                    
          liWidth.push(liWidth[li.length - liFirstLength]);
          offsetLeft = offsetLeft + liWidth[0];
          ulWidth=ulWidth-liWidth[0]+liWidth[liWidth.length-1];
          liWidth.shift();                                      
          ul.css({'left':offsetLeft, 'width': ulWidth}).children("li:first").remove();          
          li = ul.children();
          });
          }, settings.interval);
  }).mouseover( function(){ clearInterval(intervalId) });
  }
  //----------------
  
  var btnClick=true;  // double click (The following animation will not work yet the previous won't end )
  $next.click(function() {
			if (btnClick) {
			  btnClick=false;
        offsetLeft = parseInt(offsetLeft - ( (liWidth[centerImg] + liWidth[centerImg+1])/2 ));        			 
        ul.animate({ left: offsetLeft }, settings.speed, settings.easing, function(){          
          ul.append("<li style=\""+li.eq(li.length - liFirstLength).attr("style")+"\">"+li.eq(li.length - liFirstLength).html()+"</li>");                    
          liWidth.push(liWidth[li.length - liFirstLength]);
          offsetLeft = offsetLeft + liWidth[0];
          ulWidth=ulWidth-liWidth[0]+liWidth[liWidth.length-1];
          liWidth.shift();                                      
          ul.css({'left':offsetLeft, 'width': ulWidth}).children("li:first").remove();          
          li = ul.children(); 
          btnClick=true;
        });      
      
      }      
		return false;
	});

  $back.click(function() {
    	if (btnClick) {
			  btnClick=false;
        offsetLeft = parseInt(offsetLeft + ( (liWidth[centerImg] + liWidth[centerImg-1])/2 ));        			 
        ul.animate({ left: offsetLeft }, settings.speed, settings.easing, function(){          
          ul.prepend("<li style=\""+li.eq(liFirstLength-1).attr("style")+"\">"+li.eq(liFirstLength-1).html()+"</li>");                   
          liWidth.unshift(liWidth[liFirstLength-1]);         
          ulWidth=ulWidth+liWidth[0]-liWidth[liWidth.length-1];
          liWidth.pop();
          offsetLeft = offsetLeft - liWidth[0];                            
          ul.css({'left':offsetLeft, 'width': ulWidth}).children("li:last").remove();          
          li = ul.children();  
          btnClick=true;  
        });
  	}
		return false;
	});

};
