mpviewplugins/mpdetailsviewplugin/tsrc/unittest_resources/test-src/publishplayer.js
author hgs
Fri, 23 Jul 2010 17:31:12 -0500
changeset 45 612c4815aebe
parent 35 fdb31ab341af
permissions -rw-r--r--
201029
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35
hgs
parents:
diff changeset
     1
window["ovi"] = window["ovi"] ||
hgs
parents:
diff changeset
     2
{};
hgs
parents:
diff changeset
     3
ovi.player = ovi.player ||
hgs
parents:
diff changeset
     4
{};
hgs
parents:
diff changeset
     5
ovi.player.contextobject = ovi.player.contextobject ||
hgs
parents:
diff changeset
     6
{};
hgs
parents:
diff changeset
     7
hgs
parents:
diff changeset
     8
ovi.player.contextobject.getInstance = function(config) {
hgs
parents:
diff changeset
     9
    var player = {};
hgs
parents:
diff changeset
    10
    player._create = function(options, handler, context) {
hgs
parents:
diff changeset
    11
        var callable = (typeof handler === "function");
hgs
parents:
diff changeset
    12
        if (callable) {
hgs
parents:
diff changeset
    13
            handler.call(context, "CREATE_PENDING");
hgs
parents:
diff changeset
    14
        }
hgs
parents:
diff changeset
    15
        // TODO: add context object to player store
hgs
parents:
diff changeset
    16
        // TODO: store options.miniview to be returned with view as HTML
hgs
parents:
diff changeset
    17
        // TODO: store other properties of options to be returned with view as JSON
hgs
parents:
diff changeset
    18
        // TODO: return uri (unique id in this player's store) in callback
hgs
parents:
diff changeset
    19
    };
hgs
parents:
diff changeset
    20
    player._cancel = function(options, handler, context) {
hgs
parents:
diff changeset
    21
        var callable = (typeof handler === "function");
hgs
parents:
diff changeset
    22
        if (callable) {
hgs
parents:
diff changeset
    23
            handler.call(context, "CANCEL_PENDING");
hgs
parents:
diff changeset
    24
        }
hgs
parents:
diff changeset
    25
        // TODO: cancel pending tasks
hgs
parents:
diff changeset
    26
        // TODO: cancel Player
hgs
parents:
diff changeset
    27
    };
hgs
parents:
diff changeset
    28
    player._delete = function(options, handler, context) {
hgs
parents:
diff changeset
    29
        var callable = (typeof handler === "function");
hgs
parents:
diff changeset
    30
        if (callable) {
hgs
parents:
diff changeset
    31
            handler.call(context, "DELETE_PENDING");
hgs
parents:
diff changeset
    32
        }
hgs
parents:
diff changeset
    33
        // TODO: delete object defined in options.uri from store
hgs
parents:
diff changeset
    34
    };
hgs
parents:
diff changeset
    35
    player._edit = function(options, handler, context) {
hgs
parents:
diff changeset
    36
        var callable = (typeof handler === "function");
hgs
parents:
diff changeset
    37
        if (callable) {
hgs
parents:
diff changeset
    38
            handler.call(context, "EDIT_PENDING");
hgs
parents:
diff changeset
    39
        }
hgs
parents:
diff changeset
    40
        // TODO: update object defined in options.uri
hgs
parents:
diff changeset
    41
    };
hgs
parents:
diff changeset
    42
    player._pick = function(options, handler, context) {
hgs
parents:
diff changeset
    43
        var callable = (typeof handler === "function");
hgs
parents:
diff changeset
    44
        if (callable) {
hgs
parents:
diff changeset
    45
            handler.call(context, "PICK_PENDING");
hgs
parents:
diff changeset
    46
        }
hgs
parents:
diff changeset
    47
        // TODO: return list of all objects, or object defined in options.uri, fork with options.view
hgs
parents:
diff changeset
    48
    };
hgs
parents:
diff changeset
    49
    player._view = function(options, handler, context) {
hgs
parents:
diff changeset
    50
        var callable = (typeof handler === "function");
hgs
parents:
diff changeset
    51
        if (callable) {
hgs
parents:
diff changeset
    52
            handler.call(context, "VIEW_PENDING");
hgs
parents:
diff changeset
    53
        }
hgs
parents:
diff changeset
    54
        // TODO: return object defined in options.uri, JSON if options.view == "none", HTML if "mini"
hgs
parents:
diff changeset
    55
    };
hgs
parents:
diff changeset
    56
    ovi.player._getInstance.call(player, config);
hgs
parents:
diff changeset
    57
};
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
ovi.player.contextobject.Player = ovi.player.contextobject.getInstance;
hgs
parents:
diff changeset
    60
/*
hgs
parents:
diff changeset
    61
 * Basic namespaces & common Player functions
hgs
parents:
diff changeset
    62
 */
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
window["ovi"] = window["ovi"] ||
hgs
parents:
diff changeset
    67
{};
hgs
parents:
diff changeset
    68
ovi.player = ovi.player ||
hgs
parents:
diff changeset
    69
{};
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
/**
hgs
parents:
diff changeset
    74
 * A function for creating a callback chain
hgs
parents:
diff changeset
    75
 * @param {Object} options
hgs
parents:
diff changeset
    76
 * @param {Object} handler
hgs
parents:
diff changeset
    77
 * @param {Object} context
hgs
parents:
diff changeset
    78
 * @return {Function}
hgs
parents:
diff changeset
    79
 */
hgs
parents:
diff changeset
    80
ovi.player._notImplemented = function(functionId) {
hgs
parents:
diff changeset
    81
    return function() {
hgs
parents:
diff changeset
    82
        var status = ovi.player._status;
hgs
parents:
diff changeset
    83
        handler.call(context, status["NOT_IMPLEMENTED"], null);
hgs
parents:
diff changeset
    84
        handler.call(context, status[functionId + "_FAILURE"], null); // TODO: return description, too?
hgs
parents:
diff changeset
    85
    };
hgs
parents:
diff changeset
    86
};
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
/**
hgs
parents:
diff changeset
    91
 * A method for returning an instance of a singleton
hgs
parents:
diff changeset
    92
 * @param {Object} options A configuration object for the player
hgs
parents:
diff changeset
    93
 */
hgs
parents:
diff changeset
    94
ovi.player._getInstance = function(options) {
hgs
parents:
diff changeset
    95
    // TODO: store the configuration options
hgs
parents:
diff changeset
    96
    return (function() {
hgs
parents:
diff changeset
    97
        return (this.instance ||
hgs
parents:
diff changeset
    98
        (function() {
hgs
parents:
diff changeset
    99
            this.instance = {
hgs
parents:
diff changeset
   100
                // Public interface
hgs
parents:
diff changeset
   101
                cancel: (this._cancel || ovi.player._notImplemented("CANCEL")),
hgs
parents:
diff changeset
   102
                create: (this._create || ovi.player._notImplemented("CREATE")),
hgs
parents:
diff changeset
   103
                "delete": (this._delete || ovi.player._notImplemented("DELETE")), // delete is a keyword
hgs
parents:
diff changeset
   104
                edit: (this._edit || ovi.player._notImplemented("EDIT")),
hgs
parents:
diff changeset
   105
                pick: (this._pick || ovi.player._notImplemented("PICK")),
hgs
parents:
diff changeset
   106
                show: (this._view || ovi.player._notImplemented("VIEW")), // show is the same function as view, included in API for compatibility
hgs
parents:
diff changeset
   107
                sync: (this._sync || ovi.player._notImplemented("SYNC")),
hgs
parents:
diff changeset
   108
                view: (this._view || ovi.player._notImplemented("VIEW"))
hgs
parents:
diff changeset
   109
            };
hgs
parents:
diff changeset
   110
            return this.instance;
hgs
parents:
diff changeset
   111
        }()));
hgs
parents:
diff changeset
   112
    }());
hgs
parents:
diff changeset
   113
};
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
ovi.player._status = {
hgs
parents:
diff changeset
   118
    USER_CANCEL: "USER_CANCEL",
hgs
parents:
diff changeset
   119
    
hgs
parents:
diff changeset
   120
    CANCEL_PENDING: "CANCEL_PENDING",
hgs
parents:
diff changeset
   121
    CANCEL_FAILURE: "CANCEL_FAILURE",
hgs
parents:
diff changeset
   122
    CANCEL_SUCCESS: "CANCEL_SUCCESS",
hgs
parents:
diff changeset
   123
    
hgs
parents:
diff changeset
   124
    CREATE_PENDING: "CREATE_PENDING",
hgs
parents:
diff changeset
   125
    CREATE_FAILURE: "CREATE_FAILURE",
hgs
parents:
diff changeset
   126
    CREATE_SUCCESS: "CREATE_SUCCESS",
hgs
parents:
diff changeset
   127
    
hgs
parents:
diff changeset
   128
    DELETE_PENDING: "DELETE_PENDING",
hgs
parents:
diff changeset
   129
    DELETE_FAILURE: "DELETE_FAILURE",
hgs
parents:
diff changeset
   130
    DELETE_SUCCESS: "DELETE_SUCCESS",
hgs
parents:
diff changeset
   131
    
hgs
parents:
diff changeset
   132
    EDIT_PENDING: "EDIT_PENDING",
hgs
parents:
diff changeset
   133
    EDIT_FAILURE: "EDIT_FAILURE",
hgs
parents:
diff changeset
   134
    EDIT_SUCCESS: "EDIT_SUCCESS",
hgs
parents:
diff changeset
   135
    
hgs
parents:
diff changeset
   136
    PICK_PENDING: "PICK_PENDING",
hgs
parents:
diff changeset
   137
    PICK_FAILURE: "PICK_FAILURE",
hgs
parents:
diff changeset
   138
    PICK_SUCCESS: "PICK_SUCCESS",
hgs
parents:
diff changeset
   139
    
hgs
parents:
diff changeset
   140
    SYNC_PENDING: "SYNC_PENDING",
hgs
parents:
diff changeset
   141
    SYNC_FAILURE: "SYNC_FAILURE",
hgs
parents:
diff changeset
   142
    SYNC_SUCCESS: "SYNC_SUCCESS",
hgs
parents:
diff changeset
   143
    SYNC_CONNECT_PENDING: "SYNC_CONNECT_PENDING",
hgs
parents:
diff changeset
   144
    SYNC_CONNECT_FAILED: "SYNC_CONNECT_FAILED",
hgs
parents:
diff changeset
   145
    SYNC_CONNECT_SUCCEEDED: "SYNC_CONNECT_SUCCEEDED",
hgs
parents:
diff changeset
   146
    SYNC_LOGIN_PENDING: "SYNC_LOGIN_PENDING",
hgs
parents:
diff changeset
   147
    SYNC_LOGIN_FAILED: "SYNC_LOGIN_FAILED",
hgs
parents:
diff changeset
   148
    SYNC_LOGIN_SUCCEEDED: "SYNC_LOGIN_SUCCEEDED",
hgs
parents:
diff changeset
   149
    SYNC_UPDATE_PENDING: "SYNC_UPDATE_PENDING",
hgs
parents:
diff changeset
   150
    SYNC_UPDATE_FAILED: "SYNC_UPDATE_FAILED",
hgs
parents:
diff changeset
   151
    SYNC_UPDATE_SUCCEEDED: "SYNC_UPDATE_SUCCEEDED",
hgs
parents:
diff changeset
   152
    
hgs
parents:
diff changeset
   153
    VIEW_PENDING: "VIEW_PENDING",
hgs
parents:
diff changeset
   154
    VIEW_FAILURE: "VIEW_FAILURE",
hgs
parents:
diff changeset
   155
    VIEW_SUCCESS: "VIEW_SUCCESS",
hgs
parents:
diff changeset
   156
    
hgs
parents:
diff changeset
   157
    NOT_IMPLEMENTED: "NOT_IMPLEMENTED"
hgs
parents:
diff changeset
   158
};
hgs
parents:
diff changeset
   159
