/*

## ACHTUNG:
## Dies ist eine ST2 angepasste Version. Texte sind auf deutsch, die Transparenz angepasst 
## und das Attribut fuer den Titel eines Bildes von title auf rev geaendert.

*/
/*
 * nyroModal v2.0.0
 * Core
 *
 */
jQuery(function($, undefined) {

  var $w = $(window),
    $d = $(document),
    $b = $('body'),
    baseHref = $('base').attr('href'),
    // nyroModal Object
    _nmObj = {
      filters: [],  // List of filters used
      callbacks: {},  // Sepcific callbacks
      loadFilter: undefined,  // Name of the filter used for loading

      modal: false, // Indicates if it's a modal window or not
      closeOnEscape: true,  // Indicates if the modal should close on Escape key
      closeOnClick: true, // Indicates if a click on the background should close the modal
      useKeyHandler: false, // Indicates if the modal has to handle key down event

      showCloseButton: true,  // Indicates if the closeButonn should be added
// ST2 Textanpassung
      closeButton: '<a href="#" class="nyroModalClose nyroModalCloseButton nmReposition" title="Schlie&szlig;en">Schlie&szlig;en</a>',  // Close button HTML

      stack: false, // Indicates if links automatically binded inside the modal should stack or not

      header: undefined,  // header include in every modal
      footer: undefined,  // footer include in every modal

      // Specific confirguation for gallery filter
      galleryLoop: true,  // Indicates if the gallery should loop
      galleryCounts: true,  // Indicates if the gallery counts should be shown
      ltr: true, // Left to Right by default. Put to false for Hebrew or Right to Left language. Used in gallery filter

      // Specific confirguation for image filter
      imageRegex: '[^\.]\.(jpg|jpeg|png|tiff|gif|bmp)\s*$', // Regex used to detect image link

      selIndicator: 'nyroModalSel', // Value added when a form or Ajax is sent with a filter content

      swfObjectId: undefined, // Object id for swf object
      swf:  { // Default SWF attributes
        allowFullScreen: 'true',
        allowscriptaccess: 'always',
        wmode: 'transparent'
      },

      store: {},  // Storage object for filters.
// ST2 Textanpassung
      errorMsg: 'Ein Fehler ist aufgetreten.', // Error message
      elts: { // HTML elements for the modal
        all: undefined,
        bg: undefined,
        load: undefined,
        cont: undefined,
        hidden: undefined
      },
      sizes: {  // Size information
        initW: undefined, // Initial width
        initH: undefined, // Initial height
        w: undefined,   // width
        h: undefined,   // height
        minW: undefined,  // minimum Width
        minH: undefined,  // minimum height
        wMargin: undefined, // Horizontal margin
        hMargin: undefined  // Vertical margin
      },
      anim: { // Animation names to use
        def: undefined,     // Default animation set to use if sspecific are not defined or doesn't exist
        showBg: undefined,    // Set to use for showBg animation
        hideBg: undefined,    // Set to use for hideBg animation
        showLoad: undefined,  // Set to use for showLoad animation
        hideLoad: undefined,  // Set to use for hideLoad animation
        showCont: undefined,  // Set to use for showCont animation
        hideCont: undefined,  // Set to use for hideCont animation
        showTrans: undefined, // Set to use for showTrans animation
        hideTrans: undefined, // Set to use for hideTrans animation
        resize: undefined   // Set to use for resize animation
      },

      _open: false, // Indicates if the modal is open
      _bgReady: false,  // Indicates if the background is ready
      _opened: false, // Indicates if the modal was opened (useful for stacking)
      _loading: false,  // Indicates if the loading is shown
      _animated: false, // Indicates if the modal is currently animated
      _transition: false, //Indicates if the modal is in transition
      _nmOpener: undefined, // nmObj of the modal that opened the current one in non stacking mode
      _nbContentLoading: 0, // Counter for contentLoading call
      _scripts: '', // Scripts tags to be included
      _scriptsShown: '',  //Scripts tags to be included once the modal is swhon

      // save the object in data
      saveObj: function() {
        this.opener.data('nmObj', this);
      },
      // Open the modal
      open: function() {
        if (this._nmOpener)
          this._nmOpener._close();
        this.getInternal()._pushStack(this.opener);
        this._opened = false;
        this._bgReady = false;
        this._open = true;
        this._initElts();
        this._load();
        this._nbContentLoading = 0;
        this._callAnim('showBg', $.proxy(function() {
          this._bgReady = true;
          if (this._nmOpener) {
            // fake closing of the opener nyroModal
            this._nmOpener._bgReady = false;
            this._nmOpener._loading = false;
            this._nmOpener._animated = false;
            this._nmOpener._opened = false;
            this._nmOpener._open = false;
            this._nmOpener.elts.cont = this._nmOpener.elts.hidden = this._nmOpener.elts.load = this._nmOpener.elts.bg = this._nmOpener.elts.all = undefined;
            this._nmOpener.saveObj();
            this._nmOpener = undefined;
          }
          this._contentLoading();
        }, this));
      },

      // Resize the modal according to sizes.initW and sizes.initH
      // Will call size function
      // @param recalc boolean: Indicate if the size should be recalaculated (useful when content has changed)
      resize: function(recalc) {
        if (recalc) {
          this.elts.hidden.append(this.elts.cont.children().first().clone());
          this.sizes.initW = this.sizes.w = this.elts.hidden.width();
          this.sizes.initH = this.sizes.h = this.elts.hidden.height();
          this.elts.hidden.empty();
        } else {
          this.sizes.w = this.sizes.initW;
          this.sizes.h = this.sizes.initH;
        }
        this._unreposition();
        this.size();
        this._callAnim('resize', $.proxy(function() {
          this._reposition();
        }, this));
      },

      // Update sizes element to not go outsize the viewport.
      // Will call 'size' callback filter
      size: function() {
        var maxHeight = this.getInternal().fullSize.viewH - this.sizes.hMargin,
          maxWidth = this.getInternal().fullSize.viewW - this.sizes.wMargin;
        if (this.sizes.minW && this.sizes.minW > this.sizes.w)
          this.sizes.w = this.sizes.minW;
        if (this.sizes.minH && this.sizes.minH > this.sizes.h)
          this.sizes.h = this.sizes.minH;
        if (this.sizes.h > maxHeight || this.sizes.w > maxWidth) {
          // We're gonna resize the modal as it will goes outside the view port
          this.sizes.h = Math.min(this.sizes.h, maxHeight);
          this.sizes.w = Math.min(this.sizes.w, maxWidth);
        }
        this._callFilters('size');
      },

      // Get the nmObject for a new nyroModal
      getForNewLinks: function() {
        var ret;
        if (this.stack) {
          ret = $.extend(true, {}, this);
          ret._nmOpener = undefined;
          ret.elts.all = undefined;
        } else {
          ret = $.extend({}, this);
          ret._nmOpener = this;
        }
        ret.filters = [];
        ret.opener = undefined;
        ret._open = false;
        return ret;
      },

      // key handle function.
      // Will call 'keyHandle' callback filter
      keyHandle: function(e) {
        this.keyEvent = e;
        this._callFilters('keyHandle');
        this.keyEvent = undefined;
        delete(this.keyEvent);
      },

      // Get the internal object
      getInternal: function() {
        return _internal;
      },

      // Internal function for closing a nyroModal
      // Will call 'close' callback filter
      _close: function() {
        this.getInternal()._removeStack(this.opener);
        this._opened = false;
        this._open = false;
        this._callFilters('close');
      },
      // Public function for closing a nyroModal
      close: function() {
        this._close();
        this._callFilters('beforeClose');
        var self = this;
        this._unreposition();
        self._callAnim('hideCont', function() {
          self._callAnim('hideLoad', function() {
            self._callAnim('hideBg', function() {
              self._callFilters('afterClose');
              self.elts.cont.remove();
              self.elts.hidden.remove();
              self.elts.load.remove();
              self.elts.bg.remove();
              self.elts.all.remove();
              self.elts.cont = self.elts.hidden = self.elts.load = self.elts.bg = self.elts.all = undefined;
            });
          });
        });
      },

      // Init HTML elements
      _initElts: function() {
        if (!this.stack && this.getInternal().stack.length > 1)
          this.elts = $(_internal.stack[_internal.stack.length-2]).data('nmObj').elts;
        if (!this.elts.all || this.elts.all.closest('body').length == 0)
          this.elts.all = this.elts.bg = this.elts.cont = this.elts.hidden = this.elts.load = undefined;
        if (!this.elts.all)
          this.elts.all = $('<div />').appendTo(this.getInternal()._container);
        if (!this.elts.bg)
          this.elts.bg = $('<div />').hide().appendTo(this.elts.all);
        if (!this.elts.cont)
          this.elts.cont = $('<div />').hide().appendTo(this.elts.all);
        if (!this.elts.hidden)
          this.elts.hidden = $('<div />').hide().appendTo(this.elts.all);
        this.elts.hidden.empty();
        if (!this.elts.load)
          this.elts.load = $('<div />').hide().appendTo(this.elts.all);
        this._callFilters('initElts');
      },

      // Trigger the error
      // Will call 'error' callback filter
      _error: function() {
        this._callFilters('error');
      },

      // Set the HTML content to show.
      // - html: HTML content
      // - selector: selector to filter the content
      // Will init the size and call the 'size' function.
      // Will call 'filledContent' callback filter
      _setCont: function(html, selector) {
        if (selector) {
          var tmp = [],
            i = 0;
          // Looking for script to store them
          html = html
            .replace(/\r\n/gi, 'nyroModalLN')
            .replace(/<script(.|\s)*?\/script>/gi, function(x) {
                tmp[i] = x;
                return '<pre class=nyroModalScript rel="'+(i++)+'"></pre>';
              });
          var cur = $('<div>'+html+'</div>').find(selector);
          if (cur.length) {
            html = cur.html()
              .replace(/<pre class="?nyroModalScript"? rel="?(.?)"?><\/pre>/gi, function(x, y, z) { return tmp[y]; })
              .replace(/nyroModalLN/gi, "\r\n");
          } else {
            // selector not found
            this._error();
            return;
          }
        }
        this.elts.hidden
          .append(this._filterScripts(html))
          .prepend(this.header)
          .append(this.footer)
          .wrapInner('<div class="nyroModal'+ucfirst(this.loadFilter)+'" />');

        // Store the size of the element
        this.sizes.initW = this.sizes.w = this.elts.hidden.width();
        this.sizes.initH = this.sizes.h = this.elts.hidden.height();
        var outer = this.getInternal()._getOuter(this.elts.cont);
        this.sizes.hMargin = outer.h.total;
        this.sizes.wMargin = outer.w.total;

        this.size();

        this.loading = false;
        this._callFilters('filledContent');
        this._contentLoading();
      },

      // Filter an html content to remove the script[src] and store them appropriately if needed
      // - data: Data to filter
      _filterScripts: function(data) {
        if (typeof data != 'string')
          return data;

        this._scripts = [];
        this._scriptsShown = [];
        var start = 0,
          stStart = '<script',
          stEnd = '</script>',
          endLn = stEnd.length,
          pos,
          pos2,
          tmp;
        while ((pos = data.indexOf(stStart, start)) > -1) {
          pos2 = data.indexOf(stEnd)+endLn;
          tmp = $(data.substring(pos, pos2));
          if (!tmp.attr('src') || tmp.attr('rel') == 'forceLoad') {
            if (tmp.attr('rev') == 'shown')
              this._scriptsShown.push(tmp.get(0));
            else
              this._scripts.push(tmp.get(0));
          }
          data = data.substring(0, pos)+data.substr(pos2);
          start = pos;
        }
        return data;
      },

      // Check if the nmObject has a specific filter
      // - filter: Filter name
      _hasFilter: function(filter) {
        var ret = false;
        $.each(this.filters, function(i, f) {
          ret = ret || f == filter;
        });
        return ret;
      },

      // Remove a specific filter
      // - filter: Filter name
      _delFilter: function(filter) {
        this.filters = $.map(this.filters, function(v) {
          if (v != filter)
            return v;
        });
      },

      // Call a function against all active filters
      // - fct: Function name
      // return an array of all return of callbacks; keys are filters name
      _callFilters: function(fct) {
        this.getInternal()._debug(fct);
        var ret = [],
          self = this;
        $.each(this.filters, function(i, f) {
          ret[f] = self._callFilter(f, fct);
        });
        if (this.callbacks[fct] && $.isFunction(this.callbacks[fct]))
          this.callbacks[fct](this);
        return ret;
      },

      // Call a filter function for a specific filter
      // - f: Filter name
      // - fct: Function name
      // return the return of the callback
      _callFilter: function(f, fct) {
        if (_filters[f] && _filters[f][fct] && $.isFunction(_filters[f][fct]))
          return _filters[f][fct](this);
        return undefined;
      },

      // Call animation callback.
      // Will also call beforeNNN and afterNNN filter callbacks
      // - fct: Animation function name
      // - clb: Callback once the animation is done
      _callAnim: function(fct, clb) {
        this.getInternal()._debug(fct);
        this._callFilters('before'+ucfirst(fct));
        if (!this._animated) {
          this._animated = true;
          if (!$.isFunction(clb)) clb = $.noop;
          var set = this.anim[fct] || this.anim.def || 'basic';
          if (!_animations[set] || !_animations[set][fct] || !$.isFunction(_animations[set][fct]))
            set = 'basic';
          _animations[set][fct](this, $.proxy(function() {
              this._animated = false;
              this._callFilters('after'+ucfirst(fct));
              clb();
            }, this));
        }
      },

      // Load the content
      // Will call the 'load' function of the filter specified in the loadFilter parameter
      _load: function() {
        this.getInternal()._debug('_load');
        if (!this.loading && this.loadFilter) {
          this.loading = true;
          this._callFilter(this.loadFilter, 'load');
        }
      },

      // Show the content or the loading according to the current state of the modal
      _contentLoading: function() {
        if (!this._animated && this._bgReady) {
          if (!this._transition && this.elts.cont.html().length > 0)
            this._transition = true;
          this._nbContentLoading++;
          if (!this.loading) {
            if (!this._opened) {
              this._opened = true;
              if (this._transition) {
                var fct = $.proxy(function() {
                  this._writeContent();
                  this._callFilters('beforeShowCont');
                  this._callAnim('hideTrans', $.proxy(function() {
                    this._transition = false;
                    this._callFilters('afterShowCont');
                    this.elts.cont.append(this._scriptsShown);
                    this._reposition();
                  }, this));
                }, this);
                if (this._nbContentLoading == 1) {
                  this._unreposition();
                  this._callAnim('showTrans', fct);
                } else {
                  fct();
                }
              } else {
                this._callAnim('hideLoad', $.proxy(function() {
                  this._writeContent();
                  this._callAnim('showCont', $.proxy(function() {
                    this.elts.cont.append(this._scriptsShown);
                    this._reposition();
                  }, this));
                }, this));
              }
            }
          } else if (this._nbContentLoading == 1) {
            var outer = this.getInternal()._getOuter(this.elts.load);
            this.elts.load
              .css({
                position: 'fixed',
                top: (this.getInternal().fullSize.viewH - this.elts.load.height() - outer.h.margin)/2,
                left: (this.getInternal().fullSize.viewW - this.elts.load.width() - outer.w.margin)/2
              });
            if (this._transition) {
              this._unreposition();
              this._callAnim('showTrans', $.proxy(function() {
                this._contentLoading();
              }, this));
            } else {
              this._callAnim('showLoad', $.proxy(function() {
                this._contentLoading();
              }, this));
            }
          }
        }
      },

      // Write the content in the modal.
      // Content comes from the hidden div, scripts and eventually close button.
      _writeContent: function() {
        this.elts.cont
          .empty()
          .append(this.elts.hidden.contents())
          .append(this._scripts)
          .append(this.showCloseButton ? this.closeButton : '')
          .css({
            position: 'fixed',
            width: this.sizes.w,
            height: this.sizes.h,
            top: (this.getInternal().fullSize.viewH - this.sizes.h - this.sizes.hMargin)/2,
            left: (this.getInternal().fullSize.viewW - this.sizes.w - this.sizes.wMargin)/2
          });
      },

      // Reposition elements with a class nmReposition
      _reposition: function() {
        var elts = this.elts.cont.find('.nmReposition');
        if (elts.length) {
          var space = this.getInternal()._getSpaceReposition();
          elts.each(function() {
            var me = $(this),
              offset = me.offset();
            me.css({
              position: 'fixed',
              top: offset.top - space.top,
              left: offset.left - space.left
            });
          });
          this.elts.cont.after(elts);
        }
        this.elts.cont.css('overflow', 'auto');
        this._callFilters('afterReposition');
      },

      // Unreposition elements with a class nmReposition
      // Exaclty the reverse of the _reposition function
      _unreposition: function() {
        this.elts.cont.css('overflow', '');
        var elts = this.elts.all.find('.nmReposition');
        if (elts.length)
          this.elts.cont.append(elts.removeAttr('style'));
        this._callFilters('afterUnreposition');
      }
    },
    _internal = {
      firstInit: true,
      stack: [],
      fullSize: {
        w: 0,
        h: 0,
        wW: 0,
        wH: 0,
        viewW: 0,
        viewH: 0
      },
      nyroModal: function(opts, fullObj) {
        if (_internal.firstInit) {
          _internal._container = $('<div />').appendTo($b);
          $w.smartresize($.proxy(_internal._resize, _internal));
          $d.bind('keydown.nyroModal', $.proxy(_internal._keyHandler, _internal));
          _internal._calculateFullSize();
          _internal.firstInit = false;
        }
        return this.nmInit(opts, fullObj).each(function() {
          _internal._init($(this).data('nmObj'));
        });
      },
      nmInit: function(opts, fullObj) {
        return this.each(function() {
          var me = $(this);
          if (fullObj)
            me.data('nmObj', $.extend(true, {opener: me}, opts));
          else
            me.data('nmObj',
              me.data('nmObj')
                ? $.extend(true, me.data('nmObj'), opts)
                : $.extend(true, {opener: me}, _nmObj, opts));
        });
      },
      nmCall: function() {
        return this.trigger('nyroModal');
      },

      nmManual: function(url, opts) {
        $('<a />', {
          href: url
        }).nyroModal(opts).trigger('nyroModal');
      },
      nmData: function(data, opts) {
        this.nmManual('#', $.extend({data: data}, opts));
      },
      nmObj: function(opts) {
        $.extend(true, _nmObj, opts);
      },
      nmInternal: function(opts) {
        $.extend(true, _internal, opts);
      },
      nmAnims: function(opts) {
        $.extend(true, _animations, opts);
      },
      nmFilters: function(opts) {
        $.extend(true, _filters, opts);
      },
      nmTop: function() {
        if (_internal.stack.length)
          return $(_internal.stack[_internal.stack.length-1]).data('nmObj');
        return undefined;
      },

      _debug: function(msg) {
        if (window.console && window.console.log)
          window.console.log(msg);
      },

      _container: undefined,

      _init: function(nm) {
        nm.filters = [];
        $.each(_filters, function(f, obj) {
          if (obj.is && $.isFunction(obj.is) && obj.is(nm)) {
            nm.filters.push(f);
          }
        });
        nm._callFilters('initFilters');
        nm._callFilters('init');
        nm.opener
          .unbind('nyroModal.nyroModal nmClose.nyroModal nmResize.nyroModal')
          .bind({
            'nyroModal.nyroModal':  function(e) { nm.open(); return false;},
            'nmClose.nyroModal':  function() { nm.close(); return false;},
            'nmResize.nyroModal':   function() { nm.resize(); return false;}
          });
      },

      _scrollWidth: (function() {
        var scrollbarWidth;
        if ($.browser.msie) {
          var $textarea1 = $('<textarea cols="10" rows="2"></textarea>')
              .css({ position: 'absolute', top: -1000, left: -1000 }).appendTo($b),
            $textarea2 = $('<textarea cols="10" rows="2" style="overflow: hidden;"></textarea>')
              .css({ position: 'absolute', top: -1000, left: -1000 }).appendTo($b);
          scrollbarWidth = $textarea1.width() - $textarea2.width();
          $textarea1.add($textarea2).remove();
        } else {
          var $div = $('<div />')
            .css({ width: 100, height: 100, overflow: 'auto', position: 'absolute', top: -1000, left: -1000 })
            .prependTo($b).append('<div />').find('div')
              .css({ width: '100%', height: 200 });
          scrollbarWidth = 100 - $div.width();
          $div.parent().remove();
        }
        return scrollbarWidth;
      })(),

      _selNyroModal: function(obj) {
        return $(obj).data('nmObj') ? true : false;
      },

      _selNyroModalOpen: function(obj) {
        var me = $(obj);
        return me.data('nmObj') ? me.data('nmObj')._open : false;
      },

      _keyHandler: function(e) {
        var nmTop = $.nmTop();
        if (nmTop && nmTop.useKeyHandler) {
          return nmTop.keyHandle(e);
        }
      },
      _pushStack: function(obj) {
        this.stack = $.map(this.stack, function(elA) {
          if (elA != obj.get(0))
            return elA;
        });
        this.stack.push(obj.get(0));
      },
      _removeStack: function(obj) {
        this.stack = $.map(this.stack, function(elA) {
          if (elA != obj.get(0))
            return elA;
        });
      },
      _resize: function() {
        var opens = $(':nmOpen').each(function() {
          $(this).data('nmObj')._unreposition();
        });
        this._calculateFullSize();
        opens.trigger('nmResize');
      },
      _calculateFullSize: function() {
        this.fullSize = {
          w: $d.width(),
          h: $d.height(),
          wW: $w.width(),
          wH: $w.height()
        };
        this.fullSize.viewW = Math.min(this.fullSize.w, this.fullSize.wW);
        this.fullSize.viewH = Math.min(this.fullSize.h, this.fullSize.wH);
      },
      _getCurCSS: function(elm, name) {
        var ret = parseInt($.curCSS(elm, name, true));
        return isNaN(ret) ? 0 : ret;
      },
      _getOuter: function(elm) {
        elm = elm.get(0);
        var ret = {
          h: {
            margin: this._getCurCSS(elm, 'marginTop') + this._getCurCSS(elm, 'marginBottom'),
            border: this._getCurCSS(elm, 'borderTopWidth') + this._getCurCSS(elm, 'borderBottomWidth'),
            padding: this._getCurCSS(elm, 'paddingTop') + this._getCurCSS(elm, 'paddingBottom')
          },
          w: {
            margin: this._getCurCSS(elm, 'marginLeft') + this._getCurCSS(elm, 'marginRight'),
            border: this._getCurCSS(elm, 'borderLeftWidth') + this._getCurCSS(elm, 'borderRightWidth'),
            padding: this._getCurCSS(elm, 'paddingLeft') + this._getCurCSS(elm, 'paddingRight')
          }
        };

        ret.h.outer = ret.h.margin + ret.h.border;
        ret.w.outer = ret.w.margin + ret.w.border;

        ret.h.inner = ret.h.padding + ret.h.border;
        ret.w.inner = ret.w.padding + ret.w.border;

        ret.h.total = ret.h.outer + ret.h.padding;
        ret.w.total = ret.w.outer + ret.w.padding;

        return ret;
      },
      _getSpaceReposition: function() {
        var outer = this._getOuter($b),
          ie7 = $.browser.msie && $.browser.version < 8 && !(screen.height <= $w.height()+23);
        return {
          top: $w.scrollTop() - (!ie7 ? outer.h.border / 2 : 0),
          left: $w.scrollLeft() - (!ie7 ? outer.w.border / 2 : 0)
        };
      },

      _getHash: function(url) {
        if (typeof url == 'string') {
          var hashPos = url.indexOf('#');
          if (hashPos > -1)
            return url.substring(hashPos);
        }
        return '';
      },
      _extractUrl: function(url) {
        var ret = {
          url: undefined,
          sel: undefined
        };

        if (url) {
          var hash = this._getHash(url),
            hashLoc = this._getHash(window.location.href),
            curLoc = window.location.href.substring(0, window.location.href.length - hashLoc.length),
            req = url.substring(0, url.length - hash.length);
          ret.sel = hash;
          if (req != curLoc && req != baseHref)
            ret.url = req;
        }
        return ret;
      }
    },
    _animations = {
      basic: {
        showBg: function(nm, clb) {
// ST2 Transparenz-Anpassung
          nm.elts.bg.css({opacity: 0.5}).show();
          clb();
        },
        hideBg: function(nm, clb) {
          nm.elts.bg.hide();
          clb();
        },
        showLoad: function(nm, clb) {
          nm.elts.load.show();
          clb();
        },
        hideLoad: function(nm, clb) {
          nm.elts.load.hide();
          clb();
        },
        showCont: function(nm, clb) {
          nm.elts.cont.show();
          clb();
        },
        hideCont: function(nm, clb) {
          nm.elts.cont.hide();
          clb();
        },
        showTrans: function(nm, clb) {
          nm.elts.cont.hide();
          nm.elts.load.show();
          clb();
        },
        hideTrans: function(nm, clb) {
          nm.elts.cont.show();
          nm.elts.load.hide();
          clb();
        },
        resize: function(nm, clb) {
          nm.elts.cont.css({
            width: nm.sizes.w,
            height: nm.sizes.h,
            top: (nm.getInternal().fullSize.viewH - nm.sizes.h - nm.sizes.hMargin)/2,
            left: (nm.getInternal().fullSize.viewW - nm.sizes.w - nm.sizes.wMargin)/2
          });
          clb();
        }
      }
    },
    _filters = {
      basic: {
        is: function(nm) {
          return true;
        },
        init: function(nm) {
          if (nm.opener.attr('rev') == 'modal')
            nm.modal = true;
          if (nm.modal)
            nm.closeOnEscape = nm.closeOnClick = nm.showCloseButton = false;
          if (nm.closeOnEscape)
            nm.useKeyHandler = true;
        },
        initElts: function(nm) {
          nm.elts.bg.addClass('nyroModalBg');
          if (nm.closeOnClick)
            nm.elts.bg.unbind('click.nyroModal').bind('click.nyroModal', function(e) {
              e.preventDefault();
              nm.close();
            });
          nm.elts.cont.addClass('nyroModalCont');
          nm.elts.hidden.addClass('nyroModalCont nyroModalHidden');
          nm.elts.load.addClass('nyroModalCont nyroModalLoad');
        },
        error: function(nm) {
          nm.elts.hidden.addClass('nyroModalError');
          nm.elts.cont.addClass('nyroModalError');
          nm._setCont(nm.errorMsg);
        },
        beforeShowCont: function(nm) {
          nm.elts.cont
            .find('.nyroModal').nyroModal(nm.getForNewLinks(), true).end()
            .find('.nyroModalClose').bind('click.nyroModal', function(e) {
              e.preventDefault();
              nm.close();
            });
        },
        keyHandle: function(nm) {
          // used for escape key
          if (nm.keyEvent.keyCode == 27 && nm.closeOnEscape) {
            nm.keyEvent.preventDefault();
            nm.close();
          }
        }
      },

      custom: {
        is: function(nm) {
          return true;
        }
      }
    };

  // Add jQuery call fucntions
  $.fn.extend({
    nm: _internal.nyroModal,
    nyroModal: _internal.nyroModal,
    nmInit: _internal.nmInit,
    nmCall: _internal.nmCall
  });

  // Add global jQuery functions
  $.extend({
    nmManual: _internal.nmManual,
    nmData: _internal.nmData,
    nmObj: _internal.nmObj,
    nmInternal: _internal.nmInternal,
    nmAnims: _internal.nmAnims,
    nmFilters: _internal.nmFilters,
    nmTop: _internal.nmTop
  });

  // Add jQuery selectors
  $.expr[':'].nyroModal = $.expr[':'].nm = _internal._selNyroModal;
  $.expr[':'].nmOpen = _internal._selNyroModalOpen;
});

