var Featured = new Singleton(function($) {
    var base = this;

    this.dependencies = {
        stylesheets: {
            block: '/stylesheets/jquery/block/jquery.block.css'
        },
        javascripts: {
            'jQuery.fn.syncselect': '/javascripts/jquery/1.4/plugins/syncselect.js',
            'jQuery.ui.block': '/javascripts/jquery/1.4/plugins/block.js',
            'ListingViewer': '/javascripts/listing_viewer.js',
            'ImagePreloader': '/javascripts/image_preloader.js'
        }
    };
    
    this.editDialog;
    this.message = '<img src="/images/loading_icons/loading_dark_transparent.gif" alt="loading" />Please Wait';
    this.methods({
        dependenciesLoaded: function() {
            $('#category-form select').bind('change', function() {
                $('#page').val(1);
                base.refreshListings();
            });
            
            $('label[for="category_sort"]').syncselect();
            
            this.preloader = new ImagePreloader();
            this.preloader.load({
                loading: '/javascripts/jquery/1.4/themes/corestore/images/ui-anim.basic.16x16.gif',
                success: '/images/fugue/icons/tick-circle-frame.png'
            });
        },
        ready: function() {
            this.createDialog();
            
            $('#listings').delegate('.search_result .view_listing_details', 'click', function() {
                ListingViewer.requestListing(this.href);
                return false;
            });
            
            $('#listings').delegate('.search_result .edit_listing', 'click', function() {
                base.editDialog.dialog('open').loading(true).load(this.href, function() {
                    
                    base.editDialog.find('.tabs a').bind('click', function() {
                        $(this).addClass('active').siblings().removeClass('active');
                        var section = $(this).attr('href').split('#')[1];
                        base.editDialog.find('.section').hide().filter('#' + section).show();
                        return false;
                    }).eq(0).trigger('click');
                    
                    base.editDialog.find('form').ajaxify('submit', {
                        dataType: 'json',
                        beforeSend: function() {
                            base.editDialog.loading(true);
                            base.editDialog.dialog('buttons').attr('disabled', true).addClass('ui-state-disabled');
                        },
                        success: function(data) {
                            base.editDialog.dialog('close');
                            base.editDialog.dialog('buttons').removeAttr('disabled').removeClass('ui-state-disabled');
                            Agents.flash = data;
                            Agents.checkFlashMessage();
                            base.refreshListings();
                        }
                    });
                    
                    base.editDialog.delegate('#images .custom a.delete-image', 'click', function() {
                        if (confirm('Are you sure you want to remove this image?')) {
                            $.post(this.href, { _method: 'DELETE' });
                            $(this).closest('.image').fadeOut();
                        }
                        return false;
                    });
                    
                    base.editDialog.delegate('#images a.add-image', 'click', function() {
                        var self = this;
                        FileUploader.open({ name: 'image[uploaded_data]', url: this.href }, function(image) {
                            image = $.parseJSON(image);
                            image.url = self.href;
                            base.images.openCropper(image);
                        });
                    });

                    base.editDialog.dialog('option', 'position', 'center');
                });
                return false;
            });
            
            $('#listings').delegate('.search_result .remove_listing', 'click', function() {
                if (confirm('Are you sure you want to remove this featured listing?')) {
                    $('#listings').block({ message: base.message });
                    $.post(this.href, { _method: 'DELETE' }, function(data) {
                        Agents.flash = data;
                        Agents.checkFlashMessage();
                        base.refreshListings();
                    });
                }
                return false;
            });

            $('#featured-categories').delegate('a.delete', 'click', function() {
                if (confirm('Are you sure you want to remove this featured category?')) {
                    $.submit('DELETE', this.href);
                }
                return false;
            });            

            $('#featured-category').delegate('a.remove-auto-resource', 'click', function() {
                if (confirm('Are you sure you want to remove this item?')) {
                    $.submit('DELETE', this.href);
                }
                return false;
            });

            $('#featured-category').delegate('a.remove-all-listings', 'click', function() {
                if (confirm('Are you sure you want to remove all of your featured listings?')) {
                    $.submit(this.href);
                }
                return false;
            });
            
            var image;
            $('#mls-form').ajaxify('submit', {
                beforeSend: function() {
                    image = $('<img/>', { src: base.preloader.sources.loading }).appendTo($('#status-indicator').empty());
                },
                success: function(data) {
                    image.attr('src', base.preloader.sources.success);
                    window.setTimeout(function() {
                        image.fadeOut(function() { $(this).remove(); });
                    }, 5000);
                    Agents.flash = data;
                    Agents.checkFlashMessage();
                    base.refreshListings();
                }
            });
            
            $('#listings').delegate('.pagination a', 'click', function() {
                var page = $.extractParam($(this).attr('href'), 'page');
                $('#page').val(page);
                base.refreshListings();
                return false;
            });
        },
        refreshListings: function() {
            $('#listings').block({ message: base.message });
            $.get(document.location.href, $('#category-form').serialize(), function(data) {
                $('#listings').html(data).block('destroy').find('.photo img').bind('error', function() {	
                    $(this).attr('src', '/images/listings/nopic.png');
    			});
            });
        },
        createDialog: function() {
            this.editDialog = $('<div/>').dialog({
        		autoOpen: false,
        		bgiframe: true,
        		width: 400,
        		height: 'auto',
        		modal: true,
        		resizable: false,
        		title: 'Edit Featured Listing',
        		buttons: {
        			Save: $.ui.dialog.save,
        			Close: $.ui.dialog.close
        		}
        	});
        }
    });
    
    this.namespace('images', function() {
        this.methods({
            openCropper: function(image) {
    			ImageCropper.open(image.s3_url, { aspectRatio: (160 / 120), mustSelect: true }, '', function(coodinates) {
                    base.images.crop(image, coodinates);
                });
    		},
            crop: function(image, coordinates) {
                $.post(image.url + '/' + image.id, $.extend(coordinates, { _method: 'PUT' }), function(data) {
                    $('#images .custom ul').append(data);
                });
    		}
        });
    });
});