window["ovi"] = window["ovi"] ||
hgs
parents:
diff changeset
   160
{};
hgs
parents:
diff changeset
   161
ovi.player = ovi.player ||
hgs
parents:
diff changeset
   162
{};
hgs
parents:
diff changeset
   163
ovi.player.publish = ovi.player.publish ||
hgs
parents:
diff changeset
   164
{};
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
ovi.player.publish.getInstance = function(config) {
hgs
parents:
diff changeset
   167
    var player = {};
hgs
parents:
diff changeset
   168
    player._create = function(options, handler, context) {
hgs
parents:
diff changeset
   169
        var callable = (typeof handler === "function");
hgs
parents:
diff changeset
   170
        if (callable) {
hgs
parents:
diff changeset
   171
            handler.call(context, "CREATE_PENDING");
hgs
parents:
diff changeset
   172
        }
hgs
parents:
diff changeset
   173
        // TODO: create UI
hgs
parents:
diff changeset
   174
        // TODO: get the sub-players, sync them
hgs
parents:
diff changeset
   175
    };
hgs
parents:
diff changeset
   176
    player._cancel = function(options, handler, context) {
hgs
parents:
diff changeset
   177
        var callable = (typeof handler === "function");
hgs
parents:
diff changeset
   178
        if (callable) {
hgs
parents:
diff changeset
   179
            handler.call(context, "CANCEL_PENDING");
hgs
parents:
diff changeset
   180
        }
hgs
parents:
diff changeset
   181
        // TODO: cancel sub-players
hgs
parents:
diff changeset
   182
        // TODO: cancel pending tasks
hgs
parents:
diff changeset
   183
        // TODO: cancel Player
hgs
parents:
diff changeset
   184
    };
hgs
parents:
diff changeset
   185
    ovi.player._getInstance.call(player, config);
hgs
parents:
diff changeset
   186
};
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
ovi.player.publish.Player = ovi.player.publish.getInstance;
hgs
parents:
diff changeset
   189
window["ovi"] = (window["ovi"] || {});
hgs
parents:
diff changeset
   190
ovi.player = (ovi.player || {});
hgs
parents:
diff changeset
   191
ovi.player.snc = (ovi.player.snc || {});
hgs
parents:
diff changeset
   192