// Smartresize plugin
(function($,sr){

  // debouncing function from John Hann
  // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/
  var debounce = function (func, threshold, execAsap) {
      var timeout;

      return function debounced () {
          var obj = this, args = arguments;
          function delayed () {
              if (!execAsap)
                  func.apply(obj, args);
              timeout = null;
          };

          if (timeout)
              clearTimeout(timeout);
          else if (execAsap)
              func.apply(obj, args);

          timeout = setTimeout(delayed, threshold || 100);
      };
  };
  // smartresize
  jQuery.fn[sr] = function(fn){  return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); };

})(jQuery,'smartresize');
// ucFirst
function ucfirst(str) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: ucfirst('kevin van zonneveld');
    // *     returns 1: 'Kevin van zonneveld'
    str += '';
    var f = str.charAt(0).toUpperCase();
    return f + str.substr(1);
}
/*
 * nyroModal v2.0.0
 *
 * Fade animations
 *
 * Depends:
 *
 */
jQuery(function($, undefined) {
  $.nmAnims({
    fade: {
      showBg: function(nm, clb) {
// ST2 Transparenz-Anpassung
        nm.elts.bg.fadeTo(250, 0.5, clb);
      },
      hideBg: function(nm, clb) {
        nm.elts.bg.fadeOut(clb);
      },
      showLoad: function(nm, clb) {
        nm.elts.load.fadeIn(clb);
      },
      hideLoad: function(nm, clb) {
        nm.elts.load.fadeOut(clb);
      },
      showCont: function(nm, clb) {
        nm.elts.cont.fadeIn(clb);
      },
      hideCont: function(nm, clb) {
        nm.elts.cont.css('overflow', 'hidden').fadeOut(clb);
      },
      showTrans: function(nm, clb) {
        nm.elts.load
          .css({
            position: nm.elts.cont.css('position'),
            top: nm.elts.cont.css('top'),
            left: nm.elts.cont.css('left'),
            width: nm.elts.cont.css('width'),
            height: nm.elts.cont.css('height'),
            marginTop: nm.elts.cont.css('marginTop'),
            marginLeft: nm.elts.cont.css('marginLeft')
          })
          .fadeIn(function() {
            nm.elts.cont.hide();
            clb();
          });
      },
      hideTrans: function(nm, clb) {
        nm.elts.cont.css('visibility', 'hidden').show();
        nm.elts.load
          .css('position', nm.elts.cont.css('position'))
          .animate({
            top: nm.elts.cont.css('top'),
            left: nm.elts.cont.css('left'),
            width: nm.elts.cont.css('width'),
            height: nm.elts.cont.css('height'),
            marginTop: nm.elts.cont.css('marginTop'),
            marginLeft: nm.elts.cont.css('marginLeft')
          }, function() {
            nm.elts.cont.css('visibility', '');
            nm.elts.load.fadeOut(clb);
          });
      },
      resize: function(nm, clb) {
        nm.elts.cont.animate({
          width: nm.sizes.w,
          height: nm.sizes.h,
          top: (nm.getInternal().fullSize.viewH - nm.sizes.h - nm.sizes.hMargin)/2,
          left: (nm.getInternal().fullSize.viewW - nm.sizes.w - nm.sizes.wMargin)/2
        }, clb);
      }
    }
  });
  // Define fade aniamtions as default
  $.nmObj({anim: {def: 'fade'}});
});
/*
 * nyroModal v2.0.0
 *
 * Title filter
 *
 * Depends:
 *
 * Before:
 */
