/*------------------------------------------------------------------
	jquery.plushDriver.js 2009/04/09 Daniel Schneider, info@hd7b.de
	this file is part of the youexpress-cms
	copyright (c) 2009 HD7B-MEDIEN www.hd7b.de
  ----------------------------------------------------------------*/

jQuery.fn.plushDriver = function(options) {
  var settings = jQuery.extend(
    {initDuration: 1, slideDuration: 1000, fadeDuration: 500, resizeDuration:250, styleDuration:500, contentMargin:30, align: 'center', initId: 1, elementWidth: 650},
    options
  );
  //color init for style change
  var styles=new Array();
  styles['btnOn']={backgroundPosition: "(0px -40px)"};
  styles['btnOn_em']={color: '#ffffff'};
  styles['btnOff']={backgroundPosition: "(0px 0px)"};
  styles['btnOff_em']={color: '#e2007a'};
  
  function slideAndLoad(objId, href){
    var targetObj=$('#'+objId);
    sliderObj.data('currentContent', targetObj);    
    var slideToPos=targetObj.prevAll().length;    
    var marginLeftValue=(-1)*(slideToPos)*(settings.elementWidth+settings.contentMargin); //align left => default    
    if(settings.align=='center') marginLeftValue+=($('body').width()-settings.elementWidth)/2; //align center    
    if(settings.align=='right') marginLeftValue+=($('body').width()-settings.elementWidth); //align right
    marginLeftValue=Math.round(marginLeftValue);
    // show loading if not loaded yet
  	if(targetObj.data('loaded')!='yes'){
      targetObj.css("opacity", 0.5);
      targetObj.find('.notLoaded').addClass("ajaxLoading");
    }
    sliderObj.animate(
      {marginLeft: marginLeftValue+'px'},
      settings.slideDuration,
      'jswing',
      function(){
        if(targetObj.data('loaded')!='yes') ajaxLoad(targetObj, href);
        else showContent(targetObj);
    		targetObj.siblings().css("opacity", 0.2); //update opacity on siblings
        $('html,body').animate({scrollTop: 0}, 500); //scroll window to top
    		var style=targetObj.attr('class').split(' ')[0];
    		sliderObj.data('currentStyle', style);
    		changeStyle();
      }
    );
  } 
  
  function ajaxLoad(targetObj, href){
    $.ajax({
  		method: "get", url: href, data: "method=ajax",
  		success: function(response){       
  	    targetObj.removeClass("ajaxLoading").html(response);
  		  initContentBtnBinding();
        targetObj.data('loaded', 'yes'); 
        showContent(targetObj);
        initGallery();
        initLightbox();
      }
    });
  }
  
  function showContent(targetObj){
	  targetObj.animate({ opacity: 1 }, settings.fadeDuration);  
  }
  
  function initContentBtnBinding(){ 
    sliderObj.data('currentContent')
    .find('.ajaxBtn')
    .add('.ajaxBtnImageSubnav')
    .add('.ajaxLink')
    .unbind("click").click(function(){
      var href=$(this).attr('href');
      var objId='slide_'+$(this).attr('rel');      
      sliderObj.data('hrefTarget', href);
      //slideAndLoad(objId, href);
      $.history.load($(this).attr('rel'));
      return false;
    });
  }
  
  function initNavBtnBinding(){ 
    $('#mainNav a')
    .css( {backgroundPosition: "0 0"} )
    .click(function(){
      var href=$(this).attr('href');
      var objId='slide_'+$(this).attr('rel');
      //slideAndLoad(objId, href);
      sliderObj.data('hrefTarget', href);
      dehiliteBtn(sliderObj.data('activeBtn'));
      hiliteBtn($(this));
      sliderObj.data('activeBtn', $(this));
      $.history.load($(this).attr('rel'));
      return false;
    })
    .mouseover(function(){
        hiliteBtn($(this));
    })
    .mouseout(
      function () {
        if(sliderObj.data('activeBtn').attr('rel')!=$(this).attr('rel')){
          dehiliteBtn($(this));
        }
      }    
    )
  }
  
  function hiliteBtn(btnObj){
    btnObj.stop(true).animate(styles['btnOn'], 200, 'easeOutSine').addClass('navBtnActive');
    btnObj.find("em").stop(true).animate(styles['btnOn_em'], 300);
  }
  
  function dehiliteBtn(btnObj){
    btnObj.stop(true).animate(styles["btnOff"], 200,  'easeInSine').removeClass("navBtnActive");
    btnObj.find("em").stop(true).animate(styles['btnOff_em'], 300); 
  }

  function changeStyle(){
    var style=sliderObj.data('currentStyle');
    var classToRemove="";
    var classToAdd="";
    if(style=='white'){
      classToRemove='blackStyle';
      classToAdd='whiteStyle';
    }
    else{
      classToRemove='whiteStyle'; 
      classToAdd='blackStyle';  
    }
    $('body').removeClass(classToRemove);
    $('body').addClass(classToAdd);
  }
  
  //handle window resize
  $(window).resize(function(){
    sliderObj.stop(true);
    var targetObj=sliderObj.data('currentContent');
    slideTo(targetObj, settings.resizeDuration);
  });
  
  //history
  function historyEvent(hash){
    var objId='';
    var href=sliderObj.data('hrefTarget');
    if(hash=='') objId='slide_'+settings.initId;
    else objId='slide_'+hash;
    if(href.length > 0){
      //button state
      $(".navBtn[rel='"+hash+"']").each(function(){
        $(".navBtn").each(function(){
          dehiliteBtn($(this));
        });
        hiliteBtn($(this));
      });
      slideAndLoad(objId, href);
    }
  }
  
  function slideTo(targetObj, slideSpeed){
    var slideToPos=targetObj.prevAll().length;
    var marginLeftValue=(-1)*(slideToPos)*(settings.elementWidth+settings.contentMargin); //align left => default    
    if(settings.align=='center') marginLeftValue+=($('#body').width()-settings.elementWidth)/2; //align center    
    if(settings.align=='right') marginLeftValue+=($('#body').width()-settings.elementWidth); //align right
    marginLeftValue=Math.round(marginLeftValue);    
    sliderObj.animate(
      {marginLeft: marginLeftValue+'px'},
      slideSpeed,
      'jswing',
      function(){
    		targetObj.siblings().css("opacity", 0.2); //update opacity on siblings
      }
    );
  }  
  
  //init   
  sliderObj=$(this);
  sliderObj.data('hrefTarget', '');
  var numScrollElements=sliderObj.children().length;
  var sliderWidth=numScrollElements*(settings.elementWidth+settings.contentMargin);
  sliderObj.children().css("marginRight", settings.contentMargin);
  sliderObj.css("width", sliderWidth);
  sliderObj.data('activeBtn', $('#btnActive'));
  sliderObj.data('currentContent', $('#slide_'+settings.initId));
  $('#slide_'+settings.initId).data('loaded', 'yes');  
  sliderObj.data('currentStyle', $('#slide_'+settings.initId).attr('class'));
  slideTo(sliderObj.data('currentContent'), settings.initDuration);
  initNavBtnBinding();
  initContentBtnBinding();
  //init states and style
  hiliteBtn($('#btnActive'));
  initGallery();
  changeStyle();
  initLightbox();
  //init history
  $.history.init(historyEvent); 
  
  function initLightbox(){
    sliderObj.data('currentContent').find('.lightbox').lightBox();
  }
 
  function initGallery(){
    //thumb click
    var currentContent=sliderObj.data('currentContent');    
    currentContent.find('.galleryThumb')
    .click(function(){
      //hide last active
      currentContent.find('.galleryThumbActive').each(
        function(){
          var imgHideId=$(this).attr('rel');
          currentContent.find('#'+imgHideId).css("display", "none");
          $(this).removeClass('galleryThumbActive');
        }
      );
      //show
      var imgId=$(this).attr('rel');
      currentContent.find('#'+imgId).fadeIn(1000);
      //addClass
      $(this).addClass('galleryThumbActive');
      return false;
    });   
    //init => click first Btn
    currentContent.find('.galleryThumb:first').trigger('click');
    //hover effect
    currentContent.find('.galleryView a')
    .mouseout(function(e){
			$("#galleryView_enlarge").css({display: "none"});  
    })
    .mousemove(function(e){
			var xPos=e.pageX+10;
			var yPos=e.pageY-20;			
			$("#galleryView_enlarge").css({left: xPos, top: yPos, display: "block"});
    });
  }
    
};