ovi.player.snc.engine = (ovi.player.snc.engine || {});
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
(function(){
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
    var engine = ovi.player.snc.engine;
hgs
parents:
diff changeset
   198
	
hgs
parents:
diff changeset
   199
	
hgs
parents:
diff changeset
   200
	engine.status = {
hgs
parents:
diff changeset
   201
		SUCCESS : "SUCCESS",
hgs
parents:
diff changeset
   202
		FAILED : "FAILED",
hgs
parents:
diff changeset
   203
	}
hgs
parents:
diff changeset
   204
	
hgs
parents:
diff changeset
   205
	
hgs
parents:
diff changeset
   206
	var _callback = function(status, data, callback, context) {
hgs
parents:
diff changeset
   207
        if (typeof callback == "function") {
hgs
parents:
diff changeset
   208
            callback.call(context, status, data);
hgs
parents:
diff changeset
   209
        }
hgs
parents:
diff changeset
   210
	}
hgs
parents:
diff changeset
   211
    
hgs
parents:
diff changeset
   212
    // External functions	
hgs
parents:
diff changeset
   213
    
hgs
parents:
diff changeset
   214
    /**
hgs
parents:
diff changeset
   215
     * Publish the given object to the social networks.
hgs
parents:
diff changeset
   216
     * @param {Object} object Published data
hgs
parents:
diff changeset
   217
     * @param {String} object.text Free text
hgs
parents:
diff changeset
   218
     * @param {String} object.context.artist Artist name
hgs
parents:
diff changeset
   219
     * @param {String} object.context.title Song title
hgs
parents:
diff changeset
   220
     * @param {Array} object.networks Array of social networks ids where to publish
hgs
parents:
diff changeset
   221
     * @param {Object} [callback] Called when publish is ready.
hgs
parents:
diff changeset
   222
     * @param {Object} [context]
hgs
parents:
diff changeset
   223
     */
hgs
parents:
diff changeset
   224
    engine.publish = function(data, callback, context){
hgs
parents:
diff changeset
   225
        
hgs
parents:
diff changeset
   226
        // Just concatenate some status text from received data
hgs
parents:
diff changeset
   227
        var status = data.text;
hgs
parents:
diff changeset
   228
        
hgs
parents:
diff changeset
   229
		// Add attached objects (temporarily just append to end of text)
hgs
parents:
diff changeset
   230
        // TODO : object.type == "URI" ... etc., add as attachment when supported by SNC 		
hgs
parents:
diff changeset
   231
        if (typeof data.object != "undefined") {
hgs
parents:
diff changeset
   232
	         // Get URL to song before publishing and to status text
hgs
parents:
diff changeset
   233
            var link = data.object.content;
hgs
parents:
diff changeset
   234
            if (link.length > 0) {
hgs
parents:
diff changeset
   235
                status += " - " + link;
hgs
parents:
diff changeset
   236
            }
hgs
parents:
diff changeset
   237
        }
hgs
parents:
diff changeset
   238
		 
hgs
parents:
diff changeset
   239
        // Update to services 		
hgs
parents:
diff changeset
   240
        ovi.activities.updateStatus(status, {networkId: data.networks }, function(response){
hgs
parents:
diff changeset
   241
            
hgs
parents:
diff changeset
   242
			if (response.status == "success") {
hgs
parents:
diff changeset
   243
                _callback(engine.status.SUCCESS, null, callback, context);
hgs
parents:
diff changeset
   244
			}
hgs
parents:
diff changeset
   245
			else {
hgs
parents:
diff changeset
   246
				// TODO : Implement finer error handling
hgs
parents:
diff changeset
   247
				_callback(engine.status.FAILED, { message : "Status update failed" }, callback, context);
hgs
parents:
diff changeset
   248
			}										
hgs
parents:
diff changeset
   249
        });
hgs
parents:
diff changeset
   250
    }
hgs
parents:
diff changeset
   251
hgs
parents:
diff changeset
   252
	/**
hgs
parents:
diff changeset
   253
	 * 
hgs
parents:
diff changeset
   254
	 * @param {Object} data
hgs
parents:
diff changeset
   255
	 * @param {Object} callback
hgs
parents:
diff changeset
   256
	 * @param {Object} context
hgs
parents:
diff changeset
   257
	 */
hgs
parents:
diff changeset
   258
    engine.cancelPublish = function(data, callback, context){
hgs
parents:
diff changeset
   259
		_callback(engine.status.SUCCESS, null, callback, context);
hgs
parents:
diff changeset
   260
    }
hgs
parents:
diff changeset
   261
    
hgs
parents:
diff changeset
   262
	
hgs
parents:
diff changeset
   263
	/**
hgs
parents:
diff changeset
   264
	 * Reload social networks from SNC backend to the local store. Use getServices() to retrieve the 
hgs
parents:
diff changeset
   265
	 * list of loaded services.
hgs
parents:
diff changeset
   266
	 * @param {Object} options Object containing Noa account information. Can be user, password or already
hgs
parents:
diff changeset
   267
	 * autheticated session token to be used. { username : "", password : "" } or { token : "" }
hgs
parents:
diff changeset
   268
	 * @param {Object} callback
hgs
parents:
diff changeset
   269
	 * @param {Object} context
hgs
parents:
diff changeset
   270
	 */
hgs
parents:
diff changeset
   271
    engine.sync = function(options, callback, context) {
hgs
parents:
diff changeset
   272
hgs
parents:
diff changeset
   273
        // TODO : Seperate init and login from sync (we need both for publish also...)
hgs
parents:
diff changeset
   274
hgs
parents:
diff changeset
   275
        // Do service didscovery
hgs
parents:
diff changeset
   276
		
hgs
parents:
diff changeset
   277
        // 1. Init APIs
hgs
parents:
diff changeset
   278
        requests.initOviApi(function(response){
hgs
parents:
diff changeset
   279
        
hgs
parents:
diff changeset
   280
		    if(response.status != engine.status.SUCCESS) {
hgs
parents:
diff changeset
   281
				_callback(engine.status.FAILED, response.data, callback, context);
hgs
parents:
diff changeset
   282
				return;
hgs
parents:
diff changeset
   283
			}
hgs
parents:
diff changeset
   284
		
hgs
parents:
diff changeset
   285
            // 2. Login noa     
hgs
parents:
diff changeset
   286
            requests.noaLogin(options, function(response){
hgs
parents:
diff changeset
   287
hgs
parents:
diff changeset
   288
	            if(response.status != engine.status.SUCCESS) {
hgs
parents:
diff changeset
   289
	                _callback(engine.status.FAILED, { message: response.message }, callback, context);
hgs
parents:
diff changeset
   290
					return;
hgs
parents:
diff changeset
   291
	            }
hgs
parents:
diff changeset
   292
            
hgs
parents:
diff changeset
   293
                // 3. Service discover
hgs
parents:
diff changeset
   294
                requests.discover(function(response){
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
                    // Store to player store
hgs
parents:
diff changeset
   297
					store.clear();
hgs
parents:
diff changeset
   298
					store.append(response.networks);
hgs
parents:
diff changeset
   299
					store.commit(); 
hgs
parents:
diff changeset
   300
					
hgs
parents:
diff changeset
   301
					// Callback function
hgs
parents:
diff changeset
   302
					if (response.status == engine.status.SUCCESS) {
hgs
parents:
diff changeset
   303
                        _callback(engine.status.OK, { networks: response.networks }, callback, context);	
hgs
parents:
diff changeset
   304
					}
hgs
parents:
diff changeset
   305
					else {
hgs
parents:
diff changeset
   306
						_callback(engine.status.FAILED, { message: response.message }, callback, context);
hgs
parents:
diff changeset
   307
					}					
hgs
parents:
diff changeset
   308
                });
hgs
parents:
diff changeset
   309
            });            
hgs
parents:
diff changeset
   310
        });
hgs
parents:
diff changeset
   311
    }		
hgs
parents:
diff changeset
   312
	
hgs
parents:
diff changeset
   313
	/**
hgs
parents:
diff changeset
   314
	 * Get list of services (social networks). Data is loaded from local 
hgs
parents:
diff changeset
   315
	 * player store. To synchronize data social networks from SNC call sync().
hgs
parents:
diff changeset
   316
	 */
hgs
parents:
diff changeset
   317
	engine.getServices = function() {
hgs
parents:
diff changeset
   318
		// Get list of services from store
hgs
parents:
diff changeset
   319
		return store.getList();
hgs
parents:
diff changeset
   320
	}
hgs
parents:
diff changeset
   321
	
hgs
parents:
diff changeset
   322
	/**
hgs
parents:
diff changeset
   323
	 * Mark service as selected / unselected. Saves the selection to the persistent 
hgs
parents:
diff changeset
   324
	 * local storage to save data over sessions.
hgs
parents:
diff changeset
   325
	 * @param {Object} id
hgs
parents:
diff changeset
   326
	 * @param {Object} enable
hgs
parents:
diff changeset
   327
	 */
hgs
parents:
diff changeset
   328
	engine.selectService = function(id, enable) {
hgs
parents:
diff changeset
   329
		// Select / unselect service in player store
hgs
parents:
diff changeset
   330
		store.select(id, enable);		
hgs
parents:
diff changeset
   331
	}
hgs
parents:
diff changeset
   332
		
hgs
parents:
diff changeset
   333
	// Player store	
hgs
parents:
diff changeset
   334
    var STORE_KEY_SERVICES = "ovi.player.snc.services";
hgs
parents:
diff changeset
   335
    var STORE_KEY_SELECTED = "ovi.player.snc.services.selected";	
hgs
parents:
diff changeset
   336
	
hgs
parents:
diff changeset
   337
	/**
hgs
parents:
diff changeset
   338
	 * Player store implementation. Persists the social networks (services) and selections 
hgs
parents:
diff changeset
   339
	 * to the HTML5 local storage, which provides over sessions caching.
hgs
parents:
diff changeset
   340
	 */
hgs
parents:
diff changeset
   341
	var store = {
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
		_services : {},
hgs
parents:
diff changeset
   344
		_selected : {},
hgs
parents:
diff changeset
   345
				
hgs
parents:
diff changeset
   346
        /**
hgs
parents:
diff changeset
   347
         * Add new server or services to the store.
hgs
parents:
diff changeset
   348
         * @param {Object} service
hgs
parents:
diff changeset
   349
         */
hgs
parents:
diff changeset
   350
		append : function(service) {
hgs
parents:
diff changeset
   351
			if (service.length) {
hgs
parents:
diff changeset
   352
	            for(var i=0; i < service.length; i++) {
hgs
parents:
diff changeset
   353
	                var s = service[i];
hgs
parents:
diff changeset
   354
	                this._services[s.id] = s;      
hgs
parents:
diff changeset
   355
	            }
hgs
parents:
diff changeset
   356
			} else {
hgs
parents:
diff changeset
   357
				this._services[service.id] = service;
hgs
parents:
diff changeset
   358
			}
hgs
parents:
diff changeset
   359
		},
hgs
parents:
diff changeset
   360
		
hgs
parents:
diff changeset
   361
		/**
hgs
parents:
diff changeset
   362
		 * Mark service selected or unselected in the store. Also commits changes in 
hgs
parents:
diff changeset
   363
		 * selections to the store.
hgs
parents:
diff changeset
   364
		 * @param {Object} id
hgs
parents:
diff changeset
   365
		 * @param {Object} enable
hgs
parents:
diff changeset
   366
		 */
hgs
parents:
diff changeset
   367
		select : function(id, enable) {
hgs
parents:
diff changeset
   368
			this._selected[id] = enable;
hgs
parents:
diff changeset
   369
			localStorage.setItem(STORE_KEY_SELECTED, JSON.stringify(this._selected));
hgs
parents:
diff changeset
   370
		},
hgs
parents:
diff changeset
   371
		
hgs
parents:
diff changeset
   372
		/**
hgs
parents:
diff changeset
   373
		 * Clear services.
hgs
parents:
diff changeset
   374
		 */
hgs
parents:
diff changeset
   375
	    clear : function() {
hgs
parents:
diff changeset
   376
	   	    this._services = {};
hgs
parents:
diff changeset
   377
	    },
hgs
parents:
diff changeset
   378
		
hgs
parents:
diff changeset
   379
		/**
hgs
parents:
diff changeset
   380
		 * Get list (array) of services in the store.
hgs
parents:
diff changeset
   381
		 */
hgs
parents:
diff changeset
   382
		getList : function() {
hgs
parents:
diff changeset
   383
			// Convert to array
hgs
parents:
diff changeset
   384
			var res = [];
hgs
parents:
diff changeset
   385
			for(var o in this._services) {				
hgs
parents:
diff changeset
   386
				var serv = this._services[o];
hgs
parents:
diff changeset
   387
				serv.selected = typeof this._selected[o] != "undefined" ? this._selected[o] : false;
hgs
parents:
diff changeset
   388
				res.push(serv);
hgs
parents:
diff changeset
   389
			}			
hgs
parents:
diff changeset
   390
			return res;
hgs
parents:
diff changeset
   391
		},
hgs
parents:
diff changeset
   392
		
hgs
parents:
diff changeset
   393
		/**
hgs
parents:
diff changeset
   394
		 * Commit services to the store.
hgs
parents:
diff changeset
   395
		 */
hgs
parents:
diff changeset
   396
		commit : function() {
hgs
parents:
diff changeset
   397
			localStorage.setItem(STORE_KEY_SERVICES, JSON.stringify(this._services));
hgs
parents:
diff changeset
   398
		},
hgs
parents:
diff changeset
   399
		
hgs
parents:
diff changeset
   400
		/**
hgs
parents:
diff changeset
   401
		 * Retrieve services and selections in the store.
hgs
parents:
diff changeset
   402
		 */
hgs
parents:
diff changeset
   403
		load : function() {
hgs
parents:
diff changeset
   404
			this._services = JSON.parse(localStorage.getItem(STORE_KEY_SERVICES));
hgs
parents:
diff changeset
   405
			this._selected = JSON.parse(localStorage.getItem(STORE_KEY_SELECTED));
hgs
parents:
diff changeset
   406
hgs
parents:
diff changeset
   407
			if (this._services == null) this._services = {};
hgs
parents:
diff changeset
   408
			if (this._selected == null) this._selected = {};			
hgs
parents:
diff changeset
   409
		}
hgs
parents:
diff changeset
   410
	}
hgs
parents:
diff changeset
   411
		
hgs
parents:
diff changeset
   412
	
hgs
parents:
diff changeset
   413
    // SNC Request implementation
hgs
parents:
diff changeset
   414
    var requests = {
hgs
parents:
diff changeset
   415
    
hgs
parents:
diff changeset
   416
        /**
hgs
parents:
diff changeset
   417
         *
hgs
parents:
diff changeset
   418
         * @param {Object} callback
hgs
parents:
diff changeset
   419
         */
hgs
parents:
diff changeset
   420
        initOviApi: function(callback){
hgs
parents:
diff changeset
   421
            var myincludes = "ovi.auth.noa_login, ovi.api.snc, ovi.api.activities, ovi.net.xss";
hgs
parents:
diff changeset
   422
            ovi.onReady = function(libs){
hgs
parents:
diff changeset
   423
                if (ovi.testIfLoaded(myincludes, libs)) {
hgs
parents:
diff changeset
   424
                
hgs
parents:
diff changeset
   425
                    // Successful, set environment for NCIM              
hgs
parents:
diff changeset
   426
                    ovi.config.setenv("st-account", "delegate");
hgs
parents:
diff changeset
   427
                    
hgs
parents:
diff changeset
   428
                    // Allow cross-domain scripting
hgs
parents:
diff changeset
   429
                    function xssInitCallback(data){
hgs
parents:
diff changeset
   430
                        if (data.event === "InitializeOk") {
hgs
parents:
diff changeset
   431
                            callback( { status : engine.status.SUCCESS });
hgs
parents:
diff changeset
   432
                        }
hgs
parents:
diff changeset
   433
                    }
hgs
parents:
diff changeset
   434
                    
hgs
parents:
diff changeset
   435
                    ovi.net.XssInit({
hgs
parents:
diff changeset
   436
                        back_url: "http://spb.ci.wipsl.com/ovi-api/js/ovi/net/",
hgs
parents:
diff changeset
   437
                        callback: xssInitCallback
hgs
parents:
diff changeset
   438
                    });
hgs
parents:
diff changeset
   439
                    
hgs
parents:
diff changeset
   440
                }
hgs
parents:
diff changeset
   441
            }
hgs
parents:
diff changeset
   442
            
hgs
parents:
diff changeset
   443
            ovi.include(myincludes);
hgs
parents:
diff changeset
   444
        },
hgs
parents:
diff changeset
   445
        
hgs
parents:
diff changeset
   446
        /**
hgs
parents:
diff changeset
   447
         *
hgs
parents:
diff changeset
   448
         * @param {Object} callback
hgs
parents:
diff changeset
   449
         */
hgs
parents:
diff changeset
   450
        noaLogin: function(options, callback){
hgs
parents:
diff changeset
   451
			
hgs
parents:
diff changeset
   452
			var noa = {};			
hgs
parents:
diff changeset
   453
			if (typeof options.token != "undefined") {   // This propably is not supported yet..
hgs
parents:
diff changeset
   454
				noa = { token : options.token };
hgs
parents:
diff changeset
   455
			}
hgs
parents:
diff changeset
   456
			else {
hgs
parents:
diff changeset
   457
				noa = { username : options.username, password : options.password };
hgs
parents:
diff changeset
   458
			}
hgs
parents:
diff changeset
   459
			
hgs
parents:
diff changeset
   460
			// Login
hgs
parents:
diff changeset
   461
            ovi.noa.login(noa, function(state){
hgs
parents:
diff changeset
   462
				            
hgs
parents:
diff changeset
   463
                // Callback
hgs
parents:
diff changeset
   464
                if (state.status == "success") {
hgs
parents:
diff changeset
   465
                    callback( {
hgs
parents:
diff changeset
   466
						status: engine.status.SUCCESS
hgs
parents:
diff changeset
   467
                    } );
hgs
parents:
diff changeset
   468
                }
hgs
parents:
diff changeset
   469
                else {
hgs
parents:
diff changeset
   470
					callback( {
hgs
parents:
diff changeset
   471
						status: engine.status.FAILED,
hgs
parents:
diff changeset
   472
						message: "NOA login failed - " + state.statusCode + " - " + state.status
hgs
parents:
diff changeset
   473
					} );
hgs
parents:
diff changeset
   474
                }
hgs
parents:
diff changeset
   475
            });
hgs
parents:
diff changeset
   476
        },
hgs
parents:
diff changeset
   477
        
hgs
parents:
diff changeset
   478
        /**
hgs
parents:
diff changeset
   479
         *
hgs
parents:
diff changeset
   480
         * @param {Object} callback
hgs
parents:
diff changeset
   481
         */
hgs
parents:
diff changeset
   482
        discover: function(callback){
hgs
parents:
diff changeset
   483
        
hgs
parents:
diff changeset
   484
            // Discover service available
hgs
parents:
diff changeset
   485
            ovi.snc.discoverSocialNetworks(function(response){
hgs
parents:
diff changeset
   486
            
hgs
parents:
diff changeset
   487
                if (response.status != "success") {
hgs
parents:
diff changeset
   488
                    callback( {
hgs
parents:
diff changeset
   489
						status: engine.status.FAILED,
hgs
parents:
diff changeset
   490
						message : "Service discovery failed - " + response.statusCode + " - " + response.responseText 
hgs
parents:
diff changeset
   491
                    } );
hgs
parents:
diff changeset
   492
                    return;
hgs
parents:
diff changeset
   493
                }
hgs
parents:
diff changeset
   494
				
hgs
parents:
diff changeset
   495
                var netw = response.data.network;
hgs
parents:
diff changeset
   496
                
hgs
parents:
diff changeset
   497
                // And get activated
hgs
parents:
diff changeset
   498
                ovi.snc.getActivatedSocialNetworks(function(response){                    
hgs
parents:
diff changeset
   499
hgs
parents:
diff changeset
   500
                    if (response.status != "success") {
hgs
parents:
diff changeset
   501
	                    callback( {
hgs
parents:
diff changeset
   502
	                        status: engine.status.FAILED,
hgs
parents:
diff changeset
   503
	                        message : "Service discovery failed - " + response.statusCode + " - " + response.responseText 
hgs
parents:
diff changeset
   504
	                    } );
hgs
parents:
diff changeset
   505
												
hgs
parents:
diff changeset
   506
                        return;
hgs
parents:
diff changeset
   507
                    }
hgs
parents:
diff changeset
   508
					else if (response.statusCode == 204) { // Not an error, no active networks
hgs
parents:
diff changeset
   509
                        callback( {
hgs
parents:
diff changeset
   510
                            status: engine.status.SUCCESS,
hgs
parents:
diff changeset
   511
                            networks : [] 
hgs
parents:
diff changeset
   512
                        } );
hgs
parents:
diff changeset
   513
						
hgs
parents:
diff changeset
   514
						return;
hgs
parents:
diff changeset
   515
					}
hgs
parents:
diff changeset
   516
                    
hgs
parents:
diff changeset
   517
					var active = response.data.network;
hgs
parents:
diff changeset
   518
                    
hgs
parents:
diff changeset
   519
                    // Now we have finally the service discovery ready, create final response										
hgs
parents:
diff changeset
   520
					// Remove all not-active networks from supported networks					
hgs
parents:
diff changeset
   521
                    var results = [];					
hgs
parents:
diff changeset
   522
					for(var i=0; i < netw.length; i++) {
hgs
parents:
diff changeset
   523
						var id = netw[i].id;
hgs
parents:
diff changeset
   524
						
hgs
parents:
diff changeset
   525
						for(var j=0; j < active.length; j++) {
hgs
parents:
diff changeset
   526
							if (active[j].id == id) {								
hgs
parents:
diff changeset
   527
								// We have a winner
hgs
parents:
diff changeset
   528
								results.push({ name : netw[i].name, id : netw[i].id, maxTextInput : netw[i].maxTextInput });
hgs
parents:
diff changeset
   529
								break;
hgs
parents:
diff changeset
   530
							}
hgs
parents:
diff changeset
   531
						}
hgs
parents:
diff changeset
   532
					}					
hgs
parents:
diff changeset
   533
                    
hgs
parents:
diff changeset
   534
                    callback( { 
hgs
parents:
diff changeset
   535
					   status: engine.status.SUCCESS, 
hgs
parents:
diff changeset
   536
					   networks : results 
hgs
parents:
diff changeset
   537
                    } );                    
hgs
parents:
diff changeset
   538
                });
hgs
parents:
diff changeset
   539
            });
hgs
parents:
diff changeset
   540
        }
hgs
parents:
diff changeset
   541
    }
hgs
parents:
diff changeset
   542
    
hgs
parents:
diff changeset
   543
	// Restore data from store
hgs
parents:
diff changeset
   544
    store.load();
hgs
parents:
diff changeset
   545
    
hgs
parents:
diff changeset
   546
})();
hgs
parents:
diff changeset
   547
