/**
 * This class wraps feature-list-updater forms on 
 * the shopping cart page, and allows the user to remove features from 
 * a cart item prior to checkout.
 */

var FeatureListUpdater = Class.create(
{
	element: null,
	
	cart_item: null, // ShoppingCartItemFeatures object
	
	features: [],
	
	dom: {},
	
	updating: false,
	
	initialize: function( element, cart_item )
	{
		this.element = $( element );
		this.cart_item = cart_item;
		
		this.initDOM();
		this.initOther();
		this.initEvents();
	},
	
	initDOM: function()
	{
		this.dom.tbody = this.element.getElementsByTagName( "tbody" )[0];
		this.dom.trs = this.dom.tbody.getElementsByTagName( "tr" );
		this.dom.save = this.element.getElementsByClassName( "save" )[0];
		this.dom.reset = this.element.getElementsByClassName( "reset" )[0];
	},
	
	initOther: function()
	{
		for( var i = 0; i < this.dom.trs.length; i++ )
			if( this.dom.trs[i].hasClassName( "item-feature-row" ) )
				this.features.push( new FeatureListItem( this.dom.trs[i], this ) );
	},
	
	initEvents: function()
	{
		this.dom.save.observe( "click", this.handleClickSave.bind( this ) );
		this.dom.reset.observe( "click", this.handleClickReset.bind( this ) );
	},
	
	getCartItem: function()
	{
		return this.cart_item;
	},
	
	wasModified: function()
	{
		for( var i = 0; i < this.features.length; i++ )
			if( this.features[i].wasModified() )
				return true;
		
		return false;
	},
	
	resetFeatures: function()
	{
		this.element.reset();
		
		for( var i = 0; i < this.features.length; i++ )
			this.features[i].activate();
	},
	
	handleClickSave: function( e )
	{
		Event.stop( e );
		
		this.dom.save.blur();
		
		if( this.updating ) // already updating
		{
			alert( "Already updating.\nPlease wait..." );
			return false;
		}
		
		if( !this.wasModified() )
			return alert( "No need to save: No changes were made" );
			
		// Get values of disabled (required) features:
		
		var requiredFeatures = {};
		
		for( var i = 0; i < this.features.length; i++ )
			if( this.features[i].isLocked() )
				requiredFeatures[ this.features[i].getName() ] = this.features[i].getValue();
			
		if( confirm( "Save feature changes?\n\nNote: Price will be adjusted after changes are saved" ) )
		{
			this.element.request(
			{
				parameters: requiredFeatures, // these will be added in addition to non-diabled (non-required) form elements
				onSuccess: this.processSaveResponse.bind( this ),
				onFailure: function(){ alert( "ERROR: Could not update cart item features [HTTP]" ) }
			});
			//this.getCartItem().updateQuantity();
		}
	},
	
	handleClickReset: function( e )
	{
		Event.stop( e );
		
		this.dom.reset.blur();
		
		if( confirm( "Reset feature changes?" ) )
			this.resetFeatures();
	},
	
	processSaveResponse: function( transport )
	{
		window.location = window.location;
	}
});

FeatureListUpdater.FEATURE_MASK = "feature_";
