var photo_prints = $H({});
var summary_headers = [ { text: 'Format' }, { text: 'Quantité' }, { text: 'Prix unitaire', cssClass:"price" }, { text: 'Prix', cssClass:"price" } ];
var photo_recommended_formats = $H({});
var photo_remote_id = $H({});
var currentProgressIndicatorId = "upload_";
var g_appletLoadedCallbacks = [];
var useCachedFormatsQty = false

function addAppletLoadedCallback( callback )
{
	g_appletLoadedCallbacks.push( callback );
}

/*
    Function: onAppletLoaded
    Called once when the applet is loaded
*/
function onAppletLoaded(applet)
{   
    createImageUploader(applet);
    
	if( $('add_photos') ) 
		$('add_photos').enableOnclick();
	
	g_appletLoadedCallbacks.each( function(callback){ callback(); } );
}

/*
    Function: createImageUploader
    Create and configure the image uploader
*/
function createImageUploader(applet)
{
    g_imageUploader = new DakisImageUploader(applet); 
    
    g_imageUploader.onFilesAdded = dakisOnFilesAdded;
    
    g_imageUploader.onPrepareThumbnailsUpload = dakisOnPrepareThumbnailsUpload;
    g_imageUploader.onProgressedPrepareThumbnailsUpload = dakisOnProgressedPrepareThumbnailsUpload;    
    g_imageUploader.onProgressedThumbnailsUpload = dakisOnProgressedThumbnailsUpload;
    g_imageUploader.onCompletedThumbnailsUpload = dakisOnCompletedThumbnailsUpload;
    g_imageUploader.onErrorThumbnailsUpload = dakisOnErrorThumbnailsUpload;
    g_imageUploader.onAfterCompletedThumbnailsUpload = dakisOnAfterCompletedThumbnailsUpload;
    g_imageUploader.onThumbnailUpdateFinished = dakisOnThumbnailUpdateFinished

    g_imageUploader.onPrepareSourceFilesUpload = dakisOnPrepareSourceFilesUpload;    
    g_imageUploader.onProgressedPrepareSourceFilesUpload = dakisOnProgressedPrepareSourceFilesUpload;
    g_imageUploader.onProgressedSourceFilesUpload = dakisOnProgressedSourceFilesUpload;
    g_imageUploader.onCompletedSourceFilesUpload = dakisOnCompletedSourceFilesUpload;
    g_imageUploader.onErrorSourceFilesUpload = dakisOnErrorSourceFilesUpload;   

}

//**********************************
// Temporary image uploader callback redirects

function onFilesAdded()
{
    getImageUploader().onFilesAdded();
}

function onAfterCompletedThumbnailsUpload() 
{
    getImageUploader().onAfterCompletedThumbnailsUpload();
}

function onPrepareThumbnailsUpload() 
{
    getImageUploader().onPrepareThumbnailsUpload();	
}


function onProgressedPrepareThumbnailsUpload(currentStepIndex, totalStepCount)
{
	getImageUploader().onProgressedPrepareThumbnailsUpload(currentStepIndex, totalStepCount);
}


function onStartedThumbnailsUpload() 
{
    getImageUploader().onStartedThumbnailsUpload();
}


function onProgressedThumbnailsUpload(currentFileName, currentFileIndex, totalFileCount, uploadedBytes, totalBytes, currentSpeed) 
{
	getImageUploader().onProgressedThumbnailsUpload(currentFileName, currentFileIndex, totalFileCount, uploadedBytes, totalBytes, currentSpeed);
}


function onCompletedThumbnailsUpload() 
{
    getImageUploader().onCompletedThumbnailsUpload();
}


function onErrorThumbnailsUpload() 
{
    getImageUploader().onErrorThumbnailsUpload();
}


function onPrepareSourceFilesUpload() 
{
    getImageUploader().onPrepareSourceFilesUpload();
}


function onStartedSourceFilesUpload() 
{
    getImageUploader().onStartedSourceFilesUpload();
}


function onProgressedPrepareSourceFilesUpload(currentStepIndex, totalStepCount)
{
    getImageUploader().onProgressedPrepareSourceFilesUpload(currentStepIndex, totalStepCount);
}


