// ................................................................... 
//  NAME : RuotaOggetto.fla - [ CS3 - AS3 ] 
//         Esempio di rotazione di un oggetto caricando, da un file 
//         XML, gli n "scatti" (.jpg) 
// 
//  Il file XML :  
// 
//  <scatti> 
//    <foto url="scatto1.jpg" /> 
//    <foto url="scatto2.jpg" /> 
//    <foto url="scatto3.jpg" /> 
//    etc..... 
//  </scatti>
//  
//  ... sullo stage sono presenti i bottoni btn_sx e btn_dx 
// 
// ................................................................... 
import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.IOErrorEvent;
// ... variabili globali : 
var richiestaXML      :URLRequest; 
var caricatoreXML     :URLLoader; 
var gestoreXML        :XML; 
var listaFotoUrl      :XMLList; 
var richiestaIMG      :URLRequest; 
var caricatoreIMG     :Loader; 
var caricatoreInfoIMG :LoaderInfo; 
// ... Array contenente le immagini caricate dal file XML 
var arrayIMG          :Array; 
// ... il numero di immagini presenti nel file XML 
var numImages         :uint; 
// ... l'immaggine corrente (l'iesimo scatto) 
var currentImage      :uint; 
// ... i timer per la gestione continua della rotazione 
var timerSinistra     :Timer;
var timerDestra       :Timer;
// ... crea gli oggetti relativi : 
// ... l'oggetto URL relativo al File XML 
richiestaXML   = new URLRequest(); 
// ... l'oggetto URLLoader per il caricamento dell'XML 
caricatoreXML  = new URLLoader(); 
// ... l'ascoltatore evento : COMPLETE al caricatore XML  
caricatoreXML.addEventListener(Event.COMPLETE, completatoCaricamentoXML); 
// ... l'ascoltatore evento : IO_ERROR per eventuali errori  
caricatoreXML.addEventListener(IOErrorEvent.IO_ERROR, erroreCaricamentoXML); 
// ... l'Array che conterrà le immagini caricate  
arrayIMG       = new Array(); 
// ... gli oggetti timer per la rotazione continua
//     ( impostare i millisisecondi : es. 85  ) 
timerSinistra  = new Timer(85, 0);
timerSinistra.addEventListener("timer", onTimerSinistra);
timerDestra    = new Timer(85, 0);
timerDestra.addEventListener("timer", onTimerDestra);
// ... 
// ... assegna l'url relativo al file XML da caricare  
richiestaXML.url = "scatti.xml"; 
// ... ok, carica il file XML  
caricatoreXML.load(richiestaXML); 
// ... 
// ................................................................... 
//  FUNCTION : completatoCaricamentoXML()  
//             Evento : COMPLETE 
//             questa funzione sara' richiamata quando il file XML 
//             sara' copletamente caricato 
// ................................................................... 
function completatoCaricamentoXML(evento:Event):void  
{ 
    // ... caricamento del File XML Completato!  
     
    // ... crea un oggetto XML :
    
    // ... l'oggetto XML consente di accedere ed     
    //     estrarre i valori relativi ai TAGS ed agli  
    //     ATTRIBUTI di un contenuto di dati XML. 
    // ... al costruttore viene passata la proprietà .data  
    //     dell'URLoader (il contenuto dei dati letti) 
    gestoreXML      = new XML(caricatoreXML.data); 
     
    // ... <foto url="scatto1.jpg" /> 
    // ... estrai i valori di tutti gli ATTRIBUTI url
    //     del TAG <foto> ed inseriscili in un oggetto XMLList
    listaFotoUrl    = gestoreXML.foto.@url; 
    // ... ora nell'array : listaFotoUrl ci sono i nomi di tutte 
    //     le immagini da caricare 
	
    // ... salva il numero dei TAGS <foto> presenti nel file XML
    //     ( corrisponde al numero di immagini ) 
    numImages       = listaFotoUrl.length();    
	
    // ... imposta l'indice dell'Immagine corrente a ZERO   
    currentImage    = 0;
    // ... ok!, carica la prima immagine 
    caricaImmagine(currentImage);
} 
// ................................................................... 
// ................................................................... 
//  FUNCTION : erroreCaricamentoXML()  
//             Evento : IO_ERROR 
//             questa funzione sara' richiamata se dovesse verificarsi  
//             un errore durante durante il caricamento del file XML  
// ................................................................... 
function erroreCaricamentoXML(evento:IOErrorEvent):void  
{
    // ...  
    // trace("... errore caricamento file XML : " + evento.type); 
} 
// ................................................................... 
// ................................................................... 
//  FUNCTION : caricaImmagine()  
//             caricamento di una singola immagine (i-esima)
// ................................................................... 
function caricaImmagine(p_idxImg:uint):void  
{
     // ... crea gli oggetti per il caricamento del'iesima immagine 
	
     // ... l'oggetto URL   
     richiestaIMG      = new URLRequest(); 
     // ... l'oggetto Loader 
     caricatoreIMG     = new Loader(); 
     
     // ... il contentLoaderInfo a cui associare gli asoltatori
     caricatoreInfoIMG = LoaderInfo(caricatoreIMG.contentLoaderInfo); 
	
    // ... aggiungi gli asacoltatori :
	
    // ... l'ascoltatore evento : COMPLETE al caricatore XML  
    caricatoreInfoIMG.addEventListener(Event.COMPLETE, completatoCaricamentoIMG); 
    // ... l'ascoltatore evento : IO_ERROR per eventuali errori  
    caricatoreInfoIMG.addEventListener(IOErrorEvent.IO_ERROR, erroreCaricamentoIMG); 
	
    // ... assegna url dell'immagine da caricare   
    richiestaIMG.url  = listaFotoUrl[p_idxImg]; 
    // ... ok!, carica l'iesima immagine  
    caricatoreIMG.load(richiestaIMG);     
} 
// ................................................................... 
// ................................................................... 
//  FUNCTION : completatoCaricamentoIMG()  
//             Evento : COMPLETE 
//             questa funzione sara' richiamata al caricamento    
//             completato di ogni immagine 
// ................................................................... 
function completatoCaricamentoIMG(evento:Event):void  
{ 
    // ... l'iesima IMG e' stata caricata completamente!  
    // ... l'immagine caricata  
    var imgLoader:Loader = Loader(evento.currentTarget.loader);
	
    // ... salva l'immagine nell'Array 
    arrayIMG[currentImage] = imgLoader; 
	
    // ... controlla se tutte le immagini sono state caricate 
    if ( currentImage < (numImages - 1) )      
    { 
        // ... no, incrementa contatore  
        currentImage++; 
        // ... e carica la prossima  
        caricaImmagine(currentImage);
    } 
    else  
    { 
        // ... Ok!, TUTTE le immagini sono state caricate nell'Array
		
        // ... reimposta l'indice dell'immagine corrente 
        currentImage = 0;
		
        // ... aggiungi gli ascoltatori per la gestione degli eventi 
        //     sui Bottoni (SINISTRA e DESTRA) 
        btn_sx.addEventListener(MouseEvent.MOUSE_DOWN, onMouseGiu);		
        btn_dx.addEventListener(MouseEvent.MOUSE_DOWN, onMouseGiu);	
		
        btn_sx.addEventListener(MouseEvent.MOUSE_UP, onMouseSu);
        btn_dx.addEventListener(MouseEvent.MOUSE_UP, onMouseSu);		
        // ... imposta il Mouse mode ( cursor Hand )  
        btn_sx.buttonMode = true;
        btn_dx.buttonMode = true;
        // ... e visualizza la prima immagine! 
        ShowImage(currentImage);
    } 
} 
// ................................................................... 
// ................................................................... 
//  FUNCTION : erroreCaricamentoIMG()  
//             Evento : IO_ERROR 
//             questa funzione sara' richiamata se dovesse verificarsi  
//             un errore durante durante il caricamento di un'immagine 
// ................................................................... 
function erroreCaricamentoIMG(evento:IOErrorEvent):void  
{
    // ... 
    // trace("... errore caricamento file IMG : " + evento.type); 
} 
// ................................................................... 
// ................................................................... 
//  FUNCTION : ShowImage()
//             visualizzaione dell'i-esima immagine  
// ................................................................... 
function ShowImage(p_idxImg:uint)
{
    // ... dichiara una variabile locale  
    var img:Loader;
    // ... get dell'immagine   
    img = arrayIMG[p_idxImg]; 
	
    // ... posiziona l'immagine sullo Stage (o in altro contenitore)   
    img.x = 100;
    img.y = 10;
    // ... aggiungi l'immagine allo stage (o ad altro contenitore)
    addChild(img);
}
// ................................................................... 
// ................................................................... 
//  FUNCTION : onMouseGiu()
//             Evento : MOUSE_DOWN 
//             questa funzione sara' richiamata al MOUSE DOWN su uno 
//             dei due bottoni 
// ................................................................... 
function onMouseGiu(evento:MouseEvent)
{
    // ... variabile locale che conterra' il riferimento del bottone 
    var btn :MovieClip;
	
    // ... get del Bottone     
    btn = MovieClip(evento.currentTarget);
    // ... test del Bottone  
    if (btn == btn_sx) 
    {
        // ... ruota una sola volta a sinistra   
        vaiSinistra();
		
        // ... e START del timer di sinistra  
        timerSinistra.start();
    }
    else 
    {
        // ... ruota una sola volta a destra   
        vaiDestra();
		
        // ... e START del timer di destra  
        timerDestra.start();
    }
}
// ................................................................... 
// ................................................................... 
//  FUNCTION : onMouseSu()
//             Evento : MOUSE_UP 
//             questa funzione sara' richiamata al MOUSE UP su uno 
//             dei due bottoni 
// ................................................................... 
function onMouseSu(evento:MouseEvent)
{
    // ... variabile locale che conterra' il riferimento del bottone   
    var btn :MovieClip;
	
    // ... get del Bottone     
    btn = MovieClip(evento.currentTarget);
    // ... test del Bottone  
    if (btn == btn_sx) 
    {
        // ... STOP del timer di sinistra 
        timerSinistra.stop();
    }
    else 
    {
        // ... STOP del timer di destra  
        timerDestra.stop();
    }
}
// ................................................................... 
//.....................................................................
//  FUNCTION : onTimerSinistra()
//             Evento : TIMER 
//             questa funzione sara' richiamata ogni n millisecondi 
//             dall'avvio del timer a cui e' associata  
//.....................................................................
function onTimerSinistra(evento:TimerEvent):void
{
    // ... al MOUSE DOWN il timer e' avviato, ma continua la  
    //     visalizzazione delle immagini solo se e' trascorso 
    //     un po' di tempo ( es. dopo 3 * millisiecodi )
    if ( timerSinistra.currentCount > 3 )   
    {
        vaiSinistra();
    }
}
//.....................................................................
//.....................................................................
//  FUNCTION : onTimerDestra()
//             Evento : TIMER 
//             questa funzione sara' richiamata ogni n millisecondi 
//             dall'avvio del timer a cui e' associata  
//.....................................................................
function onTimerDestra(evento:TimerEvent=null):void
{
    // ... al MOUSE DOWN il timer e' avviato, ma continua la  
    //     visalizzazione delle immagini solo se e' trascorso 
    //     un po' di tempo ( es. dopo 3 * millisiecodi )
    if ( timerDestra.currentCount > 3 )   
    {
        vaiDestra();
    }
}   
//.....................................................................
//.....................................................................
//  FUNCTION : vaiSinistra()
//             visualizza l'immagine precedente nell'Array               
//.....................................................................
function vaiSinistra():void
{
    // ... remove dell'iesima immagine 
    removeChild(arrayIMG[currentImage])
	
    // ... controlla l'indice   
    if ( currentImage == 0 )   
    {
        // ... se la prima, vai all'ultioma 
        currentImage = (numImages - 1);
    }
    else 
    {
        // ... decrementa 
        currentImage--;
    }
    // ... e visualizza l'immagine precedente  
    ShowImage(currentImage);
}
//.....................................................................
//.....................................................................
//  FUNCTION : vaiDestra()
//             visualizza l'immagine seguente nell'Array               
//.....................................................................
function vaiDestra():void
{
    // ... remove dell'iesima immagine 
    removeChild(arrayIMG[currentImage])
	
    // ... controlla l'indice   
    if ( currentImage < (numImages - 1))   
    {
        // ... incrementa 
        currentImage++;
    }
    else 
    {
        // ... ricomincia 
        currentImage = 0;
    }
    // ... e visualizza l'immagine seguente 
    ShowImage(currentImage);
}
//.....................................................................
// ... end of JOB