﻿jQuery.extend({
    loader: {
        load: {},
        ajax: {},
        add: function(type, name, fn) {
            if (type == 'load') {
                this.load[name] = fn;
            } else {
                this.ajax[name] = fn;
            }
        },
        execute: function(type) {
            var chain;
            if (type == 'load') { chain = this.load; }
            else { chain = this.ajax; }
            for (var fn in chain) { chain[fn](); }
        },
        onLoad: function() { this.execute('load'); },
        onRefresh: function() {
            var hidden = $("<div/>");
            var refreshLocation = window.location;
            if ($("#refreshLocation").length) refreshLocation = $("#refreshLocation").val();
            hidden.load(refreshLocation + "?r=" + Math.floor(Math.random() * 65535) + " [ajaxrefresh='true']",
        function() {
            hidden.children().each(
                function() { var block = $(this); var id = block.attr('id'); $('#' + id).html(block.html()); }
                );
            $.loader.execute('ajax');
        });
        }
    },
    ajaxPostAndUpdate: function(url, payload, callback) {
        if (callback == null) callback = function() { $.loader.onRefresh(); }
        $.post(url, payload, callback);
    },
    jsonPost: function(url, payload, callback) {
        $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", data: payload, dataType: "json", url: url, success: callback });
    },
    notify: function(msg) {
        noticesHandler();
        $("#notices .notice:first").html(msg);
        $("#notices").show();
    },
    timer: {
        guid: 1,
        global: {},
        regex: /^([0-9]+)\s*(.*s)?$/,
        powers: {
            // Yeah this is major overkill...
            'ms': 1,
            'cs': 10,
            'ds': 100,
            's': 1000,
            'das': 10000,
            'hs': 100000,
            'ks': 1000000
        },
        timeParse: function(value) {
            if (value == undefined || value == null)
                return null;
            var result = this.regex.exec(jQuery.trim(value.toString()));
            if (result[2]) {
                var num = parseInt(result[1], 10);
                var mult = this.powers[result[2]] || 1;
                return num * mult;
            } else {
                return value;
            }
        },
        add: function(element, interval, label, fn, times, belay) {
            var counter = 0;

            if (jQuery.isFunction(label)) {
                if (!times)
                    times = fn;
                fn = label;
                label = interval;
            }

            interval = jQuery.timer.timeParse(interval);

            if (typeof interval != 'number' || isNaN(interval) || interval <= 0)
                return;

            if (times && times.constructor != Number) {
                belay = !!times;
                times = 0;
            }

            times = times || 0;
            belay = belay || false;

            if (!element.$timers)
                element.$timers = {};

            if (!element.$timers[label])
                element.$timers[label] = {};

            fn.$timerID = fn.$timerID || this.guid++;

            var handler = function() {
                if (belay && this.inProgress)
                    return;
                this.inProgress = true;
                if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
                    jQuery.timer.remove(element, label, fn);
                this.inProgress = false;
            };

            handler.$timerID = fn.$timerID;

            if (!element.$timers[label][fn.$timerID])
                element.$timers[label][fn.$timerID] = window.setInterval(handler, interval);

            if (!this.global[label])
                this.global[label] = [];
            this.global[label].push(element);

        },
        remove: function(element, label, fn) {
            var timers = element.$timers, ret;

            if (timers) {

                if (!label) {
                    for (label in timers)
                        this.remove(element, label, fn);
                } else if (timers[label]) {
                    if (fn) {
                        if (fn.$timerID) {
                            window.clearInterval(timers[label][fn.$timerID]);
                            delete timers[label][fn.$timerID];
                        }
                    } else {
                        for (var fn in timers[label]) {
                            window.clearInterval(timers[label][fn]);
                            delete timers[label][fn];
                        }
                    }

                    for (ret in timers[label]) break;
                    if (!ret) {
                        ret = null;
                        delete timers[label];
                    }
                }

                for (ret in timers) break;
                if (!ret)
                    element.$timers = null;
            }
        }
    }
});

jQuery.fn.extend({
    everyTime: function(interval, label, fn, times, belay) {
        return this.each(function() {
            jQuery.timer.add(this, interval, label, fn, times, belay);
        });
    },
    oneTime: function(interval, label, fn) {
        return this.each(function() {
            jQuery.timer.add(this, interval, label, fn, 1);
        });
    },
    stopTime: function(label, fn) {
        return this.each(function() {
            jQuery.timer.remove(this, label, fn);
        });
    }
});

if (jQuery.browser.msie)
    jQuery(window).one("unload", function() {
        var global = jQuery.timer.global;
        for (var label in global) {
            var els = global[label], i = els.length;
            while (--i)
                jQuery.timer.remove(els[i], label);
        }
    });
    
var noticesHandler = function() {
    var hidenotices = $(".closenotices a");
    hidenotices.unbind("click");
    hidenotices.click(function() { $("#notices").fadeOut("350", function() { $(this).hide(); }); return false; });
    if ( $("#notices .notice").length > 0 )
    {
      $("#notices").show();
    }
}

