﻿(function($) {

    $.fn.simpleselect = function(options) {
        var settings = {
            select: function() { },
            initialValue: '',
            initialObject: ''
        };
        if (options) {
            $.extend(settings, options);
        }

        this.children().each(function() {
            $(this).addClass("ui-state-default");
        }).hover(function() {
            $(this).addClass('ui-state-hover');
        }, function() {
            $(this).removeClass('ui-state-hover');
        }).click(function() {
            $(this).toggleClass("ui-state-active").siblings().removeClass("ui-state-active");

            settings.select($(this));
        });

        if (settings.initialValue != '') {
            $('#' + settings.initialValue).toggleClass("ui-state-active").siblings().removeClass("ui-state-active");
        }

        if (settings.initialObject != '') {
            settings.initialObject.toggleClass("ui-state-active").siblings().removeClass("ui-state-active");
        }
        
        return this;
    }

    $.fn.nval = function(value) {
        if (value === undefined) {
            return parseFloat(this.val());
        }

        // Round the value to two decimal places.
        var f = Math.round(parseFloat(value) * 100) / 100;

        $(this).val(f);

        return this;
    }

    $(function() {
        $('ul.sf-menu').superfish({
            speed: 'fast',
            autoArrows: false
        });

        $('.buttonset').buttonset();
    });

})(jQuery);

/*
*
* Copyright (c) 2006/2007 Sam Collett (http://www.texotela.co.uk)
* Licensed under the MIT License:
* http://www.opensource.org/licenses/mit-license.php
* 
* Version 1.0
* Demo: http://www.texotela.co.uk/code/jquery/numeric/
*
* $LastChangedDate: 2007-05-29 11:31:36 +0100 (Tue, 29 May 2007) $
* $Rev: 2005 $
*/

/*
* Allows only valid characters to be entered into input boxes.
* Note: does not validate that the final text is a valid number
* (that could be done by another script, or server-side)
*
* @name     numeric
* @param    validCallback       A function that runs if the number is valid (fires onblur)
* @param    invalidCallback     A function that runs if the number is not valid (fires onblur)
* @author   Sam Collett (http://www.texotela.co.uk)
* @example  $(".numeric").numeric(validCallback, invalidCallback);
*
*/
(function($) {
    $.fn.numeric = function(validCallback, invalidCallback) {
        allowNegative = false;
        decimalSeparator = ".";
        validCallback = typeof validCallback == "function" ? validCallback : function() { };
        invalidCallback = typeof invalidCallback == "function" ? invalidCallback : function() { };
        this.keypress(
		    function(e) {
		        var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
		        // allow enter/return key (only when in an input box)
		        if (key == 13 && this.nodeName.toLowerCase() == "input") {
		            return true;
		        } else if (key == 13) {
		            return false;
		        }
		        var allow = false;
		        // allow Ctrl+A
		        if ((e.ctrlKey && key == 97 /* firefox */) || (e.ctrlKey && key == 65) /* opera */) return true;
		        // allow Ctrl+X (cut)
		        if ((e.ctrlKey && key == 120 /* firefox */) || (e.ctrlKey && key == 88) /* opera */) return true;
		        // allow Ctrl+C (copy)
		        if ((e.ctrlKey && key == 99 /* firefox */) || (e.ctrlKey && key == 67) /* opera */) return true;
		        // allow Ctrl+Z (undo)
		        if ((e.ctrlKey && key == 122 /* firefox */) || (e.ctrlKey && key == 90) /* opera */) return true;
		        // allow or deny Ctrl+V (paste), Shift+Ins
		        if ((e.ctrlKey && key == 118 /* firefox */) || (e.ctrlKey && key == 86) /* opera */
			    || (e.shiftKey && key == 45)) return true;
		        // if a number was not pressed
		        if (key < 48 || key > 57) {
		            /* '-' only allowed at start */
		            if (allowNegative && key == 45 && this.value.length == 0) return true;
		            /* only one decimal separator allowed */
		            if (key == decimalSeparator.charCodeAt(0) && this.value.indexOf(decimalSeparator) != -1) {
		                allow = false;
		            }
		            // check for other keys that have special purposes
		            if (
					    key != 8 /* backspace */ &&
					    key != 9 /* tab */ &&
					    key != 13 /* enter */ &&
					    key != 35 /* end */ &&
					    key != 36 /* home */ &&
					    key != 37 /* left */ &&
					    key != 39 /* right */ &&
					    key != 46 /* del */
				    ) {
		                allow = false;
		            }
		            else {
		                // for detecting special keys (listed above)
		                // IE does not support 'charCode' and ignores them in keypress anyway
		                if (typeof e.charCode != "undefined") {
		                    // special keys have 'keyCode' and 'which' the same (e.g. backspace)
		                    if (e.keyCode == e.which && e.which != 0) {
		                        allow = true;
		                    }
		                    // or keyCode != 0 and 'charCode'/'which' = 0
		                    else if (e.keyCode != 0 && e.charCode == 0 && e.which == 0) {
		                        allow = true;
		                    }
		                }
		            }
		            // if key pressed is the decimal and it is not already in the field
		            if (key == decimalSeparator.charCodeAt(0) && this.value.indexOf(decimalSeparator) == -1) {
		                allow = true;
		            }
		        }
		        else {
		            allow = true;
		        }
		        return allow;
		    }
	    )
	    .blur(
		    function() {
		        var val = $(this).val();
		        if (val != "") {
		            var re = new RegExp("^\\d+$|\\d*" + decimalSeparator + "\\d+");
		            if (!re.exec(val)) {
		                invalidCallback.apply(this);
		            } else {
		                validCallback.apply(this);
    		        }
		        }
		    }
	    );
        return this;
    }
})(jQuery);


