// page init
$(function(){
  initCufon();
  initMapBox();
  initPopups();
  initSlideShow();
  hoverForIE6('.ul-class li, div.div-class, span , #box, ul#nav li');
});

// cufon init
function initCufon() {
  Cufon.replace('#menu li a', { fontFamily: 'Aller', hover: true });
  Cufon.replace('#content h1', { fontFamily: 'Aller-light' });
  Cufon.replace('#content h2', { fontFamily: 'Aller-light' });
  Cufon.replace('#content h3', { fontFamily: 'Aller-light' });
  Cufon.replace('#content h4', { fontFamily: 'Aller-light' });
  Cufon.replace('#sidebar .ad .item strong', { fontFamily: 'Aller'});
  Cufon.replace('.page .heading div strong', { fontFamily: 'Aller-light' });
  Cufon.replace('.popup .heading h2', { fontFamily: 'Aller-light' });
  Cufon.replace('.popup .description .btn-download a', { fontFamily: 'Aller', hover: true });
  Cufon.replace('.popup-map .description h2', { fontFamily: 'Aller-light' });
}

// slideshow init
function initSlideShow() {
  $('#slideshow').fadeGallery({
    slideElements:'ul.item-list > li',
    pagerLinks:'div.nav li',
    pauseOnHover:true,
    autoRotation:true,
    autoHeight:false,
    switchTime:5000,
    duration:300,
    event:'mouseenter'
  });
}

// hover for IE
function hoverForIE6(_list, _class) {
  var _hoverClass = 'hover';
  if(_class) _hoverClass = _class;
  if ($.browser.msie && $.browser.version < 7) {
    $(_list).hover(function() {
      $(this).addClass(_hoverClass);
    }, function() {
      $(this).removeClass(_hoverClass);
    });
  }
}

// map navigation function
function initMapBox() {
  var _activeClass = 'active';
  var _animSpeed = 300;

  $('div.map-box').each(function(){
    var _holder = $(this);
    var _mbText = _holder.find('>div.text:eq(0)').show();
    var _mbNav = _holder.find('>div.popup-nav').hide();
    var _mbSlides = _holder.find('>div.popup-map').hide();
    var _switchers = _holder.find('ul.switcher-list');

    var _lastHolder;
    var _currentIndex = 0;

    // map control
    _switchers.each(function(){
        
      var _switcher = $(this);
      var _targetID = _switcher.attr('title');
      var _slidesHolder = $('#'+_targetID);      
      $(this).removeAttr('title');      
      if(_slidesHolder.length) {      
        _slidesHolder.children().hide();
        var _links = _switcher.children();
        _links.each(function(_ind){
          $(this).click(function(){
            _lastHolder = _slidesHolder;
            _currentIndex = _ind;
            switchSlide();
            return false;
          });
        });
      }
    });

    // animation function
    function switchSlide() {
      _mbText.hide();
      _mbNav.show();
      _mbSlides.show();      
      _lastHolder.siblings().children().hide().removeClass(_activeClass);
      _lastHolder.children().removeClass(_activeClass).hide().eq(_currentIndex).addClass(_activeClass).show();    
    }

    // steps navigation
    var _navHome = _mbNav.find('a.link');
    var _navBack = _mbNav.find('a.prev');
    var _navNext = _mbNav.find('a.next');

    // back to home
    _navHome.click(function(){
      _mbNav.hide();
      _mbSlides.hide();
      _mbText.show();
      return false;
    });
    _navBack.click(function(){
      if(_currentIndex > 0) {           
        _currentIndex--;
        switchSlide();
      }
      return false;
    });
    _navNext.click(function(){
      if(_currentIndex < _lastHolder.children().length-1) {      
        _currentIndex++;
        switchSlide();
      }
      return false;
    });

  });
}

