/*
 * jQuery liMarquee v 4.6
 *
 * Copyright 2013, Linnik Yura | LI MASS CODE | http://masscode.ru
 * http://masscode.ru/index.php/k2/item/44-limarquee
 * Free to use
 *
 * Last Update 20.11.2014
 */
(function ($) {
  var methods = {
    init: function (options) {
      var p = {
        direction: 'left', // Указывает направление движения содержимого контейнера (left | right | up | down)
        loop: -1, // Задает, сколько раз будет прокручиваться содержимое. "-1" для бесконечного воспроизведения движения
        scrolldelay: 0, // Величина задержки в миллисекундах между движениями
        scrollamount: 50, // Скорость движения контента (px/sec)
        circular: true, // Если "true" - строка непрерывная
        drag: true, // Если "true" - включено перетаскивание строки
        runshort: true, // Если "true" - короткая строка тоже "бегает", "false" - стоит на месте
        hoverstop: true, // true - строка останавливается при наведении курсора мыши, false - строка не останавливается
        inverthover: false, // false - стандартное поведение. Если "true" - строка начинает движение только при наведении курсора
        xml: false // Путь к xml файлу с нужным текстом
      }
      if (options) {
        $.extend(p, options)
      }

      return this.each(function () {
        var enterEvent = 'mouseenter'
        var leaveEvent = 'mouseleave'
        if (p.inverthover) {
          enterEvent = 'mouseleave'
          leaveEvent = 'mouseenter'
        }

        var
          loop = p.loop
        var strWrap = $(this).addClass('str_wrap').data({ scrollamount: p.scrollamount })
        var fMove = false

        var strWrapStyle = strWrap.attr('style')

        if (strWrapStyle) {
          var wrapStyleArr = strWrapStyle.split(';')
          var startHeight = false
          for (var i = 0; i < wrapStyleArr.length; i++) {
            var str = $.trim(wrapStyleArr[i])
            var tested = str.search(/^height/g)
            if (tested != -1) {
              startHeight = parseFloat(strWrap.css('height'))
            }
          }
        }

        var code = function () {
          strWrap.off('mouseleave')
          strWrap.off('mouseenter')
          strWrap.off('mousemove')
          strWrap.off('mousedown')
          strWrap.off('mouseup')

          if (!$('.str_move', strWrap).length) {
            strWrap.wrapInner($('<div>').addClass('str_move'))
          }

          var
            strMove = $('.str_move', strWrap).addClass('str_origin')
          var strMoveClone = strMove.clone().removeClass('str_origin').addClass('str_move_clone')
          var time = 0

          if (!p.hoverstop) {
            strWrap.addClass('noStop')
          }

          var circCloneHor = function () {
            strMoveClone.clone().css({
              left: '100%',
              right: 'auto',
              width: strMove.width()
            }).appendTo(strMove)
            strMoveClone.css({
              right: '100%',
              left: 'auto',
              width: strMove.width()
            }).appendTo(strMove)
          }

          var circCloneVert = function () {
            strMoveClone.clone().css({
              top: '100%',
              bottom: 'auto',
              height: strMove.height()
            }).appendTo(strMove)
            strMoveClone.css({
              bottom: '100%',
              top: 'auto',
              height: strMove.height()
            }).appendTo(strMove)
          }

          if (p.direction == 'left') {
            strWrap.height(strMove.outerHeight())
            if (strMove.width() > strWrap.width()) {
              var leftPos = -strMove.width()

              if (p.circular) {
                if (!p.xml) {
                  circCloneHor()
                  leftPos = -(strMove.width() + (strMove.width() - strWrap.width()))
                }
              }
              if (p.xml) {
                strMove.css({
                  left: strWrap.width()
                })
              }
              var
                strMoveLeft = strWrap.width()
              var k1 = 0
              var timeFunc1 = function () {
                var
                  fullS = Math.abs(leftPos)
                var time = (fullS / strWrap.data('scrollamount')) * 1000
                if (parseFloat(strMove.css('left')) != 0) {
                  fullS = (fullS + strWrap.width())
                  time = (fullS - (strWrap.width() - parseFloat(strMove.css('left')))) / strWrap.data('scrollamount') * 1000
                }
                return time
              }
              var moveFuncId1 = false
              var moveFunc1 = function () {
                if (loop != 0) {
                  strMove.stop(true).animate({
                    left: leftPos
                  }, timeFunc1(), 'linear', function () {
                    $(this).css({
                      left: strWrap.width()
                    })
                    if (loop == -1) {
                      moveFuncId1 = setTimeout(moveFunc1, p.scrolldelay)
                    } else {
                      loop--
                      moveFuncId1 = setTimeout(moveFunc1, p.scrolldelay)
                    }
                  })
                }
              }
              strWrap.data({
                moveId: moveFuncId1,
                moveF: moveFunc1
              })
              if (!p.inverthover) {
                moveFunc1()
              }

              if (p.hoverstop) {
                strWrap.on(enterEvent, function () {
                  $(this).addClass('str_active')
                  clearTimeout(moveFuncId1)
                  strMove.stop(true)
                }).on(leaveEvent, function () {
                  $(this).removeClass('str_active')
                  $(this).off('mousemove')
                  moveFunc1()
                })

                if (p.drag) {
                  strWrap.on('mousedown', function (e) {
                    if (p.inverthover) {
                      strMove.stop(true)
                    }
                    // drag
                    var dragLeft
                    var dir = 1
                    var newX
                    var oldX = e.clientX
                    // drag

                    strMoveLeft = strMove.position().left
                    k1 = strMoveLeft - (e.clientX - strWrap.offset().left)

                    $(this).on('mousemove', function (e) {
                      fMove = true

                      // drag
                      newX = e.clientX
                      if (newX > oldX) {
                        dir = 1
                      } else {
                        dir = -1
                      }
                      oldX = newX
                      dragLeft = k1 + (e.clientX - strWrap.offset().left)

                      if (!p.circular) {
                        if (dragLeft < -strMove.width() && dir < 0) {
                          dragLeft = strWrap.width()
                          strMoveLeft = strMove.position().left
                          k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
                        }
                        if (dragLeft > strWrap.width() && dir > 0) {
                          dragLeft = -strMove.width()
                          strMoveLeft = strMove.position().left
                          k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
                        }
                      } else {
                        if (dragLeft < -strMove.width() && dir < 0) {
                          dragLeft = 0
                          strMoveLeft = strMove.position().left
                          k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
                        }
                        if (dragLeft > 0 && dir > 0) {
                          dragLeft = -strMove.width()
                          strMoveLeft = strMove.position().left
                          k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
                        }
                      }

                      strMove.stop(true).css({
                        left: dragLeft
                      })
                      // drag
                    }).on('mouseup', function () {
                      $(this).off('mousemove')
                      if (p.inverthover) {
                        strMove.trigger('mouseenter')
                      }
                      setTimeout(function () {
                        fMove = false
                      }, 50)
                    })
                    return false
                  })
                    .on('click', function () {
                      if (fMove) {
                        return false
                      }
                    })
                } else {
                  strWrap.addClass('no_drag')
                };
              }
            } else {
              if (p.runshort) {
                strMove.css({
                  left: strWrap.width()
                })
                var
                  strMoveLeft = strWrap.width()
                var k1 = 0
                var timeFunc = function () {
                  time = (strMove.width() + strMove.position().left) / strWrap.data('scrollamount') * 1000
                  return time
                }
                var moveFunc = function () {
                  var leftPos = -strMove.width()
                  strMove.animate({
                    left: leftPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      left: strWrap.width()
                    })
                    if (loop == -1) {
                      setTimeout(moveFunc, p.scrolldelay)
                    } else {
                      loop--
                      setTimeout(moveFunc, p.scrolldelay)
                    }
                  })
                }
                strWrap.data({
                  moveF: moveFunc
                })
                if (!p.inverthover) {
                  moveFunc()
                }
                if (p.hoverstop) {
                  strWrap.on(enterEvent, function () {
                    $(this).addClass('str_active')
                    strMove.stop(true)
                  }).on(leaveEvent, function () {
                    $(this).removeClass('str_active')
                    $(this).off('mousemove')
                    moveFunc()
                  })

                  if (p.drag) {
                    strWrap.on('mousedown', function (e) {
                      if (p.inverthover) {
                        strMove.stop(true)
                      }

                      // drag
                      var dragLeft
                      var dir = 1
                      var newX
                      var oldX = e.clientX
                      // drag

                      strMoveLeft = strMove.position().left
                      k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
                      $(this).on('mousemove', function (e) {
                        fMove = true

                        // drag
                        newX = e.clientX
                        if (newX > oldX) {
                          dir = 1
                        } else {
                          dir = -1
                        }
                        oldX = newX
                        dragLeft = k1 + (e.clientX - strWrap.offset().left)

                        if (dragLeft < -strMove.width() && dir < 0) {
                          dragLeft = strWrap.width()
                          strMoveLeft = strMove.position().left
                          k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
                        }
                        if (dragLeft > strWrap.width() && dir > 0) {
                          dragLeft = -strMove.width()
                          strMoveLeft = strMove.position().left
                          k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
                        }

                        strMove.stop(true).css({
                          left: dragLeft
                        })
                      }).on('mouseup', function () {
                        if (p.inverthover) {
                          strMove.trigger('mouseenter')
                        }
                        $(this).off('mousemove')
                        setTimeout(function () {
                          fMove = false
                        }, 50)
                      })
                      return false
                    })
                      .on('click', function () {
                        if (fMove) {
                          return false
                        }
                      })
                  } else {
                    strWrap.addClass('no_drag')
                  };
                }
              } else {
                strWrap.addClass('str_static')
              }
            };
          };
          if (p.direction == 'right') {
            strWrap.height(strMove.outerHeight())
            strWrap.addClass('str_right')
            strMove.css({
              left: -strMove.width(),
              right: 'auto'
            })

            if (strMove.width() > strWrap.width()) {
              var leftPos = strWrap.width()
              strMove.css({
                left: 0
              })
              if (p.circular) {
                if (!p.xml) {
                  circCloneHor()
                  // Определяем крайнюю точку
                  leftPos = strMove.width()
                }
              }

              var
                k2 = 0
              timeFunc = function () {
                var
                  fullS = strWrap.width() // крайняя точка
                var time = (fullS / strWrap.data('scrollamount')) * 1000 // время
                if (parseFloat(strMove.css('left')) != 0) {
                  fullS = (strMove.width() + strWrap.width())
                  time = (fullS - (strMove.width() + parseFloat(strMove.css('left')))) / strWrap.data('scrollamount') * 1000
                }
                return time
              }
              var moveFunc = function () {
                if (loop != 0) {
                  strMove.animate({
                    left: leftPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      left: -strMove.width()
                    })
                    if (loop == -1) {
                      setTimeout(moveFunc, p.scrolldelay)
                    } else {
                      loop--
                      setTimeout(moveFunc, p.scrolldelay)
                    };
                  })
                };
              }
              strWrap.data({
                moveF: moveFunc
              })

              if (!p.inverthover) {
                moveFunc()
              }
              if (p.hoverstop) {
                strWrap.on(enterEvent, function () {
                  $(this).addClass('str_active')
                  strMove.stop(true)
                }).on(leaveEvent, function () {
                  $(this).removeClass('str_active')
                  $(this).off('mousemove')
                  moveFunc()
                })

                if (p.drag) {
                  strWrap.on('mousedown', function (e) {
                    if (p.inverthover) {
                      strMove.stop(true)
                    }

                    // drag
                    var dragLeft
                    var dir = 1
                    var newX
                    var oldX = e.clientX
                    // drag

                    strMoveLeft = strMove.position().left
                    k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
                    $(this).on('mousemove', function (e) {
                      fMove = true

                      // drag
                      newX = e.clientX
                      if (newX > oldX) {
                        dir = 1
                      } else {
                        dir = -1
                      }
                      oldX = newX
                      dragLeft = k2 + (e.clientX - strWrap.offset().left)

                      if (!p.circular) {
                        if (dragLeft < -strMove.width() && dir < 0) {
                          dragLeft = strWrap.width()
                          strMoveLeft = strMove.position().left
                          k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
                        }
                        if (dragLeft > strWrap.width() && dir > 0) {
                          dragLeft = -strMove.width()
                          strMoveLeft = strMove.position().left
                          k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
                        }
                      } else {
                        if (dragLeft < -strMove.width() && dir < 0) {
                          dragLeft = 0
                          strMoveLeft = strMove.position().left
                          k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
                        }
                        if (dragLeft > 0 && dir > 0) {
                          dragLeft = -strMove.width()
                          strMoveLeft = strMove.position().left
                          k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
                        }
                      }

                      strMove.stop(true).css({
                        left: dragLeft
                      })
                    }).on('mouseup', function () {
                      if (p.inverthover) {
                        strMove.trigger('mouseenter')
                      }
                      $(this).off('mousemove')
                      setTimeout(function () {
                        fMove = false
                      }, 50)
                    })
                    return false
                  })
                    .on('click', function () {
                      if (fMove) {
                        return false
                      }
                    })
                } else {
                  strWrap.addClass('no_drag')
                };
              }
            } else {
              if (p.runshort) {
                var k2 = 0
                var timeFunc = function () {
                  time = (strWrap.width() - strMove.position().left) / strWrap.data('scrollamount') * 1000
                  return time
                }
                var moveFunc = function () {
                  var leftPos = strWrap.width()
                  strMove.animate({
                    left: leftPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      left: -strMove.width()
                    })
                    if (loop == -1) {
                      setTimeout(moveFunc, p.scrolldelay)
                    } else {
                      loop--
                      setTimeout(moveFunc, p.scrolldelay)
                    };
                  })
                }

                strWrap.data({
                  moveF: moveFunc
                })

                if (!p.inverthover) {
                  moveFunc()
                }
                if (p.hoverstop) {
                  strWrap.on(enterEvent, function () {
                    $(this).addClass('str_active')
                    strMove.stop(true)
                  }).on(leaveEvent, function () {
                    $(this).removeClass('str_active')
                    $(this).off('mousemove')
                    moveFunc()
                  })

                  if (p.drag) {
                    strWrap.on('mousedown', function (e) {
                      if (p.inverthover) {
                        strMove.stop(true)
                      }

                      // drag
                      var dragLeft
                      var dir = 1
                      var newX
                      var oldX = e.clientX
                      // drag

                      strMoveLeft = strMove.position().left
                      k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
                      $(this).on('mousemove', function (e) {
                        fMove = true

                        // drag
                        newX = e.clientX
                        if (newX > oldX) {
                          dir = 1
                        } else {
                          dir = -1
                        }
                        oldX = newX
                        dragLeft = k2 + (e.clientX - strWrap.offset().left)

                        if (dragLeft < -strMove.width() && dir < 0) {
                          dragLeft = strWrap.width()
                          strMoveLeft = strMove.position().left
                          k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
                        }
                        if (dragLeft > strWrap.width() && dir > 0) {
                          dragLeft = -strMove.width()
                          strMoveLeft = strMove.position().left
                          k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
                        }

                        strMove.stop(true).css({
                          left: dragLeft
                        })
                      }).on('mouseup', function () {
                        if (p.inverthover) {
                          strMove.trigger('mouseenter')
                        }
                        $(this).off('mousemove')
                        setTimeout(function () {
                          fMove = false
                        }, 50)
                      })
                      return false
                    })
                      .on('click', function () {
                        if (fMove) {
                          return false
                        }
                      })
                  } else {
                    strWrap.addClass('no_drag')
                  };
                }
              } else {
                strWrap.addClass('str_static')
              }
            };
          };
          if (p.direction == 'up') {
            strWrap.addClass('str_vertical')

            if (strMove.height() > strWrap.height()) {
              var topPos = -strMove.height()
              if (p.circular) {
                if (!p.xml) {
                  circCloneVert()
                  topPos = -(strMove.height() + (strMove.height() - strWrap.height()))
                }
              }
              if (p.xml) {
                strMove.css({
                  top: strWrap.height()
                })
              }
              var
                k2 = 0
              timeFunc = function () {
                var
                  fullS = Math.abs(topPos)
                var time = (fullS / strWrap.data('scrollamount')) * 1000
                if (parseFloat(strMove.css('top')) != 0) {
                  fullS = (fullS + strWrap.height())
                  time = (fullS - (strWrap.height() - parseFloat(strMove.css('top')))) / strWrap.data('scrollamount') * 1000
                }

                return time
              }
              var moveFunc = function () {
                if (loop != 0) {
                  strMove.animate({
                    top: topPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      top: strWrap.height()
                    })
                    if (loop == -1) {
                      setTimeout(moveFunc, p.scrolldelay)
                    } else {
                      loop--
                      setTimeout(moveFunc, p.scrolldelay)
                    };
                  })
                };
              }

              strWrap.data({
                moveF: moveFunc
              })

              if (!p.inverthover) {
                moveFunc()
              }
              if (p.hoverstop) {
                strWrap.on(enterEvent, function () {
                  $(this).addClass('str_active')
                  strMove.stop(true)
                }).on(leaveEvent, function () {
                  $(this).removeClass('str_active')
                  $(this).off('mousemove')
                  moveFunc()
                })

                if (p.drag) {
                  strWrap.on('mousedown', function (e) {
                    if (p.inverthover) {
                      strMove.stop(true)
                    }

                    // drag
                    var dragTop
                    var dir = 1
                    var newY
                    var oldY = e.clientY
                    // drag

                    strMoveTop = strMove.position().top
                    k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                    $(this).on('mousemove', function (e) {
                      fMove = true

                      // drag
                      newY = e.clientY
                      if (newY > oldY) {
                        dir = 1
                      } else {
                        if (newY < oldY) {
                          dir = -1
                        }
                      }
                      oldY = newY
                      dragTop = k2 + e.clientY - strWrap.offset().top

                      if (!p.circular) {
                        if (dragTop < -strMove.height() && dir < 0) {
                          dragTop = strWrap.height()
                          strMoveTop = strMove.position().top
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                        }
                        if (dragTop > strWrap.height() && dir > 0) {
                          dragTop = -strMove.height()
                          strMoveTop = strMove.position().top
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                        }
                      } else {
                        if (dragTop < -strMove.height() && dir < 0) {
                          dragTop = 0
                          strMoveTop = strMove.position().top
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                        }
                        if (dragTop > 0 && dir > 0) {
                          dragTop = -strMove.height()
                          strMoveTop = strMove.position().top
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                        }
                      }

                      strMove.stop(true).css({
                        top: dragTop
                      })
                      // drag
                    }).on('mouseup', function () {
                      if (p.inverthover) {
                        strMove.trigger('mouseenter')
                      }
                      $(this).off('mousemove')
                      setTimeout(function () {
                        fMove = false
                      }, 50)
                    })
                    return false
                  })
                    .on('click', function () {
                      if (fMove) {
                        return false
                      }
                    })
                } else {
                  strWrap.addClass('no_drag')
                };
              }
            } else {
              if (p.runshort) {
                strMove.css({
                  top: strWrap.height()
                })
                var k2 = 0
                var timeFunc = function () {
                  time = (strMove.height() + strMove.position().top) / strWrap.data('scrollamount') * 1000

                  return time
                }
                var moveFunc = function () {
                  var topPos = -strMove.height()
                  strMove.animate({
                    top: topPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      top: strWrap.height()
                    })
                    if (loop == -1) {
                      setTimeout(moveFunc, p.scrolldelay)
                    } else {
                      loop--
                      setTimeout(moveFunc, p.scrolldelay)
                    };
                  })
                }
                strWrap.data({
                  moveF: moveFunc
                })
                if (!p.inverthover) {
                  moveFunc()
                }
                if (p.hoverstop) {
                  strWrap.on(enterEvent, function () {
                    $(this).addClass('str_active')
                    strMove.stop(true)
                  }).on(leaveEvent, function () {
                    $(this).removeClass('str_active')
                    $(this).off('mousemove')
                    moveFunc()
                  })

                  if (p.drag) {
                    strWrap.on('mousedown', function (e) {
                      if (p.inverthover) {
                        strMove.stop(true)
                      }

                      // drag
                      var dragTop
                      var dir = 1
                      var newY
                      var oldY = e.clientY
                      // drag

                      strMoveTop = strMove.position().top
                      k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                      $(this).on('mousemove', function (e) {
                        fMove = true

                        // drag
                        newY = e.clientY
                        if (newY > oldY) {
                          dir = 1
                        } else {
                          if (newY < oldY) {
                            dir = -1
                          }
                        }
                        oldY = newY
                        dragTop = k2 + e.clientY - strWrap.offset().top

                        if (dragTop < -strMove.height() && dir < 0) {
                          dragTop = strWrap.height()
                          strMoveTop = strMove.position().top
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                        }
                        if (dragTop > strWrap.height() && dir > 0) {
                          dragTop = -strMove.height()
                          strMoveTop = strMove.position().top
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                        }
                        //* drag

                        strMove.stop(true).css({
                          top: dragTop
                        })
                      }).on('mouseup', function () {
                        if (p.inverthover) {
                          strMove.trigger('mouseenter')
                        }
                        $(this).off('mousemove')
                        setTimeout(function () {
                          fMove = false
                        }, 50)
                      })
                      return false
                    })
                      .on('click', function () {
                        if (fMove) {
                          return false
                        }
                      })
                  } else {
                    strWrap.addClass('no_drag')
                  };
                }
              } else {
                strWrap.addClass('str_static')
              }
            };
          };
          if (p.direction == 'down') {
            strWrap.addClass('str_vertical').addClass('str_down')
            strMove.css({
              top: -strMove.height(),
              bottom: 'auto'
            })
            if (strMove.height() > strWrap.height()) {
              var topPos = strWrap.height()
              if (p.circular) {
                if (!p.xml) {
                  circCloneVert()
                  topPos = strMove.height()
                }
              }
              if (p.xml) {
                strMove.css({
                  top: -strMove.height()
                })
              }
              var
                k2 = 0
              timeFunc = function () {
                var
                  fullS = strWrap.height() // крайняя точка
                var time = (fullS / strWrap.data('scrollamount')) * 1000 // время

                if (parseFloat(strMove.css('top')) != 0) {
                  fullS = (strMove.height() + strWrap.height())
                  time = (fullS - (strMove.height() + parseFloat(strMove.css('top')))) / strWrap.data('scrollamount') * 1000
                }
                return time
              }
              var moveFunc = function () {
                if (loop != 0) {
                  strMove.animate({
                    top: topPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      top: -strMove.height()
                    })
                    if (loop == -1) {
                      setTimeout(moveFunc, p.scrolldelay)
                    } else {
                      loop--
                      setTimeout(moveFunc, p.scrolldelay)
                    };
                  })
                };
              }
              strWrap.data({
                moveF: moveFunc
              })
              if (!p.inverthover) {
                moveFunc()
              }
              if (p.hoverstop) {
                strWrap.on(enterEvent, function () {
                  $(this).addClass('str_active')
                  strMove.stop(true)
                }).on(leaveEvent, function () {
                  $(this).removeClass('str_active')
                  $(this).off('mousemove')
                  moveFunc()
                })

                if (p.drag) {
                  strWrap.on('mousedown', function (e) {
                    if (p.inverthover) {
                      strMove.stop(true)
                    }

                    // drag
                    var dragTop
                    var dir = 1
                    var newY
                    var oldY = e.clientY
                    // drag

                    strMoveTop = strMove.position().top
                    k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                    $(this).on('mousemove', function (e) {
                      fMove = true

                      // drag
                      newY = e.clientY
                      if (newY > oldY) {
                        dir = 1
                      } else {
                        if (newY < oldY) {
                          dir = -1
                        }
                      }
                      oldY = newY
                      dragTop = k2 + e.clientY - strWrap.offset().top

                      if (!p.circular) {
                        if (dragTop < -strMove.height() && dir < 0) {
                          dragTop = strWrap.height()
                          strMoveTop = strMove.position().top
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                        }
                        if (dragTop > strWrap.height() && dir > 0) {
                          dragTop = -strMove.height()
                          strMoveTop = strMove.position().top
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                        }
                      } else {
                        if (dragTop < -strMove.height() && dir < 0) {
                          dragTop = 0
                          strMoveTop = strMove.position().top
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                        }
                        if (dragTop > 0 && dir > 0) {
                          dragTop = -strMove.height()
                          strMoveTop = strMove.position().top
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                        }
                      }

                      strMove.stop(true).css({
                        top: dragTop
                      })
                      // drag
                    }).on('mouseup', function () {
                      if (p.inverthover) {
                        strMove.trigger('mouseenter')
                      }
                      $(this).off('mousemove')
                      setTimeout(function () {
                        fMove = false
                      }, 50)
                    })
                    return false
                  })
                    .on('click', function () {
                      if (fMove) {
                        return false
                      }
                    })
                } else {
                  strWrap.addClass('no_drag')
                };
              }
            } else {
              if (p.runshort) {
                var k2 = 0
                var timeFunc = function () {
                  time = (strWrap.height() - strMove.position().top) / strWrap.data('scrollamount') * 1000
                  return time
                }
                var moveFunc = function () {
                  var topPos = strWrap.height()
                  strMove.animate({
                    top: topPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      top: -strMove.height()
                    })
                    if (loop == -1) {
                      setTimeout(moveFunc, p.scrolldelay)
                    } else {
                      loop--
                      setTimeout(moveFunc, p.scrolldelay)
                    };
                  })
                }
                strWrap.data({
                  moveF: moveFunc
                })
                if (!p.inverthover) {
                  moveFunc()
                }
                if (p.hoverstop) {
                  strWrap.on(enterEvent, function () {
                    $(this).addClass('str_active')
                    strMove.stop(true)
                  }).on(leaveEvent, function () {
                    $(this).removeClass('str_active')
                    $(this).off('mousemove')
                    moveFunc()
                  })

                  if (p.drag) {
                    strWrap.on('mousedown', function (e) {
                      if (p.inverthover) {
                        strMove.stop(true)
                      }

                      // drag
                      var dragTop
                      var dir = 1
                      var newY
                      var oldY = e.clientY
                      // drag

                      strMoveTop = strMove.position().top
                      k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                      $(this).on('mousemove', function (e) {
                        fMove = true

                        // drag
                        newY = e.clientY
                        if (newY > oldY) {
                          dir = 1
                        } else {
                          if (newY < oldY) {
                            dir = -1
                          }
                        }
                        oldY = newY
                        dragTop = k2 + e.clientY - strWrap.offset().top

                        if (dragTop < -strMove.height() && dir < 0) {
                          dragTop = strWrap.height()
                          strMoveTop = strMove.position().top
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                        }
                        if (dragTop > strWrap.height() && dir > 0) {
                          dragTop = -strMove.height()
                          strMoveTop = strMove.position().top
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top)
                        }
                        //* drag

                        strMove.stop(true).css({
                          top: dragTop
                        })
                      }).on('mouseup', function () {
                        if (p.inverthover) {
                          strMove.trigger('mouseenter')
                        }
                        $(this).off('mousemove')
                        setTimeout(function () {
                          fMove = false
                        }, 50)
                      })
                      return false
                    })
                      .on('click', function () {
                        if (fMove) {
                          return false
                        }
                      })
                  } else {
                    strWrap.addClass('no_drag')
                  };
                }
              } else {
                strWrap.addClass('str_static')
              }
            };
          };
        }
        if (p.xml) {
          $.ajax({
            url: p.xml,
            dataType: 'xml',
            success: function (xml) {
              var xmlTextEl = $(xml).find('text')
              var xmlTextLength = xmlTextEl.length
              for (var i = 0; i < xmlTextLength; i++) {
                var xmlElActive = xmlTextEl.eq(i)
                var xmlElContent = xmlElActive.text()
                var xmlItemEl = $('<span>').text(xmlElContent).appendTo(strWrap)

                if (p.direction == 'left' || p.direction == 'right') {
                  xmlItemEl.css({ display: 'inline-block', textAlign: 'right' })
                  if (i > 0) {
                    xmlItemEl.css({ width: strWrap.width() + xmlItemEl.width() })
                  }
                }
                if (p.direction == 'down' || p.direction == 'up') {
                  xmlItemEl.css({ display: 'block', textAlign: 'left' })
                  if (i > 0) {
                    xmlItemEl.css({ paddingTop: strWrap.height() })
                  }
                }
              }
              code()
            }
          })
        } else {
          code()
        }
        strWrap.data({
          ini: code,
          startheight: startHeight
        })
      })
    },
    update: function () {
      var el = $(this)
      var str_origin = $('.str_origin', el)
      var str_move_clone = $('.str_move_clone', el)
      str_origin.stop(true)
      str_move_clone.remove()
      el.data('ini')()
    },
    destroy: function () {
      var el = $(this)
      var elMove = $('.str_move', el)
      var startHeight = el.data('startheight')

      $('.str_move_clone', el).remove()
      el.off('mouseenter')
      el.off('mousedown')
      el.off('mouseup')
      el.off('mouseleave')
      el.off('mousemove')
      el.removeClass('noStop').removeClass('str_vertical').removeClass('str_active').removeClass('no_drag').removeClass('str_static').removeClass('str_right').removeClass('str_down')

      var elStyle = el.attr('style')
      if (elStyle) {
        var styleArr = elStyle.split(';')
        for (var i = 0; i < styleArr.length; i++) {
          var str = $.trim(styleArr[i])
          var tested = str.search(/^height/g)
          if (tested != -1) {
            styleArr[i] = ''
          }
        }
        var newArr = styleArr.join(';')
        var newStyle = newArr.replace(/;+/g, ';')

        if (newStyle == ';') {
          el.removeAttr('style')
        } else {
          el.attr('style', newStyle)
        }

        if (startHeight) {
          el.css({ height: startHeight })
        }
      }
      elMove.stop(true)

      if (elMove.length) {
        var context = elMove.html()
        elMove.remove()
        el.html(context)
      }
    },
    pause: function () {
      var el = $(this)
      var elMove = $('.str_move', el)
      elMove.stop(true)
    },
    play: function () {
      var el = $(this)
      $(this).off('mousemove')
      el.data('moveF')()
    }

  }
  $.fn.liMarquee = function (method) {
    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 + ' в jQuery.liMarquee не существует')
    }
  }
})(jQuery)