﻿(function($) {
    $.fn.jTypeWriter = function(b) {
        var c, nIntervalCounter, nSequentialCounter, nSequentialCounterInternal, nInterval, nLoopInterval;
        var d = $.extend({}, $.fn.jTypeWriter.defaults, b);
        var e = d.duration * 1000;
        var f = d.type.toLowerCase();
        var g = d.sequential;
        var h = d.onComplete;
        var j = d.text;
        var k = d.loop;
        var l = d.loopDelay;
        var m = (f == "word") ? " " : ".";
        var n = new Array();
        var o = 0;
        for (i = 0; i < this.length; i++) {
            if (j) {
                $(this[i]).text(j)
            }
            if (f == "letter")
                n.push({ obj: $(this[i]), initialText: $(this[i]).text(), code: $(this[i]).html() });
            else
                n.push({ obj: $(this[i]), initialText: $(this[i]).text().split(m), code: $(this[i]).html() });
            if (!g)
                o = n[i].initialText.length > o ? n[i].initialText.length : o;
            else
                o += n[i].code.length; $(this[i]).html("")
        } 
        init();
        function init() {
            c = e / o;
            nIntervalCounter = 0;
            nSequentialCounter = nSequentialCounterInternal = 0;
            nInterval = (!g) ? setInterval(typerSimultaneous, c) : setInterval(typerSequential, c)
        };
        function typerSimultaneous() {
            nIntervalCounter++;
            for (i = 0; i < n.length; i++) {
                var a = n[i];
                if (a.initialText.length >= nIntervalCounter) {
                    if (f == "letter") {
                        a.obj.text(a.initialText.substr(0, nIntervalCounter))
                    }
                    else {
                        a.obj.append(a.initialText[nIntervalCounter - 1]);
                        if (nIntervalCounter < o) {
                            a.obj.append(m)
                        }
                    }
                }
            }
            if (nIntervalCounter >= o) {
                circleEnd()
            }
        };
        function typerSequential() {
            $obj = n[nSequentialCounter];
            if (f == "letter") {
                $obj.obj.html($obj.code.substr(0, ++nSequentialCounterInternal))
            }
            else {
                $obj.obj.append($obj.initialText[nSequentialCounterInternal++]);
                if (nSequentialCounterInternal < $obj.initialText.length)
                    $obj.obj.append(m)
            }

            if (nSequentialCounterInternal >= $obj.code.length + 1) {
                nSequentialCounter++; nSequentialCounterInternal = 0
            }
            nIntervalCounter++;
            if (nIntervalCounter >= o) {
                circleEnd()
            }
        };
        function circleEnd() {
            clearInterval(nInterval);
            if (f != "letter") { }
            if (k) {
                if (l)
                    nLoopInterval = setInterval(loopInterval, l * 1000);
                else newLoop()
            }
            h()
        };
        function newLoop() {
            for (i = 0; i < n.length; i++) {
                n[i].obj.text("")
            }
            init()
        };
        function loopInterval() {
            newLoop();
            clearInterval(nLoopInterval)
        };
        function endEffect() {
            clearInterval(nInterval);
            for (i = 0; i < n.length; i++) {
                n[i].obj.html(n[i].code)
            }
        };
        this.endEffect = endEffect;
        return this
    };
    $.fn.jTypeWriter.defaults = {
        duration: 3, type: "letter",
        sequential: true, 
        onComplete: function() { },
        text: "",
        loop: false,
        loopDelay: 0
    };
    $.fn.jTypeWriter.variables = {
        aObjects: new Array()
    }
})(jQuery);