// Create needed namespace ovi.player.share.ui
hgs
parents:
diff changeset
   548
window["ovi"] = window["ovi"] ||
hgs
parents:
diff changeset
   549
{};
hgs
parents:
diff changeset
   550
ovi.player = ovi.player ||
hgs
parents:
diff changeset
   551
{};
hgs
parents:
diff changeset
   552
ovi.player.share = ovi.player.share ||
hgs
parents:
diff changeset
   553
{};
hgs
parents:
diff changeset
   554
ovi.player.share.ui = ovi.player.share.ui ||
hgs
parents:
diff changeset
   555
{};
hgs
parents:
diff changeset
   556
hgs
parents:
diff changeset
   557
/**
hgs
parents:
diff changeset
   558
 * TODO
hgs
parents:
diff changeset
   559
 * 
hgs
parents:
diff changeset
   560
 * This API tries to imitate medos framework UI controls for future compability.
hgs
parents:
diff changeset
   561
 * @param {Object} params
hgs
parents:
diff changeset
   562
 * @param {Object} target
hgs
parents:
diff changeset
   563
 */
hgs
parents:
diff changeset
   564
ovi.player.share.ui.Button = function(params, target) {
hgs
parents:
diff changeset
   565
    
hgs
parents:
diff changeset
   566
	var CLICK_EVENT = "selected";
hgs
parents:
diff changeset
   567
	var that = this;
hgs
parents:
diff changeset
   568
hgs
parents:
diff changeset
   569
    function createHtml() {
hgs
parents:
diff changeset
   570
	    var template = '<button class="ovi_Button ovi_unselectable ovi_clip">' +
hgs
parents:
diff changeset
   571
	       params.text + '</button>';
hgs
parents:
diff changeset
   572
	
hgs
parents:
diff changeset
   573
	    var node = document.createElement("div");  // Do we need this ??
hgs
parents:
diff changeset
   574
	    node.innerHTML = template;
hgs
parents:
diff changeset
   575
		return node;		
hgs
parents:
diff changeset
   576
	}
hgs
parents:
diff changeset
   577
hgs
parents:
diff changeset
   578
    var _root = createHtml();
hgs
parents:
diff changeset
   579
	var _button = _root.firstChild;
hgs
parents:
diff changeset
   580
 
hgs
parents:
diff changeset
   581
    target.appendChild(_root);
hgs
parents:
diff changeset
   582
	
hgs
parents:
diff changeset
   583
	// Interface functions
hgs
parents:
diff changeset
   584
	this.addEventHandler = function(event, callback) {
hgs
parents:
diff changeset
   585
		// selected = click (comes from medos...)		
hgs
parents:
diff changeset
   586
		if (event == CLICK_EVENT) {
hgs
parents:
diff changeset
   587
            _root.addEventListener("click", function(e) { callback.call(that, e); }, that);	
hgs
parents:
diff changeset
   588
		}		 
hgs
parents:
diff changeset
   589
	} 	
hgs
parents:
diff changeset
   590
		
hgs
parents:
diff changeset
   591
    this.setProperty = function(name, value) {
hgs
parents:
diff changeset
   592
		_button[name] = value;
hgs
parents:
diff changeset
   593
	}
hgs
parents:
diff changeset
   594
	
hgs
parents:
diff changeset
   595
    this.getProperty = function(name) {
hgs
parents:
diff changeset
   596
        return _button[name];
hgs
parents:
diff changeset
   597
    }	
hgs
parents:
diff changeset
   598
}
hgs
parents:
diff changeset
   599
// Create needed namespace ovi.player.share.ui
hgs
parents:
diff changeset
   600
window["ovi"] = window["ovi"] ||
hgs
parents:
diff changeset
   601
{};
hgs
parents:
diff changeset
   602
ovi.player = ovi.player ||
hgs
parents:
diff changeset
   603
{};
hgs
parents:
diff changeset
   604
ovi.player.share = ovi.player.share ||
hgs
parents:
diff changeset
   605
{};
hgs
parents:
diff changeset
   606
ovi.player.share.ui = ovi.player.share.ui ||
hgs
parents:
diff changeset
   607
{};
hgs
parents:
diff changeset
   608
hgs
parents:
diff changeset
   609
/**
hgs
parents:
diff changeset
   610
 * Checkbox UI control implementation. TODO
hgs
parents:
diff changeset
   611
 * 
hgs
parents:
diff changeset
   612
 * This API tries to imitate medos framework UI controls for future compability.
hgs
parents:
diff changeset
   613
 * @param {Object} params
hgs
parents:
diff changeset
   614
 * @param {Object} target
hgs
parents:
diff changeset
   615
 */
hgs
parents:
diff changeset
   616
ovi.player.share.ui.CheckBox = function(params, target) {
hgs
parents:
diff changeset
   617
    
hgs
parents:
diff changeset
   618
	var that = this;
hgs
parents:
diff changeset
   619
hgs
parents:
diff changeset
   620
    function createHtml() {
hgs
parents:
diff changeset
   621
		      
hgs
parents:
diff changeset
   622
        var template = '<div class="ovi_CheckBox ovi_unselectable ovi_clip">' +
hgs
parents:
diff changeset
   623
		                  '<input type="checkbox"></input>' +
hgs
parents:
diff changeset
   624
		                  '<span data-bind-text="label">' + params.label + '</span>' +
hgs
parents:
diff changeset
   625
					   '</div>';
hgs
parents:
diff changeset
   626
		
hgs
parents:
diff changeset
   627
	    var node = document.createElement("div");  // Do we need this ??
hgs
parents:
diff changeset
   628
	    node.innerHTML = template;
hgs
parents:
diff changeset
   629
		return node;		
hgs
parents:
diff changeset
   630
	}
hgs
parents:
diff changeset
   631
hgs
parents:
diff changeset
   632
    var _root = createHtml();
hgs
parents:
diff changeset
   633
	var _checkBox = _root.firstChild.firstChild;
hgs
parents:
diff changeset
   634
 
hgs
parents:
diff changeset
   635
    target.appendChild(_root);	
hgs
parents:
diff changeset
   636
	
hgs
parents:
diff changeset
   637
    this.setProperty = function(name, value) {
hgs
parents:
diff changeset
   638
		
hgs
parents:
diff changeset
   639
		if (name == "selected") { // Use medos property name mappings
hgs
parents:
diff changeset
   640
            _checkBox["checked"] = value;	
hgs
parents:
diff changeset
   641
		} 
hgs
parents:
diff changeset
   642
		else {
hgs
parents:
diff changeset
   643
			_checkBox = value;
hgs
parents:
diff changeset
   644
		}        
hgs
parents:
diff changeset
   645
    }
hgs
parents:
diff changeset
   646
	
hgs
parents:
diff changeset
   647
	this.getProperty = function(name) {
hgs
parents:
diff changeset
   648
		if (name == "selected") {
hgs
parents:
diff changeset
   649
			return _checkBox["checked"];
hgs
parents:
diff changeset
   650
		}
hgs
parents:
diff changeset
   651
		return _checkBox[name];
hgs
parents:
diff changeset
   652
	}
hgs
parents:
diff changeset
   653
	
hgs
parents:
diff changeset
   654
	for(var v in params) {
hgs
parents:
diff changeset
   655
		this.setProperty(v, params[v]);
hgs
parents:
diff changeset
   656
	}
hgs
parents:
diff changeset
   657
}
hgs
parents:
diff changeset
   658
// Create needed namespace ovi.player.share.ui
hgs
parents:
diff changeset
   659
window["ovi"] = window["ovi"] ||
hgs
parents:
diff changeset
   660
{};
hgs
parents:
diff changeset
   661
