/**
 * Home page script
 *
 * @package script
 * @copyright 2011 IntecMedia (http://www.intecmedia.ru)
 * @author dkrnl, mordraug
 * @version SVN: $Id: scripts_home.js 5229 2011-12-07 07:19:45Z pyatkov $
 */
jQuery.easing.bounce = function(p, n, f, d) {
  var s = 1.70158;
  var c = f + d;
  if ((p/=0.5) < 1) {
    return c/2*(p*p*(((s*=(1.525))+1)*p - s)) + f;
  }
  else {
    return c/2*((p-=2)*p*(((s*=(1.525))+1)*p + s) + 2) + f;
  }
};
jQuery(function($) {
  // --
  /* home_works_slider_ */
  var $loader = $("#loader");
  var $hws = $("#home_works_slider");
  var $hws__hide = $("#hws__hide");
  var $hws__show = $("#hws__show");
  var $hws__slides_holder = $hws.find(".hws__slides_holder");
  var $hws__slides_inner = $hws.find(".hws__slides_inner");
  var $hws__prev = $("#hws__prev");
  var $hws__next = $("#hws__next");
  var $hws__slide = $hws.find(".hws__slide");
  var $hws__slides_inner_width = 120 * $hws__slide.size();
  var $hws__width;
  var $hv__slide_curr = $("#hv__slide_curr");
  var $hv__slide_next = $("#hv__slide_next");
  var $hv__slide_state = false;
  var $hv__slide_locker = false;
  var $hv__slide_direction = null;
  $("#hv__slide_curr img, #hv__slide_prev img").bind("load", function(){
     $(this).css('marginLeft', ($(window).width()-this.width)/2);
  });
  // check canvas
  var $hv__slide_canvas = document.createElement("canvas");
  $hv__slide_canvas = ($hv__slide_canvas && $.isFunction($hv__slide_canvas.getContext));
  // create canvas
  if ($hv__slide_canvas) {
    $hv__slide_curr.append("<canvas class=canvas>");
    $hv__slide_next.append("<canvas class=canvas>");
  } else if($.browser.msie) {
    $hv__slide_curr.append("<div class=canvas>");
    $hv__slide_next.append("<div class=canvas>");
  }  
  $hws__slides_inner.width($hws__slides_inner_width);
  /* resize canvas */
  $(window).resize(function() {
    $hws__width = $hws.width();
    if ($hv__slide_canvas || $.browser.msie) {
      var canvas = ($hv__slide_state ? $hv__slide_next : $hv__slide_curr).find(".canvas").get(0);
      if (canvas && canvas.style.display == "block") {
        hv__slide_draw(canvas);
      }
    }
    hv__slide_center();
  }).trigger("resize");
  /* resize canvas */

  /* center images */
  function hv__slide_center() {
    var img = $hv__slide_curr.find(".hv__full_image_center");
    if (img.size() > 0) {
      if (img.width() > 0) {
        img.css("marginLeft", ($hws__width - img.width())/2);
      } else {
        img.bind("load", function() {
          img.css("marginLeft", ($hws__width - img.width())/2);
        });
      }
    }
    var img = $hv__slide_next.find(".hv__full_image_center");
    if (img.size() > 0) {
      if (img.width() > 0) {
        img.css("marginLeft", ($hws__width - img.width())/2);
      } else {
        img.bind("load", function() {
          img.css("marginLeft", ($hws__width - img.width())/2);
        });
      }
    }
  }
  $(window).load(hv__slide_center);

  /* draw canvas */
  function hv__slide_draw(canvas) {
    if (canvas.image) {
      var scale = $hws__width / canvas.image.width;
      canvas.style.width = canvas.width = Math.ceil(canvas.image.width * scale);
      canvas.style.height = canvas.height = Math.ceil(canvas.image.height * scale);
      if ($hv__slide_canvas) { // webkit, gecko, opera, ie9?
        var context = canvas.getContext("2d");
        context.clearRect(0, 0, canvas.width, canvas.height);
        context.drawImage(canvas.image, 0, 0, canvas.image.width, canvas.image.height, 0, 0, canvas.width, canvas.height);
      } else if($.browser.msie) { // ie6, ie7, ie8, ie9?
        canvas.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + canvas.image.src + "', sizingMethod='scale')";
      }
    } else {
      canvas.style.display = "none";
    }
  }
  /* _draw canvas */

  /* fix ie opacity */
  $.fn.cssCustom = function(prop) {
    if ($.browser.msie) {
      prop.opacity = undefined;
    }
    return $(this).css(prop);
  }
  $.fn.animateCustom = function(prop, speed, easing, callback) {
    if ($.browser.msie) {
      prop.opacity = undefined;
    }
    return $(this).animate(prop, speed, easing, callback);
  };
  /* _fix ie opacity */

  /* move canvas */
  function hv__slide_move() {
    hv__slide_center();
    ($hv__slide_state ? $hv__slide_curr : $hv__slide_next).cssCustom({
      left: ($hv__slide_direction ? -$hws__width : $hws__width), 
      opacity: 0
    });
    if ($hv__slide_state) { // down -> up
      $hv__slide_curr.animateCustom({
        left: 0, 
        opacity: 1
      }, "normal", "linear");
      $hv__slide_next.animateCustom({
        left: ($hv__slide_direction ? $hws__width : -$hws__width), 
        opacity: 0
      }, "normal", "linear", function(){
        $hv__slide_curr.cssCustom({
          zIndex: 2, 
          left: 0, 
          opacity: 1
        });
        $hv__slide_next.cssCustom({
          zIndex: 1, 
          left: 0, 
          opacity: 1
        });
        $hv__slide_locker = false;
        $hv__slide_state = false;
      });
    }
    else { // up -> down
      $hv__slide_next.animateCustom({
        left: 0, 
        opacity: 1
      }, "normal", "linear");
      $hv__slide_curr.animateCustom({
        left: ($hv__slide_direction ? $hws__width : -$hws__width), 
        opacity: 0
      }, "normal", "linear", function(){
        $hv__slide_next.cssCustom({
          zIndex: 2, 
          left: 0, 
          opacity: 1
        });
        $hv__slide_curr.cssCustom({
          zIndex: 1, 
          left: 0, 
          opacity: 1
        });
        $hv__slide_locker = false;
        $hv__slide_state = true;
      });
    }
  }
  /* _move canvas */

  /* swap canvas */
  function hv__slide_swap(id) {
    var slide = window.hv_slides[id];
    if ($hv__slide_locker || !slide) {
      return;
    }
    $hv__slide_locker = true;
    // load data
    var current = ($hv__slide_state ? $hv__slide_curr : $hv__slide_next);
    current.attr("style", "background: " + (slide.background ? "url(" + slide.background + ") " : "") + slide.style + ";");
    current.find("a").attr("href", slide.url).attr("title", slide.title).html(slide.title);
    current.find("span").html(slide.published + " // " + slide.notice);
    // animate info
    current.find(".hv__slide_info").css({
      marginLeft: ($hv__slide_direction ? "-100%" : "100%"),
      display: "none"
    }).delay("slow").css({
      display: "block"
    }).animate({
      marginLeft: 0
    }, "normal", "bounce");
    // animate image
    var img = current.find("img");
    img.attr("class", slide.center ? "hv__full_image_center" : "hv__full_image_img");
    img.attr("src", slide.image).attr("alt", slide.title);
    if (($hv__slide_canvas || $.browser.msie) && !slide.center) {
      img.css("display", "none");
      var image = new Image;
      image.onload = function() {
        $loader.fadeOut("fast");
        var canvas = current.find(".canvas").get(0);
        canvas.style.display = "block";
        canvas.image = this;
        hv__slide_draw(canvas);
        hv__slide_move();
      }
      // prevent show loader
      setTimeout(function() {
        if (!image.complete) {
          $loader.fadeIn("fast");
        }
      }, 600);
      image.src = slide.image;
    } else {
      // hide canvas
      var canvas = current.find(".canvas").get(0);
      if (canvas) {
        canvas.image = null;
        canvas.style.display = "none";
      }
      // show image
      img.css("display", "block");
      hv__slide_move();
    }
  }
  /* _swap canvas */

  $hws__prev.mousemove(function(event) {
    event.stopImmediatePropagation();
  });

  $hws__prev.click(function() {
    if ($hv__slide_locker) {
      return false;
    }
    $hv__slide_direction = true;
    var prev = $hws__slide.siblings(".selected").prev();
    if (!prev.size()) prev = $($hws__slide.get(-1));
    if (prev.size()) prev.click();
    return false;
  });

  $hws__next.mousemove(function(event) {
    event.stopImmediatePropagation();
  });

  $hws__next.click(function() {
    if ($hv__slide_locker) {
      return false;
    }
    $hv__slide_direction = false;
    var next = $hws__slide.siblings(".selected").next();
    if (!next.size()) next = $($hws__slide.get(0));
    if (next.size()) next.click();
    return false;
  });

  $hws__slides_holder.mousemove(function(event) {
    var position;
    position = event.pageX * (($hws__width - $hws__slides_inner_width) / $hws__width);
    $hws__slides_inner.css({
      marginLeft: position
    });
  });

  $hws__slides_holder.css("opacity", 0);

  // switch to show
  $hws__show.click(function() {
    $hws__hide.stop().animate({
      marginTop: 0
    }, 150, "linear", function() {
      $hws__slides_holder.slideDown(250).animate({
        opacity: "1"
      }, 150);
    });
    return false;
  });

  // switch to hide
  $hws__hide.click(function() {
    $hws__hide.stop().animate({
      marginTop: -18
    }, 150, "linear", function() {
      $hws__slides_holder.animate({
        opacity: 0
      }, 150).slideUp(250);
    });
    return false;
  });

  // slides holder show controls on hover state
  $hws__slides_holder.hover(function() {
    $hws__prev.stop().animate({
      left: 0
    }, 150);
    $hws__next.stop().animate({
      left: -29
    }, 150);
  }, function() {
    $hws__prev.stop().animate({
      left: -29
    }, 150);
    $hws__next.stop().animate({
      left: 0
    }, 150);
  });

  // slide click
  $hws__slide.click(function() {
    var self = $(this);
    if ($hv__slide_locker) {
      return false;
    }
    if (self.is(".selected")) {
      return true;
    }
    $hws__slide.removeClass("selected");
    $hws__slide.stop();
    self.animate({
      opacity: 0.5
    }, 150, "linear", function() {
      self.animate({
        opacity: 1
      }, 200);
      self.addClass("selected");
    });
    hv__slide_swap(self.attr("rel"));
    document.location = "#slide-" + this.rel;
    return false;
  });

  if (document.location.hash.length > 1) {
    var slide = String(document.location.hash).match(/^#slide-(\d+)$/);
    if (slide && slide[1]) {
      slide = $hws__slide.filter("#slide-" + slide[1] + "_link");
      if (slide.size() && !slide.is(".selected")) {
        slide.click();
      }
    }
  }
  /* _home_works_slider */ 

  /* home_visuals_ */
  var $hv__prev = $("#hv__prev");
  var $hv__next = $("#hv__next");

  $hv__prev.click(function() {
    $hws__prev.click();
    return false;
  });

  $hv__next.click(function() {
    $hws__next.click();
    return false;
  });

  /* keyboard */
  $(document).keydown(function(event) {
    if (event.metaKey) {
      switch(event.which) {
        case 0x25:
          $hws__prev.click();
          return false;
        case 0x27:
          $hws__next.click();
          return false;
      }
    }
    return true;
  });
  /* _keyboard */
    
  /* fix hv__controls hover for IE_ */
  if ($.browser.msie) {
    $hv__prev.hover(function() {
      $hv__prev.addClass("hovered");
    }, function() {
      $hv__prev.removeClass("hovered");
    });
    $hv__next.hover(function() {
      $hv__next.addClass("hovered");
    }, function() {
      $hv__next.removeClass("hovered");
    });
  }
/* _fix hv__controls hover for IE_ */

/* _home_visuals */
});