// popups function
function initPopups() {
  var _zIndex = 1000;
  var _fadeSpeed = 350;
  var _faderOpacity = 0.85;
  var _faderBackground = '#000';
  var _faderId = 'lightbox-overlay';
  var _closeLink = 'a.close, a.btn-close, a.cancel';
  var _fader;
  var _lightbox = null;
  var _ajaxClass = 'ajax-load';
  var _openers = $('a.open-popup');
  var _page = $('body > div:eq(0)');
  var _minWidth = _page.outerWidth();
  var _scroll = false;     

  // init popup fader
  _fader = $('#'+_faderId);
  if(!_fader.length) {
    _fader = $('<div />');
    _fader.attr('id',_faderId);
    $('body').append(_fader);
  }
  _fader.css({
    opacity:_faderOpacity,
    backgroundColor:_faderBackground,
    position:'absolute',
    overflow:'hidden',
    display:'none',
    top:0,
    left:0,
    zIndex:_zIndex
  });

  // IE6 iframe fix
  if(jQuery.browser.msie && jQuery.browser.version < 7) {
    if(!_fader.children().length) {
      var _frame = jQuery('<iframe src="javascript:false" frameborder="0" scrolling="no" />');
      _frame.css({
        opacity:0,
        width:'100%',
        height:'100%'
      })
      _fader.empty().append(_frame);
    }
  }

  // lightbox positioning function
  function positionLightbox() {
    if(_lightbox) {
      var _windowHeight = $(window).height();
      var _windowWidth = $(window).width();
      var _lightboxWidth = _lightbox.outerWidth();
      var _lightboxHeight = _lightbox.outerHeight();
      var _pageHeight = _page.outerHeight(true);

      if (_windowWidth < _minWidth) _fader.css('width',_minWidth);
        else _fader.css('width','100%');
      if (_windowHeight < _pageHeight) _fader.css('height',_pageHeight);
        else _fader.css('height', _windowHeight + 1000);

      _lightbox.css({
        position:'absolute',
        zIndex:(_zIndex+1)
      });

      // vertical position
      if (_windowHeight > _lightboxHeight) {
        if ($.browser.msie && $.browser.version < 7) {
          _lightbox.css({
            position:'absolute',
            top: parseInt($(window).scrollTop()) + (_windowHeight - _lightboxHeight) / 2
          });
        } else {
          _lightbox.css({
            position:'fixed',
            top: (_windowHeight - _lightboxHeight) / 2
          });
        }
      } else {
        var _faderHeight = _fader.height();
        if(_faderHeight < _lightboxHeight) _fader.css('height',_lightboxHeight);
        if (!_scroll) {
          if (_faderHeight - _lightboxHeight > parseInt($(window).scrollTop())) {
            _faderHeight = parseInt($(window).scrollTop())
            _scroll = _faderHeight;
          } else {
            _scroll = _faderHeight - _lightboxHeight;
          }
        }
        _lightbox.css({
          position:'absolute',
          top: _scroll
        });
      }

      // horizontal position
      if (_fader.width() > _lightbox.outerWidth()) _lightbox.css({left:(_fader.width() - _lightbox.outerWidth()) / 2});
      else _lightbox.css({left: 0});
    }
  }

  // show/hide lightbox
  function toggleState(_state) {
    if(!_lightbox) return;
    if(_state) {
      _fader.fadeIn(_fadeSpeed,function(){
        _lightbox.fadeIn(_fadeSpeed);
      });
      _scroll = false;
      positionLightbox();
    } else {
      _lightbox.fadeOut(_fadeSpeed,function(){
        _fader.fadeOut(_fadeSpeed);
        _scroll = false;
      });
    }
  }

  // popup actions
  function initPopupActions(_obj) {
    if(!_obj.get(0).jsInit) {
      _obj.get(0).jsInit = true;
      // close link
      _obj.find(_closeLink).click(function(){
        _lightbox = _obj;
        toggleState(false);
        return false;
      });
    }
  }

  // lightbox openers
  _openers.each(function(){
    var _opener = $(this);
    var _target = _opener.attr('href');

    // popup load type - ajax or static
    if(_opener.hasClass(_ajaxClass)) {
      _opener.click(function(){
        // ajax load
        if($('div[rel*="'+_target+'"]').length == 0) {
          $.ajax({
            url: _target,
            type: "POST",
            dataType: "html",
            success: function(msg){
              // append loaded popup
              _lightbox = $(msg);
              _lightbox.find('img').load(positionLightbox)
              _lightbox.attr('rel',_target).hide().css({
                position:'absolute',
                zIndex:(_zIndex+1),
                top: -9999,
                left: -9999
              });
              $('body').append(_lightbox);

              // init js for lightbox
              initPopupActions(_lightbox);

              // show lightbox
              toggleState(true);
            },
            error: function(msg){
              alert('AJAX error!');
              return false;
            }
          });
        } else {
          _lightbox = jQuery('div[rel*="'+_target+'"]');
          toggleState(true);
        }
        return false;
      });
    } else {
      if($(_target).length) {
        // init actions for popup
        var _popup = $(_target);
        initPopupActions(_popup);
          // open popup
          _opener.click(function(){
          if(_lightbox) {
            _lightbox.fadeOut(_fadeSpeed,function(){
              _lightbox = _popup.hide();
              toggleState(true);
            })
          } else {
            _lightbox = _popup.hide();
            toggleState(true);
          }
          return false;
        });
      }
    }
  });

  // event handlers
  $(window).resize(function(){
    positionLightbox();
  })
  $(window).scroll(function(){
    positionLightbox();
  })
  $(document).keydown(function (e) {
    if (!e) evt = window.event;
    if (e.keyCode == 27) {
      toggleState(false);
    }
  })
  _fader.click(function(){
    if(!_fader.is(':animated')) toggleState(false);
    return false;
  })
}

