// check environment
var env = document.location.href.match(/.*frontend_dev\.php/) ? 'dev' : 'prod';
var self = (env == 'dev') ? '/frontend_dev.php' : '';
var defaultUrl = self + '/ausgaben\.html';

// global NAV object
// used as namespace and holds configuration
var NAV = {
    config: {
        self: self,
        defaultUrl: defaultUrl,
        xhrTarget: 'div#content',
        loadingDiv: '<div class="loading"><img src="/images/loading.gif" alt="loading"/></div>'
    }
};

/*
 * Autoload content, if hash exists
 */
NAV.autoloadContent = function () {
    if (document.location.href.match(NAV.config.defaultUrl) && document.location.hash) {
        var hash = document.location.hash;
        var year = hash.split('-')[1];
        
        if (hash.match('#year') || hash.match('#index')) {
            document.location.href = NAV.config.defaultUrl + '#issue-' + year + '-1';
        } else {
            NAV.loadContentByHash(document.location.hash);
        }
    }
}

/*
 * Expand selected year, if hash exists
 */
NAV.autoloadTreeByYear = function () {
    var hash = document.location.hash;
    
    if (document.location.href.match(NAV.config.defaultUrl) && hash) {
       var year = hash.split('-')[1];

       $('ul.navigationsbaum a.year').each(function() {
            $(this).removeClass('open');
            $(this).addClass('closed');
            $(this).next('ul').hide();
       });

       NAV.loadTreeByYear(year, $('#year-' + year));
    }
}

/*
 * Load HTML content to given target container (jQuery selector)
 */
NAV.loadContent = function(xhrUrl, xhrData, xhrTarget) {
    $.ajax({
        type: 'GET',
        url: xhrUrl,
        data: xhrData,
        dataType: 'text',
        timeout: 5000,
        success: function(response) {
            $(xhrTarget).html(response);
            $(document).trigger('contentLoaded');
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            $(xhrTarget).html(XMLHttpRequest.responseText);
        }
    });
}

/*
 * Load content by hash (anchor)
 */
NAV.loadContentByHash = function(hash) {
    var hashParts = hash.split('-');
    var year = hashParts[1];
    var issueNumber = hashParts[2];
        
    if (hash.match('issue')) {
        var xhrUrl = self + '/ausgaben/' + year + '/ausgabe-' + issueNumber + '.html';
        var xhrData = 'year=' + year + '&issueNumber=' + issueNumber;
        NAV.loadContent(xhrUrl, xhrData, NAV.config.xhrTarget);
    } 
    else if (hash.match('overview')) 
    {
        var xhrUrl = self + '/ausgaben/' + year + '/zeitliche_uebersicht.html';
        var xhrData = 'year=' + year;
        NAV.loadContent(xhrUrl, xhrData, NAV.config.xhrTarget);
    } 
    else if (hash.match('register')) 
    {
        var xhrUrl = self + '/ausgaben/' + year + '/sachregister.html';
        var xhrData = 'year=' + year;
        NAV.loadContent(xhrUrl, xhrData, NAV.config.xhrTarget);
    }
}

NAV.loadTreeByYear = function(year, objAppendTo) {
    // if year ul is not existing, load it
    if ($(objAppendTo).next('ul').length == 0) {
        
        // show loading container
        $(objAppendTo).parent().append(NAV.config.loadingDiv);
    
        // load year tree
        $.ajax({
            type: 'GET',
            url: '/navigation/' + year,
            data: 'year=' + year,
            dataType: 'text',
            timeout: 5000,
            success: function(response){
                // remove loading container
                $(objAppendTo).next('div.loading').remove();
                // append year ul to clicked link
                $(objAppendTo).parent().append(response);
                //$(document).trigger('treeLoaded');
                NAV.toggleYearIndex();
                NAV.onClickIssue();
                NAV.onClickOverview();
                NAV.onClickRegister();
                NAV.convertURLsToAnchors();
            },
            error: function(XMLHttpRequest, textStatus, errorThrown){
                $(thisObj).parent().append('<ul><li>Error loading tree: ' + XMLHttpRequest.status + '</li></ul>');
            }
        });
    
        $(objAppendTo).removeClass('closed');
        $(objAppendTo).addClass('open');
        
        return false;
    }
    
    // if year ul is already there, just show it
    $(objAppendTo).next('ul').show();
    $(objAppendTo).removeClass('closed').addClass('open');
}

NAV.toggleYear = function() {
    $('ul.navigationsbaum a.year').click(function () {
        if ($(this).hasClass('closed') && $(this).next('ul').length == 0) 
        {
            var thisObj = this;
            var href = $(this).attr('href');
            var hrefParts = href.split('-');
            var year = hrefParts[1];
            
            NAV.loadTreeByYear(year, this);
        } 
        else if ($(this).hasClass('closed') && $(this).next('ul').length > 0) 
        {
            $(this).removeClass('closed');
            $(this).addClass('open');
            $(this).next('ul').show();
        }
        else if ($(this).hasClass('open') && $(this).next('ul').length > 0) 
        {
            $(this).removeClass('open');
            $(this).addClass('closed');
            $(this).next('ul').hide();
        } 

        $(this).blur();
        return false;
    });
}