ovi.player = ovi.player ||
hgs
parents:
diff changeset
   662
{};
hgs
parents:
diff changeset
   663
hgs
parents:
diff changeset
   664
hgs
parents:
diff changeset
   665
/**
hgs
parents:
diff changeset
   666
 * Context object player poc implementation
hgs
parents:
diff changeset
   667
 */
hgs
parents:
diff changeset
   668
ovi.player.contextobject = ovi.player.contextobject ||
hgs
parents:
diff changeset
   669
{};
hgs
parents:
diff changeset
   670
hgs
parents:
diff changeset
   671
hgs
parents:
diff changeset
   672
ovi.player.contextobject.Player = function() {
hgs
parents:
diff changeset
   673
	
hgs
parents:
diff changeset
   674
	var targetNS = this;	
hgs
parents:
diff changeset
   675
	targetNS.create = function(params) {
hgs
parents:
diff changeset
   676
		targetNS.object = params;		
hgs
parents:
diff changeset
   677
	}
hgs
parents:
diff changeset
   678
}
hgs
parents:
diff changeset
   679
hgs
parents:
diff changeset
   680
hgs
parents:
diff changeset
   681
hgs
parents:
diff changeset
   682
/**
hgs
parents:
diff changeset
   683
 * Publish player poc implementation 
hgs
parents:
diff changeset
   684
 */
hgs
parents:
diff changeset
   685
ovi.player.publish = ovi.player.publish ||
hgs
parents:
diff changeset
   686
{};
hgs
parents:
diff changeset
   687
hgs
parents:
diff changeset
   688
// Extend the namespace
hgs
parents:
diff changeset
   689
