jQuery.fn.ARDscrollabletabs = function(triggerTime){
  triggerTime = triggerTime || 500;

  //ARD.de
  var modulCounter=0;
  var tabNumber=0;
  //ARD.de -- Ende

  return this.each(function(index) {

    var ulholderIndex = index+1;

    var html = jQuery('<div class="ulholder ulholderIndex'+ulholderIndex+'"> \
      <ul class="navigation"> \
      </ul> \
    </div> \
    <a href="#" class="scrollButtons left"><span>Left</span></a> \
    <a href="#" class="scrollButtons right"><span>Right</span></a>');

    var navigation = html.find(".navigation");

    var _this = jQuery(this);
    var active = 0;
    var positions = [];
    var lastPosition = 0;
    var widths = [];

    
    var children = _this.children().each(function(tab_index) {
      
      var _this = jQuery(this);
      if(tab_index != 0) { _this.hide(); }
      var li = jQuery('<li><a class="'+(tab_index == 0 ? 'selected' : '')+'">'+_this.find(".ard-scrollable-tabs-title").html()+"</a>");
      navigation.append(li);

      
      //ARD.de
      if(tab_index==0) {
          modulCounter++;
          tabNumber=1;
         
      } else {
          tabNumber++;
      }

      jQuery(".nummer"+modulCounter).empty();
      jQuery(".nummer"+modulCounter).append("1/"+tabNumber);
       //ARD.de -- Ende

    }).wrapAll("<div class='ard-scrollable-tabs-content'></div>");
    _this.prepend(html);
    
    
    var positions = [];
    var lastPosition = 0;
    var lis = navigation.find("li").each(function(nav_index) {
      
      var width = jQuery(this).width();
      var obj = {
        index: nav_index,
        width: width,
        right: lastPosition + width,
        left: lastPosition
      };
      
      lastPosition += obj.width;
      positions.push(obj);
      
      jQuery(this).click(function() {
        if(maxWidth > 330) {
            moveInToView(obj.left, obj.right);
         }
        jQuery(children[active]).fadeOut();
        jQuery(children[nav_index]).fadeIn();
        active = nav_index;
        navigation.find(".selected").removeClass("selected");
        jQuery(this).find("a").addClass("selected");

        
        
        //ARD.de
        var tab_index = nav_index+1;
        var modul_index = index+1;
        var tab_number = navigation.find("li").length;

        

        jQuery(".nummer"+modul_index).empty();
        jQuery(".nummer"+modul_index).append(tab_index + "/"+tab_number);

        //IVW-Pixel
        var ivw_url = jQuery("#ivwPixel").attr("src");

        if(typeof ivw_url!="undefined") {
            var new_ivw_url = gseaIvwPixelUrl(ivw_url);
            jQuery("#ivwPixel").attr("src", new_ivw_url);
        }

        //GSEA-Pixel
        var gsea_url = jQuery("#gseaPixel").attr("src");

        if(typeof gsea_url!="undefined") {
            var new_gsea_url = gseaIvwPixelUrl(gsea_url);
            jQuery("#gseaPixel").attr("src", new_gsea_url);
        }

        //Etracker
        var etracker_url = jQuery("#etrackerPixel").attr("src");

        if(typeof etracker_url!="undefined") {            
            var etPagnameTemp1 = etracker_url.match(/et_pagename=(.*)&et_url=/gi);
            var etPagnameTemp2 = etPagnameTemp1.toString().replace(/^et_pagename=/, "");
            var etPagname = etPagnameTemp2.toString().replace(/&et_url=$/, "");
            var new_etPagname = "";
            if(etPagname.toString().indexOf("Infokasten/") === 0) {
                new_etPagname = etPagname;
            } else {
                new_etPagname = "Infokasten/"+etPagname;
            }
            
            var newEtrackerSrc = etracker_url.replace(/et_pagename=(.*)&et_url=/gi, "et_pagename="+new_etPagname+"&et_url=");
            jQuery("#etrackerPixel").attr("src", newEtrackerSrc);
        }
        //ARD.de -- Ende

        handleButtons(navigation.parent().width());
      });
      
    });

    function gseaIvwPixelUrl(src) {
       var pParamTemp1 = src.match(/p=(.*)&i=/gi);
       var pParamTemp2 = pParamTemp1.toString().replace(/^p=/, "");
       var pParam = pParamTemp2.toString().replace(/&i=$/, "");
       var new_p_param = pParam.replace("%2Findex.html", "%2FInfokasten%2Findex.html");
       var newSrc = src.replace(/p=(.*)&i=/gi, "p="+new_p_param+"&i=");

       return newSrc;
    }
    
    var maxWidth = positions[positions.length-1].right;
    var frameWidth = navigation.parent().width();

    navigation.width(jQuery.browser.mozilla ? maxWidth + 5 : maxWidth);
    
    var animate = function() {
      navigation.animate({
        marginLeft: currentLeft
      }, triggerTime, "linear");
    };
    
    var currentLeft = 0;
    var currentRight = frameWidth;
    
    var moveInToView = function(left, right) {
      var changed = false;
      
      if(right > currentRight) {
        currentLeft = - (right - frameWidth);
        currentRight = right;
        changed = true;
      } else if (left < Math.abs(currentLeft)) {
        currentLeft = - left;
        currentRight = left + frameWidth;
        changed = true;
      }
      
      if(changed) {
        animate();
      }
    };
    
    var between = function(one, between, another) {
      return one <= between && between <= another;
    };
    
    var findCurrent = function(position) {
      for (var i=0; i < positions.length; i++) {
        var pos = positions[i];
        if(between(pos.left, position, pos.right)) {
          break;
        }
      };
      return pos;
    };
    
    var inFrame = function(obj) {
      return obj.right <= currentRight && Math.abs(currentLeft) <= obj.left;
    };

    var findCurrentInFrame = function(position, direction) {
      var current = findCurrent(position);
      if(!inFrame(current)) {
        var inView = false;
        
        while (inView == false) {
          inView = inFrame(current = positions[current.index - direction]);
        };
      }
      
      return current;
      
    };

    var handleButtons = function() {

      //ARD.de
      if(maxWidth <= 330) {
          left.hide();
          right.hide();
          var modul_index = index+1;
          jQuery(".nummer"+modul_index).hide();
          jQuery(".ulholderIndex"+ulholderIndex).width(330);

      } else {
      //ARD.de -- Ende
          if(currentLeft == 0 && active == 0) {
            left.addClass("inactive");
          } else {
            left.removeClass("inactive");
          }

          if(currentRight == positions[positions.length-1].right || active == positions.length-1) {
            right.addClass("inactive");
          } else {
            right.removeClass("inactive");
          }
      //ARD.de
      }
      //ARD.de -- Ende
     
      
    };
    
    var delayedTriggers = function(element, nextHandler) {
      var fired = false;
      var fireing = false;
      var interval;
      
      element.bind("mousedown", function(){
        fired = false;
        
        interval = setInterval(function(){
          if(!fired) {
            fireing = true;
            element.trigger("ard.scroll");
          } else {
            clearInterval(interval);
          }
        }, triggerTime);
        
      });
      
      element.bind("mouseup", function() {
        fired = true;
        if(fireing){
          element.trigger("ard.scroll");
          clearInterval(interval);
          fireing = false;
        } else {
          nextHandler();
        }
      });
      
      element.click(function() {
        return false;
      });
    };
    
    var right = _this.find("a.right");
    var left = _this.find("a.left");
    
    var nextTrigger = function() {
      var act = active+1;
      if(act >= positions.length) {
        var current = positions[active];
        moveInToView(current.left, current.right);
        handleButtons();
      } else lis.eq(act).trigger("click");
    };
    
    right.bind("ard.scroll", function() {
      var current = findCurrentInFrame(currentRight, 1);
      var next = positions[current.index + 1];
      
      if(next) {
        moveInToView(next.left, next.right);
        handleButtons();        
      }
    });
    
    
    var previousTrigger = function() {
      
      var act = active-1;
      if(act < 0) {
        var current = positions[active];
        moveInToView(current.left, current.right);
        handleButtons();
      } else lis.eq(act).trigger("click");
    };
    
    left.bind("ard.scroll", function() {
      var current = findCurrentInFrame(Math.abs(currentLeft), -1);
      var next = positions[current.index - 1];
      
      if(next) {
        moveInToView(next.left, next.right);
        handleButtons();
      }
    });
    
    delayedTriggers(right, nextTrigger);
    delayedTriggers(left, previousTrigger);
    
    handleButtons();

  });
};

jQuery(function() {
  jQuery(".ard-scrollable-tabs").ARDscrollabletabs();
});