﻿/* version of the IE or null */
var ieVersion = function() {
    var appVersion = /MSIE\s*([\d]+(.[\d]+)?)/i.exec(navigator.appVersion);
    if (appVersion && appVersion.length > 1) {
        appVersion = appVersion[1].toFloat();
        return appVersion;
    }
    return null;
}
/* hack for ie6+7 to active link for index search pages */
if (Browser.Engine.trident && ieVersion() < 8) {
    window.addEvent('domready', function() {
        $$(ieVersion() < 7 ? 'a img' : 'a span img').addEvent('click', function() {
            this.parentNode.click();
        });
    });
}
/* used by solution_panel */
var toggleSolutionPanel = function(solutionPanelId) {
    var scrollToView = function() {
        var panellCoords = this.getCoordinates();
        var wHeight = window.getHeight();
        var wScroll = window.getScroll();
        var nextWindowScrollTop = Math.min(panellCoords.top, panellCoords.bottom - wHeight);
        if (nextWindowScrollTop > wScroll.y) {
            window.scrollTo(wScroll.x, nextWindowScrollTop);
        }
    }
    var stopScrollToView = function() {
        if (this.scrollToViewID) {
            $clear(this.scrollToViewID);
            this.scrollToViewID = null;
        }
    }
    var solutionPanel = $(solutionPanelId);
    var solution = solutionPanel.getElement('.solution');
    if (solution.getHeight() < solution.getScrollHeight() / 2) {
        var boundStopScrollToView = stopScrollToView.bind(solutionPanel);
        solution.set('tween', {
            duration: 'long',
            transition: 'cubic:in:out',
            onStart: function() {
                solutionPanel.scrollToViewID = scrollToView.periodical(45, solution);
            },
            onComplete: function() {
                solution.setStyle('height', 'auto');
                boundStopScrollToView();
            },
            onCancel: boundStopScrollToView
        });
        solution.tween('height', solution.getHeight(), solution.getScrollHeight());
    } else {
        solution.set('tween', {duration: 'long',transition: 'cubic:out'});
        solution.tween('height', solution.getHeight(), 0);
    }
    return undefined;
}
/* init the solution_panel's */
window.addEvent('domready', function() {
    $$('div.solution_panel').forEach(function(solutionPanel) {
        var links = solutionPanel.getElements('a');
        var solutionLinks = solutionPanel.getElements('.solution a');
        /* remove all solutionLinks from links */
        links = links.filter(function(item){return !this.contains(item);}, solutionLinks);
        links.set('href','javascript:toggleSolutionPanel(\'' + solutionPanel.id + '\');');
        if (solutionPanel.getElements('.diabox').length > 0) {
            solutionLinks.addEvent('click', function() {
                document.location.hash = '#expand';
            });
            solutionPanel.setStyle('display', 'inline');
            if (Browser.Engine.trident && Browser.Engine.version > 4) {
                solutionPanel.getElements('.diabox a').setStyle('position', 'static');
            }
            solutionPanel.getElements('.solution').setStyle('float', 'left');
        } else {
            solutionPanel.setStyle('display', Browser.Engine.trident && Browser.Engine.version <= 4 ? 'inline-block' : 'block');
        }
        if (document.location.hash == '#expand') {
            solutionPanel.getElements('.solution').setStyle('height', 'auto');
        }
    });
});
/* fix article_img */
window.addEvent('domready', function() {
    $$('.article_img').forEach(function(panel) {
        /* fix box_img_cap_copyright */
        var img = panel.getElement('img');
        if (img) {
            var size = img.getSize();
            panel.setStyle('width', size.x + 'px');
            img.onload = function() {
                var size = this.getSize();
                panel.setStyle('width', size.x + 'px');
            }
        }
        /* fix hidden text */
        if (Browser.Engine.gecko) {
            var prev = panel.getPrevious();
            if (prev && prev.get('tag') == 'p' && !prev.get('text')) {
                prev.setStyle('clear', 'left');
            }
        }
    });
});
/* hack for wide tables inside a steckbox */
if (Browser.Engine.gecko) {
    window.addEvent('domready', function() {
        $$('.article_steckbrief_box_main table').forEach(function(table) {
            var box = table.getParent('.article_steckbrief_box_main');
            var boxWidth = box.getStyle('width').toInt();
            var tableWidth = table.getWidth();
            if (tableWidth > boxWidth) {
                var fak = 1.0 * boxWidth / tableWidth;
                var cells = table.getElements('td,th');
                cells.forEach(function(td) {
                    td.contentWidth = td.getStyle('width').toInt();
                });
                cells.forEach(function(td) {
                    td.setStyle('maxWidth', (td.contentWidth * fak).toInt() + 'px');
                    td.contentWidth = undefined;
                });
            }
        });
    });
}
/* init the index of contents */
window.addEvent('domready', function() {
    $$('h1 + p.gotoTop').destroy();
    var cbIndexBox = $('cbIndexBox');
    if (cbIndexBox) {
      cbIndexBox.elSelect.addEvent('selected', function() {
        var element = $(this.selected.get('value'));
        var top = 0;
        if (element) {
          top = element.getTop();
        }
        window.scrollTo(0, Math.max(top-20,0));
      });
      var options = cbIndexBox.getElements('.option');
      if (options.length > 1) {
          options[0].setStyle('display','none');
      } else {
          cbIndexBox.setStyle('display','none');
      }
      $$('a.gotoTop').addEvent('click', function() {
        $('cbIndexBox').elSelect.setSelected(0);
      });
    }
    else {
      $$('a.gotoTop').addEvent('click', function() {
        window.scrollTo(0, 0);
      });
    }
});