ovi.player.publish.Player = function(params) {
hgs
parents:
diff changeset
   690
hgs
parents:
diff changeset
   691
    // TODO : MAKE THIS SINGLETON SOMEHOW ??
hgs
parents:
diff changeset
   692
    var targetNS = this;    
hgs
parents:
diff changeset
   693
hgs
parents:
diff changeset
   694
    // Utils
hgs
parents:
diff changeset
   695
    var _id = function(id) {
hgs
parents:
diff changeset
   696
        return document.getElementById(id);
hgs
parents:
diff changeset
   697
    };
hgs
parents:
diff changeset
   698
	
hgs
parents:
diff changeset
   699
    var _addClass = function(target, className) {
hgs
parents:
diff changeset
   700
        var classes = target.className;
hgs
parents:
diff changeset
   701
        if (!classes.match(new RegExp("\\b" + className + "\\b"))) {
hgs
parents:
diff changeset
   702
            if (classes != "" && classes.substr(-1) != " ") {
hgs
parents:
diff changeset
   703
                target.className += " ";
hgs
parents:
diff changeset
   704
            }
hgs
parents:
diff changeset
   705
            target.className += className;
hgs
parents:
diff changeset
   706
        }
hgs
parents:
diff changeset
   707
    };
hgs
parents:
diff changeset
   708
    var _removeClass = function(target, className) {
hgs
parents:
diff changeset
   709
        target.className = target.className.replace(new RegExp("\\b" + className + "\\b", "g"), "");
hgs
parents:
diff changeset
   710
        //TODO: clean extra spaces?
hgs
parents:
diff changeset
   711
    
hgs
parents:
diff changeset
   712
    };
hgs
parents:
diff changeset
   713
    var _toggleClass = function(target, className) {
hgs
parents:
diff changeset
   714
        if (target.className.indexOf(className) == -1) {
hgs
parents:
diff changeset
   715
            _addClass(target, className);
hgs
parents:
diff changeset
   716
            return true;
hgs
parents:
diff changeset
   717
        } else {
hgs
parents:
diff changeset
   718
            _removeClass(target, className);
hgs
parents:
diff changeset
   719
            return false;
hgs
parents:
diff changeset
   720
        }
hgs
parents:
diff changeset
   721
        
hgs
parents:
diff changeset
   722
    };
hgs
parents:
diff changeset
   723
    
hgs
parents:
diff changeset
   724
    
hgs
parents:
diff changeset
   725
    
hgs
parents:
diff changeset
   726
    /**
hgs
parents:
diff changeset
   727
     * "State engine"
hgs
parents:
diff changeset
   728
     */
hgs
parents:
diff changeset
   729
    var _state = {
hgs
parents:
diff changeset
   730
        visible: false,
hgs
parents:
diff changeset
   731
        services: {}
hgs
parents:
diff changeset
   732
    };
hgs
parents:
diff changeset
   733
    
hgs
parents:
diff changeset
   734
    
hgs
parents:
diff changeset
   735
    
hgs
parents:
diff changeset
   736
    /**
hgs
parents:
diff changeset
   737
     * HTML templates for ui
hgs
parents:
diff changeset
   738
     */
hgs
parents:
diff changeset
   739
    var _templates = {
hgs
parents:
diff changeset
   740
        // TODO: localization
hgs
parents:
diff changeset
   741
        "share.ui": '<div class="player">\
hgs
parents:
diff changeset
   742
			<div class="panel header">Publish</div>\
hgs
parents:
diff changeset
   743
			<div class="panel panel-message">\
hgs
parents:
diff changeset
   744
				<div class="info hidden" id="comment-limit"><span id="comment-length">0</span>/<span id="comment-maxlength">0</span></div>\
hgs
parents:
diff changeset
   745
				<div class="comment" id="comment-area">\
hgs
parents:
diff changeset
   746
					<div class="hint">Write message here</div>\
hgs
parents:
diff changeset
   747
					<textarea id="message"></textarea>\
hgs
parents:
diff changeset
   748
				</div>\
hgs
parents:
diff changeset
   749
				<hr/><div class="info" id="shared-object"></div><hr/>\
hgs
parents:
diff changeset
   750
			</div>\
hgs
parents:
diff changeset
   751
			<div class="panel networks-panel"><ul class="list checked" id="available-services"></ul></div>\
hgs
parents:
diff changeset
   752
			<div class="panel panel-buttons">\
hgs
parents:
diff changeset
   753
				<ul class="list button-bar">\
hgs
parents:
diff changeset
   754
					<li id="action-ok" class="disabled"><span>OK</span></li>\
hgs
parents:
diff changeset
   755
					<li id="action-cancel"><span>Cancel</span></li>\
hgs
parents:
diff changeset
   756
				</ul>\
hgs
parents:
diff changeset
   757
			</div>\
hgs
parents:
diff changeset
   758
		</div>'
hgs
parents:
diff changeset
   759
    };
hgs
parents:
diff changeset
   760
    
hgs
parents:
diff changeset
   761
    
hgs
parents:
diff changeset
   762
    
hgs
parents:
diff changeset
   763
    /**
hgs
parents:
diff changeset
   764
     * Generic callback invoker
hgs
parents:
diff changeset
   765
     *
hgs
parents:
diff changeset
   766
     * @param {Object} notification
hgs
parents:
diff changeset
   767
     * @param {Object} data
hgs
parents:
diff changeset
   768
     * @param {Object} callback
hgs
parents:
diff changeset
   769
     * @param {Object} context
hgs
parents:
diff changeset
   770
     */
hgs
parents:
diff changeset
   771
    var _callback = function(notification, data, callback, context) {
hgs
parents:
diff changeset
   772
        if (typeof callback == "function") {
hgs
parents:
diff changeset
   773
            callback.call(context, notification, data);
hgs
parents:
diff changeset
   774
        }
hgs
parents:
diff changeset
   775
    };
hgs
parents:
diff changeset
   776
    
hgs
parents:
diff changeset
   777
    
hgs
parents:
diff changeset
   778
    
hgs
parents:
diff changeset
   779
    /**
hgs
parents:
diff changeset
   780
     * status messages
hgs
parents:
diff changeset
   781
     */
hgs
parents:
diff changeset
   782
    var _status = {
hgs
parents:
diff changeset
   783
    
hgs
parents:
diff changeset
   784
        show: "SHOW",
hgs
parents:
diff changeset
   785
        show_ok: "SHOW_SUCCEEDED",
hgs
parents:
diff changeset
   786
        show_fail: "SHOW_FAILED",
hgs
parents:
diff changeset
   787
        
hgs
parents:
diff changeset
   788
        updateobject: "UPDATEOBJECT",
hgs
parents:
diff changeset
   789
        updateobject_ok: "UPDATEOBJECT_SUCCEEDED",
hgs
parents:
diff changeset
   790
        updateobject_fail: "UPDATEOBJECT_FAILED",
hgs
parents:
diff changeset
   791
        
hgs
parents:
diff changeset
   792
        updateservices: "UPDATESERVICES",
hgs
parents:
diff changeset
   793
        updateservices_ok: "UPDATESERVICES_SUCCEEDED",
hgs
parents:
diff changeset
   794
        updateservices_fail: "UPDATESERVICES_FAILED",
hgs
parents:
diff changeset
   795
		updateservices_nonetworks : "UPDATESERVICES_NONETWORKS"
hgs
parents:
diff changeset
   796
    
hgs
parents:
diff changeset
   797
    };
hgs
parents:
diff changeset
   798
    
hgs
parents:
diff changeset
   799
    
hgs
parents:
diff changeset
   800
    
hgs
parents:
diff changeset
   801
    /**
hgs
parents:
diff changeset
   802
     * Invokes the ui for the player
hgs
parents:
diff changeset
   803
     *
hgs
parents:
diff changeset
   804
     * @param {Object} [options]
hgs
parents:
diff changeset
   805
     * @param {Object} [options.target] the dom node or id where the ui should be inserted
hgs
parents:
diff changeset
   806
     * @param {Object} [options.template] the html for the ui
hgs
parents:
diff changeset
   807
     * @param {Object} [callback]
hgs
parents:
diff changeset
   808
     * @param {Object} [context]
hgs
parents:
diff changeset
   809
     */
hgs
parents:
diff changeset
   810
    var _show = function(options, callback, context) {
hgs
parents:
diff changeset
   811
    
hgs
parents:
diff changeset
   812
        var target = (options && options.target) || _id("ovi.player.share.ui"), template = (options && options.template) || _templates["share.ui"];
hgs
parents:
diff changeset
   813
hgs
parents:
diff changeset
   814
        // Find target node if id was given
hgs
parents:
diff changeset
   815
        if (typeof target == "string") {
hgs
parents:
diff changeset
   816
            target = _id(_target);
hgs
parents:
diff changeset
   817
        }
hgs
parents:
diff changeset
   818
        if (target) {
hgs
parents:
diff changeset
   819
            if (template) {
hgs
parents:
diff changeset
   820
                if (_state.visible && target.innerHTML.indexOf('"player"') >= 0) {
hgs
parents:
diff changeset
   821
                    // _show was already called earlier, and player is shown
hgs
parents:
diff changeset
   822
                    _callback(_status.show, {
hgs
parents:
diff changeset
   823
                        message: "Player is already visible"
hgs
parents:
diff changeset
   824
                    }, callback, context);
hgs
parents:
diff changeset
   825
                } else {
hgs
parents:
diff changeset
   826
                    target.innerHTML = template;
hgs
parents:
diff changeset
   827
                    
hgs
parents:
diff changeset
   828
                    // add handler for textarea
hgs
parents:
diff changeset
   829
                    var message = _id("message");
hgs
parents:
diff changeset
   830
                    _id("message").onkeyup = _handleMessageChange;
hgs
parents:
diff changeset
   831
                    message.style.backgroundColor = "transparent";
hgs
parents:
diff changeset
   832
                    
hgs
parents:
diff changeset
   833
                    // add handlers for buttons
hgs
parents:
diff changeset
   834
                    _id("action-ok").onclick = _handleSubmit;
hgs
parents:
diff changeset
   835
                    _id("action-cancel").onclick = _handleSubmit;
hgs
parents:
diff changeset
   836
                    
hgs
parents:
diff changeset
   837
                    // Update state
hgs
parents:
diff changeset
   838
                    _state.visible = true;
hgs
parents:
diff changeset
   839
                    _callback(_status.show_ok, null, callback, context);
hgs
parents:
diff changeset
   840
                }
hgs
parents:
diff changeset
   841
            } else {
hgs
parents:
diff changeset
   842
                _callback(_status.show_fail, {
hgs
parents:
diff changeset
   843
                    message: "Template not found",
hgs
parents:
diff changeset
   844
                    data: {
hgs
parents:
diff changeset
   845
                        template: template
hgs
parents:
diff changeset
   846
                    }
hgs
parents:
diff changeset
   847
                }, callback, context);
hgs
parents:
diff changeset
   848
            }
hgs
parents:
diff changeset
   849
        } else {
hgs
parents:
diff changeset
   850
            _callback(_status.show_fail, {
hgs
parents:
diff changeset
   851
                message: "Target container not found",
hgs
parents:
diff changeset
   852
                data: {
hgs
parents:
diff changeset
   853
                    target: target
hgs
parents:
diff changeset
   854
                }
hgs
parents:
diff changeset
   855
            }, callback, context);
hgs
parents:
diff changeset
   856
        }
hgs
parents:
diff changeset
   857
		
hgs
parents:
diff changeset
   858
		onResize();   // Initial resize
hgs
parents:
diff changeset
   859
		
hgs
parents:
diff changeset
   860
		// If we would like to show the services stored in local storage, uncommenting the following would do 
hgs
parents:
diff changeset
   861
		// the job..
hgs
parents:
diff changeset
   862
		/*
hgs
parents:
diff changeset
   863
		var services = ovi.player.share.engine.getServices();
hgs
parents:
diff changeset
   864
		targetNS.updateServices(services);*/ 		
hgs
parents:
diff changeset
   865
    };
hgs
parents:
diff changeset
   866
    
hgs
parents:
diff changeset
   867
    /**
hgs
parents:
diff changeset
   868
     * Removes all the handlers from the ui and the ui
hgs
parents:
diff changeset
   869
     *
hgs
parents:
diff changeset
   870
     * @param {Object} options
hgs
parents:
diff changeset
   871
     * @param {Object} callback
hgs
parents:
diff changeset
   872
     * @param {Object} context
hgs
parents:
diff changeset
   873
     */
hgs
parents:
diff changeset
   874
    var _teardown = function(options, callback, context) {
hgs
parents:
diff changeset
   875
        //TODO: clear handlers
hgs
parents:
diff changeset
   876
        //TODO: destroy html
hgs
parents:
diff changeset
   877
        //TODO: update status
hgs
parents:
diff changeset
   878
    };
hgs
parents:
diff changeset
   879
hgs
parents:
diff changeset
   880
    
hgs
parents:
diff changeset
   881
    var _updateServices = function(data, callback, context) {
hgs
parents:
diff changeset
   882
    
hgs
parents:
diff changeset
   883
        var target = _id("available-services");
hgs
parents:
diff changeset
   884
        
hgs
parents:
diff changeset
   885
        if (target) {
hgs
parents:
diff changeset
   886
            if (data.length) {
hgs
parents:
diff changeset
   887
                var listToCheck = [], i;
hgs
parents:
diff changeset
   888
                // TODO: add loading animation?
hgs
parents:
diff changeset
   889
                for (i = 0; i < data.length; i++) {
hgs
parents:
diff changeset
   890
                    var id = data[i].id, label = data[i].name;
hgs
parents:
diff changeset
   891
                    if (id && label) {
hgs
parents:
diff changeset
   892
                        id = "service-" + id;
hgs
parents:
diff changeset
   893
                        listToCheck.push(id);
hgs
parents:
diff changeset
   894
                        if (!_id(id)) {
hgs
parents:
diff changeset
   895
                            // We don't have the network in our list yet, create one
hgs
parents:
diff changeset
   896
                            var item = document.createElement("LI"), checkbox = document.createElement("SPAN");
hgs
parents:
diff changeset
   897
                            checkbox.setAttribute("class", "checkbox");
hgs
parents:
diff changeset
   898
                            checkbox.appendChild(document.createTextNode(label));
hgs
parents:
diff changeset
   899
                            item.appendChild(checkbox);
hgs
parents:
diff changeset
   900
                            item.setAttribute("id", id);
hgs
parents:
diff changeset
   901
                            item.onclick = _handleServiceListClick;
hgs
parents:
diff changeset
   902
                            target.appendChild(item);
hgs
parents:
diff changeset
   903
                            // store object to the state
hgs
parents:
diff changeset
   904
							if (data[i].selected) {
hgs
parents:
diff changeset
   905
                                data[i].checked = _toggleClass(item, "checked");
hgs
parents:
diff changeset
   906
							}							
hgs
parents:
diff changeset
   907
                            _state.services[id] = data[i];
hgs
parents:
diff changeset
   908
                        }
hgs
parents:
diff changeset
   909
                    } else {
hgs
parents:
diff changeset
   910
                        _callback(_status.updateservices, {
hgs
parents:
diff changeset
   911
                            message: "Service object formatted badly",
hgs
parents:
diff changeset
   912
                            data: data[i]
hgs
parents:
diff changeset
   913
                        }, callback, context);
hgs
parents:
diff changeset
   914
                    }
hgs
parents:
diff changeset
   915
                }
hgs
parents:
diff changeset
   916
                //make a searchable string
hgs
parents:
diff changeset
   917
                listToCheck = listToCheck.join();
hgs
parents:
diff changeset
   918
                //remove obsolete networks
hgs
parents:
diff changeset
   919
                for (i = 0; i < target.childNodes.length; i++) {
hgs
parents:
diff changeset
   920
                    var node = target.childNodes[i], id = node.getAttribute("id");
hgs
parents:
diff changeset
   921
                    if (listToCheck.indexOf(id) == -1) {
hgs
parents:
diff changeset
   922
                        node.onclick = null;
hgs
parents:
diff changeset
   923
                        target.removeChild(node);
hgs
parents:
diff changeset
   924
                    }
hgs
parents:
diff changeset
   925
                    // TODO: update _state?
hgs
parents:
diff changeset
   926
                }
hgs
parents:
diff changeset
   927
				_updateServiceLimits();
hgs
parents:
diff changeset
   928
                _callback(_status.updateservices_ok, null, callback, context);				
hgs
parents:
diff changeset
   929
            } else {
hgs
parents:
diff changeset
   930
                _callback(_status.updateservices_fail, {
hgs
parents:
diff changeset
   931
                    message: "Received data was not an array",
hgs
parents:
diff changeset
   932
                    data: data
hgs
parents:
diff changeset
   933
                }, callback, context);
hgs
parents:
diff changeset
   934
            }
hgs
parents:
diff changeset
   935
        } else {
hgs
parents:
diff changeset
   936
            _callback(_status.updateservices_fail, {
hgs
parents:
diff changeset
   937
                message: "Target container not found"
hgs
parents:
diff changeset
   938
            }, callback, context);
hgs
parents:
diff changeset
   939
        }
hgs
parents:
diff changeset
   940
    };
hgs
parents:
diff changeset
   941
    
hgs
parents:
diff changeset
   942
    /**
hgs
parents:
diff changeset
   943
     * Handler for message changes
hgs
parents:
diff changeset
   944
     * @param {Object} e
hgs
parents:
diff changeset
   945
     */
hgs
parents:
diff changeset
   946
    var _handleMessageChange = function(e) {
hgs
parents:
diff changeset
   947
        _id("comment-length").innerHTML = this.value.length;
hgs
parents:
diff changeset
   948
        _checkMessageLength();
hgs
parents:
diff changeset
   949
    }
hgs
parents:
diff changeset
   950
    
hgs
parents:
diff changeset
   951
    
hgs
parents:
diff changeset
   952
    
hgs
parents:
diff changeset
   953
    /**
hgs
parents:
diff changeset
   954
     * Handler for service selection
hgs
parents:
diff changeset
   955
     * @param {Object} e
hgs
parents:
diff changeset
   956
     */
hgs
parents:
diff changeset
   957
    var _handleServiceListClick = function(e) {
hgs
parents:
diff changeset
   958
        _state.services[this.id].checked = _toggleClass(this, "checked");
hgs
parents:
diff changeset
   959
		ovi.player.snc.engine.selectService(_state.services[this.id].id, _state.services[this.id].checked);
hgs
parents:
diff changeset
   960
        _updateServiceLimits();
hgs
parents:
diff changeset
   961
    };
hgs
parents:
diff changeset
   962
    
hgs
parents:
diff changeset
   963
    
hgs
parents:
diff changeset
   964
    
hgs
parents:
diff changeset
   965
    /**
hgs
parents:
diff changeset
   966
     * Check limits and if the OK button can be clicked
hgs
parents:
diff changeset
   967
     */
hgs
parents:
diff changeset
   968
    var _updateServiceLimits = function() {
hgs
parents:
diff changeset
   969
        var bigNumber = 9999999, maxTextInput = bigNumber, min = Math.min, services = _state.services, service;
hgs
parents:
diff changeset
   970
        for (sid in services) {
hgs
parents:
diff changeset
   971
            service = services[sid];
hgs
parents:
diff changeset
   972
            if (service.checked && service.maxTextInput && service.maxTextInput > 0) {
hgs
parents:
diff changeset
   973
                maxTextInput = min(maxTextInput, service.maxTextInput);
hgs
parents:
diff changeset
   974
            }
hgs
parents:
diff changeset
   975
        }
hgs
parents:
diff changeset
   976
		
hgs
parents:
diff changeset
   977
        if (maxTextInput < bigNumber) {
hgs
parents:
diff changeset
   978
            // Reduce the link and context reserved size from input (data that will be allocated 
hgs
parents:
diff changeset
   979
			// from maxTextInput for context)
hgs
parents:
diff changeset
   980
			var contextData = _state.contextPlayer.object.data;
hgs
parents:
diff changeset
   981
            maxTextInput -= contextData.object.reservedLength;
hgs
parents:
diff changeset
   982
			     			
hgs
parents:
diff changeset
   983
            _id("comment-maxlength").innerHTML = maxTextInput;
hgs
parents:
diff changeset
   984
            _removeClass(_id("comment-limit"), "hidden");
hgs
parents:
diff changeset
   985
            //TODO: alter size of elements to make space for the limit?
hgs
parents:
diff changeset
   986
        } else {
hgs
parents:
diff changeset
   987
            _id("comment-maxlength").innerHTML = maxTextInput;
hgs
parents:
diff changeset
   988
            _addClass(_id("comment-limit"), "hidden");
hgs
parents:
diff changeset
   989
        }
hgs
parents:
diff changeset
   990
        _checkMessageLength();
hgs
parents:
diff changeset
   991
    };
hgs
parents:
diff changeset
   992
    
hgs
parents:
diff changeset
   993
    
hgs
parents:
diff changeset
   994
    
hgs
parents:
diff changeset
   995
    var _checkMessageLength = function() {
hgs
parents:
diff changeset
   996
        var length = parseInt(_id("comment-length").innerHTML), maxLength = parseInt(_id("comment-maxlength").innerHTML), message = _id("message");
hgs
parents:
diff changeset
   997
        if (length == 0) {
hgs
parents:
diff changeset
   998
            message.style.backgroundColor = "transparent";
hgs
parents:
diff changeset
   999
        } else {
hgs
parents:
diff changeset
  1000
            message.style.backgroundColor = "";
hgs
parents:
diff changeset
  1001
        }
hgs
parents:
diff changeset
  1002
        if ((maxLength > 0) && (length > maxLength)) {
hgs
parents:
diff changeset
  1003
            _addClass(_id("comment-limit"), "error");
hgs
parents:
diff changeset
  1004
            _addClass(message, "error");
hgs
parents:
diff changeset
  1005
        } else {
hgs
parents:
diff changeset
  1006
            _removeClass(_id("comment-limit"), "error");
hgs
parents:
diff changeset
  1007
            _removeClass(message, "error");
hgs
parents:
diff changeset
  1008
        }
hgs
parents:
diff changeset
  1009
        _updateActions();
hgs
parents:
diff changeset
  1010
    };
hgs
parents:
diff changeset
  1011
    
hgs
parents:
diff changeset
  1012
    
hgs
parents:
diff changeset
  1013
    
hgs
parents:
diff changeset
  1014
    var _updateActions = function() {
hgs
parents:
diff changeset
  1015
        if (_canSubmit()) {
hgs
parents:
diff changeset
  1016
            _removeClass(_id("action-ok"), "disabled");
hgs
parents:
diff changeset
  1017
        } else {
hgs
parents:
diff changeset
  1018
            _addClass(_id("action-ok"), "disabled");
hgs
parents:
diff changeset
  1019
        }
hgs
parents:
diff changeset
  1020
    };
hgs
parents:
diff changeset
  1021
    var _canSubmit = function() {
hgs
parents:
diff changeset
  1022
        var length = parseInt(_id("comment-length").innerHTML), maxLength = parseInt(_id("comment-maxlength").innerHTML), services = _state.services, service;
hgs
parents:
diff changeset
  1023
        if ((maxLength > 0) && (length > maxLength)) {
hgs
parents:
diff changeset
  1024
            return false;
hgs
parents:
diff changeset
  1025
        }
hgs
parents:
diff changeset
  1026
        for (sid in services) {
hgs
parents:
diff changeset
  1027
            service = services[sid];
hgs
parents:
diff changeset
  1028
            if (service.checked && service.maxTextInput && service.maxTextInput > 0) {
hgs
parents:
diff changeset
  1029
                return true;
hgs
parents:
diff changeset
  1030
            }
hgs
parents:
diff changeset
  1031
        }
hgs
parents:
diff changeset
  1032
        return false;
hgs
parents:
diff changeset
  1033
    }
hgs
parents:
diff changeset
  1034
    
hgs
parents:
diff changeset
  1035
    
hgs
parents:
diff changeset
  1036
    var _handleSubmit = function(e) {
hgs
parents:
diff changeset
  1037
        // don't accept clicks from elements with class "disabled"
hgs
parents:
diff changeset
  1038
        if (/\bdisabled\b/.test(this.className)) {
hgs
parents:
diff changeset
  1039
            return;
hgs
parents:
diff changeset
  1040
        }
hgs
parents:
diff changeset
  1041
        if (this.id == "action-ok") {
hgs
parents:
diff changeset
  1042
            _addClass(this, "disabled");
hgs
parents:
diff changeset
  1043
            _addClass(_id("action-cancel"), "disabled");
hgs
parents:
diff changeset
  1044
            //TODO: disable testarea and service list?
hgs
parents:
diff changeset
  1045
            
hgs
parents:
diff changeset
  1046
            var services = _state.services, service, networks = [];
hgs
parents:
diff changeset
  1047
            for (sid in services) {
hgs
parents:
diff changeset
  1048
                service = services[sid];
hgs
parents:
diff changeset
  1049
                if (service.checked) {
hgs
parents:
diff changeset
  1050
                    networks.push(service.id);
hgs
parents:
diff changeset
  1051
                }
hgs
parents:
diff changeset
  1052
            }
hgs
parents:
diff changeset
  1053
			
hgs
parents:
diff changeset
  1054
			var contextData = _state.contextPlayer.object.data;
hgs
parents:
diff changeset
  1055
			
hgs
parents:
diff changeset
  1056
            var data = {
hgs
parents:
diff changeset
  1057
                text: _id("message").value,				
hgs
parents:
diff changeset
  1058
                object : contextData.object,
hgs
parents:
diff changeset
  1059
                networks: networks
hgs
parents:
diff changeset
  1060
            };
hgs
parents:
diff changeset
  1061
			
hgs
parents:
diff changeset
  1062
            ovi.player.snc.engine.publish(data, function(status, data) {
hgs
parents:
diff changeset
  1063
				if (status == ovi.player.snc.engine.status.FAILED) {
hgs
parents:
diff changeset
  1064
					alert(data.message);
hgs
parents:
diff changeset
  1065
				}
hgs
parents:
diff changeset
  1066
                _reset();
hgs
parents:
diff changeset
  1067
            });
hgs
parents:
diff changeset
  1068
            // TODO: call window.close here? teardown first? window.close in teardown?
hgs
parents:
diff changeset
  1069
        } else {
hgs
parents:
diff changeset
  1070
            ovi.player.snc.engine.cancelPublish(null, function(status, data) {
hgs
parents:
diff changeset
  1071
                _reset();
hgs
parents:
diff changeset
  1072
            });
hgs
parents:
diff changeset
  1073
        }
hgs
parents:
diff changeset
  1074
    };
hgs
parents:
diff changeset
  1075
    
hgs
parents:
diff changeset
  1076
    var _reset = function() {
hgs
parents:
diff changeset
  1077
        _id("shared-object").innerHTML = "";
hgs
parents:
diff changeset
  1078
        _id("message").value = "";
hgs
parents:
diff changeset
  1079
		_handleMessageChange.call(_id("message"));
hgs
parents:
diff changeset
  1080
        _removeClass(_id("action-cancel"), "disabled");
hgs
parents:
diff changeset
  1081
		
hgs
parents:
diff changeset
  1082
		// Request window to be closed
hgs
parents:
diff changeset
  1083
		window.close();		
hgs
parents:
diff changeset
  1084
    };
hgs
parents:
diff changeset
  1085
    
hgs
parents:
diff changeset
  1086
	var _sync = function(contextPlayer, handler, context) {    
hgs
parents:
diff changeset
  1087
        // Sync context to UI
hgs
parents:
diff changeset
  1088
        _state.contextPlayer = contextPlayer; // Store context object for publishing
hgs
parents:
diff changeset
  1089
        _id("shared-object").innerHTML = _state.contextPlayer.object.data.miniview;          
hgs
parents:
diff changeset
  1090
    }	
hgs
parents:
diff changeset
  1091
	
hgs
parents:
diff changeset
  1092
	
hgs
parents:
diff changeset
  1093
	var _sncInit = function(credentials, handler, context) {
hgs
parents:
diff changeset
  1094
        // Sync SNC stuff
hgs
parents:
diff changeset
  1095
        ovi.player.snc.engine.sync(credentials.token, function(status, data) {
hgs
parents:
diff changeset
  1096
            if (status == ovi.player.snc.engine.status.FAILED) {
hgs
parents:
diff changeset
  1097
                _callback(_status.updateservices_fail, 
hgs
parents:
diff changeset
  1098
				    { message: data.message }, 
hgs
parents:
diff changeset
  1099
					handler, context);				    
hgs
parents:
diff changeset
  1100
            }
hgs
parents:
diff changeset
  1101
            else if (data.networks.length == 0) {
hgs
parents:
diff changeset
  1102
                _callback(_status.updateservices_nonetworks, 
hgs
parents:
diff changeset
  1103
				          { message: "No networks" }, 
hgs
parents:
diff changeset
  1104
						  handler, context);
hgs
parents:
diff changeset
  1105
            }
hgs
parents:
diff changeset
  1106
            else {
hgs
parents:
diff changeset
  1107
                var services = ovi.player.snc.engine.getServices();
hgs
parents:
diff changeset
  1108
                _updateServices(services, handler, context); 
hgs
parents:
diff changeset
  1109
            }               
hgs
parents:
diff changeset
  1110
        } );           		
hgs
parents:
diff changeset
  1111
	}
hgs
parents:
diff changeset
  1112
		   
hgs
parents:
diff changeset
  1113
hgs
parents:
diff changeset
  1114
hgs
parents:
diff changeset
  1115
    // Register onResize for landscape / portrait mode changes
hgs
parents:
diff changeset
  1116
    window.addEventListener("resize", onResize, true);
hgs
parents:
diff changeset
  1117
    
hgs
parents:
diff changeset
  1118
    function onResize(e) {
hgs
parents:
diff changeset
  1119
        
hgs
parents:
diff changeset
  1120
        function isLandscape(){
hgs
parents:
diff changeset
  1121
            return window.innerWidth > window.innerHeight;
hgs
parents:
diff changeset
  1122
        }   
hgs
parents:
diff changeset
  1123
		
hgs
parents:
diff changeset
  1124
		function _setMode(mode) {
hgs
parents:
diff changeset
  1125
            _changeMode(_id("comment-area"), mode);
hgs
parents:
diff changeset
  1126
            
hgs
parents:
diff changeset
  1127
            var services = _id("available-services").children;                      
hgs
parents:
diff changeset
  1128
            for(var i=0; i < services.length; i++) {
hgs
parents:
diff changeset
  1129
                _changeMode(services[i], mode);  
hgs
parents:
diff changeset
  1130
            }           			
hgs
parents:
diff changeset
  1131
		}
hgs
parents:
diff changeset
  1132
		        
hgs
parents:
diff changeset
  1133
        // Determine - landscape or portrait mode
hgs
parents:
diff changeset
  1134
        if (isLandscape()) {		
hgs
parents:
diff changeset
  1135
			_setMode("landscape");						
hgs
parents:
diff changeset
  1136
        }
hgs
parents:
diff changeset
  1137
        else {
hgs
parents:
diff changeset
  1138
            _setMode("portrait");			
hgs
parents:
diff changeset
  1139
        }       
hgs
parents:
diff changeset
  1140
    }
hgs
parents:
diff changeset
  1141
	
hgs
parents:
diff changeset
  1142
	function _changeMode(id, mode) {
hgs
parents:
diff changeset
  1143
		if (mode == "portrait") {
hgs
parents:
diff changeset
  1144
            _removeClass(id, "landscape");
hgs
parents:
diff changeset
  1145
			_addClass(id, "portrait");				
hgs
parents:
diff changeset
  1146
		} else {
hgs
parents:
diff changeset
  1147
            _removeClass(id, "portrait");
hgs
parents:
diff changeset
  1148
			_addClass(id, "landscape");              			
hgs
parents:
diff changeset
  1149
		}	   	
hgs
parents:
diff changeset
  1150
	}
hgs
parents:
diff changeset
  1151
	
hgs
parents:
diff changeset
  1152
    /**
hgs
parents:
diff changeset
  1153
     * Assign needed functions to the target namespace => defined public API.
hgs
parents:
diff changeset
  1154
     */
hgs
parents:
diff changeset
  1155
    targetNS.view = _show;
hgs
parents:
diff changeset
  1156
    targetNS.teardown = _teardown;
hgs
parents:
diff changeset
  1157
    targetNS.reset = _reset;    
hgs
parents:
diff changeset
  1158
    
hgs
parents:
diff changeset
  1159
    /**
hgs
parents:
diff changeset
  1160
     * Synchronize context data from context object
hgs
parents:
diff changeset
  1161
     */
hgs
parents:
diff changeset
  1162
    targetNS.sync = _sync;
hgs
parents:
diff changeset
  1163
    
hgs
parents:
diff changeset
  1164
    /**
hgs
parents:
diff changeset
  1165
     * Launch UI and initialize SNC
hgs
parents:
diff changeset
  1166
     */
hgs
parents:
diff changeset
  1167
    targetNS.create = function(options, handler, context) {
hgs
parents:
diff changeset
  1168
        
hgs
parents:
diff changeset
  1169
        // Show UI
hgs
parents:
diff changeset
  1170
        _show(options, handler, context);
hgs
parents:
diff changeset
  1171
        
hgs
parents:
diff changeset
  1172
        // Start loading SNC networks
hgs
parents:
diff changeset
  1173
        _sncInit(params.credentials, handler, context);
hgs
parents:
diff changeset
  1174
    }			
hgs
parents:
diff changeset
  1175
	
hgs
parents:
diff changeset
  1176
	targetNS.status = _status;
hgs
parents:
diff changeset
  1177
};
hgs
parents:
diff changeset
  1178