function onProgressedSourceFilesUpload(currentFileName, currentFileIndex, totalFileCount, uploadedBytes, totalBytes, currentSpeed) 
{
    getImageUploader().onProgressedSourceFilesUpload(currentFileName, currentFileIndex, totalFileCount, uploadedBytes, totalBytes, currentSpeed) ;
}


function onCompletedSourceFilesUpload() 
{
    getImageUploader().onCompletedSourceFilesUpload();
}


function onErrorSourceFilesUpload() 
{
    getImageUploader().onErrorSourceFilesUpload();
}


//**********************************


function update_selection_captions()
{
	var thumbnails = $('photo_list').getElementsByTagName('li');
	
	for( var i = 0; i < thumbnails.length; i++ )
		update_selection_caption(thumbnails[i]);
}

function update_selection_caption( thumbnail )
{
	thumbnail = $(thumbnail);
	if( thumbnail == null || !thumbnail.hasClassName('thumbnail') )
		return;
	
	var format_prints = $H(photo_prints[getThumbnailPhotoId(thumbnail)]);
	var print_count = 0;
	var format_count = 0;
	var format_id = null;
	
	format_prints.each(function(pair)
	{
		if( pair.value > 0 )
		{
			// There are prints for this format
			print_count += pair.value;
			format_count++;
			format_id = pair.key;
		}
	});

	var element = $( thumbnail.id + "_print" );
	
	if( print_count == 0 )
		element.update( 'Aucune impression sélectionnée' );
	else if( format_count == 1 )
	{
		var format_name = formats_info[format_id]['name'];
		var print_text = print_count == 1 ? 'impression': 'impressions';	
		
		element.update( format_string("%0 <em>%1</em> %2", [print_count, format_name, print_text]) );
	}
	else
		element.update( format_string( '%0 impressions (plusieurs formats)', [print_count]) );				
}

function setCurrentProgressIndicator(id)
{
	currentProgressIndicatorId = id;
}

function setUploadTitle(title)
{
    
}


//**********************************************
// Image uploader callback implementations

var g_genericProgress = new GenericProgress( "", function(){ getImageUploader().cancelUpload(); } );


function dakisOnPrepareThumbnailsUpload()
{
	g_genericProgress.setTitle( "Ajout de photos" );
	g_genericProgress.start( "" )
}

function dakisOnProgressedPrepareThumbnailsUpload(currentStepIndex, totalStepCount)
{	
	var percent = currentStepIndex / totalStepCount * 0.5
	g_genericProgress.progress( percent, 'Chargement des photos...' );
}


function dakisOnProgressedThumbnailsUpload(currentFileName, currentFileIndex, totalFileCount, uploadedBytes, totalBytes, currentSpeed) 
{
	var percent = 0.5 + currentFileIndex / totalFileCount * 0.5;
	g_genericProgress.progress( percent, "Préparation des miniatures..." );}


function dakisOnCompletedThumbnailsUpload() 
{
	g_genericProgress.complete( 'Préparation complétée, en attente de la réponse...' );
	onAfterCompletedThumbnailsUpload();
}

function dakisOnErrorThumbnailsUpload() 
{
	g_genericProgress.error( 'Erreur durant la préparation des miniatures' );
}

function dakisOnPrepareSourceFilesUpload() 
{
	g_genericProgress.setTitle( "Envoi des photos" );
	g_genericProgress.start( "Préparation des photos..." )
}


function dakisOnProgressedPrepareSourceFilesUpload(currentStepIndex, totalStepCount)
{
	g_genericProgress.progress( currentStepIndex / totalStepCount );
}	

function dakisOnProgressedSourceFilesUpload(currentFileName, currentFileIndex, totalFileCount, uploadedBytes, totalBytes, currentSpeed) 
{
	if(!parseFloat(currentSpeed))
		currentSpeed = 0;
	else
		currentSpeed = parseFloat(currentSpeed);
	
	uploadedBytes = parseInt(uploadedBytes);
	totalBytes = parseInt(totalBytes);
		
	currentFileIndex++;
	
	var text = format_string( "Envoi des photos @ %1", [ format_bytes(currentSpeed) ] );
	g_genericProgress.progress( uploadedBytes / totalBytes, text );
}


