/**
 * NM_ComBasketStateWidget.js
 *
 * @author	Steffen Heinzelmann <shi@dmc.de>
 * @copyright	Copyright (c) dmc - digital media center GmbH
 * @version	$Id: NM_ComBasketStateWidget.js 87209 2011-12-07 15:50:57Z maschmann $
 */
var NM_ComBasketStateWidget = NM_Component.extend( {

	/**
	* constructor of the class
	**/
	initialize: function( objParam ) {
		this.parent( objParam );

		//init by objParam
		this.strLinkClientRequest		= objParam.linkClientReqeust;	// link to client request

		//init
		this.searchURL					= window.location.href;			//actual page URL
		this.availTrackingCode			= objParam.avail_tracking;
		this.availSerachTerm			= objParam.avail_search_term;
		this.objBasket					= null;

		this.intFXstart					= -66;
		this.intPosition				= -55;

		this.registerEventLoad( objParam );
	},

	/**
	* on load
	* @param 	object objParam
	**/
	onLoad: function( objParam )
	{
		if( true == objParam.env_is_java )
		{
			if( true == objParam.basket_cookie_update )
		{
			this.updateCookie();
		}
			else if( true == objParam.basket_cookie_clear )
			{
				this.clearCookie();
			}
		}

		// total value in basket
		this.elmBasketTotalValue	= $( 'bskTotalValue' );

		// num of articles in basket
		this.elmBasketArticleCnt	= $( 'bskCountArticle' );
	},

	/**
	* refreshBasket
	**/
	refreshBasket: function( objBasket )
	{
		this.setTotalAmount( objBasket.total_amount );
		this.setBasketArticleCnt( objBasket.article_cnt );
	},

	/**
	* setTotalAmount
	**/
	setTotalAmount: function( floTotalAmount )
	{
		this.elmBasketTotalValue.setHTML( floTotalAmount );
	},

	/**
	* setBasketArticleCnt
	**/
	setBasketArticleCnt: function( intCnt )
	{
		this.elmBasketArticleCnt.setHTML( intCnt );
	},

	/**
	* addArticle
	**/
	addArticle: function( objItem )
	{
		try
		{
			switch( objItem.type )
			{
				case 'form':
					if ( $type( $( objItem.value ) ) == 'element' )
					{
						var objRequest = this.createRequestJson();
						objRequest.setAction( 'add' );
						objRequest.addRequestParam( 'form_data', encodeURIComponent( $( objItem.value ).toQueryString() ) );
						this.fireRequest( objRequest );
					}
					break;


				case 'id':
					var objRequest = this.createRequestJson();
					objRequest.setAction( 'addById' );
					objRequest.addRequestParam( 'article_id', objItem.value );
					this.fireRequest( objRequest );
					break;

				default :
					// do nothing
					break;
			}
		}
		catch (e)
		{
			this.warning( 'addArticle: ' + e );
		}
	},

	/**
	 * On complete callback for json requests
	 *
	 * @param 	NM_ComponentResponseJson objResponse
	 * @return 	void
	 */
	cbRequestOnComplete: function( objResponse )
	{
		switch( objResponse.getAction() )
		{
			case 'add':
			case 'addById':
				this.addArticleCallBack( objResponse );
				break;

			case 'read':
				this.readBasketCallback( objResponse );
				break;
		}
	},

	/**
	 * On error callback for json requests
	 *
	 * @param 	NM_ComponentResponseJson objResponse
	 * @return 	void
	 */
	cbRequestOnError: function( objResponse )
	{
		this.warning( 'cbRequestOnError: '+objResponse.getErrorList( true ) );
	},

	/**
	 * On wait callback for json request
	 *
	 * @param 	NM_ComponentRequestJson objRequest
	 * @return 	void
	 */
	cbRequestOnWait: function( objRequest )
	{
		this.log( 'cbRequestOnWait: wait for request (action='+objRequest.getAction()+')' );
	},

	/**
	 * On success callback for json request
	 *
	 * @param 	NM_ComponentRequestJson objRequest
	 * @return 	void
	 */
	cbRequestOnSuccess: function( objRequest )
	{
		this.log( 'cbRequestOnSuccess: request successed (action='+objRequest.getAction()+')' );
	},

	/**
	 * addArticleCallBack: generic method to add or remove items to/from basket
	 */
	addArticleCallBack: function( objResponse )
	{
		if( true == DMC_System.isInstanceOf( objResponse, NM_ComponentResponseJson ) )
		{
			this.objBasket = objResponse.getContent();

			// specific actions
			switch( objResponse.getAction() )
			{
				case 'addById':
				case 'add': // add item to basket

					if( true == this.objBasket.status
							&& true == this.objBasket.article_added )
					{
						this.refreshBasket( this.objBasket );

					// handle Avail Tracking
						if( this.objBasket.base_tracking_avail != 0 )
					{
							NM_Avail.mainProductTracking( this.objBasket.base_tracking_avail,this.availSerachTerm, this.availTrackingCode );
					}

						arrXSPTracking = $H( this.objBasket.xsp_tracking_avail );

					if ( arrXSPTracking.length > 0 )
					{
						arrXSPTracking.each( function( intProductId )
							{
								NM_Avail.logAddedToCart( intProductId, '' );
							}
						);
					}

						this.showAddToBasketButtonInfo();
					}
					else
					{
						this.showAddToBasketButtonError();
					}

					break;

				case 'delete': //delete item from basket
					this.refreshBasket();
					break;

				default:
					// do nothing
					break;
			}
		}
	},

	/**
	 * showAddToBasketButtonInfo()
	 * @return		void
	 */
	showAddToBasketButtonInfo: function()
	{
		blnPurchaseLayer = false;
		try
		{
			if( true == $defined( objNM_ComProductDetailPurchaseLayer ) )
			{
				// hide info layer
				$E( '.addToBasketButtonInfo' ).setStyle( 'display', 'none' );

				objNM_ComProductDetailPurchaseLayer.showLayer();
				blnPurchaseLayer = true;
			}
		}
		catch( e )
		{
			this.warning( 'showAddToBasketButtonInfo: ' + e );
		}

		if( false == blnPurchaseLayer )
		{
			this.fadeEffect( '.addToBasketButtonInfo', '' );
		}

	},

	/**
	 * showAddToBasketButtonError()
	 *
	 * @param		void
	 * @return		void
	 */
	showAddToBasketButtonError: function()
	{
		try
		{
			this.fadeEffect( '.addToBasketButtonInfo', 'error' );
		}
		catch( e )
		{
			this.warning( 'showAddToBasketButtonError: ' + e );
		}
	},

	/**
	 * encapsulation of "fade in" effect for messages
	 * @param string strElement
	 * @param string strType
	 */
	fadeEffect: function( strElement, strType )
	{
		var elBasketButtonInfo		= $E( strElement );
		var elBasketButtonInfoText	= $E( 'p', elBasketButtonInfo );
		var fx = elBasketButtonInfo.effects( { duration: 300, transition: Fx.Transitions.linear } );

		elBasketButtonInfo.setStyle( 'opacity', 0.1 );
		elBasketButtonInfo.setStyle( 'display', 'block' );
		elBasketButtonInfo.setStyle( 'top', this.intPosition );

		if( 'error' == strType )
		{
			// write error message from webservice
			elBasketButtonInfoText.setText( this.objBasket.basketStatusMsg );
			elBasketButtonInfo.addClass( 'error' );
		}
		else
		{
			elBasketButtonInfoText.setHTML( this.objBasket.basketStatusMsg );

			// if there previously was an error, remove class
			if( elBasketButtonInfo.hasClass( 'error' ) )
		{
				elBasketButtonInfo.removeClass( 'error' );
		}
		}

		fx.start({
			'opacity': 1,
			'top': [ this.intFXstart ]
		});
	},

	/**
	* readBasket
	**/
	readBasket: function( blnArticleAdded )
	{
		var objRequest = this.createRequestJson();
		objRequest.setAction( 'read' );
		this.fireRequest( objRequest );
	},

	/**
	* readBasketCallback
	**/
	readBasketCallback: function( clientResponse )
	{
		if( true == DMC_System.isInstanceOf( objResponse, NM_ComponentResponseJson ) )
		{
			try
			{
				this.refreshBasket( objResponse.getContent() );
			}
			catch( e )
	{
				this.warning( 'readBasketCallback: ' + e );
							}
			}
	},

	/**
	 * Set start positions for FX transition and message box
	 * @param integer intStart
	 * @param integer intFXstart
	 */
	setFXPositions: function( intStart, intFXstart )
	{
		this.intPosition	= intStart;
		this.intFXstart		= intFXstart;
	},

	/**
	* updateCookie
	**/
	updateCookie: function()
	{
		var objRequest = this.createRequestJson();
		objRequest.setAction( 'update_cookie' );
		this.fireRequest( objRequest );
	},

	/**
	* clearCookie
	**/
	clearCookie: function()
	{
		var objRequest = this.createRequestJson();
		objRequest.setAction( 'clear_cookie' );
		this.fireRequest( objRequest );
	}

} );
