@@ 8209-8894 (lines=686) @@ | ||
8206 | * |
|
8207 | */ |
|
8208 | ||
8209 | ;(function ($, window, document, undefined) { |
|
8210 | ||
8211 | "use strict"; |
|
8212 | ||
8213 | window = (typeof window != 'undefined' && window.Math == Math) |
|
8214 | ? window |
|
8215 | : (typeof self != 'undefined' && self.Math == Math) |
|
8216 | ? self |
|
8217 | : Function('return this')() |
|
8218 | ; |
|
8219 | ||
8220 | $.fn.embed = function(parameters) { |
|
8221 | ||
8222 | var |
|
8223 | $allModules = $(this), |
|
8224 | ||
8225 | moduleSelector = $allModules.selector || '', |
|
8226 | ||
8227 | time = new Date().getTime(), |
|
8228 | performance = [], |
|
8229 | ||
8230 | query = arguments[0], |
|
8231 | methodInvoked = (typeof query == 'string'), |
|
8232 | queryArguments = [].slice.call(arguments, 1), |
|
8233 | ||
8234 | returnedValue |
|
8235 | ; |
|
8236 | ||
8237 | $allModules |
|
8238 | .each(function() { |
|
8239 | var |
|
8240 | settings = ( $.isPlainObject(parameters) ) |
|
8241 | ? $.extend(true, {}, $.fn.embed.settings, parameters) |
|
8242 | : $.extend({}, $.fn.embed.settings), |
|
8243 | ||
8244 | selector = settings.selector, |
|
8245 | className = settings.className, |
|
8246 | sources = settings.sources, |
|
8247 | error = settings.error, |
|
8248 | metadata = settings.metadata, |
|
8249 | namespace = settings.namespace, |
|
8250 | templates = settings.templates, |
|
8251 | ||
8252 | eventNamespace = '.' + namespace, |
|
8253 | moduleNamespace = 'module-' + namespace, |
|
8254 | ||
8255 | $window = $(window), |
|
8256 | $module = $(this), |
|
8257 | $placeholder = $module.find(selector.placeholder), |
|
8258 | $icon = $module.find(selector.icon), |
|
8259 | $embed = $module.find(selector.embed), |
|
8260 | ||
8261 | element = this, |
|
8262 | instance = $module.data(moduleNamespace), |
|
8263 | module |
|
8264 | ; |
|
8265 | ||
8266 | module = { |
|
8267 | ||
8268 | initialize: function() { |
|
8269 | module.debug('Initializing embed'); |
|
8270 | module.determine.autoplay(); |
|
8271 | module.create(); |
|
8272 | module.bind.events(); |
|
8273 | module.instantiate(); |
|
8274 | }, |
|
8275 | ||
8276 | instantiate: function() { |
|
8277 | module.verbose('Storing instance of module', module); |
|
8278 | instance = module; |
|
8279 | $module |
|
8280 | .data(moduleNamespace, module) |
|
8281 | ; |
|
8282 | }, |
|
8283 | ||
8284 | destroy: function() { |
|
8285 | module.verbose('Destroying previous instance of embed'); |
|
8286 | module.reset(); |
|
8287 | $module |
|
8288 | .removeData(moduleNamespace) |
|
8289 | .off(eventNamespace) |
|
8290 | ; |
|
8291 | }, |
|
8292 | ||
8293 | refresh: function() { |
|
8294 | module.verbose('Refreshing selector cache'); |
|
8295 | $placeholder = $module.find(selector.placeholder); |
|
8296 | $icon = $module.find(selector.icon); |
|
8297 | $embed = $module.find(selector.embed); |
|
8298 | }, |
|
8299 | ||
8300 | bind: { |
|
8301 | events: function() { |
|
8302 | if( module.has.placeholder() ) { |
|
8303 | module.debug('Adding placeholder events'); |
|
8304 | $module |
|
8305 | .on('click' + eventNamespace, selector.placeholder, module.createAndShow) |
|
8306 | .on('click' + eventNamespace, selector.icon, module.createAndShow) |
|
8307 | ; |
|
8308 | } |
|
8309 | } |
|
8310 | }, |
|
8311 | ||
8312 | create: function() { |
|
8313 | var |
|
8314 | placeholder = module.get.placeholder() |
|
8315 | ; |
|
8316 | if(placeholder) { |
|
8317 | module.createPlaceholder(); |
|
8318 | } |
|
8319 | else { |
|
8320 | module.createAndShow(); |
|
8321 | } |
|
8322 | }, |
|
8323 | ||
8324 | createPlaceholder: function(placeholder) { |
|
8325 | var |
|
8326 | icon = module.get.icon(), |
|
8327 | url = module.get.url(), |
|
8328 | embed = module.generate.embed(url) |
|
8329 | ; |
|
8330 | placeholder = placeholder || module.get.placeholder(); |
|
8331 | $module.html( templates.placeholder(placeholder, icon) ); |
|
8332 | module.debug('Creating placeholder for embed', placeholder, icon); |
|
8333 | }, |
|
8334 | ||
8335 | createEmbed: function(url) { |
|
8336 | module.refresh(); |
|
8337 | url = url || module.get.url(); |
|
8338 | $embed = $('<div/>') |
|
8339 | .addClass(className.embed) |
|
8340 | .html( module.generate.embed(url) ) |
|
8341 | .appendTo($module) |
|
8342 | ; |
|
8343 | settings.onCreate.call(element, url); |
|
8344 | module.debug('Creating embed object', $embed); |
|
8345 | }, |
|
8346 | ||
8347 | changeEmbed: function(url) { |
|
8348 | $embed |
|
8349 | .html( module.generate.embed(url) ) |
|
8350 | ; |
|
8351 | }, |
|
8352 | ||
8353 | createAndShow: function() { |
|
8354 | module.createEmbed(); |
|
8355 | module.show(); |
|
8356 | }, |
|
8357 | ||
8358 | // sets new embed |
|
8359 | change: function(source, id, url) { |
|
8360 | module.debug('Changing video to ', source, id, url); |
|
8361 | $module |
|
8362 | .data(metadata.source, source) |
|
8363 | .data(metadata.id, id) |
|
8364 | ; |
|
8365 | if(url) { |
|
8366 | $module.data(metadata.url, url); |
|
8367 | } |
|
8368 | else { |
|
8369 | $module.removeData(metadata.url); |
|
8370 | } |
|
8371 | if(module.has.embed()) { |
|
8372 | module.changeEmbed(); |
|
8373 | } |
|
8374 | else { |
|
8375 | module.create(); |
|
8376 | } |
|
8377 | }, |
|
8378 | ||
8379 | // clears embed |
|
8380 | reset: function() { |
|
8381 | module.debug('Clearing embed and showing placeholder'); |
|
8382 | module.remove.active(); |
|
8383 | module.remove.embed(); |
|
8384 | module.showPlaceholder(); |
|
8385 | settings.onReset.call(element); |
|
8386 | }, |
|
8387 | ||
8388 | // shows current embed |
|
8389 | show: function() { |
|
8390 | module.debug('Showing embed'); |
|
8391 | module.set.active(); |
|
8392 | settings.onDisplay.call(element); |
|
8393 | }, |
|
8394 | ||
8395 | hide: function() { |
|
8396 | module.debug('Hiding embed'); |
|
8397 | module.showPlaceholder(); |
|
8398 | }, |
|
8399 | ||
8400 | showPlaceholder: function() { |
|
8401 | module.debug('Showing placeholder image'); |
|
8402 | module.remove.active(); |
|
8403 | settings.onPlaceholderDisplay.call(element); |
|
8404 | }, |
|
8405 | ||
8406 | get: { |
|
8407 | id: function() { |
|
8408 | return settings.id || $module.data(metadata.id); |
|
8409 | }, |
|
8410 | placeholder: function() { |
|
8411 | return settings.placeholder || $module.data(metadata.placeholder); |
|
8412 | }, |
|
8413 | icon: function() { |
|
8414 | return (settings.icon) |
|
8415 | ? settings.icon |
|
8416 | : ($module.data(metadata.icon) !== undefined) |
|
8417 | ? $module.data(metadata.icon) |
|
8418 | : module.determine.icon() |
|
8419 | ; |
|
8420 | }, |
|
8421 | source: function(url) { |
|
8422 | return (settings.source) |
|
8423 | ? settings.source |
|
8424 | : ($module.data(metadata.source) !== undefined) |
|
8425 | ? $module.data(metadata.source) |
|
8426 | : module.determine.source() |
|
8427 | ; |
|
8428 | }, |
|
8429 | type: function() { |
|
8430 | var source = module.get.source(); |
|
8431 | return (sources[source] !== undefined) |
|
8432 | ? sources[source].type |
|
8433 | : false |
|
8434 | ; |
|
8435 | }, |
|
8436 | url: function() { |
|
8437 | return (settings.url) |
|
8438 | ? settings.url |
|
8439 | : ($module.data(metadata.url) !== undefined) |
|
8440 | ? $module.data(metadata.url) |
|
8441 | : module.determine.url() |
|
8442 | ; |
|
8443 | } |
|
8444 | }, |
|
8445 | ||
8446 | determine: { |
|
8447 | autoplay: function() { |
|
8448 | if(module.should.autoplay()) { |
|
8449 | settings.autoplay = true; |
|
8450 | } |
|
8451 | }, |
|
8452 | source: function(url) { |
|
8453 | var |
|
8454 | matchedSource = false |
|
8455 | ; |
|
8456 | url = url || module.get.url(); |
|
8457 | if(url) { |
|
8458 | $.each(sources, function(name, source) { |
|
8459 | if(url.search(source.domain) !== -1) { |
|
8460 | matchedSource = name; |
|
8461 | return false; |
|
8462 | } |
|
8463 | }); |
|
8464 | } |
|
8465 | return matchedSource; |
|
8466 | }, |
|
8467 | icon: function() { |
|
8468 | var |
|
8469 | source = module.get.source() |
|
8470 | ; |
|
8471 | return (sources[source] !== undefined) |
|
8472 | ? sources[source].icon |
|
8473 | : false |
|
8474 | ; |
|
8475 | }, |
|
8476 | url: function() { |
|
8477 | var |
|
8478 | id = settings.id || $module.data(metadata.id), |
|
8479 | source = settings.source || $module.data(metadata.source), |
|
8480 | url |
|
8481 | ; |
|
8482 | url = (sources[source] !== undefined) |
|
8483 | ? sources[source].url.replace('{id}', id) |
|
8484 | : false |
|
8485 | ; |
|
8486 | if(url) { |
|
8487 | $module.data(metadata.url, url); |
|
8488 | } |
|
8489 | return url; |
|
8490 | } |
|
8491 | }, |
|
8492 | ||
8493 | ||
8494 | set: { |
|
8495 | active: function() { |
|
8496 | $module.addClass(className.active); |
|
8497 | } |
|
8498 | }, |
|
8499 | ||
8500 | remove: { |
|
8501 | active: function() { |
|
8502 | $module.removeClass(className.active); |
|
8503 | }, |
|
8504 | embed: function() { |
|
8505 | $embed.empty(); |
|
8506 | } |
|
8507 | }, |
|
8508 | ||
8509 | encode: { |
|
8510 | parameters: function(parameters) { |
|
8511 | var |
|
8512 | urlString = [], |
|
8513 | index |
|
8514 | ; |
|
8515 | for (index in parameters) { |
|
8516 | urlString.push( encodeURIComponent(index) + '=' + encodeURIComponent( parameters[index] ) ); |
|
8517 | } |
|
8518 | return urlString.join('&'); |
|
8519 | } |
|
8520 | }, |
|
8521 | ||
8522 | generate: { |
|
8523 | embed: function(url) { |
|
8524 | module.debug('Generating embed html'); |
|
8525 | var |
|
8526 | source = module.get.source(), |
|
8527 | html, |
|
8528 | parameters |
|
8529 | ; |
|
8530 | url = module.get.url(url); |
|
8531 | if(url) { |
|
8532 | parameters = module.generate.parameters(source); |
|
8533 | html = templates.iframe(url, parameters); |
|
8534 | } |
|
8535 | else { |
|
8536 | module.error(error.noURL, $module); |
|
8537 | } |
|
8538 | return html; |
|
8539 | }, |
|
8540 | parameters: function(source, extraParameters) { |
|
8541 | var |
|
8542 | parameters = (sources[source] && sources[source].parameters !== undefined) |
|
8543 | ? sources[source].parameters(settings) |
|
8544 | : {} |
|
8545 | ; |
|
8546 | extraParameters = extraParameters || settings.parameters; |
|
8547 | if(extraParameters) { |
|
8548 | parameters = $.extend({}, parameters, extraParameters); |
|
8549 | } |
|
8550 | parameters = settings.onEmbed(parameters); |
|
8551 | return module.encode.parameters(parameters); |
|
8552 | } |
|
8553 | }, |
|
8554 | ||
8555 | has: { |
|
8556 | embed: function() { |
|
8557 | return ($embed.length > 0); |
|
8558 | }, |
|
8559 | placeholder: function() { |
|
8560 | return settings.placeholder || $module.data(metadata.placeholder); |
|
8561 | } |
|
8562 | }, |
|
8563 | ||
8564 | should: { |
|
8565 | autoplay: function() { |
|
8566 | return (settings.autoplay === 'auto') |
|
8567 | ? (settings.placeholder || $module.data(metadata.placeholder) !== undefined) |
|
8568 | : settings.autoplay |
|
8569 | ; |
|
8570 | } |
|
8571 | }, |
|
8572 | ||
8573 | is: { |
|
8574 | video: function() { |
|
8575 | return module.get.type() == 'video'; |
|
8576 | } |
|
8577 | }, |
|
8578 | ||
8579 | setting: function(name, value) { |
|
8580 | module.debug('Changing setting', name, value); |
|
8581 | if( $.isPlainObject(name) ) { |
|
8582 | $.extend(true, settings, name); |
|
8583 | } |
|
8584 | else if(value !== undefined) { |
|
8585 | if($.isPlainObject(settings[name])) { |
|
8586 | $.extend(true, settings[name], value); |
|
8587 | } |
|
8588 | else { |
|
8589 | settings[name] = value; |
|
8590 | } |
|
8591 | } |
|
8592 | else { |
|
8593 | return settings[name]; |
|
8594 | } |
|
8595 | }, |
|
8596 | internal: function(name, value) { |
|
8597 | if( $.isPlainObject(name) ) { |
|
8598 | $.extend(true, module, name); |
|
8599 | } |
|
8600 | else if(value !== undefined) { |
|
8601 | module[name] = value; |
|
8602 | } |
|
8603 | else { |
|
8604 | return module[name]; |
|
8605 | } |
|
8606 | }, |
|
8607 | debug: function() { |
|
8608 | if(!settings.silent && settings.debug) { |
|
8609 | if(settings.performance) { |
|
8610 | module.performance.log(arguments); |
|
8611 | } |
|
8612 | else { |
|
8613 | module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); |
|
8614 | module.debug.apply(console, arguments); |
|
8615 | } |
|
8616 | } |
|
8617 | }, |
|
8618 | verbose: function() { |
|
8619 | if(!settings.silent && settings.verbose && settings.debug) { |
|
8620 | if(settings.performance) { |
|
8621 | module.performance.log(arguments); |
|
8622 | } |
|
8623 | else { |
|
8624 | module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); |
|
8625 | module.verbose.apply(console, arguments); |
|
8626 | } |
|
8627 | } |
|
8628 | }, |
|
8629 | error: function() { |
|
8630 | if(!settings.silent) { |
|
8631 | module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); |
|
8632 | module.error.apply(console, arguments); |
|
8633 | } |
|
8634 | }, |
|
8635 | performance: { |
|
8636 | log: function(message) { |
|
8637 | var |
|
8638 | currentTime, |
|
8639 | executionTime, |
|
8640 | previousTime |
|
8641 | ; |
|
8642 | if(settings.performance) { |
|
8643 | currentTime = new Date().getTime(); |
|
8644 | previousTime = time || currentTime; |
|
8645 | executionTime = currentTime - previousTime; |
|
8646 | time = currentTime; |
|
8647 | performance.push({ |
|
8648 | 'Name' : message[0], |
|
8649 | 'Arguments' : [].slice.call(message, 1) || '', |
|
8650 | 'Element' : element, |
|
8651 | 'Execution Time' : executionTime |
|
8652 | }); |
|
8653 | } |
|
8654 | clearTimeout(module.performance.timer); |
|
8655 | module.performance.timer = setTimeout(module.performance.display, 500); |
|
8656 | }, |
|
8657 | display: function() { |
|
8658 | var |
|
8659 | title = settings.name + ':', |
|
8660 | totalTime = 0 |
|
8661 | ; |
|
8662 | time = false; |
|
8663 | clearTimeout(module.performance.timer); |
|
8664 | $.each(performance, function(index, data) { |
|
8665 | totalTime += data['Execution Time']; |
|
8666 | }); |
|
8667 | title += ' ' + totalTime + 'ms'; |
|
8668 | if(moduleSelector) { |
|
8669 | title += ' \'' + moduleSelector + '\''; |
|
8670 | } |
|
8671 | if($allModules.length > 1) { |
|
8672 | title += ' ' + '(' + $allModules.length + ')'; |
|
8673 | } |
|
8674 | if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) { |
|
8675 | console.groupCollapsed(title); |
|
8676 | if(console.table) { |
|
8677 | console.table(performance); |
|
8678 | } |
|
8679 | else { |
|
8680 | $.each(performance, function(index, data) { |
|
8681 | console.log(data['Name'] + ': ' + data['Execution Time']+'ms'); |
|
8682 | }); |
|
8683 | } |
|
8684 | console.groupEnd(); |
|
8685 | } |
|
8686 | performance = []; |
|
8687 | } |
|
8688 | }, |
|
8689 | invoke: function(query, passedArguments, context) { |
|
8690 | var |
|
8691 | object = instance, |
|
8692 | maxDepth, |
|
8693 | found, |
|
8694 | response |
|
8695 | ; |
|
8696 | passedArguments = passedArguments || queryArguments; |
|
8697 | context = element || context; |
|
8698 | if(typeof query == 'string' && object !== undefined) { |
|
8699 | query = query.split(/[\. ]/); |
|
8700 | maxDepth = query.length - 1; |
|
8701 | $.each(query, function(depth, value) { |
|
8702 | var camelCaseValue = (depth != maxDepth) |
|
8703 | ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) |
|
8704 | : query |
|
8705 | ; |
|
8706 | if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) { |
|
8707 | object = object[camelCaseValue]; |
|
8708 | } |
|
8709 | else if( object[camelCaseValue] !== undefined ) { |
|
8710 | found = object[camelCaseValue]; |
|
8711 | return false; |
|
8712 | } |
|
8713 | else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) { |
|
8714 | object = object[value]; |
|
8715 | } |
|
8716 | else if( object[value] !== undefined ) { |
|
8717 | found = object[value]; |
|
8718 | return false; |
|
8719 | } |
|
8720 | else { |
|
8721 | module.error(error.method, query); |
|
8722 | return false; |
|
8723 | } |
|
8724 | }); |
|
8725 | } |
|
8726 | if ( $.isFunction( found ) ) { |
|
8727 | response = found.apply(context, passedArguments); |
|
8728 | } |
|
8729 | else if(found !== undefined) { |
|
8730 | response = found; |
|
8731 | } |
|
8732 | if($.isArray(returnedValue)) { |
|
8733 | returnedValue.push(response); |
|
8734 | } |
|
8735 | else if(returnedValue !== undefined) { |
|
8736 | returnedValue = [returnedValue, response]; |
|
8737 | } |
|
8738 | else if(response !== undefined) { |
|
8739 | returnedValue = response; |
|
8740 | } |
|
8741 | return found; |
|
8742 | } |
|
8743 | }; |
|
8744 | ||
8745 | if(methodInvoked) { |
|
8746 | if(instance === undefined) { |
|
8747 | module.initialize(); |
|
8748 | } |
|
8749 | module.invoke(query); |
|
8750 | } |
|
8751 | else { |
|
8752 | if(instance !== undefined) { |
|
8753 | instance.invoke('destroy'); |
|
8754 | } |
|
8755 | module.initialize(); |
|
8756 | } |
|
8757 | }) |
|
8758 | ; |
|
8759 | return (returnedValue !== undefined) |
|
8760 | ? returnedValue |
|
8761 | : this |
|
8762 | ; |
|
8763 | }; |
|
8764 | ||
8765 | $.fn.embed.settings = { |
|
8766 | ||
8767 | name : 'Embed', |
|
8768 | namespace : 'embed', |
|
8769 | ||
8770 | silent : false, |
|
8771 | debug : false, |
|
8772 | verbose : false, |
|
8773 | performance : true, |
|
8774 | ||
8775 | icon : false, |
|
8776 | source : false, |
|
8777 | url : false, |
|
8778 | id : false, |
|
8779 | ||
8780 | // standard video settings |
|
8781 | autoplay : 'auto', |
|
8782 | color : '#444444', |
|
8783 | hd : true, |
|
8784 | brandedUI : false, |
|
8785 | ||
8786 | // additional parameters to include with the embed |
|
8787 | parameters: false, |
|
8788 | ||
8789 | onDisplay : function() {}, |
|
8790 | onPlaceholderDisplay : function() {}, |
|
8791 | onReset : function() {}, |
|
8792 | onCreate : function(url) {}, |
|
8793 | onEmbed : function(parameters) { |
|
8794 | return parameters; |
|
8795 | }, |
|
8796 | ||
8797 | metadata : { |
|
8798 | id : 'id', |
|
8799 | icon : 'icon', |
|
8800 | placeholder : 'placeholder', |
|
8801 | source : 'source', |
|
8802 | url : 'url' |
|
8803 | }, |
|
8804 | ||
8805 | error : { |
|
8806 | noURL : 'No URL specified', |
|
8807 | method : 'The method you called is not defined' |
|
8808 | }, |
|
8809 | ||
8810 | className : { |
|
8811 | active : 'active', |
|
8812 | embed : 'embed' |
|
8813 | }, |
|
8814 | ||
8815 | selector : { |
|
8816 | embed : '.embed', |
|
8817 | placeholder : '.placeholder', |
|
8818 | icon : '.icon' |
|
8819 | }, |
|
8820 | ||
8821 | sources: { |
|
8822 | youtube: { |
|
8823 | name : 'youtube', |
|
8824 | type : 'video', |
|
8825 | icon : 'video play', |
|
8826 | domain : 'youtube.com', |
|
8827 | url : '//www.youtube.com/embed/{id}', |
|
8828 | parameters: function(settings) { |
|
8829 | return { |
|
8830 | autohide : !settings.brandedUI, |
|
8831 | autoplay : settings.autoplay, |
|
8832 | color : settings.color || undefined, |
|
8833 | hq : settings.hd, |
|
8834 | jsapi : settings.api, |
|
8835 | modestbranding : !settings.brandedUI |
|
8836 | }; |
|
8837 | } |
|
8838 | }, |
|
8839 | vimeo: { |
|
8840 | name : 'vimeo', |
|
8841 | type : 'video', |
|
8842 | icon : 'video play', |
|
8843 | domain : 'vimeo.com', |
|
8844 | url : '//player.vimeo.com/video/{id}', |
|
8845 | parameters: function(settings) { |
|
8846 | return { |
|
8847 | api : settings.api, |
|
8848 | autoplay : settings.autoplay, |
|
8849 | byline : settings.brandedUI, |
|
8850 | color : settings.color || undefined, |
|
8851 | portrait : settings.brandedUI, |
|
8852 | title : settings.brandedUI |
|
8853 | }; |
|
8854 | } |
|
8855 | } |
|
8856 | }, |
|
8857 | ||
8858 | templates: { |
|
8859 | iframe : function(url, parameters) { |
|
8860 | var src = url; |
|
8861 | if (parameters) { |
|
8862 | src += '?' + parameters; |
|
8863 | } |
|
8864 | return '' |
|
8865 | + '<iframe src="' + src + '"' |
|
8866 | + ' width="100%" height="100%"' |
|
8867 | + ' frameborder="0" scrolling="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>' |
|
8868 | ; |
|
8869 | }, |
|
8870 | placeholder : function(image, icon) { |
|
8871 | var |
|
8872 | html = '' |
|
8873 | ; |
|
8874 | if(icon) { |
|
8875 | html += '<i class="' + icon + ' icon"></i>'; |
|
8876 | } |
|
8877 | if(image) { |
|
8878 | html += '<img class="placeholder" src="' + image + '">'; |
|
8879 | } |
|
8880 | return html; |
|
8881 | } |
|
8882 | }, |
|
8883 | ||
8884 | // NOT YET IMPLEMENTED |
|
8885 | api : false, |
|
8886 | onPause : function() {}, |
|
8887 | onPlay : function() {}, |
|
8888 | onStop : function() {} |
|
8889 | ||
8890 | }; |
|
8891 | ||
8892 | ||
8893 | ||
8894 | })( jQuery, window, document ); |
|
8895 | ||
8896 | /*! |
|
8897 | * # Semantic UI 2.2.11 - Modal |
@@ 11-696 (lines=686) @@ | ||
8 | * |
|
9 | */ |
|
10 | ||
11 | ;(function ($, window, document, undefined) { |
|
12 | ||
13 | "use strict"; |
|
14 | ||
15 | window = (typeof window != 'undefined' && window.Math == Math) |
|
16 | ? window |
|
17 | : (typeof self != 'undefined' && self.Math == Math) |
|
18 | ? self |
|
19 | : Function('return this')() |
|
20 | ; |
|
21 | ||
22 | $.fn.embed = function(parameters) { |
|
23 | ||
24 | var |
|
25 | $allModules = $(this), |
|
26 | ||
27 | moduleSelector = $allModules.selector || '', |
|
28 | ||
29 | time = new Date().getTime(), |
|
30 | performance = [], |
|
31 | ||
32 | query = arguments[0], |
|
33 | methodInvoked = (typeof query == 'string'), |
|
34 | queryArguments = [].slice.call(arguments, 1), |
|
35 | ||
36 | returnedValue |
|
37 | ; |
|
38 | ||
39 | $allModules |
|
40 | .each(function() { |
|
41 | var |
|
42 | settings = ( $.isPlainObject(parameters) ) |
|
43 | ? $.extend(true, {}, $.fn.embed.settings, parameters) |
|
44 | : $.extend({}, $.fn.embed.settings), |
|
45 | ||
46 | selector = settings.selector, |
|
47 | className = settings.className, |
|
48 | sources = settings.sources, |
|
49 | error = settings.error, |
|
50 | metadata = settings.metadata, |
|
51 | namespace = settings.namespace, |
|
52 | templates = settings.templates, |
|
53 | ||
54 | eventNamespace = '.' + namespace, |
|
55 | moduleNamespace = 'module-' + namespace, |
|
56 | ||
57 | $window = $(window), |
|
58 | $module = $(this), |
|
59 | $placeholder = $module.find(selector.placeholder), |
|
60 | $icon = $module.find(selector.icon), |
|
61 | $embed = $module.find(selector.embed), |
|
62 | ||
63 | element = this, |
|
64 | instance = $module.data(moduleNamespace), |
|
65 | module |
|
66 | ; |
|
67 | ||
68 | module = { |
|
69 | ||
70 | initialize: function() { |
|
71 | module.debug('Initializing embed'); |
|
72 | module.determine.autoplay(); |
|
73 | module.create(); |
|
74 | module.bind.events(); |
|
75 | module.instantiate(); |
|
76 | }, |
|
77 | ||
78 | instantiate: function() { |
|
79 | module.verbose('Storing instance of module', module); |
|
80 | instance = module; |
|
81 | $module |
|
82 | .data(moduleNamespace, module) |
|
83 | ; |
|
84 | }, |
|
85 | ||
86 | destroy: function() { |
|
87 | module.verbose('Destroying previous instance of embed'); |
|
88 | module.reset(); |
|
89 | $module |
|
90 | .removeData(moduleNamespace) |
|
91 | .off(eventNamespace) |
|
92 | ; |
|
93 | }, |
|
94 | ||
95 | refresh: function() { |
|
96 | module.verbose('Refreshing selector cache'); |
|
97 | $placeholder = $module.find(selector.placeholder); |
|
98 | $icon = $module.find(selector.icon); |
|
99 | $embed = $module.find(selector.embed); |
|
100 | }, |
|
101 | ||
102 | bind: { |
|
103 | events: function() { |
|
104 | if( module.has.placeholder() ) { |
|
105 | module.debug('Adding placeholder events'); |
|
106 | $module |
|
107 | .on('click' + eventNamespace, selector.placeholder, module.createAndShow) |
|
108 | .on('click' + eventNamespace, selector.icon, module.createAndShow) |
|
109 | ; |
|
110 | } |
|
111 | } |
|
112 | }, |
|
113 | ||
114 | create: function() { |
|
115 | var |
|
116 | placeholder = module.get.placeholder() |
|
117 | ; |
|
118 | if(placeholder) { |
|
119 | module.createPlaceholder(); |
|
120 | } |
|
121 | else { |
|
122 | module.createAndShow(); |
|
123 | } |
|
124 | }, |
|
125 | ||
126 | createPlaceholder: function(placeholder) { |
|
127 | var |
|
128 | icon = module.get.icon(), |
|
129 | url = module.get.url(), |
|
130 | embed = module.generate.embed(url) |
|
131 | ; |
|
132 | placeholder = placeholder || module.get.placeholder(); |
|
133 | $module.html( templates.placeholder(placeholder, icon) ); |
|
134 | module.debug('Creating placeholder for embed', placeholder, icon); |
|
135 | }, |
|
136 | ||
137 | createEmbed: function(url) { |
|
138 | module.refresh(); |
|
139 | url = url || module.get.url(); |
|
140 | $embed = $('<div/>') |
|
141 | .addClass(className.embed) |
|
142 | .html( module.generate.embed(url) ) |
|
143 | .appendTo($module) |
|
144 | ; |
|
145 | settings.onCreate.call(element, url); |
|
146 | module.debug('Creating embed object', $embed); |
|
147 | }, |
|
148 | ||
149 | changeEmbed: function(url) { |
|
150 | $embed |
|
151 | .html( module.generate.embed(url) ) |
|
152 | ; |
|
153 | }, |
|
154 | ||
155 | createAndShow: function() { |
|
156 | module.createEmbed(); |
|
157 | module.show(); |
|
158 | }, |
|
159 | ||
160 | // sets new embed |
|
161 | change: function(source, id, url) { |
|
162 | module.debug('Changing video to ', source, id, url); |
|
163 | $module |
|
164 | .data(metadata.source, source) |
|
165 | .data(metadata.id, id) |
|
166 | ; |
|
167 | if(url) { |
|
168 | $module.data(metadata.url, url); |
|
169 | } |
|
170 | else { |
|
171 | $module.removeData(metadata.url); |
|
172 | } |
|
173 | if(module.has.embed()) { |
|
174 | module.changeEmbed(); |
|
175 | } |
|
176 | else { |
|
177 | module.create(); |
|
178 | } |
|
179 | }, |
|
180 | ||
181 | // clears embed |
|
182 | reset: function() { |
|
183 | module.debug('Clearing embed and showing placeholder'); |
|
184 | module.remove.active(); |
|
185 | module.remove.embed(); |
|
186 | module.showPlaceholder(); |
|
187 | settings.onReset.call(element); |
|
188 | }, |
|
189 | ||
190 | // shows current embed |
|
191 | show: function() { |
|
192 | module.debug('Showing embed'); |
|
193 | module.set.active(); |
|
194 | settings.onDisplay.call(element); |
|
195 | }, |
|
196 | ||
197 | hide: function() { |
|
198 | module.debug('Hiding embed'); |
|
199 | module.showPlaceholder(); |
|
200 | }, |
|
201 | ||
202 | showPlaceholder: function() { |
|
203 | module.debug('Showing placeholder image'); |
|
204 | module.remove.active(); |
|
205 | settings.onPlaceholderDisplay.call(element); |
|
206 | }, |
|
207 | ||
208 | get: { |
|
209 | id: function() { |
|
210 | return settings.id || $module.data(metadata.id); |
|
211 | }, |
|
212 | placeholder: function() { |
|
213 | return settings.placeholder || $module.data(metadata.placeholder); |
|
214 | }, |
|
215 | icon: function() { |
|
216 | return (settings.icon) |
|
217 | ? settings.icon |
|
218 | : ($module.data(metadata.icon) !== undefined) |
|
219 | ? $module.data(metadata.icon) |
|
220 | : module.determine.icon() |
|
221 | ; |
|
222 | }, |
|
223 | source: function(url) { |
|
224 | return (settings.source) |
|
225 | ? settings.source |
|
226 | : ($module.data(metadata.source) !== undefined) |
|
227 | ? $module.data(metadata.source) |
|
228 | : module.determine.source() |
|
229 | ; |
|
230 | }, |
|
231 | type: function() { |
|
232 | var source = module.get.source(); |
|
233 | return (sources[source] !== undefined) |
|
234 | ? sources[source].type |
|
235 | : false |
|
236 | ; |
|
237 | }, |
|
238 | url: function() { |
|
239 | return (settings.url) |
|
240 | ? settings.url |
|
241 | : ($module.data(metadata.url) !== undefined) |
|
242 | ? $module.data(metadata.url) |
|
243 | : module.determine.url() |
|
244 | ; |
|
245 | } |
|
246 | }, |
|
247 | ||
248 | determine: { |
|
249 | autoplay: function() { |
|
250 | if(module.should.autoplay()) { |
|
251 | settings.autoplay = true; |
|
252 | } |
|
253 | }, |
|
254 | source: function(url) { |
|
255 | var |
|
256 | matchedSource = false |
|
257 | ; |
|
258 | url = url || module.get.url(); |
|
259 | if(url) { |
|
260 | $.each(sources, function(name, source) { |
|
261 | if(url.search(source.domain) !== -1) { |
|
262 | matchedSource = name; |
|
263 | return false; |
|
264 | } |
|
265 | }); |
|
266 | } |
|
267 | return matchedSource; |
|
268 | }, |
|
269 | icon: function() { |
|
270 | var |
|
271 | source = module.get.source() |
|
272 | ; |
|
273 | return (sources[source] !== undefined) |
|
274 | ? sources[source].icon |
|
275 | : false |
|
276 | ; |
|
277 | }, |
|
278 | url: function() { |
|
279 | var |
|
280 | id = settings.id || $module.data(metadata.id), |
|
281 | source = settings.source || $module.data(metadata.source), |
|
282 | url |
|
283 | ; |
|
284 | url = (sources[source] !== undefined) |
|
285 | ? sources[source].url.replace('{id}', id) |
|
286 | : false |
|
287 | ; |
|
288 | if(url) { |
|
289 | $module.data(metadata.url, url); |
|
290 | } |
|
291 | return url; |
|
292 | } |
|
293 | }, |
|
294 | ||
295 | ||
296 | set: { |
|
297 | active: function() { |
|
298 | $module.addClass(className.active); |
|
299 | } |
|
300 | }, |
|
301 | ||
302 | remove: { |
|
303 | active: function() { |
|
304 | $module.removeClass(className.active); |
|
305 | }, |
|
306 | embed: function() { |
|
307 | $embed.empty(); |
|
308 | } |
|
309 | }, |
|
310 | ||
311 | encode: { |
|
312 | parameters: function(parameters) { |
|
313 | var |
|
314 | urlString = [], |
|
315 | index |
|
316 | ; |
|
317 | for (index in parameters) { |
|
318 | urlString.push( encodeURIComponent(index) + '=' + encodeURIComponent( parameters[index] ) ); |
|
319 | } |
|
320 | return urlString.join('&'); |
|
321 | } |
|
322 | }, |
|
323 | ||
324 | generate: { |
|
325 | embed: function(url) { |
|
326 | module.debug('Generating embed html'); |
|
327 | var |
|
328 | source = module.get.source(), |
|
329 | html, |
|
330 | parameters |
|
331 | ; |
|
332 | url = module.get.url(url); |
|
333 | if(url) { |
|
334 | parameters = module.generate.parameters(source); |
|
335 | html = templates.iframe(url, parameters); |
|
336 | } |
|
337 | else { |
|
338 | module.error(error.noURL, $module); |
|
339 | } |
|
340 | return html; |
|
341 | }, |
|
342 | parameters: function(source, extraParameters) { |
|
343 | var |
|
344 | parameters = (sources[source] && sources[source].parameters !== undefined) |
|
345 | ? sources[source].parameters(settings) |
|
346 | : {} |
|
347 | ; |
|
348 | extraParameters = extraParameters || settings.parameters; |
|
349 | if(extraParameters) { |
|
350 | parameters = $.extend({}, parameters, extraParameters); |
|
351 | } |
|
352 | parameters = settings.onEmbed(parameters); |
|
353 | return module.encode.parameters(parameters); |
|
354 | } |
|
355 | }, |
|
356 | ||
357 | has: { |
|
358 | embed: function() { |
|
359 | return ($embed.length > 0); |
|
360 | }, |
|
361 | placeholder: function() { |
|
362 | return settings.placeholder || $module.data(metadata.placeholder); |
|
363 | } |
|
364 | }, |
|
365 | ||
366 | should: { |
|
367 | autoplay: function() { |
|
368 | return (settings.autoplay === 'auto') |
|
369 | ? (settings.placeholder || $module.data(metadata.placeholder) !== undefined) |
|
370 | : settings.autoplay |
|
371 | ; |
|
372 | } |
|
373 | }, |
|
374 | ||
375 | is: { |
|
376 | video: function() { |
|
377 | return module.get.type() == 'video'; |
|
378 | } |
|
379 | }, |
|
380 | ||
381 | setting: function(name, value) { |
|
382 | module.debug('Changing setting', name, value); |
|
383 | if( $.isPlainObject(name) ) { |
|
384 | $.extend(true, settings, name); |
|
385 | } |
|
386 | else if(value !== undefined) { |
|
387 | if($.isPlainObject(settings[name])) { |
|
388 | $.extend(true, settings[name], value); |
|
389 | } |
|
390 | else { |
|
391 | settings[name] = value; |
|
392 | } |
|
393 | } |
|
394 | else { |
|
395 | return settings[name]; |
|
396 | } |
|
397 | }, |
|
398 | internal: function(name, value) { |
|
399 | if( $.isPlainObject(name) ) { |
|
400 | $.extend(true, module, name); |
|
401 | } |
|
402 | else if(value !== undefined) { |
|
403 | module[name] = value; |
|
404 | } |
|
405 | else { |
|
406 | return module[name]; |
|
407 | } |
|
408 | }, |
|
409 | debug: function() { |
|
410 | if(!settings.silent && settings.debug) { |
|
411 | if(settings.performance) { |
|
412 | module.performance.log(arguments); |
|
413 | } |
|
414 | else { |
|
415 | module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':'); |
|
416 | module.debug.apply(console, arguments); |
|
417 | } |
|
418 | } |
|
419 | }, |
|
420 | verbose: function() { |
|
421 | if(!settings.silent && settings.verbose && settings.debug) { |
|
422 | if(settings.performance) { |
|
423 | module.performance.log(arguments); |
|
424 | } |
|
425 | else { |
|
426 | module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':'); |
|
427 | module.verbose.apply(console, arguments); |
|
428 | } |
|
429 | } |
|
430 | }, |
|
431 | error: function() { |
|
432 | if(!settings.silent) { |
|
433 | module.error = Function.prototype.bind.call(console.error, console, settings.name + ':'); |
|
434 | module.error.apply(console, arguments); |
|
435 | } |
|
436 | }, |
|
437 | performance: { |
|
438 | log: function(message) { |
|
439 | var |
|
440 | currentTime, |
|
441 | executionTime, |
|
442 | previousTime |
|
443 | ; |
|
444 | if(settings.performance) { |
|
445 | currentTime = new Date().getTime(); |
|
446 | previousTime = time || currentTime; |
|
447 | executionTime = currentTime - previousTime; |
|
448 | time = currentTime; |
|
449 | performance.push({ |
|
450 | 'Name' : message[0], |
|
451 | 'Arguments' : [].slice.call(message, 1) || '', |
|
452 | 'Element' : element, |
|
453 | 'Execution Time' : executionTime |
|
454 | }); |
|
455 | } |
|
456 | clearTimeout(module.performance.timer); |
|
457 | module.performance.timer = setTimeout(module.performance.display, 500); |
|
458 | }, |
|
459 | display: function() { |
|
460 | var |
|
461 | title = settings.name + ':', |
|
462 | totalTime = 0 |
|
463 | ; |
|
464 | time = false; |
|
465 | clearTimeout(module.performance.timer); |
|
466 | $.each(performance, function(index, data) { |
|
467 | totalTime += data['Execution Time']; |
|
468 | }); |
|
469 | title += ' ' + totalTime + 'ms'; |
|
470 | if(moduleSelector) { |
|
471 | title += ' \'' + moduleSelector + '\''; |
|
472 | } |
|
473 | if($allModules.length > 1) { |
|
474 | title += ' ' + '(' + $allModules.length + ')'; |
|
475 | } |
|
476 | if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) { |
|
477 | console.groupCollapsed(title); |
|
478 | if(console.table) { |
|
479 | console.table(performance); |
|
480 | } |
|
481 | else { |
|
482 | $.each(performance, function(index, data) { |
|
483 | console.log(data['Name'] + ': ' + data['Execution Time']+'ms'); |
|
484 | }); |
|
485 | } |
|
486 | console.groupEnd(); |
|
487 | } |
|
488 | performance = []; |
|
489 | } |
|
490 | }, |
|
491 | invoke: function(query, passedArguments, context) { |
|
492 | var |
|
493 | object = instance, |
|
494 | maxDepth, |
|
495 | found, |
|
496 | response |
|
497 | ; |
|
498 | passedArguments = passedArguments || queryArguments; |
|
499 | context = element || context; |
|
500 | if(typeof query == 'string' && object !== undefined) { |
|
501 | query = query.split(/[\. ]/); |
|
502 | maxDepth = query.length - 1; |
|
503 | $.each(query, function(depth, value) { |
|
504 | var camelCaseValue = (depth != maxDepth) |
|
505 | ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1) |
|
506 | : query |
|
507 | ; |
|
508 | if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) { |
|
509 | object = object[camelCaseValue]; |
|
510 | } |
|
511 | else if( object[camelCaseValue] !== undefined ) { |
|
512 | found = object[camelCaseValue]; |
|
513 | return false; |
|
514 | } |
|
515 | else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) { |
|
516 | object = object[value]; |
|
517 | } |
|
518 | else if( object[value] !== undefined ) { |
|
519 | found = object[value]; |
|
520 | return false; |
|
521 | } |
|
522 | else { |
|
523 | module.error(error.method, query); |
|
524 | return false; |
|
525 | } |
|
526 | }); |
|
527 | } |
|
528 | if ( $.isFunction( found ) ) { |
|
529 | response = found.apply(context, passedArguments); |
|
530 | } |
|
531 | else if(found !== undefined) { |
|
532 | response = found; |
|
533 | } |
|
534 | if($.isArray(returnedValue)) { |
|
535 | returnedValue.push(response); |
|
536 | } |
|
537 | else if(returnedValue !== undefined) { |
|
538 | returnedValue = [returnedValue, response]; |
|
539 | } |
|
540 | else if(response !== undefined) { |
|
541 | returnedValue = response; |
|
542 | } |
|
543 | return found; |
|
544 | } |
|
545 | }; |
|
546 | ||
547 | if(methodInvoked) { |
|
548 | if(instance === undefined) { |
|
549 | module.initialize(); |
|
550 | } |
|
551 | module.invoke(query); |
|
552 | } |
|
553 | else { |
|
554 | if(instance !== undefined) { |
|
555 | instance.invoke('destroy'); |
|
556 | } |
|
557 | module.initialize(); |
|
558 | } |
|
559 | }) |
|
560 | ; |
|
561 | return (returnedValue !== undefined) |
|
562 | ? returnedValue |
|
563 | : this |
|
564 | ; |
|
565 | }; |
|
566 | ||
567 | $.fn.embed.settings = { |
|
568 | ||
569 | name : 'Embed', |
|
570 | namespace : 'embed', |
|
571 | ||
572 | silent : false, |
|
573 | debug : false, |
|
574 | verbose : false, |
|
575 | performance : true, |
|
576 | ||
577 | icon : false, |
|
578 | source : false, |
|
579 | url : false, |
|
580 | id : false, |
|
581 | ||
582 | // standard video settings |
|
583 | autoplay : 'auto', |
|
584 | color : '#444444', |
|
585 | hd : true, |
|
586 | brandedUI : false, |
|
587 | ||
588 | // additional parameters to include with the embed |
|
589 | parameters: false, |
|
590 | ||
591 | onDisplay : function() {}, |
|
592 | onPlaceholderDisplay : function() {}, |
|
593 | onReset : function() {}, |
|
594 | onCreate : function(url) {}, |
|
595 | onEmbed : function(parameters) { |
|
596 | return parameters; |
|
597 | }, |
|
598 | ||
599 | metadata : { |
|
600 | id : 'id', |
|
601 | icon : 'icon', |
|
602 | placeholder : 'placeholder', |
|
603 | source : 'source', |
|
604 | url : 'url' |
|
605 | }, |
|
606 | ||
607 | error : { |
|
608 | noURL : 'No URL specified', |
|
609 | method : 'The method you called is not defined' |
|
610 | }, |
|
611 | ||
612 | className : { |
|
613 | active : 'active', |
|
614 | embed : 'embed' |
|
615 | }, |
|
616 | ||
617 | selector : { |
|
618 | embed : '.embed', |
|
619 | placeholder : '.placeholder', |
|
620 | icon : '.icon' |
|
621 | }, |
|
622 | ||
623 | sources: { |
|
624 | youtube: { |
|
625 | name : 'youtube', |
|
626 | type : 'video', |
|
627 | icon : 'video play', |
|
628 | domain : 'youtube.com', |
|
629 | url : '//www.youtube.com/embed/{id}', |
|
630 | parameters: function(settings) { |
|
631 | return { |
|
632 | autohide : !settings.brandedUI, |
|
633 | autoplay : settings.autoplay, |
|
634 | color : settings.color || undefined, |
|
635 | hq : settings.hd, |
|
636 | jsapi : settings.api, |
|
637 | modestbranding : !settings.brandedUI |
|
638 | }; |
|
639 | } |
|
640 | }, |
|
641 | vimeo: { |
|
642 | name : 'vimeo', |
|
643 | type : 'video', |
|
644 | icon : 'video play', |
|
645 | domain : 'vimeo.com', |
|
646 | url : '//player.vimeo.com/video/{id}', |
|
647 | parameters: function(settings) { |
|
648 | return { |
|
649 | api : settings.api, |
|
650 | autoplay : settings.autoplay, |
|
651 | byline : settings.brandedUI, |
|
652 | color : settings.color || undefined, |
|
653 | portrait : settings.brandedUI, |
|
654 | title : settings.brandedUI |
|
655 | }; |
|
656 | } |
|
657 | } |
|
658 | }, |
|
659 | ||
660 | templates: { |
|
661 | iframe : function(url, parameters) { |
|
662 | var src = url; |
|
663 | if (parameters) { |
|
664 | src += '?' + parameters; |
|
665 | } |
|
666 | return '' |
|
667 | + '<iframe src="' + src + '"' |
|
668 | + ' width="100%" height="100%"' |
|
669 | + ' frameborder="0" scrolling="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>' |
|
670 | ; |
|
671 | }, |
|
672 | placeholder : function(image, icon) { |
|
673 | var |
|
674 | html = '' |
|
675 | ; |
|
676 | if(icon) { |
|
677 | html += '<i class="' + icon + ' icon"></i>'; |
|
678 | } |
|
679 | if(image) { |
|
680 | html += '<img class="placeholder" src="' + image + '">'; |
|
681 | } |
|
682 | return html; |
|
683 | } |
|
684 | }, |
|
685 | ||
686 | // NOT YET IMPLEMENTED |
|
687 | api : false, |
|
688 | onPause : function() {}, |
|
689 | onPlay : function() {}, |
|
690 | onStop : function() {} |
|
691 | ||
692 | }; |
|
693 | ||
694 | ||
695 | ||
696 | })( jQuery, window, document ); |
|
697 |