﻿(function() {

    jQuery.fn.rhNav = function(settings) {
        var config = {
            'imghovertag': 'srch'
			, 'imgdowntag': 'srcd'
			, 'linkdowntag': 'classd'
			, 'exacttag': 'downexact'
			, 'starttag': 'downstart'
			, 'usehreftag': 'matchhref'
			, 'blinktag': 'blink'
			, 'blinkdelaytag': 'blinktimer'
			, 'blinkexptimetag': 'blinkexptime'
			, 'blinkcounttag': 'blinkcount'
			, 'blinksettag': 'blinkset'
			, 'blinkpagecounttag': 'blinkpagecount'
			, 'onclick': null
        };

        var prefix = "_rhNv1";

        if (settings) jQuery.extend(config, settings);

        this.each(function() {

            var obj = jQuery(this);
            var l = obj.find("img");
            var h = obj.attr("href");
            var exact = obj.attr(config.exacttag);
            var start = obj.attr(config.starttag);
            var usehref = obj.attr(config.usehreftag);
            var bDown = false;
            var i, ss;
            var date = new Date();
            var func_onclick = config.onclick;

            if (func_onclick) {
                obj.click(function(e) {
                    e.preventDefault();
                    func_onclick(obj);
                });
            }

            if (start) {
                ss = start.split(",");
                for (i = 0; i < ss.length; i++) {
                    bDown |= (location.pathname.match("^" + ss[i]) == ss[i]);
                }
            }

            if (exact) {
                ss = exact.split(",");
                for (i = 0; i < ss.length; i++) {
                    bDown |= (location.pathname == ss[i]);
                }
            }

            if (usehref) bDown = (location.pathname == h);

            if (l.length > 0) {
                l.each(function() {
                    var i = jQuery(this);
                    var s = i.attr("src");
                    var h = i.attr(config.imghovertag);
                    var d = i.attr(config.imgdowntag);
                    var blink = i.attr(config.blinktag);
                    var blinktimer = parseInt(i.attr(config.blinkdelaytag));
                    var blinkexpire = new Date(i.attr(config.blinkexptimetag));
                    var blinkcount = parseInt(i.attr(config.blinkcounttag));
                    var blinkset = i.attr(config.blinksettag);
                    var blinkpagecount = parseInt(i.attr(config.blinkpagecounttag));

                    if (bDown && d) {
                        s = d;
                        i.attr("src", d);
                    }

                    if (blink && !bDown) {
                        jQuery("<img src='" + blink + "' />");
                        if (blink.length > 0) {
                            if (!blinktimer) blinktimer = 500;
                            if (!blinkcount) blinkcount = -1;
                            if (!blinkpagecount) blinkpagecount = -1;
                            if ((date <= blinkexpire) || (isNaN(blinkexpire))) {
                                i.attr(prefix + config.blinkcounttag, "0");
                                var bpc = UpdateBlinkSet(blinkset);
                                if (bpc <= blinkpagecount) setTimeout(function() { navimgBlink(i, s, blink, blinktimer, blinkcount) }, blinktimer);
                            }
                        }
                    }

                    if (!h) return;
                    jQuery("<img src='" + h + "' />");
                    jQuery(this).hover(function() { i.attr("src", h); }, function() { i.attr("src", s); });
                });
            }
            else {

                var d = obj.attr(config.linkdowntag);
                var blink = obj.attr(config.blinktag);
                var blinktimer = parseInt(obj.attr(config.blinkdelaytag));
                var blinkexpire = new Date(obj.attr(config.blinkexptimetag));
                var blinkcount = parseInt(obj.attr(config.blinkcounttag));
                var blinkset = obj.attr(config.blinksettag);
                var blinkpagecount = parseInt(obj.attr(config.blinkpagecounttag));

                if (!d) return;
                if (bDown) obj.addClass(d);

                if (blink && !bDown) {
                    if (blink.length > 0) {
                        if (!blinktimer) blinktimer = 500;
                        if (!blinkcount) blinkcount = -1;
                        if (!blinkpagecount) blinkpagecount = -1;
                        if ((date <= blinkexpire) || (isNaN(blinkexpire))) {
                            obj.attr(prefix + config.blinkcounttag, "0");
                            var bpc = UpdateBlinkSet(blinkset);
                            if (bpc <= blinkpagecount) setTimeout(function() { navlinkBlink(obj, blink, blinktimer, blinkcount) }, blinktimer);
                        }
                    }
                }
            }
        });

        function navimgBlink(object, imgBlinkFrom, imgBlinkTo, blinktimer, blinkcount) {
            var s = object.attr("src");
            var c = parseInt(object.attr(prefix + config.blinkcounttag));
            var bsc;

            if (s == imgBlinkFrom) {
                object.attr("src", imgBlinkTo);
                c = -2;
            }
            else {
                object.attr("src", imgBlinkFrom);
                if (blinkcount == -1) c = -2; else c++;
                object.attr(prefix + config.blinkcounttag, c)
            }

            if (c < blinkcount) setTimeout(function() { navimgBlink(object, imgBlinkFrom, imgBlinkTo, blinktimer, blinkcount) }, blinktimer);
        };

        function navlinkBlink(object, BlinkTo, blinktimer, blinkcount) {
            var c = parseInt(object.attr(prefix + config.blinkcounttag));

            if (!object.hasClass(BlinkTo)) {
                object.addClass(BlinkTo);
                c = -2;
            }
            else {
                object.removeClass(BlinkTo);
                if (blinkcount == -1) c = -2; else c++;
                object.attr(prefix + config.blinkcounttag, c)
            }

            if (c < blinkcount) setTimeout(function() { navlinkBlink(object, BlinkTo, blinktimer, blinkcount) }, blinktimer);
        };

        function UpdateBlinkSet(blinkset) {
            var c = GetBlinkSetCount(blinkset);
            if (c == -2) return -2;

            if ((!c) || (isNaN(c))) c = 0;
            c++;
            jQuery.cookie(prefix + blinkset, c, { path: '/' })
            return c;
        }

        function GetBlinkSetCount(blinkset) {
            if (!jQuery.cookie) return -2;
            if (!blinkset) return -2;
            if (blinkset.length == 0) return -2;
            var c = parseInt(jQuery.cookie(prefix + blinkset));
            if ((!c) || (isNaN(c))) c = 0;
            return c;
        }

        return this;
    };


})(jQuery);

