$.fn.extend({
    reset: function() {
        return this.each(function() {
            if ( $(this).is('form') ) this.reset();
        })
    }
});

$(function(){
    var lightBoxFormat = '<b>%d</b> Locations — <b>%d</b> Images';
    
    var rowFormat = '<tr id="location-%d"></tr>';
    var thumbCellFormat = '<td class="thumbnails"><ul></ul></td>';
    var thumbFormats = [
            '<li><a class="noicon" href="' + inLocationDFSBase + '/%s/ws.jpeg" title="%s"><img src="' + inLocationDFSBase + '/%s/sq.jpeg" /></a></li>',
            '<li><a class="noicon" href="' + inLocationDFSBase + '/%s/ws.jpeg" title="%s"><!-- IE --></a></li>'
        ];
    var textCellFormat = '<td class="information"></td>';
    var textFormats = [
            '<div class="name">%s%s</div>',
            ' <span>%s%s</span>',
            '<div class="count">%d Images</div>',
            '<div class="description">%s</div>'
        ];
    
    var statusFormat = "Displaying %d locations of %d.";
    var pagingFormat = "Page %d of %d — %d Locations";
    
    var rowClicked = function() {
        //var offset = $(this).parent().parent().data('id');
        //window.location = "/location/" + offset;
        return false;
    };
    
    var onLightbox = function(data) {
        var button = $('#location-' + data.location + ' .lightbox');
        
        if ( data.status == 'error' ) {
            $.flash.error('Lightbox Error', data.message);
            
            switch ( data.action ) {
                case 'add':
                    button.removeClass('loading').addClass('positive');
                    break;
                
                case 'remove':
                    button.removeClass('loading').addClass('negative');
                    break;
            }
        } else {
            switch ( data.action ) {
                case 'add':
                    button.removeClass('loading').addClass('negative');
                    break;
            
                case 'remove':
                    button.removeClass('loading').addClass('positive');
                    break;
            }
            
            $('#manage-lightbox div').html($.sprintf(lightBoxFormat, data.count.locations, data.count.images));
            $('#manage-lightbox').flashOnce();
        }
    };
    
    onSearchResults = function(data) {
        
        if ( data.results.length == 0 ) {
            $.flash.warning('Nothing Found', "Your search returned zero results.  Please widen your search criteria.");
            $('#location-search button[type="submit"]').removeClass('loading').addClass('search').text('Search Locations').blur();
            return;
        }
        
        $("#table-search tbody").empty();
        $("#searchbox").slideUp();
        
        
        for ( var i in data.results ) {
            var location = data.results[i];
            
            var row = $($.sprintf(rowFormat, location.id)).data('location', Number(location.id));
            var cell = $(thumbCellFormat);
            var target = cell.find('ul');
            
            for ( var j in location.images ) {
                var image = location.images[j];
                
                target.append($.sprintf(
                        thumbFormats[j < 1 ? 0 : 1],
                        image.uuid,
                        image.name,
                        image.uuid
                    ));
            }
            
            cell.find("a").lightbox();
            row.append(cell);
            
            cell = $(textCellFormat);
            cell.append($.sprintf(
                    textFormats[0],
                    location.name,
                    location.address ? (
                    location.address.region ? $.sprintf(
                            textFormats[1],
                            location.address.city ? location.address.city + ', ' : '',
                            location.address.region
                        ) : '') : ''
                ));
            cell.append($.sprintf(textFormats[2], location.images.length));
            cell.append($.sprintf(textFormats[3], location.description));
            
            cell.find('.count,.name,.description').css('cursor', 'pointer').click(rowClicked);
            
            cell.append('<div class="buttons"><a href="/location/' + location.id + '" class="button icon details">Show Details</a><a class="lightbox button icon ' + (location.lightbox ? 'negative' : 'positive') + '">Lightbox</a>' + (location.mapable ? '<a rel="facebox" href="/location/' + location.id + '/map" class="button icon map">Show Map</a>' : '') + '</div>');
            
            cell.find('.button.icon.details').click(function(){
                $.cookie('INSavedSearh', "yes", {path: '/'});
                window.location = $(this).attr('href');
                return false;
            });
            
            row.append(cell);
            
            $("#table-search tbody").append(row);
        }
        
        $('a[rel*=facebox]').facebox();
        
        $('#results').slideDown('fast');
        $('#search-info').text($.sprintf(pagingFormat, data.page, data.pages, data.count));
        if ( data.pages > 1 ) $('#doFindMore').css({visibility: 'visible'});
        else $('#doFindMore').css({visibility: 'hidden'});
        if ( data.page > 1 ) $('#doFindLess').css({visibility: 'visible'});
        else $('#doFindLess').css({visibility: 'hidden'});
        $('#location-search button[type="submit"]').removeClass('loading').addClass('search').text('Search Locations').blur();
        
        $('a.lightbox').click(function(){
            var id = $(this).parents('tr').data('location');
            
            if ( $(this).hasClass('positive') ) {
                $(this).removeClass('positive').addClass('loading').blur();
                $.inLoc.location.lightbox(onLightbox, {action: 'add', location: id});
            } else if ( $(this).hasClass('negative') ) {
                $(this).removeClass('negative').addClass('loading').blur();
                $.inLoc.location.lightbox.remove(onLightbox, {action: 'remove', location: id});
            }
            
            return false;
        });
    };
    
    doSearch = function(page) {
        $('#page').val(page);
        
        if ( $('#doFindMore').is(':visible') ) $('#doFindMore').css({visibility: 'hidden'});
        if ( $('#doFindLess').is(':visible') ) $('#doFindLess').css({visibility: 'hidden'});
        
        if ( $('#results').is(':visible') ) {
            $('#results').slideUp('fast', function(){ doSearch(page); });
            return false;
        }
        
        $('#location-search button[type="submit"]').removeClass('search').addClass('loading').text('Please Wait').blur();
        
        $.inLoc.search(onSearchResults, {
                's-category': $('#s-category').val(),
                's-region': $('#s-region').val(),
                's-query': $('#s-query').val(),
                's-query-kind': $('#s-query-kind').val(),
                's-query-in': $('#s-query-in :checked').val(),
                'page': page
            });
        
        return false;
    };
    
    $('#location-search').submit(function(){ return doSearch(1); });
    $('#doFindMore').click(function(){ return doSearch(Number($('#page').val()) + 1); });
    $('#doFindLess').click(function(){ return doSearch(Number($('#page').val()) - 1); });
    $('.form-reset').click(function(){
        $('#location-search').reset();
        $('.category-browser').empty().append('<div class="container"><input type="hidden" id="s-category" name="s-category" value="1" /></div>');
        $('.region-browser').empty().append('<div class="container"><input type="hidden" id="s-region" name="s-region" value="2" /></div>');
        
        multiSelect($('.category-browser'), 'Categories');
        multiSelect($('.region-browser'), 'Regions');
        
        if ( $('#doFindMore').is(':visible') ) $('#doFindMore').css({visibility: 'hidden'});
        if ( $('#results').is(':visible') ) $('#results').slideUp('fast');
        if ( ! $("#searchbox").is(':visible') ) $("#searchbox").slideDown();
    });
    
    
    multiSelect($('.category-browser'), 'Categories');
    multiSelect($('.region-browser'), 'Regions');
    
    
    if ( $.cookie('INSavedSearh') == "yes" ) {
        $('#location-search button[type="submit"]').removeClass('search').addClass('loading').text('Please Wait');
        $.inLoc.search(onSearchResults, {restore: true});
    }
    
    $.cookie('INSavedSearh', "no", {path: '/'});
});