jQuery(function($, undefined) {
  $.nmFilters({
    title: {
      is: function(nm) {
        return nm.opener.is('[title]');
      },
      beforeShowCont: function(nm) {
        var offset = nm.elts.cont.offset();
        nm.store.title = $('<h1 />', {
/*          text: nm.opener.attr('title') */
// ST2 Anpassung. Titel des Bildes wird aus dem rev Attribut des Links generiert.
text: nm.opener.attr('rev')
        }).addClass('nyroModalTitle nmReposition');
        nm.elts.cont.prepend(nm.store.title);
      },
      close: function(nm) {
        if (nm.store.title) {
          nm.store.title.remove();
          nm.store.title = undefined;
          delete(nm.store.title);
        }
      }
    }
  });
});
/*
 * nyroModal v2.0.0
 *
 * Gallery filter
 *
 * Depends:
 * - filters.title
 *
 * Before: filters.title
 */
jQuery(function($, undefined) {
  $.nmFilters({
    gallery: {
      is: function(nm) {
        var ret = nm.opener.is('[rel]:not([rel=external], [rel=nofollow])');
        if (ret && nm.galleryCounts && !nm._hasFilter('title'))
          nm.filters.push('title');
        return ret;
      },
      init: function(nm) {
        nm.useKeyHandler = true;
      },
      keyHandle: function(nm) {
        // used for arrows key
        if (!nm._animated && nm._opened) {
          if (nm.keyEvent.keyCode == 39 || nm.keyEvent.keyCode == 40) {
            nm.keyEvent.preventDefault();
            nm._callFilters('galleryNext');
          } else if (nm.keyEvent.keyCode == 37 || nm.keyEvent.keyCode == 38) {
            nm.keyEvent.preventDefault();
            nm._callFilters('galleryPrev');
          }
        }
      },
      initElts: function(nm) {
        var rel = nm.opener.attr('rel'),
          indexSpace = rel.indexOf(' ');
        nm.store.gallery = indexSpace > 0 ? rel.substr(0, indexSpace) : rel;
        nm.store.galleryLinks = $('[href][rel="'+nm.store.gallery+'"], [href][rel^="'+nm.store.gallery+' "]');
        nm.store.galleryIndex = nm.store.galleryLinks.index(nm.opener);
      },
      beforeShowCont: function(nm) {
        if (nm.galleryCounts && nm.store.title && nm.store.galleryLinks.length > 1) {
          var curTitle = nm.store.title.html();
          nm.store.title.html((curTitle.length ? curTitle+' - ' : '')+(nm.store.galleryIndex+1)+'/'+nm.store.galleryLinks.length);
        }
      },
      filledContent: function(nm) {
        var link = this._getGalleryLink(nm, -1),
          append = nm.elts.hidden.find(' > div');
        if (link) {
// ST2 Textanpassung
          $('<a />', {
              text: 'Zurück',
              title: 'Zurück',
              href: '#'
            })
            .addClass('nyroModalPrev')
            .bind('click', function(e) {
              e.preventDefault();
              nm._callFilters('galleryPrev');
            })
            .appendTo(append);
        }
        link = this._getGalleryLink(nm, 1);
        if (link) {
// ST2 Textanpassung
          $('<a />', {
              text: 'Weiter',
              title: 'Weiter',
              href: '#'
            })
            .addClass('nyroModalNext')
            .bind('click', function(e) {
              e.preventDefault();
              nm._callFilters('galleryNext');
            })
            .appendTo(append);
        }
      },
      close: function(nm) {
        nm.store.gallery = undefined;
        nm.store.galleryLinks = undefined;
        nm.store.galleryIndex = undefined;
        delete(nm.store.gallery);
        delete(nm.store.galleryLinks);
        delete(nm.store.galleryIndex);
        if (nm.elts.cont)
          nm.elts.cont.find('.nyroModalNext, .nyroModalPrev').remove();
      },
      galleryNext: function(nm) {
        this._getGalleryLink(nm, 1).nyroModal(nm.getForNewLinks(), true).click();
      },
      galleryPrev: function(nm) {
        this._getGalleryLink(nm, -1).nyroModal(nm.getForNewLinks(), true).click();
      },
      _getGalleryLink: function(nm, dir) {
        if (nm.store.gallery) {
          if (!nm.ltr)
            dir *= -1;
          var index = nm.store.galleryIndex + dir;
          if (index >= 0 && index < nm.store.galleryLinks.length)
            return nm.store.galleryLinks.eq(index);
          else if (nm.galleryLoop)
            return nm.store.galleryLinks.eq(index<0 ? nm.store.galleryLinks.length-1 : 0);
        }
        return undefined;
      }
    }
  });
});
/*
 * nyroModal v2.0.0
 *
 * Link filter
 *
 * Depends:
 *
 * Before: filters.gallery
 */
