package {
    import classes.ImageLoader;
    
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.utils.clearInterval;
    import flash.utils.clearTimeout;
    import flash.utils.setInterval;
    
    import gs.TweenMax;
    
    [SWF(backgroundColor = 0xFFFFFF, frameRate='30', width='466', height='320')]

    public class index extends Sprite
    {  
        private var loader:Loader
//тесты для разного количества картинок, с четным количеством не работает        
//        private var imArray:Array = new Array('images/mald0.jpg', 'images/mald1.jpg', 'images/mald2.jpg');
//        private var imArray:Array = new Array('images/mald0.jpg', 'images/mald1.jpg', 'images/mald2.jpg', 'images/mald3.jpg', 'images/mald4.jpg'); 
//        private var imArray:Array = new Array('images/mald0.jpg', 'images/mald1.jpg', 'images/mald2.jpg', 'images/mald3.jpg', 'images/mald4.jpg', 'images/mald5.jpg', 'images/mald6.jpg');
        private var imArray:Array = new Array('images/mald0.jpg', 'images/mald1.jpg', 'images/mald2.jpg', 'images/mald3.jpg', 'images/mald4.jpg', 'images/mald5.jpg', 'images/mald6.jpg', 'images/mald7.jpg', 'images/mald8.jpg', 'images/mald9.jpg', 'images/mald10.jpg', 'images/mald11.jpg', 'images/mald12.jpg');
//        private var imArray:Array = new Array('images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg', 'images/mald6.jpg');
        private var imCollection:Array = new Array;
                
        private var posXArray:Array = new Array;
        private var posYArray:Array = new Array;
        private var scaleArray:Array = new Array;
        
        private var iWidth:Number;
        private var iHeight:Number;
        
        private var stageWidth:Number = 240;
        private var stageHeight:Number = 160;
        private var mainSprite:Sprite = new Sprite();
        
        private var intervalIndex:uint;
        private var intervalCount:int = 0;
        
        //флаг, чтобы карусель не раскручивалась
        private var goTurn:Boolean = false;
        
        public function index()
        {
            //начинаем со второго, так как размеры первой картинки уже добавили в stageWidth и stageHeight
            iWidth = 240;
            iHeight = 160;
            scaleArray.push(1);
            for(var i:int=0;i<imArray.length;i++)
            {
                var imObject:Object = new Object();
                imObject.imWidth = iWidth;
                imObject.imHeight = iHeight;
                imObject.posX = 0;
                imObject.posY = 5;
                imObject.scaleX = scaleArray[i]
                imObject.scaleY = scaleArray[i]
                imObject.url = imArray[i];
                imObject.displayImage = null;
                imObject.index = i;
                imCollection.push(imObject);
                
                 if(  (i%2 == 0) )
                {
                    stageWidth += (iWidth / 3);
                    iWidth = (iWidth / 1.5);
                    stageHeight += (iHeight / 1.5);
                    iHeight = (iHeight / 3);
                    var nScale:Number = scaleArray[i]/1.5;
                }
                scaleArray.push(nScale);
            }

            scaleArray.pop();
            imCollection.reverse();
            
            //определяем размеры спрайта, в котором будут находиться картинки
            mainSprite.graphics.beginFill(0XFFFFFF);
            mainSprite.graphics.lineStyle(2)
            mainSprite.graphics.drawRect(0, 0, stageWidth, stageHeight);
            mainSprite.graphics.endFill();
            addChild(mainSprite);    
            trace(stageWidth + ' - ' + stageHeight)
            var yy:Number = 5;
            var deltaX:int = 2;
            //изначальное расположение картинок
            for(i=0;i<imCollection.length;i++)
            {
                if( i%2 == 1 )
                {
                    imCollection[i].posX = (stageWidth/2) - (imCollection[i].imWidth) - deltaX;
                    imCollection[i].posY = yy;
                }else
                if( i%2 == 0 ) 
                {
                    imCollection[i].posX = (stageWidth/2) + deltaX;
                    yy = i*5 + 20; 
                    deltaX +=3;
                    imCollection[i].posY = yy;
                }

                if(i == imCollection.length-1)
                {
                    imCollection[i].posX = (stageWidth/2) - (imCollection[i].imWidth/2)
                    imCollection[i].posY = yy;
                }
                
                posXArray.push(imCollection[i].posX)
                posYArray.push(imCollection[i].posY)
                //загружаем картинки нашим ImageLoader
                var loader:ImageLoader = new ImageLoader(imCollection[i].url, 240, 160);
//                var loader:ImageLoader = new ImageLoader(imCollection[i].url, imCollection[i].imWidth, imCollection[i].imHeight);
                loader.x = imCollection[i].posX;
                loader.y = imCollection[i].posY;
                //добавляем событие на клик
                loader.addEventListener(MouseEvent.CLICK, loaderImClick);
                imCollection[i].displayImage = loader;
                //устанавливаем нужный scale
                loader.scaleX = imCollection[i].scaleX;
                loader.scaleY = imCollection[i].scaleY;
                mainSprite.addChild(loader);
            }
            //перевернем массив со scale
            scaleArray.reverse()
        }
        
        private function loaderImClick(event:MouseEvent):void
        {
            //trace(mainSprite.getChildIndex(mainSprite.getChildByName(event.currentTarget.name)));
            //текущий индекс
            var currentIndex:int = mainSprite.getChildIndex(mainSprite.getChildByName(event.currentTarget.name));
            
            //нажали на картинку не посередине, значит будем крутить
            if(currentIndex != imCollection.length-1)
            {
                if(currentIndex%2 == 0)
                {
                    //крутим по часовой стрелке 
                    //рассчитываем количество нужных прокрутов (на один больше, так как сначала будет запущена функция поворота, которая уменьшит индекс)
                    if(currentIndex < (imCollection.length-4) )
                        intervalCount = ((imCollection.length-1)/2) - (currentIndex/2);
                                    
                    if(currentIndex == 0)
                        intervalCount = ((imCollection.length-1)/2);
                                        
                    rightTurn();
                    if(intervalCount > 0 && goTurn == false)
                    {
                        goTurn = true;
                        intervalIndex = flash.utils.setInterval(rightTurn, 300)
                    }
                }

                if(currentIndex%2 == 1)
                {
                    //крутим против часовой стрелки 
                    //рассчитываем количество нужных прокрутов (на один больше, так как сначала будет запущена функция поворота, которая уменьшит индекс)
                    if(currentIndex < (imCollection.length-3) )
                        intervalCount = ((imCollection.length-1)/2) - ((currentIndex-1)/2);
                                    
                    if(currentIndex == 1)
                        intervalCount = ((imCollection.length-1)/2);

                    leftTurn();
                    if(intervalCount > 0 && goTurn == false)
                    {
                        goTurn = true;
                        intervalIndex = flash.utils.setInterval(leftTurn, 300)
                    }
                }
            }        
        }
        
        private function rightTurn():void
        {
            //поворот направо
            var tempItemsIndexes:Array = new Array;
            var tempItems:Array = new Array;
            var originalArray:Array = new Array;
            
            for(var i:int=0;i<imCollection.length;i++)
            {
                originalArray.push(imCollection[i]);
                if(i%2 == 0)
                {
                    if(i != (imCollection.length-1) )
                    {
                        tempItemsIndexes.push( i+2 );
                    }else
                    {
                        tempItemsIndexes.push( i-1 );
                    }
                }
                
                if(i%2 == 1)
                {
                    if( i != 1)
                    {
                        tempItemsIndexes.push( i-2 );
                    }else
                    {
                        tempItemsIndexes.push( i-1 );
                    }
                }
                
                tempItems.push(imCollection[tempItemsIndexes[i]]);
                //движение при помощи TweenMax
                gs.TweenMax.allTo([imCollection[i].displayImage], 1, {x:tempItems[i].posX, y:tempItems[i].posY, scaleX:scaleArray[tempItemsIndexes[i]], scaleY:scaleArray[tempItemsIndexes[i]]});
                //gs.TweenMax.allTo([imCollection[i].displayImage], 1, {x:tempItems[i].posX, y:tempItems[i].posY, scaleX:scaleArray[tempItemsIndexes[i]], scaleY:scaleArray[tempItemsIndexes[i]], bezier:[{x:150, y:170}]});

            }
            
            //удаляем все наши спрайты, чтобы потом выстроить их в нужном порядке
             for(i=0;i<imCollection.length-1;i++)
            {
                mainSprite.removeChildAt(0);
            } 
            
            originalArray.reverse();
            tempItemsIndexes.reverse();
            var newImagesArray:Array = new Array
            //определяем новый порядок спрайтов
            for(i=0;i<imCollection.length;i++)
            {
                newImagesArray.push(originalArray[tempItemsIndexes[i]])
            }
            
            imCollection = newImagesArray;
            for(i=0;i<imCollection.length;i++)
            {
                mainSprite.addChild(newImagesArray[i].displayImage);
                //координаты устанавливаем начальные, новым картинкам
                imCollection[i].posX = posXArray[i];
                imCollection[i].posY = posYArray[i];
            }    
            
            //уменьшаем счетчик вращений
            intervalCount--;
            if(intervalCount <= 0)
            {   //прекращаем крутить
                flash.utils.clearInterval(intervalIndex)
                goTurn = false;
            }
    
        }

        private function leftTurn():void
        {
            var tempItemsIndexes:Array = new Array;
            var tempItems:Array = new Array;
            var originalArray:Array = new Array;
            
            for(var i:int=0;i<imCollection.length;i++)
            {
                originalArray.push(imCollection[i]);
                if(i%2 == 0)
                {
                    if(i == 0)
                    {
                        tempItemsIndexes.push( i+1 );
                    }else
                    {
                        tempItemsIndexes.push( i-2 );
                    }
                }
                
                if(i%2 == 1)
                {
                    if( (i+1) == (imCollection.length-1) )
                    {
                        tempItemsIndexes.push( i+1 );
                        
                    }else
                    {
                        tempItemsIndexes.push( i+2 );
                    }
                }
                
                tempItems.push(imCollection[tempItemsIndexes[i]]);
                //движение при помощи TweenMax
                gs.TweenMax.allTo([imCollection[i].displayImage], 1, {x:tempItems[i].posX, y:tempItems[i].posY, scaleX:scaleArray[tempItemsIndexes[i]], scaleY:scaleArray[tempItemsIndexes[i]]});
            }

               for(i=0;i<imCollection.length-1;i++)
            {
                mainSprite.removeChildAt(0);
            } 
            
            originalArray.reverse();
            tempItemsIndexes.reverse();
            var newImagesArray:Array = new Array

            for(i=0;i<imCollection.length;i++)
            {
                newImagesArray.push(originalArray[tempItemsIndexes[i]])
            }
            
            imCollection = newImagesArray;
            for(i=0;i<imCollection.length;i++)
            {
                mainSprite.addChild(newImagesArray[i].displayImage);
                imCollection[i].posX = posXArray[i];
                imCollection[i].posY = posYArray[i];
            }    
            
            intervalCount--;
            if(intervalCount <= 0)
            {
                flash.utils.clearInterval(intervalIndex)
                goTurn = false;
            }
        }

    }
}