// downloads one image at a time
// when finished, 
//    installs the image into the appropriate <img src="">
//    calls the callback for tha particular image requestor

// caller must:
//        gvo_image_downloader.pm_register( args_URL , args_img_id , arga_callback: [ object , function ]   )




//alert( "gvo_image_downloader.js" );
var gvo_image_downloader               = new Object ( ) ;
gvo_image_downloader.pm_initiate = function ( )
  { //alert ( "gvo_image_downloader.pm_initiate" ) ;
	
    this.pvo_image         = null           ;
    this.pvaa_download_que = new Array  ( ) ;
  } ;

// [ [ args_URL , args_img_id , arga_callback ] , [ args_URL , args_img_id , arga_callback ] , ... ]
	

//-------------------------------------
//-------------------------------------
//-------------------------------------
//gvo_image_downloader.pm_register = function ( args_URL , args_img_id , argr_object , argn_method ) //*** march 05, 10 
gvo_image_downloader.pm_register = function ( args_URL , args_img_id , arga_callback  )              //*** march 05, 10 
  { //arga_callback ==> [ object , function  ( , [ arg1 , arg2 , ... ] )  ] 
    // gvo_image_downloader.pm_register( args_URL , args_img_id , arga_callback: [ object , function ]   )
	
	
	//gf_ri( "gvo_image_downloader.pm_register : " + args_URL + " , " + this.pvaa_download_que.length ) ;
    //alert ("gvo_image_downloader.pm_register : " + args_URL ) ;
	
    //this.pvaa_download_que.push( new Array ( args_URL , args_img_id , argr_object , argn_method ) ) ;  //*** march 05, 10 
    this.pvaa_download_que.push( new Array ( args_URL , args_img_id , arga_callback ) ) ;               //*** march 05, 10 
    
	if ( this.pvaa_download_que.length == 1 )
	  { this.pm_begin_download ( ) ;
	  }
	else
	  { // there are currently items in que; when the next one finishes it will call pm_begin_download
	  } ;
  } ;

//-------------------------------------
gvo_image_downloader.pm_begin_download = function ( )
  { //gf_ri( "gvo_image_downloader.pm_begin_download : " + this.pvaa_download_que.length + " , " + this.pvaa_download_que[ 0 ][ 0 ] + " , " + this.pvaa_download_que[ 0 ][ 1 ]  ) ;
    //gf_ri( "gvo_image_downloader.pm_begin_download : " + this.pvo_image.pvs_img_id  ) ;
		
    if ( this.pvaa_download_que.length >= 1 )
	  { // this function should not even be called if this is not true ;
	    //gf_ri( "gvo_image_downloader.pm_begin_download : " + this.pvaa_download_que.length ) ;//[ 0 ][ 2 ]   ) ;
		
		
        this.pvo_image                = new Image ( ) ;
		
		// .onload needs to come before the .src declaration, because .src inits the downloading, but if the image is cached then 
		//     dloading is instantaneous, especially on Opera browser;
		this.pvo_image.onload = function()
		  { //gf_ri( "gvo_image_downloader.onload , pvs_img_id : " + this + " , " + this.pvs_img_id   ) ;
		    gvo_image_downloader.pm_check_downloading( ) ;
		  } ;
	    this.pvo_image.onerror = function()
		  { alert ("image download error : " + this.pvo_image.src ) ;
		    gvo_image_downloader.pm_check_downloading( ) ;
		  } ;
	    this.pvo_image.pvs_img_id     = this.pvaa_download_que[ 0 ][ 1 ]      ;
	    //this.pvo_image.pvr_object   = this.pvaa_download_que[ 0 ][ 2 ]      ;  //*** march 05, 10 
	    //this.pvo_image.pvn_method   = this.pvaa_download_que[ 0 ][ 3 ]      ; //*** march 05, 10 
	    this.pvo_image.pva_callback   = this.pvaa_download_que[ 0 ][ 2 ]      ; //*** march 05, 10 
	    this.pvo_image.src            = this.pvaa_download_que[ 0 ][ 0 ]      ;
	    // !!!!!!!!!!!! .src  MUST BE LAST  because IF an image, say hot_banana.jpg  is requested 2+ times, the 2nd time ( and 3rd, etc ) will be instantaneous b/c
		//                                                           hot_banana.jpg  was loaded   1st time and thus pvs_img_id wont get a chance to be set !!!!!!!!!!
		
		
		/*    
	    var lvs_which   = "advancer"                                     ;
        var lvn_TO      = "download_image_" + this.pvo_image.pvs_img_id  ;
        var lvr_object  = this                                           ;
        var lvn_method  = "pm_check_downloading"                         ;
        var lvi_ms      = -1                                             ;
        //var lva_params  = [ "a" , "b" , "c" ]                          ;
        
		gvo_timeout.pm_register( lvs_which , lvn_TO , lvr_object , lvn_method , lvi_ms ) ; //, lva_params ) ;
	  */
	  } ;
  } ;
    
