


   
   
/**
 * jQuery jbasket
 * $('#img').jbasket({target:$('#basket')});
 * запускает #img в полет к target (например картинки товара к корзине) со скроллом окна
 * @param target - dom element обязательный параметр
 * 
 * @param flyElement - элемент который полетит, то есть возможно задать полет картинки 
      при клике на ссылке
 * @param flyOptions - параметры, которые будут переданы animate,
      к которым прилетит элемент  (по дефолту заданы left и top)
 * @param scrollOptions:{ targetScrollTop:0, targetScrollLeft:0 } - 
      параметры, к которым будет проскролено окно, по дефолту - позиция target
 * @param callback - функция, которая будет вызвана после полета, 
      например реагирование корзины
 *  
 * 
 * Copyright vipro 2010 http://vipro.ru
 * 
 * Licensed under the MIT licence:
 *   http://www.opensource.org/licenses/mit-license.php
 *
 * 
 * Tested in FF 3.6, IE 7, Chrome 6.0, Opera 9, Opera 10
 *
 */

 /**
   алгоритм работы:
   запоминаем позицию скролла
   скроллим к элементу, который будет летать
   клонируем, увеличиваем элемент
   скроллим к корзине во время анимации
   выполняем колбек после анимации
   скроллим обратно
 */
 
;(function($){
	
   var flag_fly = false;
   
   $.fn.jbasket = function ( options ){
      if(!flag_fly) {
         flag_fly = true;
         var params = {
            flyElement:null,
            flyOptions:null,
            target:null,
            callback:null,
            scrollOptions:{targetScrollTop:null,targetScrollLeft:null}
         }
         
         if( typeof options == 'object' ) {
            params = $.extend(params, options);
         }
         
         // запоминаем позицию скролла
         var windowScrollTop = $(window).scrollTop();
         var windowScrollLeft = $(window).scrollLeft();
         
         // что будет летать: или указанный элемент или текущий
         var $flyElement = params.flyElement || $(this);
         // куда будет улетать элемент
         var $target = $(params.target);
         
         // скроллим к элементу, который будет летать
         pageScrollFix({
            scrollTop:$flyElement.offset().top,
            scrollLeft:$flyElement.offset().left
         }, 400, function(){
            // после скролла к элементу, который будет летать
            var flyOptions = {
               top: $target.offset().top + ($target.height()/2), 
               left:$target.offset().left + ($target.width()/2)
            };
            // если расширение возможно
            if( typeof params.flyOptions == 'object' ) {
               flyOptions = $.extend( flyOptions, params.flyOptions );
            }
            
            // клонируем элемент и добавляем его в конец документа
            $fly = $flyElement.clone().css({
               position:'absolute',
				'z-index':'99999',
               top:$flyElement.offset().top, 
               left:$flyElement.offset().left
            });
            $('body').append( $fly );
            
            // скроллим к цели и запускаем полет, "понаехали!"
            $fly.animate({width:$fly.width()+20,height:$fly.height()+20},400,function(){
               pageScrollFix({
                  scrollTop: ( typeof params.scrollOptions.targetScrollTop !== 'undefined') ? 
                     params.scrollOptions.targetScrollTop : $target.offset().top
               }, 400);
            });
            $fly.animate(flyOptions,400,function(){
               $(this).remove(); 
               // вызов переданной пользовательской функции, возможно реагирование корзины
               if( typeof params.callback == 'function' ) {
                  params.callback();
               };
               // скролл к месту старта
               pageScrollFix({
                  scrollTop:windowScrollTop,
                  scrollLeft:windowScrollLeft
               }, 400, function(){
                  flag_fly = false;
               });
            });
         
         }); // 1-st animate complete
         
      } // flag
      
      return this;
	   
	};//jbasket
   
   // fix scroll for opera
   function pageScrollFix(params,duration,callback){
      // если точки находятся в видимой области экрана, то не скроллим
      if( params.scrollTop && params.scrollLeft ){
         if( ( params.scrollTop > $(window).scrollTop()
               && params.scrollTop < $(window).scrollTop() + $(window).height() )
            && ( params.scrollLeft > $(window).scrollLeft()
               && params.scrollLeft < $(window).scrollLeft() + $(window).width() ) 
         ) {
            if(typeof callback === 'function') {
               callback();
            }
            return;
         }
      }
      if($.browser.opera){
         $('html').animate(params,duration,callback);
      } else {
         $('html, body').animate(params,duration,callback);
      }
   }//pageScrollFix

})(jQuery);

function t() {
   if(window.console && window.console.trace) {
      console.trace('tt');
   }
}