function dakisOnCompletedSourceFilesUpload() 
{
	g_genericProgress.complete( "Envoi complété, en attente de la réponse..." );
	onAfterCompletedSourceFilesUpload();
}


function dakisOnErrorSourceFilesUpload() 
{
	g_genericProgress.error( "Erreur durant l'envoi des photos" );
}

function cancelUpload()
{	
    //$(currentProgressIndicatorId+'cancel_button').disableOnclick();
    getImageUploader().cancelUpload();
}

function update_sub_total()	{
	var element = $('subtotal');
	
	if( element == null )
		return; // The page may not be fully loaded yet
	
	//element = $( element.getElementsByTagName("div")[0] );
	var subtotal = calculate_sub_total();
	element.update( format_money(subtotal) );		
	update_selection_summary();
}

function dakisOnFilesAdded()	{
		//setUploadProgress('Génération des miniatures...');
		getImageUploader().uploadThumbnails();
}


function dakisOnAfterCompletedThumbnailsUpload() {	
	//setUploadProgress( 'Photos ajoutées', 100, 100);
	g_genericProgress.complete( "Photos ajoutées" );
	
	/*
	if( $('quick_format') )
	{
		Element.hide( 'upload_progress' );
		$('RB_window').style.top = ($('RB_window').offsetTop - 120) + 'px';
		new Effect.Appear('quick_format');
	}
	*/

	
	moveFormatSelectorToParkingZone();
	onUserPhotosUpdated( Insertion.Update );
	
}

// called after the Ajax call that updates the photos thumbnails
function dakisOnThumbnailUpdateFinished()
{
}

function submitPrints( backTo )
{	
	if( backTo == "gifts" || hasPrintsSelected() )
	{		
		var form = prepareSelectedPrintsForm();
		var suffix = "?backto=" + backTo;

		if( backTo && form.action.indexOf( suffix ) == -1 )
			form.action += suffix;

		form.submit();
	}
}

function clearPrints()
{
	var url = "/guid/9bd7d750-663f-012b-ee30-00163e08a1c2/fr/photo/clear_prints";
	if( photo_prints.size() > 0 && confirm("Appuyer sur 'Ok' pour confirmer que vous voulez recommencer la commande.") )
		document.location.href = url;	
}

function onPhotosChanged()
{	
	if( photo_prints.size() > 0 )
	{
		enableByClassName( "reset_order" );
		
		$("express").show();
		$("add_photos").innerHTML = $("add_photos").innerHTML.gsub('Ajouter des Photos...', 'Ajouter plus de photos');	
		$("add_button_id").className = "add_button_container more";
			
	}
	else
	{
		disableByClassName( "reset_order", resetTitle );
		
		$("express").hide();
		$("add_photos").innerHTML = $("add_photos").innerHTML.gsub('Ajouter plus de photos', 'Ajouter des Photos...');
		$("add_button_id").className = "add_button_container";
		
	}

  if( hasPrintsSelected() )
	  enableByClassName( "next_step" );
  else
	  disableByClassName( "next_step", nextStepTitle );
	
	if( $("page_controls_bottom") != null )
	{
		if( photo_prints.size() > 6 )
			$("page_controls_bottom").show();
		else
			$("page_controls_bottom").hide();
	}
}

function getSelectedPrintsPostValues()
{
	var postValues = $H({});

	photo_prints.each(function(pair)
	{
		var photoId = pair.key;
		
		$H(pair.value).each(function(format)
		{
			var formatId = format.key;
			var quantity = format.value;
			
			if( quantity > 0 )
				postValues['selected_prints[' + photoId +  '][' + formatId + ']'] = quantity;
		});
	});
	
	if( postValues.size() == 0 )
		postValues['selected_prints'] = null;
	
	return postValues;
}

