
(function($){  
 $.fn.efCarousel = function( options ) {        
     return this.each(function() {  
            var efcID = $(this).attr("id");
            var efcInstance = $(this);                 
            //Preklady z EdgeTranslations / nacist ajaxem z externiho zdroje!              
            efcInstance.ID = efcID;    
            //Nastaveni catalogu
            defaultOptions = {
                selected    :  1,   //poradi defaultne vybranyho boxu
                smallWidth  : 75,   //minimalni sirka nahledu boxu
                smallHeight  : 110, //minimalni vyska nahledu boxu                
                largeWidth  : 135,  //maximalni sirka nahledu boxu
                largeHeight  : 223, //maximalni vyska nahledu boxu
                minDistance : 0,   //minimalni vzdalenost kurzoru od boxu (=100% velikosti)
                maxDistance : 150,  //maximalni vzdalenost kurzoru od boxu (=0% velikosti)
                outerBoxDistanceOffset: 10, //hranice pro vraceni boxu do defaultniho (nejmensiho) stavu,
                outerBoxDefaults: $(efcInstance).parent().offset(), //rozmery rodicovskyho kontejneru
                outerBoxWidthDefault: 0, 
                outerBoxHeight: 253, //defaultni vyska kontejneru
                imgHolder: ($.browser.msie ? "img" : "img") //pokud je browser IE pak je png ulozeno ve SPAN jinak v IMG
            }
            efcInstance.options = $.extend(defaultOptions,options);      
            $.fn.efCarousel.initialize( efcInstance );
                      
        });      
  };  
   
 $.extend($.fn.efCarousel, {
        initialize: function (e) { 
            //pocet obrazku v poli         
           e.options.elementsLength = $("li",e).length;
           //defaultni vyska obrazku
           e.options.largeHeight = 223;//$("img:first",e).height();
            //sirka a vyska kontejneru                    
                           
           e.options.outerBoxWidthDefault = $(e).width();                
           e.options.outerBoxHeight = e.options.largeHeight;    
           
          // $(e).show("slow");
          $( e.options.imgHolder, e).css({"width": e.options.smallWidth,"height": e.options.smallHeight});
          $("li", e).css("float","left");
          $(e).css({"display":"none","position":"absolute","height":"100px","list-style":"none", "border":"0px solid blue"});
          $(e).show();
          $(e).after("<div id=\"dbg\" style=\"color: white; top: 230px; position: absolute; font-size: 12px; background-color: black; font-weight: bolder;\"></div>");
          
           
            //hlavni kontejner                 
         // $(e).wrap("<div id=\""+ e.ID +"_container\"></div>");                                                                
           /*$("#"+e.ID+"_container").css({"position" : "absolute",                                                                              
                            "border": "0px solid yellow"                            
                            });*/
         /*                                
           //dbg                       
           $("#"+ e.ID +"_container").after("<div id=\"dbg\" style=\"color: white; top: 230px; position: absolute; font-size: 12px; background-color: black; font-weight: bolder;\"></div>");
           
            //nastaveni                      
           $("li",e).css({                    
                    "display":"block",
                    "border":"0px solid green",
                    "float": "left",
                    "padding-left": "3px"
                    });
            */
            $("li",e).append("<br/><span class=\"efCarouselArrow\" style=\"display:none; border:0px solid red;position:relative; bottom: 0px; left:50%\"><img src=\"/public/images/theme/arrow.gif\"></span>");                         
                    
            if ( e.options.selected == -1 ) {
                    var defObj =  $("li",e).eq(1);                
                    var elLI = defObj;
                    var dimensions = $(defObj).offset();
                    var left = dimensions.left + ($(defObj).width()/2);
                    var top =  dimensions.top + ($(defObj).height()/2);
                    fakeMouse = {
                        pageX: left,
                        pageY: top
                                }    
                    }
               
            $("li",e).each(function (i) {         
                    if (i == e.options.selected) {
                                 $("span[class=\"efCarouselArrow\"]",$(this).parent()).css("display","none"); 
                                 $("span:last",this).css("display","inline");
                                 var elLI = this;
                                 var dimensions = $(this).offset();
                                 var left = dimensions.left + ($(this).width()/2);
                                 var top =  dimensions.top + ($(this).height()/2);
                                 fakeMouse = {
                                    pageX: left,
                                    pageY: top
                                 }    
                    }                      
                     $(this).mouseover(function() {
                                e.options.selected = i; 
                                // $("span[class=\"efCarouselArrow\"]",$(this).parent()).css("display","none"); 
                               //$("span:last",this).css("display","inline");                                                              
                                                                                            
                            });
                    });
                    
            
          // alert(fakeMouse.pageX + " " + fakeMouse.pageY);
           $.fn.efCarousel.calculateHoverIn(e,fakeMouse, true);
          
          $().mousemove( function(de) {
                $.fn.efCarousel.calculateHoverIn(e, de, false);                          
           });      
        },       
        calculateHoverIn: function (e, de, override) {
            var output = '';
            var newWidth = 0;
            var elDistance = 0;
            var newHeight = 0;
            
            
            var boxDistance  = $.fn.efCarousel.calculateDistanceToEdge(e, de);
            if (boxDistance < 0 || override) {
            
            $("li",e).each(function (i) {
               var elDistanceObject = $.fn.efCarousel.calculateLiDistance(e, this, de);              
               elDistance += elDistanceObject.percent;
             //  output = output + " el"+i+":"+ elDistanceObject.percent;
               var liDimension = $.fn.efCarousel.calculateSize(e, this, de, elDistanceObject, i); 
               newWidth += liDimension.width;
               if (liDimension.height > newHeight) newHeight = liDimension.height;             
            });
            
            var newPosition = $.fn.efCarousel.calculatePosition(e, newWidth);
            $(e).css("width",(newWidth+30)+"px");
            $(e).css("height",(newHeight)+"px");
                           
              //     output = output + "<br>dist: "  +distance.percent + "dist: "  +distance.pixels + " width: "+ tmp;                                                  
            //});            
           
            
           // output = "elDistance:"+boxDistance+" <br>boxDistance:"+ elDistance + " <br>s:"+ e.options.selected + " " +de.pageX + " " + de.pageY + output;
            //output = "Vzdalenost od elementu: <br>"+newHeight;
            
          // $("#dbg").html(output);
           }
           // if (boxDistance >= e.options.maxDistance) {
            //    $.fn.efCarousel.calculateHoverOut(e, de, e.options.selected, boxDistance);
            //} else{                
           	                    
            //} */
        },
         calculateHoverOut: function (e, de, selected, boxDistance) {
            var absBoxDistance = boxDistance - e.options.maxDistance;   
            if (absBoxDistance > e.options.outerBoxDistanceOffset) absBoxDistance = e.options.outerBoxDistanceOffset;
            var perBoxDistance =  (100*absBoxDistance)/ e.options.outerBoxDistanceOffset;                
          var output = '';
            var newWidth = 0;
            $("li",e).each(function (i) {
               var dimensions =  $(this).offset();
               //var rdistance = $.fn.efCarousel.calculateLiDistance(e, this, de);    
               selDistance = Math.abs(i - e.options.selected);
               perDistance = 1/((selDistance*2)+1)*100;    
               perDistance = (perDistance*perBoxDistance)/100;           
               newWidth +=  $.fn.efCarousel.calculateSize(e, this, {}, {percent:perDistance}, i);
                output = output + "<br>dist: "  + perDistance + "<br> perBoxDistance: "+ perBoxDistance;
            });            
            output += "<br>"+(absBoxDistance) + " " + perDistance;
            var newPosition = $.fn.efCarousel.calculatePosition(e, newWidth);           
           //  $("#dbg").html(output);                                                                                      
        },         
        calculateCenter: function (el) {
            var dimensions = $(el).offset();
            center = {
                x : Math.round( dimensions.left  + ($(el).width() / 2)),
                y : Math.round(dimensions.top + ($(el).height() / 2)) + 50
            }
            return center;
        },
        calculateDistance: function (e, el, de) {                       
            var center = $.fn.efCarousel.calculateCenter(el);            
            /*var xdist = Math.round(de.pageX - center.x);
            var ydist = Math.round(de.pageY - center.y);
            var distance = Math.round(Math.sqrt( (xdist*xdist) + (ydist * ydist) ));*/            
            var distance = Math.abs(de.pageX - center.x);                        
            return distance;
        },
        calculateLiDistance: function (e, el, de) {           
            var distance =  $.fn.efCarousel.calculateDistance(e, el, de);;
            var distanceR = distance;
            if (distance < e.options.minDistance) distanceR = e.options.minDistance;
            if (distance > e.options.maxDistance) distanceR = e.options.maxDistance;     
            var realDistance = e.options.maxDistance - distanceR;
            var diDif = e.options.maxDistance - e.options.minDistance;            
            var percentDistance = Math.round((100 / diDif) * realDistance);
            return { pixels : distance, percent : percentDistance };
        },
        calculateSize: function (e, el, de, distance, i) {                                                
            var newWidth  = Math.round(distance.percent / 100 * (e.options.largeWidth -  e.options.smallWidth)) +  e.options.smallWidth;            
            var newHeight = Math.round((distance.percent / 100) * (e.options.largeHeight -  e.options.smallHeight)) +  e.options.smallHeight;
            var output = i + ": " + distance.percent + " " + e.options.largeHeight + " " +  e.options.smallHeight + " " +  e.options.smallHeight + "<br>";
            //var output = newWidth + " " + newHeight + "<br>";
              // $("#dbg").append(output);
            var newArrowHeight = Math.round((distance.percent / 100) * (24 -  12)) +  12;
            var paddingTop = Math.round(e.options.largeHeight/2) - Math.round(newWidth) +20;           
            $(e.options.imgHolder+":first",el).css("margin-top",paddingTop + "px");                        
            $(e.options.imgHolder+":first",el).css({"width":newWidth+"px", "height":newHeight+"px"});
                                                                                                              
            $("img:last",el).attr({"height": newArrowHeight+"px"});                    
            $("img:last",el).parent().css("bottom",($("img:last",el).height()*1.4) + "px");  
                                                                                       
            return {width:$(e.options.imgHolder,el).width(),height:($(e.options.imgHolder,el).height()+paddingTop)};
        },
        calculatePosition: function(e, width) {     
            var defaultleft = Math.round(e.options.outerBoxWidthDefault/2)+110;
            var offset = Math.round(width / 2);                     
           $(e).css("left",(defaultleft-offset) + "px");        
           // $(e).parent().css("width", width+30 + "px");                     
        },
        calculateDistanceToEdge: function(el, de) {
            var output = "";
            var hyp;
            var dim = el.offset();
            var mouseX = de.pageX;
            var mouseY = de.pageY;            
            target = {
                        x : dim.left + (el.width() / 2),
                        y : dim.top + (el.height() / 2),
                        height:  el.height(),
                        width:  el.width()
                      }  
            //the value to substract from the mouse/MC distance                 
            var spotX = target.x-mouseX;
            var spotY = target.y-mouseY;
            var mouseangle =  Math.atan2(target.y-mouseY, target.x-mouseX);
            var mouseanglecompare = mouseangle/(Math.PI/180);         
            var ratio = Math.atan2(target.height, target.width);     
            var ratiocompare = ratio/(Math.PI/180);         
            if( (mouseanglecompare<ratiocompare) && (mouseanglecompare>ratiocompare*-1) )   {
                    hyp = target.width/2 / Math.cos(mouseangle);         
                } else 
                if( (mouseanglecompare>Math.abs(ratiocompare-180)) && (mouseanglecompare<180)  ){         
                    hyp = target.width/2 / Math.cos(mouseangle);         }     
                else
                if( (mouseanglecompare<ratiocompare-180) && (mouseanglecompare>-180)   ){ 
                    hyp = target.width/2 / Math.cos(mouseangle);         }     
                else { 
                    hyp = target.height/2 / Math.sin(mouseangle); 
                }         
              var distance = Math.sqrt((spotX*spotX)+(spotY*spotY))-Math.abs(hyp); 

            output = de.pageX + ":" +de.pageY;
            output += "<br>x:" + target.x +"<br>y:" + target.y +"<br>w:" + target.width +"<br>h:" + target.height;
            output += " <br>distance: " + distance + "<br>";
          // $("#dbg").html(output);
          return distance;
           
        }
   
 });
    
})(jQuery);
