    var wizardMaker;

    wizardMaker = function(start_object)
    {
        var window_open = false;
        var loading = false; //if loading, will temporarily not let you do anything else
        var start_slide = ""; //opening slide
        var start_function = function(){};
        var needs_auth = true;
        var slides = {}; //The slides contained in the wizard, and what they do
        var slide_speed = 1000; //Speed at which the slides slide
        var past = new Array(); //Array representing slides you've gone to already
        var data = {}; //Carries needed data to pass from slide to slide
        var current = 0; //Current item we're on in past
        var hidden_link = null; //Saving the hidden link that is used to open this
        var onCloseFunction = function(){};

        var directionDefaults = {'sendTo' : '', //What slide to go to
                                 'check' : function(){return true;}, //function to check if you can go forward
                                 'onClick' : function(){},
                                 'alwaysLoad' : false, //Should I always get this through AJAX?
                                 'slideDirection' : 'right'}; //Way it should slide

        var optionDefaults = {'action' : "", //Action the slide will load from.  addstore/opening.
                              'onLoad' : function(){}, //Used to add listeners.  What to do when slide loads
                              'onPreload' : function(){},
                              'dataNeeded' : "", //Name of slide that holds data needed to load
                              'right' : null, //What to do when right is clicked
                              'left' : null,
                              'up' : null,
                              'down' : null,
                              'width' : 0,
                              'height' : 0}

        _init(start_object);

        function _init(start_object)
        {
            start_object.click(function(){

                if(!window_open)
                {
                    window_open = true;

                    var options = _getSlideOptions(start_slide);

                    if(!hidden_link)
                    {
                        $('body').append('<a style="display:none" class="wizard_opening_link" href="' + absoluteFilepath(options['action']) +'">temp</a>');

                        hidden_link = $('body .wizard_opening_link:last-child');

                        hidden_link.fancybox({
                            'hideOnContentClick' : false,
                            'callbackOnLoad' : _onPreload,
                            'callbackOnShow' : _onShow,
                            'callbackOnClose' : _closeAll,
                            'frameWidth' : options['width'] - 20,
                            'frameHeight' : options['height'] - 20,
                            'centerOnScroll' : false
                        });
                    }

                    hidden_link.click().blur();
                }

                start_object.blur();

                return false;
            });
        }

        function _getSlideOptions(name)
        {
            if(typeof(slides[name]) != 'undefined')
            {
                return slides[name];
            }
            else
            {
                return false;
            }
        }

        function _addToSlides(name, slide_data)
        {
            if(_getSlideOptions(name))
            {
                alert("already a slide of name " + name);
            }
            else
            {
                slides[name] = slide_data;
            }
        }

        function _onPreload(callback)
        {
            start_function();

            var options = _getSlideOptions(start_slide);

            $.post(absoluteFilepath(options['action']), data[options['dataNeeded']], function(results){
                callback(results);
            });
        }

        function _onShow()
        {
            var options = _getSlideOptions(start_slide);

            $('#fancy_ajax').wrapInner("<div class='addstore_div' name='" + start_slide + "'></div>");
            _getSlide(start_slide).css({
                'width' : options['width'] - 20,
                'height' : options['height'] - 20
            }).show();
            
            _pastAdd(start_slide);
            options['onLoad']();
            _showNavs();
            _addNavListeners();
        }

        function _addNavListeners()
        {
                $('#fancy_right').click(function(){
                    if(!loading)
                        _slideAction(_getNavOptions(_currentAction(), 'right'));
                });

                $('#fancy_left').click(function(){
                    if(!loading)
                        _slideAction(_getNavOptions(_currentAction(), 'left'));
                });

                $('#fancy_down').click(function(){
                    if(!loading)
                        _slideAction(_getNavOptions(_currentAction(), 'down'));
                });

                $('#fancy_up').click(function(){
                   if(!loading)
                       _slideAction(_getNavOptions(_currentAction(), 'up'));
                });
        }

        function _getNavOptions(name, direction)
        {
            if(typeof(slides[past[current]]) == 'undefined')
            {
                alert("YOU TRIED TO GO TO A NONEXISTANT SLIDE");
            }

            return slides[name][direction];
        }

        function _shift(current_slide, next_slide, direction, callback)
        {
            $('#fancy_left').hide();
            $('#fancy_right').hide();

             var width_px = slides[_getName(next_slide)]['width'];
             var height_px = slides[_getName(next_slide)]['height'];

             var left_px = $('#fancy_outer').offset().left - ((width_px - slides[_getName(current_slide)]['width']) / 2);//(width_px + 36) > $(window).width() ? $(document).scrollLeft() : $(document).scrollLeft() + Math.round($(window).width() - width_px - 36)	/ 2;
		     var top_px = $('#fancy_outer').offset().top - ((height_px - slides[_getName(current_slide)]['height']) / 2);

             if(top_px < 0)
             {
                 top_px = 0;
             }
             
             var current_left = 0;
             var current_bottom = 0;

             next_slide.show();
             next_slide.find('.addstore_error').html("");

             switch(direction)
             {
                 case 'left':
                 {
                     next_slide.css({
                         "left" : -(slides[_getName(next_slide)]['width']),
                         "bottom" : 0
                     });

                     current_left = slides[_getName(next_slide)]['width'];
                     break;
                 }
                 case 'down':
                 {
                     next_slide.css({
                         "left" : 0,
                         "bottom" : parseInt(-$('#fancy_content').outerHeight(true))
                     });

                     current_bottom = parseInt($('#fancy_content').outerHeight(true))
                     break;
                 }
                 case 'up':
                 {
                     next_slide.css({
                         "left" : 0,
                         "bottom" : parseInt($('#fancy_content').outerHeight(true))
                     });

                     current_bottom = parseInt(-$('#fancy_content').outerHeight(true))
                     break;
                 }
                 case 'right':
                 default:
                 {
                     next_slide.css({
                         "left" : parseInt($('#fancy_content').outerWidth(true)),
                         "bottom" : 0
                     });

                     current_left = -(slides[_getName(current_slide)]['width']);//-(slides[_getName(current_slide)]['width'] + (slides[_getName(next_slide)]['width'] - slides[_getName(current_slide)]['width']) / 2)
                     break;
                 }
             }

             current_slide.animate({
                    left: current_left,
                    bottom : current_bottom
                 },
                 slide_speed,
                 null,
                 function(){
                     current_slide.hide();
                 });

             next_slide.animate({
                    left: 0,
                    bottom: 0
                },
                slide_speed,
                null,
                function(){
                    callback();
                });

             $('#fancy_outer').animate({
                 width: width_px,
                 height: height_px,
                 left: left_px,
                 top: top_px
             },
             slide_speed);
                       
        }

        function _load(slide_name, callback)
        {
            slides[slide_name]['onPreload']();

            $('#fancy_ajax').append("<div class='addstore_div' name='" + slide_name + "'>");

            $.post(absoluteFilepath(slides[slide_name]['action']), _getDataNeeded(slide_name), function(result){
               
               _getSlide(slide_name).append(result)
                    .css({
                        'left' : parseInt($('#fancy_content').outerWidth(true)),
                        'width' : slides[slide_name]['width'] - 20,
                        'height' : slides[slide_name]['height'] - 20
                    });

                callback();
            });
        }

        function _slideAction(options)
        {
             loading = true;

            var next_slide = options['sendTo'];

            if(!options['check']())
            {
                _hideLoading();
            }
            else
            {
                options['onClick']();

                if(options['alwaysLoad'] || _pastFind(next_slide).toString() == 'false')
                {
                    _pastAdd(next_slide);
                    _showLoading();
                    _load(next_slide, function(){
                          slides[next_slide]['onLoad']();
                          _shift(_currentSlide(), _getSlide(next_slide), options['direction'], function(){
                               current++;
                               _showNavs();
                               _hideLoading();
                           });
                    });
                }
                else
                {
                    _shift(_currentSlide(), _getSlide(next_slide), options['direction'], function(){
                               current = _pastFind(next_slide);
                               _showNavs()
                               _hideLoading();
                           });
                }                
            }
        }

        function _showNavs()
        {
            var current_slide = slides[past[current]];

            if(current_slide['left'])
                $('#fancy_left').show();
            else
                $('#fancy_left').hide();
            
            if(current_slide['right'])
                $('#fancy_right').show();
            else
                $('#fancy_right').hide();

            if(current_slide['up'])
                $('#fancy_up').show();
            else
                $('#fancy_up').hide();

            if(current_slide['down'])
                $('#fancy_down').show();
            else
                $('#fancy_down').hide();
        }

        function _pastAdd(name)
        {
            for(var i = past.length - 1; i > current; i--)
            {
                _getSlide(past.pop()).remove();
            }

            past.push(name);
        }

        function _pastFind(name)
        {
            for(var i = 0; i < past.length; i++)
            {
                if(past[i] == name)
                {
                    return i;
                }
            }

            return false;
        }

        function _getName(slide)
        {
            return slide.attr('name');
        }

        function _getSlide(name)
        {
            return $('.addstore_div[name="' + name + '"]');
        }

        function _currentAction()
        {
            return past[current];
        }

        function _currentSlide()
        {
            return _getSlide(_currentAction());
        }

        function _getDataNeeded(slide_name)
        {
            var data_needed = slides[slide_name]['dataNeeded'];

            if(data_needed)
            {
                return data[data_needed];
            }
            else
            {
                return {};
            }
        }

        function _showLoading()
        {
            _currentSlide().prepend('<img class="addstore_loading" src="' + absoluteFilepath('images/maploader.gif') + '">');
        }

        function _hideLoading()
        {
            loading = false;
            $('.addstore_loading').remove();
        }

        function _closeAll()
        {
            past = new Array();
            current = 0;

            $("#fancy_ajax").html("");

            loading = false;

            onCloseFunction();

            window_open = false;
        }

        this.setClose = function(the_function)
        {
            onCloseFunction = the_function;
        }

        this.addSlide = function(name)
        {
            var new_slide = $.extend({}, optionDefaults, {});

            _addToSlides(name, new_slide);
        }

        this.setInitialFunction = function(starting_function)
        {
            start_function = starting_function;
        }

        this.setInitialSlide = function(name)
        {
            start_slide = name;
        }

        this.setSlideNavOptions = function(name, direction, new_options)
        {
            if(direction != 'left' && direction != 'right' && direction != 'up' && direction != 'down')
            {
                alert("SlideNavOptions must be left, right, up, down");
            }
            else
            {
                if(slides[name][direction])
                {
                    slides[name][direction] = $.extend({}, slides[name][direction], new_options);
                }
                else
                {
                    slides[name][direction] = $.extend({}, directionDefaults, new_options);
                }
            }
        }

        this.activate = function(options)
        {
            if(loading != true)
            {
                _slideAction( $.extend({}, directionDefaults, options) );
            }
        }

        this.setSlideOptions = function(name, new_options)
        {
            slides[name] = $.extend({}, slides[name], new_options);
        }

        this.setData = function(name, new_data)
        {
            data[name] = new_data;
        }

        this.getData = function(name)
        {
            return data[name];
        }

        this.getSlideOptions = function(name)
        {
            return _getSlideOptions(name);
        }

        this.checkLoggedIn = function()
        {
            if(!needs_auth)
            {
                return true;
            }

            var logged_in = false;

            $.ajax({
                'url' : absoluteFilepath('slides/checkloggedin'),
                'async' : false,
                'success' : function(results)
                {
                    if(results == 'yes')
                    {
                       logged_in = true;
                    }
                }
            })

            return logged_in;
        }

    }