function prepareSelectedPrintsForm()
{		
	var form = $('orderForm');
	if( form != null )
	{
		var fieldset = $('prints_fieldset');
	
		fieldset.clearChildNodes();
		fieldset.createInputElement('submit[next_step]', 'true');		
	
		getSelectedPrintsPostValues().each(function(pair) { 
			if( pair.key && pair.value)
				fieldset.createInputElement(pair.key, pair.value); 
		});		
	}
	return form;
}

function getTotalPrintsCount()
{
	var count = 0;
	all_formats.each(function(pair)	{count += pair.value;} );
	return count;		
}

function uploadBetterThumbnail( remoteId, width, height, onCompleted )
{
	if( onCompletedBetterThumbnailUploadCallback != null )
		return;
		
	getImageUploader().uploadBetterThumbnail( remoteId, width, height );
	onCompletedBetterThumbnailUploadCallback = onCompleted;
}


var onCompletedBetterThumbnailUploadCallback = null;
function onPrepareBetterThumbnailUpload() {}
function onProgressedPrepareBetterThumbnailUpload(currentStepIndex, totalStepCount) {}
function onStartedBetterThumbnailUpload() {}
function onProgressedBetterThumbnailUpload(currentFileName, currentFileIndex, totalFileCount, uploadedBytes, totalBytes, currentSpeed) {}
function onCompletedBetterThumbnailUpload() 
{
	if( onCompletedBetterThumbnailUploadCallback )
	{
		onCompletedBetterThumbnailUploadCallback();
		onCompletedBetterThumbnailUploadCallback = null;
	}
}
function onErrorBetterThumbnailUpload() {}

function onUserPhotosUpdated( position )
{	
	var completeCallback = function(request){
		if(g_isKiosk){
			
			kiosk.endLoading();
		}
		else{
			RedBox.close();
			hideButtonLoader('upload_ok_button_loader');
			getImageUploader().onThumbnailUpdateFinished();
		}
	};
	
	if(g_isKiosk){
		kiosk.beginLoading();
	}
	
	new Ajax.Request( "/guid/9bd7d750-663f-012b-ee30-00163e08a1c2/fr/photo/show_photos",{		
		method:'post',
		asynchronus: true,
		evalScripts: true,		
		insertion: position,
		onComplete: completeCallback
	});	
}

function fixDakisPhotoParentOverflow()
{
	// We want to make sure that the dakis_photo and its parent elements do not have the overflow:hidden style
	for( var e = $('dakis_photo'); e != null; e = $(e.parentNode))
	{
		if( e.getStyle && e.getStyle('overflow').toLowerCase() == 'hidden' )
			e.setStyle( {overflow: 'visible'} );
	}
}

function update_sub_total_with_options(){
	  
var element = $('subtotal');
  if( element == null )
  	return; // The page may not be fully loaded yet
  var subtotal = calculate_sub_total();
  option_prices.each(function(group){group.value.each(function(option){if(user_options.indexOf(parseInt(option.key)) != -1)subtotal += option.value;})});
  element.update( format_money(subtotal) );

}

function calculate_sub_total()
{
	// Reset quantities for each format
	var keys = all_formats.keys();
	for(i=0;i < keys.length;i++)
		all_formats[keys[i]] = 0;
	
	updateGlobalFormatQuantities();
	useCachedFormatsQty = true
			
	var subtotal = 0.00;
	var formatIds = formats_info.keys();
	photo_prints.each(function(pair)
	{
		formatIds.each( function( formatId )
		{
			formatQty = pair.value[formatId];
			if( formatQty != null && formatQty > 0 )
			{
				all_formats[formatId] += formatQty;
				var qty = formatQty;
				var unitPrice = parseFloat( getUnitPrice( formats_info[formatId], qty ) );
				subtotal += parseFloat( qty ) * unitPrice;			
			}
		});
	});
	useCachedFormatsQty = false
	
	return subtotal;	
}

function updateGlobalFormatQuantities()
{
	formats_info.each( function(format){
		format.globalQty = 0;
	})
	
	photo_prints.each(function(pair) {
		formats_info.each( function( format ){
			var qty = pair.value[format.id] || 0
			format.globalQty += qty;
		})
	});	
}
