/**
 * external plugin definitions
 */
/*!
 * jQuery Tools v1.2.5 - The missing UI library for the Web
 * 
 * rangeinput/rangeinput.js
 * 
 * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
 * 
 * http://flowplayer.org/tools/
 * 
 */
/**
 * provide a html5 sliding rangeinput field
 */
(function(a){a.tools=a.tools||{version:"v1.2.5"};var b;b=a.tools.rangeinput={conf:{min:0,max:100,step:"any",steps:0,value:0,precision:undefined,vertical:0,keyboard:!0,progress:!1,speed:100,css:{input:"range",slider:"slider",progress:"progress",handle:"handle"}}};var c,d;a.fn.drag=function(b){document.ondragstart=function(){return!1},b=a.extend({x:!0,y:!0,drag:!0},b),c=c||a(document).bind("mousedown mouseup",function(e){var f=a(e.target);if(e.type=="mousedown"&&f.data("drag")){var g=f.position(),h=e.pageX-g.left,i=e.pageY-g.top,j=!0;c.bind("mousemove.drag",function(a){var c=a.pageX-h,e=a.pageY-i,g={};b.x&&(g.left=c),b.y&&(g.top=e),j&&(f.trigger("dragStart"),j=!1),b.drag&&f.css(g),f.trigger("drag",[e,c]),d=f}),e.preventDefault()}else try{d&&d.trigger("dragEnd")}finally{c.unbind("mousemove.drag"),d=null}});return this.data("drag",!0)};function e(a,b){var c=Math.pow(10,b);return Math.round(a*c)/c}function f(a,b){var c=parseInt(a.css(b),10);if(c)return c;var d=a[0].currentStyle;return d&&d.width&&parseInt(d.width,10)}function g(a){var b=a.data("events");return b&&b.onSlide}function h(b,c){var d=this,h=c.css,i=a("<div><div/><a href='#'/></div>").data("rangeinput",d),j,k,l,m,n;b.before(i);var o=i.addClass(h.slider).find("a").addClass(h.handle),p=i.find("div").addClass(h.progress);a.each("min,max,step,value".split(","),function(a,d){var e=b.attr(d);parseFloat(e)&&(c[d]=parseFloat(e,10))});var q=c.max-c.min,r=c.step=="any"?0:c.step,s=c.precision;if(s===undefined)try{s=r.toString().split(".")[1].length}catch(t){s=0}if(b.attr("type")=="range"){var u=a("<input/>");a.each("class,disabled,id,maxlength,name,readonly,required,size,style,tabindex,title,value".split(","),function(a,c){u.attr(c,b.attr(c))}),u.val(c.value),b.replaceWith(u),b=u}b.addClass(h.input);var v=a(d).add(b),w=!0;function x(a,f,g,h){g===undefined?g=f/m*q:h&&(g-=c.min),r&&(g=Math.round(g/r)*r);if(f===undefined||r)f=g*m/q;if(isNaN(g))return d;f=Math.max(0,Math.min(f,m)),g=f/m*q;if(h||!j)g+=c.min;j&&(h?f=m-f:g=c.max-g),g=e(g,s);var i=a.type=="click";if(w&&k!==undefined&&!i){a.type="onSlide",v.trigger(a,[g,f]);if(a.isDefaultPrevented())return d}var l=i?c.speed:0,t=i?function(){a.type="change",v.trigger(a,[g])}:null;j?(o.animate({top:f},l,t),c.progress&&p.animate({height:m-f+o.width()/2},l)):(o.animate({left:f},l,t),c.progress&&p.animate({width:f+o.width()/2},l)),k=g,n=f,b.val(g);return d}a.extend(d,{getValue:function(){return k},setValue:function(b,c){y();return x(c||a.Event("api"),undefined,b,!0)},getConf:function(){return c},getProgress:function(){return p},getHandle:function(){return o},getInput:function(){return b},step:function(b,e){e=e||a.Event();var f=c.step=="any"?1:c.step;d.setValue(k+f*(b||1),e)},stepUp:function(a){return d.step(a||1)},stepDown:function(a){return d.step(-a||-1)}}),a.each("onSlide,change".split(","),function(b,e){a.isFunction(c[e])&&a(d).bind(e,c[e]),d[e]=function(b){b&&a(d).bind(e,b);return d}}),o.drag({drag:!1}).bind("dragStart",function(){y(),w=g(a(d))||g(b)}).bind("drag",function(a,c,d){if(b.is(":disabled"))return!1;x(a,j?c:d)}).bind("dragEnd",function(a){a.isDefaultPrevented()||(a.type="change",v.trigger(a,[k]))}).click(function(a){return a.preventDefault()}),i.click(function(a){if(b.is(":disabled")||a.target==o[0])return a.preventDefault();y();var c=o.width()/2;x(a,j?m-l-c+a.pageY:a.pageX-l-c)}),c.keyboard&&b.keydown(function(c){if(!b.attr("readonly")){var e=c.keyCode,f=a([75,76,38,33,39]).index(e)!=-1,g=a([74,72,40,34,37]).index(e)!=-1;if((f||g)&&!(c.shiftKey||c.altKey||c.ctrlKey)){f?d.step(e==33?10:1,c):g&&d.step(e==34?-10:-1,c);return c.preventDefault()}}}),b.blur(function(b){var c=a(this).val();c!==k&&d.setValue(c,b)}),a.extend(b[0],{stepUp:d.stepUp,stepDown:d.stepDown});function y(){j=c.vertical||f(i,"height")>f(i,"width"),j?(m=f(i,"height")-f(o,"height"),l=i.offset().top+m):(m=f(i,"width")-f(o,"width"),l=i.offset().left)}function z(){y(),d.setValue(c.value!==undefined?c.value:c.min)}z(),m||a(window).load(z)}a.expr[":"].range=function(b){var c=b.getAttribute("type");return c&&c=="range"||a(b).filter("input").data("rangeinput")},a.fn.rangeinput=function(c){if(this.data("rangeinput"))return this;c=a.extend(!0,{},b.conf,c);var d;this.each(function(){var b=new h(a(this),a.extend(!0,{},c)),e=b.getInput().data("rangeinput",b);d=d?d.add(e):e});return d?d:this}})(jQuery);