var notifyResult = function(msg) {
    $.notify(msg);
}

var removeCartItemHandler = function() {
    $(".remove").click(function() {
      $.ajaxPostAndUpdate($(this).attr('href'), "count=" + $("#quantity").val());
      return false;
    });
    $(".removeall").click(function() {
      $.ajaxPostAndUpdate($(this).attr('href'), "");
      return false;
    });
}

$(document).ready(function() { $.loader.onLoad(); });

// Auto Tab function - see Organisation/Register-Step3.haml for an example
// Found at: http://www.lousyllama.com/sandbox/jquery-autotab
(function($) {
    $.fn.autotab = function(options) {
        var defaults = {
            format: 'all', 		
            maxlength: 2147483647, 
            uppercase: false, 	
            lowercase: false, 	
            nospace: false, 	
            target: null, 		
            previous: null		
        };

        $.extend(defaults, options);

        var check_element = function(name) {
            var val = null;
            var check_id = $('#' + name)[0];
            var check_name = $('input[name=' + name + ']')[0];

            if (check_id != undefined)
                val = $(check_id);
            else if (check_name != undefined)
                val = $(check_name);

            return val;
        };

        var key = function(e) {
            if (!e)
                e = window.event;

            return e.keyCode;
        };

        // Sets targets to element based on the name or ID passed
        if (typeof defaults.target == 'string')
            defaults.target = check_element(defaults.target);

        if (typeof defaults.previous == 'string')
            defaults.previous = check_element(defaults.previous);

        var maxlength = $(this).attr('maxlength');

        // Each text field has a maximum character limit of 2147483647

        // defaults.maxlength has not changed and maxlength was specified
        if (defaults.maxlength == 2147483647 && maxlength != 2147483647)
            defaults.maxlength = maxlength;
        // defaults.maxlength overrides maxlength
        else if (defaults.maxlength > 0)
            $(this).attr('maxlength', defaults.maxlength)
        // defaults.maxlength and maxlength have not been specified
        // A target cannot be used since there is no defined maxlength
        else
            defaults.target = null;

        // IE does not recognize the backspace key
        // with keypress in a blank input box
        if ($.browser.msie) {
            this.keydown(function(e) {
                if (key(e) == 8) {
                    var val = this.value;

                    if (val.length == 0 && defaults.previous)
                        defaults.previous.focus();
                }
            });
        }

        return this.keypress(function(e) {
            if (key(e) == 8) {
                var val = this.value;

                if (val.length == 0 && defaults.previous)
                    defaults.previous.focus();
            }
        }).keyup(function(e) {
            var val = this.value;

            switch (defaults.format) {
                case 'text':
                    var pattern = new RegExp('[0-9]+', 'g');
                    var val = val.replace(pattern, '');
                    break;

                case 'alpha':
                    var pattern = new RegExp('[^a-zA-Z]+', 'g');
                    var val = val.replace(pattern, '');
                    break;

                case 'number':
                case 'numeric':
                    var pattern = new RegExp('[^0-9]+', 'g');
                    var val = val.replace(pattern, '');
                    break;

                case 'alphanumeric':
                    var pattern = new RegExp('[^0-9a-zA-Z]+', 'g');
                    var val = val.replace(pattern, '');
                    break;

                case 'all':
                default:
                    break;
            }

            if (defaults.nospace) {
                pattern = new RegExp('[ ]+', 'g');
                val = val.replace(pattern, '');
            }

            if (defaults.uppercase) val = val.toUpperCase();
            if (defaults.lowercase) val = val.toLowerCase();

            this.value = val;            
            var keys = [8, 9, 16, 17, 18, 19, 20, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 144, 145];
            var string = keys.toString();

            if (string.indexOf(key(e)) == -1 && val.length == defaults.maxlength && defaults.target)
                defaults.target.focus();
        });
    };

})(jQuery);

jQuery.fn.extend({
    setIngredientTooltips: function(text) {
        return this.each(function() {
            var id = $(this).attr('target');
            var tooltip = $(this);
            var target = $("#" + id);
            var topOffset = 0;
            if (jQuery.browser.msie && ($.browser.version == "7.0" || $.browser.version == "8.0")) {
                topOffset -= 150;
            }
            $(this).attr('style', 'display:none; margin-top:' + topOffset + 'px;');
            $(this).css("top", (parseInt(target.attr('offsetTop')) + parseInt("22")) + "px").css("left", (parseInt(target.attr('offsetLeft')) + parseInt("12")) + "px");
            target.mouseover(function() { tooltip.show(); });
            target.mouseout(function() { tooltip.hide(); });
        });
    }
});

function printPage() {
    window.print(); return false;
}

function registrationCallback(data, status) {
    alert(status);
}

function loginCallback(data, status) {
    alert(status);
}