(function($) {
    /* hoverIntent by Brian Cherne */
    $.fn.hoverIntent = function(f, g) {
        // default configuration options
        var cfg = {
            sensitivity: 7,
            interval: 100,
            timeout: 0
        };
        // override configuration options with user supplied object
        cfg = $.extend(cfg, g ? { over: f, out: g} : f);

        // instantiate variables
        // cX, cY = current X and Y position of mouse, updated by mousemove event
        // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
        var cX, cY, pX, pY;

        // A private function for getting mouse position
        var track = function(ev) {
            cX = ev.pageX;
            cY = ev.pageY;
        };

        // A private function for comparing current and previous mouse position
        var compare = function(ev, ob) {
            ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
            // compare mouse positions to see if they've crossed the threshold
            if ((Math.abs(pX - cX) + Math.abs(pY - cY)) < cfg.sensitivity) {
                $(ob).unbind("mousemove", track);
                // set hoverIntent state to true (so mouseOut can be called)
                ob.hoverIntent_s = 1;
                return cfg.over.apply(ob, [ev]);
            } else {
                // set previous coordinates for next time
                pX = cX; pY = cY;
                // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
                ob.hoverIntent_t = setTimeout(function() { compare(ev, ob); }, cfg.interval);
            }
        };

        // A private function for delaying the mouseOut function
        var delay = function(ev, ob) {
            ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
            ob.hoverIntent_s = 0;
            return cfg.out.apply(ob, [ev]);
        };

        // A private function for handling mouse 'hovering'
        var handleHover = function(e) {
            // next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
            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; }

            // copy objects to be passed into t (required for event object to be passed in IE)
            var ev = jQuery.extend({}, e);
            var ob = this;

            // cancel hoverIntent timer if it exists
            if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }

            // else e.type == "onmouseover"
            if (e.type == "mouseover") {
                // set "previous" X and Y position based on initial entry point
                pX = ev.pageX; pY = ev.pageY;
                // update "current" X and Y position based on mousemove
                $(ob).bind("mousemove", track);
                // start polling interval (self-calling timeout) to compare mouse coordinates over time
                if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout(function() { compare(ev, ob); }, cfg.interval); }

                // else e.type == "onmouseout"
            } else {
                // unbind expensive mousemove event
                $(ob).unbind("mousemove", track);
                // if hoverIntent state is true, then call the mouseOut function after the specified delay
                if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout(function() { delay(ev, ob); }, cfg.timeout); }
            }
        };

        // bind the function to the two event listeners
        return this.mouseover(handleHover).mouseout(handleHover);
    };

})(jQuery);


