(function($) {
    var methods = {
        init: function(position) {
            var defaults = {
                width: "auto",
                height: "auto",
                direction: "top",
                scrollDelay: 100,
                scrollAmount: 5,
                circular: true,
                dragAndDrop: true,
                hoverStop: true,
                scrollStop: true,
                startShow: false,
                xml: false,
                touchEvent: true,
                stopOutScreen: false,
                create: function() {},
                moveStart: function() {},
                moveStop: function() {},
                drag: function() {},
                dragStart: function() {
				},
                dragStop: function() {
				},
                wayEnd: function() {},
                removeContentFadeDuration: 20
            };
            if (position) {
                $.extend(defaults, position);
            }
            return this.each(function() {
                var p = $(this).addClass("mWrap");
                var mElIndex = $("*").index($(this));
                p.data().mElIndex = mElIndex;
                var f = function(a, element) {
                    var writeData = a.position();
                    var env = element || $(document);
                    var x2 = env.outerWidth() - (a.position().left + a.outerWidth());
                    var y2 = env.outerHeight() - (a.position().top + a.outerHeight());
                    var data = {
                        right: x2,
                        bottom: y2
                    };
                    $.extend(data, writeData);
                    return data;
                };
                p.data().style = p.attr("style");
                $.extend(defaults, p.data());
                $.extend(p.data(), defaults);
                if (!$(".mMove", p).length) {
                    p.wrapInner('<div class="mMove"></div>');
                }
                var msg = $(".mMove", p);
                p.css({
                    position: "relative",
                    overflow: "hidden",
                    maxWidth: "100%",
                    height: p.data().height,
                    width: p.data().width
                });
                if (p.data().scrollDelay <= 0) {
                    /** @type {number} */
                    p.data().scrollDelay = 85;
                }
                p.data().outerSizeFunc = function($window) {
                    if (p.data().direction === "top" || p.data().direction === "bottom") {
                        return $window.outerHeight();
                    } else {
                        return $window.outerWidth();
                    }
                };
                msg.data().style = msg.attr("style");
                if (!p.data().updateCont) {
                    msg.css({
                        position: "absolute",
                        left: "auto",
                        right: "auto",
                        top: "auto",
                        bottom: "auto",
                        float: "left"
                    });
                }
                p.data().mMove = msg;
                var init = function() {
                    p.data().clickEventFlag = true;
                    if (p.data().outerSizeFunc(msg) > 0) {
                        var $itemP = $(".mItem", p);
                        $itemP.each(function() {
                            $(this).data().style = $(this).attr("style");
                            $(this).css({
                                display: "inline",
                                zoom: 1
                            });
                        });
                        var select = function(direction, obj) {
                            obj.css({
                                paddingLeft: 0,
                                paddingRight: 0,
                                paddingTop: 0,
                                paddingBottom: 0
                            });
                            if (obj.length && !p.data().circular) {
                                var ua = {};
                                var animateSettings = {};
                                ua["padding-" + direction] = p.data().outerSizeFunc(p);
                                animateSettings["padding-" + direction] = 0;
                                obj.css(ua);
                                obj.eq(0).css(animateSettings);
                            }
                        };
                        p.data().splittingString = select;
                        var added = $("<div>").addClass("cloneContent").html(msg.html());
                        if (p.data().direction === "left" || p.data().direction === "right") {
                            msg.css({
                                whiteSpace: "nowrap"
                            });
                            p.data().splittingString("left", $itemP);
                            p.css({
                                minHeight: msg.outerHeight()
                            });
                            added.css({
                                display: "inline-block"
                            });
                            p.data().axis = "hor";
                        } else {
                            msg.css({
                                whiteSpace: "normal"
                            });
                            $itemP.css({
                                display: "block"
                            });
                            p.data().splittingString("top", $itemP);
                            if (p.outerHeight() === 0) {
                                console.log("Set Height Parametr for Plugin newsFlash");
                            }
                            added.css({
                                display: "block"
                            });
                            p.data().axis = "vert";
                        }
                        var _0xbd01x17 = false || document.documentMode;
                        if (_0xbd01x17) {
                            p.add(p.find("*")).attr("unselectable", "on");
                        }
                        var restoreScript = "mousemove." + p.data().mElIndex;
                        var rreturn = "mousedown." + p.data().mElIndex;
                        var r20 = "mouseup." + p.data().mElIndex;
                        var clickEvent = "click." + p.data().mElIndex;
                        p.data({
                            touchScreen: false,
                            teleport: false,
                            dragging: false,
                            pause: false
                        });
                        if ("ontouchstart" in window) {
                            restoreScript = "touchmove." + p.data().mElIndex;
                            rreturn = "touchstart." + p.data().mElIndex;
                            r20 = "touchend." + p.data().mElIndex;
                            p.data().touchScreen = true;
                            if ($(window).width() < 1E3) {
                                p.data().hoverStop = false;
                            }
                        }
                        p.data({
                            moveEvent: restoreScript,
                            mousedownEvent: rreturn,
                            mouseupEvent: r20,
                            clickEvent: clickEvent
                        });
                        var clone = function(deepDataAndEvents) {
                            if (p.data().outerSizeFunc(deepDataAndEvents) !== 0) {
                                if (p.data().outerSizeFunc(deepDataAndEvents) < p.data().outerSizeFunc(p) && p.data().circular) {
                                    added.clone().appendTo(deepDataAndEvents);
                                    p.data().cloneContent(deepDataAndEvents);
                                }
                            } else {
                                console.log("The string is empty or contains invalid style");
                            }
                        };
                        p.data().cloneContent = clone;
                        p.data().cloneContent(msg);
                        var callback = function($callback, t) {
                            if (!p.data().pause) {
                                if ($callback === undefined) {
                                    $callback = p.data().startPos;
                                }
                                if (t === undefined) {
                                    t = p.data().endPos;
                                }
                                if (t !== 0 && t !== -0) {
                                    var n = t - $callback;
                                    if (n < 0) {
                                        n = n * -1;
                                    }
                                    var fade_ms = n * p.data().scrollDelay / p.data().scrollAmount;
                                    var element = {};
                                    var parent = {};
                                    element[p.data().direction] = $callback;
                                    parent[p.data().direction] = t;
                                    msg.css(element);
                                    p.addClass("mIni");
                                    p.data().stopped = false;
                                    if (p.data().moveStart !== undefined) {
                                        p.data().moveStart();
                                    }
                                    msg.stop(true).animate(parent, fade_ms, "linear", function() {
                                        if (p.data().moveStop !== undefined) {
                                            p.data().moveStop();
                                        }
                                        if (p.data().wayEnd !== undefined) {
                                            p.data().wayEnd();
                                        }
                                        p.data().teleport = true;
                                       callback();
                                    });
                                }
                            }
                        };
                        p.data().anim = callback;
                        var check = function() {
                            var $item = msg.clone().addClass("clone").css({
                                position: "absolute",
                                width: "100%",
                                height: "100%",
                                opacity: 0
                            });
                            if (p.data().direction === "top" || p.data().direction === "bottom") {
                                $item.css({
                                    left: 0
                                });
                            } else {
                                $item.css({
                                    top: 0
                                });
                            }
                            var r20 = {};
                            var restoreScript = {};
                            r20[p.data().direction] = "-100%";
                            restoreScript[p.data().direction] = "100%";
                            var exports = $item.clone().addClass("cloneBefore").css(r20).appendTo(msg);
                            var ret = $item.clone().addClass("cloneAfter").css(restoreScript).appendTo(msg);
                            if (p.data().circular) {
                                exports.add(ret).css({
                                    opacity: 1
                                });
                            }
                        };
                        if (p.data().circular) {
                            check();
                        }
                        if (p.data().create !== undefined) {
                            p.data().create();
                        }

                        var onLoad = function() {
                            return f(msg, p)[p.data().direction];
                        };
                        p.data().nowPos = onLoad;

                        var initialize = function(control) {
                            var value = control;
                            if (p.data().touchScreen) {
                                if (control.originalEvent.targetTouches.length === 1) {
                                    value = control.originalEvent.targetTouches[0];
                                }
                            }
                            var intersection = {
                                left: value.pageX,
                                top: value.pageY,
                                right: $(window).width() - value.pageX,
                                bottom: $(window).height() - value.pageY
                            };
                            $.extend(value, intersection);
                            return value;
                        };
                        if (p.data().hoverStop) {
                            p.on("mouseenter." + p.data().mElIndex, function() {
                                p.off("mouseleave." + p.data().mElIndex);
                                if (p.data().dragAndDrop) {
                                    $("html").addClass("grab");
                                }
                                if (!p.data().stopped) {
                                    msg.stop(true);
                                    p.data().stopped = true;
                                    if (p.data().moveStop !== undefined) {
                                        p.data().moveStop();
                                    }
                                }
                                p.on("mouseleave." + p.data().mElIndex, function() {
                                    $(document).off(restoreScript);
                                    $("html").removeClass("grab");
                                    $("html").removeClass("grabbing");
                                    callback(p.data().nowPos());
                                });
                            });
                        }
                        if (!p.data().touchScreen && p.data().dragAndDrop || p.data().touchScreen && p.data().touchEvent) {
                            p.on(rreturn, function(element) {
                                $(document).off(restoreScript);
                                $(document).off(r20);
                                p.off("mouseleave." + p.data().mElIndex);
                                $("html").addClass("grabbing");
                                if (!p.data().stopped) {
                                    msg.stop(true);
                                    p.data().stopped = true;
                                    if (p.data().moveStop !== undefined) {
                                        p.data().moveStop();
                                    }
                                }
                                var right = initialize(element)[p.data().direction];
                                var deltaY = initialize(element).top;
                                var delta = initialize(element).left;
                                var t = 0;
                                var d = 0;
                                var month = 1;
                                $(document).on(restoreScript, function(element) {
                                    p.data().clickEventFlag = false;
                                    p.off("mouseleave." + p.data().mElIndex);
                                    $("html").addClass("grabbing");
                                    if (!p.data().dragging) {
                                        if (p.data().dragStart !== undefined) {
                                            p.data().dragStart();
                                        }
                                        p.data().dragging = true;
                                    }
                                    var year = p.data().nowPos();
                                    if (!p.data().stopped) {
                                        msg.stop(true);
                                        p.data().stopped = true;
                                    }
                                    var left = initialize(element)[p.data().direction];

                                    var loop = function() {
                                        if (left > right) {
                                            month = 1;
                                        }
                                        if (left < right) {
                                            month = -1;
                                        }
                                        var rl = right - left;
                                        right = left;
                                        var r20 = {};
                                        r20[p.data().direction] = "-=" + rl;
                                        if (p.data().circular) {
                                            if (year <= p.data().outerSizeFunc(msg) && !p.data().teleport) {
                                                p.data().teleport = true;
                                            }
                                            if (year <= p.data().outerSizeFunc(p) - p.data().outerSizeFunc(msg) && (month < 0 && p.data().teleport)) {
                                                if (p.data().wayEnd !== undefined) {
                                                    p.data().wayEnd();
                                                }
                                                r20[p.data().direction] = "+=" + p.data().outerSizeFunc(msg);
                                            }
                                            if (year >= 0 && (month > 0 && p.data().teleport)) {
                                                if (p.data().wayEnd !== undefined) {
                                                    p.data().wayEnd();
                                                }
                                                r20[p.data().direction] = "-=" + p.data().outerSizeFunc(msg);
                                            }
                                        } else {
                                            if (year <= -p.data().outerSizeFunc(msg) && month < 0) {
                                                if (p.data().wayEnd !== undefined) {
                                                    p.data().wayEnd();
                                                }
                                                r20[p.data().direction] = "+=" + (p.data().outerSizeFunc(msg) + p.data().outerSizeFunc(p));
                                            }
                                            if (year >= p.data().outerSizeFunc(p) && month > 0) {
                                                if (p.data().wayEnd !== undefined) {
                                                    p.data().wayEnd();
                                                }
                                                r20[p.data().direction] = "-=" + (p.data().outerSizeFunc(msg) + p.data().outerSizeFunc(p));
                                            }
                                        }
                                        if (p.data().drag !== undefined) {
                                            p.data().drag();
                                        }
                                        msg.css(r20);
                                        if (p.data().touchEvent) {
                                            return false;
                                        }
                                    };
                                    if (p.data().axis == "hor") {
                                        var top = initialize(element).top;
                                        var x = initialize(element).left;
                                        var v = Math.abs(top - deltaY);
                                        var chunk = Math.abs(x - delta);
                                        t += v;
                                        d += chunk;
                                        if (t > d) {
                                            $(document).trigger(r20);
                                        } else {
                                            loop();
                                        }
                                    } else {
                                        loop();
                                    }
                                });
                                $(document).on(r20, function(tags) {
                                    if (p.data().dragging) {
                                        if (p.data().dragStop !== undefined) {
                                            p.data().dragStop();
                                        }
                                        p.data().dragging = false;
                                    }
                                    if ($(tags.target).is(p) || $(tags.target).closest(p).length) {
                                        $(document).off(restoreScript);
                                        $("html").removeClass("grabbing");
                                        if (p.data().hoverStop) {
                                            p.trigger("mouseenter." + p.data().mElIndex);
                                        } else {
                                            callback(p.data().nowPos());
                                        }
                                    } else {
                                        $(document).off(restoreScript);
                                        callback(p.data().nowPos());
                                        $("html").removeClass("grab");
                                        $("html").removeClass("grabbing");
                                    }
                                    $(document).off(r20);
                                    setTimeout(function() {
                                        p.data().clickEventFlag = true;
                                    }, 300);
                                });
                                if (!p.data().touchScreen) {
                                    return false;
                                }
                            });
                        }

                        var setup = function(element) {
                            var r20 = element.data().mMove;
                            var elementRect = element.data().outerSizeFunc(element);
                            var endPos = -element.data().outerSizeFunc(r20);
                            element.data().startPos = elementRect;
                            element.data().endPos = endPos;
                            if (element.data().circular) {
                                endPos = -(element.data().outerSizeFunc(r20) + (element.data().outerSizeFunc(r20) - element.data().outerSizeFunc(element)));
                                element.data().endPos = endPos;
                                var which = element.data().startShow ? element.data().outerSizeFunc(r20) : element.data().outerSizeFunc(element) + element.data().outerSizeFunc(r20);
                                callback(which);
                            } else {
                                var restoreScript = element.data().startShow ? 0 : elementRect;
                                callback(restoreScript);
                            }
                        };
                        p.data().getPosition = setup;

                        var compile = function(element) {
                            var r20 = element.data().mMove;
                            var elementRect = element.data().outerSizeFunc(element);
                            var endPos = -element.data().outerSizeFunc(r20);
                            element.data().startPos = elementRect;
                            element.data().endPos = endPos;
                            if (element.data().circular) {
                                endPos = -(element.data().outerSizeFunc(r20) + (element.data().outerSizeFunc(r20) - element.data().outerSizeFunc(element)));
                                element.data().endPos = endPos;
                            }
                        };
                        p.data().setPosition = compile;
                        if (!p.data().updateCont) {
                            p.data().getPosition(p);
                        }
 
                        var play = function() {
                            if (document.hidden) {
                                if (!p.data().stopped) {
                                    msg.stop(true);
                                    p.data().stopped = true;
                                    if (p.data().moveStop !== undefined) {
                                        p.data().moveStop();
                                    }
                                }
                            } else {
                                callback(p.data().nowPos());
                            }
                        };
                        $(document).on("visibilitychange", function() {
                            play();
                        });
                       
                        var clear = function() {};
                        $(window).on("resize." + p.data().mElIndex, function() {
                            clearTimeout(clear);
                            clear = setTimeout(function() {
                                p.newsFlash("resetPosition");
                            }, 300);
                        });

                        var seed = function() {};

                        var load = function() {
                            if (p.data().stopOutScreen) {
                                if (p.offset().top + p.outerHeight() < $(window).scrollTop() || p.offset().top > $(window).scrollTop() + $(window).height()) {
                                    if (!p.data().stopped) {
                                        msg.stop(true);
                                        p.data().stopped = true;
                                        if (p.data().moveStop !== undefined) {
                                            p.data().moveStop();
                                        }
                                    }
                                } else {
                                    callback(p.data().nowPos());
                                }
                            } else {
                                callback(p.data().nowPos());
                            }
                        };
                        $(window).on("scroll." + p.data().mElIndex, function() {
                            if (p.data().scrollStop && !p.data().stopped) {
                                msg.stop(true);
                                p.data().stopped = true;
                                if (p.data().moveStop !== undefined) {
                                    p.data().moveStop();
                                }
                            }
                            clearTimeout(seed);
                            seed = setTimeout(function() {
                                load();
                            }, 100);
                        });
                        p.find("a").on("click", function() {
                            if (!p.data().clickEventFlag) {
                                return false;
                            }
                        });
                        load();
                    } else {
//                         console.log('newsFlash "' + p.attr("class") + '" elements is hidden or missing');
//                         init();
//                         p.newsFlash("stop");
//                         p.newsFlash("removeContent");
                    }
                };
                if (p.data().xml) {
                    $.ajax({
                        url: p.data().xml,
                        dataType: "xml",
                      
                        success: function(status) {
                            var p = $(status).find("item");
                            var jj = p.length;
                            var arg = 0;
                            for (; arg < jj; arg++) {
                                var keyName = p.eq(arg);
                                var r20 = keyName.find("title").text();
                                var _0xbd01x4d = keyName.find("link").text();
                                if (keyName.find("link").length) {
                                    $('<div class="mItem"><a href="' + _0xbd01x4d + '">' + r20 + "</a></div>").appendTo(msg);
                                } else {
                                    $('<div class="mItem">').text(r20).appendTo(msg);
                                }
                            }
                            init();
                        }
                    });
                } else {
                    init();
                }
            });
        },
       
        getContent: function() {
            var p = $(this).data().mMove;
            var content;
            if (!p.is(":empty")) {
                var html = p.html();
                var output = $("<div>").html(html);
                output.find(".clone").remove();
                output.find(".cloneContent").remove();
                content = $.trim(output.html());
            } else {
                content = false;
            }
            return content;
        },
       
        addContent: function(oContent) {
            return this.each(function() {
                var templateSource = $(this);
                var p = templateSource.data().mMove;
               
                var check = function() {
                    if (!templateSource.data().removing) {
                        var id = '<div class="mItem">' + oContent + "</div>";
                        var prefix = templateSource.newsFlash("getContent");
                        var msg = prefix;
                        if (!p.find(".mItem").length && prefix) {
                            prefix = '<div class="mItem">' + prefix + "</div>";
                        }
                        if (oContent) {
                            if (templateSource.data().direction === "left" || templateSource.data().direction === "top") {
                                msg = prefix ? prefix + id : id;
                            }
                            if (templateSource.data().direction === "right" || templateSource.data().direction === "bottom") {
                                msg = prefix ? id + prefix : id;
                            }
                        }
                        templateSource.newsFlash("removeContent");
                      
                        var check = function() {
                            if (!templateSource.data().removing) {
                                p.html(msg);
                                if (prefix) {
                                    templateSource.data().updateCont = true;
                                }
                                templateSource.newsFlash(templateSource.data());
                                if (templateSource.data().updateCont) {
                                    templateSource.data().setPosition(templateSource);
                                    templateSource.data().anim(templateSource.data().nowPos());
                                }
                            } else {
                                setTimeout(function() {
                                    check();
                                }, templateSource.data().removeContentFadeDuration);
                            }
                        };
                        check();
                    } else {
                        setTimeout(function() {
                            check();
                        }, templateSource.data().removeContentFadeDuration);
                    }
                };
                check();
            });
        },

        removeContent: function() {
            return this.each(function() {
                $(this).data().removing = true;
                var p = $(this);
                var data = p.data().mMove;
                data.children().animate({
                    opacity: 0
                }, p.data().removeContentFadeDuration);
                setTimeout(function() {
                    p.data().updateCont = true;
                    if (!p.data().stopped) {
                        data.stop(true);
                        p.data().stopped = true;
                    }
                    p.off("mouseenter." + p.data().mElIndex);
                    p.off("mouseleave." + p.data().mElIndex);
                    p.off($(this).data().mousedownEvent);
                    $(window).off("resize." + p.data().mElIndex);
                    $(window).off("scroll." + p.data().mElIndex);
                    $(document).off(p.data().moveEvent);
                    $(document).off(p.data().mouseupEvent);
                    if (!p.data().stopped) {
                        data.stop(true);
                        p.data().stopped = true;
                    }
                    data.empty();
                    p.data().removing = false;
                }, p.data().removeContentFadeDuration);
            });
        },
        
        changeOptions: function(description) {
            return this.each(function() {
                var x = $(this);
                $.extend(x.data(), description);
                x.newsFlash("destroy");
                x.data().updateCont = false;
                x.newsFlash(x.data());
            });
        },

        destroy: function() {
            var p = $(this);
            var data = p.data().mMove;
            p.removeAttr("style").attr("style", p.data().style);
            if (!p.data().stopped) {
                data.stop(true);
                p.data().stopped = true;
            }
            data.removeAttr("style").attr("style", data.data().style).removeData();
            $(".mItem", p).each(function() {
                $(this).removeAttr("style").attr("style", $(this).data().style).removeData();
            });
            p.off("mouseenter." + p.data().mElIndex);
            p.off("mouseleave." + p.data().mElIndex);
            p.off(p.data().mousedownEvent);
            $(window).off("resize." + p.data().mElIndex);
            $(window).off("scroll." + p.data().mElIndex);
            if (p.data().moveEvent) {
                $(document).off(p.data().moveEvent);
            }
            if (p.data().mouseupEvent) {
                $(document).off(p.data().mouseupEvent);
            }
            $(".clone", p).remove();
            $(".cloneContent", p).remove();
            var r20 = data.html();
            data.remove();
            p.html(r20).removeClass("mIni").css({
                opacity: 1
            });
        },

        stop: function() {
            return this.each(function() {
                var p = $(this);
                if (p.is(".mIni")) {
                    var event = p.data().mMove;
                    if (!p.data().pause) {
                        p.data().pause = true;
                        if (!p.data().stopped) {
                            event.stop(true);
                            p.data().stopped = true;
                            if (p.data().moveStop !== undefined) {
                                p.data().moveStop();
                            }
                        }
                    }
                }
            });
        },

        start: function(encoding) {
            return this.each(function() {
                var templateSource = $(this);
                if (templateSource.data().pause) {
                    var enc = encoding ? encoding : 0;
                    setTimeout(function() {
                        templateSource.data().pause = false;
                        templateSource.data().setPosition(templateSource);
                        templateSource.data().anim(templateSource.data().nowPos());
                        $(window).trigger("scroll." + templateSource.data().mElIndex);
                    }, enc);
                }
            });
        },

        resetPosition: function() {
            return this.each(function() {
                var cache = $(this);
                if (cache.is(":visible")) {
                    var event = cache.data().mMove;
                    if (!cache.data().stopped) {
                        event.stop(true);
                        cache.data().stopped = true;
                    }
                    if (cache.data().direction === "left" || cache.data().direction === "right") {
                        cache.css({
                            minHeight: event.outerHeight()
                        });
                    }
                    cache.data().setPosition(cache);
                    cache.data().anim(cache.data().nowPos());
                    $(window).trigger("scroll." + cache.data().mElIndex);
                }
            });
        }
    };

    $.fn.newsFlash = 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.newsFlash doesn't exist");
            }
        }
    };
})(jQuery);