/*
 * 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,
					strWrap = $(this).addClass('str_wrap').data({scrollamount: p.scrollamount}),
					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'),
						strMoveClone = strMove.clone().removeClass('str_origin').addClass('str_move_clone'),
						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(),
								k1 = 0,
								timeFunc1 = function () {
									var
										fullS = Math.abs(leftPos),
										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;
								},
								moveFuncId1 = false,
								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(),
									k1 = 0,
									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(), //крайняя точка
									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),
									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(), //крайняя точка
									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);