$(function ($) {
    var $main = $( '#main' ),
        _pageMappings,
        currentContentUrl,
        currentPath,
        currentParameters,
        loadPage,
        unloadPage,
        $searchBox = $('#search'),
        searchBoxDefaultText = $searchBox.val();
        

    function loadPageMappings() {
        return $.ajax({
            url: $main.data( 'mappings' ),
            dataType: 'json'
        })
        .then(function (pageMappings) {
                _pageMappings = pageMappings;
        });
    }

    function submitSearch() {
        $.location()
            .path("/searchPage")
            .params({q: $searchBox.val()})
            .update();

        return false;
    }

    loadPage = function() {
        if( currentPath === '/' ) {
            $( '#main' ).recipeManager({ url: currentContentUrl, params: currentParameters });
        }
        else if( currentPath === '/account' ) {
            $( '#main' ).accountManager({ url: currentContentUrl, params: currentParameters });
        }
        else if( currentPath === '/accountUser' ) {
            $( '#main' ).accountUserManager({ url: currentContentUrl, params: currentParameters });
        }
        else if( currentPath === '/accountEdit' ) {
            $( '#main' ).accountEditManager({ url: currentContentUrl, params: currentParameters });
        }
        else if( currentPath === '/searchPage' ) {
            $( '#main' ).songManager({
                defaultUrl: '/searchJson',
                deepLinkPath: '/searchPage',
                managerName: 'songManager',
                url: currentContentUrl,
                params: currentParameters,
                contextBuilder: function (params) {
                    var context = {};

                    if( params.q ) {
                        context.q = decodeURIComponent(params.q.replace(/\+/g," "));
                    }
                    else {
                        context.q = '';
                    }

                    if( params.offset ) {
                        context.offset = params.offset;
                    }

                    return context;
                }
            });
        }
        else if( currentPath === '/artistSongs' ) {
            $( '#main' ).songManager({
                defaultUrl: '/songArtist/songArtistJson',
                deepLinkPath: '/artistSongs',
                managerName: 'songManager',
                url: currentContentUrl,
                params: currentParameters,
                contextBuilder: function (params) {
                    var context = {};

                    if( params.artistId ) {
                        context.artistId = params.artistId;
                    }

                    if( params.offset ) {
                        context.offset = params.offset;
                    }

                    return context;
                }
            });
        }
        else if( currentPath === '/likedSongs' ) {
            $( '#main' ).songManager({
                defaultUrl: '/songs/likedJson',
                deepLinkPath: '/likedSongs',
                managerName: 'songManager',
                url: currentContentUrl,
                params: currentParameters,
                contextBuilder: function (params) {
                    var context = {};
                    if( params[ 'ordering' ] && params[ 'ordering' ] !== 'NEWEST' ) {
                        context[ 'ordering' ] = params[ 'ordering' ];
                    }

                    if( params[ 'location' ] ) {
                        context[ 'location' ] = params[ 'location' ];
                    }
                    else if( params[ 'startAt' ] ) {
                        context[ 'startAt' ] = params[ 'startAt' ];
                    }
                    else if( params[ 'endBefore' ] ) {
                        context[ 'endBefore' ] = params[ 'endBefore' ];
                    }

                    return context;
                }
            });
        }
        else if( currentPath === '/songEdit' ) {
            $( '#main' ).songEditManager({ url: currentContentUrl, params: currentParameters });
        }
        else if( currentPath === '/song/upload' ) {
            $( '#main' ).songEditManager({ url: currentContentUrl, params: currentParameters });
        }
        else if( currentPath === '/about' ) {
            $( '#main' ).load(currentContentUrl, function () {
                // Set up deep links
                $('#page').find('.deep-link').click(function (event) {
                    var clickedHref = $(this).attr('href');

                    event.preventDefault();
                    $.location().update(clickedHref);
                });
            });
        }
        else if( currentPath === '/contact' ) {
            $( '#main' ).load(currentContentUrl, function () {
                // Set up deep links
                $('#page').find('.deep-link').click(function (event) {
                    var clickedHref = $(this).attr('href');

                    event.preventDefault();
                    $.location().update(clickedHref);
                });
            });
        }
        else if( currentPath === '/faq' ) {
            $( '#main' ).load(currentContentUrl, function () {
                // Set up deep links
                $('#page').find('.deep-link').click(function (event) {
                    var clickedHref = $(this).attr('href');

                    event.preventDefault();
                    $.location().update(clickedHref);
                });
            });
        }
        else if( currentPath === '/terms' ) {
            $( '#main' ).load(currentContentUrl, function () {
                // Set up deep links
                $('#page').find('.deep-link').click(function (event) {
                    var clickedHref = $(this).attr('href');

                    event.preventDefault();
                    $.location().update(clickedHref);
                });
            });
        }
        else {
            throw 'Could not find matching loader for ' + path;
        }
    };

    unloadPage = function() {
        if( currentPath === '/' ) {
            $( '#main' ).recipeManager( 'destroy' );
        }
		else if( currentPath === '/account' ) {
            $( '#main' ).accountManager( 'destroy' );
        }
        else if( currentPath === '/accountUser' ) {
            $( '#main' ).accountUserManager('destroy');
        }
        else if( currentPath === '/searchPage' ) {
            $( '#main' ).songManager( 'destroy' );
        }
        else if( currentPath === '/artistSongs' ) {
            $( '#main' ).songManager('destroy');
        }
        else if( currentPath === '/likedSongs' ) {
            $( '#main' ).songManager('destroy');
        }
        else if( currentPath === '/songEdit' ) {
            $( '#main' ).songEditManager('destroy');
        }
        else if( currentPath === '/song/upload' ) {
            $( '#main' ).songEditManager('destroy');
        }
        else if( currentPath === '/about' ) {
            $( '#main' ).empty();
        }
        else if( currentPath === '/contact' ) {
            $( '#main' ).empty();
        }
        else if( currentPath === '/faq' ) {
            $( '#main' ).empty();
        }
        else if( currentPath === '/terms' ) {
            $( '#main' ).empty();
        }
        else {
            throw 'Could not find matching unloader for ' + path;
        }

    };


    $.location().onChange(function (data) {
        var contentUrl;

        function handleNewPage() {
            contentUrl = _pageMappings[data.path];
            if (!contentUrl) {
                throw "Couldn't find page mapping for path = " + data.path;
                return;
            }

            currentContentUrl = contentUrl;
            currentPath = data.path;
            currentParameters = data.params;

            loadPage();
        };

        function handleUpdatePage() {
            $main.trigger('pageUpdate', [data.params]);
        };


        if (currentContentUrl === undefined) { // first time through
            loadPageMappings().then(function (mappings) {
                handleNewPage();

                $.user.init({
                    dataHref: mappings['user']
                });
            });
        }
        else if (currentPath !== data.path) { // page change
            unloadPage();
            handleNewPage();
        }
        else { // location change is within current page
            handleUpdatePage();
        }
    });

    $searchBox
        .focus(function () {
            if ($searchBox.val() == searchBoxDefaultText) {
                $searchBox.val('');
            }
        })
        .blur(function () {
            if ($searchBox.val() == '') {
                $searchBox.val(searchBoxDefaultText);
            }
        })
        .keypress(function (e) {
            if (e.which == 13) { // Enter pressed
                submitSearch();
                return false;
            }
        });

    $("#search-button").button().click(submitSearch)
    
});