NAV.toggleYearIndex = function() {
    $('ul.navigationsbaum a.index').click(function () {
        if ($(this).hasClass('open')) 
        {
            $(this).next('ul').hide();
            $(this).removeClass('open');
            $(this).addClass('closed');
        } 
        else if ($(this).hasClass('closed')) 
        {
            $(this).next('ul').show();
            $(this).removeClass('closed');
            $(this).addClass('open');
        }
        $(this).blur();
    });
}

NAV.onClickIssue = function() {
    $('ul.navigationsbaum a.issue').click(function(e) {
        $('ul.navigationsbaum a.active').removeClass('active');
        
        var hash = this.href.replace(/^.*#/, '');
        $.historyLoad(hash);
        
        $(this).addClass('active');
        $(this).blur();
    });
    
}

NAV.onClickOverview = function() {
    $('ul.navigationsbaum a.overview').click(function() {
        $('ul.navigationsbaum a.active').removeClass('active');
        
        var hash = this.href.replace(/^.*#/, '');
        $.historyLoad(hash);
        
        $(this).removeAttr('id');
        $(this).addClass('active');
        $(this).blur();
    });
}

NAV.onClickRegister = function() {
    $('ul.navigationsbaum a.register').click(function() {
        $('ul.navigationsbaum a.active').removeClass('active');
        
        var hash = this.href.replace(/^.*#/, '');
        $.historyLoad(hash);
        
        $(this).addClass('active');
        $(this).blur();
    });
}

NAV.convertURLsToAnchors = function() {
    var anchors = [];
    
    // replace all URL links with anchor links
    $('ul.navigationsbaum a').each(function(key) {
         var hash = $(this).attr('href').replace(/^.*#/, '');
         
         if (hash != '') {
            if ($(this).hasClass('issue')) {
                $(this).attr('href', NAV.config.defaultUrl + '#' + hash);
            } else {
                $(this).attr('href', '#' + hash);
            }
            
            if (document.location.hash == '#' + hash) {
                $(this).addClass('active');
            } else {
                // remove all ids, so anchors will lead to nowhere
                $(this).removeAttr('id');
            }
         }
    });
}

NAV.replaceIssueLink = function(){
    var hrefParts = $(this).attr('href').match(/\d{1,4}/g);
    var year = hrefParts[0];
    var issueNumber = hrefParts[1];
    var anchor = '#issue-' + year + '-' + issueNumber;
    $(this).attr('href', NAV.config.defaultUrl + anchor);
    
    return true;
}

NAV.replaceOverviewLink = function(){
    var hrefParts = $(this).attr('href').match(/\d{4}/g);
    var year = hrefParts[0];
    var anchor = '#overview-' + year;
    $(this).attr('href', NAV.config.defaultUrl + anchor);

    return true;
}

NAV.replaceRegisterLink = function(){
    var hrefParts = $(this).attr('href').match(/\d{4}/g);
    var year = hrefParts[0];
    var anchor = '#register-' + year;
    $(this).attr('href', NAV.config.defaultUrl + anchor);

    return true;
}

NAV.callHistory = function(hash){
    var type = hash.substring(0, hash.indexOf('-'));
    var url = '';
    
    switch (type) {
        case 'issue':
            url = defaultUrl + '#' + hash;
            break;
        case 'overview':
            url = '#' + hash;
            break;
        case 'register':
            url = '#' + hash;
            break;
    }
    // remove old highlight
    $('ul.navigationsbaum a.active').removeClass('active');
    // highlight selected link
    $('a[href=' + url + ']').addClass('active');
    // load content
    NAV.loadContentByHash(hash);
}

$(document).ready(function() {
    // if anchor is, present, autoload tree and content
    NAV.autoloadTreeByYear();
    NAV.autoloadContent();
    
    // load toggle and onClick functions
    NAV.toggleYear();
    NAV.toggleYearIndex();
    NAV.onClickIssue();
    NAV.onClickOverview();
    NAV.onClickRegister();
    
    // remove all absolute URLs in tree and replace by anchors
    NAV.convertURLsToAnchors();
    
    $('table.latestIssues a.issue').click(NAV.replaceIssueLink);
    $('div.start_img a.issue').click(NAV.replaceIssueLink);
    $('table.fulltextSearch a.issue').click(NAV.replaceIssueLink);
    $('table.fulltextSearch a.issue').click(NAV.replaceIssueLink);
    $('ul.sitemap a.issue').click(NAV.replaceIssueLink);
    $('ul.sitemap2 a.issue').click(NAV.replaceIssueLink);
    $('ul.sitemap a.overview').click(NAV.replaceOverviewLink);
    $('ul.sitemap a.register').click(NAV.replaceRegisterLink);
    
    $(document).bind('contentLoaded', function(e) {
        $('div.ct_inhalt a[href]').each(NAV.replaceIssueLink);
        
        $('div.ct_inhalt a[href]').click(function() {
            var hash = this.href.replace(/^.*#/, '');
            NAV.loadContentByHash(hash);
        });
    });
    
    $(document).bind('treeLoaded', function(e) {
        // reload functions, because DOM has changed!
        NAV.toggleYearIndex();
        NAV.onClickIssue();
        NAV.onClickOverview();
        NAV.onClickRegister();
        NAV.convertURLsToAnchors();
        // Scroll initially if there's a hash (#something) in the url 
        $.localScroll.defaults.axis = 'y';
        $.localScroll.hash({
            target: '#tab-issueTree', // Could be a selector or a jQuery object.
            queue: true,
            duration: 1,
            hash: true
        });
    });

    $.historyInit(NAV.callHistory);

});
