(function($) {                                          // Compliant with jquery.noConflict()
$.fn.moja_karuzelka = function(o) {
    o = $.extend({
        btnUp: null,
        btnDown: null,
        speed: 10,
		pozycja_klasa: 'pozycja_',
		autostart: 500,
		predkosc_zmiany: 1000,
		przes_x: 280,
		przes_y: 360,
		reszta_y: 0,
		polkula: 'R'
    }, o || {});
    return this.each(function() {                           // Returns the element collection. Chainable.

        var running = false;
        var allow = true;
		var parent_allow = false;
		var kierunek = 'dol';
		var auto_kierunek = 'gora';
		var old_predkosc_zmiany = o.predkosc_zmiany;
		var div = $(this);
		var start = 0;
		var aktywny,nr_active;
		var manualprzesuw = false;
		
		if(o.btnUp) {
            $(o.btnUp).mouseover(function() {
				parent_allow = true;
				o.autostart = false;
				manualprzesuw=setInterval(function() {
					go('dol');
				},10);
            });
            $(o.btnUp).mouseout(function() {
				clearInterval(manualprzesuw);
				manualprzesuw = false;
				parent_allow = false;
            });
		}

        if(o.btnDown) {
            $(o.btnDown).mouseover(function() {
				parent_allow = true;
				o.autostart = false;
				manualprzesuw=setInterval(function() {
					go('gora');
				},10);
            });
            $(o.btnDown).mouseout(function() {
				clearInterval(manualprzesuw);
				manualprzesuw = false;
				parent_allow = false;
            });
		}

        function go(to) {
            if(!running) {
				if (allow==false && parent_allow==false)
					return false;
				if (o.autostart!=false){
					clearInterval(autoprzesuw);
				}
				aktywny=jQuery("."+o.pozycja_klasa+'3',div);
				klasy=jQuery(aktywny).attr("class").split(" ");
				if (to=='dol'){
					if (jQuery(aktywny).hasClass('item_nr_0')){
						return;
					}	
				} else {
					suma=jQuery('[class*=item_nr_]', div).length;
					if (jQuery(aktywny).hasClass('item_nr_'+(suma-1))){
						return;
					}
				}
				for (iter in klasy){
					if (klasy[iter].substring(0,8)=='item_nr_'){
						nr_active=parseInt(klasy[iter].substring(8));
						break;
					}
				}
				start=Math.floor(-parseInt(jQuery(aktywny).css("top"))/10);
                running = true;
				kierunek = to;
				if (kierunek=='dol'){
					jQuery(o.btnDown).removeClass('disabled');
					jQuery("."+o.pozycja_klasa+'6',div).removeClass(o.pozycja_klasa+'6');
				} else {
					jQuery(o.btnUp).removeClass('disabled');
					jQuery("."+o.pozycja_klasa+'0',div).removeClass(o.pozycja_klasa+'0');					
				}
				timer=setInterval(function() {
					przesun();
				},o.speed);
            }
            return false;
        };
		
		function przesun(){
			for (i=0;i<7;i++)
				przesun_element(i);
			if (kierunek=='dol'){
				koniec=Math.floor(-parseInt(jQuery("."+o.pozycja_klasa+"2",div).css("top"))/10);
				if (koniec<=start){
					koncz_animacje();
				}
			} else {
				koniec=Math.floor(-parseInt(jQuery("."+o.pozycja_klasa+"4",div).css("top"))/10);
				if (koniec>=start){
					koncz_animacje();
				}
			}	
            return false;	
		};
		
		function przypisz_nowe_zmienne(){
			if (kierunek=='dol'){
				for(iter=6; iter>=0; iter--){
					numer=(nr_active+iter-4);
					if (numer>=0){
						element=jQuery('.item_nr_'+numer,div).removeClass(o.pozycja_klasa+(iter-1)).addClass(o.pozycja_klasa+iter);
					}
				}
			} else {
				for(iter=1; iter<=7; iter++){
					numer=(nr_active+iter-3);
					if (numer>=0){
						element=jQuery('.item_nr_'+numer,div).removeClass(o.pozycja_klasa+iter).addClass(o.pozycja_klasa+(iter-1));
					}
				}
			}
			return false;
		}
		
		function sprawdz_strzalki(){
			ponad=jQuery("."+o.pozycja_klasa+'2',div).length;
			if (ponad<1){
				jQuery(o.btnUp).addClass('disabled');
				if (manualprzesuw!=false) {
					clearInterval(manualprzesuw);
					manualprzesuw = false;
					parent_allow = false;
					allow = false;
				}
				auto_kierunek='gora';
			}
			ponizej=jQuery("."+o.pozycja_klasa+'4',div).length;
			if (ponizej<1){
				jQuery(o.btnDown).addClass('disabled');
				if (manualprzesuw!=false) {
					clearInterval(manualprzesuw);
					manualprzesuw = false;
					parent_allow = false;
					allow = false;
				}
				auto_kierunek='dol';
			}
		}
		
		function koncz_animacje(){
			clearInterval(timer);
			przypisz_nowe_zmienne();
			sprawdz_strzalki();
			running = false;
			ustaw_autoprzesuw(o.predkosc_zmiany);
			return false;
		}
		
		function ustaw_autoprzesuw(predkosc){
			if (o.autostart!=false){
				jQuery(div).mouseover(function() {
					allow = false;
				});
				jQuery(div).mouseout(function() {
					allow = true;
				});
				autoprzesuw=setInterval(function() {
					go(auto_kierunek);
				},predkosc);
			}
		}
		
		function przesun_element(element){
			y=Math.floor(-parseInt(jQuery("."+o.pozycja_klasa+element,div).css("top")));
			
			if (kierunek=='dol'){
				if (element==1 || element==4) {
					przesun_val=7;
				} else if (element== 2 || element==3) { 
					przesun_val=11;
				} else {
					przesun_val=6;
				}
				y=y-przesun_val;
			} else {
				if (element==2 || element==5) {
					przesun_val=7;
				} else if (element==3 || element==4) { 
					przesun_val=11;
				} else {
					przesun_val=6;
				}
				y=y+przesun_val;
			}
			
			// rownanie kola: (x+112)^2+(y+180)^2=212^2
			// x^2+224x+y^2+360y=0
			
			// nowe rownanie: (x+140)^2+...=225^2
			// x^2+280x+y^2+360y=0
			
			// obliczenia
			w_wolny=(Math.pow(y,2)+o.przes_y*y+o.reszta_y);
			//delta=50176-(4*w_wolny);
			delta=Math.pow(o.przes_x,2)-(4*w_wolny);
			p_delta=Math.sqrt(delta);
			//x=((-224+p_delta)/2);
			if (o.polkula=='R'){
				x=((-o.przes_x+p_delta)/2);
			} else {
				x=((-o.przes_x-p_delta)/2);
			}
			if (isNaN(x)){
				if (o.polkula=='R'){
					x=-100;
				} else {
					x=180;
				}
			}
			
			// przesuniecie
			d_top=Math.floor((-y));
			d_left=Math.floor(x);
			
			if (o.polkula=='R'){
				if (d_left<-80)
					d_left=(-110);
			} else {
				if (d_left>180)
					d_left=210;
			}
			
			//	alert('zmienne: '+y+' '+x+' '+w_wolny+' '+delta+' '+p_delta+' '+x+' '+d_left);
			jQuery("."+o.pozycja_klasa+element,div).css("top", d_top+"px").css("left", d_left+"px");
            return false;
		}
		
		ustaw_autoprzesuw(o.autostart);
    });
};
})(jQuery);