/**
 * custom plugin definitions
 */
(function($) {

  /**
   * init a simple coverflow effect to allow using of transparent pngs. it works
   * without opacity handling to avoid transparency bugs on IE 6-8 because an
   * animation on the opacity filter used by IE will lead to black color of all
   * semi transparent areas
   */
  $.fn.ppmCoverflow = function(options) {
  
    var settings = $.extend({
      btnNext: 'a.next', // external controls - optional
      btnPrev: 'a.prev', // external controls - optional
      itemHeight: null, // height of each item - 
      itemSelector: 'ul:first > li', // used items to build the coverflow - optional
      itemWidth: null, // width of each item
      maxZindex: 100, // maximum z-index of each item - optional
      scalingFactors: null, // factor of scaling of each item - optional
      speed: 500, // time in millisecond for animation - optional
      visibleItems: 5 // number of visible items on teh coverflow - optional
    }, options);
    
    var _this = $(this);
    
    var _items, _cssObjects = {}, _left, _scalingFactors = {};  
    
    initCoverflow();
    
    function initCoverflow() {
      initControls();
      initList();
      setScalingFactors();
      initCss();
      initTracking();
    }
    
    function initControls() {
      if ($(settings.btnNext).length) {
        $(settings.btnNext).click(function() {
          changeView(1, true);
          return false;
        });
      }
      if ($(settings.btnPrev).length) {
        $(settings.btnPrev).click(function() {
          changeView(1, false);
          return false;
        });
      }
    }
    
    function initCss() {
      var obj = {};
      obj.position = 'absolute';
      if (settings.itemHeight) {
        obj.height = settings.itemHeight + 'px';
      }
      if (settings.itemWidth) {
        obj.width = settings.itemWidth + 'px';
      }
      _items.each(function(index) {
        obj = $.extend(obj, initCssObjects(this, index));
        $(this).css(obj);
      });
    }
    
    /**
     * initialize the list of moveable items, it clones the first and last item
     * and insert the cloned items around the initial dom for movement functionality
     */
    function initList() {
      _items = $(settings.itemSelector, _this);
    }

    function initCssObjects(item, index) {
      var center, obj = {}, left, scaling = _scalingFactors[index], width,
          middle = Math.ceil(settings.visibleItems / 2);
      obj.fontSize = parseInt(_this.css('font-size')) * scaling + 'px';
      obj.height = settings.itemHeight * scaling;
      obj.top = (settings.itemHeight * (1 - scaling) / 2) + 'px';
      obj.zIndex = settings.maxZindex - index;
      center = _this.width() / 2;
      width = settings.itemWidth * scaling;
      if (0 == index) {
        _left = (_this.width() - settings.itemWidth) / 2;
      } else if (index < middle) {
        _left += settings.itemWidth * scaling;
      } else if (index == middle) {
        left = parseInt(_cssObjects[index - 1].left);
        _left = center - Math.abs(center - left) - width;
        obj.zIndex = obj.zIndex - middle;
      } else if (index == settings.visibleItems - 1) {
        left = parseInt(_cssObjects[1].left);
        _left = center - Math.abs(center - left) - width;
      } else if (index > middle) {
        left = parseInt(_cssObjects[settings.visibleItems - index].left);
        _left = center - Math.abs(center - left) - width;
        obj.zIndex = _cssObjects[index - 1].zIndex + 1;
      }
      obj.width = width + 'px';
      obj.left = _left + 'px';
      _cssObjects[index] = $.extend(_cssObjects[index], obj);
      return obj;
    }
    
    function initTracking() {
      // WiredMinds - Teaser Tracking - Clicks for items
      $("a.button, a.map").bind('click', function () {
        try {
          trackTeaser($(this), 1);
        } catch(e) {
          // wiredminds doesn't work
        }
      });
    }
    
    function setScalingFactors() {
      if (null != settings.scalingFactors) {
        _scalingFactors = settings.scalingFactors;
      } else {
        _scalingFactors = {
          0: 1,
          1: 0.75,
          2: 0.5,
          3: 0.5,
          4: 0.75
        };
      }
    }
    
    function changeView(step, direction) {
      var obj, tmp, tmpIndex, tmpObject = {}, tmpZindex;
      _items.each(function(index) {
        tmpZindex = false;
        if (direction) {
          tmpIndex = (0 == index) ? (settings.visibleItems - 1) : (index - 1);
          obj = _cssObjects[tmpIndex];
        } else {
          tmpIndex = ((settings.visibleItems - 1) == index) ? 0 : (index + 1);
          obj = _cssObjects[tmpIndex];
          if (parseInt(obj.left) < parseInt(_cssObjects[index].left)) tmpZindex = true;
        }
        tmpObject[index] = obj;
        tmp = {
          fontSize : obj.fontSize,
          width : obj.width,
          height : obj.height,
          left : obj.left,
          top : obj.top
        }
        moveItem(this, tmp, obj.zIndex, tmpZindex);
      });
      _cssObjects = tmpObject;
    }
    
    function moveItem(item, styleObj, zindex, changeZindex) {
      if (changeZindex) {
        $(item).css({
          zIndex : zindex - 10
        });
      }
      $(item).animate(styleObj, settings.speed, function() {
        $(this).css({
          zIndex : zindex
        });
      });
    }
    
  }

  /**
   * 
   */
  $.fn.contentTabs = function() {
    
    $(this).each(function(_index) {
      var _this = $(this);
      
      var _animation = false;
      
      var _contents = $('.contents > li', _this);
      var _controls = $('.controls > li', _this);
      
      var _activeContent = _contents.filter('.active');
      var _activeControl = _controls.filter('.active');
      
      _controls.each(function(index) {
        var _self = $(this);
        
        _self.click(function() {
          if (!_animation && !_self.hasClass('active')) {
            _animation = true;
            var nextContent = $(_contents.get(index));
            _activeContent.fadeOut(function() {
              _activeControl.removeClass('active');
              _self.addClass('active');
              _activeControl = _self;
              nextContent.fadeIn(function() {
                _activeContent = nextContent;
                _animation = false;
              });
            });
          }
          return false;
        });
      });
    })
    
  };

  /**
   * provide an effect like an airport display panel
   */
  $.fn.extend({
    /**
     * @param {array} array List of strings that will display in turn
     * @param {string} type Type of characters to use, options are 'all', 'text'
     *                      or 'numbers'
     * @param {boolean} single Use a single cycle or repeat the cycle
     * @param {function} callback Call a function on the end of the cycle
     */
    airport : function(array, type, single, callback) {

      var self = $(this);
      var chars;
      var chars1 = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', ' ', 'h', 'i', 'j', 'k',
          'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
          'z', '.', '-' ];
      var chars2 = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', '.', ' '];

      switch (type) {
        case 'all':
          chars = chars1 + chars2;
          break;
        case 'numbers':
          chars = chars2;
          break;
        case 'text':
        default:
          chars = chars1;
      }

      var longest = 0;
      var items = items2 = array.length;

      function pad(a, b) {
        return a + new Array(b - a.length + 1).join(' ');
      }

      $(this).empty();

      while (items--)
        if (array[items].length > longest)
          longest = array[items].length;

      while (items2--)
        array[items2] = pad(array[items2], longest);

      spans = longest;
      while (spans--)
        $(this).prepend("<span class='c" + spans + "'></span>");

      function testChar(a, b, c, d) {
        if (c >= array.length) {
          if (!single) {
            setTimeout(function() {
              testChar(0, 0, 0, 0);
            }, 1000);
          }
        } else if (d >= longest) {
          setTimeout(function() {
            testChar(0, 0, c + 1, 0);
          }, 1000);
          if (callback) {
            callback.call();
          }
        } else {
          $(self).find('.c' + a).html((chars[b] == " ") ? "&nbsp;" : chars[b]);
          setTimeout(function() {
            if (b > chars.length)
              testChar(a + 1, 0, c, d + 1);
            else if (chars[b] != array[c].substring(d, d + 1).toLowerCase())
              testChar(a, b + 1, c, d);
            else
              testChar(a + 1, 0, c, d + 1);
          }, 20);
        }
      }

      testChar(0, 0, 0, 0);
    }
  });
  
})(window.jQuery);

