jQuery(function () {
    jQuery('#wcmsLogin').click(function () {
        jQuery('html, body').animate({
            scrollTop: 0
        }, 'fast').css("overflow", "hidden");
        overlay = jQuery('<div id="wcmsloginOverlay"></div>').css('display', 'none');
        if (jQuery.browser.webkit) {
            overlay.css('box-shadow', 'inset 0 0 120px rgba(0, 0, 0, .50)');
            overlay.css('background-image', ' -webkit-gradient( linear, left top, left bottom, color-stop(40, rgb(0,0,0,.8)), color-stop(95, rgb(0,0,0,.95))');
        } else if (jQuery.browser.msie) {
            overlay.css('height', jQuery(window).height() + 'px');
            overlay.css('width', jQuery(window).height() + 'px');
        }
        wcmsloginbar = jQuery('<div id="wcmsloginbar"></div>');
        wcmslogin = jQuery('<div id="wcmslogin"><div id="wcmslogintop">Duffers Down Under</div></div>');
        overlay.html(wcmslogin).append(wcmsloginbar).appendTo('body').fadeIn("slow");
    });
})
var Cookie = {
    set: function (name, value, seconds) {
        if (seconds) {
            d = new Date();
            d.setTime(d.getTime() + (seconds * 1000));
            expiry = '; expires=' + d.toGMTString();
        } else
        expiry = '';
        document.cookie = name + "=" + value + expiry + "; path=/";
    },
    get: function (name) {
        nameEQ = name + "=";
        ca = document.cookie.split(';');
        for (i = 0; i < ca.length; i++) {
            c = ca[i];
            while (c.charAt(0) == ' ')
            c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
        }
        return null
    },
    unset: function (name) {
        Cookie.set(name, '', -1);
    }
}