// Create needed namespace ovi.player.share.ui
hgs
parents:
diff changeset
  1179
window["ovi"] = window["ovi"] ||
hgs
parents:
diff changeset
  1180
{};
hgs
parents:
diff changeset
  1181
ovi.player = ovi.player ||
hgs
parents:
diff changeset
  1182
{};
hgs
parents:
diff changeset
  1183
ovi.player.share = ovi.player.share ||
hgs
parents:
diff changeset
  1184
{};
hgs
parents:
diff changeset
  1185
ovi.player.share.ui = ovi.player.share.ui ||
hgs
parents:
diff changeset
  1186
{};
hgs
parents:
diff changeset
  1187
hgs
parents:
diff changeset
  1188
/**
hgs
parents:
diff changeset
  1189
 * Label UI control implementation. TODO
hgs
parents:
diff changeset
  1190
 * 
hgs
parents:
diff changeset
  1191
 * This API tries to imitate medos framework UI controls for future compability.
hgs
parents:
diff changeset
  1192
 * @param {Object} params
hgs
parents:
diff changeset
  1193
 * @param {Object} target
hgs
parents:
diff changeset
  1194
 */
hgs
parents:
diff changeset
  1195
ovi.player.share.ui.Label = function(params, target) {
hgs
parents:
diff changeset
  1196
    
hgs
parents:
diff changeset
  1197
	var CLICK_EVENT = "selected";
hgs
parents:
diff changeset
  1198
	var that = this;
hgs
parents:
diff changeset
  1199
hgs
parents:
diff changeset
  1200
    function createHtml() {
hgs
parents:
diff changeset
  1201
	    var template = '<span class="ovi_Label">' + params.text + '</span>';
hgs
parents:
diff changeset
  1202
	
hgs
parents:
diff changeset
  1203
	    var node = document.createElement("div");  // Do we need this ??
hgs
parents:
diff changeset
  1204
	    node.innerHTML = template;
hgs
parents:
diff changeset
  1205
		return node;		
hgs
parents:
diff changeset
  1206
	}
hgs
parents:
diff changeset
  1207
hgs
parents:
diff changeset
  1208
    var _root = createHtml();
hgs
parents:
diff changeset
  1209
	var _label = _root.firstChild;
hgs
parents:
diff changeset
  1210
 
hgs
parents:
diff changeset
  1211
    target.appendChild(_root);
hgs
parents:
diff changeset
  1212
	
hgs
parents:
diff changeset
  1213
    this.setProperty = function(name, value) {
hgs
parents:
diff changeset
  1214
		_label[name] = value;
hgs
parents:
diff changeset
  1215
	}
hgs
parents:
diff changeset
  1216
	
hgs
parents:
diff changeset
  1217
    this.getProperty = function(name) {
hgs
parents:
diff changeset
  1218
        return _label[name];
hgs
parents:
diff changeset
  1219
    }
hgs
parents:
diff changeset
  1220
	
hgs
parents:
diff changeset
  1221
    for(var v in params) {
hgs
parents:
diff changeset
  1222
        this.setProperty(v, params[v]);
hgs
parents:
diff changeset
  1223
    }
hgs
parents:
diff changeset
  1224
}
hgs
parents:
diff changeset
  1225