//-------------------------------------
gvo_image_downloader.pm_check_downloading = function ( )
  { var lvo_this = gvo_image_downloader ; // for some reason when this function is called-back from gvo_timeout, 'this' loses its meaning;
    //alert ("gvo_image_downloader.pm_check_downloading A :  " + lvo_this.pvaa_download_que     ) ;
	//alert ("gvo_image_downloader.pm_check_downloading B :  " + lvo_this.pvo_image.pvs_img_id  ) ;
	
	
	////////////if ( lvo_this.pvo_image.complete )
      { 
	    //gf_ri( "gvo_image_downloader.pm_check_downloading , complete  " ) ;
        ///////////var lvn_TO = "download_image_" + lvo_this.pvo_image.pvs_img_id  ;
        ///////////gvo_timeout.pm_forget ( lvn_TO )                            ;
		
		// insert image into the <img src="" >
		var lvo_img     = lvo_this.pvo_image                    ;
		var lvs_img_id  = lvo_this.pvo_image.pvs_img_id         ;                    
		var lvo_img_tag = document.getElementById( lvs_img_id ) ;
		lvo_img_tag.src = lvo_this.pvo_image.src                ;
		//gf_ri( "gvo_image_downloader.pm_check_downloading , lvs_img_id : " + lvs_img_id + " , " + lvo_img.width + " , " + lvo_img.height ) ;
        
		
		gvo_image_downloader.pm_handle_callback( lvs_img_id , lvo_img.width , lvo_img.height ) ;
		
		
		  
		// check the pvaa_download_que to see if there are any other images to download
		lvo_this.pvaa_download_que.shift() ; // don't use lvo_this, though I have not tested it; just seems safer to do it this way;
		//gf_ri( "gvo_image_downloader.pm_check_downloading , que.length : " + lvo_this.pvaa_download_que.length ) ;
		
		if ( lvo_this.pvaa_download_que.length >= 1 )
	      { lvo_this.pm_begin_download ( ) ;
	      }
	    else
	      { //gf_ri( "gvo_image_downloader.pm_check_downloading , ZZZZ " ) ;
		    // it is empty
	        lvo_this.pvo_image.src           = null ;
	        lvo_this.pvo_image.pvs_img_id    = null ;
	        lvo_this.pvo_image.pva_callback  = null ;
		    lvo_this.pvo_image.onload        = null ;
	        lvo_this.pvo_image.onerror       = null ;
            lvo_this.pvo_image               = null ;
            
			lvo_this.pvaa_download_que       = new Array ( ) ;
	      } ;
	  } 
	////else
	/////  { //lvo_main_screen_p.innerHTML = lvo_main_screen_p.innerHTML + "." ; 
	///////  } ;
	
  } ;

//----------------------------------------------------------------------
gvo_image_downloader.pm_handle_callback = function ( args_id , argi_w , argi_h ) 
  {
		// callback the requestor to let it know that the image is finished
		
		var lva_callback = gvo_image_downloader.pvo_image.pva_callback ;
		var lvr_object   = lva_callback[ 0 ]                           ; // pvr_object    ; //*** march 05, 10 
	    var lvn_method   = lva_callback[ 1 ]                           ; // .pvn_method    ; //*** march 05, 10 
		var lva_params   = ( lva_callback.length > 2 ) ? lva_callback[ 2 ] : []                           ; //                 ; //*** nov 13, 10 
		
		//gf_ri( "gvo_image_downloader.pm_handle_callback , lvr_object : " + lvr_object + " , " + lvn_method ) ;
		
		var cond1 = ( lvr_object == null      ) ;
		var cond2 = ( lvr_object == undefined ) ;
		var cond3 = ( lvr_object == ""        ) ;
		var cond4 = ( lvn_method == null      ) ;
		var cond5 = ( lvn_method == undefined ) ;
		var cond6 = ( lvn_method == ""        ) ;
		
		
	    //alert ( "gvo_image_downloader.pm_check_downloading , complete : " + lvr_object + " , " + lvn_method  ) ;
		if (  cond1 ||  cond2   ||  cond3   ||  cond4   ||  cond5  ||  cond6 )
		  { // don't do anything
		  }
		else
		  { 
		    lvr_object[ lvn_method ].call( lvr_object , args_id , argi_w , argi_h , lva_params ) ;
		  } ;
  } ;

//----------------------------------------------------------------------
gvo_image_downloader.pm_initiate () ;


//----------------------------------------------------------------------
	
