123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457 |
- /// vwf/model/jPlayer.js is a sound driver
- ///
- /// @module vwf/model/jPlayer
- /// @requires vwf/model
- define( [
- "module",
- "vwf/model",
- "vwf/utility",
- "jquery"
- ], function( module, model, utility, $ ) {
- var modelDriver;
- var jPlayerInstanceCreated = false;
- var audioManagerProtoId = "http://vwf.example.com/jplayer/audioManager.vwf";
- var videoManagerProtoId = "http://vwf.example.com/jplayer/videoManager.vwf";
- return model.load( module, {
- // == Module Definition ====================================================================
- // -- initialize ---------------------------------------------------------------------------
- initialize: function( options ) {
-
- modelDriver = this;
- this.arguments = Array.prototype.slice.call( arguments );
- this.options = options || {};
- this.state = {
- "nodes": {},
- "stages": {},
- "prototypes": {},
- "createLocalNode": function( nodeID, childID, childExtendsID, childImplementsIDs,
- childSource, childType, childIndex, childName, callback ) {
- return {
- "parentID": nodeID,
- "ID": childID,
- "extendsID": childExtendsID,
- "implementsIDs": childImplementsIDs,
- "source": childSource,
- "type": childType,
- "name": childName,
- "prototypes": undefined,
- "delayedProperties": undefined,
- "soundObj": undefined,
- "playState": "unloaded",
- "playOnReady": false
- };
- },
- "isAudioManager": function( prototypes ) {
- var found = false;
- if ( prototypes ) {
- for ( var i = 0; i < prototypes.length && !found; i++ ) {
- found = ( prototypes[ i ].indexOf( audioManagerProtoId ) !== -1 );
- }
- }
- return found;
- },
- "isVideoManager": function( prototypes ) {
- var found = false;
- if ( prototypes ) {
- for ( var i = 0; i < prototypes.length && !found; i++ ) {
- found = ( prototypes[ i ].indexOf( videoManagerProtoId ) !== -1 );
- }
- }
- return found;
- }
- };
- // turns on logger debugger console messages
- this.debug = {
- "creation": false,
- "initializing": false,
- "parenting": false,
- "deleting": false,
- "properties": false,
- "setting": false,
- "getting": false,
- "method": false,
- "prototypes": false
- };
- },
- creatingNode: function( nodeID, childID, childExtendsID, childImplementsIDs,
- childSource, childType, childIndex, childName, callback ) {
- if ( this.debug.creation ) {
- this.logger.infox( "creatingNode", nodeID, childID, childExtendsID, childImplementsIDs, childSource, childType, childName );
- }
- // If the node being created is a prototype, construct it and add it to the array of prototypes,
- // and then return
- var prototypeID = utility.ifPrototypeGetId.call( this, this.kernel.application(),
- this.state.prototypes, nodeID, childID );
- if ( prototypeID !== undefined ) {
-
- if ( this.debug.prototypes ) {
- this.logger.infox( "prototype: ", prototypeID );
- }
- this.state.prototypes[ prototypeID ] = {
- parentID: nodeID,
- ID: childID,
- extendsID: childExtendsID,
- implementsID: childImplementsIDs,
- source: childSource,
- type: childType,
- name: childName
- };
- if ( prototypeID.indexOf( audioManagerProtoId ) !== -1 ) {
- this.state.audioManagerProto = this.state.prototypes[ prototypeID ];
- } else if ( prototypeID.indexOf( videoManagerProtoId ) !== -1 ) {
- this.state.videoManagerProto = this.state.prototypes[ prototypeID ];
- }
- return;
- }
- var protos = getPrototypes( this.kernel, childExtendsID );
- var isAudioManager = this.state.isAudioManager( protos );
- var isVideoManager = this.state.isVideoManager( protos );
- if ( isAudioManager || isVideoManager ) {
- // Create the local copy of the node properties
- if ( this.state.nodes[ childID ] === undefined ){
- this.state.nodes[ childID ] = this.state.createLocalNode( nodeID, childID,
- childExtendsID, childImplementsIDs, childSource,
- childType, childIndex, childName, callback );
- }
- node = this.state.nodes[ childID ];
-
- node.prototypes = protos;
- if ( isAudioManager ) {
- node.managerType = "audio";
- setWithPrototypeProperties( this.state.audioManagerProto );
- } else {
- node.managerType = "video";
- setWithPrototypeProperties( this.state.videoManagerProto );
- }
- }
- },
- deletingNode: function( nodeID ) {
-
- if ( this.debug.deleting ) {
- this.logger.infox( "deletingNode", nodeID );
- }
- if ( this.state.nodes[ nodeID ] ) {
- delete this.state.nodes[ nodeID ];
- }
- },
- // -- creatingProperty ---------------------------------------------------------------------
- creatingProperty: function( nodeID, propertyName, propertyValue ) {
- if ( this.debug.properties ) {
- this.logger.infox( "C === creatingProperty ", nodeID, propertyName, propertyValue );
- }
- return this.settingProperty( nodeID, propertyName, propertyValue );
- },
- // -- initializingProperty -----------------------------------------------------------------
- initializingProperty: function( nodeID, propertyName, propertyValue ) {
- if ( this.debug.properties ) {
- this.logger.infox( " I === initializingProperty ", nodeID, propertyName, propertyValue );
- }
- return this.settingProperty( nodeID, propertyName, propertyValue );
-
- },
- // -- settingProperty ----------------------------------------------------------------------
- settingProperty: function( nodeID, propertyName, propertyValue ) {
- if ( this.debug.properties || this.debug.setting ) {
- this.logger.infox( " S === settingProperty ", nodeID, propertyName, propertyValue );
- }
- // Prepare return value
- var value = undefined;
- var node = this.state.nodes[ nodeID ];
-
- if ( node !== undefined ) {
- switch ( propertyName ) {
- case "url":
- setUrl( node, propertyValue );
- value = node.url;
- break;
- case "loop":
- setLoop( node, propertyValue );
- value = node.loop;
- break;
- case "playerDivId":
- if ( propertyValue === node.playerDivId ) {
- break;
- }
- if ( node.playerDivId ) {
- $( "#" + node.playerDivId ).remove();
- }
- node.playerDivId = propertyValue;
- var $existingElement = $( "#" + node.playerDivId );
- if ( $existingElement.length ) {
- node.jPlayerElement = $existingElement;
- } else {
- node.jPlayerElement = $( "<div/>", {
- id: node.playerDivId
- } );
- $( "body" ).append( node.jPlayerElement );
- }
- var fileTypes = ( node.managerType === "audio" ) ? "mp3,wav" : "m4v";
- node.jPlayerElement.jPlayer( {
- ready: function() {
- if ( node.url !== undefined ) {
- setUrl( node, node.url );
- }
- if ( node.loop !== undefined ) {
- setLoop( node, node.loop );
- }
- if ( node.containerDivId !== undefined ) {
- setControlDivId( node, node.containerDivId );
- }
- },
- supplied: fileTypes
- } );
- value = node.playerDivId;
- break;
- case "containerDivId":
- setControlDivId( node, propertyValue );
- value = node.containerDivId;
- break;
- case "posterImageUrl":
- setPosterImageUrl( node, propertyValue );
- value = node.posterImageUrl;
- break;
- default:
- break;
- }
- } else {
- var proto;
- var audioManagerProto = this.state.audioManagerProto;
- var videoManagerProto = this.state.videoManagerProto;
- if ( audioManagerProto && ( nodeID === audioManagerProto.ID ) ) {
- proto = this.state.audioManagerProto;
- } else if ( videoManagerProto && ( nodeID === videoManagerProto.ID ) ) {
- proto = this.state.videoManagerProto;
- }
- if ( proto ) {
- switch ( propertyName ) {
- case "url":
- proto.url = propertyValue;
- value = proto.url;
- break;
- case "loop":
- proto.loop = propertyValue;
- value = proto.loop;
- break;
- case "playerDivId":
- proto.playerDivId = propertyValue;
- value = proto.playerDivId;
- break;
- case "containerDivId":
- proto.containerDivId = propertyValue;
- value = proto.containerDivId;
- break;
- case "posterImageUrl":
- proto.posterImageUrl = propertyValue;
- value = proto.posterImageUrl;
- break;
- default:
- break;
- }
- }
- }
- return value;
- },
- // -- gettingProperty ----------------------------------------------------------------------
- gettingProperty: function( nodeID, propertyName ) {
- if ( this.debug.properties || this.debug.getting ) {
- this.logger.infox( " G === gettingProperty ", nodeID, propertyName );
- }
- var node = this.state.nodes[ nodeID ]; // { name: childName, glgeObject: undefined }
- return node && node[ propertyName ];
- },
- // TODO: deletingMethod
- // -- callingMethod --------------------------------------------------------------------------
- callingMethod: function( nodeID, methodName, methodParameters ) {
- if ( this.debug.method ) {
- this.logger.infox( " G === gettingProperty ", nodeID, propertyName );
- }
- var node = this.state.nodes[ nodeID ];
- if ( !node ) {
- return;
- }
-
- if ( node.jPlayerElement ) {
- switch( methodName ) {
-
- case "play":
- node.jPlayerElement.jPlayer( "play" );
- break;
- case "pause":
- node.jPlayerElement.jPlayer( "pause" );
- break;
- case "stop":
- node.jPlayerElement.jPlayer( "stop" );
- break;
- }
- }
-
- },
- } );
- function getPrototypes( kernel, extendsID ) {
- var prototypes = [];
- var id = extendsID;
- while ( id !== undefined ) {
- prototypes.push( id );
- id = kernel.prototype( id );
- }
-
- return prototypes;
- }
- function setWithPrototypeProperties( proto ) {
- if ( proto.url !== null ) {
- vwf.setProperty( node.ID, "url", proto.url );
- }
- if ( proto.loop !== null ) {
- vwf.setProperty( node.ID, "loop", proto.loop );
- }
- if ( proto.playerDivId !== null ) {
- vwf.setProperty( node.ID, "playerDivId", proto.playerDivId );
- }
- if ( proto.containerDivId !== null ) {
- vwf.setProperty( node.ID, "containerDivId", proto.containerDivId );
- }
- if ( proto.posterImageUrl !== null ) {
- vwf.setProperty( node.ID, "posterImageUrl", proto.posterImageUrl );
- }
- }
- function setUrl( node, url ) {
- node.url = url;
- // If there is no jPlayerElement, there is nothing to do yet so we return.
- // Once the jPlayerElement is created, setUrl will run again using the saved value
- if ( !node.jPlayerElement ) {
- return;
- }
- // If there is a url, set the media for the jPlayer object appropriately
- // Otherwise, clear the media
- if ( url ) {
- // Construct the media object based on the type of file being passed in
- var mediaObject;
- switch ( node.managerType ) {
- case "audio":
- if ( url.search( "data:audio/mp3" ) === 0 ) {
- mediaObject = {
- mp3: url
- };
- } else if ( url.search( "data:audio/wav" ) === 0 ) {
- mediaObject = {
- wav: url
- };
- } else {
- modelDriver.logger.errorx( "setUrl",
- "Unsupported sound type for '", url, "'" );
- }
- break;
- case "video":
- if ( url.search( "data:video/mp4" ) === 0 ) {
- mediaObject = {
- m4v: url,
- poster: node.posterImageUrl
- };
- } else {
- modelDriver.logger.errorx( "setUrl",
- "Unsupported video type for '", url, "'" );
- }
- break;
- default:
- modelDriver.logger.errorx( "setUrl",
- "Unsupported manager type '", node.managerType, "'" );
- break;
- }
- // If we succeeded in creating a media object, set it on the jPlayer object
- // Otherwise, clear the current media
- if ( mediaObject ) {
- node.jPlayerElement.jPlayer( "setMedia", mediaObject );
- } else {
- node.jPlayerElement.jPlayer( "clearMedia" );
- }
- } else {
- node.jPlayerElement.jPlayer( "clearMedia" );
- }
- }
- function setLoop( node, loop ) {
- node.loop = loop;
- if ( node.jPlayerElement ) {
- node.jPlayerElement.jPlayer( "option", { loop: loop } );
- }
- }
- function setControlDivId( node, containerDivId ) {
- node.containerDivId = containerDivId;
- if ( node.jPlayerElement ) {
- node.jPlayerElement.jPlayer( "option", { cssSelectorAncestor: "#" + containerDivId } );
- }
- }
- function setPosterImageUrl( node, posterImageUrl ) {
- node.posterImageUrl = posterImageUrl;
- if ( node.jPlayerElement ) {
- node.jPlayerElement.jPlayer( "setMedia", {
- m4v: node.url,
- poster: posterImageUrl
- } );
- }
- }
- } );
|