// Create needed namespace ovi.player.share.ui
hgs
parents:
diff changeset
  1226
window["ovi"] = window["ovi"] ||
hgs
parents:
diff changeset
  1227
{};
hgs
parents:
diff changeset
  1228
ovi.player = ovi.player ||
hgs
parents:
diff changeset
  1229
{};
hgs
parents:
diff changeset
  1230
ovi.player.share = ovi.player.share ||
hgs
parents:
diff changeset
  1231
{};
hgs
parents:
diff changeset
  1232
ovi.player.share.ui = ovi.player.share.ui ||
hgs
parents:
diff changeset
  1233
{};
hgs
parents:
diff changeset
  1234
hgs
parents:
diff changeset
  1235
/**
hgs
parents:
diff changeset
  1236
 * Textarea UI control implementation. TODO
hgs
parents:
diff changeset
  1237
 * 
hgs
parents:
diff changeset
  1238
 * This API tries to imitate medos framework UI controls for future compability.
hgs
parents:
diff changeset
  1239
 * @param {Object} params
hgs
parents:
diff changeset
  1240
 * @param {Object} target
hgs
parents:
diff changeset
  1241
 */
hgs
parents:
diff changeset
  1242
ovi.player.share.ui.TextArea = function(params, target) {
hgs
parents:
diff changeset
  1243
    
hgs
parents:
diff changeset
  1244
	var CLICK_EVENT = "selected";
hgs
parents:
diff changeset
  1245
	var that = this;
hgs
parents:
diff changeset
  1246
hgs
parents:
diff changeset
  1247
    function createHtml() {
hgs
parents:
diff changeset
  1248
	    var template = '<textarea class="ovi_TextInput ovi_Textarea" rows="2"></textarea>';
hgs
parents:
diff changeset
  1249
	
hgs
parents:
diff changeset
  1250
	    var node = document.createElement("div");  // Do we need this ??
hgs
parents:
diff changeset
  1251
	    node.innerHTML = template;
hgs
parents:
diff changeset
  1252
		return node;		
hgs
parents:
diff changeset
  1253
	}
hgs
parents:
diff changeset
  1254
hgs
parents:
diff changeset
  1255
    var _root = createHtml();
hgs
parents:
diff changeset
  1256
	var _textarea = _root.firstChild;
hgs
parents:
diff changeset
  1257
 
hgs
parents:
diff changeset
  1258
    target.appendChild(_root);
hgs
parents:
diff changeset
  1259
	
hgs
parents:
diff changeset
  1260
    this.setProperty = function(name, value) {
hgs
parents:
diff changeset
  1261
		_textarea[name] = value;
hgs
parents:
diff changeset
  1262
	}
hgs
parents:
diff changeset
  1263
	
hgs
parents:
diff changeset
  1264
	this.getProperty = function(name) {
hgs
parents:
diff changeset
  1265
		return _textarea[name];
hgs
parents:
diff changeset
  1266
	}
hgs
parents:
diff changeset
  1267
	
hgs
parents:
diff changeset
  1268
    for(var v in params) {
hgs
parents:
diff changeset
  1269
        this.setProperty(v, params[v]);
hgs
parents:
diff changeset
  1270
    }	
hgs
parents:
diff changeset
  1271
}
hgs
parents:
diff changeset
  1272
window["ovi"] = window["ovi"] ||
hgs
parents:
diff changeset
  1273
{};
hgs
parents:
diff changeset
  1274
ovi.player = ovi.player ||
hgs
parents:
diff changeset
  1275
{};
hgs
parents:
diff changeset
  1276
ovi.player.snc = ovi.player.snc ||
hgs
parents:
diff changeset
  1277
{};
hgs
parents:
diff changeset
  1278
hgs
parents:
diff changeset
  1279
ovi.player.snc.getInstance = function(config) {
hgs
parents:
diff changeset
  1280
    var player = {};
hgs
parents:
diff changeset
  1281
    player._cancel = function(options, handler, context) {
hgs
parents:
diff changeset
  1282
        var callable = (typeof handler === "function");
hgs
parents:
diff changeset
  1283
        if (callable) {
hgs
parents:
diff changeset
  1284
            handler.call(context, "CANCEL_PENDING");
hgs
parents:
diff changeset
  1285
        }
hgs
parents:
diff changeset
  1286
        // TODO: cancel Player
hgs
parents:
diff changeset
  1287
    };
hgs
parents:
diff changeset
  1288
    player._pick = function(options, handler, context) {
hgs
parents:
diff changeset
  1289
        var callable = (typeof handler === "function");
hgs
parents:
diff changeset
  1290
        if (callable) {
hgs
parents:
diff changeset
  1291
            handler.call(context, "PICK_PENDING");
hgs
parents:
diff changeset
  1292
        }
hgs
parents:
diff changeset
  1293
        // TODO: offer list of configured networks
hgs
parents:
diff changeset
  1294
    };
hgs
parents:
diff changeset
  1295
    player._view = function(options, handler, context) {
hgs
parents:
diff changeset
  1296
        var callable = (typeof handler === "function");
hgs
parents:
diff changeset
  1297
        if (callable) {
hgs
parents:
diff changeset
  1298
            handler.call(context, "VIEW_PENDING");
hgs
parents:
diff changeset
  1299
        }
hgs
parents:
diff changeset
  1300
        // TODO: offer miniviews for networks list
hgs
parents:
diff changeset
  1301
    };
hgs
parents:
diff changeset
  1302
    player._sync = function(options, handler, context) {
hgs
parents:
diff changeset
  1303
        var callable = (typeof handler === "function");
hgs
parents:
diff changeset
  1304
        if (callable) {
hgs
parents:
diff changeset
  1305
            handler.call(context, "SYNC_PENDING");
hgs
parents:
diff changeset
  1306
        }
hgs
parents:
diff changeset
  1307
        // TODO: connect to the Ovi API and SNC
hgs
parents:
diff changeset
  1308
    };
hgs
parents:
diff changeset
  1309
    ovi.player._getInstance.call(player, config);
hgs
parents:
diff changeset
  1310
};
hgs
parents:
diff changeset
  1311
hgs
parents:
diff changeset
  1312
ovi.player.snc.Player = ovi.player.snc.getInstance;