HELLERAU = function() {

  var $E  = YAHOO.util.Event;
  var $D  = YAHOO.util.Dom;
  var $A  = YAHOO.util.Anim;
  var $   = YAHOO.util.Dom.get;

  function trim(str) {
    // var str = str.replace(/^\s\s*/, ''),
    //   ws = /\s/,
    //   i = str.length;
    // while (ws.test(str.charAt(--i)));
    // return str.slice(0, i + 1);
  }

  // Carousel variables
  var carouselTimer;
  var carouselActive;
  var carouselStartTimer;
  var carouselSpeed = 5000;
  var carouselPlayer;

  // Sort variables
  var items, parent;

  function compare(val1, val2, desc) {
    return (desc) ? val1 > val2 : val1 < val2;
  }

  function exchange(i, j) {
    parent.insertBefore(items[i], items[j]);
  }

  function get(mode, i) {
    return $D.getAttribute(items[i], 'data_'+mode);
  }

  function sortEls(p, mode, desc) {
    parent = p;
    items = parent.getElementsByTagName("li");
    var N = items.length;
    // bubble sort - not very efficient but ok for short lists
    for(var j=N-1; j > 0; j--) {
      for(var i=0; i < j; i++) {
        if(compare(get(mode, i+1), get(mode, i), desc)) {
          exchange(i+1, i);
        }
      }
    }
    return true;
  }

  function hideEmpties() {
    var cats = $D.getElementsByClassName('category', 'div', 'resultset'),
        els, show;
    for (var i=0; i < cats.length; i++) {
      show = false;
      els = cats[i].getElementsByTagName('li');
      for (j=0; j < els.length; j++) {
        if($D.getStyle(els[j], 'display') == 'block') {
          show = true; 
          break;
        }
      }
      if(show == false) {
        $D.setStyle(cats[i], 'display', 'none');
      }
    };
  }

  function carousel() {
    var id = this.id.slice(5);
    var up = $('upcoming');
    var cur = this;
    // Stop all movies
    var videos = $D.getElementsByClassName('video', 'a', 'stage');
    for (var i=0; i < videos.length; i++) {
      removeVideo(videos[i].parentNode);
    };
    var shift = new YAHOO.util.Anim($D.getFirstChild('stage'), { 
      marginLeft: { to: (0-(id*645)+645) }}, 1, 
      YAHOO.util.Easing.easeBoth);
    shift.onComplete.subscribe(function(e) {
      $D.replaceClass($D.getChildren(up), 'active', 'inactive');
      $D.replaceClass(cur, 'inactive', 'active');
    });
    shift.animate();
  }

  function animateCarousel() {
    var els = $('upcoming').getElementsByTagName('div');
    if(!carouselActive) {
      carouselActive = els[0];
    } else {
      for (var i = 0; i < els.length; i++) {
        if(els[i] == carouselActive && els[i+1]) {
          carouselActive = els[i+1];
          break;
        } else if(els[i] == carouselActive) {
          carouselActive = els[0];
          break;
        }
      };
    }
    carousel.apply(carouselActive);
    if(!carouselTimer) {
      carouselTimer = setInterval(animateCarousel, carouselSpeed);
    }
  }

  function mouseToCarousel() {
    clearTimeout(carouselTimer);
    carousel.apply(this);
  }

  function restartCarousel() {
    clearTimeout(carouselTimer);
    clearTimeout(carouselStartTimer);
    carouselStartTimer = setTimeout(function() {
      carouselTimer = setInterval(animateCarousel, carouselSpeed);
    }, carouselSpeed);
  }

  function supports_video() {
    return !!document.createElement('video').canPlayType;
  }

  function destroyVideo() {
    if($('video')) {
      $('video').parentNode.removeChild($('video'));
    }
  }

  function insertVideo (el, mp4Src, ogvSrc, w, h) {
    if(supports_video()){
      video = document.createElement('video');
      video.setAttribute('width', w);
      video.setAttribute('height', h);

      video.autoplay = true;
      video.controls = true;

      mp4 = document.createElement('source');
      mp4.setAttribute('src', mp4Src);
      mp4.setAttribute('type', "video/mp4");

      ogv = document.createElement('source');
      ogv.setAttribute('src', ogvSrc);
      ogv.setAttribute('type', "video/ogg");

      video.appendChild(mp4);
      video.appendChild(ogv);
      video.id = 'video';

      $D.insertAfter(video, el);

    } else {
      video = document.createElement('div');
      video.id = 'video';
      $D.insertAfter(video, el);
      carouselPlayer = flowplayer('video', {
        src: '/assets/flowplayer/flowplayer-3.2.5.swf', 
        width: w,
        height: h}, { 
          canvas: {
            backgroundColor: '#000000',
            backgroundGradient: 'none'
          },
          clip:  {
            autoPlay: true,
            autoBuffering: true,
            scaling: 'fit',
            url: mp4Src
          }
      });
    }
  }

  function removeVideo(el) {
    if(supports_video()) {
      var vs = el.getElementsByTagName('video');
      if(vs.length == 1) {
        var v = vs[0];
        v.pause();
        $D.setStyle($D.getPreviousSibling(v), 'display', 'block');
        v.parentNode.removeChild(v);
      }
    } else {
      var v = $('video');
      if(v) {
        carouselPlayer.unload();
        carouselPlayer = null;
        v.parentNode.removeChild(v);
      }
    }
  }

  return {

    /**
    * Create a quaternary navigation element for all H2 els
    */
    autoQuaternary: function() {
      var h2s = $('content').getElementsByTagName('h2');
      var a, sid, q, qUl, qLi, qA;
      q = document.createElement('div');
      q.id = 'quaternary';
      qUl = document.createElement('ul');
      $D.addClass(qUl, 'small');
      $D.addClass(qUl, 'em');
      for (var i=0; i < h2s.length; i++) {
        a = document.createElement('a');
        a.name = h2s[i].innerHTML.toLowerCase().replace(' ', '-').replace('/[^a-z\-]/', '');
        $D.addClass(a, 'anchor');
        $D.insertBefore(a, h2s[i]);
        qLi = document.createElement('li');
        qA = document.createElement('a');
        qA.href = '#'+a.name;
        qA.innerHTML = h2s[i].innerHTML;
        qLi.appendChild(qA);
        qUl.appendChild(qLi);
      };
      q.appendChild(qUl);
      $D.insertBefore(q, 'content');
      $D.removeClass('content', 'no-col');
    },

    /**
    * Create the HTML for the pop-up stage
    */
    createPopStage: function(root, showNav) {
      var mask = document.createElement('div'),
          stage = document.createElement('div'),
          head = document.createElement('h2'),
          close = document.createElement('div'),
          caption = document.createElement('p'),
          img = new Image,
          next = document.createElement('div'),
          prev = document.createElement('div');

      mask.id = 'mask';
      stage.id = 'pop-stage';
      img.id = 'stage-image';
      next.id = 'next';
      prev.id = 'prev';
      close.id = 'close';
      caption.id = 'caption';

      $D.setXY(mask, [0,0]);
      document.body.appendChild(mask);

      head.appendChild(document.createTextNode(''));
      close.appendChild(document.createTextNode('X'));
      next.appendChild(document.createTextNode('nächstes Bild'));
      prev.appendChild(document.createTextNode('vorheriges Bild'));

      stage.appendChild(head);
      stage.appendChild(close);
      stage.appendChild(img);

      if(showNav) {

        stage.appendChild(next);
        stage.appendChild(prev);

        $E.on(['prev', 'next'], 'click', function(e) {
          $E.stopEvent(e);
          var imgs = root.getElementsByTagName('a'),
              spans, n;
          for (var i = 0; i < imgs.length; i++) {
            if(imgs[i].href == $D.getAttribute(img, 'data_current')) {
              if(this.id == 'next') {
                n = i+1;
              } else {
                n = i-1;
              }
              if(imgs[n]) {
                destroyVideo();
                $D.setStyle(img, 'display', 'block');
                var newImage = new Image();
                $E.on(newImage, 'load', function(e) {
                  img.src = this.full.src;
                  if($D.getAttribute(this.thumb, 'title')) {
                    caption.innerHTML = $D.getAttribute(this.thumb, 'title');
                  } else {
                    caption.innerHTML = '';
                  }
                }, {'thumb': imgs[n], 'full': newImage}, true);
                if(imgs[n].href.slice(-3) == 'mp4' || imgs[n].href.slice(-3) == 'm4v') {
                  $D.setStyle(img, 'display', 'none');
                  insertVideo(img, imgs[n].href, $D.getAttribute(imgs[n], 'data_ogv'), 680, 480);
                  $D.setAttribute(img, 'data_current', imgs[n].href);
                } else {
                  newImage.src = imgs[n].href;
                  $D.setAttribute(img, 'data_current', imgs[n].href);
                }
              }
              break;
            }
          };

        });

      }

      stage.appendChild(caption);
      document.body.appendChild(stage);


      $E.on(close, 'click', function(e) {
        $E.stopEvent(e);
        destroyVideo();
        var bg = new YAHOO.util.Anim([mask, stage], { opacity: { to: 0 }}, 0.25);
        bg.onComplete.subscribe(function(e) {
          $D.setStyle([mask, stage], 'display', 'none');
        });
        bg.animate();
      });

      $E.on(img, 'load', function(e) {

        $D.setStyle(this, 'width', 'auto');
        $D.setStyle(this, 'height', 'auto');
        var r = $D.getRegion(this);

        if(r.height != 465) {
          $D.setStyle(this, 'width', (r.width*465/r.height)+'px');
          $D.setStyle(this, 'height', '465px');
        }

      });

    },

    /**
    * Truncate any elements that extend beyond the width of their parents
    */
    truncate: function(els) {
      var parents = [], index = {}, c;
      if(!els.length && els.tagName) {
        els = [els];
      }
      for (var i=0; i < els.length; i++) {
        parents.push(els[i].parentNode);
      }
      var fontSize = $D.getStyle(els[0], 'fontSize').slice(0, -2);
      $D.setStyle(els, 'whiteSpace', 'nowrap');
      $D.setStyle(els, 'overflow', 'hidden');
      $D.setStyle(parents, 'padding', 0);
      $D.setStyle(parents, 'overflow', 'hidden');
      for (var i = 0; i < els.length; i++) {
        if(els[i].innerHTML.length > 10 && els[i].offsetWidth > parents[0].offsetWidth-fontSize) {
          if(els[i].textContent) {
            $D.setAttribute(els[i], 'title', els[i].innerHTML);
            // check the index for a duplicate title
            if(index[els[i].textContent]) {
              els[i].innerHTML = index[els[i].textContent];
            } else {
              c = 0;
              while(els[i].offsetWidth > (parents[0].offsetWidth-fontSize)) {
                c++;
                if(c > 200) {
                  break;
                } else if(els[i].textContent.length-3 > 0) {
                  els[i].textContent = els[i].textContent.slice(0, els[i].textContent.length-3);
                } else {
                  break;
                }
                els[i].textContent = els[i].textContent+'…';
                index[els[i].textContent] = els[i].textContent;
              }
            }
          } else {
            $D.setAttribute(els[i], 'title', els[i].innerHTML);
            // check the index for a duplicate title
            if(index[els[i].innerHTML]) {
              els[i].innerHTML = index[els[i].innerHTML];
            } else {
              c = 0;
              while(els[i].offsetWidth > (parents[0].offsetWidth-fontSize)) {
                c++;
                if(c > 200) {
                  break;
                } else if(els[i].innerHTML.length-3 > 0) {
                  els[i].innerHTML = els[i].innerHTML.slice(0, els[i].innerHTML.length-3);
                } else {
                  break;
                }
                els[i].innerHTML = els[i].innerHTML+'…';
                index[els[i].innerHTML] = els[i].innerHTML;
              }
            }
          }
        }
      }
    }, // end truncate()

    /**
    * Truncate any elements that extend beyond the height of the element
    */
    verticalTruncate: function(els) {
      var parents = [], index = {}, c, 
        aHeight,  // current Height
        cRegion,  // fixed Height region
        xRegion;  // auto Height
      if(!els.length && els.tagName) {
        els = [els];
      }
      for (var i = 0; i < els.length; i++) {
        aHeight = $D.getStyle(els[i], 'height');
        cRegion = $D.getRegion(els[i]);
        $D.setStyle(els[i], 'height', 'auto');
        xRegion = $D.getRegion(els[i]);
        if(els[i].innerHTML.length > 10 && xRegion.height > cRegion.height) {
          $D.setAttribute(els[i], 'title', els[i].innerHTML);
          // check the index for a duplicate title
          if(index[els[i].innerHTML]) {
            els[i].innerHTML = index[els[i].innerHTML];
          } else {
            c = 0;
            while(xRegion.height > cRegion.height) {
              c++;
              if(c > 200) {
                break;
              } else if(els[i].innerHTML.length-3 > 0) {
                els[i].innerHTML = els[i].innerHTML.slice(0, els[i].innerHTML.length-3);
                xRegion = $D.getRegion(els[i]);
              } else {
                break;
              }
              els[i].innerHTML = els[i].innerHTML.slice(0, els[i].innerHTML.length-3)+'…';
              index[els[i].innerHTML] = els[i].innerHTML;
              // console.log(aHeight);
            }
          }
        } // end if we need to truncate
        $D.setStyle(els[i], 'height', aHeight);
      }
    }, // end verticalTruncate()

    /**
    * Setup and/or display a lightbox with the Gallery images
    */
    gallery: function(root, defaultImg) {

      var r = $D.getClientRegion(),
          showNav = true;

      if(arguments.length == 3 && arguments[2] == false) {
        showNav = false;
      }

      if(!$('mask')) {
        HELLERAU.createPopStage(root, showNav);
      }

      var mask = $('mask'),
          stage = $('pop-stage'),
          img = $('stage-image'),
          next = $('next'),
          prev = $('prev'),
          close = $('close'),
          caption = $('caption');

      $D.setStyle(mask, 'width', $D.getDocumentWidth()+'px');
      $D.setStyle(mask, 'height', $D.getDocumentHeight()+'px');

      var bg = new YAHOO.util.Anim(mask, { opacity: { from: 0, to: 0.4 }}, 0.25);
      bg.onStart.subscribe(function(e) {
        $D.setStyle([mask, stage], 'display', 'block');
        $D.setStyle($D.getChildren(stage), 'display', 'none');
        $D.setStyle(stage, 'opacity', 1);
        $D.setStyle(stage, 'width', 1+'px');
        $D.setStyle(stage, 'height', 1+'px');
        $D.setStyle(stage, 'borderWidth', 0);
        $D.setStyle(stage, 'left', r.width/2+'px');
        $D.setStyle(stage, 'top', r.height/2+'px');

        var bd = document.body;

        if(YAHOO.env.ua.ie || YAHOO.env.ua.gecko) {
          bd = document.documentElement;
        }

        if(bd.scrollTop > 0 || bd.scrollLeft > 0) {
          var scrollAnim = new YAHOO.util.Scroll(bd, {
            scroll: { to: [0, 0] }
          }, 0.5, YAHOO.util.Easing.easeBoth);
          scrollAnim.animate();
        }

      });
      bg.onComplete.subscribe(function(e) {
        var stageOpen = new YAHOO.util.Anim(stage, { 
            width: { from: 1, to: 680 }, 
            height: { from: 1, to: 510 }, 
            borderWidth: { from: 0, to: 20, unit: 'px' }, 
            top: { from: $D.getViewportHeight()/2, to: ($D.getViewportHeight()/2)-270 },
            left: { from: $D.getViewportWidth()/2, to: ($D.getViewportWidth()/2)-350 }
        }, 0.25);
        stageOpen.onComplete.subscribe(function(e) {
          $D.setStyle($D.getChildren(stage), 'display', 'block');
          img.src = null;

          var imgs = root.getElementsByTagName('a');
          if(imgs.length == 1) {
            $D.setStyle([next, prev], 'opacity', 0);
          }

          if(defaultImg.href.slice(-3) == 'mp4' || defaultImg.href.slice(-3) == 'm4v') {
            $D.setStyle(img, 'display', 'none');
            insertVideo(img, defaultImg.href, $D.getAttribute(defaultImg, 'data_ogv'), 680, 480);
          } else {
            img.src = defaultImg.href;
          }
          $D.setAttribute(img, 'data_current', defaultImg.href);

          if($D.getAttribute(defaultImg, 'title')) {
            caption.innerHTML = $D.getAttribute(defaultImg, 'title');
          }
        });
        stageOpen.animate();
      });
      bg.animate();

      $E.on(window, 'resize', function(e) {
        $D.setStyle(mask, 'width', $D.getViewportWidth()+'px');
        $D.setStyle(mask, 'height', $D.getViewportHeight()+'px');
        $D.setXY(stage, [($D.getViewportWidth()/2)-360, ($D.getViewportHeight()/2)-275]);
      });

    }, // end gallery()

    init: function() {

      $E.onAvailable('quaternary', function(e) {
        HELLERAU.truncate(this.getElementsByTagName('a'));
      });

      $E.onAvailable('resultset', function(e) {
        var spans = $D.getElementsByClassName('truncate', 'span', this),
            vSpans = $D.getElementsByClassName('truncate-vertical', 'em', this),
            ems = $D.getElementsByClassName('truncate', 'em', this);
        if(ems.length) {
          HELLERAU.truncate(ems);
        }
        if(spans.length) {
          HELLERAU.truncate(spans);
        }
        if(vSpans.length) {
          HELLERAU.verticalTruncate(vSpans);
        }
      });

      $E.onAvailable('archive-mode', function(e) {
        $D.setStyle(this, 'display', 'block');
        $E.on(this, 'click', function(e) {
          $E.stopEvent(e);
          var t = $E.getTarget(e);
          $D.removeClass('resultset', 'text');
          $D.removeClass('resultset', 'images');
          $D.removeClass(this.getElementsByTagName('li'), 'selected');
          $D.addClass('resultset', t.id);
          $D.addClass(t, 'selected');
          if(t.id == 'images') {
            $D.setStyle($D.getElementsByClassName('text', 'a', 'resultset'), 'display', 'none');
            $D.setStyle($D.getElementsByClassName('images', 'a', 'resultset'), 'display', 'block');
          } else {
            $D.setStyle($D.getElementsByClassName('images', 'a', 'resultset'), 'display', 'none');
            $D.setStyle($D.getElementsByClassName('text', 'a', 'resultset'), 'display', 'block');
          }
        });
      });

      $E.onAvailable('archive-options', function(e) {
        $D.setStyle(this, 'display', 'block');
        var bubble = document.createElement('div'),
            bTop = document.createElement('div'),
            bBottom = document.createElement('div'),
            bContent = document.createElement('div')
        ;
        $D.setStyle(bubble, 'display', 'none');
        $D.addClass(bubble, 'bubble');
        $D.addClass(bTop, 'top');
        $D.addClass(bContent, 'content');
        $D.addClass(bBottom, 'bottom');
        bubble.appendChild(bTop);
        bubble.appendChild(bContent);
        bubble.appendChild(bBottom);
        $('contentarea').appendChild(bubble);

        $D.setStyle($('resultset').getElementsByTagName('li'), 'display', 'block');
        $E.on('wrapper', 'click', function(e) {
          var t = $E.getTarget(e), a;
          if(!$D.hasClass('bubble')) {
            a = $D.getAncestorByClassName(t, 'bubble');
            if(!a) {
              $D.removeClass(bubble, 'search');
              $D.setStyle(bubble, 'display', 'none');
              $D.removeClass($('archive-options').getElementsByTagName('li'), 'selected');
            }
          }
          return;
        });

        $E.on(this, 'click', function(e) {
          $E.stopEvent(e);
          var t = $E.getTarget(e),
              xy = $D.getXY(t);
          if($D.hasClass(t, 'selected')) {
            $D.removeClass(bubble, 'search');
            $D.removeClass(t, 'selected');
            $D.setStyle(bubble, 'display', 'none');
            return;
          }
          $D.removeClass(this.getElementsByTagName('li'), 'selected');
          $D.removeClass(bubble, 'search');
          $D.addClass(t, 'selected');
          $D.setStyle(bubble, 'display', 'block');
          $D.setXY(bubble, [xy[0]+10, xy[1]+20]);
          while (bContent.childNodes.length >= 1 ) {
            bContent.removeChild(bContent.firstChild);
          }
          if(t.id == 'archive-filter') {
            var filters = $('filters').cloneNode(true);
            filters.id = null;
            $E.on(filters, 'click', function(e) {
              $E.stopEvent(e);
              var t = $E.getTarget(e);
              $D.setStyle($('resultset').getElementsByTagName('div'), 'display', 'block');
              if(t.id) {
                $D.setStyle($('resultset').getElementsByTagName('div'), 'display', 'none');
                $D.setStyle($D.getElementsByClassName(t.id, 'div', 'resultset'), 'display', 'block');
              }
              hideEmpties();
            });
            bContent.appendChild(filters);
          } else if(t.id == 'archive-months') {
            var months = $('months').cloneNode(true);
            months.id = null;
            $E.on(months, 'click', function(e) {
              $E.stopEvent(e);
              var t = $E.getTarget(e);
              $D.setStyle($('resultset').getElementsByTagName('div'), 'display', 'block');
              $D.setStyle($('resultset').getElementsByTagName('li'), 'display', 'block');
              if(t.id) {
                $D.setStyle($('resultset').getElementsByTagName('li'), 'display', 'none');
                $D.setStyle($D.getElementsByClassName(t.id, 'li', 'resultset'), 'display', 'block');
              }
              hideEmpties();
            });
            bContent.appendChild(months);
          } else if(t.id == 'archive-search') {
            $D.addClass(bubble, 'search');
            var search = $('search').cloneNode(true);
            search.id = null;
            bContent.appendChild(search);
          } else if(t.id == 'archive-sort') {
            var sort = $('sort').cloneNode(true);
            sort.id = null;
            $E.on(sort, 'click', function(e) {
              $E.stopEvent(e);
              var t = $E.getTarget(e);
              var uls = $('resultset').getElementsByTagName('ul');
              for (var i=0; i < uls.length; i++) {
                if(t.id == 'sort-title') {
                  sortEls(uls[i], 'title', false);
                } else {
                  sortEls(uls[i], 'artist', false);
                }
              };
            });
            bContent.appendChild(sort);
          }
        });
      });

      $E.onAvailable('filter', function(e) {
        var filters = this.getElementsByTagName('li'),
            sample,
            filter = this;
        for (var i=0; i < filters.length; i++) {
          sample = $D.getElementsByClassName($D.getAttribute(filters[i], 'data_class'), 'div', 'resultset');
          if(sample.length == 0) {
            $D.addClass(filters[i], 'disabled');
          } else {
            $D.addClass(filters[i], 'enabled');
          }
        };
        $D.setStyle(this, 'display', 'block');
        $E.on(this, 'click', function(e){
          $E.stopEvent(e);
          var t = $E.getTarget(e),
              root = $('resultset');

          if($('resultset-wrap')) {
            root = $('resultset-wrap');
            var past = $D.getElementsByClassName('past', 'div', root);
            var a1 = new YAHOO.util.Anim('past', { 
              opacity: { to: 0 }}, 1, 
              YAHOO.util.Easing.easeBoth);
            var a2 = new YAHOO.util.Anim(past[0], { 
              marginTop: { to: -30 }}, 1, 
              YAHOO.util.Easing.easeBoth);
            a2.animate();
            a1.animate();
            a1.onTween.subscribe(function(e) {
              if(this.currentFrame >= 900) {
                $D.setStyle(root, 'overflow', 'visible');
              }
            });
          }

          if(!$D.hasClass(t, 'disabled') && $D.getAttribute(t, 'data_class')) {
            if($D.hasClass(t, 'active')) {
              $D.setStyle($D.getChildren(root), 'display', 'block');
              $D.setStyle($D.getElementsByClassName('enabled', 'li', filter), 'opacity', 1);
              $D.removeClass(t, 'active');
            } else {
              $D.removeClass($D.getElementsByClassName('active', 'li', filter), 'active');
              $D.setStyle($D.getChildren(root), 'display', 'none');
              $D.setStyle($D.getElementsByClassName($D.getAttribute(t, 'data_class'), 'div', 'resultset'), 'display', 'block');
              $D.setStyle($D.getElementsByClassName('enabled', 'li', filter), 'opacity', 0.5);
              $D.setStyle(t, 'opacity', 1);
              $D.addClass(t, 'active');
            }
          }
        });
      });

      $E.onAvailable('upcoming', function(e) {
        var up = this;
        $E.on(this.getElementsByTagName('div'), 'mouseover', mouseToCarousel);
        $E.on(this.getElementsByTagName('div'), 'mouseout', restartCarousel);
        $E.on('stage', 'click', function(e) {
          var t = $E.getTarget(e);
          if(t.tagName.toLowerCase() == 'a' && !$D.hasClass(t, 'video')) {
            window.location = t.href;
          }
        });
        animateCarousel();
      });

      $E.onAvailable('news', function(e) {
        var uls = this.getElementsByTagName('ul');
        var titles1 = $D.getElementsByClassName('truncate', 'a', uls[0]);
        var titles2 = $D.getElementsByClassName('truncate', 'a', uls[1]);
        HELLERAU.truncate(titles1);
        HELLERAU.truncate(titles2);

        var plays = $D.getElementsByClassName('play', 'a', this),
            videos = $D.getElementsByClassName('video', 'a', this),
            img;
        if(plays.length) {
          for (var i=0; i < plays.length; i++) {
            img = plays[i].getElementsByTagName('img');
            if(!img[0]) {
              continue;
            }
            $D.setStyle(img[0].parentNode, 'backgroundPosition', 'top left');
            $D.setStyle(img[0].parentNode, 'backgroundRepeat', 'no-repeat');
            $D.setStyle(img[0].parentNode, 'backgroundImage', 'url('+img[0].src+')');
            img[0].src = '/assets/i/play.png';
            $D.setStyle(img[0], 'margin', '30px 40px 0 60px');
          };
        }
        if(videos.length) {
          $E.on(videos, 'click', function(e) {
            $E.stopEvent(e);
            HELLERAU.gallery(this.parentNode.parentNode, this, false);
          });
        }

      });

      $E.onAvailable('stage', function(e) {
        if($D.hasClass('content', 'performance')) {

          // create play button
          var vImgs = $D.getElementsByClassName('video', 'a', this),
              img, r;
          for (var i=0; i < vImgs.length; i++) {
            img = vImgs[i].getElementsByTagName('img')[0];
            $D.setStyle(vImgs[i], 'backgroundImage', 'url('+img.src+')');
            img.src = '/assets/i/play.png';
            $D.setStyle(img, 'margin', '126px 0 0 210px');
            $D.setStyle(img, 'width', 'auto');
            $D.setStyle(img, 'height', 'auto');
          };

          $E.on(this, 'click', function(e) {
            $E.stopEvent(e);
            var t = $E.getTarget(e);
            if(t.tagName.toLowerCase() == 'img') {
              HELLERAU.gallery(this, t.parentNode);
            } else if(t.tagName.toLowerCase() == 'a') {
              HELLERAU.gallery(this, t);
            } else {
              HELLERAU.gallery(this, t.getElementsByTagName('a')[0]);
            }
          });
        } else if($D.hasClass('contentarea', 'home')) {
          // Center images in the center by making them background images
          var imgs = this.getElementsByTagName('a'),
              img;
          for (var i=0; i < imgs.length; i++) {
            img = imgs[i].getElementsByTagName('img')[0];
            $D.setStyle(imgs[i], 'backgroundImage', 'url('+img.src+')');
            if($D.hasClass(imgs[i], 'video')) {
              img.src = '/assets/i/play.png';
              $D.setStyle(img, 'margin', '180px 0 0 282px');
            } else {
              $D.setStyle(img, 'display', 'none');
            }
          };
          $E.on(this, 'click', function(e) {
            $E.stopEvent(e);
            clearTimeout(carouselTimer);
            clearTimeout(carouselStartTimer);
            var t = $E.getTarget(e);
            if(t.tagName.toLowerCase() == 'img') {
              t = t.parentNode;
            }
            if(t.href && (t.href.slice(-3) == 'mp4' || t.href.slice(-3) == 'm4v')) {
              $D.setStyle($D.getFirstChild(t), 'display', 'none');
              insertVideo($D.getFirstChild(t), t.href, $D.getAttribute(t, 'data_ogv'), 645, 430);
            }
          });
        }
      });

      $E.onAvailable('today', function(e) {

        var xy = $D.getXY(this),
            els = $D.getChildren(this.parentNode),
            resultset = $('resultset');

        var wrap = document.createElement('div');
        for (var i=0; i < els.length; i++) {
          wrap.appendChild(els[i].cloneNode(true));
        };

        while (resultset.childNodes.length >= 1 ) {
          resultset.removeChild(resultset.firstChild);
        }

        wrap.id = 'resultset-wrap';
        resultset.appendChild(wrap);
        $D.setStyle(wrap, 'overflow', 'hidden');

        var pXy = $D.getXY(wrap),
            past = $D.getElementsByClassName('past', 'div', wrap);

        $D.setStyle('past', 'opacity', 0);
        $D.setStyle('past', 'cursor', 'pointer');
        $D.setStyle('past', 'display', 'block');
        var a1 = new YAHOO.util.Anim(past[0], { 
          marginTop: { to: (0-(xy[1]-pXy[1])) }}, 1, 
          YAHOO.util.Easing.easeBoth);
        var a2 = new YAHOO.util.Anim('past', { 
          opacity: { to: 1 }}, 1, 
          YAHOO.util.Easing.easeBoth);
        a2.animate();
        a1.animate();

        $E.on('past', 'click' , function(e) {
          var a1 = new YAHOO.util.Anim(this, { 
            opacity: { to: 0 }}, 1, 
            YAHOO.util.Easing.easeBoth);
          var a2 = new YAHOO.util.Anim(past[0], { 
            marginTop: { to: -30 }}, 1, 
            YAHOO.util.Easing.easeBoth);
          a2.animate();
          a1.animate();
          a1.onTween.subscribe(function(e) {
            if(this.currentFrame >= 900) {
              $D.setStyle(wrap, 'overflow', 'visible');
            }
          });
        });

      });

      $E.onAvailable('content', function(e) {

        if($D.hasClass(this, 'tv')) {
          HELLERAU.truncate(this.getElementsByTagName('span'));
          $D.setStyle(this.getElementsByTagName('li'), 'height', '100px');
        } else if($D.hasClass(this, 'on-tour')) {
          HELLERAU.truncate(this.getElementsByTagName('span'));
        } else if($D.hasClass(this, 'news')) {

          var plays = $D.getElementsByClassName('play', 'a', this),
              videos = $D.getElementsByClassName('video', 'a', this),
              img;

          var replace = function() {
            $D.setStyle(this.parentNode, 'position', 'relative');
            $D.setStyle(this.parentNode, 'backgroundPosition', 'top left');
            $D.setStyle(this.parentNode, 'backgroundRepeat', 'no-repeat');
            $D.setStyle(this.parentNode, 'backgroundImage', 'url('+this.src+')');
            $D.setStyle(this.parentNode, 'width', '143px');
            $D.setStyle(this.parentNode, 'height', '100px');
            $E.purgeElement(this);
            this.src = '/assets/i/play.png';
            $D.setStyle(this, 'width', 'auto');
            $D.setStyle(this, 'position', 'absolute');
            $D.setStyle(this, 'left', '37px');
            $D.setStyle(this, 'top', '10px');
          };

          if(plays.length) {
            for (var i=0; i < plays.length; i++) {
              img = plays[i].getElementsByTagName('img');

              if(!img[0]) {
                continue;
              }

              if(img[0].complete) {
                replace.apply(img[0]);
              } else {
                $E.on(img[0], 'load', replace);
              }

            };
          }
          if(videos.length) {
            $E.on(videos, 'click', function(e) {
              $E.stopEvent(e);
              HELLERAU.gallery(this.parentNode.parentNode, this, false);
            });
          }
        } else if($D.hasClass('contentarea', 'service')) {
          HELLERAU.autoQuaternary();
        }

        var links = this.getElementsByTagName('a'),
            videos = [];
        for (var i = 0; i < links.length; i++) {
          if(links[i].href.indexOf('vimeo') > 0 || links[i].href.indexOf('youtube') > 0) {
            videos.push(links[i]);
          }
        }
        if(videos.length) {
          for (i = 0; i < videos.length; i++) {
            if(videos[i].href.indexOf('vimeo') > 0) {
              var url = 'http://www.vimeo.com/api/oembed.json?url=' + encodeURIComponent(videos[i].href) + '&callback=inlineVimeoVideo&width=500';
              var js = document.createElement('script');
              js.setAttribute('type', 'text/javascript');
              js.setAttribute('src', url);
              document.getElementsByTagName('head').item(0).appendChild(js);
            } else {
              var iframe = document.createElement('iframe');
              iframe.width = 500;
              iframe.height = 350;
              iframe.frameborder = 0;
              $D.setStyle(iframe, 'border', 'none');
              var match = videos[i].href.match(/youtube.com\/.*v=([a-zA-Z0-9\-\_]+)/);
              iframe.src = 'http://www.youtube.com/embed/'+match[1];
              $D.insertBefore(iframe, videos[i]);
              videos[i].parentNode.removeChild(videos[i]);
            }
          }
        }

        $E.on(document.getElementsByTagName('a'), 'click', function(e) {
          var hostname = window.location.hostname;
          hostname = hostname.replace("www.","").toLowerCase();
          var href = this.href;
          if (href.indexOf("http://") != -1 
            && href.indexOf(hostname) == -1) {
            $E.stopEvent(e);
            window.open(href);
          }
        });

      });

      $E.onAvailable('stage-nav', function(e) {
        if($('stage-total').innerHTML != '01') {
          $D.setStyle(this, 'display', 'block');
          $E.on(this, 'click', function(e) {
            var imgs = $('stage').getElementsByTagName('a'),
                spans, n, img,
                t = $E.getTarget(e);
            for (var i = 0; i < imgs.length; i++) {
              if($D.getStyle(imgs[i], 'display') == 'block' && $D.hasClass(t, 'next')) {
                $D.setStyle(imgs, 'display', 'none');
                if(imgs[i+1]) {
                  $D.setStyle(imgs[i+1], 'display', 'block');
                  $('stage-pos').innerHTML = i+2;
                } else {
                  $D.setStyle(imgs[0], 'display', 'block');
                  $('stage-pos').innerHTML = '1';
                }
                break;
              } else if($D.getStyle(imgs[i], 'display') == 'block' && $D.hasClass(t, 'prev')) {
                $D.setStyle(imgs, 'display', 'none');
                if(i > 0 && imgs[i-1]) {
                  $D.setStyle(imgs[i-1], 'display', 'block');
                  $('stage-pos').innerHTML = i;
                } else {
                  $D.setStyle(imgs[imgs.length-1], 'display', 'block');
                  $('stage-pos').innerHTML = imgs.length;
                }
                break;
              }
            }
            if($('stage-pos').innerHTML.length == 1) {
              $('stage-pos').innerHTML = '0'+$('stage-pos').innerHTML;
            }
          });
        } else {
          $D.setStyle('stage', 'marginBottom', '20px');
        }
      });

      $E.onAvailable('primary', function(e) {
        var lis = this.getElementsByTagName('li'),
            primary = this;
        $E.on(lis, 'click', function(e) {
          if(YAHOO.env.ua.ie && YAHOO.env.ua.ie < 8 ) {
            var t = $E.getTarget(e).getElementsByTagName('a')[0];
            window.location = t.href;
          }
        });
        $E.on(lis, 'mouseover', function(e) {
          primary.className = '';
          $D.addClass(primary, this.id);
          if($D.hasClass(this, 'selected')) {
            $D.addClass(primary, 'selected');
          }
        });
        $E.on(lis, 'mouseout', function(e) {
          var selected = $D.getElementsByClassName('selected', 'li', primary);
          primary.className = '';
          if(selected.length == 1) {
            $D.addClass(primary, 'selected');
            $D.addClass(primary, selected[0].id);
          }
        });
      });

      $E.onAvailable('video-gallery', function(e) {
        var lis = this.getElementsByTagName('li'),
            img = new Image,
            iC;
        img.src = '/assets/i/play.png';
        $D.setStyle(img, 'display', 'block');
        $D.setStyle(img, 'position', 'absolute');
        $D.setStyle(img, 'left', '18px');
        $D.setStyle(img, 'top', '-5px');
        $D.setStyle(img, 'cursor', 'pointer');
        $D.setStyle(lis, 'position', 'relative');
        for (var i=0; i < lis.length; i++) {
          iC = img.cloneNode(true);
          lis[i].appendChild(iC);
        };
        $E.on(this, 'click', function(e) {
          $E.stopEvent(e);
          var t = $E.getTarget(e);
          if(t.tagName.toLowerCase() == 'li') {
            HELLERAU.gallery(this, t.getElementsByTagName('a')[0]);
          } else {
            HELLERAU.gallery(this, $D.getAncestorByTagName(t, 'li').getElementsByTagName('a')[0]);
          }
        });
      });

      $E.onAvailable('gallery', function(e) {
        // create play button
        var vImgs = $D.getElementsByClassName('video', 'a', this),
            img, r;
        for (var i=0; i < vImgs.length; i++) {
          img = vImgs[i].getElementsByTagName('img')[0];
          $D.setStyle(vImgs[i], 'backgroundImage', 'url('+img.src+')');
          $D.setStyle(vImgs[i], 'height', '100px');
          $D.setStyle(vImgs[i], 'display', 'block');
          img.src = '/assets/i/play.png';
          $D.setStyle(img, 'margin', '10px 0 0 52px');
        };

        $E.on(this, 'click', function(e) {
          $E.stopEvent(e);
          var t = $E.getTarget(e);
          if(t.tagName.toLowerCase() == 'img') {
            HELLERAU.gallery(this, t.parentNode);
          } else if(t.tagName.toLowerCase() == 'a') {
            HELLERAU.gallery(this, t);
          } else {
            HELLERAU.gallery(this, t.getElementsByTagName('a')[0]);
          }
        });
      });

      $E.onAvailable('qt-warning', function() {
        if(isQTInstalled()) {
          $D.setStyle(this, 'display', 'none');
        }
      });

      $E.onAvailable('house-1', function() {
        if(isQTInstalled()) {
          var house1 = new QTObject(this.src.slice(0, -3)+'mov', this.id, "500", "359");
          var id = $D.generateId(this.parentNode);
          house1.write(id);
        }
      });

      $E.onAvailable('house-2', function() {
        if(isQTInstalled()) {
          var house1 = new QTObject(this.src.slice(0, -3)+'mov', this.id, "500", "359");
          var id = $D.generateId(this.parentNode);
          house1.write(id);
        }
      });

      $E.onAvailable('house-3', function() {
        if(isQTInstalled()) {
          var house1 = new QTObject(this.src.slice(0, -3)+'mov', this.id, "500", "359");
          var id = $D.generateId(this.parentNode);
          house1.write(id);
        }
      });

      $E.onAvailable('house-4', function() {
        var house1 = new QTObject(this.src.slice(0, -3)+'mov', this.id, "500", "359");
        var id = $D.generateId(this.parentNode);
        house1.write(id);
      });

    }
  };

}();

YAHOO.util.Event.onDOMReady(HELLERAU.init);