// slideshow plugin
jQuery.fn.fadeGallery = function(_options){
  var _options = jQuery.extend({
    slideElements:'div.slideset > div',
    pagerLinks:'div.pager a',
    btnNext:'a.next',
    btnPrev:'a.prev',
    btnPlayPause:'a.play-pause',
    btnPlay:'a.play',
    btnPause:'a.pause',
    pausedClass:'paused',
    disabledClass: 'disabled',
    playClass:'playing',
    activeClass:'active',
    currentNum:false,
    allNum:false,
    startSlide:null,
    noCircle:false,
    pauseOnHover:true,
    autoRotation:false,
    autoHeight:false,
    onChange:false,
    switchTime:3000,
    duration:650,
    event:'click'
  },_options);

  return this.each(function(){
    // gallery options
    var _this = jQuery(this);
    var _slides = jQuery(_options.slideElements, _this);
    var _pagerLinks = jQuery(_options.pagerLinks, _this);
    var _btnPrev = jQuery(_options.btnPrev, _this);
    var _btnNext = jQuery(_options.btnNext, _this);
    var _btnPlayPause = jQuery(_options.btnPlayPause, _this);
    var _btnPause = jQuery(_options.btnPause, _this);
    var _btnPlay = jQuery(_options.btnPlay, _this);
    var _pauseOnHover = _options.pauseOnHover;
    var _autoRotation = _options.autoRotation;
    var _activeClass = _options.activeClass;
    var _disabledClass = _options.disabledClass;
    var _pausedClass = _options.pausedClass;
    var _playClass = _options.playClass;
    var _autoHeight = _options.autoHeight;
    var _duration = _options.duration;
    var _switchTime = _options.switchTime;
    var _controlEvent = _options.event;
    var _currentNum = (_options.currentNum ? jQuery(_options.currentNum, _this) : false);
    var _allNum = (_options.allNum ? jQuery(_options.allNum, _this) : false);
    var _startSlide = _options.startSlide;
    var _noCycle = _options.noCircle;
    var _onChange = _options.onChange;

    // gallery init
    var _hover = false;
    var _prevIndex = 0;
    var _currentIndex = 0;
    var _slideCount = _slides.length;
    var _timer;
    if(!_slideCount) return;

    _prevIndex = _slides.index(_slides.filter('.'+_activeClass));
    if(_prevIndex < 0) _prevIndex = _currentIndex = 0;
    else _currentIndex = _prevIndex;
    if(_startSlide != null) {
      if(_startSlide == 'random') _prevIndex = _currentIndex = Math.floor(Math.random()*_slideCount);
      else _prevIndex = _currentIndex = parseInt(_startSlide);
    }

    //_slides.hide().eq(_currentIndex).show();
    _slides.show().css({opacity:0}).eq(_currentIndex).css({opacity:1});


    if(_autoRotation) _this.removeClass(_pausedClass).addClass(_playClass);
    else _this.removeClass(_playClass).addClass(_pausedClass);

    // gallery control
    if(_btnPrev.length) {
      _btnPrev.bind(_controlEvent,function(){
        prevSlide();
        return false;
      });
    }
    if(_btnNext.length) {
      _btnNext.bind(_controlEvent,function(){
        nextSlide();
        return false;
      });
    }
    if(_pagerLinks.length) {
      _pagerLinks.each(function(_ind){
        jQuery(this).bind(_controlEvent,function(){
          if(_currentIndex != _ind) {
            _prevIndex = _currentIndex;
            _currentIndex = _ind;
            switchSlide();
          }
          return false;
        });
      });
    }

    // play pause section
    if(_btnPlayPause.length) {
      _btnPlayPause.bind(_controlEvent,function(){
        if(_this.hasClass(_pausedClass)) {
          _this.removeClass(_pausedClass).addClass(_playClass);
          _autoRotation = true;
          autoSlide();
        } else {
          _autoRotation = false;
          if(_timer) clearTimeout(_timer);
          _this.removeClass(_playClass).addClass(_pausedClass);
        }
        return false;
      });
    }
    if(_btnPlay.length) {
      _btnPlay.bind(_controlEvent,function(){
        _this.removeClass(_pausedClass).addClass(_playClass);
        _autoRotation = true;
        autoSlide();
        return false;
      });
    }
    if(_btnPause.length) {
      _btnPause.bind(_controlEvent,function(){
        _autoRotation = false;
        if(_timer) clearTimeout(_timer);
        _this.removeClass(_playClass).addClass(_pausedClass);
        return false;
      });
    }

    // gallery animation
    function prevSlide() {
      _prevIndex = _currentIndex;
      if(_currentIndex > 0) _currentIndex--;
      else {
        if(_noCycle) return;
        else _currentIndex = _slideCount-1;
      }
      switchSlide();
    }
    function nextSlide() {
      _prevIndex = _currentIndex;
      if(_currentIndex < _slideCount-1) _currentIndex++;
      else {
        if(_noCycle) return;
        else _currentIndex = 0;
      }
      switchSlide();
    }
    function refreshStatus() {
      if(_pagerLinks.length) _pagerLinks.removeClass(_activeClass).eq(_currentIndex).addClass(_activeClass);
      if(_currentNum) _currentNum.text(_currentIndex+1);
      if(_allNum) _allNum.text(_slideCount);
      _slides.eq(_prevIndex).removeClass(_activeClass);
      _slides.eq(_currentIndex).addClass(_activeClass);
      if(_noCycle) {
        if(_btnPrev.length) {
          if(_currentIndex == 0) _btnPrev.addClass(_disabledClass);
          else _btnPrev.removeClass(_disabledClass);
        }
        if(_btnNext.length) {
          if(_currentIndex == _slideCount-1) _btnNext.addClass(_disabledClass);
          else _btnNext.removeClass(_disabledClass);
        }
      }
      if(typeof _onChange === 'function') {
        _onChange(_this, _currentIndex);
      }
    }
    function switchSlide() {
      _slides.eq(_prevIndex).animate({opacity:0},{duration:_duration,queue:false});
      _slides.eq(_currentIndex).animate({opacity:1},{duration:_duration,queue:false});
      if(_autoHeight) _slides.eq(_currentIndex).parent().animate({height:_slides.eq(_currentIndex).outerHeight(true)},{duration:_duration,queue:false});
      refreshStatus();
      autoSlide();
    }

    // autoslide function
    function autoSlide() {
      if(!_autoRotation || _hover) return;
      if(_timer) clearTimeout(_timer);
      _timer = setTimeout(nextSlide,_switchTime+_duration);
    }
    if(_pauseOnHover) {
      _this.hover(function(){
        _hover = true;
        if(_timer) clearTimeout(_timer);
      },function(){
        _hover = false;
        autoSlide();
      });
    }
    refreshStatus();
    autoSlide();
  });
}
