(function($) {
  $.fn.easySlider = function(options){
    // default configuration properties
    var defaults = {
      prevnext : false,
      prevnextId : 'prevnext',
      prevId:'prevBtn',
      prevText:'Previous',
      nextId:'nextBtn',
      nextText:'Next',
      controlsShow:  true,
      controlsBefore:'',
      controlsAfter:'',
      controlsFade:  false,
      firstId:'firstBtn',
      firstText:'First',
      firstShow:false,
      lastId:'lastBtn',
      lastText:'Last',
      lastShow:false,
      vertical:false,
      speed:800,
      auto:false,
      pause:2000,
      continuous:true,
      numeric:false,
      numericInc:false, // вывод инкремента страниц
      numericId:'controls',
      allControls:false,
      rtl : false,
      li_description : false
    };

    var options = $.extend(defaults, options);

    this.each(function() {
      var obj = $(this);

      var ul_ml = strToInt($("ul", obj).css("margin-left"))*1;
      var s = $("li", obj).length;
      var w = $("li", obj).width();
      var m = strToInt($("li", obj).css("margin-left")) + strToInt($("li", obj).css("margin-right"));
      var h = $("li", obj).height();
      var clickable = true;
      //obj.width(w);
      //obj.height(h);
      obj.css("overflow","hidden");
      var ts = s-1;
      var t = 0;
      $("ul", obj).css('width',s*w+s*m);
      $("li", obj).css('display','block');

      if(!options.vertical){
        //$("li", obj).css('float','left');
      }
      if(options.continuous){
        $("ul", obj).prepend($("ul li:last-child", obj).clone()).css("margin-left", ul_ml - (w+m) +"px");
        t=1;
        $("ul", obj).append($("ul li:nth-child(2)", obj).clone());
        $("ul", obj).css('width',(s+2)*w+(s+2)*m);
      };
      if(options.controlsShow){
        var html = options.controlsBefore;

        if(options.prevnext){ //for fast prev on <li> by span width 50%
          html += '<div id="'+ options.prevnextId +'">';
          if(options.firstShow){
            html += '<span id="'+ options.firstId +'"><a href=\"javascript:void(0);\">'+ options.firstText +'</a></span>';
          }
          html += '<span id="'+ options.prevId +'"><a href=\"javascript:void(0);\">'+ options.prevText +'</a></span>';
          html += '<span id="'+ options.nextId +'"><a href=\"javascript:void(0);\">'+ options.nextText +'</a></span>';
          if(options.lastShow){
            html += '<span id="'+ options.lastId +'"><a href=\"javascript:void(0);\">'+ options.lastText +'</a></span>';
          }
          html += '</div>';
          $(html).appendTo(obj);
          html = '';//"ul",).after(html);
        }
        if(options.allControls){
          html = ''+
          '<div class="'+ options.numericId +'">' +
            '<div class="center">'+
              '<div class="bg_prev">'+
                '<span id="'+ options.prevId +'"><a href=\"javascript:void(0);\">'+ options.prevText +'</a></span>'+
              '</div>'+
              '<div class="bg_numeric">'+
                '<ol id="'+ options.numericId +'"></ol>'+
              '</div>'+
              '<div class="bg_next">'+
                '<span id="'+ options.nextId +'"><a href=\"javascript:void(0);\">'+ options.nextText +'</a></span>'+
              '</div>'+
            '</div>'+
          '</div>';
          options.numeric = true;
          options.prevnext = true;
        }else{
          if(options.numeric){
            html += '<div class="'+ options.numericId +'"><div class="align_center_to_left"><div class="align_center_to_right"><ol id="'+ options.numericId +'"></ol></div></div></div></div>';
          }
        }

        html += options.controlsAfter;
        $("ul",obj).after(html);
      };

      if(options.numeric){
        for(var i=0;i<s;i++){
          $(document.createElement("li"))
            .attr('id',options.numericId + (i+1))
            .html(options.numericInc ? '<a rel='+ i +' href=\"javascript:void(0);\">'+ (i+1) +'</a>' : '<a rel='+ i +' href=\"javascript:void(0);\"></a>')
            .appendTo($("#"+ options.numericId))
            .click(function(){
              animate($("a",$(this)).attr('rel'),true);
            });
        };
        //$("ol#"+ options.numericId).width($("ol#"+ options.numericId + " li").width() * s);
      }
      if(options.prevnext) {
        $("a","#"+$(this).attr('id')+" #"+options.nextId).click(function(){
          animate("next",true);
        });
        $("a","#"+$(this).attr('id')+" #"+options.prevId).click(function(){
          animate("prev",true);
        });
        $("a","#"+$(this).attr('id')+" #"+options.firstId).click(function(){
          animate("first",true);
        });
        $("a","#"+$(this).attr('id')+" #"+options.lastId).click(function(){
          animate("last",true);
        });
        if(options.allControls){
          $("."+options.numericId+" #"+options.nextId+" a").click(function(){
            animate("next",true);
          });

          $("."+options.numericId+" #"+options.prevId+" a").click(function(){
            animate("prev",true);
          });
        }
      };

      function setCurrent(i){
        i = parseInt(i)+1;
        $('li', "#" + options.numericId).removeClass("current");
        $('li#' + options.numericId + i).addClass("current");
      };
      function setDescription(i){
        i = parseInt(i);
        if(typeof($('#li_description' + i + '.li_description.current').attr('id')) == 'undefined'){
          $('.li_description.current').css('display','none').removeClass("current");
          $('#li_description' + i).css('display','block').addClass("current");


          //$('.li_description.current').fadeOut(options.speed,function(){
          //  $(this).removeClass("current");
          //$('#li_description' + i).fadeIn(options.speed,function(){
          //  $(this).addClass("current");
          //});
          //});
        }
      }

      function adjust(){
        if(!options.vertical) {
          //$("ul",obj).css("margin-left",(t*w*-1));
        } else {
          //$("ul",obj).css("margin-top",(t*h*-1));
        }
        clickable = true;
        if(options.numeric || options.allControls){
          if(options.continuous){
            switch(t){
              case 0: setCurrent(ts);t=ts+1;p=(t*(w+m)*-1);$("ul", obj).css("margin-left", p +"px");break;
              case ts+2: setCurrent(0);t=1;p=(t*(w+m)*-1);$("ul", obj).css("margin-left", p +"px");break;
              default: setCurrent(t-1);break;
            }
          }else{
            setCurrent(t);
          }
        };
      };

      function animate(dir,clicked){
        if (clickable){
          clickable = false;
          var ot = t;
          switch(dir){
            case "next":
              if(options.continuous){
                if(t>=ts+2){
                  t = 0;
                  p = (t*(w+m)*-1);
                  $("ul", obj).css("margin-left", p +"px");
                }else{
                  t = t+1;
                }
              }else{
                t = t>ts ? ts : t+1;
              }
              break;
            case "prev":
              if(options.continuous){
                if(t<=0){
                  t = ts+1;
                  p = (t*(w+m)*-1);
                  $("ul", obj).css("margin-left", p +"px");
                }else{
                  t = t-1;
                }
              }else{
                t = t<=0 ? 0 : t-1;
              }
              break;
              if(options.continuous){
                if(t-1<=0){
                  t = ts+2;
                  p = (t*(w+m)*-1);
                  $("ul", obj).css("margin-left", p +"px");
                  t = ts+1;
                }
              }else{
                t = t<0 ? 0 : t-1;
              }
              break;
            case "first":
              t = 0;
              break;
            case "last":
              t = ts;
              break;
            default:
              t = strToInt(dir);
              if(options.continuous){
                t = t+1;
              }
              break;
          };
          var diff = Math.abs(ot-t);
          var speed = diff*options.speed;
          if(!options.vertical) {
            if(options.rtl){ // if li have float:right (direction:rtl;)
              p = ((s-1)*w - t*w)*-1+ul_ml;
            }else{
              p = (t*(w+m)*-1);
            }
            p = p + ul_ml;
            if(options.li_description){
              if(options.continuous){
                switch(t){
                  case 0: setDescription(ts);break;
                  case ts+2: setDescription(0);break;
                  default: setDescription(t-1);break;
                }
              }else{
                setDescription(t);
              }
            };
            $("ul",obj).animate(
              { marginLeft: p },
              { duration:speed, complete:adjust }
            );
          } else {
            p = (t*h*-1);
            $("ul",obj).animate(
              { marginTop: p },
              { duration:speed, complete:adjust }
            );
          };

          if(!options.continuous && options.controlsFade){
            if(t==ts){
              $("a","#"+options.nextId).hide();
              $("a","#"+options.lastId).hide();
            } else {
              $("a","#"+options.nextId).show();
              $("a","#"+options.lastId).show();
            };
            if(t==0){
              $("a","#"+options.prevId).hide();
              $("a","#"+options.firstId).hide();
            } else {
              $("a","#"+options.prevId).show();
              $("a","#"+options.firstId).show();
            };
          };

          if(clicked) clearTimeout(timeout);
          if(options.auto && dir=="next" && !clicked){;
            timeout = setTimeout(function(){
              animate("next",false);
            },diff*options.speed+options.pause);
          };

        };

        if(options.allControls && !options.continuous){
          if(dir==ts || (dir=='next' && ot+1>=ts)){
            $("."+options.numericId+" #"+options.nextId+" a").addClass('noactive');
          }else{
            $("."+options.numericId+" #"+options.nextId+" a").removeClass('noactive');
          }
          if(dir==0 || (dir=='prev' && ot-1<=0)){
            $("."+options.numericId+" #"+options.prevId+" a").addClass('noactive');
          }else{
            $("."+options.numericId+" #"+options.prevId+" a").removeClass('noactive');
          }
        }
      };
      // init
      var timeout;
      if(options.auto){;
        timeout = setTimeout(function(){
          animate("next",false);
        },options.pause);
      };

      if(options.numeric || options.allControls){
        setCurrent(0);
        if(!options.continuous){
          $("."+options.numericId+" #"+options.prevId+" a").addClass('noactive');
        }
      }
      if(!options.continuous && options.controlsFade){
        $("a","#"+options.prevId).hide();
        $("a","#"+options.firstId).hide();
      };

    });

  };

})(jQuery);