/* fix position of lists inside articles */
window.addEvent('domready', function() {
    var selector = '.article_lexicon .article_body .article_img + h1 + ul, '
                 + '.article_lexicon .article_body .article_img + h1 + ol, '
                 + '.article_lexicon .article_body .article_steckbrief_box + h1 + ul, '
                 + '.article_lexicon .article_body .article_steckbrief_box + h1 + ol';
    $$(selector).forEach(function(list) {
        var h1 = list.getPrevious('h1');
        if (h1.getStyle('clear') == 'none') {
            var floating_box = list.getPrevious('.article_img');
            if (!floating_box) {
                floating_box = list.getPrevious('.article_steckbrief_box');
            }
            list.setStyles({
                'margin-left': floating_box.getWidth() + 'px',
                'padding-left': '40px'
            });
            list.getChildren('li').setStyle('clear', 'none');
        }
    });
});
/* accesskey for prev/next article - shift+alt+arrow left/right */
document.addEvent('keyup', function(evt) {
    if (evt.shift && evt.alt) {
        var links;
        if (evt.key == 'left') {
            links = $$('a.bt_back_article,a.bt_back_article2');
        }
        if (evt.key == 'right') {
            links = $$('a.bt_forward_article,a.bt_forward_article2');
        }
        if (evt.key == 'up') {
            links = $$('a.bt_back_main');
        }
        if (links && links.length == 1 && links[0].get('href')) {
            document.location = links[0].get('href');
        }
    }
});
/**
 * center the given item vertical in the viewport
 * @param {dom node or id of a dom node}
 */
var scrollToItem = function(itemId) {
    var item = $(itemId);
    if (item) {
        window.scrollTo(0, Math.max(item.getTop() + (item.getHeight() - window.getHeight()) / 2, 0));
    }
}
/* support selective printing - thomas baade 2009 */
/*    needs the mootools from http://mad4milk.net */
/**
 * Prepare the current page for printing.
 * The elements that should (or should be not) printed are defined by comma separated list of css selectors.
 * @param {string} selector: This elements and its contents are send to the printer. All other elements are hidden.
 * @param {string} selectorExtraHideElements (optional): A list of additional elements to hide (maybe inside of the printed elements).
 * @return {undefined}
 */

var preparePrintLayout = $empty;


var spEmStepWidth = 0.125;    // increase/decrease font every step by spEmStepWidth
var spEmBasis     = 1;        // font size of spArticleBody at startup
var spEmStep      = 0;        // counter for current step (leave as 0)
var spEmMaxSteps  = 1;        // maximum steps alowed
/**
 * spFontSizer increase/decrease font size inside "spEmStep"
 *
 * use: spFontSizer(1, false), spFontSizer(-1, false) or spFontSizer(0, true)
 * @param spInc set to 1 or -1
 * @param spReset set to true to get initial font size
 */
function spFontSizer(spInc, spReset) {
    // reset font size
    if (spReset)
        spEmStep = 0;
    // inside allowed steps?
    if (Math.abs(spEmStep + spInc) <= spEmMaxSteps) {
        // increase/decrease spEmStep
        spEmStep += spInc;
        // set new font size for every tag inside 'spEmStep'
        spEmFontSize = spEmStep * spEmStepWidth + spEmBasis;
        // set new font size
        spFontSizerStatic(spEmFontSize);
    }
}
function spFontSizerStatic(spFontSize) {
    // set new font size
    $$('.content_full_main').setStyle('fontSize', spFontSize + 'em');
}
/**
 * show the container or move it to a visible area
 * @param containerId the container to show
 * @param verticalPositionContainerId hint for the vertical position (optional)
 */
function showContainer(containerId, verticalPositionContainerId) {
    var container = $(containerId);
    var verticalPositionContainer = $(verticalPositionContainerId);
    if (container) {
        $$('.helpBox,.errorBox,.messageBox').filter(function(item){return item.id != container.id;}).setStyle('display','none');
        function calcMarginTop(element, verticalPositionElement) {
            var newTop = window.getScrollTop() + 20;
            if (verticalPositionElement) {
                newTop = Math.max(newTop, verticalPositionElement.getTop() - element.getScrollHeight() / 2);
                newTop = Math.min(newTop, window.getScrollTop() + window.getHeight() - element.getScrollHeight() - 20);
            }
            var marginTop = element.getStyle('margin-top');
            if ($type(marginTop) == 'string')
                marginTop = marginTop.toInt();
            if ($type(marginTop) != 'number')
                marginTop = 0;
            marginTop = newTop + marginTop - element.getTop();
            return Math.max(marginTop, 0);
        }
        if (container.getStyle('display') == 'none') {
            container.setStyles({
                display: '',
                height: 0,
                overflow: 'hidden'
            });
            container.setStyle('margin-top', calcMarginTop(container, verticalPositionContainer));
            container.set('tween', {duration: 'long', transition: 'cubic:in:out'});
            container.tween('height', container.getScrollHeight());
        }
        else {
            container.tween('margin-top', calcMarginTop(container, verticalPositionContainer));
        }
    }
    return undefined;
};