function loadVideo(video, preview, target) {
    target = jQuery("#" + target);
    var player = "/_resources/jwPlayer/player.swf";
    h = jQuery(target).height();
    w = jQuery(target).width();
    var params = {
        wmode: "transparent",
        allowfullscreen: "true"
    };
    var flashvars = {
        file: video,
        fileType: "single",
        repeat: "false",
        autostart: "false",
        fullscreen: "true",
        skin: "",
        controlbar: "none",
        image: preview,
        displayheight: h + "px"
    };
    jQuery(target).flash({
        swf: player,
        height: h,
        width: w,
        flashvars: flashvars,
        params: params
    });
};
(function ($) {
    $.fn.hoverIntent = function (f, g) {
        var cfg = {
            sensitivity: 7,
            interval: 100,
            timeout: 0
        };
        cfg = $.extend(cfg, g ? {
            over: f,
            out: g
        } : f);
        var cX, cY, pX, pY;
        var track = function (ev) {
            cX = ev.pageX;
            cY = ev.pageY;
        };
        var compare = function (ev, ob) {
            ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
            if ((Math.abs(pX - cX) + Math.abs(pY - cY)) < cfg.sensitivity) {
                $(ob).unbind("mousemove", track);
                ob.hoverIntent_s = 1;
                return cfg.over.apply(ob, [ev]);
            } else {
                pX = cX;
                pY = cY;
                ob.hoverIntent_t = setTimeout(function () {
                    compare(ev, ob);
                }, cfg.interval);
            }
        };
        var delay = function (ev, ob) {
            ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
            ob.hoverIntent_s = 0;
            return cfg.out.apply(ob, [ev]);
        };
        var handleHover = function (e) {
            var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
            while (p && p != this) {
                try {
                    p = p.parentNode;
                } catch (e) {
                    p = this;
                }
            }
            if (p == this) {
                return false;
            }
            var ev = jQuery.extend({}, e);
            var ob = this;
            if (ob.hoverIntent_t) {
                ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
            }
            if (e.type == "mouseover") {
                pX = ev.pageX;
                pY = ev.pageY;
                $(ob).bind("mousemove", track);
                if (ob.hoverIntent_s != 1) {
                    ob.hoverIntent_t = setTimeout(function () {
                        compare(ev, ob);
                    }, cfg.interval);
                }
            } else {
                $(ob).unbind("mousemove", track);
                if (ob.hoverIntent_s == 1) {
                    ob.hoverIntent_t = setTimeout(function () {
                        delay(ev, ob);
                    }, cfg.timeout);
                }
            }
        };
        return this.mouseover(handleHover).mouseout(handleHover);
    };
})(jQuery);;
(function ($) {
    var pageTracker;
    $.GaTrackPage = function (account_id) {
        var host = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
        var src = host + 'google-analytics.com/ga.js';
        $.ajax({
            type: 'GET',
            url: src,
            success: function () {
                pageTracker = _gat._getTracker(account_id);
                pageTracker._trackPageview();
            },
            error: function () {
                throw "Unable to load ga.js; _gat has not been defined.";
            },
            dataType: 'script',
            cache: true
        });
    };
    $.GaTrackEvent = function (category, action, label, value) {
        if (typeof pageTracker != undefined) {
            pageTracker._trackEvent(category, action, label, value);
        } else {
            throw "Unable to track event; pageTracker has not been defined";
        }
    };
})(jQuery);;
jQuery.easing['jswing'] = jQuery.easing['swing'];
jQuery.extend(jQuery.easing, {
    def: 'easeOutQuad',
    swing: function (x, t, b, c, d) {
        return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
    },
    easeInQuad: function (x, t, b, c, d) {
        return c * (t /= d) * t + b;
    },
    easeOutQuad: function (x, t, b, c, d) {
        return -c * (t /= d) * (t - 2) + b;
    },
    easeInOutQuad: function (x, t, b, c, d) {
        if ((t /= d / 2) < 1) return c / 2 * t * t + b;
        return -c / 2 * ((--t) * (t - 2) - 1) + b;
    },
    easeInCubic: function (x, t, b, c, d) {
        return c * (t /= d) * t * t + b;
    },
    easeOutCubic: function (x, t, b, c, d) {
        return c * ((t = t / d - 1) * t * t + 1) + b;
    },
    easeInOutCubic: function (x, t, b, c, d) {
        if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;
        return c / 2 * ((t -= 2) * t * t + 2) + b;
    },
    easeInQuart: function (x, t, b, c, d) {
        return c * (t /= d) * t * t * t + b;
    },
    easeOutQuart: function (x, t, b, c, d) {
        return -c * ((t = t / d - 1) * t * t * t - 1) + b;
    },
    easeInOutQuart: function (x, t, b, c, d) {
        if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;
        return -c / 2 * ((t -= 2) * t * t * t - 2) + b;
    },
    easeInQuint: function (x, t, b, c, d) {
        return c * (t /= d) * t * t * t * t + b;
    },
    easeOutQuint: function (x, t, b, c, d) {
        return c * ((t = t / d - 1) * t * t * t * t + 1) + b;
    },
    easeInOutQuint: function (x, t, b, c, d) {
        if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;
        return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;
    },
    easeInSine: function (x, t, b, c, d) {
        return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;
    },
    easeOutSine: function (x, t, b, c, d) {
        return c * Math.sin(t / d * (Math.PI / 2)) + b;
    },
    easeInOutSine: function (x, t, b, c, d) {
        return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;
    },
    easeInExpo: function (x, t, b, c, d) {
        return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;
    },
    easeOutExpo: function (x, t, b, c, d) {
        return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;
    },
    easeInOutExpo: function (x, t, b, c, d) {
        if (t == 0) return b;
        if (t == d) return b + c;
        if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;
        return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;
    },
    easeInCirc: function (x, t, b, c, d) {
        return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;
    },
    easeOutCirc: function (x, t, b, c, d) {
        return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;
    },
    easeInOutCirc: function (x, t, b, c, d) {
        if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;
        return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;
    },
    easeInElastic: function (x, t, b, c, d) {
        var s = 1.70158;
        var p = 0;
        var a = c;
        if (t == 0) return b;
        if ((t /= d) == 1) return b + c;
        if (!p) p = d * .3;
        if (a < Math.abs(c)) {
            a = c;
            var s = p / 4;
        } else
        var s = p / (2 * Math.PI) * Math.asin(c / a);
        return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
    },
    easeOutElastic: function (x, t, b, c, d) {
        var s = 1.70158;
        var p = 0;
        var a = c;
        if (t == 0) return b;
        if ((t /= d) == 1) return b + c;
        if (!p) p = d * .3;
        if (a < Math.abs(c)) {
            a = c;
            var s = p / 4;
        } else
        var s = p / (2 * Math.PI) * Math.asin(c / a);
        return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;
    },
    easeInOutElastic: function (x, t, b, c, d) {
        var s = 1.70158;
        var p = 0;
        var a = c;
        if (t == 0) return b;
        if ((t /= d / 2) == 2) return b + c;
        if (!p) p = d * (.3 * 1.5);
        if (a < Math.abs(c)) {
            a = c;
            var s = p / 4;
        } else
        var s = p / (2 * Math.PI) * Math.asin(c / a);
        if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
        return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b;
    },
    easeInBack: function (x, t, b, c, d, s) {
        if (s == undefined) s = 1.70158;
        return c * (t /= d) * t * ((s + 1) * t - s) + b;
    },
    easeOutBack: function (x, t, b, c, d, s) {
        if (s == undefined) s = 1.70158;
        return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
    },
    easeInOutBack: function (x, t, b, c, d, s) {
        if (s == undefined) s = 1.70158;
        if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;
        return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;
    },
    easeInBounce: function (x, t, b, c, d) {
        return c - jQuery.easing.easeOutBounce(x, d - t, 0, c, d) + b;
    },
    easeOutBounce: function (x, t, b, c, d) {
        if ((t /= d) < (1 / 2.75)) {
            return c * (7.5625 * t * t) + b;
        } else if (t < (2 / 2.75)) {
            return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;
        } else if (t < (2.5 / 2.75)) {
            return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;
        } else {
            return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;
        }
    },
    easeInOutBounce: function (x, t, b, c, d) {
        if (t < d / 2) return jQuery.easing.easeInBounce(x, t * 2, 0, c, d) * .5 + b;
        return jQuery.easing.easeOutBounce(x, t * 2 - d, 0, c, d) * .5 + c * .5 + b;
    }
});;;
(function ($) {
    $.fn.fixPNG = function () {
        return this.each(function () {
            var image = $(this).css('backgroundImage');
            if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) {
                image = RegExp.$1;
                $(this).css({

                    'backgroundImage': 'none',
                    'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=" + ($(this).css('backgroundRepeat') == 'no-repeat' ? 'crop' : 'scale') + ", src='" + image + "')"
                }).each(function () {
                    var position = $(this).css('position');
                    if (position != 'absolute' && position != 'relative') $(this).css('position', 'relative');
                });
            }
        });
    };
    var elem, opts, busy = false,
        imagePreloader = new Image,
        loadingTimer, loadingFrame = 1,
        imageRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i;
    var isIE = ($.browser.msie && parseInt($.browser.version.substr(0, 1)) < 8);
    $.fn.fancybox = function (settings) {
        settings = $.extend({}, $.fn.fancybox.defaults, settings);
        var matchedGroup = this;

        function _initialize() {
            elem = this;
            opts = settings;
            _start();
            return false;
        };

        function _start() {
            if (busy) return;
            if ($.isFunction(opts.callbackOnStart)) {
                opts.callbackOnStart();
            }
            opts.itemArray = [];
            opts.itemCurrent = 0;
            if (settings.itemArray.length > 0) {
                opts.itemArray = settings.itemArray;
            } else {
                var item = {};
                if (!elem.rel || elem.rel == '') {
                    var item = {
                        href: elem.href,
                        title: elem.title
                    };
                    if ($(elem).children("img:first").length) {
                        item.orig = $(elem).children("img:first");
                    }
                    opts.itemArray.push(item);
                } else {
                    var subGroup = $(matchedGroup).filter("a[rel=" + elem.rel + "]");
                    var item = {};
                    for (var i = 0; i < subGroup.length; i++) {
                        item = {
                            href: subGroup[i].href,
                            title: subGroup[i].title
                        };
                        if ($(subGroup[i]).children("img:first").length) {
                            item.orig = $(subGroup[i]).children("img:first");
                        }
                        opts.itemArray.push(item);
                    }
                    while (opts.itemArray[opts.itemCurrent].href != elem.href) {
                        opts.itemCurrent++;
                    }
                }
            }
            if (opts.overlayShow) {
                if (isIE) {
                    $('embed, object, select').css('visibility', 'hidden');
                }
                $("#fancy_overlay").css('opacity', opts.overlayOpacity).show();
            }
            _change_item();
        };

        function _change_item() {
            $("#fancy_right, #fancy_left, #fancy_close, #fancy_title").hide();
            var href = opts.itemArray[opts.itemCurrent].href;
            if (href.match(/#/)) {
                var target = window.location.href.split('#')[0];
                target = href.replace(target, '');
                target = target.substr(target.indexOf('#'));
                _set_content('<div id="fancy_div">' + $(target).html() + '</div>', opts.frameWidth, opts.frameHeight);
            } else if (href.match(imageRegExp)) {
                imagePreloader = new Image;
                imagePreloader.src = href;
                if (imagePreloader.complete) {
                    _proceed_image();
                } else {
                    $.fn.fancybox.showLoading();
                    $(imagePreloader).unbind().bind('load', function () {
                        $(".fancy_loading").hide();
                        _proceed_image();
                    });
                }
            } else if (href.match("iframe") || elem.className.indexOf("iframe") >= 0) {
                _set_content('<iframe id="fancy_frame" onload="jQuery.fn.fancybox.showIframe()" name="fancy_iframe' + Math.round(Math.random() * 1000) + '" frameborder="0" hspace="0" src="' + href + '"></iframe>', opts.frameWidth, opts.frameHeight);
            } else {
                $.get(href, function (data) {
                    _set_content('<div id="fancy_ajax">' + data + '</div>', opts.frameWidth, opts.frameHeight);
                });
            }
        };

        function _proceed_image() {
            if (opts.imageScale) {
                var w = $.fn.fancybox.getViewport();
                var r = Math.min(Math.min(w[0] - 36, imagePreloader.width) / imagePreloader.width, Math.min(w[1] - 60, imagePreloader.height) / imagePreloader.height);
                var width = Math.round(r * imagePreloader.width);
                var height = Math.round(r * imagePreloader.height);
            } else {
                var width = imagePreloader.width;
                var height = imagePreloader.height;
            }
            _set_content('<img alt="" id="fancy_img" src="' + imagePreloader.src + '" />', width, height);
        };

        function _preload_neighbor_images() {
            if ((opts.itemArray.length - 1) > opts.itemCurrent) {
                var href = opts.itemArray[opts.itemCurrent + 1].href;
                if (href.match(imageRegExp)) {
                    objNext = new Image();
                    objNext.src = href;
                }
            }
            if (opts.itemCurrent > 0) {
                var href = opts.itemArray[opts.itemCurrent - 1].href;
                if (href.match(imageRegExp)) {
                    objNext = new Image();
                    objNext.src = href;
                }
            }
        };

        function _set_content(value, width, height) {
            busy = true;
            var pad = opts.padding;
            if (isIE) {
                $("#fancy_content")[0].style.removeExpression("height");
                $("#fancy_content")[0].style.removeExpression("width");
            }
            if (pad > 0) {
                width += pad * 2;
                height += pad * 2;
                $("#fancy_content").css({
                    'top': pad + 'px',
                    'right': pad + 'px',
                    'bottom': pad + 'px',
                    'left': pad + 'px',
                    'width': 'auto',
                    'height': 'auto'
                });
                if (isIE) {
                    $("#fancy_content")[0].style.setExpression('height', '(this.parentNode.clientHeight - 20)');
                    $("#fancy_content")[0].style.setExpression('width', '(this.parentNode.clientWidth - 20)');
                }
            } else {
                $("#fancy_content").css({
                    'top': 0,
                    'right': 0,
                    'bottom': 0,
                    'left': 0,
                    'width': '100%',
                    'height': '100%'
                });
            }
            if ($("#fancy_outer").is(":visible") && width == $("#fancy_outer").width() && height == $("#fancy_outer").height()) {
                $("#fancy_content").fadeOut("fast", function () {
                    $("#fancy_content").empty().append($(value)).fadeIn("normal", function () {
                        _finish();
                    });
                });
                return;
            }
            var w = $.fn.fancybox.getViewport();
            var itemLeft = (width + 36) > w[0] ? w[2] : (w[2] + Math.round((w[0] - width - 36) / 2));
            var itemTop = (height + 50) > w[1] ? w[3] : (w[3] + Math.round((w[1] - height - 50) / 2));
            var itemOpts = {
                'left': itemLeft,
                'top': itemTop,
                'width': width + 'px',
                'height': height + 'px'
            };
            if ($("#fancy_outer").is(":visible")) {
                $("#fancy_content").fadeOut("normal", function () {
                    $("#fancy_content").empty();
                    $("#fancy_outer").animate(itemOpts, opts.zoomSpeedChange, opts.easingChange, function () {
                        $("#fancy_content").append($(value)).fadeIn("normal", function () {
                            _finish();
                        });
                    });
                });
            } else {
                if (opts.zoomSpeedIn > 0 && opts.itemArray[opts.itemCurrent].orig !== undefined) {
                    $("#fancy_content").empty().append($(value));
                    var orig_item = opts.itemArray[opts.itemCurrent].orig;
                    var orig_pos = $.fn.fancybox.getPosition(orig_item);
                    $("#fancy_outer").css({
                        'left': (orig_pos.left - 18) + 'px',
                        'top': (orig_pos.top - 18) + 'px',
                        'width': $(orig_item).width(),
                        'height': $(orig_item).height()
                    });
                    if (opts.zoomOpacity) {
                        itemOpts.opacity = 'show';
                    }
                    $("#fancy_outer").animate(itemOpts, opts.zoomSpeedIn, opts.easingIn, function () {
                        _finish();
                    });
                } else {
                    $("#fancy_content").hide().empty().append($(value)).show();
                    $("#fancy_outer").css(itemOpts).fadeIn("normal", function () {
                        _finish();
                    });
                }
            }
        };

        function _set_navigation() {
            if (opts.itemCurrent != 0) {
                $("#fancy_left, #fancy_left_ico").unbind().bind("click", function (e) {
                    e.stopPropagation();
                    opts.itemCurrent--;
                    _change_item();
                    return false;
                });
                $("#fancy_left").show();
            }
            if (opts.itemCurrent != (opts.itemArray.length - 1)) {
                $("#fancy_right, #fancy_right_ico").unbind().bind("click", function (e) {
                    e.stopPropagation();
                    opts.itemCurrent++;
                    _change_item();
                    return false;
                });
                $("#fancy_right").show();
            }
        };

        function _finish() {
            _set_navigation();
            _preload_neighbor_images();
            $(document).keydown(function (e) {
                if (e.keyCode == 27) {
                    $.fn.fancybox.close();
                    $(document).unbind("keydown");
                } else if (e.keyCode == 37 && opts.itemCurrent != 0) {
                    opts.itemCurrent--;
                    _change_item();
                    $(document).unbind("keydown");
                } else if (e.keyCode == 39 && opts.itemCurrent != (opts.itemArray.length - 1)) {
                    opts.itemCurrent++;
                    _change_item();
                    $(document).unbind("keydown");
                }
            });
            if (opts.centerOnScroll) {
                $(window).bind("resize scroll", $.fn.fancybox.scrollBox);
            } else {
                $("div#fancy_outer").css("position", "absolute");
            }
            if (opts.hideOnContentClick) {
                $("#fancy_wrap").click($.fn.fancybox.close);
            }
            $("#fancy_overlay, #fancy_close").bind("click", $.fn.fancybox.close);
            $("#fancy_close").show();
            if (opts.itemArray[opts.itemCurrent].title !== undefined && opts.itemArray[opts.itemCurrent].title.length > 0) {
                $('#fancy_title div').html(opts.itemArray[opts.itemCurrent].title);
                $('#fancy_title').show();
            }
            if (opts.overlayShow && isIE) {
                $('embed, object, select', $('#fancy_content')).css('visibility', 'visible');
            }
            if ($.isFunction(opts.callbackOnShow)) {
                opts.callbackOnShow();
            }
            busy = false;
        };
        return this.unbind('click').click(_initialize);
    };
    $.fn.fancybox.scrollBox = function () {
        var pos = $.fn.fancybox.getViewport();
        $("#fancy_outer").css('left', (($("#fancy_outer").width() + 36) > pos[0] ? pos[2] : pos[2] + Math.round((pos[0] - $("#fancy_outer").width() - 36) / 2)));
        $("#fancy_outer").css('top', (($("#fancy_outer").height() + 50) > pos[1] ? pos[3] : pos[3] + Math.round((pos[1] - $("#fancy_outer").height() - 50) / 2)));
    };
    $.fn.fancybox.getNumeric = function (el, prop) {
        return parseInt($.curCSS(el.jquery ? el[0] : el, prop, true)) || 0;
    };
    $.fn.fancybox.getPosition = function (el) {
        var pos = el.offset();
        pos.top += $.fn.fancybox.getNumeric(el, 'paddingTop');
        pos.top += $.fn.fancybox.getNumeric(el, 'borderTopWidth');
        pos.left += $.fn.fancybox.getNumeric(el, 'paddingLeft');
        pos.left += $.fn.fancybox.getNumeric(el, 'borderLeftWidth');
        return pos;
    };
    $.fn.fancybox.showIframe = function () {
        $(".fancy_loading").hide();
        $("#fancy_frame").show();
    };
    $.fn.fancybox.getViewport = function () {
        return [$(window).width(), $(window).height(), $(document).scrollLeft(), $(document).scrollTop()];
    };
    $.fn.fancybox.animateLoading = function () {
        if (!$("#fancy_loading").is(':visible')) {
            clearInterval(loadingTimer);
            return;
        }
        $("#fancy_loading > div").css('top', (loadingFrame * -40) + 'px');
        loadingFrame = (loadingFrame + 1) % 12;
    };
    $.fn.fancybox.showLoading = function () {
        clearInterval(loadingTimer);
        var pos = $.fn.fancybox.getViewport();
        $("#fancy_loading").css({
            'left': ((pos[0] - 40) / 2 + pos[2]),
            'top': ((pos[1] - 40) / 2 + pos[3])
        }).show();
        $("#fancy_loading").bind('click', $.fn.fancybox.close);
        loadingTimer = setInterval($.fn.fancybox.animateLoading, 66);
    };
    $.fn.fancybox.close = function () {
        busy = true;
        $(imagePreloader).unbind();
        $("#fancy_overlay, #fancy_close").unbind();
        if (opts.hideOnContentClick) {
            $("#fancy_wrap").unbind();
        }
        $("#fancy_close, .fancy_loading, #fancy_left, #fancy_right, #fancy_title").hide();
        if (opts.centerOnScroll) {
            $(window).unbind("resize scroll");
        }
        __cleanup = function () {
            $("#fancy_overlay, #fancy_outer").hide();
            if (opts.centerOnScroll) {
                $(window).unbind("resize scroll");
            }
            if (isIE) {
                $('embed, object, select').css('visibility', 'visible');
            }
            if ($.isFunction(opts.callbackOnClose)) {
                opts.callbackOnClose();
            }
            busy = false;
        };
        if ($("#fancy_outer").is(":visible") !== false) {
            if (opts.zoomSpeedOut > 0 && opts.itemArray[opts.itemCurrent].orig !== undefined) {
                var orig_item = opts.itemArray[opts.itemCurrent].orig;
                var orig_pos = $.fn.fancybox.getPosition(orig_item);
                var itemOpts = {
                    'left': (orig_pos.left - 18) + 'px',
                    'top': (orig_pos.top - 18) + 'px',
                    'width': $(orig_item).width(),
                    'height': $(orig_item).height()
                };
                if (opts.zoomOpacity) {
                    itemOpts.opacity = 'hide';
                }
                $("#fancy_outer").stop(false, true).animate(itemOpts, opts.zoomSpeedOut, opts.easingOut, __cleanup);
            } else {
                $("#fancy_outer").stop(false, true).fadeOut("fast", __cleanup);
            }
        } else {
            __cleanup();
        }
        return false;
    };
    $.fn.fancybox.build = function () {
        var html = '';
        html += '<div id="fancy_overlay"></div>';
        html += '<div id="fancy_wrap">';
        html += '<div class="fancy_loading" id="fancy_loading"><div></div></div>';
        html += '<div id="fancy_outer">';
        html += '<div id="fancy_inner">';
        html += '<div id="fancy_close"></div>';
        html += '<div id="fancy_bg"><div class="fancy_bg fancy_bg_n"></div><div class="fancy_bg fancy_bg_ne"></div><div class="fancy_bg fancy_bg_e"></div><div class="fancy_bg fancy_bg_se"></div><div class="fancy_bg fancy_bg_s"></div><div class="fancy_bg fancy_bg_sw"></div><div class="fancy_bg fancy_bg_w"></div><div class="fancy_bg fancy_bg_nw"></div></div>';
        html += '<a href="javascript:;" id="fancy_left"><span class="fancy_ico" id="fancy_left_ico"></span></a><a href="javascript:;" id="fancy_right"><span class="fancy_ico" id="fancy_right_ico"></span></a>';
        html += '<div id="fancy_content"></div>';
        html += '<div id="fancy_title"></div>';
        html += '</div>';
        html += '</div>';
        html += '</div>';
        $(html).appendTo("body");
        $('<table cellspacing="0" cellpadding="0" border="0"><tr><td class="fancy_title" id="fancy_title_left"></td><td class="fancy_title" id="fancy_title_main"><div></div></td><td class="fancy_title" id="fancy_title_right"></td></tr></table>').appendTo('#fancy_title');
        if (isIE) {
            $("#fancy_inner").prepend('<iframe class="fancy_bigIframe" scrolling="no" frameborder="0"></iframe>');
            $("#fancy_close, .fancy_bg, .fancy_title, .fancy_ico").fixPNG();
        }
    };
    $.fn.fancybox.defaults = {
        padding: 10,
        imageScale: true,
        zoomOpacity: false,
        zoomSpeedIn: 0,
        zoomSpeedOut: 0,
        zoomSpeedChange: 300,
        easingIn: 'swing',
        easingOut: 'swing',
        easingChange: 'swing',
        frameWidth: 425,
        frameHeight: 355,
        overlayShow: true,
        overlayOpacity: 0.3,
        hideOnContentClick: true,
        centerOnScroll: true,
        itemArray: [],
        callbackOnStart: null,
        callbackOnShow: null,
        callbackOnClose: null
    };
    $(document).ready(function () {
        $.fn.fancybox.build();
    });
})(jQuery);;
(function ($) {
    $.fn.imageZoom = function (settings) {
        var config = {
            size: 750,
            aClass: "zoomlink",
            zoomiconClass: "zoomicon",
            imageRoot: "/media2/images/",
            group: false,
            padding: 10,
            imageScale: true,
            zoomOpacity: false,
            zoomSpeedIn: 300,
            zoomSpeedOut: 300,
            zoomSpeedChange: 300,
            easingIn: 'jswing',
            easingOut: 'jswing',
            easingChange: 'swing',
            frameWidth: 425,
            frameHeight: 355,
            overlayShow: true,
            overlayOpacity: 0.3,
            hideOnContentClick: true,
            centerOnScroll: true,
            itemArray: [],
            callbackOnStart: null,
            callbackOnShow: null,
            callbackOnClose: null
        };
        if (settings) $.extend(config, settings);
        this.each(function () {
            if ($(this).parents("a").length == 0) {
                l = $(this).attr('src').split("/");
                if (("/" + l[1] + "/" + l[2] + "/") != config.imageRoot) {
                    return this;
                }
                l.reverse();
                n = config.imageRoot + config.size + "/" + l[1] + "/" + l[0];
                jQuery("<img>").attr("src", n);
                t = $(this).attr('title');
                h = ($(this).height() + parseFloat($(this).css('border-top-width')) + parseFloat($(this).css('border-bottom-width')) + parseFloat($(this).css('padding-top')) + parseFloat($(this).css('padding-bottom'))) + 'px';
                w = ($(this).width() + parseFloat($(this).css('border-right-width')) + parseFloat($(this).css('border-left-width')) + parseFloat($(this).css('padding-right')) + parseFloat($(this).css('padding-left'))) + 'px';
                f = $(this).css('float');
                if (f == "none") {
                    dis = "block";
                } else {
                    dis = "inline";
                }
                zi = '<span class="' + config.zoomiconClass + '">Zoom Image</span>';
                mtop = parseFloat($(this).css('margin-top')) || 0;;
                mright = parseFloat($(this).css('margin-right')) || 0;
                mbottom = parseFloat($(this).css('margin-bottom')) || 0;
                mleft = parseFloat($(this).css('margin-left')) || 0;
                $(this).css({
                    margin: '0px'
                });
                $(this).wrap("<a></a>").parent().css({
                    width: w,
                    height: h,
                    display: dis,
                    marginTop: mtop + 'px',
                    marginRight: mright + 'px',
                    marginBottom: mbottom + 'px',
                    marginLeft: mleft + 'px',
                    position: 'relative',
                    display: 'block',
                    textDecoration: 'none',
                    float: f
                })
                $(this).parent().attr("href", n).attr("title", t).addClass(config.aClass);
                if (config.group) $(this).parent().attr("rel", config.group);
                $(this).after(zi);
                var isIE = ($.browser.msie && parseInt($.browser.version.substr(0, 1)) < 8);
                if (isIE) {
                    $("span." + config.zoomiconClass).show().fixPNG();
                }
            }
        });
        $('a.' + config.aClass).fancybox({
            padding: config.padding,
            imageScale: config.imageScale,
            zoomOpacity: config.zoomOpacity,
            zoomSpeedIn: config.zoomSpeedIn,
            zoomSpeedOut: config.zoomSpeedOut,
            zoomSpeedChange: config.zoomSpeedChange,
            easingIn: config.easingIn,
            easingOut: config.easingOut,
            easingChange: config.easingChange,
            frameWidth: config.frameWidth,
            frameHeight: config.frameHeight,
            overlayShow: config.overlayShow,
            overlayOpacity: config.overlayOpacity,
            hideOnContentClick: config.hideOnContentClick,
            centerOnScroll: config.centerOnScroll,
            itemArray: config.itemArray,
            callbackOnStart: config.callbackOnStart,
            callbackOnShow: config.callbackOnShow,
            callbackOnClose: config.callbackOnClose
        });
        return this;
    };
})(jQuery);;
(function ($) {
    $.fn.imageScan = function (settings) {
        var config = {
            maxframes: 10,
            filmstripPath: "/modules/Gallery/filmstrip2.php",
            galleryPath: "/modules/Gallery/FlashGallery.php",
            loader: "/_resources/images/loading_CCCCCC.gif",
            loaderBG: "#CCCCCC",
            padding: 10,
            imageScale: true,
            zoomOpacity: false,
            zoomSpeedIn: 300,
            zoomSpeedOut: 300,
            zoomSpeedChange: 300,
            easingIn: 'jswing',
            easingOut: 'jswing',
            easingChange: 'swing',
            frameWidth: 752,
            frameHeight: 547,
            overlayShow: true,
            overlayOpacity: 0.7,
            hideOnContentClick: false,
            centerOnScroll: true,
            itemArray: [],
            callbackOnStart: null,
            callbackOnShow: null,
            callbackOnClose: null
        }
        if (settings) $.extend(config, settings);
        this.each(function () {
            this.config = config;
            this.bt = parseFloat($(this).css('border-top-width'));
            this.bl = parseFloat($(this).css('border-left-width'));
            this.film = (parseFloat($(this).attr('rel')) <= config.maxframes) ? parseFloat($(this).attr('rel')) : config.maxframes;
            this.frame = 0;
            this.current = 0;
            this.galid = $(this).attr("id").substring(6);
            this.factor = $(this).width() / this.film;
            this.bgimage = config.filmstripPath + "?id=" + this.galid + "&w=" + $(this).width() + "&h=" + $(this).height()
            this.img = new Image();
            var scanner = this;
            $(this).css('backgroundPosition', "center center").css("background-image", "url(" + config.loader + ")").css("background-color", config.loaderBG);
            $(this.img).load(function () {
                $(scanner).css('backgroundPosition', "0px 0px").css("background-image", "url(" + scanner.bgimage + ")");
                $(scanner).closest('a').attr("href", config.galleryPath + "?id=" + scanner.galid)
                $(scanner).mousemove(function (e) {
                    var x = e.pageX - $(scanner).offset().left - scanner.bl;
                    var y = e.pageY - $(scanner).offset().top - scanner.bt;
                    scanner.frame = Math.floor(x / scanner.factor) % scanner.film;
                    if (scanner.current != scanner.frame) {
                        var pos = "" + "-" + ($(scanner).width() * scanner.frame) - $(scanner).width() + "px 0px";
                        $(scanner).css('backgroundPosition', pos);
                        scanner.current = scanner.frame;
                    }
                });
                $(scanner).mouseout(function (e) {
                    $(scanner).css('backgroundPosition', "0px 0px");
                });
                var windowheight = $(window).height();
                if (windowheight < 650) {
                    url = $(scanner).parent().attr('href');
                    $(scanner).click(function (event) {
                        event.preventDefault();
                        window.open(url, "gallery", "height=547,width=752,status=no,toolbar=no,menubar=no,location=no");
                    })
                } else {
                    $(scanner).parent().fancybox({
                        padding: scanner.config.padding,
                        imageScale: scanner.config.imageScale,
                        zoomOpacity: scanner.config.zoomOpacity,
                        zoomSpeedIn: scanner.config.zoomSpeedIn,
                        zoomSpeedOut: scanner.config.zoomSpeedOut,
                        zoomSpeedChange: scanner.config.zoomSpeedChange,
                        easingIn: scanner.config.easingIn,
                        easingOut: scanner.config.easingOut,
                        easingChange: scanner.config.easingChange,
                        frameWidth: scanner.config.frameWidth,
                        frameHeight: scanner.config.frameHeight,
                        overlayShow: scanner.config.overlayShow,
                        overlayOpacity: scanner.config.overlayOpacity,
                        hideOnContentClick: scanner.config.hideOnContentClick,
                        centerOnScroll: scanner.config.centerOnScroll,
                        itemArray: scanner.config.itemArray,
                        callbackOnStart: scanner.config.callbackOnStart,
                        callbackOnShow: scanner.config.callbackOnShow,
                        callbackOnClose: scanner.config.callbackOnClose
                    })
                }
            }).attr('src', this.bgimage);
        });
        return this;
    };
})(jQuery);;
jQuery.fn.crossSlide = function (opts, plan) {
    var self = this,
        self_width = this.width(),
        self_height = this.height();

    function format(str) {
        for (var i = 1; i < arguments.length; i++)
        str = str.replace(new RegExp('\\{' + (i - 1) + '}', 'g'), arguments[i]);
        return str;
    }

    function abort() {
        arguments[0] = 'crossSlide: ' + arguments[0];
        throw format.apply(null, arguments);
    }(function (proceed) {
        var n_loaded = 0;

        function loop(i, img) {
            img.onload = function (e) {
                n_loaded++;
                plan[i].width = img.width;
                plan[i].height = img.height;
                if (n_loaded == plan.length) proceed();
            }
            img.src = plan[i].src;
            if (i + 1 < plan.length) loop(i + 1, new Image());
        }
        loop(0, new Image());
    })(function () {
        function parse_position_param(param) {
            var zoom = 1;
            var tokens = param.replace(/^\s*|\s*$/g, '').split(/\s+/);
            if (tokens.length > 3) throw new Error();
            if (tokens[0] == 'center') if (tokens.length == 1) tokens = ['center', 'center'];
            else if (tokens.length == 2 && tokens[1].match(/^[\d.]+x$/i)) tokens = ['center', 'center', tokens[1]];
            if (tokens.length == 3) zoom = parseFloat(tokens[2].match(/^([\d.]+)x$/i)[1]);
            var pos = tokens[0] + ' ' + tokens[1];
            if (pos == 'left top' || pos == 'top left') return {
                xrel: 0,
                yrel: 0,
                zoom: zoom
            };
            if (pos == 'left center' || pos == 'center left') return {
                xrel: 0,
                yrel: .5,
                zoom: zoom
            };
            if (pos == 'left bottom' || pos == 'bottom left') return {
                xrel: 0,
                yrel: 1,
                zoom: zoom
            };
            if (pos == 'center top' || pos == 'top center') return {
                xrel: .5,
                yrel: 0,
                zoom: zoom
            };
            if (pos == 'center center') return {
                xrel: .5,
                yrel: .5,
                zoom: zoom
            };
            if (pos == 'center bottom' || pos == 'bottom center') return {
                xrel: .5,
                yrel: 1,
                zoom: zoom
            };
            if (pos == 'right top' || pos == 'top right') return {
                xrel: 1,
                yrel: 0,
                zoom: zoom
            };
            if (pos == 'right center' || pos == 'center right') return {
                xrel: 1,
                yrel: .5,
                zoom: zoom
            };
            if (pos == 'right bottom' || pos == 'bottom right') return {
                xrel: 1,
                yrel: 1,
                zoom: zoom
            };
            return {
                xrel: parseInt(tokens[0].match(/^(\d+)%$/)[1]) / 100,
                yrel: parseInt(tokens[1].match(/^(\d+)%$/)[1]) / 100,
                zoom: zoom
            };
        }

        function position_to_css(p, phase) {
            switch (phase) {
            case 1:
                var pos = 0;
                break;
            case 2:
                var pos = fade_ms / (p.time_ms + 2 * fade_ms);
                break;
            case 3:
                var pos = 1 - fade_ms / (p.time_ms + 2 * fade_ms);
                break;
            case 4:
                var pos = 1;
                break;
            }
            return {
                left: Math.round(p.from.left + pos * (p.to.left - p.from.left)),
                top: Math.round(p.from.top + pos * (p.to.top - p.from.top)),
                width: Math.round(p.from.width + pos * (p.to.width - p.from.width)),
                height: Math.round(p.from.height + pos * (p.to.height - p.from.height))
            };
        }
        if (!opts.fade) abort('missing fade parameter.');
        if (opts.speed && opts.sleep) abort('you cannot set both speed and sleep at the same time.');
        var fade_ms = Math.round(opts.fade * 1000);
        if (opts.sleep) var sleep = Math.round(opts.sleep * 1000);
        if (opts.speed) var speed = opts.speed / 1000,
            fade_px = Math.round(fade_ms * speed);
        self.empty().css({
            overflow: 'hidden',
            padding: 0
        });
        if (!/^(absolute|relative|fixed)$/.test(self.css('position'))) self.css({
            position: 'relative'
        });
        if (!self.width() || !self.height()) abort('container element does not have its own width and height');
        if (opts.shuffle) plan.sort(function () {
            return Math.random() - 0.5;
        });
        for (var i = 0; i < plan.length; ++i) {
            var p = plan[i];
            if (!p.src) abort('missing src parameter in picture {0}.', i + 1);
            if (speed) {
                switch (p.dir) {
                case 'up':
                    p.from = {
                        xrel: .5,
                        yrel: 0,
                        zoom: 1
                    };
                    p.to = {
                        xrel: .5,
                        yrel: 1,
                        zoom: 1
                    };
                    var slide_px = p.height - self_height - 2 * fade_px;
                    break;
                case 'down':
                    p.from = {
                        xrel: .5,
                        yrel: 1,
                        zoom: 1
                    };
                    p.to = {
                        xrel: .5,
                        yrel: 0,
                        zoom: 1
                    };
                    var slide_px = p.height - self_height - 2 * fade_px;
                    break;
                case 'left':
                    p.from = {
                        xrel: 0,
                        yrel: .5,
                        zoom: 1
                    };
                    p.to = {
                        xrel: 1,
                        yrel: .5,
                        zoom: 1
                    };
                    var slide_px = p.width - self_width - 2 * fade_px;
                    break;
                case 'right':
                    p.from = {
                        xrel: 1,
                        yrel: .5,
                        zoom: 1
                    };
                    p.to = {
                        xrel: 0,
                        yrel: .5,
                        zoom: 1
                    };
                    var slide_px = p.width - self_width - 2 * fade_px;
                    break;
                default:
                    abort('missing or malformed "dir" parameter in picture {0}.', i + 1);
                }
                if (slide_px <= 0) abort('picture number {0} is too short for the desired fade duration.', i + 1);
                p.time_ms = Math.round(slide_px / speed);
            } else if (!sleep) {
                if (!p.from || !p.to || !p.time) abort('missing either speed/sleep option, or from/to/time params in picture {0}.', i + 1);
                try {
                    p.from = parse_position_param(p.from)
                } catch (e) {
                    abort('malformed "from" parameter in picture {0}.', i + 1);
                }
                try {
                    p.to = parse_position_param(p.to)
                } catch (e) {
                    abort('malformed "to" parameter in picture {0}.', i + 1);
                }
                if (!p.time) abort('missing "time" parameter in picture {0}.', i + 1);
                p.time_ms = Math.round(p.time * 1000)
            }
            if (p.from) jQuery.each([p.from, p.to], function (i, from_to) {
                from_to.width = Math.round(p.width * from_to.zoom);
                from_to.height = Math.round(p.height * from_to.zoom);
                from_to.left = Math.round((self_width - from_to.width) * from_to.xrel);
                from_to.top = Math.round((self_height - from_to.height) * from_to.yrel);
            });
            var elm;
            if (p.href) elm = jQuery(format('<a href="{0}"><img src="{1}"/></a>', p.href, p.src));
            else
            elm = jQuery(format('<img src="{0}"/>', p.src));
            if (p.onclick) elm.click(p.onclick);
            if (p.alt) elm.find('img').attr('alt', p.alt);
            elm.appendTo(self);
        }
        speed = undefined;
        var imgs = self.find('img').css({
            position: 'absolute',
            visibility: 'hidden',
            top: 0,
            left: 0,
            border: 0
        });
        imgs.eq(0).css({
            visibility: 'visible'
        });
        if (!sleep) imgs.eq(0).css(position_to_css(plan[0], 2));
        var countdown = opts.loop;

        function create_chain(i, chainf) {
            if (i % 2 == 0) {
                if (sleep) {
                    var i_sleep = i / 2,
                        i_hide = (i_sleep - 1 + plan.length) % plan.length,
                        img_sleep = imgs.eq(i_sleep),
                        img_hide = imgs.eq(i_hide);
                    var newf = function () {
                        img_hide.css('visibility', 'hidden');
                        setTimeout(chainf, sleep);
                    };
                } else {
                    var i_slide = i / 2,
                        i_hide = (i_slide - 1 + plan.length) % plan.length,
                        img_slide = imgs.eq(i_slide),
                        img_hide = imgs.eq(i_hide),
                        time = plan[i_slide].time_ms,
                        slide_anim = position_to_css(plan[i_slide], 3);
                    var newf = function () {
                        img_hide.css('visibility', 'hidden');
                        img_slide.animate(slide_anim, time, 'linear', chainf);
                    };
                }
            } else {
                if (sleep) {
                    var i_from = Math.floor(i / 2),
                        i_to = Math.ceil(i / 2) % plan.length,
                        img_from = imgs.eq(i_from),
                        img_to = imgs.eq(i_to),
                        from_anim = {},
                        to_init = {
                            visibility: 'visible'
                        },
                        to_anim = {};
                    if (i_to > i_from) {
                        to_init.opacity = 0;
                        to_anim.opacity = 1;
                    } else {
                        from_anim.opacity = 0;
                    }
                    var newf = function () {
                        img_to.css(to_init);
                        if (from_anim.opacity != undefined) img_from.animate(from_anim, fade_ms, 'linear', chainf);
                        else
                        img_to.animate(to_anim, fade_ms, 'linear', chainf);
                    };
                } else {
                    var i_from = Math.floor(i / 2),
                        i_to = Math.ceil(i / 2) % plan.length,
                        img_from = imgs.eq(i_from),
                        img_to = imgs.eq(i_to),
                        from_anim = position_to_css(plan[i_from], 4),
                        to_init = position_to_css(plan[i_to], 1),
                        to_anim = position_to_css(plan[i_to], 2);
                    if (i_to > i_from) {
                        to_init.opacity = 0;
                        to_anim.opacity = 1;
                    } else {
                        from_anim.opacity = 0;
                    }
                    to_init.visibility = 'visible';
                    var newf = function () {
                        img_from.animate(from_anim, fade_ms, 'linear');
                        img_to.css(to_init);
                        img_to.animate(to_anim, fade_ms, 'linear', chainf);
                    };
                }
            }
            if (opts.loop && i == plan.length * 2 - 2) {
                var newf_orig = newf;
                newf = function () {
                    if (--countdown) newf_orig();
                }
            }
            if (i > 0) return create_chain(i - 1, newf);
            else
            return newf;
        }
        var animation = create_chain(plan.length * 2 - 1, function () {
            return animation();
        });
        animation();
    });
    return self;
};;
var Validate = {
    msg: {
        email: "Please provide a valid email address",
        phone: "Please provide a valid phone number",
        required: "This field is required and can not be left blank.",
        date: "Please provide a valid Date",
        number: "Please provide a valid number",
        digits: "Field can only contain valid didgits 1-9",
        zip: "Incorrect US or Canadian Postal Code Format",
        zipcode: "Incorrect US Zip Code Format",
        postalcode: "Incorrect Canadian Postal Code Format",
        ccard: "Please provide a valid Credit Card number",
        select: "Please select an option",
        checkbox: "Please select an option"
    },
    format: {
        datestring: "dddd, MMMM d, yyyy"
    },
    form: function (form, auto) {
        jQuery(form).submit(function (event) {
            Validate._form(this, event);
        });
        if (auto !== false) {
            Validate._auto(jQuery(form));
        }
        if (google.loader.ClientLocation) {
            jQuery(form).find(":input").each(function (event) {
                if (google.loader.ClientLocation.address.country_code) {
                    if (jQuery(this).hasClass("country") && jQuery(this).hasClass("autoselect")) {
                        v = google.loader.ClientLocation.address.country_code.toLowerCase();
                        if (jQuery('#' + jQuery(this).attr('id') + ' option[value=' + v + ']').length > 0) jQuery(this).val(v);
                    }
                }
                if (google.loader.ClientLocation.address.region) {
                    if (jQuery(this).hasClass("region") && jQuery(this).hasClass("autoselect")) {
                        v = google.loader.ClientLocation.address.region.toLowerCase();
                        if (jQuery('#' + jQuery(this).attr('id') + ' option[value=' + v + ']').length > 0) jQuery(this).val(v);
                    }
                }
                if (google.loader.ClientLocation.address.city) {
                    if (jQuery(this).hasClass("city") && jQuery(this).hasClass("autoselect")) {
                        jQuery(this).val(google.loader.ClientLocation.address.city.toLowerCase())
                    }
                }
            });
        }
    },
    _form: function (form, event) {
        isvalid = true;
        jQuery(form).find(":input").each(function (event) {
            if (jQuery(this).hasClass("required") && jQuery(this).val() != "" && !jQuery(this).hasClass("ccard")) {
                Cookie.set(jQuery(this).attr('id'), jQuery(this).val());
            }
            if (jQuery(this).hasClass("required")) {
                Validate.field(this, event);
            }
        });
        if (isvalid) {
            if (jQuery(form).hasClass("ajax")) {
                event.preventDefault();
                formgoal = jQuery(form).find('input.formgoal').val() || false;
                var url = jQuery(form).attr("action");
                var pars = jQuery(form).serialize();
                jQuery.ajax({
                    type: "POST",
                    url: url,
                    data: pars,
                    success: function (msg) {
                        jQuery(form).html(msg);
                        Validate._trackGoal(formgoal);
                        jQuery.scrollTo(jQuery(form), 800, {
                            offset: {
                                top: -50,
                                left: 0
                            }
                        });
                    }
                });
            } else {
                return true
            }
        } else {
            event.preventDefault();
        }
    },
    _auto: function (form) {
        jQuery(form).find(":input").each(function (i) {
            if (jQuery(this).hasClass("required")) {
                jQuery(this).blur(function (event) {
                    Validate.field(jQuery(this), event);
                }).change(function (event) {
                    Validate.field(jQuery(this), event);
                })
            }
        });
    },
    field: function (field, event) {
        jQuery(field).closest("div.thefield").find('span.error').remove();
        if (jQuery(field).get(0).nodeName.toLowerCase() == "select") {
            Validate.select(jQuery(field).get(0)) ? Validate._pass(field, null, event) : Validate._fail(field, Validate.msg.select);
        } else if (jQuery(field).attr("type").toLowerCase() == "checkbox") {
            Validate.checkbox(jQuery(field).get(0)) ? Validate._pass(field, null, event) : Validate._fail(field, Validate.msg.checkbox);
        } else if (jQuery(field).hasClass("email")) {
            Validate.email(jQuery(field).val()) ? Validate._pass(field, null, event) : Validate._fail(field, Validate.msg.email);
        } else if (jQuery(field).hasClass('url')) {
            Validate.url(jQuery(field).val()) ? Validate._pass(field, null, event) : Validate._fail(field, Validate.msg.url);
        } else if (jQuery(field).hasClass('phone')) {
            Validate.phone(jQuery(field).val()) ? Validate._pass(field, null, event) : Validate._fail(field, Validate.msg.phone);
        } else if (jQuery(field).hasClass('number')) {
            Validate.number(jQuery(field).val()) ? Validate._pass(field, null, event) : Validate._fail(field, Validate.msg.number);
        } else if (jQuery(field).hasClass('digits')) {
            Validate.digits(jQuery(field).val()) ? Validate._pass(field, null, event) : Validate._fail(field, Validate.msg.digits);
        } else if (jQuery(field).hasClass('date')) {
            if (Validate.date(jQuery(field).val(), event)) {
                val = jQuery(field).val();
                dateval = Date.today().isBefore(Date.parse(val)) ? Date.parse(val) : Date.parse(val).add(1).years();
                format = jQuery(field).attr('accept') || Validate.format.datestring;
                val = dateval.toString(format)
                Validate._pass(field, val, event);
            } else {
                Validate._fail(field, Validate.msg.date);
            }
        } else if (jQuery(field).hasClass('zip')) {
            Validate.zip(jQuery(field).val()) ? Validate._pass(field, null, event) : Validate._fail(field, Validate.msg.zip);
        } else if (jQuery(field).hasClass('ccard')) {
            Validate._pass(field);
            if (!Validate.ccard(jQuery(field).val())) {
                Validate._fail(field, Validate.msg.ccard);
            }
        } else {
            Validate.required(jQuery(field).val()) ? Validate._pass(field, null, event) : Validate._fail(field, Validate.msg.required);
        }
    },
    select: function (element) {
        return element.selectedIndex > 0
    },
    checkbox: function (element) {
        isvalid = false;
        selector = "input[name='" + jQuery(element).attr("name") + "']";
        jQuery(element).closest("div.fieldwrapper").find(selector).each(function () {
            if (isvalid == false) isvalid = this.checked;
        });
        return isvalid;
    },
    required: function (value) {
        return value.length > 0;
    },
    email: function (value) {
        return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
    },
    url: function (value) {
        return /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
    },
    number: function (value) {
        return /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
    },
    digits: function (value) {
        return /^\d+$/.test(value);
    },
    phone: function (value) {
        var validNum = /^[\(]?(\d{0,3})[\)]?[\s]?[\-]?(\d{3})[\s]?[\-]?(\d{4})[\s]?[x]?(\d*)$/;
        return (validNum.test(value))
    },
    date: function (value) {
        return Date.parse(value);
    },
    zipcode: function (zipcode) {
        if (!(zipcode.length == 5)) return false;
        if (!Validate.digits(zipcode)) return false;
        return true;
    },
    postalcode: function (postalcode) {
        if (postalcode.length == 6 && postalcode.search(/^[a-zA-Z]\d[a-zA-Z]\d[a-zA-Z]\d$/) != -1) return true;
        else if (postalcode.length == 7 && postalcode.search(/^[a-zA-Z]\d[a-zA-Z](-|\s)\d[a-zA-Z]\d$/) != -1) return true;
        else
        return false;
    },
    zip: function (zip) {
        if (Validate.zipcode(zip) == false && Validate.postalcode(zip) == false) return false;
        return true;
    },
    creditcard: function (value) {
        if (/[^0-9-]+/.test(value)) return false;
        var nCheck = 0,
            nDigit = 0,
            bEven = false;
        value = value.replace(/\D/g, "");
        for (n = value.length - 1; n >= 0; n--) {
            var cDigit = value.charAt(n);
            var nDigit = parseInt(cDigit, 10);
            if (bEven) {
                if ((nDigit *= 2) > 9) nDigit -= 9;
            }
            nCheck += nDigit;
            bEven = !bEven;
        }
        return (nCheck % 10) == 0;
    },
    _titleCase: function (element) {
        jQuery(element).val(jQuery(element).attr('value').toTitleCase())
    },
    _trackGoal: function (goal) {
        try {
            if (pageTracker && formgoal != false) {
                pageTracker._trackPageview(goal);
            }
        } catch (err) {}
    },
    _pass: function (element, value, event) {
        if (event.type == "blur" && value != null) jQuery(element).val(value);
        if (jQuery(element).hasClass("titleCase")) Validate._titleCase(element);
        jQuery(element).closest("div.fieldwrapper").addClass("pass").removeClass("alert");
    },
    _fail: function (element, msg) {
        var msg = jQuery(element).attr('rel') || msg;
        jQuery(element).closest("div.fieldwrapper").addClass("alert").removeClass("pass");
        jQuery(element).closest("div.thefield").append('<span class="error">' + msg + '</span>');
        isvalid = false;
    }
}
String.prototype.toTitleCase = function () {
    return this.replace(/([\w&`'''"".@:\/\{\(\[<>_]+-? *)/g, function (match, p1, index, title) {
        if (index > 0 && title.charAt(index - 2) !== ":" && match.search(/^(a(nd?|s|t)?|b(ut|y)|en|for|i[fn]|o[fnr]|t(he|o)|vs?\.?|via)[ \-]/i) > -1) return match.toLowerCase();
        if (title.substring(index - 1, index + 1).search(/['"_{(\[]/) > -1) return match.charAt(0) + match.charAt(1).toUpperCase() + match.substr(2);
        if (match.substr(1).search(/[A-Z]+|&|[\w]+[._][\w]+/) > -1 || title.substring(index - 1, index + 1).search(/[\])}]/) > -1) return match;
        return match.charAt(0).toUpperCase() + match.substr(1);
    });
};
String.prototype.trim = function () {
    return this.replace(/^\s+|\s+$/g, "");
};
Date.CultureInfo = {
    name: "en-US",
    englishName: "English (United States)",
    nativeName: "English (United States)",
    dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
    abbreviatedDayNames: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
    shortestDayNames: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
    firstLetterDayNames: ["S", "M", "T", "W", "T", "F", "S"],
    monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
    abbreviatedMonthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
    amDesignator: "AM",
    pmDesignator: "PM",
    firstDayOfWeek: 0,
    twoDigitYearMax: 2029,
    dateElementOrder: "mdy",
    formatPatterns: {
        shortDate: "M/d/yyyy",
        longDate: "dddd, MMMM dd, yyyy",
        shortTime: "h:mm tt",
        longTime: "h:mm:ss tt",
        fullDateTime: "dddd, MMMM dd, yyyy h:mm:ss tt",
        sortableDateTime: "yyyy-MM-ddTHH:mm:ss",
        universalSortableDateTime: "yyyy-MM-dd HH:mm:ssZ",
        rfc1123: "ddd, dd MMM yyyy HH:mm:ss GMT",
        monthDay: "MMMM dd",
        yearMonth: "MMMM, yyyy"
    },
    regexPatterns: {
        jan: /^jan(uary)?/i,
        feb: /^feb(ruary)?/i,
        mar: /^mar(ch)?/i,
        apr: /^apr(il)?/i,
        may: /^may/i,
        jun: /^jun(e)?/i,
        jul: /^jul(y)?/i,
        aug: /^aug(ust)?/i,
        sep: /^sep(t(ember)?)?/i,
        oct: /^oct(ober)?/i,
        nov: /^nov(ember)?/i,
        dec: /^dec(ember)?/i,
        sun: /^su(n(day)?)?/i,
        mon: /^mo(n(day)?)?/i,
        tue: /^tu(e(s(day)?)?)?/i,
        wed: /^we(d(nesday)?)?/i,
        thu: /^th(u(r(s(day)?)?)?)?/i,
        fri: /^fr(i(day)?)?/i,
        sat: /^sa(t(urday)?)?/i,
        future: /^next/i,
        past: /^last|past|prev(ious)?/i,
        add: /^(\+|aft(er)?|from|hence)/i,
        subtract: /^(\-|bef(ore)?|ago)/i,
        yesterday: /^yes(terday)?/i,
        today: /^t(od(ay)?)?/i,
        tomorrow: /^tom(orrow)?/i,
        now: /^n(ow)?/i,
        millisecond: /^ms|milli(second)?s?/i,
        second: /^sec(ond)?s?/i,
        minute: /^mn|min(ute)?s?/i,
        hour: /^h(our)?s?/i,
        week: /^w(eek)?s?/i,
        month: /^m(onth)?s?/i,
        day: /^d(ay)?s?/i,
        year: /^y(ear)?s?/i,
        shortMeridian: /^(a|p)/i,
        longMeridian: /^(a\.?m?\.?|p\.?m?\.?)/i,
        timezone: /^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\s*(\+|\-)\s*\d\d\d\d?)|gmt|utc)/i,
        ordinalSuffix: /^\s*(st|nd|rd|th)/i,
        timeContext: /^\s*(\:|a(?!u|p)|p)/i
    },
    timezones: [{
        name: "UTC",
        offset: "-000"
    }, {
        name: "GMT",
        offset: "-000"
    }, {
        name: "EST",
        offset: "-0500"
    }, {
        name: "EDT",
        offset: "-0400"
    }, {
        name: "CST",
        offset: "-0600"
    }, {
        name: "CDT",
        offset: "-0500"
    }, {
        name: "MST",
        offset: "-0700"
    }, {
        name: "MDT",
        offset: "-0600"
    }, {
        name: "PST",
        offset: "-0800"
    }, {
        name: "PDT",
        offset: "-0700"
    }]
};
(function () {
    var $D = Date,
        $P = $D.prototype,
        $C = $D.CultureInfo,
        p = function (s, l) {
            if (!l) {
                l = 2;
            }
            return ("000" + s).slice(l * -1);
        };
    $P.clearTime = function () {
        this.setHours(0);
        this.setMinutes(0);
        this.setSeconds(0);
        this.setMilliseconds(0);
        return this;
    };
    $P.setTimeToNow = function () {
        var n = new Date();
        this.setHours(n.getHours());
        this.setMinutes(n.getMinutes());
        this.setSeconds(n.getSeconds());
        this.setMilliseconds(n.getMilliseconds());
        return this;
    };
    $D.today = function () {
        return new Date().clearTime();
    };
    $D.compare = function (date1, date2) {
        if (isNaN(date1) || isNaN(date2)) {
            throw new Error(date1 + " - " + date2);
        } else if (date1 instanceof Date && date2 instanceof Date) {
            return (date1 < date2) ? -1 : (date1 > date2) ? 1 : 0;
        } else {
            throw new TypeError(date1 + " - " + date2);
        }
    };
    $D.equals = function (date1, date2) {
        return (date1.compareTo(date2) === 0);
    };
    $D.getDayNumberFromName = function (name) {
        var n = $C.dayNames,
            m = $C.abbreviatedDayNames,
            o = $C.shortestDayNames,
            s = name.toLowerCase();
        for (var i = 0; i < n.length; i++) {
            if (n[i].toLowerCase() == s || m[i].toLowerCase() == s || o[i].toLowerCase() == s) {
                return i;
            }
        }
        return -1;
    };
    $D.getMonthNumberFromName = function (name) {
        var n = $C.monthNames,
            m = $C.abbreviatedMonthNames,
            s = name.toLowerCase();
        for (var i = 0; i < n.length; i++) {
            if (n[i].toLowerCase() == s || m[i].toLowerCase() == s) {
                return i;
            }
        }
        return -1;
    };
    $D.isLeapYear = function (year) {
        return ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0);
    };
    $D.getDaysInMonth = function (year, month) {
        return [31, ($D.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
    };
    $D.getTimezoneAbbreviation = function (offset) {
        var z = $C.timezones,
            p;
        for (var i = 0; i < z.length; i++) {
            if (z[i].offset === offset) {
                return z[i].name;
            }
        }
        return null;
    };
    $D.getTimezoneOffset = function (name) {
        var z = $C.timezones,
            p;
        for (var i = 0; i < z.length; i++) {
            if (z[i].name === name.toUpperCase()) {
                return z[i].offset;
            }
        }
        return null;
    };
    $P.clone = function () {
        return new Date(this.getTime());
    };
    $P.compareTo = function (date) {
        return Date.compare(this, date);
    };
    $P.equals = function (date) {
        return Date.equals(this, date || new Date());
    };
    $P.between = function (start, end) {
        return this.getTime() >= start.getTime() && this.getTime() <= end.getTime();
    };
    $P.isAfter = function (date) {
        return this.compareTo(date || new Date()) === 1;
    };
    $P.isBefore = function (date) {
        return (this.compareTo(date || new Date()) === -1);
    };
    $P.isToday = function () {
        return this.isSameDay(new Date());
    };
    $P.isSameDay = function (date) {
        return this.clone().clearTime().equals(date.clone().clearTime());
    };
    $P.addMilliseconds = function (value) {
        this.setMilliseconds(this.getMilliseconds() + value);
        return this;
    };
    $P.addSeconds = function (value) {
        return this.addMilliseconds(value * 1000);
    };
    $P.addMinutes = function (value) {
        return this.addMilliseconds(value * 60000);
    };
    $P.addHours = function (value) {
        return this.addMilliseconds(value * 3600000);
    };
    $P.addDays = function (value) {
        this.setDate(this.getDate() + value);
        return this;
    };
    $P.addWeeks = function (value) {
        return this.addDays(value * 7);
    };
    $P.addMonths = function (value) {
        var n = this.getDate();
        this.setDate(1);
        this.setMonth(this.getMonth() + value);
        this.setDate(Math.min(n, $D.getDaysInMonth(this.getFullYear(), this.getMonth())));
        return this;
    };
    $P.addYears = function (value) {
        return this.addMonths(value * 12);
    };
    $P.add = function (config) {
        if (typeof config == "number") {
            this._orient = config;
            return this;
        }
        var x = config;
        if (x.milliseconds) {
            this.addMilliseconds(x.milliseconds);
        }
        if (x.seconds) {
            this.addSeconds(x.seconds);
        }
        if (x.minutes) {
            this.addMinutes(x.minutes);
        }
        if (x.hours) {
            this.addHours(x.hours);
        }
        if (x.weeks) {
            this.addWeeks(x.weeks);
        }
        if (x.months) {
            this.addMonths(x.months);
        }
        if (x.years) {
            this.addYears(x.years);
        }
        if (x.days) {
            this.addDays(x.days);
        }
        return this;
    };
    var $y, $m, $d;
    $P.getWeek = function () {
        var a, b, c, d, e, f, g, n, s, w;
        $y = (!$y) ? this.getFullYear() : $y;
        $m = (!$m) ? this.getMonth() + 1 : $m;
        $d = (!$d) ? this.getDate() : $d;
        if ($m <= 2) {
            a = $y - 1;
            b = (a / 4 | 0) - (a / 100 | 0) + (a / 400 | 0);
            c = ((a - 1) / 4 | 0) - ((a - 1) / 100 | 0) + ((a - 1) / 400 | 0);
            s = b - c;
            e = 0;
            f = $d - 1 + (31 * ($m - 1));
        } else {
            a = $y;
            b = (a / 4 | 0) - (a / 100 | 0) + (a / 400 | 0);
            c = ((a - 1) / 4 | 0) - ((a - 1) / 100 | 0) + ((a - 1) / 400 | 0);
            s = b - c;
            e = s + 1;
            f = $d + ((153 * ($m - 3) + 2) / 5) + 58 + s;
        }
        g = (a + b) % 7;
        d = (f + g - e) % 7;
        n = (f + 3 - d) | 0;
        if (n < 0) {
            w = 53 - ((g - s) / 5 | 0);
        } else if (n > 364 + s) {
            w = 1;
        } else {
            w = (n / 7 | 0) + 1;
        }
        $y = $m = $d = null;
        return w;
    };
    $P.getISOWeek = function () {
        $y = this.getUTCFullYear();
        $m = this.getUTCMonth() + 1;
        $d = this.getUTCDate();
        return p(this.getWeek());
    };
    $P.setWeek = function (n) {
        return this.moveToDayOfWeek(1).addWeeks(n - this.getWeek());
    };
    $D._validate = function (n, min, max, name) {
        if (typeof n == "undefined") {
            return false;
        } else if (typeof n != "number") {
            throw new TypeError(n + " is not a Number.");
        } else if (n < min || n > max) {
            throw new RangeError(n + " is not a valid value for " + name + ".");
        }
        return true;
    };
    $D.validateMillisecond = function (value) {
        return $D._validate(value, 0, 999, "millisecond");
    };
    $D.validateSecond = function (value) {
        return $D._validate(value, 0, 59, "second");
    };
    $D.validateMinute = function (value) {
        return $D._validate(value, 0, 59, "minute");
    };
    $D.validateHour = function (value) {
        return $D._validate(value, 0, 23, "hour");
    };
    $D.validateDay = function (value, year, month) {
        return $D._validate(value, 1, $D.getDaysInMonth(year, month), "day");
    };
    $D.validateMonth = function (value) {
        return $D._validate(value, 0, 11, "month");
    };
    $D.validateYear = function (value) {
        return $D._validate(value, 0, 9999, "year");
    };
    $P.set = function (config) {
        if ($D.validateMillisecond(config.millisecond)) {
            this.addMilliseconds(config.millisecond - this.getMilliseconds());
        }
        if ($D.validateSecond(config.second)) {
            this.addSeconds(config.second - this.getSeconds());
        }
        if ($D.validateMinute(config.minute)) {
            this.addMinutes(config.minute - this.getMinutes());
        }
        if ($D.validateHour(config.hour)) {
            this.addHours(config.hour - this.getHours());
        }
        if ($D.validateMonth(config.month)) {
            this.addMonths(config.month - this.getMonth());
        }
        if ($D.validateYear(config.year)) {
            this.addYears(config.year - this.getFullYear());
        }
        if ($D.validateDay(config.day, this.getFullYear(), this.getMonth())) {
            this.addDays(config.day - this.getDate());
        }
        if (config.timezone) {
            this.setTimezone(config.timezone);
        }
        if (config.timezoneOffset) {
            this.setTimezoneOffset(config.timezoneOffset);
        }
        if (config.week && $D._validate(config.week, 0, 53, "week")) {
            this.setWeek(config.week);
        }
        return this;
    };
    $P.moveToFirstDayOfMonth = function () {
        return this.set({
            day: 1
        });
    };
    $P.moveToLastDayOfMonth = function () {
        return this.set({
            day: $D.getDaysInMonth(this.getFullYear(), this.getMonth())
        });
    };
    $P.moveToNthOccurrence = function (dayOfWeek, occurrence) {
        var shift = 0;
        if (occurrence > 0) {
            shift = occurrence - 1;
        } else if (occurrence === -1) {
            this.moveToLastDayOfMonth();
            if (this.getDay() !== dayOfWeek) {
                this.moveToDayOfWeek(dayOfWeek, -1);
            }
            return this;
        }
        return this.moveToFirstDayOfMonth().addDays(-1).moveToDayOfWeek(dayOfWeek, +1).addWeeks(shift);
    };
    $P.moveToDayOfWeek = function (dayOfWeek, orient) {
        var diff = (dayOfWeek - this.getDay() + 7 * (orient || +1)) % 7;
        return this.addDays((diff === 0) ? diff += 7 * (orient || +1) : diff);
    };
    $P.moveToMonth = function (month, orient) {
        var diff = (month - this.getMonth() + 12 * (orient || +1)) % 12;
        return this.addMonths((diff === 0) ? diff += 12 * (orient || +1) : diff);
    };
    $P.getOrdinalNumber = function () {
        return Math.ceil((this.clone().clearTime() - new Date(this.getFullYear(), 0, 1)) / 86400000) + 1;
    };
    $P.getTimezone = function () {
        return $D.getTimezoneAbbreviation(this.getUTCOffset());
    };
    $P.setTimezoneOffset = function (offset) {
        var here = this.getTimezoneOffset(),
            there = Number(offset) * -6 / 10;
        return this.addMinutes(there - here);
    };
    $P.setTimezone = function (offset) {
        return this.setTimezoneOffset($D.getTimezoneOffset(offset));
    };
    $P.hasDaylightSavingTime = function () {
        return (Date.today().set({
            month: 0,
            day: 1
        }).getTimezoneOffset() !== Date.today().set({
            month: 6,
            day: 1
        }).getTimezoneOffset());
    };
    $P.isDaylightSavingTime = function () {
        return (this.hasDaylightSavingTime() && new Date().getTimezoneOffset() === Date.today().set({
            month: 6,
            day: 1
        }).getTimezoneOffset());
    };
    $P.getUTCOffset = function () {
        var n = this.getTimezoneOffset() * -10 / 6,
            r;
        if (n < 0) {
            r = (n - 10000).toString();
            return r.charAt(0) + r.substr(2);
        } else {
            r = (n + 10000).toString();
            return "+" + r.substr(1);
        }
    };
    $P.getElapsed = function (date) {
        return (date || new Date()) - this;
    };
    if (!$P.toISOString) {
        $P.toISOString = function () {
            function f(n) {
                return n < 10 ? '0' + n : n;
            }
            return '"' + this.getUTCFullYear() + '-' + f(this.getUTCMonth() + 1) + '-' + f(this.getUTCDate()) + 'T' + f(this.getUTCHours()) + ':' + f(this.getUTCMinutes()) + ':' + f(this.getUTCSeconds()) + 'Z"';
        };
    }
    $P._toString = $P.toString;
    $P.toString = function (format) {
        var x = this;
        if (format && format.length == 1) {
            var c = $C.formatPatterns;
            x.t = x.toString;
            switch (format) {
            case "d":
                return x.t(c.shortDate);
            case "D":
                return x.t(c.longDate);
            case "F":
                return x.t(c.fullDateTime);
            case "m":
                return x.t(c.monthDay);
            case "r":
                return x.t(c.rfc1123);
            case "s":
                return x.t(c.sortableDateTime);
            case "t":
                return x.t(c.shortTime);
            case "T":
                return x.t(c.longTime);
            case "u":
                return x.t(c.universalSortableDateTime);
            case "y":
                return x.t(c.yearMonth);
            }
        }
        var ord = function (n) {
            switch (n * 1) {
            case 1:
            case 21:
            case 31:
                return "st";
            case 2:
            case 22:
                return "nd";
            case 3:
            case 23:
                return "rd";
            default:
                return "th";
            }
        };
        return format ? format.replace(/(\\)?(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|S)/g, function (m) {
            if (m.charAt(0) === "\\") {
                return m.replace("\\", "");
            }
            x.h = x.getHours;
            switch (m) {
            case "hh":
                return p(x.h() < 13 ? (x.h() === 0 ? 12 : x.h()) : (x.h() - 12));
            case "h":
                return x.h() < 13 ? (x.h() === 0 ? 12 : x.h()) : (x.h() - 12);
            case "HH":
                return p(x.h());
            case "H":
                return x.h();
            case "mm":
                return p(x.getMinutes());
            case "m":
                return x.getMinutes();
            case "ss":
                return p(x.getSeconds());
            case "s":
                return x.getSeconds();
            case "yyyy":
                return p(x.getFullYear(), 4);
            case "yy":
                return p(x.getFullYear());
            case "dddd":
                return $C.dayNames[x.getDay()];
            case "ddd":
                return $C.abbreviatedDayNames[x.getDay()];
            case "dd":
                return p(x.getDate());
            case "d":
                return x.getDate();
            case "MMMM":
                return $C.monthNames[x.getMonth()];
            case "MMM":
                return $C.abbreviatedMonthNames[x.getMonth()];
            case "MM":
                return p((x.getMonth() + 1));
            case "M":
                return x.getMonth() + 1;
            case "t":
                return x.h() < 12 ? $C.amDesignator.substring(0, 1) : $C.pmDesignator.substring(0, 1);
            case "tt":
                return x.h() < 12 ? $C.amDesignator : $C.pmDesignator;
            case "S":
                return ord(x.getDate());
            default:
                return m;
            }
        }) : this._toString();
    };
}());
(function () {
    var $D = Date,
        $P = $D.prototype,
        $C = $D.CultureInfo,
        $N = Number.prototype;
    $P._orient = +1;
    $P._nth = null;
    $P._is = false;
    $P._same = false;
    $P._isSecond = false;
    $N._dateElement = "day";
    $P.next = function () {
        this._orient = +1;
        return this;
    };
    $D.next = function () {
        return $D.today().next();
    };
    $P.last = $P.prev = $P.previous = function () {
        this._orient = -1;
        return this;
    };
    $D.last = $D.prev = $D.previous = function () {
        return $D.today().last();
    };
    $P.is = function () {
        this._is = true;
        return this;
    };
    $P.same = function () {
        this._same = true;
        this._isSecond = false;
        return this;
    };
    $P.today = function () {
        return this.same().day();
    };
    $P.weekday = function () {
        if (this._is) {
            this._is = false;
            return (!this.is().sat() && !this.is().sun());
        }
        return false;
    };
    $P.at = function (time) {
        return (typeof time === "string") ? $D.parse(this.toString("d") + " " + time) : this.set(time);
    };
    $N.fromNow = $N.after = function (date) {
        var c = {};
        c[this._dateElement] = this;
        return ((!date) ? new Date() : date.clone()).add(c);
    };
    $N.ago = $N.before = function (date) {
        var c = {};
        c[this._dateElement] = this * -1;
        return ((!date) ? new Date() : date.clone()).add(c);
    };
    var dx = ("sunday monday tuesday wednesday thursday friday saturday").split(/\s/),
        mx = ("january february march april may june july august september october november december").split(/\s/),
        px = ("Millisecond Second Minute Hour Day Week Month Year").split(/\s/),
        pxf = ("Milliseconds Seconds Minutes Hours Date Week Month FullYear").split(/\s/),
        nth = ("final first second third fourth fifth").split(/\s/),
        de;
    $P.toObject = function () {
        var o = {};
        for (var i = 0; i < px.length; i++) {
            o[px[i].toLowerCase()] = this["get" + pxf[i]]();
        }
        return o;
    };
    $D.fromObject = function (config) {
        config.week = null;
        return Date.today().set(config);
    };
    var df = function (n) {
        return function () {
            if (this._is) {
                this._is = false;
                return this.getDay() == n;
            }
            if (this._nth !== null) {
                if (this._isSecond) {
                    this.addSeconds(this._orient * -1);
                }
                this._isSecond = false;
                var ntemp = this._nth;
                this._nth = null;
                var temp = this.clone().moveToLastDayOfMonth();
                this.moveToNthOccurrence(n, ntemp);
                if (this > temp) {
                    throw new RangeError($D.getDayName(n) + " does not occur " + ntemp + " times in the month of " + $D.getMonthName(temp.getMonth()) + " " + temp.getFullYear() + ".");
                }
                return this;
            }
            return this.moveToDayOfWeek(n, this._orient);
        };
    };
    var sdf = function (n) {
        return function () {
            var t = $D.today(),
                shift = n - t.getDay();
            if (n === 0 && $C.firstDayOfWeek === 1 && t.getDay() !== 0) {
                shift = shift + 7;
            }
            return t.addDays(shift);
        };
    };
    for (var i = 0; i < dx.length; i++) {
        $D[dx[i].toUpperCase()] = $D[dx[i].toUpperCase().substring(0, 3)] = i;
        $D[dx[i]] = $D[dx[i].substring(0, 3)] = sdf(i);
        $P[dx[i]] = $P[dx[i].substring(0, 3)] = df(i);
    }
    var mf = function (n) {
        return function () {
            if (this._is) {
                this._is = false;
                return this.getMonth() === n;
            }
            return this.moveToMonth(n, this._orient);
        };
    };
    var smf = function (n) {
        return function () {
            return $D.today().set({
                month: n,
                day: 1
            });
        };
    };
    for (var j = 0; j < mx.length; j++) {
        $D[mx[j].toUpperCase()] = $D[mx[j].toUpperCase().substring(0, 3)] = j;
        $D[mx[j]] = $D[mx[j].substring(0, 3)] = smf(j);
        $P[mx[j]] = $P[mx[j].substring(0, 3)] = mf(j);
    }
    var ef = function (j) {
        return function () {
            if (this._isSecond) {
                this._isSecond = false;
                return this;
            }
            if (this._same) {
                this._same = this._is = false;
                var o1 = this.toObject(),
                    o2 = (arguments[0] || new Date()).toObject(),
                    v = "",
                    k = j.toLowerCase();
                for (var m = (px.length - 1); m > -1; m--) {
                    v = px[m].toLowerCase();
                    if (o1[v] != o2[v]) {
                        return false;
                    }
                    if (k == v) {
                        break;
                    }
                }
                return true;
            }
            if (j.substring(j.length - 1) != "s") {
                j += "s";
            }
            return this["add" + j](this._orient);
        };
    };
    var nf = function (n) {
        return function () {
            this._dateElement = n;
            return this;
        };
    };
    for (var k = 0; k < px.length; k++) {
        de = px[k].toLowerCase();
        $P[de] = $P[de + "s"] = ef(px[k]);
        $N[de] = $N[de + "s"] = nf(de);
    }
    $P._ss = ef("Second");
    var nthfn = function (n) {
        return function (dayOfWeek) {
            if (this._same) {
                return this._ss(arguments[0]);
            }
            if (dayOfWeek || dayOfWeek === 0) {
                return this.moveToNthOccurrence(dayOfWeek, n);
            }
            this._nth = n;
            if (n === 2 && (dayOfWeek === undefined || dayOfWeek === null)) {
                this._isSecond = true;
                return this.addSeconds(this._orient);
            }
            return this;
        };
    };
    for (var l = 0; l < nth.length; l++) {
        $P[nth[l]] = (l === 0) ? nthfn(-1) : nthfn(l);
    }
}());
(function () {
    Date.Parsing = {
        Exception: function (s) {
            this.message = "Parse error at '" + s.substring(0, 10) + " ...'";
        }
    };
    var $P = Date.Parsing;
    var _ = $P.Operators = {
        rtoken: function (r) {
            return function (s) {
                var mx = s.match(r);
                if (mx) {
                    return ([mx[0], s.substring(mx[0].length)]);
                } else {
                    throw new $P.Exception(s);
                }
            };
        },
        token: function (s) {
            return function (s) {
                return _.rtoken(new RegExp("^\s*" + s + "\s*"))(s);
            };
        },
        stoken: function (s) {
            return _.rtoken(new RegExp("^" + s));
        },
        until: function (p) {
            return function (s) {
                var qx = [],
                    rx = null;
                while (s.length) {
                    try {
                        rx = p.call(this, s);
                    } catch (e) {
                        qx.push(rx[0]);
                        s = rx[1];
                        continue;
                    }
                    break;
                }
                return [qx, s];
            };
        },
        many: function (p) {
            return function (s) {
                var rx = [],
                    r = null;
                while (s.length) {
                    try {
                        r = p.call(this, s);
                    } catch (e) {
                        return [rx, s];
                    }
                    rx.push(r[0]);
                    s = r[1];
                }
                return [rx, s];
            };
        },
        optional: function (p) {
            return function (s) {
                var r = null;
                try {
                    r = p.call(this, s);
                } catch (e) {
                    return [null, s];
                }
                return [r[0], r[1]];
            };
        },
        not: function (p) {
            return function (s) {
                try {
                    p.call(this, s);
                } catch (e) {
                    return [null, s];
                }
                throw new $P.Exception(s);
            };
        },
        ignore: function (p) {
            return p ?
            function (s) {
                var r = null;
                r = p.call(this, s);
                return [null, r[1]];
            } : null;
        },
        product: function () {
            var px = arguments[0],
                qx = Array.prototype.slice.call(arguments, 1),
                rx = [];
            for (var i = 0; i < px.length; i++) {
                rx.push(_.each(px[i], qx));
            }
            return rx;
        },
        cache: function (rule) {
            var cache = {},
                r = null;
            return function (s) {
                try {
                    r = cache[s] = (cache[s] || rule.call(this, s));
                } catch (e) {
                    r = cache[s] = e;
                }
                if (r instanceof $P.Exception) {
                    throw r;
                } else {
                    return r;
                }
            };
        },
        any: function () {
            var px = arguments;
            return function (s) {
                var r = null;
                for (var i = 0; i < px.length; i++) {
                    if (px[i] == null) {
                        continue;
                    }
                    try {
                        r = (px[i].call(this, s));
                    } catch (e) {
                        r = null;
                    }
                    if (r) {
                        return r;
                    }
                }
                throw new $P.Exception(s);
            };
        },
        each: function () {
            var px = arguments;
            return function (s) {
                var rx = [],
                    r = null;
                for (var i = 0; i < px.length; i++) {
                    if (px[i] == null) {
                        continue;
                    }
                    try {
                        r = (px[i].call(this, s));
                    } catch (e) {
                        throw new $P.Exception(s);
                    }
                    rx.push(r[0]);
                    s = r[1];
                }
                return [rx, s];
            };
        },
        all: function () {
            var px = arguments,
                _ = _;
            return _.each(_.optional(px));
        },
        sequence: function (px, d, c) {
            d = d || _.rtoken(/^\s*/);
            c = c || null;
            if (px.length == 1) {
                return px[0];
            }
            return function (s) {
                var r = null,
                    q = null;
                var rx = [];
                for (var i = 0; i < px.length; i++) {
                    try {
                        r = px[i].call(this, s);
                    } catch (e) {
                        break;
                    }
                    rx.push(r[0]);
                    try {
                        q = d.call(this, r[1]);
                    } catch (ex) {
                        q = null;
                        break;
                    }
                    s = q[1];
                }
                if (!r) {
                    throw new $P.Exception(s);
                }
                if (q) {
                    throw new $P.Exception(q[1]);
                }
                if (c) {
                    try {
                        r = c.call(this, r[1]);
                    } catch (ey) {
                        throw new $P.Exception(r[1]);
                    }
                }
                return [rx, (r ? r[1] : s)];
            };
        },
        between: function (d1, p, d2) {
            d2 = d2 || d1;
            var _fn = _.each(_.ignore(d1), p, _.ignore(d2));
            return function (s) {
                var rx = _fn.call(this, s);
                return [[rx[0][0], r[0][2]], rx[1]];
            };
        },
        list: function (p, d, c) {
            d = d || _.rtoken(/^\s*/);
            c = c || null;
            return (p instanceof Array ? _.each(_.product(p.slice(0, -1), _.ignore(d)), p.slice(-1), _.ignore(c)) : _.each(_.many(_.each(p, _.ignore(d))), px, _.ignore(c)));
        },
        set: function (px, d, c) {
            d = d || _.rtoken(/^\s*/);
            c = c || null;
            return function (s) {
                var r = null,
                    p = null,
                    q = null,
                    rx = null,
                    best = [
                        [], s],
                    last = false;
                for (var i = 0; i < px.length; i++) {
                    q = null;
                    p = null;
                    r = null;
                    last = (px.length == 1);
                    try {
                        r = px[i].call(this, s);
                    } catch (e) {
                        continue;
                    }
                    rx = [
                        [r[0]], r[1]
                    ];
                    if (r[1].length > 0 && !last) {
                        try {
                            q = d.call(this, r[1]);
                        } catch (ex) {
                            last = true;
                        }
                    } else {
                        last = true;
                    }
                    if (!last && q[1].length === 0) {
                        last = true;
                    }
                    if (!last) {
                        var qx = [];
                        for (var j = 0; j < px.length; j++) {
                            if (i != j) {
                                qx.push(px[j]);
                            }
                        }
                        p = _.set(qx, d).call(this, q[1]);
                        if (p[0].length > 0) {
                            rx[0] = rx[0].concat(p[0]);
                            rx[1] = p[1];
                        }
                    }
                    if (rx[1].length < best[1].length) {
                        best = rx;
                    }
                    if (best[1].length === 0) {
                        break;
                    }
                }
                if (best[0].length === 0) {
                    return best;
                }
                if (c) {
                    try {
                        q = c.call(this, best[1]);
                    } catch (ey) {
                        throw new $P.Exception(best[1]);
                    }
                    best[1] = q[1];
                }
                return best;
            };
        },
        forward: function (gr, fname) {
            return function (s) {
                return gr[fname].call(this, s);
            };
        },
        replace: function (rule, repl) {
            return function (s) {
                var r = rule.call(this, s);
                return [repl, r[1]];
            };
        },
        process: function (rule, fn) {
            return function (s) {
                var r = rule.call(this, s);
                return [fn.call(this, r[0]), r[1]];
            };
        },
        min: function (min, rule) {
            return function (s) {
                var rx = rule.call(this, s);
                if (rx[0].length < min) {
                    throw new $P.Exception(s);
                }
                return rx;
            };
        }
    };
    var _generator = function (op) {
        return function () {
            var args = null,
                rx = [];
            if (arguments.length > 1) {
                args = Array.prototype.slice.call(arguments);
            } else if (arguments[0] instanceof Array) {
                args = arguments[0];
            }
            if (args) {
                for (var i = 0, px = args.shift(); i < px.length; i++) {
                    args.unshift(px[i]);
                    rx.push(op.apply(null, args));
                    args.shift();
                    return rx;
                }
            } else {
                return op.apply(null, arguments);
            }
        };
    };
    var gx = "optional not ignore cache".split(/\s/);
    for (var i = 0; i < gx.length; i++) {
        _[gx[i]] = _generator(_[gx[i]]);
    }
    var _vector = function (op) {
        return function () {
            if (arguments[0] instanceof Array) {
                return op.apply(null, arguments[0]);
            } else {
                return op.apply(null, arguments);
            }
        };
    };
    var vx = "each any all".split(/\s/);
    for (var j = 0; j < vx.length; j++) {
        _[vx[j]] = _vector(_[vx[j]]);
    }
}());
(function () {
    var $D = Date,
        $P = $D.prototype,
        $C = $D.CultureInfo;
    var flattenAndCompact = function (ax) {
        var rx = [];
        for (var i = 0; i < ax.length; i++) {
            if (ax[i] instanceof Array) {
                rx = rx.concat(flattenAndCompact(ax[i]));
            } else {
                if (ax[i]) {
                    rx.push(ax[i]);
                }
            }
        }
        return rx;
    };
    $D.Grammar = {};
    $D.Translator = {
        hour: function (s) {
            return function () {
                this.hour = Number(s);
            };
        },
        minute: function (s) {
            return function () {
                this.minute = Number(s);
            };
        },
        second: function (s) {
            return function () {
                this.second = Number(s);
            };
        },
        meridian: function (s) {
            return function () {
                this.meridian = s.slice(0, 1).toLowerCase();
            };
        },
        timezone: function (s) {
            return function () {
                var n = s.replace(/[^\d\+\-]/g, "");
                if (n.length) {
                    this.timezoneOffset = Number(n);
                } else {
                    this.timezone = s.toLowerCase();
                }
            };
        },
        day: function (x) {
            var s = x[0];
            return function () {
                this.day = Number(s.match(/\d+/)[0]);
            };
        },
        month: function (s) {
            return function () {
                this.month = (s.length == 3) ? "jan feb mar apr may jun jul aug sep oct nov dec".indexOf(s) / 4 : Number(s) - 1;
            };
        },
        year: function (s) {
            return function () {
                var n = Number(s);
                this.year = ((s.length > 2) ? n : (n + (((n + 2000) < $C.twoDigitYearMax) ? 2000 : 1900)));
            };
        },
        rday: function (s) {
            return function () {
                switch (s) {
                case "yesterday":
                    this.days = -1;
                    break;
                case "tomorrow":
                    this.days = 1;
                    break;
                case "today":
                    this.days = 0;
                    break;
                case "now":
                    this.days = 0;
                    this.now = true;
                    break;
                }
            };
        },
        finishExact: function (x) {
            x = (x instanceof Array) ? x : [x];
            for (var i = 0; i < x.length; i++) {
                if (x[i]) {
                    x[i].call(this);
                }
            }
            var now = new Date();
            if ((this.hour || this.minute) && (!this.month && !this.year && !this.day)) {
                this.day = now.getDate();
            }
            if (!this.year) {
                this.year = now.getFullYear();
            }
            if (!this.month && this.month !== 0) {
                this.month = now.getMonth();
            }
            if (!this.day) {
                this.day = 1;
            }
            if (!this.hour) {
                this.hour = 0;
            }
            if (!this.minute) {
                this.minute = 0;
            }
            if (!this.second) {
                this.second = 0;
            }
            if (this.meridian && this.hour) {
                if (this.meridian == "p" && this.hour < 12) {
                    this.hour = this.hour + 12;
                } else if (this.meridian == "a" && this.hour == 12) {
                    this.hour = 0;
                }
            }
            if (this.day > $D.getDaysInMonth(this.year, this.month)) {
                throw new RangeError(this.day + " is not a valid value for days.");
            }
            var r = new Date(this.year, this.month, this.day, this.hour, this.minute, this.second);
            if (this.timezone) {
                r.set({
                    timezone: this.timezone
                });
            } else if (this.timezoneOffset) {
                r.set({
                    timezoneOffset: this.timezoneOffset
                });
            }
            return r;
        },
        finish: function (x) {
            x = (x instanceof Array) ? flattenAndCompact(x) : [x];
            if (x.length === 0) {
                return null;
            }
            for (var i = 0; i < x.length; i++) {
                if (typeof x[i] == "function") {
                    x[i].call(this);
                }
            }
            var today = $D.today();
            if (this.now && !this.unit && !this.operator) {
                return new Date();
            } else if (this.now) {
                today = new Date();
            }
            var expression = !! (this.days && this.days !== null || this.orient || this.operator);
            var gap, mod, orient;
            orient = ((this.orient == "past" || this.operator == "subtract") ? -1 : 1);
            if (!this.now && "hour minute second".indexOf(this.unit) != -1) {
                today.setTimeToNow();
            }
            if (this.month || this.month === 0) {
                if ("year day hour minute second".indexOf(this.unit) != -1) {
                    this.value = this.month + 1;
                    this.month = null;
                    expression = true;
                }
            }
            if (!expression && this.weekday && !this.day && !this.days) {
                var temp = Date[this.weekday]();
                this.day = temp.getDate();
                if (!this.month) {
                    this.month = temp.getMonth();
                }
                this.year = temp.getFullYear();
            }
            if (expression && this.weekday && this.unit != "month") {
                this.unit = "day";
                gap = ($D.getDayNumberFromName(this.weekday) - today.getDay());
                mod = 7;
                this.days = gap ? ((gap + (orient * mod)) % mod) : (orient * mod);
            }
            if (this.month && this.unit == "day" && this.operator) {
                this.value = (this.month + 1);
                this.month = null;
            }
            if (this.value != null && this.month != null && this.year != null) {
                this.day = this.value * 1;
            }
            if (this.month && !this.day && this.value) {
                today.set({
                    day: this.value * 1
                });
                if (!expression) {
                    this.day = this.value * 1;
                }
            }
            if (!this.month && this.value && this.unit == "month" && !this.now) {
                this.month = this.value;
                expression = true;
            }
            if (expression && (this.month || this.month === 0) && this.unit != "year") {
                this.unit = "month";
                gap = (this.month - today.getMonth());
                mod = 12;
                this.months = gap ? ((gap + (orient * mod)) % mod) : (orient * mod);
                this.month = null;
            }
            if (!this.unit) {
                this.unit = "day";
            }
            if (!this.value && this.operator && this.operator !== null && this[this.unit + "s"] && this[this.unit + "s"] !== null) {
                this[this.unit + "s"] = this[this.unit + "s"] + ((this.operator == "add") ? 1 : -1) + (this.value || 0) * orient;
            } else if (this[this.unit + "s"] == null || this.operator != null) {
                if (!this.value) {
                    this.value = 1;
                }
                this[this.unit + "s"] = this.value * orient;
            }
            if (this.meridian && this.hour) {
                if (this.meridian == "p" && this.hour < 12) {
                    this.hour = this.hour + 12;
                } else if (this.meridian == "a" && this.hour == 12) {
                    this.hour = 0;
                }
            }
            if (this.weekday && !this.day && !this.days) {
                var temp = Date[this.weekday]();
                this.day = temp.getDate();
                if (temp.getMonth() !== today.getMonth()) {
                    this.month = temp.getMonth();
                }
            }
            if ((this.month || this.month === 0) && !this.day) {
                this.day = 1;
            }
            if (!this.orient && !this.operator && this.unit == "week" && this.value && !this.day && !this.month) {
                return Date.today().setWeek(this.value);
            }
            if (expression && this.timezone && this.day && this.days) {
                this.day = this.days;
            }
            return (expression) ? today.add(this) : today.set(this);
        }
    };
    var _ = $D.Parsing.Operators,
        g = $D.Grammar,
        t = $D.Translator,
        _fn;
    g.datePartDelimiter = _.rtoken(/^([\s\-\.\,\/\x27]+)/);
    g.timePartDelimiter = _.stoken(":");
    g.whiteSpace = _.rtoken(/^\s*/);
    g.generalDelimiter = _.rtoken(/^(([\s\,]|at|@|on)+)/);
    var _C = {};
    g.ctoken = function (keys) {
        var fn = _C[keys];
        if (!fn) {
            var c = $C.regexPatterns;
            var kx = keys.split(/\s+/),
                px = [];
            for (var i = 0; i < kx.length; i++) {
                px.push(_.replace(_.rtoken(c[kx[i]]), kx[i]));
            }
            fn = _C[keys] = _.any.apply(null, px);
        }
        return fn;
    };
    g.ctoken2 = function (key) {
        return _.rtoken($C.regexPatterns[key]);
    };
    g.h = _.cache(_.process(_.rtoken(/^(0[0-9]|1[0-2]|[1-9])/), t.hour));
    g.hh = _.cache(_.process(_.rtoken(/^(0[0-9]|1[0-2])/), t.hour));
    g.H = _.cache(_.process(_.rtoken(/^([0-1][0-9]|2[0-3]|[0-9])/), t.hour));
    g.HH = _.cache(_.process(_.rtoken(/^([0-1][0-9]|2[0-3])/), t.hour));
    g.m = _.cache(_.process(_.rtoken(/^([0-5][0-9]|[0-9])/), t.minute));
    g.mm = _.cache(_.process(_.rtoken(/^[0-5][0-9]/), t.minute));
    g.s = _.cache(_.process(_.rtoken(/^([0-5][0-9]|[0-9])/), t.second));
    g.ss = _.cache(_.process(_.rtoken(/^[0-5][0-9]/), t.second));
    g.hms = _.cache(_.sequence([g.H, g.m, g.s], g.timePartDelimiter));
    g.t = _.cache(_.process(g.ctoken2("shortMeridian"), t.meridian));
    g.tt = _.cache(_.process(g.ctoken2("longMeridian"), t.meridian));
    g.z = _.cache(_.process(_.rtoken(/^((\+|\-)\s*\d\d\d\d)|((\+|\-)\d\d\:?\d\d)/), t.timezone));
    g.zz = _.cache(_.process(_.rtoken(/^((\+|\-)\s*\d\d\d\d)|((\+|\-)\d\d\:?\d\d)/), t.timezone));
    g.zzz = _.cache(_.process(g.ctoken2("timezone"), t.timezone));
    g.timeSuffix = _.each(_.ignore(g.whiteSpace), _.set([g.tt, g.zzz]));
    g.time = _.each(_.optional(_.ignore(_.stoken("T"))), g.hms, g.timeSuffix);
    g.d = _.cache(_.process(_.each(_.rtoken(/^([0-2]\d|3[0-1]|\d)/), _.optional(g.ctoken2("ordinalSuffix"))), t.day));
    g.dd = _.cache(_.process(_.each(_.rtoken(/^([0-2]\d|3[0-1])/), _.optional(g.ctoken2("ordinalSuffix"))), t.day));
    g.ddd = g.dddd = _.cache(_.process(g.ctoken("sun mon tue wed thu fri sat"), function (s) {
        return function () {
            this.weekday = s;
        };
    }));
    g.M = _.cache(_.process(_.rtoken(/^(1[0-2]|0\d|\d)/), t.month));
    g.MM = _.cache(_.process(_.rtoken(/^(1[0-2]|0\d)/), t.month));
    g.MMM = g.MMMM = _.cache(_.process(g.ctoken("jan feb mar apr may jun jul aug sep oct nov dec"), t.month));
    g.y = _.cache(_.process(_.rtoken(/^(\d\d?)/), t.year));
    g.yy = _.cache(_.process(_.rtoken(/^(\d\d)/), t.year));
    g.yyy = _.cache(_.process(_.rtoken(/^(\d\d?\d?\d?)/), t.year));
    g.yyyy = _.cache(_.process(_.rtoken(/^(\d\d\d\d)/), t.year));
    _fn = function () {
        return _.each(_.any.apply(null, arguments), _.not(g.ctoken2("timeContext")));
    };
    g.day = _fn(g.d, g.dd);
    g.month = _fn(g.M, g.MMM);
    g.year = _fn(g.yyyy, g.yy);
    g.orientation = _.process(g.ctoken("past future"), function (s) {
        return function () {
            this.orient = s;
        };
    });
    g.operator = _.process(g.ctoken("add subtract"), function (s) {
        return function () {
            this.operator = s;
        };
    });
    g.rday = _.process(g.ctoken("yesterday tomorrow today now"), t.rday);
    g.unit = _.process(g.ctoken("second minute hour day week month year"), function (s) {
        return function () {
            this.unit = s;
        };
    });
    g.value = _.process(_.rtoken(/^\d\d?(st|nd|rd|th)?/), function (s) {
        return function () {
            this.value = s.replace(/\D/g, "");
        };
    });
    g.expression = _.set([g.rday, g.operator, g.value, g.unit, g.orientation, g.ddd, g.MMM]);
    _fn = function () {
        return _.set(arguments, g.datePartDelimiter);
    };
    g.mdy = _fn(g.ddd, g.month, g.day, g.year);
    g.ymd = _fn(g.ddd, g.year, g.month, g.day);
    g.dmy = _fn(g.ddd, g.day, g.month, g.year);
    g.date = function (s) {
        return ((g[$C.dateElementOrder] || g.mdy).call(this, s));
    };
    g.format = _.process(_.many(_.any(_.process(_.rtoken(/^(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?)/), function (fmt) {
        if (g[fmt]) {
            return g[fmt];
        } else {
            throw $D.Parsing.Exception(fmt);
        }
    }), _.process(_.rtoken(/^[^dMyhHmstz]+/), function (s) {
        return _.ignore(_.stoken(s));
    }))), function (rules) {
        return _.process(_.each.apply(null, rules), t.finishExact);
    });
    var _F = {};
    var _get = function (f) {
        return _F[f] = (_F[f] || g.format(f)[0]);
    };
    g.formats = function (fx) {
        if (fx instanceof Array) {
            var rx = [];
            for (var i = 0; i < fx.length; i++) {
                rx.push(_get(fx[i]));
            }
            return _.any.apply(null, rx);
        } else {
            return _get(fx);
        }
    };
    g._formats = g.formats(["\"yyyy-MM-ddTHH:mm:ssZ\"", "yyyy-MM-ddTHH:mm:ssZ", "yyyy-MM-ddTHH:mm:ssz", "yyyy-MM-ddTHH:mm:ss", "yyyy-MM-ddTHH:mmZ", "yyyy-MM-ddTHH:mmz", "yyyy-MM-ddTHH:mm", "ddd, MMM dd, yyyy H:mm:ss tt", "ddd MMM d yyyy HH:mm:ss zzz", "MMddyyyy", "ddMMyyyy", "Mddyyyy", "ddMyyyy", "Mdyyyy", "dMyyyy", "yyyy", "Mdyy", "dMyy", "d"]);
    g._start = _.process(_.set([g.date, g.time, g.expression], g.generalDelimiter, g.whiteSpace), t.finish);
    g.start = function (s) {
        try {
            var r = g._formats.call({}, s);
            if (r[1].length === 0) {
                return r;
            }
        } catch (e) {}
        return g._start.call({}, s);
    };
    $D._parse = $D.parse;
    $D.parse = function (s) {
        var r = null;
        if (!s) {
            return null;
        }
        if (s instanceof Date) {
            return s;
        }
        try {
            r = $D.Grammar.start.call({}, s.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1"));
        } catch (e) {
            return null;
        }
        return ((r[1].length === 0) ? r[0] : null);
    };
    $D.getParseFunction = function (fx) {
        var fn = $D.Grammar.formats(fx);
        return function (s) {
            var r = null;
            try {
                r = fn.call({}, s);
            } catch (e) {
                return null;
            }
            return ((r[1].length === 0) ? r[0] : null);
        };
    };
    $D.parseExact = function (s, fx) {
        return $D.getParseFunction(fx)(s);
    };
}());;;
(function (d) {
    var k = d.scrollTo = function (a, i, e) {
        d(window).scrollTo(a, i, e)
    };
    k.defaults = {
        axis: 'xy',
        duration: parseFloat(d.fn.jquery) >= 1.3 ? 0 : 1
    };
    k.window = function (a) {
        return d(window)._scrollable()
    };
    d.fn._scrollable = function () {
        return this.map(function () {
            var a = this,
                i = !a.nodeName || d.inArray(a.nodeName.toLowerCase(), ['iframe', '#document', 'html', 'body']) != -1;
            if (!i) return a;
            var e = (a.contentWindow || a).document || a.ownerDocument || a;
            return d.browser.safari || e.compatMode == 'BackCompat' ? e.body : e.documentElement
        })
    };
    d.fn.scrollTo = function (n, j, b) {
        if (typeof j == 'object') {
            b = j;
            j = 0
        }
        if (typeof b == 'function') b = {
            onAfter: b
        };
        if (n == 'max') n = 9e9;
        b = d.extend({}, k.defaults, b);
        j = j || b.speed || b.duration;
        b.queue = b.queue && b.axis.length > 1;
        if (b.queue) j /= 2;
        b.offset = p(b.offset);
        b.over = p(b.over);
        return this._scrollable().each(function () {
            var q = this,
                r = d(q),
                f = n,
                s, g = {},
                u = r.is('html,body');
            switch (typeof f) {
            case 'number':
            case 'string':
                if (/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)) {
                    f = p(f);
                    break
                }
                f = d(f, this);
            case 'object':
                if (f.is || f.style) s = (f = d(f)).offset()
            }
            d.each(b.axis.split(''), function (a, i) {
                var e = i == 'x' ? 'Left' : 'Top',
                    h = e.toLowerCase(),
                    c = 'scroll' + e,
                    l = q[c],
                    m = k.max(q, i);
                if (s) {
                    g[c] = s[h] + (u ? 0 : l - r.offset()[h]);
                    if (b.margin) {
                        g[c] -= parseInt(f.css('margin' + e)) || 0;
                        g[c] -= parseInt(f.css('border' + e + 'Width')) || 0
                    }
                    g[c] += b.offset[h] || 0;
                    if (b.over[h]) g[c] += f[i == 'x' ? 'width' : 'height']() * b.over[h]
                } else {
                    var o = f[h];
                    g[c] = o.slice && o.slice(-1) == '%' ? parseFloat(o) / 100 * m : o
                }
                if (/^\d+$/.test(g[c])) g[c] = g[c] <= 0 ? 0 : Math.min(g[c], m);
                if (!a && b.queue) {
                    if (l != g[c]) t(b.onAfterFirst);
                    delete g[c]
                }
            });
            t(b.onAfter);

            function t(a) {
                r.animate(g, j, b.easing, a &&
                function () {
                    a.call(this, n, b)
                })
            }
        }).end()
    };
    k.max = function (a, i) {
        var e = i == 'x' ? 'Width' : 'Height',
            h = 'scroll' + e;
        if (!d(a).is('html,body')) return a[h] - d(a)[e.toLowerCase()]();
        var c = 'client' + e,
            l = a.ownerDocument.documentElement,
            m = a.ownerDocument.body;
        return Math.max(l[h], m[h]) - Math.min(l[c], m[c])
    };

    function p(a) {
        return typeof a == 'object' ? a : {
            top: a,
            left: a
        }
    }
})(jQuery);