/*
* Superfish v1.4.8 - jQuery menu widget
* Copyright (c) 2008 Joel Birch
*
* Dual licensed under the MIT and GPL licenses:
* 	http://www.opensource.org/licenses/mit-license.php
* 	http://www.gnu.org/licenses/gpl.html
*
* CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
*/
(function($) {
    $.fn.superfish = function(op) {

        var sf = $.fn.superfish,
			c = sf.c,
			$arrow = $(['<span class="', c.arrowClass, '"> &#187;</span>'].join('')),
			over = function() {
			    var $$ = $(this), menu = getMenu($$);
			    clearTimeout(menu.sfTimer);
			    $$.showSuperfishUl().siblings().hideSuperfishUl();
			},
			out = function() {
			    var $$ = $(this), menu = getMenu($$), o = sf.op;
			    clearTimeout(menu.sfTimer);
			    menu.sfTimer = setTimeout(function() {
			        o.retainPath = ($.inArray($$[0], o.$path) > -1);
			        $$.hideSuperfishUl();
			        if (o.$path.length && $$.parents(['li.', o.hoverClass].join('')).length < 1) { over.call(o.$path); }
			    }, o.delay);
			},
			getMenu = function($menu) {
			    var menu = $menu.parents(['ul.', c.menuClass, ':first'].join(''))[0];
			    sf.op = sf.o[menu.serial];
			    return menu;
			},
			addArrow = function($a) { $a.addClass(c.anchorClass).append($arrow.clone()); };

        return this.each(function() {
            var s = this.serial = sf.o.length;
            var o = $.extend({}, sf.defaults, op);
            o.$path = $('li.' + o.pathClass, this).slice(0, o.pathLevels).each(function() {
                $(this).addClass([o.hoverClass, c.bcClass].join(' '))
					.filter('li:has(ul)').removeClass(o.pathClass);
            });
            sf.o[s] = sf.op = o;

            $('li:has(ul)', this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over, out).each(function() {
                if (o.autoArrows) addArrow($('>a:first-child', this));
            })
			.not('.' + c.bcClass)
				.hideSuperfishUl();

            var $a = $('a', this);
            $a.each(function(i) {
                var $li = $a.eq(i).parents('li');
                $a.eq(i).focus(function() { over.call($li); }).blur(function() { out.call($li); });
            });
            o.onInit.call(this);

        }).each(function() {
            var menuClasses = [c.menuClass];
            if (sf.op.dropShadows && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
            $(this).addClass(menuClasses.join(' '));
        });
    };

    var sf = $.fn.superfish;
    sf.o = [];
    sf.op = {};
    sf.IE7fix = function() {
        var o = sf.op;
        if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity != undefined)
            this.toggleClass(sf.c.shadowClass + '-off');
    };
    sf.c = {
        bcClass: 'sf-breadcrumb',
        menuClass: 'sf-js-enabled',
        anchorClass: 'sf-with-ul',
        arrowClass: 'sf-sub-indicator',
        shadowClass: 'sf-shadow'
    };
    sf.defaults = {
        hoverClass: 'sfHover',
        pathClass: 'overideThisToUse',
        pathLevels: 1,
        delay: 800,
        animation: { opacity: 'show' },
        speed: 'normal',
        autoArrows: true,
        dropShadows: true,
        disableHI: false, 	// true disables hoverIntent detection
        onInit: function() { }, // callback functions
        onBeforeShow: function() { },
        onShow: function() { },
        onHide: function() { }
    };
    $.fn.extend({
        hideSuperfishUl: function() {
            var o = sf.op,
				not = (o.retainPath === true) ? o.$path : '';
            o.retainPath = false;
            var $ul = $(['li.', o.hoverClass].join(''), this).add(this).not(not).removeClass(o.hoverClass)
					.find('>ul').hide().css('visibility', 'hidden');
            o.onHide.call($ul);
            return this;
        },
        showSuperfishUl: function() {
            var o = sf.op,
				sh = sf.c.shadowClass + '-off',
				$ul = this.addClass(o.hoverClass)
					.find('>ul:hidden').css('visibility', 'visible');
            sf.IE7fix.call($ul);
            o.onBeforeShow.call($ul);
            $ul.animate(o.animation, o.speed, function() { sf.IE7fix.call($ul); o.onShow.call($ul); });
            return this;
        }
    });

})(jQuery);

