
/**
 * MediaURL
 *
 * @requires mediaService_client.js
 */
var MediaURL = (function(window, document, $, bam) {

    // Load action messages
    bam.loadSync( bam.homePath + 'bam.actionMessages.js' );
    var MediaActionMessages = bam.actionMessages;
    MediaActionMessages.LoadMessages("/shared/actionMessages/getjson.jsp?xml=/shared/actionMessages/xml/media.xml");

    var MediaURL,
        mediaServiceSessionKey,
        settings,
        getDeepVal;
        
    bam.loadSync( bam.homePath + 'bam.cookies.js' );
    
    getDeepVal = $.deep;

    // load media service session cookie, if present
	mediaServiceSessionKey = bam.cookies.get('mssk');

    if( !!mediaServiceSessionKey ) {
        mediaServiceSessionKey = unescape( mediaServiceSessionKey );
    } 

    function getDomainAttribute (name, domainAttributes) {
        var attribute = null;

        $.each(domainAttributes, function(i, attr) {
            if (attr.name === name) {
                attribute = attr;
                return false;
            }
        });

        return attribute.value;
    }

    settings = {
		isVerifiedUserRequest : true,
		session_key		      : mediaServiceSessionKey
	};

    MediaURL = {

        messages : MediaActionMessages,

        fetch : function( s ) {
            var config = $.extend( settings, s );

            if( !!mediaServiceSessionKey ) {
                config.session_key = mediaServiceSessionKey;
            }
                
            MediaService.one( 'requestMedia:success', function( event, data ) {
                var url = getDeepVal( data, 'user_verified_event.user_verified_content.user_verified_media_item.url' ),
                    blackout_status = getDeepVal(data, 'user_verified_event.user_verified_content.user_verified_media_item.blackout_status' ),
                    domain_specific_attributes = getDeepVal(data, 'user_verified_event.user_verified_content.domain_specific_attributes.domain_attribute'),
                    source_aspect_ratio;

                // just started a session? let's store the key from the response
				if( !mediaServiceSessionKey && !!data.session_key ) {

					bam.cookies.set({
						name  : 'mssk',
						value : data.session_key,
						path  : '/'
					});

					mediaServiceSessionKey = data.session_key;
				}

                source_aspect_ratio = getDomainAttribute("source_aspect_ratio", domain_specific_attributes);

                config.source_aspect_ratio = (source_aspect_ratio) ? source_aspect_ratio : "HD";

                if( !!blackout_status.blackedOutStatus || !!blackout_status.successStatus ) {

                    MediaURL.trigger( 'fetch:blackout', [ blackout_status, config ] );

                } else {

                    // dispatch the URL to the event, whether it comes back or not. controller should handle appropriately
                    MediaURL.trigger( 'fetch:complete', [ url, config ] );
                }

            }); 

            MediaService.one( 'requestMedia:error', function( event, error ) {
		        var errCode = parseInt( error.code, 10 );
                
		        // clear session key on any error
		        mediaServiceSessionKey = null; 
		        bam.cookies.remove({
                    name : 'mssk',
                    path : '/'
                });

		    	// invalid login credentials, trigger loginRequired event
		    	if( errCode === -3000 ) { 
                    MediaURL.trigger( 'fetch:loginRequired' );

                // non-login error
                // -3500: sign-in restriction
		    	} else if ( errCode < 0 ) {
                    MediaURL.trigger( 'fetch:error', [ error ] );
                }
 
            }); 

            MediaService.requestMedia( config );
        }
    };

    $.bindable( MediaURL );

    return MediaURL;

})(this, this.document, this.jQuery, this.bam);