jQuery(function($, undefined) {
  $.nmFilters({
    link: {
      is: function(nm) {
        var ret = nm.opener.is('[href]');
        if (ret)
          nm.store.link = nm.getInternal()._extractUrl(nm.opener.attr('href'));
        return ret;
      },
      init: function(nm) {
        nm.loadFilter = 'link';
        nm.opener.unbind('click.nyroModal').bind('click.nyroModal', function(e) {
          e.preventDefault();
          nm.opener.trigger('nyroModal');
        });
      },
      load: function(nm) {
        $.ajax({
          url: nm.store.link.url,
          data: nm.store.link.sel ? [{name: nm.selIndicator, value: nm.store.link.sel.substring(1)}] : undefined,
          success: function(data) {
            nm._setCont(data, nm.store.link.sel);
          },
          error: function() {
            nm._error();
          }
        });
      }
    }
  });
});
/*
 * nyroModal v2.0.0
 *
 * Image filter
 *
 * Depends:
 * - filters.link
 *
 * Before: filters.data
 */
jQuery(function($, undefined) {
  $.nmFilters({
    image: {
      is: function(nm) {
        return (new RegExp(nm.imageRegex, 'i')).test(nm.opener.attr('href'));
      },
      init: function(nm) {
        nm.loadFilter = 'image';
      },
      load: function(nm) {
        var url = nm.opener.attr('href');
        $('<img />')
          .load(function() {
            nm.elts.cont.addClass('nyroModalImg');
            nm.elts.hidden.addClass('nyroModalImg');
            nm._setCont(this);
          }).error(function() {
            nm._error();
          })
          .attr('src', url);
      },
      size: function(nm) {
        if (nm.sizes.w != nm.sizes.initW || nm.sizes.h != nm.sizes.initH) {
          var ratio = Math.min(nm.sizes.w/nm.sizes.initW, nm.sizes.h/nm.sizes.initH);
          nm.sizes.w = nm.sizes.initW * ratio;
          nm.sizes.h = nm.sizes.initH * ratio;
        }
        var img = nm.loading ? nm.elts.hidden.find('img') : nm.elts.cont.find('img');
        img.attr({
          width: nm.sizes.w,
          height: nm.sizes.h
        });
      },
      close: function(nm) {
        if (nm.elts.cont) {
          nm.elts.cont.removeClass('nyroModalImg');
          nm.elts.hidden.removeClass('nyroModalImg');
        }
      }
    }
  });
});

