(function($){
  jQuery.fn.slideEffect = function(Url, pageCount, settings)
  {
    return this.each(function()
    {
      var element = $(this);
	           
      // Return early if this element already has a plugin instance
      if (element.data('slideEffect')) return;
	 
      // pass options to plugin constructor
      var slideEffect = new SlideEffect(this, Url, pageCount, settings);
	 
      // Store plugin object in this element's data
      element.data('slideEffect', slideEffect);
    });
  };
	   
  var SlideEffect = function(element, Url, pageCount, settings){
    var settings = jQuery.extend({
      height: 600,
      activePage: 0,
      admin: 0
    }, settings);
        
    var elem = $(element);
    var obj = this;
    var STATUS_PAGE_LOADING = 0;
    var STATUS_PAGE_LOADED = 1;
		
    var DIRECTION_LEFT = -1;
    var DIRECTION_RIGHT = 1;
    var DIRECTION_NONE = 0;
		
    var idxCenter, idxLeft, idxRight;
    var $centerDiv,$leftDiv,$rightDiv;
    var $cursor;
		
    var direction;
    var width;
        
    var startX;
    var deltaX;
    var deltaAnimate;

    var drag = 0;
    var $paginator;
    var loadedPages = [];
    var mydivs = $();
    
    var fn = {
      showResponse : function(responseText, statusText, xhr, $form) {
        alert(responseText);
      },
      bindEmail : function($page) {
        var options = { 
          resetForm: true,
          success: fn.showResponse
        }; 
        $page.find('*:[id*="slFormDiv"]').submit(function() { 
          $(this).ajaxSubmit(options); 
          return false; 
        });  
      },
      setPosByIndex : function() {
        $(mydivs[idxCenter]).css('left',0);
        if (pageCount > 1) {
          $(mydivs[idxLeft]).css('left',-width);
          $(mydivs[idxRight]).css('left',width);
        }
				
      },
      setNextPageLeft : function(idx) {
        if (pageCount != 2) {
          $(mydivs[idx]).css('left',width);
        }
      },
      setNextPageRight : function(idx) {
        $(mydivs[idx]).css('left',-width);
      },
      getTitle : function(page){
        var title = new String();
        var expr = new RegExp("<title>(.*)</title>" , "im");
        var resArray = expr.exec(page);
        if (resArray != null) {
          return resArray[1];
        } else {
          return '';
        }
      },
      slideLeft: function(){
				
        idxLeft = idxCenter;
        idxCenter = fn.getPageIndex(idxCenter + 1);
        idxRight = fn.getPageIndex(idxRight + 1);
				
        $(mydivs[idxCenter]).css('z-index',2);
        $(mydivs[idxLeft]).css('z-index',1);
        $(mydivs[idxRight]).css('z-index',1);
							
        fn.loadAllPages();
        document.title = fn.getTitle($(mydivs[idxCenter]).html());
        fn.setNextPageLeft(idxRight);
        jQuery.cookie('slider-tip','1');
        $('#popuup_div').hide();
      },
            
      slideRight: function(){
				
        idxRight = idxCenter;
        idxCenter = fn.getPageIndex(idxCenter - 1);
        idxLeft = fn.getPageIndex(idxLeft - 1);

        $(mydivs[idxCenter]).css('z-index',2);
        $(mydivs[idxLeft]).css('z-index',1);
        $(mydivs[idxRight]).css('z-index',1);
			
        fn.loadAllPages();
        document.title = fn.getTitle($(mydivs[idxCenter]).html());
        fn.setNextPageLeft(idxLeft);
        jQuery.cookie('slider-tip','1');
        $('#popuup_div').hide();
      },
      getPageIndex: function(index) {
        var idx = index;
        if (idx < 0 ) {
          idx = pageCount - 1;
        }
        if (idx >= pageCount) {
          idx = 0;
        }
        return parseInt(idx);
      },
      loadAllPages : function() {
        fn.loadPage(idxCenter);
        fn.loadPage(idxLeft);
        fn.loadPage(idxRight);
      },
      loadPage: function(idxPage) {
        var pageUrl;
        if (loadedPages[idxPage] == undefined) {
          loadedPages[idxPage] = STATUS_PAGE_LOADING;
          $(mydivs[idxPage]).html("Страница загружается...");
	
          pageUrl = printf(Url,idxPage);
          $.ajax({
            url: pageUrl,
            dataType: "script",
            success: function(data){
              loadedPages[idxPage] = STATUS_PAGE_LOADED;
              $(mydivs[idxPage]).html(data);
              fn.bindEmail($(mydivs[idxPage]));
              fn.updatePaginator();
              if (idxCenter == idxPage) {
                document.title = fn.getTitle(data);
              }
              if (settings.admin == 1) {
                adm_showCloseButtons($(mydivs[idxPage]));
              }
            }
          });
        }
      },
      updatePaginator : function() {
        var pagintorHtml = "";

        for (i = 0; i < pageCount; i++) {
          if (idxCenter == i) {
            pagintorHtml += '<span class="current">.</span>';
          } else {
            if (loadedPages[i] == undefined
              || loadedPages[i] == STATUS_PAGE_LOADING) {
              pagintorHtml += '<span class="loading">.</span>';
            } else {
              pagintorHtml += '<span>.</span>';
            }

          }
        }
        $('#paginator').html(pagintorHtml);
      },
      preventDefault: function(evt) {
        evt.preventDefault();
      },
      stopAll : function() {
        $(mydivs[idxLeft]).stop(true,true);
        $(mydivs[idxCenter]).stop(true,true);
        $(mydivs[idxRight]).stop(true,true);
      },
      animateAll : function(delta) {
        if (pageCount == 2) {
          $(mydivs[idxCenter]).stop(true,true).animate({
            "left": "+=" + delta
          }, 400);
          $(mydivs[fn.getPageIndex(idxCenter + 1)]).stop(true,true).animate({
            "left": "+=" + delta
          }, 400);
        } else {
          $(mydivs[idxLeft]).stop(true,true).animate({
            "left": "+=" + delta
          }, 400);
          $(mydivs[idxCenter]).stop(true,true).animate({
            "left": "+=" + delta
          }, 400);
          $(mydivs[idxRight]).stop(true,true).animate({
            "left": "+=" + delta
          }, 400);
        }
      },
      animateLeft : function(w) {
        $(mydivs[idxCenter]).stop(true,true).animate({
          "left": "-=" + w
        }, 400);
        $(mydivs[idxRight]).stop(true,true).animate({
          "left": "-=" + w
        }, 400);
      },
      animateRight : function(w) {
        $(mydivs[idxCenter]).stop(true,true).animate({
          "left": "+=" + w
        }, 400);
        $(mydivs[idxLeft]).stop(true,true).animate({
          "left": "+=" + w
        }, 400);
      },
      mousemove: function(e){
				
        $cursor.css('top' , e.pageY);
        $cursor.css('left', e.pageX);
				
        if (!startX) {
          return;
        }
				
        x = e.clientX;
        if (drag == 1) {
          deltaX = x - startX;
        } else {
          deltaX = 0;
        }
        if (Math.abs(deltaX) < 5 ){
          return;
        }
        // console.log("mousemove x="+x+", startX=" + startX);

        if (drag == 1) {
          // console.log("mousemove");
          if (pageCount == 2) {
            if (deltaX > 0) {
              $(mydivs[idxCenter]).css('left', deltaX);
              $(mydivs[fn.getPageIndex(idxCenter + 1)]).css('left', deltaX - width);
            } else {
              $(mydivs[idxCenter]).css('left', deltaX);
              $(mydivs[fn.getPageIndex(idxCenter + 1)]).css('left', width + deltaX);
            }
          } else {
            $(mydivs[idxLeft]).css('left', deltaX - width);
            $(mydivs[idxCenter]).css('left', deltaX);
            $(mydivs[idxRight]).css('left', deltaX + width);
          }
        }
      },
      mousedown: function(e){

        if (pageCount <= 1) {
          return;
        }
        //e.preventDefault();
        //e.stopImmediatePropagation();
				
        startX = e.clientX;
            	
        x = e.clientX;
				
        // console.log("mousedown x="+x+", startX="+startX);
        $(mydivs[idxLeft]).stop();
        $(mydivs[idxCenter]).stop();
        $(mydivs[idxRight]).stop();
        drag = 1;
      },
      mouseover: function() {
      // $cursor.show();
      },
      mouseleave: function(e){
        if (this.id == 'slider') {
          e.preventDefault();
          e.stopImmediatePropagation();
          //$cursor.hide();
          fn.mouseup(e);
        }

      },
      keypress: function(e){
        //console.log(e.keyCode);
        if (e.keyCode == 39 && pageCount > 1) {
          // right
          fn.stopAll();
          $(mydivs[fn.getPageIndex(idxCenter - 1)]).css('left', -width);
          fn.animateRight(width);
          fn.slideRight();
          fn.updatePaginator();
        }
        if (e.keyCode == 37 && pageCount > 1) {
          // left
          fn.stopAll();
          $(mydivs[fn.getPageIndex(idxCenter + 1)]).css('left', width);
          fn.animateLeft(width);
          fn.slideLeft();
          fn.updatePaginator();
        }
      },
      mouseup: function(e){


				
        var dX = deltaX;
				
        if (drag == 1) {
          drag = 0;
          if (dX == 0) {
            return;
          }

					
          direction = DIRECTION_NONE;
          if (Math.abs(dX) >= width * 0.3) {
            if (dX > 0 ) {
              direction = DIRECTION_RIGHT;
            } else {
              direction = DIRECTION_LEFT;
            }
          }
          deltaAnimate = -dX + direction * width;
          fn.animateAll(deltaAnimate);
					
          if (direction == DIRECTION_LEFT) {
            fn.slideLeft();
          }
          if (direction == DIRECTION_RIGHT) {
            fn.slideRight();
          }
          if (direction != DIRECTION_NONE) {
            fn.updatePaginator();
          }
        } else {
          deltaX = 0;
        }
      }
    };
        
    var $this = elem;
    $this.addClass('ui-slide-effect');
    $this.html("");
    width = $this.width();
    // $this.css('height', parseInt(settings.height));

    ch = document.body.clientHeight;
    hTop = $('#idxTop').height();
    hBottom = $('#idxBottom').height();
    hAdm = $('#admPage').height();
    
    $this.after('<div id="paginator" unselectable="on"></div>');
    fn.updatePaginator();
    $paginator = $('#paginator');
    hPaginator = $paginator.height();
    
    settings.height = ch - hTop - hBottom - hAdm - hPaginator - 8;// $this.height();
    // console.log(ch+"-"+hTop+"-"+hBottom+"-"+hAdm+"-"+hPaginator+"-"+settings.height);
    $this.css('height',settings.height);

    for (i =0 ; i < pageCount; i++) {
      $this.append('<div id="slider_page_' + i + '" class="page" unselectable="on"></div>');
      mydivs = mydivs.add($this.children('#slider_page_'+i));
      $(mydivs[i]).css('left',0).css('width',width);
      $(mydivs[i]).css('top',0).css('height',parseInt(settings.height));
      $(mydivs[i]).css('z-index',1);
    }
			
    // $this.append('<div id="paginator" unselectable="on"></div>');
    //$this.after('<div id="paginator" unselectable="on"></div>');
    
    //change cursor
    if ($('#slide-cursor').length == 0)
      $('body').append('<div id="slide-cursor"></div>');
				
    if (!jQuery.cookie('slider-tip') && settings.admin !=1 && pageCount > 1) {
      $this.append('<div id="popuup_div" class="popup_msg"><div class="inner_popup_msg">эту страницу можно листать при помощи мыши<br> и с помощью кнопок "вправо" и "влево".</div></div>');
				
      $('#popuup_div').css('left',width/2-$('#popuup_div').width()/2);
      $('#popuup_div').css("top",settings.height/2 - $('#popuup_div').height()/2);
      $('#popuup_div').show();
    }
				
    $cursor = $('#slide-cursor');
            
           

    //$paginator.css('top', parseInt(settings.height - 30));
    $paginator.css('z-index',3);
    if (typeof(bgbottom) !== 'undefined') {
      $paginator.css('backgroundColor', bgbottom);
    }
    idxCenter = fn.getPageIndex(Number(settings.activePage));
    idxLeft = fn.getPageIndex(idxCenter - 1);
    idxRight = fn.getPageIndex(idxCenter + 1);

    $(mydivs[idxCenter]).css('z-index',2);
			
    if (settings.admin == 1) {
      eval(js.include('js/inc.js'));
      adm_showCloseButtons($('body'));
    }
			
    fn.updatePaginator();
    fn.setPosByIndex();
    fn.loadAllPages();
         	         	
    $(document).bind("keyup", fn.keypress);
         	
    $this.bind("dragstart", fn.preventDefault);
    $this.bind("selectstart", fn.preventDefault);
    $this.bind("mouseup", fn.mouseup);

    $this.bind("mousemove", fn.mousemove);
    $this.bind("mousedown", fn.mousedown); //
    $this.bind("mouseenter", fn.mouseover);
    $this.bind("mouseleave", fn.mouseleave);
        
    return this;
  };
})(jQuery);

