From 961f6d09a5c5054429c19561e043e0f6848cfff5 Mon Sep 17 00:00:00 2001 From: travist Date: Fri, 5 Mar 2021 00:07:14 +0300 Subject: [PATCH] Updating the library to use Grunt instead of a makefile. --- .gitignore | 1 + .gitmodules | 6 + Gruntfile.js | 86 + bin/osmplayer.compressed.js | 224 +- bin/osmplayer.js | 7072 +---------------- bin/osmplayer.min.js | 3 + doc/classes.list.html | 214 + doc/global.html | 577 ++ doc/global.html#osmplayer | 1959 +++++ doc/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes doc/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes doc/index.html | 397 +- doc/osmplayer.js.html | 531 ++ doc/osmplayer.pager.html | 442 ++ doc/osmplayer.pager.js.html | 179 + doc/osmplayer.parser.asx.js.html | 172 + doc/osmplayer.parser.default.js.html | 167 + doc/osmplayer.parser.rss.js.html | 216 + doc/osmplayer.parser.xspf.js.html | 172 + doc/osmplayer.parser.youtube.js.html | 183 + doc/osmplayer.playlist.html | 1995 +++++ doc/osmplayer.playlist.js.html | 713 ++ doc/osmplayer.teaser.html | 660 ++ doc/osmplayer.teaser.js.html | 206 + doc/prototype..html | 298 + doc/scripts/URI.js | 1429 ++++ doc/scripts/bootstrap-dropdown.js | 165 + doc/scripts/bootstrap-tab.js | 144 + doc/scripts/jquery.localScroll.js | 130 + doc/scripts/jquery.min.js | 3522 ++++++++ doc/scripts/jquery.scrollTo.js | 217 + doc/scripts/jquery.sunlight.js | 18 + doc/scripts/prettify/Apache-License-2.0.txt | 202 + doc/scripts/prettify/jquery.min.js | 6 + doc/scripts/prettify/lang-css.js | 21 + doc/scripts/prettify/prettify.js | 496 ++ doc/scripts/sunlight-plugin.doclinks.js | 91 + doc/scripts/sunlight-plugin.linenumbers.js | 104 + doc/scripts/sunlight-plugin.menu.js | 159 + doc/scripts/sunlight.javascript.js | 183 + doc/scripts/sunlight.js | 1157 +++ doc/scripts/toc.js | 209 + doc/styles/darkstrap.css | 960 +++ doc/styles/prettify-tomorrow.css | 132 + doc/styles/site.amelia.css | 6367 +++++++++++++++ doc/styles/site.cerulean.css | 5699 +++++++++++++ doc/styles/site.cosmo.css | 5942 ++++++++++++++ doc/styles/site.cyborg.css | 6149 ++++++++++++++ doc/styles/site.darkstrap.css | 5638 +++++++++++++ doc/styles/site.flatly.css | 5991 ++++++++++++++ doc/styles/site.journal.css | 5743 +++++++++++++ doc/styles/site.readable.css | 5431 +++++++++++++ doc/styles/site.simplex.css | 5756 ++++++++++++++ doc/styles/site.slate.css | 6202 +++++++++++++++ doc/styles/site.spacelab.css | 5794 ++++++++++++++ doc/styles/site.spruce.css | 5936 ++++++++++++++ doc/styles/site.superhero.css | 6104 ++++++++++++++ doc/styles/site.united.css | 5543 +++++++++++++ doc/styles/sunlight.dark.css | 345 + doc/styles/sunlight.default.css | 344 + index.html | 3 +- lib/iscroll | 1 + minplayer | 1 + package.json | 20 + src/osmplayer.iscroll.js | 3 + src/osmplayer.playlist.js | 597 -- .../js/osmplayer.controller.default.js | 72 +- templates/default/js/osmplayer.default.js | 15 +- .../default/js/osmplayer.pager.default.js | 34 +- .../js/osmplayer.playLoader.default.js | 20 +- .../default/js/osmplayer.playlist.default.js | 30 +- .../default/js/osmplayer.teaser.default.js | 24 +- templates/default/osmplayer.default.js | 26 +- 73 files changed, 101384 insertions(+), 8264 deletions(-) create mode 100644 .gitmodules create mode 100644 Gruntfile.js create mode 100644 bin/osmplayer.min.js create mode 100644 doc/classes.list.html create mode 100644 doc/global.html create mode 100644 doc/global.html#osmplayer create mode 100644 doc/img/glyphicons-halflings-white.png create mode 100644 doc/img/glyphicons-halflings.png create mode 100644 doc/osmplayer.js.html create mode 100644 doc/osmplayer.pager.html create mode 100644 doc/osmplayer.pager.js.html create mode 100644 doc/osmplayer.parser.asx.js.html create mode 100644 doc/osmplayer.parser.default.js.html create mode 100644 doc/osmplayer.parser.rss.js.html create mode 100644 doc/osmplayer.parser.xspf.js.html create mode 100644 doc/osmplayer.parser.youtube.js.html create mode 100644 doc/osmplayer.playlist.html create mode 100644 doc/osmplayer.playlist.js.html create mode 100644 doc/osmplayer.teaser.html create mode 100644 doc/osmplayer.teaser.js.html create mode 100644 doc/prototype..html create mode 100644 doc/scripts/URI.js create mode 100644 doc/scripts/bootstrap-dropdown.js create mode 100644 doc/scripts/bootstrap-tab.js create mode 100644 doc/scripts/jquery.localScroll.js create mode 100644 doc/scripts/jquery.min.js create mode 100644 doc/scripts/jquery.scrollTo.js create mode 100644 doc/scripts/jquery.sunlight.js create mode 100644 doc/scripts/prettify/Apache-License-2.0.txt create mode 100644 doc/scripts/prettify/jquery.min.js create mode 100644 doc/scripts/prettify/lang-css.js create mode 100644 doc/scripts/prettify/prettify.js create mode 100644 doc/scripts/sunlight-plugin.doclinks.js create mode 100644 doc/scripts/sunlight-plugin.linenumbers.js create mode 100644 doc/scripts/sunlight-plugin.menu.js create mode 100644 doc/scripts/sunlight.javascript.js create mode 100644 doc/scripts/sunlight.js create mode 100644 doc/scripts/toc.js create mode 100644 doc/styles/darkstrap.css create mode 100644 doc/styles/prettify-tomorrow.css create mode 100644 doc/styles/site.amelia.css create mode 100644 doc/styles/site.cerulean.css create mode 100644 doc/styles/site.cosmo.css create mode 100644 doc/styles/site.cyborg.css create mode 100644 doc/styles/site.darkstrap.css create mode 100644 doc/styles/site.flatly.css create mode 100644 doc/styles/site.journal.css create mode 100644 doc/styles/site.readable.css create mode 100644 doc/styles/site.simplex.css create mode 100644 doc/styles/site.slate.css create mode 100644 doc/styles/site.spacelab.css create mode 100644 doc/styles/site.spruce.css create mode 100644 doc/styles/site.superhero.css create mode 100644 doc/styles/site.united.css create mode 100644 doc/styles/sunlight.dark.css create mode 100644 doc/styles/sunlight.default.css create mode 160000 lib/iscroll create mode 160000 minplayer create mode 100644 package.json create mode 100644 src/osmplayer.iscroll.js diff --git a/.gitignore b/.gitignore index 10f4bceb..e7d1d4f3 100755 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *CVS* .DS_Store tools +node_modules diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..d9b12a44 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "minplayer"] + path = minplayer + url = https://github.com/travist/minplayer.git +[submodule "lib/iscroll"] + path = lib/iscroll + url = https://github.com/cubiq/iscroll.git diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 00000000..e2dd8bbc --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,86 @@ +module.exports = function(grunt) { + + var iscroll = [ + 'lib/screenfull.js/dist/screenfull.min.js' + ]; + + var iscrollPath = 'src/osmplayer.iscroll.js'; + + var files = [ + 'src/osmplayer.js', + 'src/osmplayer.parser.default.js', + 'src/osmplayer.parser.youtube.js', + 'src/osmplayer.parser.rss.js', + 'src/osmplayer.parser.asx.js', + 'src/osmplayer.parser.xspf.js', + 'src/osmplayer.playlist.js', + 'src/osmplayer.pager.js', + 'src/osmplayer.teaser.js' + ]; + + var template = [ + 'templates/default/js/osmplayer.playLoader.default.js', + 'templates/default/js/osmplayer.controller.default.js', + 'templates/default/js/osmplayer.playlist.default.js', + 'templates/default/js/osmplayer.teaser.default.js', + 'templates/default/js/osmplayer.pager.default.js', + 'templates/default/js/osmplayer.default.js' + ]; + + // Project configuration. + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + jshint: { + all: ['Gruntfile.js'].concat(files).concat(template) + }, + concat: { + options: { + separator: '', + }, + screenfull: { + options: { + banner: "var osmplayer = osmplayer || {};\n(function(exports) {", + footer: "\n})(osmplayer);" + }, + files: { + 'src/osmplayer.iscroll.js': iscroll + } + }, + build: { + files: { + 'bin/osmplayer.js': ['minplayer/bin/minplayer.min.js', iscrollPath].concat(files) + } + } + }, + uglify: { + options: { + banner: '' + }, + build: { + files: { + 'bin/osmplayer.compressed.js': ['bin/osmplayer.js'], + 'bin/osmplayer.min.js': ['bin/osmplayer.js'], + 'templates/default/osmplayer.default.js': template + } + } + }, + jsdoc : { + dist : { + src: files, + options: { + template: 'node_modules/grunt-jsdoc/node_modules/ink-docstrap/template', + destination: 'doc' + } + } + } + }); + + // Load the plugin that provides the "uglify" task. + grunt.loadNpmTasks('grunt-jsdoc'); + grunt.loadNpmTasks('grunt-contrib-jshint'); + grunt.loadNpmTasks('grunt-contrib-concat'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + + // Default task(s). + grunt.registerTask('default', ['jshint', 'concat', 'uglify', 'jsdoc']); +}; diff --git a/bin/osmplayer.compressed.js b/bin/osmplayer.compressed.js index ca950d4b..818d0204 100644 --- a/bin/osmplayer.compressed.js +++ b/bin/osmplayer.compressed.js @@ -1,221 +1,3 @@ -var minplayer=minplayer||{};function checkPlayType(a,b){if("function"===typeof a.canPlayType){if("object"===typeof b){for(var c=b.length,d="";c--&&!(d=checkPlayType(a,b[c])););return d}c=a.canPlayType(b);if("no"!==c&&""!==c)return b}return""} -minplayer.compatibility=function(){var a=null,a=document.createElement("video");this.videoOGG=checkPlayType(a,"video/ogg");this.videoH264=checkPlayType(a,["video/mp4","video/h264"]);this.videoWEBM=checkPlayType(a,["video/x-webm","video/webm","application/octet-stream"]);this.videoMPEGURL=checkPlayType(a,"application/vnd.apple.mpegurl");a=document.createElement("audio");this.audioOGG=checkPlayType(a,"audio/ogg");this.audioMP3=checkPlayType(a,"audio/mpeg");this.audioMP4=checkPlayType(a,"audio/mp4")}; -minplayer.playTypes||(minplayer.playTypes=new minplayer.compatibility,minplayer.isAndroid=/android/gi.test(navigator.appVersion),minplayer.isIDevice=/iphone|ipad/gi.test(navigator.appVersion),minplayer.isPlaybook=/playbook/gi.test(navigator.appVersion),minplayer.isTouchPad=/hp-tablet/gi.test(navigator.appVersion),minplayer.hasTouch="ontouchstart"in window&&!minplayer.isTouchPad); -if(!minplayer.urlVars){minplayer.urlVars={};var regEx=/[?&]+([^=&]+)=([^&]*)/gi;window.location.href.replace(regEx,function(a,b,c){minplayer.urlVars[b]=c})}minplayer=minplayer||{};minplayer.async=function(){this.value=null;this.queue=[]};minplayer.async.prototype.get=function(a){null!==this.value?a(this.value):this.queue.push(a)};minplayer.async.prototype.set=function(a){this.value=a;var b=this.queue.length;if(b){for(;b--;)this.queue[b](a);this.queue=[]}};minplayer=minplayer||{}; -minplayer.flags=function(){this.flag=0;this.ids={};this.numFlags=0};minplayer.flags.prototype.setFlag=function(a,b){this.ids.hasOwnProperty(a)||(this.ids[a]=this.numFlags,this.numFlags++);this.flag=b?this.flag|1<e;e++)if(a=d[e],a&&a[1]in c){e=0;for(b=a.length;b>e;e++)f[d[0][e]]=a[e];return f}return!1}(),f={request:function(a){var b=e.requestFullscreen;a=a||c.documentElement;/5\.1[\.\d]* Safari/.test(navigator.userAgent)?a[b]():a[b](d&&Element.ALLOW_KEYBOARD_INPUT)},exit:function(){c[e.exitFullscreen]()},toggle:function(a){this.isFullscreen?this.exit(): -this.request(a)},onchange:function(){},onerror:function(){},raw:e};return e?(Object.defineProperties(f,{isFullscreen:{get:function(){return!!c[e.fullscreenElement]}},element:{enumerable:!0,get:function(){return c[e.fullscreenElement]}},enabled:{enumerable:!0,get:function(){return!!c[e.fullscreenEnabled]}}}),c.addEventListener(e.fullscreenchange,function(a){f.onchange.call(f,a)}),c.addEventListener(e.fullscreenerror,function(a){f.onerror.call(f,a)}),a.screenfull=f,void 0):(a.screenfull=!1,void 0)}(window, -document);a.screenfull=screenfull})(minplayer);minplayer.display=function(a,b,c,d){minplayer.plugin.call(this,a,b,c,d)};minplayer.display.prototype=new minplayer.plugin;minplayer.display.prototype.constructor=minplayer.display;minplayer.display.prototype.getDisplay=function(a,b){return a};minplayer.display.prototype.initialize=function(){this.display||(this.display=this.getDisplay(this.context,this.options));this.display&&(this.options.pluginName="display",this.elements=this.getElements(),minplayer.plugin.prototype.initialize.call(this))}; -minplayer.display.prototype.construct=function(){minplayer.plugin.prototype.construct.call(this);this.autoHide=!1;if(this.onResize){var a=0;jQuery(window).resize(function(b){return function(){clearTimeout(a);a=setTimeout(function(){b.onResize()},200)}}(this))}};minplayer.display.prototype.onResize=!1;minplayer.display.prototype.hide=function(a){if(a=a||this.display)a.forceHide=!0,a.unbind().hide()};minplayer.display.prototype.fullScreenElement=function(){return this.display}; -minplayer.click=function(a,b){var c=!1;a=jQuery(a);a.bind("touchstart click",function(a){c||(c=!0,setTimeout(function(){c=!1},100),b.call(this,a))});return a};minplayer.display.prototype.onFocus=function(a){this.hasFocus=this.focus=a;this.autoHide&&this.showThenHide(this.autoHide.element,this.autoHide.timeout,this.autoHide.cb)}; -minplayer.display.prototype.showThenHide=function(a,b,c){var d=typeof a;"undefined"===d?(c=null,a=this.display):"number"===d?(c=b,b=a,a=this.display):"function"===d&&(c=a,a=this.display);a&&(b=b||5E3,this.autoHide={element:a,timeout:b,cb:c},a.forceHide||("undefined"!==typeof a.showMe?a.showMe&&a.showMe(c):(a.show(),c&&c(!0))),a.hoverState||(jQuery(a).bind("mouseenter",function(){a.hoverState=!0}),jQuery(a).bind("mouseleave",function(){a.hoverState=!1})),clearTimeout(this.showTimer),this.showTimer= -setTimeout(function(d){return function g(){a.hoverState?d.showTimer=setTimeout(g,b):"undefined"!==typeof a.hideMe?a.hideMe&&a.hideMe(c):a.hide("slow",function(){c&&c(!1)})}}(this),b))}; -minplayer.display.prototype.fullscreen=function(a){var b=this.isFullScreen(),c=this.fullScreenElement();b&&!a?(c.removeClass("fullscreen"),minplayer.screenfull&&minplayer.screenfull.exit(),this.trigger("fullscreen",!1)):!b&&a&&(c.addClass("fullscreen"),minplayer.screenfull&&(minplayer.screenfull.request(c[0]),minplayer.screenfull.onchange=function(a){return function(b){minplayer.screenfull.isFullscreen||a.fullscreen(!1)}}(this)),this.trigger("fullscreen",!0))}; -minplayer.display.prototype.toggleFullScreen=function(){this.fullscreen(!this.isFullScreen())};minplayer.display.prototype.isFullScreen=function(){return this.fullScreenElement().hasClass("fullscreen")}; -minplayer.display.prototype.getScaledRect=function(a,b){var c={};c.x=b.x?b.x:0;c.y=b.y?b.y:0;c.width=b.width?b.width:0;c.height=b.height?b.height:0;a&&(b.width/b.height>a?(c.height=b.height,c.width=Math.floor(b.height*a)):(c.height=Math.floor(b.width/a),c.width=b.width),c.x=Math.floor((b.width-c.width)/2),c.y=Math.floor((b.height-c.height)/2));return c};minplayer.display.prototype.getElements=function(){return{}}; -jQuery.fn.minplayer||(jQuery.fn.minplayer=function(a){return jQuery(this).each(function(){a=a||{};a.id=a.id||jQuery(this).attr("id")||Math.random();minplayer.plugins[a.id]||(a.template=a.template||"default",minplayer[a.template]?new minplayer[a.template](jQuery(this),a):new minplayer(jQuery(this),a))})});minplayer=jQuery.extend(function(a,b){minplayer.display.call(this,"player",a,b)},minplayer);minplayer.prototype=new minplayer.display;minplayer.prototype.constructor=minplayer; -minplayer.prototype.defaultOptions=function(a){a.id="player";a.build=!1;a.wmode="transparent";a.preload=!0;a.autoplay=!1;a.autoload=!0;a.loop=!1;a.width="100%";a.height="350px";a.debug=!1;a.volume=80;a.files=null;a.file="";a.preview="";a.attributes={};a.plugins={};a.logo="";a.link="";a.duration=0;jQuery.each(this.context[0].attributes,function(b,c){a[c.name]=c.value});minplayer.display.prototype.defaultOptions.call(this,a)}; -minplayer.prototype.construct=function(){minplayer.display.prototype.construct.call(this);var a=null,b;for(b in this.options.plugins)a=this.options.plugins[b],minplayer[a]&&(a=minplayer[a],a[this.options.template]&&a[this.options.template].init?a[this.options.template].init(this):a.init&&a.init(this));this.options.pluginName="player";this.controller=this.create("controller");this.playLoader=this.create("playLoader");this.options.logo&&this.elements.logo&&(a="",this.options.link&&(a+=''),a+='',this.options.link&&(a+=""),this.logo=this.elements.logo.append(a));this.currentPlayer="html5";this.addKeyEvents();this.addEvents();this.load(this.getFiles());this.ready()};minplayer.prototype.setFocus=function(a){minplayer.get.call(this,this.options.id,null,function(b){b.onFocus(a)});this.trigger("playerFocus",a)}; -minplayer.prototype.bindTo=function(a){a.ubind(this.uuid+":error",function(a){return function(c,d){"html5"===a.currentPlayer?(minplayer.player="minplayer",a.options.file.player="minplayer",a.loadPlayer()):a.showError(d)}}(this));a.ubind(this.uuid+":fullscreen",function(a){return function(c,d){a.resize()}}(this))}; -minplayer.prototype.addEvents=function(){var a=!1;this.display.bind("mouseenter",function(b){return function(){a=!0;b.setFocus(!0)}}(this));this.display.bind("mouseleave",function(b){return function(){a=!1;b.setFocus(!1)}}(this));var b=!1;this.display.bind("mousemove",function(c){return function(){b||(b=setTimeout(function(){b=!1;a&&c.setFocus(!0)},300))}}(this));minplayer.get.call(this,this.options.id,null,function(a){return function(b){a.bindTo(b)}}(this))}; -minplayer.prototype.showError=function(a){"object"!==typeof a&&(a=a||"",this.elements.error&&(this.elements.error.text(a),a?(this.elements.error.show(),setTimeout(function(a){return function(){a.elements.error.hide("slow")}}(this),5E3)):this.elements.error.hide()))};minplayer.prototype.addKeyEvents=function(){jQuery(document).bind("keydown",function(a){return function(b){switch(b.keyCode){case 113:case 27:a.isFullScreen()&&a.fullscreen(!1)}}}(this))}; -minplayer.prototype.getFiles=function(){if(this.options.files)return this.options.files;if(this.options.file)return this.options.file;var a=[],b=null;this.elements.media&&((b=this.elements.media.attr("src"))&&a.push({path:b}),jQuery("source",this.elements.media).each(function(){a.push({path:jQuery(this).attr("src"),mimetype:jQuery(this).attr("type"),codecs:jQuery(this).attr("codecs")})}));return a}; -minplayer.getMediaFile=function(a){if(!a)return null;if("string"===typeof a||a.path||a.id)return new minplayer.file(a);var b=0,c=null,d=null,e;for(e in a)a.hasOwnProperty(e)&&(d=new minplayer.file(a[e]),d.player&&d.priority>b&&(b=d.priority,c=d));return c}; -minplayer.prototype.loadPlayer=function(){if(!this.options.file||0===this.elements.display.length||!this.options.file.player)return!1;this.showError();var a=this.options.file.player.toString();if(!this.media||a!==this.currentPlayer){this.currentPlayer=a;if(this.elements.display)return a={},this.media&&(a=this.media.queue,this.media.destroy()),pClass=minplayer.players[this.options.file.player],this.options.mediaelement=this.elements.media,this.media=new pClass(this.elements.display,this.options,a), -this.media.load(this.options.file),this.display.addClass("minplayer-player-"+this.media.mediaFile.player),!0;this.showError("No media display found.")}else if(this.media)return this.media.options=this.options,this.display.removeClass("minplayer-player-"+this.media.mediaFile.player),this.media.load(this.options.file),this.display.addClass("minplayer-player-"+this.media.mediaFile.player),!1}; -minplayer.prototype.load=function(a){this.options.files=a||this.options.files;this.options.file=minplayer.getMediaFile(this.options.files);return this.loadPlayer()?(this.bindTo(this.media),this.options.file.mimetype&&!this.options.file.player?(this.showError("Cannot play media: "+this.options.file.mimetype),!1):!0):!1};minplayer.prototype.resize=function(){this.get(function(a){if(a.onResize)a.onResize()})};minplayer=minplayer||{}; -minplayer.image=function(a,b){this.loaded=!1;this.loader=null;this.ratio=0;this.img=null;minplayer.display.call(this,"image",a,b)};minplayer.image.prototype=new minplayer.display;minplayer.image.prototype.constructor=minplayer.image; -minplayer.image.prototype.construct=function(){minplayer.display.prototype.construct.call(this);this.options.pluginName="image";this.display.css("overflow","hidden");this.loader=new Image;this.loader.onload=function(a){return function(){a.loaded=!0;a.ratio=a.loader.width/a.loader.height;a.resize();a.trigger("loaded")}}(this);this.ready()}; -minplayer.image.prototype.load=function(a){this.clear(function(){this.display.empty();this.img=jQuery(document.createElement("img")).attr({src:""}).hide();this.display.append(this.img);this.loader.src=a;this.img.attr("src",a)})};minplayer.image.prototype.clear=function(a){this.loaded=!1;this.img?this.img.fadeOut(150,function(b){return function(){b.img.attr("src","");b.loader.src="";jQuery(this).remove();a&&a.call(b)}}(this)):a&&a.call(this)}; -minplayer.image.prototype.resize=function(a,b){a=a||this.display.parent().width();b=b||this.display.parent().height();if(a&&b&&this.loaded){var c=this.getScaledRect(this.ratio,{width:a,height:b});this.img&&this.img.attr("src",this.loader.src).css({marginLeft:c.x,marginTop:c.y,width:c.width,height:c.height});this.img.fadeIn(150)}};minplayer.image.prototype.onResize=function(){this.resize()};minplayer=minplayer||{}; -minplayer.file=function(a){if(!a)return null;a="string"===typeof a?{path:a}:a;if(a.hasOwnProperty("isMinPlayerFile"))return a;this.isMinPlayerFile=!0;this.duration=a.duration||0;this.bytesTotal=a.bytesTotal||0;this.quality=a.quality||0;this.stream=a.stream||"";this.path=a.path||"";this.codecs=a.codecs||"";this.extension=a.extension||this.getFileExtension();this.mimetype=a.mimetype||a.filemime||this.getMimeType();this.type=a.type||this.getType();this.type||(this.mimetype=this.getMimeType(),this.type= -this.getType());this.player=minplayer.player||a.player||this.getBestPlayer();this.priority=a.priority||this.getPriority();this.id=a.id||this.getId();this.path||(this.path=this.id)};minplayer.player="";minplayer.file.prototype.getBestPlayer=function(){var a=null,b=0;jQuery.each(minplayer.players,function(c){return function(d,e){var f=e.getPriority(c);e.canPlay(c)&&f>b&&(a=d,b=f)}}(this));return a}; -minplayer.file.prototype.getPriority=function(){var a=1;this.player&&(a=minplayer.players[this.player].getPriority(this));switch(this.mimetype){case "video/x-webm":case "video/webm":case "application/octet-stream":case "application/vnd.apple.mpegurl":return 10*a;case "video/mp4":case "audio/mp4":case "audio/mpeg":return 9*a;case "video/ogg":case "audio/ogg":case "video/quicktime":return 8*a;default:return 5*a}}; -minplayer.file.prototype.getFileExtension=function(){return this.path.substring(this.path.lastIndexOf(".")+1).toLowerCase()}; -minplayer.file.prototype.getMimeType=function(){switch(this.extension){case "mp4":case "m4v":case "flv":case "f4v":return"video/mp4";case "m3u8":return"application/vnd.apple.mpegurl";case "webm":return"video/webm";case "ogg":case "ogv":return"video/ogg";case "3g2":return"video/3gpp2";case "3gpp":case "3gp":return"video/3gpp";case "mov":return"video/quicktime";case "swf":return"application/x-shockwave-flash";case "oga":return"audio/ogg";case "mp3":return"audio/mpeg";case "m4a":case "f4a":return"audio/mp4"; -case "aac":return"audio/aac";case "wav":return"audio/vnd.wave";case "wma":return"audio/x-ms-wma";default:return"unknown"}};minplayer.file.prototype.getType=function(){var a=this.mimetype.match(/([^\/]+)(\/)/),a=a&&1=d&&(a.loading=!1)}})});return a.loading}}(this),1E3),this.ready(),this.isReady()){for(var a in this.readyQueue)this.readyQueue[a].call(this);this.readyQueue.length= -0;this.readyQueue=[];this.loaded||this.trigger("loadstart")}else this.readyQueue.length=0,this.readyQueue=[]};minplayer.players.base.prototype.parseTime=function(a){var b=0,c=0,c=0;if(!a)return 0;"string"!=typeof a&&(a=String(a));(b=a.match(/([0-9]+)s/i))&&(b=parseInt(b[1],10));(c=a.match(/([0-9]+)m/i))&&(b+=60*parseInt(c[1],10));(c=a.match(/([0-9]+)h/i))&&(b+=3600*parseInt(c[1],10));b||(b=a);return Number(b)}; -minplayer.players.base.prototype.setStartStop=function(){if(this.startTime)return this.startTime;this.startTime=0;this.offsetTime=this.parseTime(this.options.range.min);minplayer.urlVars&&(this.startTime=this.parseTime(minplayer.urlVars.seek));this.startTime||(this.startTime=this.offsetTime);this.stopTime=this.options.range.max?this.parseTime(this.options.range.max):0;this.mediaRange=this.stopTime-this.offsetTime;0>this.mediaRange&&(this.mediaRange=0);return this.startTime}; -minplayer.players.base.prototype.onPlaying=function(){if(!this.playing){var a=this;this.getDuration(function(b){a.startTime&&a.startTimea?(c/d+parseFloat(a))*d:c+parseFloat(a);b.seek(e)}})}}(this))};minplayer.players.base.prototype.seek=function(a,b,c){this.whenLoaded(function(){a=Number(a);c||(a+=this.offsetTime);this._seek(a);b&&b.call(this)})};minplayer.players.base.prototype._seek=function(a){}; -minplayer.players.base.prototype.setVolumeRelative=function(a){this.getVolume(function(b){return function(c){c+=parseFloat(a);c=0>c?0:c;b.setVolume(1b.stopTime&&b.stop(function(){b.onComplete()});c-=b.offsetTime;a(c)})};minplayer.players.base.prototype._getCurrentTime=function(a){a(null)}; -minplayer.players.base.prototype.getDuration=function(a){if(this.options.duration)a(this.options.duration);else{var b=this;this.getValue("_getDuration","duration",function(c){b.setStartStop();b.realDuration=c;a(b.mediaRange?b.mediaRange:c)})}};minplayer.players.base.prototype._getDuration=function(a){a(null)};minplayer.players.base.prototype.getBytesStart=function(a){this.getValue("_getBytesStart","bytesStart",a)};minplayer.players.base.prototype._getBytesStart=function(a){a(null)}; -minplayer.players.base.prototype.getBytesLoaded=function(a){this.getValue("_getBytesLoaded","bytesLoaded",a)};minplayer.players.base.prototype._getBytesLoaded=function(a){a(null)};minplayer.players.base.prototype.getBytesTotal=function(a){this.getValue("_getBytesTotal","bytesTotal",a)};minplayer.players.base.prototype._getBytesTotal=function(a){a(null)};minplayer=minplayer||{};minplayer.players=minplayer.players||{}; -minplayer.players.dailymotion=function(a,b,c){this.quality="default";minplayer.players.base.call(this,a,b,c)};minplayer.players.dailymotion.prototype=new minplayer.players.base;minplayer.players.dailymotion.prototype.constructor=minplayer.players.dailymotion;minplayer.players.dailymotion.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this);this.options.pluginName="dailymotion"};minplayer.players.dailymotion.getPriority=function(a){return 10}; -minplayer.players.dailymotion.canPlay=function(a){return"video/dailymotion"===a.mimetype?!0:0===a.path.search(/^http(s)?\:\/\/(www\.)?(dailymotion\.com)/i)};minplayer.players.dailymotion.getMediaId=function(a){var b;b="^http[s]?\\:\\/\\/(www\\.)?(dailymotion\\.com\\/video/)([a-z0-9\\-]+)";b+="_*";b=RegExp(b,"i");return 0===a.path.search(b)?a.path.match(b)[3]:a.path};minplayer.players.dailymotion.getImage=function(a,b,c){c("http://www.dailymotion.com/thumbnail/video/"+a.id)}; -minplayer.players.dailymotion.parseNode=function(a){return{title:node.title,description:node.description,mediafiles:{image:{thumbnail:{path:node.thumbnail_small_url},image:{path:node.thumbnail_url}},media:{media:{player:"dailymotion",id:node.id}}}}};minplayer.players.dailymotion.getNode=function(a,b){var c="https://api.dailymotion.com/video/"+a.id;jQuery.get(c+"?fields=title,id,description,thumbnail_small_url,thumbnail_url",function(a){b(minplayer.players.dailymotion.parseNode(a.data))},"jsonp")}; -minplayer.players.dailymotion.prototype.onReady=function(a){minplayer.players.base.prototype.onReady.call(this);this.options.autoplay||this.pause();this.onLoaded()};minplayer.players.dailymotion.prototype.playerFound=function(){return 0'};minplayer.players.flash.prototype.playerFound=function(){return 0'};minplayer.players.kaltura.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.player.sendNotification("doPlay");a&&a.call(this)})}; -minplayer.players.kaltura.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.player.sendNotification("doPause");a&&a.call(this)})};minplayer.players.kaltura.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.sendNotification("doStop");a&&a.call(this)})};minplayer.players.kaltura.prototype._seek=function(a){this.seekValue=a;this.player.sendNotification("doSeek",a)}; -minplayer.players.kaltura.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.player.sendNotification("changeVolume",a);b&&b.call(this)})};minplayer=minplayer||{};minplayer.controller=function(a,b){minplayer.display.call(this,"controller",a,b)};minplayer.controller.prototype=new minplayer.display;minplayer.controller.prototype.constructor=minplayer.controller; -minplayer.formatTime=function(a){a=a||0;var b=0,c=0,d=0,e="",d=Math.floor(a/3600);a-=3600*d;c=Math.floor(a/60);b=Math.floor((a-60*c)%60);d&&(e+=String(d),e+=":");e+=10<=c?String(c):"0"+String(c);e=e+":"+(10<=b?String(b):"0"+String(b));return{time:e,units:""}};minplayer.controller.prototype.getElements=function(){var a=minplayer.display.prototype.getElements.call(this);return jQuery.extend(a,{play:null,pause:null,fullscreen:null,seek:null,progress:null,volume:null,timer:null})}; -minplayer.controller.prototype.defaultOptions=function(a){a.disptime=0;minplayer.display.prototype.defaultOptions.call(this,a)}; -minplayer.controller.prototype.construct=function(){minplayer.display.prototype.construct.call(this);this.options.pluginName="controller";this.dragging=!1;this.vol=0;this.elements.seek&&(this.seekBar=this.elements.seek.slider({range:"min",create:function(a,b){jQuery(".ui-slider-range",a.target).addClass("ui-state-active")}}));this.elements.volume&&(this.volumeBar=this.elements.volume.slider({animate:!0,range:"min",orientation:"vertical"}));this.get("player",function(a){this.elements.fullscreen&&minplayer.click(this.elements.fullscreen.unbind(), -function(){a.toggleFullScreen()}).css({pointer:"hand"})});this.get("media",function(a){a.hasController()?this.hide():(this.elements.pause&&(minplayer.click(this.elements.pause.unbind(),function(b){return function(c){c.preventDefault();b.playPause(!1,a)}}(this)),a.ubind(this.uuid+":pause",function(a){return function(c){a.setPlayPause(!0)}}(this))),this.elements.play&&(minplayer.click(this.elements.play.unbind(),function(b){return function(c){c.preventDefault();b.playPause(!0,a)}}(this)),a.ubind(this.uuid+ -":playing",function(a){return function(c){a.setPlayPause(!1)}}(this))),this.elements.duration&&(a.ubind(this.uuid+":durationchange",function(a){return function(c,d){a.setTimeString("duration",a.options.disptime||d.duration)}}(this)),a.getDuration(function(a){return function(c){c=a.options.disptime||c;a.setTimeString("duration",c)}}(this))),this.elements.progress&&a.ubind(this.uuid+":progress",function(a){return function(c,d){a.elements.progress.width((d.total?d.loaded/d.total*100:0)+"%")}}(this)), -(this.seekBar||this.elements.timer)&&a.ubind(this.uuid+":timeupdate",function(a){return function(c,d){if(!a.dragging){var e=0;d.duration&&(e=d.currentTime/d.duration*100);a.seekBar&&a.seekBar.slider("option","value",e);a.setTimeString("timer",d.currentTime)}}}(this)),this.seekBar&&this.seekBar.slider({start:function(a){return function(c,d){a.dragging=!0}}(this),stop:function(b){return function(c,d){b.dragging=!1;a.getDuration(function(b){a.seek(d.value/100*b)})}}(this),slide:function(b){return function(c, -d){a.getDuration(function(c){c*=d.value/100;b.dragging||a.seek(c);b.setTimeString("timer",c)})}}(this)}),this.elements.mute&&minplayer.click(this.elements.mute,function(b){return function(c){c.preventDefault();c=b.volumeBar.slider("option","value");0this.playIndex?(this.load(this.playQueue[this.playIndex]),this.playIndex++):this.options.repeat?(this.playIndex=0,this.playNext()):0>=0,b>>=0,this.scroller.style.left=a+"px",this.scroller.style.top=b+"px");this.x=a;this.y=b},_start:function(a){var b=k?a.touches[0]:a,d,e;this.enabled&&(this.options.onBeforeScrollStart&&this.options.onBeforeScrollStart.call(this,a),this.options.useTransition&&this._transitionTime(0),this.zoomed=this.animating=this.moved=!1,this.dirY=this.dirX=this.absDistY=this.absDistX=this.distY=this.distX=0,this.options.momentum&&(this.options.useTransform?(d=getComputedStyle(this.scroller, -null)[c+"Transform"].replace(/[^0-9-.,]/g,"").split(","),e=1*d[4],d=1*d[5]):(e=1*getComputedStyle(this.scroller,null).left.replace(/[^0-9-]/g,""),d=1*getComputedStyle(this.scroller,null).top.replace(/[^0-9-]/g,"")),e!=this.x||d!=this.y)&&(this.options.useTransition?this._unbind("webkitTransitionEnd"):t(this.aniTime),this.steps=[],this._pos(e,d)),this.startX=this.x,this.startY=this.y,this.pointX=b.pageX,this.pointY=b.pageY,this.startTime=a.timeStamp||Date.now(),this.options.onScrollStart&&this.options.onScrollStart.call(this, -a),this._bind(n),this._bind(p),this._bind(q))},_move:function(a){var c=k?a.touches[0]:a,d=c.pageX-this.pointX,e=c.pageY-this.pointY,f=this.x+d,m=this.y+e,g=a.timeStamp||Date.now();this.options.onBeforeScrollMove&&this.options.onBeforeScrollMove.call(this,a);this.pointX=c.pageX;this.pointY=c.pageY;if(0this.absDistX&&6>this.absDistY||(this.options.lockDirection&&(this.absDistX>this.absDistY+5?(m=this.y,e=0):this.absDistY>this.absDistX+5&&(f=this.x,d=0)),this.moved=!0,this._pos(f,m),this.dirX=0d?1:0,this.dirY=0e?1:0,300h&&this.options.momentum){f=d?this._momentum(d-this.startX,h,-this.x,this.scrollerW-this.wrapperW+this.x,this.options.bounce?this.wrapperW:0):f;g=e?this._momentum(e-this.startY,h,-this.y,0>this.maxScrollY?this.scrollerH- -this.wrapperH+this.y:0,this.options.bounce?this.wrapperH:0):g;d=this.x+f.dist;e=this.y+g.dist;if(0>0,e>>0,c)):this._resetPos(200)}else{if(k){for(d=c.target;1!=d.nodeType;)d=d.parentNode;"SELECT"!=d.tagName&&"INPUT"!=d.tagName&&"TEXTAREA"!=d.tagName&&(e=document.createEvent("MouseEvents"), -e.initMouseEvent("click",!0,!0,a.view,1,c.screenX,c.screenY,c.clientX,c.clientY,a.ctrlKey,a.altKey,a.shiftKey,a.metaKey,0,null),e._fake=!0,d.dispatchEvent(e))}this._resetPos(200)}this.options.onTouchEnd&&this.options.onTouchEnd.call(this,a)}},_resetPos:function(a){var b=0<=this.x?0:this.x=e+f.time?(a._pos(f.x,f.y),a.animating=!1,a.options.onAnimationEnd&&a.options.onAnimationEnd.call(a),a._startAni()):(h=(h-e)/f.time-1,g=b.sqrt(1-h*h),h=(f.x-c)*g+c,l=(f.y-d)*g+d,a._pos(h,l),a.animating&&(a.aniTime=w(k)))},k())):a._resetPos(400))},_transitionTime:function(a){this.scroller.style[c+"TransitionDuration"]=a+"ms"},_momentum:function(a,c,d,e,f){c=b.abs(a)/c;var g=c*c/0.0012;0d?(d+=f/(6/(g/c* -6E-4)),c=c*d/g,g=d):0>a&&g>e&&(e+=f/(6/(g/c*6E-4)),c=c*e/g,g=e);return{dist:g*(0>a?-1:1),time:c/6E-4>>0}},_offset:function(a){for(var b=-a.offsetLeft,c=-a.offsetTop;a=a.offsetParent;)b-=a.offsetLeft,c-=a.offsetTop;return{left:b,top:c}},_bind:function(a,b,c){(b||this.scroller).addEventListener(a,this,!!c)},_unbind:function(a,b,c){(b||this.scroller).removeEventListener(a,this,!!c)},destroy:function(){this.scroller.style[c+"Transform"]="";this._unbind(r,window);this._unbind(s);this._unbind(n);this._unbind(p); -this._unbind(q);this._unbind("mouseout",this.wrapper);this.options.useTransition&&this._unbind("webkitTransitionEnd");this.options.onDestroy&&this.options.onDestroy.call(this)},refresh:function(){var a;this.wrapperW=this.wrapper.clientWidth;this.wrapperH=this.wrapper.clientHeight;this.scrollerW=this.scroller.offsetWidth;this.scrollerH=this.scroller.offsetHeight;this.maxScrollX=this.wrapperW-this.scrollerW;this.maxScrollY=this.wrapperH-this.scrollerH;this.dirY=this.dirX=0;this.hScroll=this.options.hScroll&& -0>this.maxScrollX;this.vScroll=this.options.vScroll&&(!this.options.bounceLock&&!this.hScroll||this.scrollerH>this.wrapperH);a=this._offset(this.wrapper);this.wrapperOffsetLeft=-a.left;this.wrapperOffsetTop=-a.top;this.scroller.style[c+"TransitionDuration"]="0";this._resetPos(200)},scrollTo:function(a,b,c,d){var e=a;this.stop();e.length||(e=[{x:a,y:b,time:c,relative:d}]);a=0;for(b=e.length;ab[this.orient.size]()&& -(this.scroll=new osmplayer.iScroll(this.elements.scroll.eq(0)[0],{hScroll:!this.options.vertical,hScrollbar:!this.options.vertical,vScroll:this.options.vertical,vScrollbar:this.options.vertical,hideScrollbar:"none"!==this.options.scrollMode}),"auto"!=this.options.scrollMode||minplayer.hasTouch||this.elements.list.bind("mousemove",function(a){return function(b){b.preventDefault();var c=a.display.offset()[a.orient.offset];a.mousePos=b[a.orient.pagePos];a.mousePos-=c}}(this)).bind("mouseenter",function(a){return function(b){b.preventDefault(); -a.scrolling=!0;var c=function(){if(a.scrolling){var b=a.scroll[a.orient.wrapperSize]/2,e=a.mousePos-b;if(Math.abs(e)>a.options.hysteresis){var h=a.options.hysteresis,e=a.options.scrollSpeed*(e+h*(0=h?a.scrollTo(h):b<=l?a.scrollTo(l):a.scrollTo(e,!0)}setTimeout(c,30)}};c()}}(this)).bind("mouseleave",function(a){return function(b){b.preventDefault();a.scrolling=!1}}(this)),this.scroll.refresh(), -this.scroll.scrollTo(0,0,200))}else setTimeout(function(a){return function(){a.refreshScroll.call(a)}}(this),200)};osmplayer.playlist.prototype.addNode=function(a){var b=this.nodes.length,c=this.create("teaser","osmplayer",this.elements.list);c.setNode(a);c.ubind(this.uuid+":nodeLoad",function(a){return function(c,f){a.loadItem(b,!0)}}(this));this.nodes.push(c)}; -osmplayer.playlist.prototype.set=function(a,b){if("object"!==typeof a)this.trigger("error","Playlist must be an object to set");else if(a.hasOwnProperty("total_rows")){if(a.total_rows&&a.nodes.length){this.totalItems=a.total_rows;this.currentItem=0;(this.page+1)*this.options.pageLimit>=this.totalItems||this.totalItems==a.nodes.length?this.pager.nextPage.hide():this.pager.nextPage.show();var c=a.nodes.length;this.elements.list.empty();this.nodes=[];for(var d=0;d=this.playqueue.length){if(this.options.shuffle)return a=Math.floor(Math.random()*this.totalItems),b=Math.floor(a/this.options.pageLimit),a%=this.options.pageLimit,this.load(b,a);a=this.currentItem+1;return a>=this.nodes.length?this.load(b+1,0):this.loadItem(a)}this.playqueuepos+=1;a=this.playqueue[this.playqueuepos];return this.load(a.page,a.item)}; -osmplayer.playlist.prototype.prev=function(){this.playqueuepos-=1;this.playqueuepos=0>this.playqueuepos?0:this.playqueuepos;var a=this.playqueue[this.playqueuepos];return a?this.load(a.page,a.item):!1};osmplayer.playlist.prototype.loadItem=function(a,b){if(aMath.floor(this.totalItems/this.options.pageLimit))if(this.options.loop)b=a=0;else return!1;this.elements.playlist_busy&&this.elements.playlist_busy.show();a=a||0;a=0>a?0:a;this.setQueue();this.page=a;0===this.page?this.pager.prevPage.hide():this.pager.prevPage.show();if("object"==typeof this.playlist)return this.set(this.playlist, -b),this.playlist.endpoint&&(this.playlist=this.options.playlist=this.playlist.endpoint),!0;var c=osmplayer.parser["default"],d;for(d in osmplayer.parser)osmplayer.parser.hasOwnProperty(d)&&osmplayer.parser[d].valid(this.playlist)&&osmplayer.parser[d].priority>c.priority&&(c=osmplayer.parser[d]);d={type:"GET",url:c.getFeed(this.playlist,this.page*this.options.pageLimit,this.options.pageLimit),success:function(a){return function(d){a.set(c.parse(d),b)}}(this),error:function(a){return function(b,c,d){a.elements.playlist_busy&& -a.elements.playlist_busy.hide();a.trigger("error",c)}}(this)};var e=c.getType();e&&(d.dataType=e);jQuery.ajax(d);return!0};osmplayer=osmplayer||{};osmplayer.pager=function(a,b){minplayer.display.call(this,"pager",a,b)};osmplayer.pager.prototype=new minplayer.display;osmplayer.pager.prototype.constructor=osmplayer.pager; -osmplayer.pager.prototype.construct=function(){minplayer.display.prototype.construct.call(this);this.elements.prevPage&&(this.prevPage=this.elements.prevPage.click(function(a){return function(b){b.preventDefault();a.trigger("prevPage")}}(this)));this.elements.nextPage&&(this.nextPage=this.elements.nextPage.click(function(a){return function(b){b.preventDefault();a.trigger("nextPage")}}(this)))};osmplayer=osmplayer||{}; -osmplayer.teaser=function(a,b){this.preview=null;minplayer.display.call(this,"teaser",a,b)};osmplayer.teaser.prototype=new minplayer.display;osmplayer.teaser.prototype.constructor=osmplayer.teaser;osmplayer.teaser.prototype.select=function(a){}; -osmplayer.teaser.prototype.setNode=function(a){this.node=a;this.elements.title&&(a.title?this.elements.title.text(a.title):osmplayer.getNode(a,function(a){return function(c){a.elements.title.text(c.title)}}(this)));a.mediafiles&&osmplayer.getImage(a.mediafiles,"thumbnail",function(a){return function(c){c&&a.elements.image&&(a.preview=new minplayer.image(a.elements.image),a.preview.load(c.path))}}(this));this.display.unbind("click").click(function(a){return function(c){c.preventDefault();a.trigger("nodeLoad", -a.node)}}(this))}; +function checkPlayType(a,b){if("function"==typeof a.canPlayType){if("object"==typeof b){for(var c=b.length,d="";c--&&!(d=checkPlayType(a,b[c])););return d}var e=a.canPlayType(b);if("no"!==e&&""!==e)return b}return""}var minplayer=minplayer||{};!function(a){!function(){"use strict";var a="undefined"!=typeof module&&module.exports,b="undefined"!=typeof Element&&"ALLOW_KEYBOARD_INPUT"in Element,c=function(){for(var a,b,c=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],d=0,e=c.length,f={};e>d;d++)if(a=c[d],a&&a[1]in document){for(d=0,b=a.length;b>d;d++)f[c[0][d]]=a[d];return f}return!1}(),d={request:function(a){var d=c.requestFullscreen;a=a||document.documentElement,/5\.1[\.\d]* Safari/.test(navigator.userAgent)?a[d]():a[d](b&&Element.ALLOW_KEYBOARD_INPUT)},exit:function(){document[c.exitFullscreen]()},toggle:function(a){this.isFullscreen?this.exit():this.request(a)},onchange:function(){},onerror:function(){},raw:c};return c?(Object.defineProperties(d,{isFullscreen:{get:function(){return!!document[c.fullscreenElement]}},element:{enumerable:!0,get:function(){return document[c.fullscreenElement]}},enabled:{enumerable:!0,get:function(){return!!document[c.fullscreenEnabled]}}}),document.addEventListener(c.fullscreenchange,function(a){d.onchange.call(d,a)}),document.addEventListener(c.fullscreenerror,function(a){d.onerror.call(d,a)}),void(a?module.exports=d:window.screenfull=d)):void(a?module.exports=!1:window.screenfull=!1)}(),a.screenfull=screenfull}(minplayer);var minplayer=minplayer||{};if(minplayer.compatibility=function(){var a=null;a=document.createElement("video"),this.videoOGG=checkPlayType(a,"video/ogg"),this.videoH264=checkPlayType(a,["video/mp4","video/h264"]),this.videoWEBM=checkPlayType(a,["video/x-webm","video/webm","application/octet-stream"]),this.videoMPEGURL=checkPlayType(a,"application/vnd.apple.mpegurl"),a=document.createElement("audio"),this.audioOGG=checkPlayType(a,"audio/ogg"),this.audioMP3=checkPlayType(a,"audio/mpeg"),this.audioMP4=checkPlayType(a,"audio/mp4")},minplayer.playTypes||(minplayer.playTypes=new minplayer.compatibility,minplayer.isAndroid=/android/gi.test(navigator.appVersion),minplayer.isIDevice=/iphone|ipad/gi.test(navigator.appVersion),minplayer.isPlaybook=/playbook/gi.test(navigator.appVersion),minplayer.isTouchPad=/hp-tablet/gi.test(navigator.appVersion),minplayer.hasTouch="ontouchstart"in window&&!minplayer.isTouchPad),!minplayer.urlVars){minplayer.urlVars={};var regEx=/[?&]+([^=&]+)=([^&]*)/gi;window.location.href.replace(regEx,function(a,b,c){minplayer.urlVars[b]=c})}var minplayer=minplayer||{};minplayer.async=function(){this.value=null,this.queue=[]},minplayer.async.prototype.get=function(a){null!==this.value?a(this.value):this.queue.push(a)},minplayer.async.prototype.set=function(a){this.value=a;var b=this.queue.length;if(b){for(;b--;)this.queue[b](a);this.queue=[]}};var minplayer=minplayer||{};minplayer.flags=function(){this.flag=0,this.ids={},this.numFlags=0},minplayer.flags.prototype.setFlag=function(a,b){this.ids.hasOwnProperty(a)||(this.ids[a]=this.numFlags,this.numFlags++),b?this.flag|=1<c;c++)minplayer.queue.hasOwnProperty(c)&&(b=minplayer.queue[c],d=!b.id&&!b.plugin,d|=b.plugin===a.name,d&=!b.id||b.id===this.options.id,d&&!b.addedto.hasOwnProperty(a.options.id)&&(b.addedto[a.options.id]=!0,d=minplayer.bind.call(b.context,b.event,this.options.id,a.name,b.callback,!0)));minplayer.lock=!1},minplayer.eventTypes={},minplayer.plugin.prototype.isEvent=function(a,b){var c=a+"__"+b;return"undefined"!=typeof minplayer.eventTypes[c]?minplayer.eventTypes[c]:(new RegExp("^(.*:)?"+b+"$","gi"),minplayer.eventTypes[c]=null!==a.match(b),minplayer.eventTypes[c])},minplayer.plugin.prototype.trigger=function(a,b,c){if(!this.active)return this;c||(this.triggered[a]=b);var d=0,e={},f=null;for(var g in this.queue)if(this.isEvent(g,a)){f=this.queue[g];for(d in f)f.hasOwnProperty(d)&&(e=f[d],e.callback({target:this,data:e.data},b))}return this},minplayer.plugin.prototype.ubind=function(a,b,c){return this.unbind(a),this.bind(a,b,c)},minplayer.plugin.prototype.bind=function(a,b,c){if(!this.active)return this;if("function"==typeof b&&(c=b,b=null),a&&c){this.queue[a]=this.queue[a]||[],this.queue[a].push({callback:c,data:b});for(var d in this.triggered)this.triggered.hasOwnProperty(d)&&this.isEvent(a,d)&&c({target:this,data:b},this.triggered[d]);return this}},minplayer.plugin.prototype.unbind=function(a){return this.lock&&setTimeout(function(b){return function(){b.unbind(a)}}(this),10),this.lock=!0,a?this.queue.hasOwnProperty(a)&&this.queue[a].length>0&&(this.queue[a].length=0):this.queue={},this.lock=!1,this},minplayer.addQueue=function(a,b,c,d,e){minplayer.lock?setTimeout(function(){minplayer.addQueue(a,c,b,d,e)},10):minplayer.queue.push({context:a,id:c,event:b,plugin:d,callback:e,addedto:{}})},minplayer.bind=function(a,b,c,d,e){if(!d)return!1;var f=minplayer.plugins,g=null,h=null,i=[],j=function(a,b){if(f.hasOwnProperty(a)&&f[a].hasOwnProperty(b))for(var c=f[a][b].length;c--;)i.push(f[a][b][c])};if(b&&c)j(b,c);else if(!b&&c)for(h in f)j(h,c);else if(b&&!c&&f[b])for(g in f[b])j(b,g);else if(!b&&!c)for(h in f)for(g in f[h])j(h,g);for(var k=i.length;k--;)i[k].bind(a,function(a){return function(b){d.call(a,b.target)}}(this));return e||minplayer.addQueue(this,a,b,c,d),i.length>0},minplayer.get=function(a,b,c){var d=typeof a,e=typeof b,f=typeof c;if("function"===d?(c=a,b=a=null):"function"===e?(c=b,b=a,a=null):"undefined"===e&&"undefined"===f&&(b=a,c=a=null),c="function"==typeof c?c:null)return void minplayer.bind.call(this,"ready",a,b,c);var g=minplayer.plugins,h=null;if(!(a||b||c))return g;if(a&&!b&&!c)return g[a];if(a&&b&&!c)return g[a][b];if(!a&&b&&!c){var i=[];for(h in g)if(g.hasOwnProperty(h)&&g[h].hasOwnProperty(b))for(var j=g[h][b].length;j--;)i.push(g[h][b][j]);return i}},minplayer.display=function(a,b,c,d){minplayer.plugin.call(this,a,b,c,d)},minplayer.display.prototype=new minplayer.plugin,minplayer.display.prototype.constructor=minplayer.display,minplayer.display.prototype.getDisplay=function(a){return a},minplayer.display.prototype.initialize=function(){this.display||(this.display=this.getDisplay(this.context,this.options)),this.display&&(this.options.pluginName="display",this.elements=this.getElements(),minplayer.plugin.prototype.initialize.call(this))},minplayer.display.prototype.construct=function(){if(minplayer.plugin.prototype.construct.call(this),this.autoHide=!1,this.onResize){var a=0;jQuery(window).resize(function(b){return function(){clearTimeout(a),a=setTimeout(function(){b.onResize()},200)}}(this))}},minplayer.display.prototype.onResize=!1,minplayer.display.prototype.hide=function(a){a=a||this.display,a&&(a.forceHide=!0,a.unbind().hide())},minplayer.display.prototype.fullScreenElement=function(){return this.display},minplayer.click=function(a,b){var c=!1;return a=jQuery(a),a.bind("touchstart click",function(a){c||(c=!0,setTimeout(function(){c=!1},100),b.call(this,a))}),a},minplayer.display.prototype.onFocus=function(a){this.hasFocus=this.focus=a,this.autoHide&&this.showThenHide(this.autoHide.element,this.autoHide.timeout,this.autoHide.cb)},minplayer.display.prototype.showThenHide=function(a,b,c){var d=typeof a;"undefined"===d?(c=null,a=this.display):"number"===d?(c=b,b=a,a=this.display):"function"===d&&(c=a,a=this.display),a&&(b=b||5e3,this.autoHide={element:a,timeout:b,cb:c},a.forceHide||("undefined"!=typeof a.showMe?a.showMe&&a.showMe(c):(a.show(),c&&c(!0))),a.hoverState||(jQuery(a).bind("mouseenter",function(){a.hoverState=!0}),jQuery(a).bind("mouseleave",function(){a.hoverState=!1})),clearTimeout(this.showTimer),this.showTimer=setTimeout(function(d){return function e(){a.hoverState?d.showTimer=setTimeout(e,b):"undefined"!=typeof a.hideMe?a.hideMe&&a.hideMe(c):a.hide("slow",function(){c&&c(!1)})}}(this),b))},minplayer.display.prototype.fullscreen=function(a){var b=this.isFullScreen(),c=this.fullScreenElement();b&&!a?(c.removeClass("fullscreen"),minplayer.screenfull&&minplayer.screenfull.exit(),this.trigger("fullscreen",!1)):!b&&a&&(c.addClass("fullscreen"),minplayer.screenfull&&(minplayer.screenfull.request(c[0]),minplayer.screenfull.onchange=function(a){return function(){minplayer.screenfull.isFullscreen||a.fullscreen(!1)}}(this)),this.trigger("fullscreen",!0))},minplayer.display.prototype.toggleFullScreen=function(){this.fullscreen(!this.isFullScreen())},minplayer.display.prototype.isFullScreen=function(){return this.fullScreenElement().hasClass("fullscreen")},minplayer.display.prototype.getScaledRect=function(a,b){var c={};return c.x=b.x?b.x:0,c.y=b.y?b.y:0,c.width=b.width?b.width:0,c.height=b.height?b.height:0,a&&(b.width/b.height>a?(c.height=b.height,c.width=Math.floor(b.height*a)):(c.height=Math.floor(b.width/a),c.width=b.width),c.x=Math.floor((b.width-c.width)/2),c.y=Math.floor((b.height-c.height)/2)),c},minplayer.display.prototype.getElements=function(){return{}},jQuery.fn.minplayer||(jQuery.fn.minplayer=function(a){return jQuery(this).each(function(){a=a||{},a.id=a.id||jQuery(this).attr("id")||Math.random(),minplayer.plugins[a.id]||(a.template=a.template||"default",minplayer[a.template]?new minplayer[a.template](jQuery(this),a):new minplayer(jQuery(this),a))})}),minplayer=jQuery.extend(function(a,b){minplayer.display.call(this,"player",a,b)},minplayer),minplayer.prototype=new minplayer.display,minplayer.prototype.constructor=minplayer,minplayer.prototype.defaultOptions=function(a){a.id="player",a.build=!1,a.wmode="transparent",a.preload=!0,a.autoplay=!1,a.autoload=!0,a.loop=!1,a.width="100%",a.height="350px",a.debug=!1,a.volume=80,a.files=null,a.file="",a.preview="",a.attributes={},a.plugins={},a.logo="",a.link="",a.duration=0,jQuery.each(this.context[0].attributes,function(b,c){a[c.name]=c.value}),minplayer.display.prototype.defaultOptions.call(this,a)},minplayer.prototype.construct=function(){minplayer.display.prototype.construct.call(this);var a=null;for(var b in this.options.plugins)a=this.options.plugins[b],minplayer[a]&&(a=minplayer[a],a[this.options.template]&&a[this.options.template].init?a[this.options.template].init(this):a.init&&a.init(this));if(this.options.pluginName="player",this.controller=this.create("controller"),this.playLoader=this.create("playLoader"),this.options.logo&&this.elements.logo){var c="";this.options.link&&(c+=''),c+='',this.options.link&&(c+=""),this.logo=this.elements.logo.append(c)}this.currentPlayer="html5",this.addKeyEvents(),this.addEvents(),this.load(this.getFiles()),this.ready()},minplayer.prototype.setFocus=function(a){minplayer.get.call(this,this.options.id,null,function(b){b.onFocus(a)}),this.trigger("playerFocus",a)},minplayer.prototype.bindTo=function(a){a.ubind(this.uuid+":error",function(a){return function(b,c){"html5"===a.currentPlayer?(minplayer.player="minplayer",a.options.file.player="minplayer",a.loadPlayer()):a.showError(c)}}(this)),a.ubind(this.uuid+":fullscreen",function(a){return function(){a.resize()}}(this))},minplayer.prototype.addEvents=function(){var a=!1;this.display.bind("mouseenter",function(b){return function(){a=!0,b.setFocus(!0)}}(this)),this.display.bind("mouseleave",function(b){return function(){a=!1,b.setFocus(!1)}}(this));var b=!1;this.display.bind("mousemove",function(c){return function(){b||(b=setTimeout(function(){b=!1,a&&c.setFocus(!0)},300))}}(this)),minplayer.get.call(this,this.options.id,null,function(a){return function(b){a.bindTo(b)}}(this))},minplayer.prototype.showError=function(a){"object"!=typeof a&&(a=a||"",this.elements.error&&(this.elements.error.text(a),a?(this.elements.error.show(),setTimeout(function(a){return function(){a.elements.error.hide("slow")}}(this),5e3)):this.elements.error.hide()))},minplayer.prototype.addKeyEvents=function(){jQuery(document).bind("keydown",function(a){return function(b){switch(b.keyCode){case 113:case 27:a.isFullScreen()&&a.fullscreen(!1)}}}(this))},minplayer.prototype.getFiles=function(){if(this.options.files)return this.options.files;if(this.options.file)return this.options.file;var a=[],b=null;return this.elements.media&&(b=this.elements.media.attr("src"),b&&a.push({path:b}),jQuery("source",this.elements.media).each(function(){a.push({path:jQuery(this).attr("src"),mimetype:jQuery(this).attr("type"),codecs:jQuery(this).attr("codecs")})})),a},minplayer.getMediaFile=function(a){if(!a)return null;if("string"==typeof a||a.path||a.id)return new minplayer.file(a);var b=0,c=null,d=null;for(var e in a)a.hasOwnProperty(e)&&(d=new minplayer.file(a[e]),d.player&&d.priority>b&&(b=d.priority,c=d));return c},minplayer.prototype.loadPlayer=function(){if(!this.options.file||0===this.elements.display.length)return!1;if(!this.options.file.player)return!1;this.showError();var a=this.options.file.player.toString();if(!this.media||a!==this.currentPlayer){if(this.currentPlayer=a,!this.elements.display)return void this.showError("No media display found.");var b={};return this.media&&(b=this.media.queue,this.media.destroy()),pClass=minplayer.players[this.options.file.player],this.options.mediaelement=this.elements.media,this.media=new pClass(this.elements.display,this.options,b),this.media.load(this.options.file),this.display.addClass("minplayer-player-"+this.media.mediaFile.player),!0}return this.media?(this.media.options=this.options,this.display.removeClass("minplayer-player-"+this.media.mediaFile.player),this.media.load(this.options.file),this.display.addClass("minplayer-player-"+this.media.mediaFile.player),!1):void 0},minplayer.prototype.load=function(a){return this.options.files=a||this.options.files,this.options.file=minplayer.getMediaFile(this.options.files),this.loadPlayer()?(this.bindTo(this.media),this.options.file.mimetype&&!this.options.file.player?(this.showError("Cannot play media: "+this.options.file.mimetype),!1):!0):!1},minplayer.prototype.resize=function(){this.get(function(a){a.onResize&&a.onResize()})};var minplayer=minplayer||{};minplayer.image=function(a,b){this.loaded=!1,this.loader=null,this.ratio=0,this.img=null,minplayer.display.call(this,"image",a,b)},minplayer.image.prototype=new minplayer.display,minplayer.image.prototype.constructor=minplayer.image,minplayer.image.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.options.pluginName="image",this.display.css("overflow","hidden"),this.loader=new Image,this.loader.onload=function(a){return function(){a.loaded=!0,a.ratio=a.loader.width/a.loader.height,a.resize(),a.trigger("loaded")}}(this),this.ready()},minplayer.image.prototype.load=function(a){this.clear(function(){this.display.empty(),this.img=jQuery(document.createElement("img")).attr({src:""}).hide(),this.display.append(this.img),this.loader.src=a,this.img.attr("src",a)})},minplayer.image.prototype.clear=function(a){this.loaded=!1,this.img?this.img.fadeOut(150,function(b){return function(){b.img.attr("src",""),b.loader.src="",jQuery(this).remove(),a&&a.call(b)}}(this)):a&&a.call(this)},minplayer.image.prototype.resize=function(a,b){if(a=a||this.display.parent().width(),b=b||this.display.parent().height(),a&&b&&this.loaded){var c=this.getScaledRect(this.ratio,{width:a,height:b});this.img&&this.img.attr("src",this.loader.src).css({marginLeft:c.x,marginTop:c.y,width:c.width,height:c.height}),this.img.fadeIn(150)}},minplayer.image.prototype.onResize=function(){this.resize()};var minplayer=minplayer||{};minplayer.file=function(a){return a?(a="string"==typeof a?{path:a}:a,a.hasOwnProperty("isMinPlayerFile")?a:(this.isMinPlayerFile=!0,this.duration=a.duration||0,this.bytesTotal=a.bytesTotal||0,this.quality=a.quality||0,this.stream=a.stream||"",this.path=a.path||"",this.codecs=a.codecs||"",this.extension=a.extension||this.getFileExtension(),this.mimetype=a.mimetype||a.filemime||this.getMimeType(),this.type=a.type||this.getType(),this.type||(this.mimetype=this.getMimeType(),this.type=this.getType()),this.player=minplayer.player||a.player||this.getBestPlayer(),this.priority=a.priority||this.getPriority(),this.id=a.id||this.getId(),void(this.path||(this.path=this.id)))):null},minplayer.player="",minplayer.file.prototype.getBestPlayer=function(){var a=null,b=0;return jQuery.each(minplayer.players,function(c){return function(d,e){var f=e.getPriority(c);e.canPlay(c)&&f>b&&(a=d,b=f)}}(this)),a},minplayer.file.prototype.getPriority=function(){var a=1;switch(this.player&&(a=minplayer.players[this.player].getPriority(this)),this.mimetype){case"video/x-webm":case"video/webm":case"application/octet-stream":case"application/vnd.apple.mpegurl":return 10*a;case"video/mp4":case"audio/mp4":case"audio/mpeg":return 9*a;case"video/ogg":case"audio/ogg":case"video/quicktime":return 8*a;default:return 5*a}},minplayer.file.prototype.getFileExtension=function(){return this.path.substring(this.path.lastIndexOf(".")+1).toLowerCase()},minplayer.file.prototype.getMimeType=function(){switch(this.extension){case"mp4":case"m4v":case"flv":case"f4v":return"video/mp4";case"m3u8":return"application/vnd.apple.mpegurl";case"webm":return"video/webm";case"ogg":case"ogv":return"video/ogg";case"3g2":return"video/3gpp2";case"3gpp":case"3gp":return"video/3gpp";case"mov":return"video/quicktime";case"swf":return"application/x-shockwave-flash";case"oga":return"audio/ogg";case"mp3":return"audio/mpeg";case"m4a":case"f4a":return"audio/mp4";case"aac":return"audio/aac";case"wav":return"audio/vnd.wave";case"wma":return"audio/x-ms-wma";default:return"unknown"}},minplayer.file.prototype.getType=function(){var a=this.mimetype.match(/([^\/]+)(\/)/);if(a=a&&a.length>1?a[1]:"","video"===a)return"video";if("audio"===a)return"audio";switch(this.mimetype){case"application/octet-stream":case"application/x-shockwave-flash":case"application/vnd.apple.mpegurl":return"video"}return""},minplayer.file.prototype.getId=function(){var a=minplayer.players[this.player];return a&&a.getMediaId?a.getMediaId(this):""};var minplayer=minplayer||{};minplayer.playLoader=function(a,b){this.clear(),minplayer.display.call(this,"playLoader",a,b)},minplayer.playLoader.prototype=new minplayer.display,minplayer.playLoader.prototype.constructor=minplayer.playLoader,minplayer.playLoader.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.options.pluginName="playLoader",this.initializePlayLoader(),this.ready()},minplayer.playLoader.prototype.initializePlayLoader=function(){this.get("media",function(a){if(a.hasPlayLoader(this.options.preview))this.enabled=!1,this.hide(this.elements.busy),this.hide(this.elements.bigPlay),this.hide(this.elements.preview),this.hide();else{this.enabled=!0,this.options.preview||(this.options.preview=a.poster);var b=!0;this.preview&&this.preview.loader&&(b=this.preview.loader.src!==this.options.preview),b&&(a.elements.media.attr("poster",""),this.loadPreview()),this.elements.bigPlay&&minplayer.click(this.elements.bigPlay.unbind(),function(b){b.preventDefault(),jQuery(this).hide(),a.play()}),a.ubind(this.uuid+":loadstart",function(a){return function(){a.busy.setFlag("media",!0),a.bigPlay.setFlag("media",!0),a.previewFlag.setFlag("media",!0),a.checkVisibility()}}(this)),a.ubind(this.uuid+":waiting",function(a){return function(b,c,d){d||(a.busy.setFlag("media",!0),a.checkVisibility())}}(this)),a.ubind(this.uuid+":loadeddata",function(a){return function(b,c,d){d||(a.busy.setFlag("media",!1),a.checkVisibility())}}(this)),a.ubind(this.uuid+":playing",function(b){return function(c,d,e){e||(b.busy.setFlag("media",!1),b.bigPlay.setFlag("media",!1),"audio"!==a.mediaFile.type&&b.previewFlag.setFlag("media",!1),b.checkVisibility())}}(this)),a.ubind(this.uuid+":pause",function(a){return function(b,c,d){d||(a.busy.setFlag("media",!1),a.bigPlay.setFlag("media",!0),a.checkVisibility())}}(this))}})},minplayer.playLoader.prototype.clear=function(a){this.busy=new minplayer.flags,this.bigPlay=new minplayer.flags,this.previewFlag=new minplayer.flags,this.enabled=!0,this.preview?this.preview.clear(function(b){return function(){b.preview=null,a&&a()}}(this)):(this.preview=null,a&&a())},minplayer.playLoader.prototype.loadPreview=function(a){if(a=a||this.options.preview,this.options.preview=a,this.enabled&&0!==this.display.length){if(this.elements.preview){if(this.options.preview)return this.elements.preview.addClass("has-preview").show(),this.preview=new minplayer.image(this.elements.preview,this.options),this.preview.load(this.options.preview),!0;this.elements.preview.hide()}return!1}},minplayer.playLoader.prototype.checkVisibility=function(){this.enabled&&(this.busy.flag?this.elements.busy.show():this.elements.busy.hide(),this.bigPlay.flag?this.elements.bigPlay.show():this.elements.bigPlay.hide(),this.previewFlag.flag?this.elements.preview.show():this.elements.preview.hide(),(this.bigPlay.flag||this.busy.flag||this.previewFlag.flag)&&this.display.show(),this.bigPlay.flag||this.busy.flag||this.previewFlag.flag||this.display.hide())};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.base=function(a,b,c){minplayer.display.call(this,"media",a,b,c)},minplayer.players.base.prototype=new minplayer.display,minplayer.players.base.prototype.constructor=minplayer.players.base,minplayer.players.base.prototype.getElements=function(){var a=minplayer.display.prototype.getElements.call(this);return jQuery.extend(a,{media:this.options.mediaelement})},minplayer.players.base.prototype.defaultOptions=function(a){a.range={min:0,max:0},minplayer.display.prototype.defaultOptions.call(this,a)},minplayer.players.base.getPriority=function(){return 0},minplayer.players.base.getMediaId=function(){return""},minplayer.players.base.canPlay=function(){return!1},minplayer.players.base.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.elements.media&&(this.poster=this.elements.media.attr("poster")),this.options.pluginName="basePlayer",this.readyQueue=[],this.loadedQueue=[],this.mediaFile=this.options.file,this.clear(),this.setupPlayer()},minplayer.players.base.prototype.setupPlayer=function(){this.playerFound()||this.addPlayer(),this.player=this.getPlayer(),minplayer.click(this.display,function(a){return function(){a.playing?a.pause():a.play()}}(this)),jQuery(document).bind("keydown",function(a){return function(b){if(a.hasFocus)switch(b.preventDefault(),b.keyCode){case 32:case 179:a.playing?a.pause():a.play();break;case 38:a.setVolumeRelative(.1);break;case 40:a.setVolumeRelative(-.1);break;case 37:case 227:a.seekRelative(-.05);break;case 39:case 228:a.seekRelative(.05)}}}(this))},minplayer.players.base.prototype.addPlayer=function(){this.elements.media&&this.elements.media.remove(),this.elements.media=jQuery(this.createPlayer()),this.display.html(this.elements.media)},minplayer.players.base.prototype.destroy=function(){minplayer.plugin.prototype.destroy.call(this),this.clear()},minplayer.players.base.prototype.clear=function(){this.playerReady=!1,this.reset(),this.player&&(jQuery(this.player).remove(),this.player=null)},minplayer.players.base.prototype.reset=function(){this.realDuration=0,this.duration=new minplayer.async,this.currentTime=new minplayer.async,this.bytesLoaded=new minplayer.async,this.bytesTotal=new minplayer.async,this.bytesStart=new minplayer.async,this.volume=new minplayer.async,this.hasFocus=!1,this.playing=!1,this.loading=!1,this.loaded=!1,this.trigger("pause",null,!0),this.trigger("waiting",null,!0),this.trigger("progress",{loaded:0,total:0,start:0},!0),this.trigger("timeupdate",{currentTime:0,duration:0},!0)},minplayer.players.base.prototype.onReady=function(){if(!this.playerReady)if(this.setStartStop(),this.playerReady=!0,this.setVolume(this.options.volume/100),this.loading=!0,this.poll("progress",function(a){return function(){return a.loading&&a.getBytesLoaded(function(b){a.getBytesTotal(function(c){if(b||c){var d=0;a.getBytesStart(function(a){d=a}),a.trigger("progress",{loaded:b,total:c,start:d}),b>=c&&(a.loading=!1)}})}),a.loading}}(this),1e3),this.ready(),this.isReady()){for(var a in this.readyQueue)this.readyQueue[a].call(this);this.readyQueue.length=0,this.readyQueue=[],this.loaded||this.trigger("loadstart")}else this.readyQueue.length=0,this.readyQueue=[]},minplayer.players.base.prototype.parseTime=function(a){var b=0,c=0,d=0;return a?("string"!=typeof a&&(a=String(a)),b=a.match(/([0-9]+)s/i),b&&(b=parseInt(b[1],10)),c=a.match(/([0-9]+)m/i),c&&(b+=60*parseInt(c[1],10)),d=a.match(/([0-9]+)h/i),d&&(b+=3600*parseInt(d[1],10)),b||(b=a),Number(b)):0},minplayer.players.base.prototype.setStartStop=function(){return this.startTime?this.startTime:(this.startTime=0,this.offsetTime=this.parseTime(this.options.range.min),minplayer.urlVars&&(this.startTime=this.parseTime(minplayer.urlVars.seek)),this.startTime||(this.startTime=this.offsetTime),this.stopTime=this.options.range.max?this.parseTime(this.options.range.max):0,this.mediaRange=this.stopTime-this.offsetTime,this.mediaRange<0&&(this.mediaRange=0),this.startTime)},minplayer.players.base.prototype.onPlaying=function(){if(!this.playing){var a=this;this.getDuration(function(b){a.startTime&&a.startTime-1&&1>a?(c/d+parseFloat(a))*d:c+parseFloat(a),b.seek(e)}})}}(this))},minplayer.players.base.prototype.seek=function(a,b,c){this.whenLoaded(function(){a=Number(a),c||(a+=this.offsetTime),this._seek(a),b&&b.call(this)})},minplayer.players.base.prototype._seek=function(){},minplayer.players.base.prototype.setVolumeRelative=function(a){this.getVolume(function(b){return function(c){c+=parseFloat(a),c=0>c?0:c,c=c>1?1:c,b.setVolume(c)}}(this))},minplayer.players.base.prototype.setVolume=function(a,b){this.trigger("volumeupdate",a),this.whenLoaded(b)},minplayer.players.base.prototype.getValue=function(a,b,c){this.whenLoaded(function(){var d=this;this[a](function(a){null!==a?c.call(d,a):d[b].get(c)})})},minplayer.players.base.prototype.getVolume=function(a){this.getValue("_getVolume","volume",a)},minplayer.players.base.prototype._getVolume=function(a){a(null)},minplayer.players.base.prototype.getCurrentTime=function(a){var b=this;this.getValue("_getCurrentTime","currentTime",function(c){b.setStartStop(),b.stopTime&&c>b.stopTime&&b.stop(function(){b.onComplete()}),c-=b.offsetTime,a(c)})},minplayer.players.base.prototype._getCurrentTime=function(a){a(null)},minplayer.players.base.prototype.getDuration=function(a){if(this.options.duration)a(this.options.duration);else{var b=this;this.getValue("_getDuration","duration",function(c){b.setStartStop(),b.realDuration=c,a(b.mediaRange?b.mediaRange:c) +})}},minplayer.players.base.prototype._getDuration=function(a){a(null)},minplayer.players.base.prototype.getBytesStart=function(a){this.getValue("_getBytesStart","bytesStart",a)},minplayer.players.base.prototype._getBytesStart=function(a){a(null)},minplayer.players.base.prototype.getBytesLoaded=function(a){this.getValue("_getBytesLoaded","bytesLoaded",a)},minplayer.players.base.prototype._getBytesLoaded=function(a){a(null)},minplayer.players.base.prototype.getBytesTotal=function(a){this.getValue("_getBytesTotal","bytesTotal",a)},minplayer.players.base.prototype._getBytesTotal=function(a){a(null)};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.dailymotion=function(a,b,c){this.quality="default",minplayer.players.base.call(this,a,b,c)},minplayer.players.dailymotion.prototype=new minplayer.players.base,minplayer.players.dailymotion.prototype.constructor=minplayer.players.dailymotion,minplayer.players.dailymotion.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="dailymotion"},minplayer.players.dailymotion.getPriority=function(){return 10},minplayer.players.dailymotion.canPlay=function(a){if("video/dailymotion"===a.mimetype)return!0;var b=/^http(s)?\:\/\/(www\.)?(dailymotion\.com)/i;return 0===a.path.search(b)},minplayer.players.dailymotion.getMediaId=function(a){var b="^http[s]?\\:\\/\\/(www\\.)?";b+="(dailymotion\\.com\\/video/)",b+="([a-z0-9\\-]+)",b+="_*";var c=RegExp(b,"i");return 0===a.path.search(c)?a.path.match(c)[3]:a.path},minplayer.players.dailymotion.getImage=function(a,b,c){c("http://www.dailymotion.com/thumbnail/video/"+a.id)},minplayer.players.dailymotion.parseNode=function(){return{title:node.title,description:node.description,mediafiles:{image:{thumbnail:{path:node.thumbnail_small_url},image:{path:node.thumbnail_url}},media:{media:{player:"dailymotion",id:node.id}}}}},minplayer.players.dailymotion.getNode=function(a,b){var c="https://api.dailymotion.com/video/"+a.id;c+="?fields=title,id,description,thumbnail_small_url,thumbnail_url",jQuery.get(c,function(a){b(minplayer.players.dailymotion.parseNode(a.data))},"jsonp")},minplayer.players.dailymotion.prototype.onReady=function(){minplayer.players.base.prototype.onReady.call(this),this.options.autoplay||this.pause(),this.onLoaded()},minplayer.players.dailymotion.prototype.playerFound=function(){return this.display.find(this.mediaFile.type).length>0},minplayer.players.dailymotion.prototype.onQualityChange=function(a){this.quality=a.data},minplayer.players.dailymotion.prototype.hasPlayLoader=function(a){return minplayer.hasTouch||!a},minplayer.players.dailymotion.prototype.hasController=function(){return minplayer.isIDevice},minplayer.players.dailymotion.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a=document.location.protocol;if(a+="//api.dmcdn.net/all.js",0===jQuery('script[src="'+a+'"]').length){var b=document.createElement("script");b.src=a;var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(b,c)}return this.playerId=this.options.id+"-player",this.poll(this.options.id+"_dailymotion",function(a){return function(){var b=jQuery("#"+a.playerId).length>0;if(b=b&&"DM"in window,b=b&&"function"==typeof DM.player){jQuery("#"+a.playerId).addClass("dailymotion-player");var c={};c={id:a.playerId,api:minplayer.isIDevice?0:1,wmode:"opaque",controls:minplayer.isAndroid?1:0,related:0,info:0,logo:0},a.player=new DM.player(a.playerId,{video:a.mediaFile.id,height:"100%",width:"100%",frameborder:0,params:c}),a.player.addEventListener("apiready",function(){a.onReady(a)}),a.player.addEventListener("ended",function(){a.onComplete(a)}),a.player.addEventListener("playing",function(){a.onPlaying(a)}),a.player.addEventListener("progress",function(){a.onWaiting(a)}),a.player.addEventListener("pause",function(){a.onPaused(a)}),a.player.addEventListener("error",function(){a.onError(a)})}return!b}}(this),200),jQuery(document.createElement("div")).attr({id:this.playerId})},minplayer.players.dailymotion.prototype.load=function(a,b){minplayer.players.base.prototype.load.call(this,a,function(){this.player.load(a.id),b&&b.call(this)})},minplayer.players.dailymotion.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.onWaiting(),this.player.play(),a&&a.call(this)})},minplayer.players.dailymotion.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.loaded&&(this.player.pause(),a&&a.call(this))})},minplayer.players.dailymotion.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.pause(),a&&a.call(this)})},minplayer.players.dailymotion.prototype._seek=function(a){this.onWaiting(),this.player.seek(a)},minplayer.players.dailymotion.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.loaded&&(this.player.setVolume(a),void 0!==b&&b.call(this))})},minplayer.players.dailymotion.prototype._getVolume=function(a){a(this.player.volume)},minplayer.players.dailymotion.prototype._getDuration=function(a){a(this.player.duration)},minplayer.players.dailymotion.prototype._getCurrentTime=function(a){a(this.player.currentTime)};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.html5=function(a,b,c){minplayer.players.base.call(this,a,b,c)},minplayer.players.html5.prototype=new minplayer.players.base,minplayer.players.html5.prototype.constructor=minplayer.players.html5,minplayer.players.html5.getPriority=function(){return 10},minplayer.players.html5.canPlay=function(a){switch(a.mimetype){case"video/ogg":return!!minplayer.playTypes.videoOGG;case"video/mp4":case"video/x-mp4":case"video/m4v":case"video/x-m4v":return!!minplayer.playTypes.videoH264;case"application/vnd.apple.mpegurl":return!!minplayer.playTypes.videoMPEGURL;case"video/x-webm":case"video/webm":case"application/octet-stream":return!!minplayer.playTypes.videoWEBM;case"audio/ogg":return!!minplayer.playTypes.audioOGG;case"audio/mpeg":return!!minplayer.playTypes.audioMP3;case"audio/mp4":return!!minplayer.playTypes.audioMP4;default:return!1}},minplayer.players.html5.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="html5",this.hasEnded=!1,this.addPlayerEvents()},minplayer.players.html5.prototype.addPlayerEvent=function(a,b){this.player&&this.player.addEventListener(a,function(c){var d=a+"Event";return c[d]&&c.player.removeEventListener(a,c[d],!1),c[d]=function(a){b.call(c,a)},c[d]}(this),!1)},minplayer.players.html5.prototype.addPlayerEvents=function(){if(this.player){this.addPlayerEvent("abort",function(){this.trigger("abort")}),this.addPlayerEvent("loadstart",function(){this.onReady(),this.options.autoload||this.onLoaded()}),this.addPlayerEvent("loadeddata",function(){this.onLoaded()}),this.addPlayerEvent("loadedmetadata",function(){this.onLoaded()}),this.addPlayerEvent("canplaythrough",function(){this.onLoaded()}),this.addPlayerEvent("ended",function(){this.hasEnded=!0,this.onComplete()}),this.addPlayerEvent("pause",function(){this.onPaused()}),this.addPlayerEvent("play",function(){this.onPlaying()}),this.addPlayerEvent("playing",function(){this.onPlaying()});var a=!1;return this.addPlayerEvent("error",function(){this.hasEnded||a||!this.player||(a=!0,this.trigger("error","An error occured - "+this.player.error.code))}),this.addPlayerEvent("waiting",function(){this.onWaiting()}),this.addPlayerEvent("durationchange",function(){if(this.player){this.duration.set(this.player.duration);var a=this;this.getDuration(function(b){a.trigger("durationchange",{duration:b})})}}),this.addPlayerEvent("progress",function(a){this.bytesTotal.set(a.total),this.bytesLoaded.set(a.loaded)}),!0}return!1},minplayer.players.html5.prototype.onReady=function(){minplayer.players.base.prototype.onReady.call(this),minplayer.isAndroid&&this.onLoaded(),minplayer.isIDevice&&setTimeout(function(a){return function(){a.pause(),a.onLoaded()}}(this),1)},minplayer.players.html5.prototype.playerFound=function(){return this.display.find(this.mediaFile.type).length>0},minplayer.players.html5.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a=jQuery(document.createElement(this.mediaFile.type)).attr(this.options.attributes).append(jQuery(document.createElement("source")).attr({src:this.mediaFile.path}));a.eq(0)[0].setAttribute("width","100%"),a.eq(0)[0].setAttribute("height","100%");var b=this.options.autoload?"metadata":"none";return b=minplayer.isIDevice?"metadata":b,a.eq(0)[0].setAttribute("preload",b),this.options.autoload||a.eq(0)[0].setAttribute("autobuffer",!1),a},minplayer.players.html5.prototype.getPlayer=function(){return this.elements.media.eq(0)[0]},minplayer.players.html5.prototype.load=function(a,b){minplayer.players.base.prototype.load.call(this,a,function(){this.hasEnded=!1;var c=this.elements.media.attr("src");c||(c=jQuery("source",this.elements.media).eq(0).attr("src")),c!==a.path&&(this.addPlayer(),this.player=this.getPlayer(),this.addPlayerEvents(),this.player.src=a.path,b&&b.call(this))})},minplayer.players.html5.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.player.play(),a&&a.call(this)})},minplayer.players.html5.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.player.pause(),a&&a.call(this)})},minplayer.players.html5.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.pause(),a&&a.call(this)})},minplayer.players.html5.prototype.clear=function(){minplayer.players.base.prototype.clear.call(this),this.player&&(this.player.src="")},minplayer.players.html5.prototype._seek=function(a){this.player.currentTime=a},minplayer.players.html5.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.player.volume=a,b&&b.call(this)})},minplayer.players.html5.prototype._getVolume=function(a){a(this.player.volume)},minplayer.players.html5.prototype._getDuration=function(a){a(this.player.duration)},minplayer.players.html5.prototype._getCurrentTime=function(a){a(this.player.currentTime)},minplayer.players.html5.prototype._getBytesLoaded=function(a){var b=0;this.bytesLoaded.value?b=this.bytesLoaded.value:this.player.buffered&&this.player.buffered.length>0&&this.player.buffered.end&&this.player.duration?b=this.player.buffered.end(0):void 0!==this.player.bytesTotal&&this.player.bytesTotal>0&&void 0!==this.player.bufferedBytes&&(b=this.player.bufferedBytes),a(b)},minplayer.players.html5.prototype._getBytesTotal=function(a){var b=0;this.bytesTotal.value?b=this.bytesTotal.value:this.player.buffered&&this.player.buffered.length>0&&this.player.buffered.end&&this.player.duration?b=this.player.duration:void 0!==this.player.bytesTotal&&this.player.bytesTotal>0&&void 0!==this.player.bufferedBytes&&(b=this.player.bytesTotal),a(b)};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.flash=function(a,b,c){minplayer.players.base.call(this,a,b,c)},minplayer.players.flash.prototype=new minplayer.players.base,minplayer.players.flash.prototype.constructor=minplayer.players.flash,minplayer.players.flash.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="flash"},minplayer.players.flash.getPriority=function(){return 0},minplayer.players.flash.canPlay=function(){return!1},minplayer.players.flash.prototype.getFlash=function(a){var b=document.createElement("script");b.src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js";var c=document.getElementsByTagName("script")[0];return c.parentNode.insertBefore(b,c),setTimeout(function(b){return function c(){"undefined"!=typeof swfobject?swfobject.embedSWF(a.swf,a.id,a.width,a.height,"9.0.0",!1,a.flashvars,{allowscriptaccess:"always",allowfullscreen:"true",wmode:a.wmode,quality:"high"},{id:a.id,name:a.id,playerType:"flash"},function(a){b.player=a.ref}):setTimeout(c,200)}}(this),200),'
'},minplayer.players.flash.prototype.playerFound=function(){return this.display.find('object[playerType="flash"]').length>0};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.minplayer=function(a,b,c){minplayer.players.flash.call(this,a,b,c)},minplayer.players.minplayer.prototype=new minplayer.players.flash,minplayer.players.minplayer.prototype.constructor=minplayer.players.minplayer,minplayer.players.minplayer.prototype.construct=function(){minplayer.players.flash.prototype.construct.call(this),this.options.pluginName="minplayer"},window.onFlashPlayerReady=function(a){for(var b=minplayer.get(a,"media"),c=b.length;c--;)b[c].onReady()},window.onFlashPlayerUpdate=function(a,b){for(var c=minplayer.get(a,"media"),d=c.length;d--;)c[d].onMediaUpdate(b)},window.onFlashPlayerDebug=function(a){console&&console.log&&console.log(a)},minplayer.players.minplayer.getPriority=function(a){return a.stream?100:1},minplayer.players.minplayer.canPlay=function(a){if(a.stream)return!0;var b=jQuery.inArray(a.mimetype,["video/x-webm","video/webm","application/octet-stream"])>=0;return!b&&("video"===a.type||"audio"===a.type)},minplayer.players.minplayer.prototype.createPlayer=function(){this.options.swfplayer||(this.options.swfplayer="http://mediafront.org/assets/osmplayer/minplayer",this.options.swfplayer+="/flash/minplayer.swf"),minplayer.players.flash.prototype.createPlayer.call(this);var a={id:this.options.id,debug:this.options.debug,config:"nocontrols",file:this.mediaFile.path,autostart:this.options.autoplay,autoload:this.options.autoload};return this.mediaFile.stream&&(a.stream=this.mediaFile.stream),this.getFlash({swf:this.options.swfplayer,id:this.options.id+"_player",width:"100%",height:"100%",flashvars:a,wmode:this.options.wmode})},minplayer.players.minplayer.prototype.onMediaUpdate=function(a){switch(a){case"mediaMeta":this.onLoaded();break;case"mediaConnected":this.onLoaded(),this.onPaused();break;case"mediaPlaying":this.onPlaying();break;case"mediaPaused":this.onPaused();break;case"mediaComplete":this.onComplete()}},minplayer.players.minplayer.prototype.load=function(a,b){minplayer.players.flash.prototype.load.call(this,a,function(){this.loaded?this.stop(function(){this.player.loadMedia(a.path,a.stream),b&&b.call(this)}):(this.player.loadMedia(a.path,a.stream),b&&b.call(this))})},minplayer.players.minplayer.prototype.play=function(a){minplayer.players.flash.prototype.play.call(this,function(){this.player.playMedia(),a&&a.call(this)})},minplayer.players.minplayer.prototype.pause=function(a){minplayer.players.flash.prototype.pause.call(this,function(){this.player.pauseMedia(),a&&a.call(this)})},minplayer.players.minplayer.prototype.stop=function(a){minplayer.players.flash.prototype.stop.call(this,function(){this.player.stopMedia(),a&&a.call(this)})},minplayer.players.minplayer.prototype._seek=function(a){this.player.seekMedia(a)},minplayer.players.minplayer.prototype.setVolume=function(a,b){minplayer.players.flash.prototype.setVolume.call(this,a,function(){this.player.setVolume(a),b&&b.call(this)})},minplayer.players.minplayer.prototype._getVolume=function(a){a(this.player.getVolume())},minplayer.players.minplayer.prototype._getDuration=function(a){var b=this,c=0,d=function(){c=b.player.getDuration(),c?a(c):setTimeout(d,1e3)};d()},minplayer.players.minplayer.prototype._getCurrentTime=function(a){a(this.player.getCurrentTime())},minplayer.players.minplayer.prototype._getBytesLoaded=function(a){a(this.player.getMediaBytesLoaded())},minplayer.players.minplayer.prototype._getBytesTotal=function(a){a(this.player.getMediaBytesTotal())};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.youtube=function(a,b,c){this.quality="default",minplayer.players.base.call(this,a,b,c)},minplayer.players.youtube.prototype=new minplayer.players.base,minplayer.players.youtube.prototype.constructor=minplayer.players.youtube,minplayer.players.youtube.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="youtube"},minplayer.players.youtube.getPriority=function(){return 10},minplayer.players.youtube.canPlay=function(a){if("video/youtube"===a.mimetype)return!0;var b=/^http(s)?\:\/\/(www\.)?(youtube\.com|youtu\.be)/i;return 0===a.path.search(b)},minplayer.players.youtube.getMediaId=function(a){var b="^http[s]?\\:\\/\\/(www\\.)?";b+="(youtube\\.com\\/watch\\?v=|youtu\\.be\\/)",b+="([a-zA-Z0-9_\\-]+)";var c=RegExp(b,"i");return 0===a.path.search(c)?a.path.match(c)[3]:a.path},minplayer.players.youtube.getImage=function(a,b,c){b="thumbnail"===b?"1":"0",c("https://img.youtube.com/vi/"+a.id+"/"+b+".jpg")},minplayer.players.youtube.parseNode=function(a){var b="undefined"!=typeof a.video?a.video:a;return{title:b.title,description:b.description,mediafiles:{image:{thumbnail:{path:b.thumbnail.sqDefault},image:{path:b.thumbnail.hqDefault}},media:{media:{player:"youtube",id:b.id}}}}},minplayer.players.youtube.getNode=function(a,b){var c="https://gdata.youtube.com/feeds/api/videos/"+a.id;c+="?v=2&alt=jsonc",jQuery.get(c,function(a){b(minplayer.players.youtube.parseNode(a.data))})},minplayer.players.youtube.prototype.setPlayerState=function(a){switch(a){case YT.PlayerState.CUED:break;case YT.PlayerState.BUFFERING:this.onWaiting();break;case YT.PlayerState.UNSTARTED:case YT.PlayerState.PAUSED:this.onPaused();break;case YT.PlayerState.PLAYING:this.onPlaying();break;case YT.PlayerState.ENDED:this.onComplete()}},minplayer.players.youtube.prototype.onReady=function(){minplayer.players.base.prototype.onReady.call(this),this.options.autoplay||this.pause(),this.onLoaded()},minplayer.players.youtube.prototype.playerFound=function(){var a="iframe#"+this.options.id+"-player.youtube-player",b=this.display.find(a);return b.length>0},minplayer.players.youtube.prototype.onPlayerStateChange=function(a){this.setPlayerState(a.data)},minplayer.players.youtube.prototype.onQualityChange=function(a){this.quality=a.data},minplayer.players.youtube.prototype.hasPlayLoader=function(a){return minplayer.hasTouch||!a},minplayer.players.youtube.prototype.hasController=function(){return minplayer.isIDevice},minplayer.players.youtube.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a="https://www.youtube.com/iframe_api";if(0===jQuery('script[src="'+a+'"]').length){var b=document.createElement("script");b.src=a;var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(b,c)}return this.playerId=this.options.id+"-player",this.poll(this.options.id+"_youtube",function(a){return function(){var b=jQuery("#"+a.playerId).length>0;if(b=b&&"YT"in window,b=b&&"function"==typeof YT.Player){jQuery("#"+a.playerId).addClass("youtube-player");var c=location.protocol;c+="//"+location.hostname,c+=location.port&&":"+location.port;var d={};minplayer.isIDevice?d.origin=c:d={enablejsapi:minplayer.isIDevice?0:1,origin:c,wmode:"opaque",controls:minplayer.isAndroid?1:0,rel:0,showinfo:0},a.player=new YT.Player(a.playerId,{height:"100%",width:"100%",frameborder:0,videoId:a.mediaFile.id,playerVars:d,events:{onReady:function(b){a.onReady(b)},onStateChange:function(b){a.onPlayerStateChange(b)},onPlaybackQualityChange:function(b){a.onQualityChange(b)},onError:function(b){a.onError(b)}}})}return!b}}(this),200),jQuery(document.createElement("div")).attr({id:this.playerId})},minplayer.players.youtube.prototype.load=function(a,b){minplayer.players.base.prototype.load.call(this,a,function(){this.player.loadVideoById(a.id,0,this.quality),b&&b.call(this)})},minplayer.players.youtube.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.onWaiting(),this.player.playVideo(),a&&a.call(this)})},minplayer.players.youtube.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.player.pauseVideo(),a&&a.call(this)})},minplayer.players.youtube.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.stopVideo(),a&&a.call(this)})},minplayer.players.youtube.prototype._seek=function(a){this.onWaiting(),this.player.seekTo(a,!0)},minplayer.players.youtube.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.player.setVolume(100*a),b&&b.call(this)})},minplayer.players.youtube.prototype._getVolume=function(a){a(this.player.getVolume())},minplayer.players.youtube.prototype._getDuration=function(a){a(this.player.getDuration())},minplayer.players.youtube.prototype._getCurrentTime=function(a){a(this.player.getCurrentTime())},minplayer.players.youtube.prototype._getBytesStart=function(a){a(this.player.getVideoStartBytes())},minplayer.players.youtube.prototype._getBytesLoaded=function(a){a(this.player.getVideoBytesLoaded())},minplayer.players.youtube.prototype._getBytesTotal=function(a){a(this.player.getVideoBytesTotal())};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.vimeo=function(a,b,c){minplayer.players.base.call(this,a,b,c)},minplayer.players.vimeo.prototype=new minplayer.players.base,minplayer.players.vimeo.prototype.constructor=minplayer.players.vimeo,minplayer.players.vimeo.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="vimeo"},minplayer.players.vimeo.getPriority=function(){return 10},minplayer.players.vimeo.canPlay=function(a){return"video/vimeo"===a.mimetype?!0:0===a.path.search(/^http(s)?\:\/\/(www\.)?vimeo\.com/i)},minplayer.players.vimeo.prototype.hasPlayLoader=function(){return minplayer.hasTouch},minplayer.players.vimeo.prototype.hasController=function(){return minplayer.hasTouch},minplayer.players.vimeo.getMediaId=function(a){var b=/^http[s]?\:\/\/(www\.)?vimeo\.com\/(\?v\=)?([0-9]+)/i;return 0===a.path.search(b)?a.path.match(b)[3]:a.path},minplayer.players.vimeo.parseNode=function(a){return{title:a.title,description:a.description,mediafiles:{image:{thumbnail:{path:a.thumbnail_small},image:{path:a.thumbnail_large}},media:{media:{player:"vimeo",id:a.id}}}}},minplayer.players.vimeo.nodes={},minplayer.players.vimeo.getNode=function(a,b){minplayer.players.vimeo.nodes.hasOwnProperty(a.id)?b(minplayer.players.vimeo.nodes[a.id]):jQuery.ajax({url:"https://vimeo.com/api/v2/video/"+a.id+".json",dataType:"jsonp",success:function(c){var d=minplayer.players.vimeo.parseNode(c[0]);minplayer.players.vimeo.nodes[a.id]=d,b(d)}})},minplayer.players.vimeo.getImage=function(a,b,c){minplayer.players.vimeo.getNode(a,function(a){c(a.mediafiles.image.image)})},minplayer.players.vimeo.prototype.reset=function(){minplayer.players.base.prototype.reset.call(this)},minplayer.players.vimeo.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a="http://a.vimeocdn.com/js/froogaloop2.min.js";if(0===jQuery('script[src="'+a+'"]').length){var b=document.createElement("script");b.src=a;var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(b,c)}var d=document.createElement("iframe");d.setAttribute("id",this.options.id+"-player"),d.setAttribute("type","text/html"),d.setAttribute("width","100%"),d.setAttribute("height","100%"),d.setAttribute("frameborder","0"),jQuery(d).addClass("vimeo-player");var e="https://player.vimeo.com/video/";return e+=this.mediaFile.id+"?",e+=jQuery.param({wmode:"opaque",api:1,player_id:this.options.id+"-player",title:0,byline:0,portrait:0,loop:this.options.loop}),d.setAttribute("src",e),this.poll(this.options.id+"_vimeo",function(a){return function(){if(window.Froogaloop){a.player=window.Froogaloop(d);var b=0;a.player.addEvent("ready",function(){clearTimeout(b),a.onReady(),a.onError("")}),b=setTimeout(function(){a.onReady()},3e3)}return!window.Froogaloop}}(this),200),this.trigger("loadstart"),d},minplayer.players.vimeo.prototype.onReady=function(){this.player.addEvent("loadProgress",function(a){return function(b){a.duration.set(parseFloat(b.duration)),a.bytesLoaded.set(b.bytesLoaded),a.bytesTotal.set(b.bytesTotal)}}(this)),this.player.addEvent("playProgress",function(a){return function(b){a.duration.set(parseFloat(b.duration)),a.currentTime.set(parseFloat(b.seconds))}}(this)),this.player.addEvent("play",function(a){return function(){a.onPlaying()}}(this)),this.player.addEvent("pause",function(a){return function(){a.onPaused()}}(this)),this.player.addEvent("finish",function(a){return function(){a.onComplete()}}(this)),minplayer.players.base.prototype.onReady.call(this),this.onLoaded(),this.options.autoplay&&this.play()},minplayer.players.vimeo.prototype.clear=function(){this.player&&this.player.api("unload"),minplayer.players.base.prototype.clear.call(this)},minplayer.players.vimeo.prototype.load=function(a,b){minplayer.players.base.prototype.load.call(this,a,function(){this.construct(),b&&b.call(this)})},minplayer.players.vimeo.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.player.api("play"),a&&a.call(this)})},minplayer.players.vimeo.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.player.api("pause"),a&&a.call(this)})},minplayer.players.vimeo.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.api("unload"),a&&a.call(this)})},minplayer.players.vimeo.prototype._seek=function(a){this.player.api("seekTo",a)},minplayer.players.vimeo.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.volume.set(a),this.player.api("setVolume",a),b&&b.call(this)})},minplayer.players.vimeo.prototype._getVolume=function(a){this.player.api("getVolume",function(b){a(b)})},minplayer.players.vimeo.prototype._getDuration=function(a){this.player.api("getDuration",function(b){a(b)})};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.limelight=function(a,b){minplayer.players.flash.call(this,a,b)},minplayer.players.limelight.prototype=new minplayer.players.flash,minplayer.players.limelight.prototype.constructor=minplayer.players.limelight,minplayer.players.limelight.prototype.construct=function(){minplayer.players.flash.prototype.construct.call(this),this.options.pluginName="limelight"},minplayer.players.limelight.getPriority=function(){return 10},minplayer.players.limelight.canPlay=function(a){if("video/limelight"===a.mimetype)return!0;var b=/.*limelight\.com.*/i;return 0===a.path.search(b)},minplayer.players.limelight.getMediaId=function(a){var b=/.*limelight\.com.*mediaId=([a-zA-Z0-9]+)/i;return 0===a.path.search(b)?a.path.match(b)[1]:a.path},minplayer.players.limelight.prototype.register=function(){window.delvePlayerCallback=function(a,b,c){var d=a.replace("-player","");jQuery.each(minplayer.get(d,"media"),function(a,d){d.onMediaUpdate(b,c)})}},minplayer.players.limelight.prototype.onMediaUpdate=function(a,b){switch(a){case"onPlayerLoad":this.onReady();break;case"onMediaLoad":if(this.complete)return this.pause(),void this.onPaused();this.shouldSeek=this.startTime>0,this.onLoaded();break;case"onMediaComplete":this.complete=!0,this.onComplete();break;case"onPlayheadUpdate":!b.positionInMilliseconds||this.playing||this.complete||this.onPlaying(),this.complete=!1,this.shouldSeek&&this.seekValue?(this.shouldSeek=!1,this.seek(this.seekValue)):(this.duration.set(b.durationInMilliseconds/1e3),this.currentTime.set(b.positionInMilliseconds/1e3));break;case"onError":this.onError();break;case"onPlayStateChanged":b.isPlaying?this.onPlaying():b.isBusy?this.onWaiting():this.onPaused()}},minplayer.players.limelight.prototype.createPlayer=function(){minplayer.players.flash.prototype.createPlayer.call(this);var a=document.createElement("script");a.src="https://assets.delvenetworks.com/player/embed.js";var b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b),this.register();var c={deepLink:"true",autoplay:this.options.autoplay?"true":"false",startQuality:"HD"},d=null,e=this.options.channel;e||(d=/.*limelight\.com.*channelId=([a-zA-Z0-9]+)/i,0===this.mediaFile.path.search(d)&&(e=this.mediaFile.path.match(d)[1])),e&&"media"===this.mediaFile.queueType&&(c.adConfigurationChannelId=e);var f=this.options.playerForm;f||(d=/.*limelight\.com.*playerForm=([a-zA-Z0-9]+)/i,0===this.mediaFile.path.search(d)&&(f=this.mediaFile.path.match(d)[1])),f&&(c.playerForm=f),c.mediaId=this.mediaFile.id;var g=this.options.id+"-player";return setTimeout(function h(){window.hasOwnProperty("LimelightPlayerUtil")?window.LimelightPlayerUtil.initEmbed(g):setTimeout(h,1e3)},1e3),this.getFlash({swf:document.location.protocol+"//assets.delvenetworks.com/player/loader.swf",id:g,width:this.options.width,height:"100%",flashvars:c,wmode:this.options.wmode})},minplayer.players.limelight.prototype.play=function(a){minplayer.players.flash.prototype.play.call(this,function(){this.player.doPlay(),a&&a.call(this)})},minplayer.players.limelight.prototype.pause=function(a){minplayer.players.flash.prototype.pause.call(this,function(){this.player.doPause(),a&&a.call(this)})},minplayer.players.limelight.prototype.stop=function(a){minplayer.players.flash.prototype.stop.call(this,function(){this.player.doPause(),a&&a.call(this)})},minplayer.players.limelight.prototype._seek=function(a){this.seekValue=a,this.player.doSeekToSecond(a)},minplayer.players.limelight.prototype.setVolume=function(a,b){minplayer.players.flash.prototype.setVolume.call(this,a,function(){this.player.doSetVolume(a),b&&b.call(this)})},minplayer.players.limelight.prototype._getVolume=function(a){a(this.player.doGetVolume())},minplayer.players.limelight.prototype.search=function(a){this.whenReady(function(){this.player.doSearch(a)})};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.kaltura=function(a,b){minplayer.players.base.call(this,a,b)},minplayer.players.kaltura.prototype=new minplayer.players.base,minplayer.players.kaltura.prototype.constructor=minplayer.players.kaltura,minplayer.players.kaltura.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="kaltura",this.adPlaying=!1},minplayer.players.kaltura.prototype.defaultOptions=function(a){a.entryId=0,a.uiConfId=0,a.partnerId=0,minplayer.players.base.prototype.defaultOptions.call(this,a)},minplayer.players.kaltura.getPriority=function(){return 10},minplayer.players.kaltura.canPlay=function(a){if("video/kaltura"===a.mimetype)return!0;var b=/.*kaltura\.com.*/i;return 0===a.path.search(b)},minplayer.players.kaltura.prototype.adStart=function(){this.adPlaying=!0,this.onPlaying()},minplayer.players.kaltura.prototype.adEnd=function(){this.adPlaying=!1},minplayer.players.kaltura.prototype.playerStateChange=function(a){if(!this.adPlaying)switch(a){case"ready":this.onLoaded();break;case"loading":case"buffering":this.onWaiting();break;case"playing":this.onPlaying();break;case"paused":this.onPaused()}},minplayer.players.kaltura.prototype.mediaReady=function(){this.onLoaded()},minplayer.players.kaltura.prototype.playerPlayEnd=function(){this.onComplete()},minplayer.players.kaltura.prototype.playUpdate=function(a){this.currentTime.set(a)},minplayer.players.kaltura.prototype.durationChange=function(a){this.duration.set(a.newValue)},minplayer.players.kaltura.prototype.getInstance=function(){if(this.instanceName)return this.instanceName;var a=this.uuid.split("__"),b="minplayer.plugins."+a[0];return b+="."+a[1],b+="["+(a[2]-1)+"]",this.instanceName=b,b},minplayer.players.kaltura.prototype.registerEvents=function(){this.player.addJsListener("adStart",this.getInstance()+".adStart"),this.player.addJsListener("adEnd",this.getInstance()+".adEnd"),this.player.addJsListener("playerStateChange",this.getInstance()+".playerStateChange"),this.player.addJsListener("durationChange",this.getInstance()+".durationChange"),this.player.addJsListener("mediaReady",this.getInstance()+".mediaReady"),this.player.addJsListener("playerUpdatePlayhead",this.getInstance()+".playUpdate"),this.player.addJsListener("playerPlayEnd",this.getInstance()+".playerPlayEnd") +},minplayer.players.kaltura.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a={},b=this;jQuery.each(["entryId","uiConfId","partnerId"],function(c,d){if(a[d]="",b.options[d])a[d]=b.options[d];else{var e=null;switch(d){case"entryId":e=/.*kaltura\.com.*entry_id\/([^\/]+)/i;break;case"uiConfId":e=/.*kaltura\.com.*uiconf_id\/([^\/]+)/i;break;case"partnerId":e=/.*kaltura\.com.*wid\/_([^\/]+)/i}e&&(a[d]=b.mediaFile.path.match(e),a[d]&&(a[d]=a[d][1]))}});var c=document.createElement("script");c.src="http://cdnapi.kaltura.com/p/",c.src+=a.partnerId,c.src+="/sp/",c.src+=a.partnerId,c.src+="00/embedIframeJs/uiconf_id/",c.src+=a.uiConfId,c.src+="/partner_id/",c.src+=a.partnerId;var d=document.getElementsByTagName("script")[0];d.parentNode.insertBefore(c,d);var e=this.options.id+"-player";return setTimeout(function f(){window.hasOwnProperty("kWidget")?kWidget.embed({targetId:e,wid:"_"+a.partnerId,uiconf_id:a.uiConfId,entry_id:a.entryId,flashvars:{autoPlay:!1},params:{wmode:"transparent"},readyCallback:function(a){b.player=jQuery("#"+a).get(0),b.registerEvents(),b.onReady()}}):setTimeout(f,1e3)},1e3),'
'},minplayer.players.kaltura.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.player.sendNotification("doPlay"),a&&a.call(this)})},minplayer.players.kaltura.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.player.sendNotification("doPause"),a&&a.call(this)})},minplayer.players.kaltura.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.sendNotification("doStop"),a&&a.call(this)})},minplayer.players.kaltura.prototype._seek=function(a){this.seekValue=a,this.player.sendNotification("doSeek",a)},minplayer.players.kaltura.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.player.sendNotification("changeVolume",a),b&&b.call(this)})};var minplayer=minplayer||{};minplayer.controller=function(a,b){minplayer.display.call(this,"controller",a,b)},minplayer.controller.prototype=new minplayer.display,minplayer.controller.prototype.constructor=minplayer.controller,minplayer.formatTime=function(a){a=a||0;var b=0,c=0,d=0,e="";return d=Math.floor(a/3600),a-=3600*d,c=Math.floor(a/60),a-=60*c,b=Math.floor(a%60),d&&(e+=String(d),e+=":"),e+=c>=10?String(c):"0"+String(c),e+=":",e+=b>=10?String(b):"0"+String(b),{time:e,units:""}},minplayer.controller.prototype.getElements=function(){var a=minplayer.display.prototype.getElements.call(this);return jQuery.extend(a,{play:null,pause:null,fullscreen:null,seek:null,progress:null,volume:null,timer:null})},minplayer.controller.prototype.defaultOptions=function(a){a.disptime=0,minplayer.display.prototype.defaultOptions.call(this,a)},minplayer.controller.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.options.pluginName="controller",this.dragging=!1,this.vol=0,this.elements.seek&&(this.seekBar=this.elements.seek.slider({range:"min",create:function(a){jQuery(".ui-slider-range",a.target).addClass("ui-state-active")}})),this.elements.volume&&(this.volumeBar=this.elements.volume.slider({animate:!0,range:"min",orientation:"vertical"})),this.get("player",function(a){this.elements.fullscreen&&minplayer.click(this.elements.fullscreen.unbind(),function(){a.toggleFullScreen()}).css({pointer:"hand"})}),this.get("media",function(a){a.hasController()?this.hide():(this.elements.pause&&(minplayer.click(this.elements.pause.unbind(),function(b){return function(c){c.preventDefault(),b.playPause(!1,a)}}(this)),a.ubind(this.uuid+":pause",function(a){return function(){a.setPlayPause(!0)}}(this))),this.elements.play&&(minplayer.click(this.elements.play.unbind(),function(b){return function(c){c.preventDefault(),b.playPause(!0,a)}}(this)),a.ubind(this.uuid+":playing",function(a){return function(){a.setPlayPause(!1)}}(this))),this.elements.duration&&(a.ubind(this.uuid+":durationchange",function(a){return function(b,c){var d=a.options.disptime||c.duration;a.setTimeString("duration",d)}}(this)),a.getDuration(function(a){return function(b){b=a.options.disptime||b,a.setTimeString("duration",b)}}(this))),this.elements.progress&&a.ubind(this.uuid+":progress",function(a){return function(b,c){var d=c.total?c.loaded/c.total*100:0;a.elements.progress.width(d+"%")}}(this)),(this.seekBar||this.elements.timer)&&a.ubind(this.uuid+":timeupdate",function(a){return function(b,c){if(!a.dragging){var d=0;c.duration&&(d=c.currentTime/c.duration*100),a.seekBar&&a.seekBar.slider("option","value",d),a.setTimeString("timer",c.currentTime)}}}(this)),this.seekBar&&this.seekBar.slider({start:function(a){return function(){a.dragging=!0}}(this),stop:function(b){return function(c,d){b.dragging=!1,a.getDuration(function(b){a.seek(d.value/100*b)})}}(this),slide:function(b){return function(c,d){a.getDuration(function(c){var e=d.value/100*c;b.dragging||a.seek(e),b.setTimeString("timer",e)})}}(this)}),this.elements.mute&&minplayer.click(this.elements.mute,function(b){return function(c){c.preventDefault();var d=b.volumeBar.slider("option","value");d>0?(b.vol=d,b.volumeBar.slider("option","value",0),a.setVolume(0)):(b.volumeBar.slider("option","value",b.vol),a.setVolume(b.vol/100))}}(this)),this.volumeBar&&(this.volumeBar.slider({slide:function(b,c){a.setVolume(c.value/100)}}),a.ubind(this.uuid+":volumeupdate",function(a){return function(b,c){a.volumeBar.slider("option","value",100*c)}}(this)),a.getVolume(function(a){return function(b){a.volumeBar.slider("option","value",100*b)}}(this))))}),this.ready()},minplayer.controller.prototype.setPlayPause=function(a){var b="";this.elements.play&&(b=a?"inherit":"none",this.elements.play.css("display",b)),this.elements.pause&&(b=a?"none":"inherit",this.elements.pause.css("display",b))},minplayer.controller.prototype.playPause=function(a,b){var c=a?"play":"pause";this.display.trigger(c),this.setPlayPause(!a),b&&b[c]()},minplayer.controller.prototype.setTimeString=function(a,b){this.elements[a]&&this.elements[a].text(minplayer.formatTime(b).time)};var osmplayer=osmplayer||{};!function(){}(osmplayer),jQuery.fn.osmplayer||(jQuery.event.special.playerdestroyed={remove:function(a){a.handler&&a.handler(this)}},jQuery.fn.osmplayer=function(a){return jQuery(this).each(function(){a=a||{},a.id=a.id||jQuery(this).attr("id")||Math.random(),minplayer.plugins[a.id]||(a.template=a.template||"default",osmplayer[a.template]?new osmplayer[a.template](jQuery(this),a):new osmplayer(jQuery(this),a))})}),osmplayer=function(a,b){minplayer.call(this,a,b)},osmplayer.prototype=new minplayer,osmplayer.prototype.constructor=osmplayer,osmplayer.prototype.create=function(a,b,c){return minplayer.prototype.create.call(this,a,"osmplayer",c)},osmplayer.prototype.defaultOptions=function(a){a.playlist="",a.node={},a.link="http://www.mediafront.org",a.logo="http://mediafront.org/assets/osmplayer/logo.png",minplayer.prototype.defaultOptions.call(this,a)},osmplayer.prototype.construct=function(){minplayer.prototype.construct.call(this),jQuery(this.display).bind("playerdestroyed",function(a){return function(b){if(b===a.display.eq(0)[0]){for(var c in minplayer.plugins[a.options.id]){for(var d in minplayer.plugins[a.options.id][c])minplayer.plugins[a.options.id][c][d].destroy(),delete minplayer.plugins[a.options.id][c][d];minplayer.plugins[a.options.id][c].length=0}delete minplayer.plugins[a.options.id],minplayer.plugins[a.options.id]=null}}}(this)),this.playQueue=[],this.playIndex=0,this.hasPlaylist=!1,this.create("playlist","osmplayer"),this.get("playlist",function(a){a.ubind(this.uuid+":nodeLoad",function(a){return function(b,c){a.hasPlaylist=!0,!a.options.autoplay&&c.autoplay&&("undefined"==typeof a.options.originalAutoPlay&&(a.options.originalAutoPlay=a.options.autoplay),a.options.autoplay=!0),a.loadNode(c)}}(this))}),this.get("media",function(a){a.ubind(this.uuid+":ended",function(a){return function(){"undefined"==typeof a.options.originalAutoPlay&&(a.options.originalAutoPlay=a.options.autoplay),a.options.autoplay=!0,a.playNext()}}(this))}),this.loadNode(this.options.node)},osmplayer.prototype.fullScreenElement=function(){return this.elements.minplayer},osmplayer.prototype.reset=function(a){this.playQueue.length=0,this.playQueue=[],this.playIndex=0,this.playLoader&&this.options.preview?(this.options.preview="",this.playLoader.clear(function(b){return function(){a.call(b)}}(this))):a&&a.call(this)},osmplayer.prototype.loadNode=function(a){return!a||a.hasOwnProperty("length")&&0===a.length?!1:void this.reset(function(){if(this.hasMedia=a&&a.mediafiles&&a.mediafiles.media,this.hasMedia=this.hasMedia||this.options.file,a&&a.mediafiles){var b=a.mediafiles.media;if(b){var c=null,d=[];d=minplayer.isAndroid||minplayer.isIDevice?["media"]:["intro","commercial","prereel","media","postreel"],jQuery.each(d,function(a){return function(d,e){c=a.addToQueue(b[e]),c&&(c.queueType=e)}}(this))}else this.display.addClass("nomedia");this.playNext(),osmplayer.getImage(a.mediafiles,"preview",function(a){return function(b){a.playLoader&&a.playLoader.display.length>0&&(a.playLoader.enabled=!0,a.playLoader.loadPreview(b.path),a.playLoader.previewFlag.setFlag("media",!0),a.hasMedia||(a.playLoader.busy.setFlag("media",!1),a.playLoader.bigPlay.setFlag("media",!1)),a.playLoader.checkVisibility())}}(this))}})},osmplayer.prototype.addToQueue=function(a){return a=minplayer.getMediaFile(a),a&&this.playQueue.push(a),a},osmplayer.prototype.playNext=function(){this.playQueue.length>this.playIndex?(this.load(this.playQueue[this.playIndex]),this.playIndex++):this.options.repeat?(this.playIndex=0,this.playNext()):this.playQueue.length>0?this.hasPlaylist&&this.options.autoNext?this.trigger("player_ended"):(this.options.autoplay=!1,this.playIndex=0,this.playNext()):this.media&&("undefined"!=typeof this.options.originalAutoPlay&&(this.options.autoplay=this.options.originalAutoPlay),this.media.stop(),this.options.file?this.load():this.loadNode())},osmplayer.getNode=function(a,b){if(a&&a.mediafiles&&a.mediafiles.media){var c=minplayer.getMediaFile(a.mediafiles.media.media);if(c){var d=minplayer.players[c.player];d&&"function"==typeof d.getNode&&d.getNode(c,function(a){b(a)})}}},osmplayer.getImage=function(a,b,c){var d="",e=a.image;if(e)if(e[b])d=e[b];else if(e.image)d=e.image;else for(b in e)if(e.hasOwnProperty(b)){d=e[b];break}if(d)c(new minplayer.file(d));else{var f=minplayer.getMediaFile(a.media.media);if(f){var g=minplayer.players[f.player];g&&"function"==typeof g.getImage&&g.getImage(f,b,function(a){c(new minplayer.file(a))})}}};var osmplayer=osmplayer||{};osmplayer.parser=osmplayer.parser||{},osmplayer.parser["default"]={priority:1,valid:function(){return!0},getType:function(){return"json"},getFeed:function(a,b,c){return a=a.replace(/(.*)\??(.*)/i,"$1"),a+="?start-index="+b,a+="&max-results="+c},parse:function(a){return a}};var osmplayer=osmplayer||{};osmplayer.parser=osmplayer.parser||{},osmplayer.parser.youtube={priority:10,valid:function(a){return 0===a.search(/^http(s)?\:\/\/gdata\.youtube\.com/i)},getType:function(){return"jsonp"},getFeed:function(a,b,c){return a=a.replace(/(.*)\??(.*)/i,"$1"),a+="?start-index="+(b+1),a+="&max-results="+c,a+="&v=2&alt=jsonc"},parse:function(a){a=a.data;var b={total_rows:a.totalItems,nodes:[]},c=null;for(var d in a.items)a.items.hasOwnProperty(d)&&(c=minplayer.players.youtube.parseNode(a.items[d]),b.nodes.push(c));return b}};var osmplayer=osmplayer||{};osmplayer.parser=osmplayer.parser||{},osmplayer.parser.rss={priority:8,valid:function(a){return a=a.replace(/(.*)\??(.*)/i,"$1"),null!==a.match(/\.rss$/i)},getType:function(){return"xml"},getFeed:function(a){return a},parse:function(a){var b={total_rows:0,nodes:[]};return jQuery("rss channel",a).find("item").each(function(){osmplayer.parser.rss.addRSSItem(b,jQuery(this))}),b},addRSSItem:function(a,b){a.total_rows++;var c={},d="",e="",f="",g="";d=b.find("title"),d.length&&(c.title=d.text()),e=b.find("annotation"),e.length&&(c.description=e.text()),c.mediafiles={},f=b.find("image"),f.length&&(c.mediafiles.image={image:{path:f.text()}}),g=b.find("location"),g.length&&(c.mediafiles.media={media:{path:g.text()}}),a.nodes.push(c)}};var osmplayer=osmplayer||{};osmplayer.parser=osmplayer.parser||{},osmplayer.parser.asx={priority:8,valid:function(a){return a=a.replace(/(.*)\??(.*)/i,"$1"),null!==a.match(/\.asx$/i)},getType:function(){return"xml"},getFeed:function(a){return a},parse:function(a){var b={total_rows:0,nodes:[]};return jQuery("asx entry",a).each(function(){osmplayer.parser.rss.addRSSItem(b,jQuery(this))}),b}};var osmplayer=osmplayer||{};osmplayer.parser=osmplayer.parser||{},osmplayer.parser.xsfp={priority:8,valid:function(a){return a=a.replace(/(.*)\??(.*)/i,"$1"),null!==a.match(/\.xml$/i)},getType:function(){return"xml"},getFeed:function(a){return a},parse:function(a){var b={total_rows:0,nodes:[]};return jQuery("playlist trackList track",a).each(function(){osmplayer.parser.rss.addRSSItem(b,jQuery(this))}),b}},osmplayer.playlist=function(a,b){minplayer.display.call(this,"playlist",a,b)},osmplayer.playlist.prototype=new minplayer.display,osmplayer.playlist.prototype.constructor=osmplayer.playlist,osmplayer.playlist.prototype.defaultOptions=function(a){a.vertical=!0,a.playlist="",a.pageLimit=10,a.autoNext=!0,a.shuffle=!1,a.loop=!1,a.hysteresis=40,a.scrollSpeed=20,a.scrollMode="auto",minplayer.display.prototype.defaultOptions.call(this,a)},osmplayer.playlist.prototype.construct=function(){this.nodes=[],this.page=-1,this.totalItems=0,this.currentItem=-1,this.playqueue=[],this.playqueuepos=0,this.playlist=this.options.playlist,this.scroll=null,this.orient={pos:this.options.vertical?"y":"x",pagePos:this.options.vertical?"pageY":"pageX",offset:this.options.vertical?"top":"left",wrapperSize:this.options.vertical?"wrapperH":"wrapperW",minScroll:this.options.vertical?"minScrollY":"minScrollX",maxScroll:this.options.vertical?"maxScrollY":"maxScrollX",size:this.options.vertical?"height":"width"},this.pager=this.create("pager","osmplayer"),this.pager.ubind(this.uuid+":nextPage",function(a){return function(){a.nextPage()}}(this)),this.pager.ubind(this.uuid+":prevPage",function(a){return function(){a.prevPage()}}(this)),minplayer.display.prototype.construct.call(this),this.hasPlaylist=this.next(),this.ready()},osmplayer.playlist.prototype.onAdded=function(a){this.options.autoNext&&a.get("player",function(a){return function(b){b.ubind(a.uuid+":player_ended",function(){a.hasPlaylist&&("undefined"==typeof b.options.originalAutoPlay&&(b.options.originalAutoPlay=b.options.autoplay),b.options.autoplay=!0,a.next())})}}(this))},osmplayer.playlist.prototype.scrollTo=function(a,b){this.scroll&&(this.scroll.options.hideScrollbar=!1,this.options.vertical?this.scroll.scrollTo(0,a,0,b):this.scroll.scrollTo(a,0,0,b),this.scroll.options.hideScrollbar=!0)},osmplayer.playlist.prototype.refreshScroll=function(){if(!window.addEventListener)return void setTimeout(function(a){return function(){a.refreshScroll.call(a)}}(this),200);var a=this.elements.list,b=this.elements.scroll;if(this.scroll&&(this.scroll.scrollTo(0,0),this.scroll.destroy(),this.scroll=null,this.elements.list.unbind("mousemove").unbind("mouseenter").unbind("mouseleave")),!this.options.vertical){var c=0;jQuery.each(this.elements.list.children(),function(){c+=jQuery(this).outerWidth()}),this.elements.list.width(c)}a.length>0&&b.length>0&&a[this.orient.size]()>b[this.orient.size]()&&(this.scroll=new osmplayer.iScroll(this.elements.scroll.eq(0)[0],{hScroll:!this.options.vertical,hScrollbar:!this.options.vertical,vScroll:this.options.vertical,vScrollbar:this.options.vertical,hideScrollbar:"none"!==this.options.scrollMode}),"auto"!=this.options.scrollMode||minplayer.hasTouch||this.elements.list.bind("mousemove",function(a){return function(b){b.preventDefault();var c=a.display.offset()[a.orient.offset];a.mousePos=b[a.orient.pagePos],a.mousePos-=c}}(this)).bind("mouseenter",function(a){return function(b){b.preventDefault(),a.scrolling=!0;var c=function(){if(a.scrolling){var b=a.scroll[a.orient.wrapperSize],d=b/2,e=a.mousePos-d;if(Math.abs(e)>a.options.hysteresis){var f=a.options.hysteresis;f*=e>0?-1:0,e=a.options.scrollSpeed*(e+f),e/=d;var g=a.scroll[a.orient.pos]-e,h=a.scroll[a.orient.minScroll]||0,i=a.scroll[a.orient.maxScroll];g>=h?a.scrollTo(h):i>=g?a.scrollTo(i):a.scrollTo(e,!0)}setTimeout(c,30)}};c()}}(this)).bind("mouseleave",function(a){return function(b){b.preventDefault(),a.scrolling=!1}}(this)),this.scroll.refresh(),this.scroll.scrollTo(0,0,200))},osmplayer.playlist.prototype.addNode=function(a){var b=this.nodes.length,c=this.create("teaser","osmplayer",this.elements.list);c.setNode(a),c.ubind(this.uuid+":nodeLoad",function(a){return function(){a.loadItem(b,!0)}}(this)),this.nodes.push(c)},osmplayer.playlist.prototype.set=function(a,b){if("object"!=typeof a)return void this.trigger("error","Playlist must be an object to set");if(!a.hasOwnProperty("total_rows"))return void this.trigger("error","Unknown playlist format.");if(a.total_rows&&a.nodes.length){this.totalItems=a.total_rows,this.currentItem=0,(this.page+1)*this.options.pageLimit>=this.totalItems||this.totalItems==a.nodes.length?this.pager.nextPage.hide():this.pager.nextPage.show();var c=a.nodes.length;this.elements.list.empty(),this.nodes=[];for(var d=0;c>d;d++)this.addNode(a.nodes[d]),b===d&&this.loadItem(d);this.refreshScroll(),this.trigger("playlistLoad",a)}this.elements.playlist_busy&&this.elements.playlist_busy.hide()},osmplayer.playlist.prototype.setQueue=function(){this.playqueue.push({page:this.page,item:this.currentItem}),this.playqueuepos=this.playqueue.length},osmplayer.playlist.prototype.next=function(){var a=0,b=this.page;if(this.playqueuepos>=this.playqueue.length)return this.options.shuffle?(a=Math.floor(Math.random()*this.totalItems),b=Math.floor(a/this.options.pageLimit),a%=this.options.pageLimit,this.load(b,a)):(a=this.currentItem+1,a>=this.nodes.length?this.load(b+1,0):this.loadItem(a));this.playqueuepos=this.playqueuepos+1;var c=this.playqueue[this.playqueuepos];return this.load(c.page,c.item)},osmplayer.playlist.prototype.prev=function(){this.playqueuepos=this.playqueuepos-1,this.playqueuepos=this.playqueuepos<0?0:this.playqueuepos;var a=this.playqueue[this.playqueuepos];return a?this.load(a.page,a.item):!1},osmplayer.playlist.prototype.loadItem=function(a,b){if(ac){if(!this.options.loop)return!1;a=0,b=0}if(this.elements.playlist_busy&&this.elements.playlist_busy.show(),a=a||0,a=0>a?0:a,this.setQueue(),this.page=a,0===this.page?this.pager.prevPage.hide():this.pager.prevPage.show(),"object"==typeof this.playlist)return this.set(this.playlist,b),this.playlist.endpoint&&(this.playlist=this.options.playlist=this.playlist.endpoint),!0;var d=osmplayer.parser["default"];for(var e in osmplayer.parser)osmplayer.parser.hasOwnProperty(e)&&osmplayer.parser[e].valid(this.playlist)&&osmplayer.parser[e].priority>d.priority&&(d=osmplayer.parser[e]);var f=this.page*this.options.pageLimit,g=d.getFeed(this.playlist,f,this.options.pageLimit),h={type:"GET",url:g,success:function(a){return function(c){a.set(d.parse(c),b)}}(this),error:function(a){return function(b,c){a.elements.playlist_busy&&a.elements.playlist_busy.hide(),a.trigger("error",c)}}(this)},i=d.getType();return i&&(h.dataType=i),jQuery.ajax(h),!0};var osmplayer=osmplayer||{};osmplayer.pager=function(a,b){minplayer.display.call(this,"pager",a,b)},osmplayer.pager.prototype=new minplayer.display,osmplayer.pager.prototype.constructor=osmplayer.pager,osmplayer.pager.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.elements.prevPage&&(this.prevPage=this.elements.prevPage.click(function(a){return function(b){b.preventDefault(),a.trigger("prevPage")}}(this))),this.elements.nextPage&&(this.nextPage=this.elements.nextPage.click(function(a){return function(b){b.preventDefault(),a.trigger("nextPage")}}(this)))};var osmplayer=osmplayer||{};osmplayer.teaser=function(a,b){this.preview=null,minplayer.display.call(this,"teaser",a,b)},osmplayer.teaser.prototype=new minplayer.display,osmplayer.teaser.prototype.constructor=osmplayer.teaser,osmplayer.teaser.prototype.select=function(){},osmplayer.teaser.prototype.setNode=function(a){this.node=a,this.elements.title&&(a.title?this.elements.title.text(a.title):osmplayer.getNode(a,function(a){return function(b){a.elements.title.text(b.title)}}(this))),a.mediafiles&&osmplayer.getImage(a.mediafiles,"thumbnail",function(a){return function(b){b&&a.elements.image&&(a.preview=new minplayer.image(a.elements.image),a.preview.load(b.path))}}(this)),this.display.unbind("click").click(function(a){return function(b){b.preventDefault(),a.trigger("nodeLoad",a.node)}}(this))}; \ No newline at end of file diff --git a/bin/osmplayer.js b/bin/osmplayer.js index 6c0d190d..93b5bbba 100644 --- a/bin/osmplayer.js +++ b/bin/osmplayer.js @@ -1,6473 +1,8 @@ -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -// Private function to check a single element's play type. -function checkPlayType(elem, playType) { - if ((typeof elem.canPlayType) === 'function') { - if (typeof playType === 'object') { - var i = playType.length; - var mimetype = ''; - while (i--) { - mimetype = checkPlayType(elem, playType[i]); - if (!!mimetype) { - break; - } - } - return mimetype; - } - else { - var canPlay = elem.canPlayType(playType); - if (('no' !== canPlay) && ('' !== canPlay)) { - return playType; - } - } - } - return ''; -} - -/** - * @constructor - * @class This class is used to define the types of media that can be played - * within the browser. - *

- * Usage: - *


- *   var playTypes = new minplayer.compatibility();
- *
- *   if (playTypes.videoOGG) {
- *     console.log("This browser can play OGG video");
- *   }
- *
- *   if (playTypes.videoH264) {
- *     console.log("This browser can play H264 video");
- *   }
- *
- *   if (playTypes.videoWEBM) {
- *     console.log("This browser can play WebM video");
- *   }
- *
- *   if (playTypes.audioOGG) {
- *     console.log("This browser can play OGG audio");
- *   }
- *
- *   if (playTypes.audioMP3) {
- *     console.log("This browser can play MP3 audio");
- *   }
- *
- *   if (playTypes.audioMP4) {
- *     console.log("This browser can play MP4 audio");
- *   }
- * 
- */ -minplayer.compatibility = function() { - var elem = null; - - // Create a video element. - elem = document.createElement('video'); - - /** Can play OGG video */ - this.videoOGG = checkPlayType(elem, 'video/ogg'); - - /** Can play H264 video */ - this.videoH264 = checkPlayType(elem, [ - 'video/mp4', - 'video/h264' - ]); - - /** Can play WEBM video */ - this.videoWEBM = checkPlayType(elem, [ - 'video/x-webm', - 'video/webm', - 'application/octet-stream' - ]); - - /** Can play MPEG URL streams. */ - this.videoMPEGURL = checkPlayType(elem, 'application/vnd.apple.mpegurl'); - - // Create an audio element. - elem = document.createElement('audio'); - - /** Can play audio OGG */ - this.audioOGG = checkPlayType(elem, 'audio/ogg'); - - /** Can play audio MP3 */ - this.audioMP3 = checkPlayType(elem, 'audio/mpeg'); - - /** Can play audio MP4 */ - this.audioMP4 = checkPlayType(elem, 'audio/mp4'); -}; - -if (!minplayer.playTypes) { - - /** The compatible playtypes for this browser. */ - minplayer.playTypes = new minplayer.compatibility(); - - /** See if we are an android device. */ - minplayer.isAndroid = (/android/gi).test(navigator.appVersion); - - /** See if we are an iOS device. */ - minplayer.isIDevice = (/iphone|ipad/gi).test(navigator.appVersion); - - /** See if we are a playbook device. */ - minplayer.isPlaybook = (/playbook/gi).test(navigator.appVersion); - - /** See if we are a touchpad device. */ - minplayer.isTouchPad = (/hp-tablet/gi).test(navigator.appVersion); - - /** Determine if we have a touchscreen. */ - minplayer.hasTouch = 'ontouchstart' in window && !minplayer.isTouchPad; -} - -// Get the URL variables. -if (!minplayer.urlVars) { - - /** The URL variables for the minplayer. */ - minplayer.urlVars = {}; - - // Get the URL variables. - var regEx = /[?&]+([^=&]+)=([^&]*)/gi; - window.location.href.replace(regEx, function(m, key, value) { - minplayer.urlVars[key] = value; - }); -} -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** - * @constructor - * @class This class keeps track of asynchronous get requests for certain - * variables within the player. - */ -minplayer.async = function() { - - /** The final value of this asynchronous variable. */ - this.value = null; - - /** The queue of callbacks to call when this value is determined. */ - this.queue = []; -}; - -/** - * Retrieve the value of this variable. - * - * @param {function} callback The function to call when the value is determined. - * 1 second if the value is not set. - */ -minplayer.async.prototype.get = function(callback) { - - // If the value is set, then immediately call the callback, otherwise, just - // add it to the queue when the variable is set. - if (this.value !== null) { - callback(this.value); - } - else { - - // Add this callback to the queue. - this.queue.push(callback); - } -}; - -/** - * Sets the value of an asynchronous value. - * - * @param {void} val The value to set. - */ -minplayer.async.prototype.set = function(val) { - - // Set the value. - this.value = val; - - // Get the callback queue length. - var i = this.queue.length; - - // Iterate through all the callbacks and call them. - if (i) { - while (i--) { - this.queue[i](val); - } - - // Reset the queue. - this.queue = []; - } -}; -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** - * @constructor - * @class This is a class used to keep track of flag states - * which is used to control the busy cursor, big play button, among other - * items in which multiple components can have an interest in hiding or - * showing a single element on the screen. - * - *

- * Usage: - *


- *   // Declare a flags variable.
- *   var flags = new minplayer.flags();
- *
- *   // Set the flag based on two components interested in the flag.
- *   flags.setFlag("component1", true);
- *   flags.setFlag("component2", true);
- *
- *   // Print out the value of the flags. ( Prints 3 )
- *   console.log(flags.flags);
- *
- *   // Now unset a single components flag.
- *   flags.setFlag("component1", false);
- *
- *   // Print out the value of the flags.
- *   console.log(flags.flags);
- *
- *   // Unset the other components flag.
- *   flags.setFlag("component2", false);
- *
- *   // Print out the value of the flags.
- *   console.log(flags.flags);
- * 
- *

- */ -minplayer.flags = function() { - - /** The flag. */ - this.flag = 0; - - /** Id map to reference id with the flag index. */ - this.ids = {}; - - /** The number of flags. */ - this.numFlags = 0; -}; - -/** - * Sets a flag based on boolean logic operators. - * - * @param {string} id The id of the controller interested in this flag. - * @param {boolean} value The value of this flag ( true or false ). - */ -minplayer.flags.prototype.setFlag = function(id, value) { - - // Define this id if it isn't present. - if (!this.ids.hasOwnProperty(id)) { - this.ids[id] = this.numFlags; - this.numFlags++; - } - - // Use binary operations to keep track of the flag state - if (value) { - this.flag |= (1 << this.ids[id]); - } - else { - this.flag &= ~(1 << this.ids[id]); - } -}; -/** The minplayer namespace. */ -minplayer = minplayer || {}; - -/** Static array to keep track of all plugins. */ -minplayer.plugins = minplayer.plugins || {}; - -/** Static array to keep track of queues. */ -minplayer.queue = minplayer.queue || []; - -/** Mutex lock to keep multiple triggers from occuring. */ -minplayer.lock = false; - -/** - * @constructor - * @class The base class for all plugins. - * - * @param {string} name The name of this plugin. - * @param {object} context The jQuery context. - * @param {object} options This components options. - * @param {object} queue The event queue to pass events around. - */ -minplayer.plugin = function(name, context, options, queue) { - - // Make sure we have some options. - this.options = options || {}; - - /** The name of this plugin. */ - this.name = name; - - /** The ready flag. */ - this.pluginReady = false; - - /** The event queue. */ - this.queue = queue || {}; - - /** Keep track of already triggered events. */ - this.triggered = {}; - - /** Create a queue lock. */ - this.lock = false; - - /** The universally unique ID for this plugin. */ - this.uuid = 0; - - // Only call the constructor if we have a context. - if (context) { - - /** Keep track of the context. */ - this.context = jQuery(context); - - // Initialize the default options. - var defaults = {}; - - // Get the default options. - this.defaultOptions(defaults); - - /** The options for this plugin. */ - for (var param in defaults) { - if (!this.options.hasOwnProperty(param)) { - this.options[param] = defaults[param]; - } - } - - // Initialize this plugin. - this.initialize(); - } -}; - -/** - * Initialize function for the plugin. - */ -minplayer.plugin.prototype.initialize = function() { - - // Construct this plugin. - this.construct(); -}; - -/** - * Get the default options for this plugin. - * - * @param {object} options The default options for this plugin. - */ -minplayer.plugin.prototype.defaultOptions = function(options) { -}; - -/** - * The constructor which is called once the context is set. - * Any class deriving from the plugin class should place all context - * dependant functionality within this function instead of the standard - * constructor function since it is called on object derivation as well - * as object creation. - */ -minplayer.plugin.prototype.construct = function() { - - /** Say that we are active. */ - this.active = true; - - // Adds this as a plugin. - this.addPlugin(); -}; - -/** - * Destructor. - */ -minplayer.plugin.prototype.destroy = function() { - - // Unbind all events. - this.active = false; - this.unbind(); -}; - -/** - * Creates a new plugin within this context. - * - * @param {string} name The name of the plugin you wish to create. - * @param {object} base The base object for this plugin. - * @param {object} context The context which you would like to create. - * @return {object} The new plugin object. - */ -minplayer.plugin.prototype.create = function(name, base, context) { - var plugin = null; - - // Make sure we have a base object. - base = base || 'minplayer'; - if (!window[base][name]) { - base = 'minplayer'; - } - - // Make sure there is a context. - context = context || this.display; - - // See if this plugin exists within this object. - if (window[base][name]) { - - // Set the plugin. - plugin = window[base][name]; - - // See if a template version of the plugin exists. - if (plugin[this.options.template]) { - - plugin = plugin[this.options.template]; - } - - // Make sure the plugin is a function. - if (typeof plugin !== 'function') { - plugin = window.minplayer[name]; - } - - // Make sure it is a function. - if (typeof plugin === 'function') { - return new plugin(context, this.options); - } - } - - return null; -}; - -/** - * Plugins should call this method when they are ready. - */ -minplayer.plugin.prototype.ready = function() { - - // Keep this plugin from triggering multiple ready events. - if (!this.pluginReady) { - - // Set the ready flag. - this.pluginReady = true; - - // Now trigger that I am ready. - this.trigger('ready'); - - // Check the queue. - this.checkQueue(); - } -}; - -/** - * Returns if this component is valid. - * - * @return {boolean} TRUE if the plugin display is valid. - */ -minplayer.plugin.prototype.isValid = function() { - return !!this.options.id && this.active; -}; - -/** - * Allows a plugin to do something when it is added to another plugin. - * - * @param {object} plugin The plugin that this plugin was added to. - */ -minplayer.plugin.prototype.onAdded = function(plugin) { -}; - -/** - * Adds a new plugin to this player. - * - * @param {string} name The name of this plugin. - * @param {object} plugin A new plugin object, derived from media.plugin. - */ -minplayer.plugin.prototype.addPlugin = function(name, plugin) { - name = name || this.name; - plugin = plugin || this; - - // Make sure the plugin is valid. - if (plugin.isValid()) { - - // If the plugins for this instance do not exist. - if (!minplayer.plugins[this.options.id]) { - - // Initialize the plugins. - minplayer.plugins[this.options.id] = {}; - } - - if (!minplayer.plugins[this.options.id][name]) { - - // Add the plugins array. - minplayer.plugins[this.options.id][name] = []; - } - - // Add this plugin. - var instance = minplayer.plugins[this.options.id][name].push(plugin); - - // Set the uuid. - this.uuid = this.options.id + '__' + name + '__' + instance; - - // Now check the queue for this plugin. - this.checkQueue(plugin); - - // Now let the plugin do something with this plugin. - plugin.onAdded(this); - } -}; - -/** Create timers for the polling. */ -minplayer.timers = {}; - -/** - * Create a polling timer. - * - * @param {string} name The name of the timer. - * @param {function} callback The function to call when you poll. - * @param {integer} interval The interval you would like to poll. - * @return {string} The setTimeout ID. - */ -minplayer.plugin.prototype.poll = function(name, callback, interval) { - if (minplayer.timers.hasOwnProperty(name)) { - clearTimeout(minplayer.timers[name]); - } - minplayer.timers[name] = setTimeout((function(context) { - return function callLater() { - if (callback.call(context)) { - minplayer.timers[name] = setTimeout(callLater, interval); - } - }; - })(this), interval); - return minplayer.timers[name]; -}; - -/** - * Gets a plugin by name and calls callback when it is ready. - * - * @param {string} plugin The plugin of the plugin. - * @param {function} callback Called when the plugin is ready. - * @return {object} The plugin if no callback is provided. - */ -minplayer.plugin.prototype.get = function(plugin, callback) { - - // If they pass just a callback, then return all plugins when ready. - if (typeof plugin === 'function') { - callback = plugin; - plugin = null; - } - - // Return the minplayer.get equivalent. - return minplayer.get.call(this, this.options.id, plugin, callback); -}; - -/** - * Check the queue and execute it. - * - * @param {object} plugin The plugin object to check the queue against. - */ -minplayer.plugin.prototype.checkQueue = function(plugin) { - - // Initialize our variables. - var q = null, i = 0, check = false; - - // Normalize the plugin variable. - plugin = plugin || this; - - // Set the lock. - minplayer.lock = true; - - // Iterate through all the queues. - var length = minplayer.queue.length; - for (i = 0; i < length; i++) { - if (minplayer.queue.hasOwnProperty(i)) { - - // Get the queue. - q = minplayer.queue[i]; - - // Now check to see if this queue is about us. - check = !q.id && !q.plugin; - check |= (q.plugin === plugin.name); - check &= (!q.id || (q.id === this.options.id)); - - // If the check passes, and hasn't already been added... - if (check && !q.addedto.hasOwnProperty(plugin.options.id)) { - q.addedto[plugin.options.id] = true; - check = minplayer.bind.call( - q.context, - q.event, - this.options.id, - plugin.name, - q.callback, - true - ); - } - } - } - - // Release the lock. - minplayer.lock = false; -}; - -/** - * All minplayer event types. - */ -minplayer.eventTypes = {}; - -/** - * Determine if an event is of a certain type. - * - * @param {string} name The full name of the event. - * @param {string} type The type of the event. - * @return {boolean} If this named event is of type. - */ -minplayer.plugin.prototype.isEvent = function(name, type) { - // Static cache for performance. - var cacheName = name + '__' + type; - if (typeof minplayer.eventTypes[cacheName] !== 'undefined') { - return minplayer.eventTypes[cacheName]; - } - else { - var regex = new RegExp('^(.*:)?' + type + '$', 'gi'); - minplayer.eventTypes[cacheName] = (name.match(type) !== null); - return minplayer.eventTypes[cacheName]; - } -}; - -/** - * Trigger a media event. - * - * @param {string} type The event type. - * @param {object} data The event data object. - * @param {boolean} noqueue If this trigger should not be queued. - * @return {object} The plugin object. - */ -minplayer.plugin.prototype.trigger = function(type, data, noqueue) { - - // Don't trigger if this plugin is inactive. - if (!this.active) { - return this; - } - - // Only queue if they wish it to be so... - if (!noqueue) { - - // Add this to our triggered array. - this.triggered[type] = data; - } - - // Iterate through the queue. - var i = 0, queue = {}, queuetype = null; - - // Iterate through all the queue items. - for (var name in this.queue) { - - // See if this is an event we care about. - if (this.isEvent(name, type)) { - - // Set the queuetype. - queuetype = this.queue[name]; - - // Iterate through all the callbacks in this queue. - for (i in queuetype) { - - // Check to make sure the queue index exists. - if (queuetype.hasOwnProperty(i)) { - - // Setup the event object, and call the callback. - queue = queuetype[i]; - queue.callback({target: this, data: queue.data}, data); - } - } - } - } - - // Return the plugin object. - return this; -}; - -/** - * Unbind then Bind - * - * @param {string} type The event type. - * @param {object} data The data to bind with the event. - * @param {function} fn The callback function. - * @return {object} The plugin object. - */ -minplayer.plugin.prototype.ubind = function(type, data, fn) { - this.unbind(type); - return this.bind(type, data, fn); -}; - -/** - * Bind to a media event. - * - * @param {string} type The event type. - * @param {object} data The data to bind with the event. - * @param {function} fn The callback function. - * @return {object} The plugin object. - **/ -minplayer.plugin.prototype.bind = function(type, data, fn) { - - // Only bind if active. - if (!this.active) { - return this; - } - - // Allow the data to be the callback. - if (typeof data === 'function') { - fn = data; - data = null; - } - - // You must bind to a specific event and have a callback. - if (!type || !fn) { - return; - } - - // Initialize the queue for this type. - this.queue[type] = this.queue[type] || []; - - // Now add this event to the queue. - this.queue[type].push({ - callback: fn, - data: data - }); - - // Now see if this event has already been triggered. - for (var name in this.triggered) { - if (this.triggered.hasOwnProperty(name)) { - if (this.isEvent(type, name)) { - fn({target: this, data: data}, this.triggered[name]); - } - } - } - - // Return the plugin. - return this; -}; - -/** - * Unbind a media event. - * - * @param {string} type The event type. - * @return {object} The plugin object. - **/ -minplayer.plugin.prototype.unbind = function(type) { - - // If this is locked then try again after 10ms. - if (this.lock) { - setTimeout((function(plugin) { - return function() { - plugin.unbind(type); - }; - })(this), 10); - } - - // Set the lock. - this.lock = true; - - if (!type) { - this.queue = {}; - } - else if (this.queue.hasOwnProperty(type) && (this.queue[type].length > 0)) { - this.queue[type].length = 0; - } - - // Reset the lock. - this.lock = false; - - // Return the plugin. - return this; -}; - -/** - * Adds an item to the queue. - * - * @param {object} context The context which this is called within. - * @param {string} event The event to trigger on. - * @param {string} id The player ID. - * @param {string} plugin The name of the plugin. - * @param {function} callback Called when the event occurs. - */ -minplayer.addQueue = function(context, event, id, plugin, callback) { - - // See if it is locked... - if (!minplayer.lock) { - minplayer.queue.push({ - context: context, - id: id, - event: event, - plugin: plugin, - callback: callback, - addedto: {} - }); - } - else { - - // If so, then try again after 10 milliseconds. - setTimeout(function() { - minplayer.addQueue(context, id, event, plugin, callback); - }, 10); - } -}; - -/** - * Binds an event to a plugin instance, and if it doesn't exist, then caches - * it for a later time. - * - * @param {string} event The event to trigger on. - * @param {string} id The player ID. - * @param {string} plugin The name of the plugin. - * @param {function} callback Called when the event occurs. - * @param {boolean} fromCheck If this is from a checkqueue. - * @return {boolean} If the bind was successful. - * @this The object in context who called this method. - */ -minplayer.bind = function(event, id, plugin, callback, fromCheck) { - - // If no callback exists, then just return false. - if (!callback) { - return false; - } - - // Get the plugins. - var plugins = minplayer.plugins, thisPlugin = null, thisId = null; - - // Determine the selected plugins. - var selected = []; - - // Create a quick add. - var addSelected = function(id, plugin) { - if (plugins.hasOwnProperty(id) && plugins[id].hasOwnProperty(plugin)) { - var i = plugins[id][plugin].length; - while (i--) { - selected.push(plugins[id][plugin][i]); - } - } - }; - - // If they provide id && plugin - if (id && plugin) { - addSelected(id, plugin); - } - - // If they provide no id but a plugin. - else if (!id && plugin) { - for (thisId in plugins) { - addSelected(thisId, plugin); - } - } - - // If they provide an id but no plugin. - else if (id && !plugin && plugins[id]) { - for (thisPlugin in plugins[id]) { - addSelected(id, thisPlugin); - } - } - - // If they provide niether an id or a plugin. - else if (!id && !plugin) { - for (thisId in plugins) { - for (thisPlugin in plugins[thisId]) { - addSelected(thisId, thisPlugin); - } - } - } - - // Iterate through the selected plugins and bind. - /* jshint loopfunc: true */ - var i = selected.length; - while (i--) { - selected[i].bind(event, (function(context) { - return function(event) { - callback.call(context, event.target); - }; - })(this)); - } - - // Add it to the queue for post bindings... - if (!fromCheck) { - minplayer.addQueue(this, event, id, plugin, callback); - } - - // Return that this wasn't handled. - return (selected.length > 0); -}; - -/** - * The main API for minPlayer. - * - * Provided that this function takes three parameters, there are 8 different - * ways to use this api. - * - * id (0x100) - You want a specific player. - * plugin (0x010) - You want a specific plugin. - * callback (0x001) - You only want it when it is ready. - * - * 000 - You want all plugins from all players, ready or not. - * - * var plugins = minplayer.get(); - * - * 001 - You want all plugins from all players, but only when ready. - * - * minplayer.get(function(plugin) { - * // Code goes here. - * }); - * - * 010 - You want a specific plugin from all players, ready or not... - * - * var medias = minplayer.get(null, 'media'); - * - * 011 - You want a specific plugin from all players, but only when ready. - * - * minplayer.get('player', function(player) { - * // Code goes here. - * }); - * - * 100 - You want all plugins from a specific player, ready or not. - * - * var plugins = minplayer.get('player_id'); - * - * 101 - You want all plugins from a specific player, but only when ready. - * - * minplayer.get('player_id', null, function(plugin) { - * // Code goes here. - * }); - * - * 110 - You want a specific plugin from a specific player, ready or not. - * - * var plugin = minplayer.get('player_id', 'media'); - * - * 111 - You want a specific plugin from a specific player, only when ready. - * - * minplayer.get('player_id', 'media', function(media) { - * // Code goes here. - * }); - * - * @this The context in which this function was called. - * @param {string} id The ID of the widget to get the plugins from. - * @param {string} plugin The name of the plugin. - * @param {function} callback Called when the plugin is ready. - * @return {object} The plugin object if it is immediately available. - */ -minplayer.get = function(id, plugin, callback) { - - // Get the parameter types. - var idType = typeof id; - var pluginType = typeof plugin; - var callbackType = typeof callback; - - // Normalize the arguments for a better interface. - if (idType === 'function') { - callback = id; - plugin = id = null; - } - else if (pluginType === 'function') { - callback = plugin; - plugin = id; - id = null; - } - else if ((pluginType === 'undefined') && (callbackType === 'undefined')) { - plugin = id; - callback = id = null; - } - - // Make sure the callback is a callback. - callback = (typeof callback === 'function') ? callback : null; - - // If a callback was provided, then just go ahead and bind. - if (callback) { - minplayer.bind.call(this, 'ready', id, plugin, callback); - return; - } - - // Get the plugins. - var plugins = minplayer.plugins, thisId = null; - - // 0x000 - if (!id && !plugin && !callback) { - return plugins; - } - // 0x100 - else if (id && !plugin && !callback) { - return plugins[id]; - } - // 0x110 - else if (id && plugin && !callback) { - return plugins[id][plugin]; - } - // 0x010 - else if (!id && plugin && !callback) { - var plugin_types = []; - for (thisId in plugins) { - if (plugins.hasOwnProperty(thisId) && - plugins[thisId].hasOwnProperty(plugin)) { - var i = plugins[thisId][plugin].length; - while (i--) { - plugin_types.push(plugins[thisId][plugin][i]); - } - } - } - return plugin_types; - } -}; -minplayer = minplayer || {}; -(function(exports) { -/*! -* screenfull -* v1.1.1 - 2013-11-20 -* https://github.com/sindresorhus/screenfull.js -* (c) Sindre Sorhus; MIT License -*/ -!function(a,b){"use strict";var c="undefined"!=typeof Element&&"ALLOW_KEYBOARD_INPUT"in Element,d=function(){for(var a,c,d=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],e=0,f=d.length,g={};f>e;e++)if(a=d[e],a&&a[1]in b){for(e=0,c=a.length;c>e;e++)g[d[0][e]]=a[e];return g}return!1}(),e={request:function(a){var e=d.requestFullscreen;a=a||b.documentElement,/5\.1[\.\d]* Safari/.test(navigator.userAgent)?a[e]():a[e](c&&Element.ALLOW_KEYBOARD_INPUT)},exit:function(){b[d.exitFullscreen]()},toggle:function(a){this.isFullscreen?this.exit():this.request(a)},onchange:function(){},onerror:function(){},raw:d};return d?(Object.defineProperties(e,{isFullscreen:{get:function(){return!!b[d.fullscreenElement]}},element:{enumerable:!0,get:function(){return b[d.fullscreenElement]}},enabled:{enumerable:!0,get:function(){return!!b[d.fullscreenEnabled]}}}),b.addEventListener(d.fullscreenchange,function(a){e.onchange.call(e,a)}),b.addEventListener(d.fullscreenerror,function(a){e.onerror.call(e,a)}),a.screenfull=e,void 0):(a.screenfull=!1,void 0)}(window,document);exports.screenfull = screenfull; -})(minplayer); -/** - * @constructor - * @extends minplayer.plugin - * @class Base class used to provide the display and options for any component - * deriving from this class. Components who derive are expected to provide - * the elements that they define by implementing the getElements method. - * - * @param {string} name The name of this plugin. - * @param {object} context The jQuery context this component resides. - * @param {object} options The options for this component. - * @param {object} queue The event queue to pass events around. - */ -minplayer.display = function(name, context, options, queue) { - - // Derive from plugin - minplayer.plugin.call(this, name, context, options, queue); -}; - -/** Derive from minplayer.plugin. */ -minplayer.display.prototype = new minplayer.plugin(); - -/** Reset the constructor. */ -minplayer.display.prototype.constructor = minplayer.display; - -/** - * Returns the display for this component. - * - * @param {object} context The context which this display is within. - * @param {object} options The options to get the display. - * - * @return {object} The jQuery context for this display. - */ -minplayer.display.prototype.getDisplay = function(context, options) { - - // Return the context. - return context; -}; - -/** - * @see minplayer.plugin.initialize - */ -minplayer.display.prototype.initialize = function() { - - // Only set the display if it hasn't already been set. - if (!this.display) { - - // Set the display. - this.display = this.getDisplay(this.context, this.options); - } - - // Only continue loading this plugin if there is a display. - if (this.display) { - - // Set the plugin name within the options. - this.options.pluginName = 'display'; - - // Get the display elements. - this.elements = this.getElements(); - - // Call the plugin initialize method. - minplayer.plugin.prototype.initialize.call(this); - } -}; - -/** - * @see minplayer.plugin.construct - */ -minplayer.display.prototype.construct = function() { - - // Call the plugin constructor. - minplayer.plugin.prototype.construct.call(this); - - // Set if this display is in autohide. - this.autoHide = false; - - // Only do this if they allow resize for this display. - if (this.onResize) { - - // Set the resize timeout and this pointer. - var resizeTimeout = 0; - - // Add a handler to trigger a resize event. - jQuery(window).resize((function(display) { - return function() { - clearTimeout(resizeTimeout); - resizeTimeout = setTimeout(function() { - display.onResize(); - }, 200); - }; - })(this)); - } -}; - -/** - * Called when the window resizes. - */ -minplayer.display.prototype.onResize = false; - -/** - * Wrapper around hide that will always not show. - * - * @param {object} element The element you wish to hide. - */ -minplayer.display.prototype.hide = function(element) { - element = element || this.display; - if (element) { - element.forceHide = true; - element.unbind().hide(); - } -}; - -/** - * Gets the full screen element. - * - * @return {object} The display to be used for full screen support. - */ -minplayer.display.prototype.fullScreenElement = function() { - return this.display; -}; - -/** - * Fix for the click function in jQuery to be cross platform. - * - * @param {object} element The element that will be clicked. - * @param {function} fn Called when the element is clicked. - * @return {object} The element that is to be clicked. - */ -minplayer.click = function(element, fn) { - var flag = false; - element = jQuery(element); - element.bind('touchstart click', function(event) { - if (!flag) { - flag = true; - setTimeout(function() { - flag = false; - }, 100); - fn.call(this, event); - } - }); - return element; -}; - -/** - * Determines if the player is in focus or not. - * - * @param {boolean} focus If the player is in focus. - */ -minplayer.display.prototype.onFocus = function(focus) { - this.hasFocus = this.focus = focus; - - // If they have autoHide enabled, then show then hide this element. - if (this.autoHide) { - this.showThenHide( - this.autoHide.element, - this.autoHide.timeout, - this.autoHide.cb - ); - } -}; - -/** - * Called if you would like for your plugin to show then hide. - * - * @param {object} element The element you would like to hide or show. - * @param {number} timeout The timeout to hide and show. - * @param {function} cb Called when something happens. - */ -minplayer.display.prototype.showThenHide = function(element, timeout, cb) { - - // Get the element type. - var elementType = (typeof element); - - // Set some interface defaults. - if (elementType === 'undefined') { - cb = null; - element = this.display; - } - else if (elementType === 'number') { - cb = timeout; - timeout = element; - element = this.display; - } - else if (elementType === 'function') { - cb = element; - element = this.display; - } - - if (!element) { - return; - } - - // Make sure we have a timeout. - timeout = timeout || 5000; - - // Set the autohide variable. - this.autoHide = { - element: element, - timeout: timeout, - cb: cb - }; - - // Show the element. - if (!element.forceHide) { - if (typeof element.showMe !== 'undefined') { - if (element.showMe) { - element.showMe(cb); - } - } - else { - element.show(); - if (cb) { - cb(true); - } - } - } - - // Define the hover state for this element. - if (!element.hoverState) { - jQuery(element).bind('mouseenter', function() { - element.hoverState = true; - }); - jQuery(element).bind('mouseleave', function() { - element.hoverState = false; - }); - } - - // Clear the timeout and start it over again. - clearTimeout(this.showTimer); - this.showTimer = setTimeout((function(self) { - return function tryAgain() { - - // Check the hover state. - if (!element.hoverState) { - if (typeof element.hideMe !== 'undefined') { - if (element.hideMe) { - element.hideMe(cb); - } - } - else { - // Hide the element. - element.hide('slow', function() { - if (cb) { - cb(false); - } - }); - } - } - else { - - // Try again in the timeout time. - self.showTimer = setTimeout(tryAgain, timeout); - } - }; - })(this), timeout); -}; - -/** - * Make this display element go fullscreen. - * - * @param {boolean} full Tell the player to go into fullscreen or not. - */ -minplayer.display.prototype.fullscreen = function(full) { - var isFull = this.isFullScreen(); - var element = this.fullScreenElement(); - if (isFull && !full) { - element.removeClass('fullscreen'); - if (minplayer.screenfull) { - minplayer.screenfull.exit(); - } - this.trigger('fullscreen', false); - } - else if (!isFull && full) { - element.addClass('fullscreen'); - if (minplayer.screenfull) { - minplayer.screenfull.request(element[0]); - minplayer.screenfull.onchange = (function(display) { - return function(e) { - if (!minplayer.screenfull.isFullscreen) { - display.fullscreen(false); - } - }; - })(this); - } - this.trigger('fullscreen', true); - } -}; - -/** - * Toggle fullscreen. - */ -minplayer.display.prototype.toggleFullScreen = function() { - this.fullscreen(!this.isFullScreen()); -}; - -/** - * Checks to see if we are in fullscreen mode. - * - * @return {boolean} TRUE - fullscreen, FALSE - otherwise. - */ -minplayer.display.prototype.isFullScreen = function() { - return this.fullScreenElement().hasClass('fullscreen'); -}; - -/** - * Returns a scaled rectangle provided a ratio and the container rect. - * - * @param {number} ratio The width/height ratio of what is being scaled. - * @param {object} rect The bounding rectangle for scaling. - * @return {object} The Rectangle object of the scaled rectangle. - */ -minplayer.display.prototype.getScaledRect = function(ratio, rect) { - var scaledRect = {}; - scaledRect.x = rect.x ? rect.x : 0; - scaledRect.y = rect.y ? rect.y : 0; - scaledRect.width = rect.width ? rect.width : 0; - scaledRect.height = rect.height ? rect.height : 0; - if (ratio) { - if ((rect.width / rect.height) > ratio) { - scaledRect.height = rect.height; - scaledRect.width = Math.floor(rect.height * ratio); - } - else { - scaledRect.height = Math.floor(rect.width / ratio); - scaledRect.width = rect.width; - } - scaledRect.x = Math.floor((rect.width - scaledRect.width) / 2); - scaledRect.y = Math.floor((rect.height - scaledRect.height) / 2); - } - return scaledRect; -}; - -/** - * Returns all the jQuery elements that this component uses. - * - * @return {object} An object which defines all the jQuery elements that - * this component uses. - */ -minplayer.display.prototype.getElements = function() { - return {}; -}; -// Add a way to instanciate using jQuery prototype. -if (!jQuery.fn.minplayer) { - - /** - * @constructor - * - * Define a jQuery minplayer prototype. - * - * @param {object} options The options for this jQuery prototype. - * @return {Array} jQuery object. - */ - jQuery.fn.minplayer = function(options) { - return jQuery(this).each(function() { - options = options || {}; - options.id = options.id || jQuery(this).attr('id') || Math.random(); - if (!minplayer.plugins[options.id]) { - options.template = options.template || 'default'; - if (minplayer[options.template]) { - new minplayer[options.template](jQuery(this), options); - } - else { - new minplayer(jQuery(this), options); - } - } - }); - }; -} - -/** - * @constructor - * @extends minplayer.display - * @class The core media player class which governs the media player - * functionality. - * - *

Usage: - *


- *
- *   // Create a media player.
- *   var player = jQuery("#player").minplayer({
- *
- *   });
- *
- * 
- *

- * - * @param {object} context The jQuery context. - * @param {object} options This components options. - */ -minplayer = jQuery.extend(function(context, options) { - - // Derive from display - minplayer.display.call(this, 'player', context, options); -}, minplayer); - -/** Derive from minplayer.display. */ -minplayer.prototype = new minplayer.display(); - -/** Reset the constructor. */ -minplayer.prototype.constructor = minplayer; - -/** - * Get the default options for this plugin. - * - * @param {object} options The default options for this plugin. - */ -minplayer.prototype.defaultOptions = function(options) { - - // Assign the default options. - options.id = 'player'; - options.build = false; - options.wmode = 'transparent'; - options.preload = true; - options.autoplay = false; - options.autoload = true; - options.loop = false; - options.width = '100%'; - options.height = '350px'; - options.debug = false; - options.volume = 80; - options.files = null; - options.file = ''; - options.preview = ''; - options.attributes = {}; - options.plugins = {}; - options.logo = ''; - options.link = ''; - options.duration = 0; - - // Allow them to provide arguments based off of the DOM attributes. - jQuery.each(this.context[0].attributes, function(index, attr) { - options[attr.name] = attr.value; - }); - - // Set the parent options. - minplayer.display.prototype.defaultOptions.call(this, options); -}; - -/** - * @see minplayer.plugin.construct - */ -minplayer.prototype.construct = function() { - - // Call the minplayer display constructor. - minplayer.display.prototype.construct.call(this); - - // Initialize all plugins. - var plugin = null; - for (var pluginName in this.options.plugins) { - plugin = this.options.plugins[pluginName]; - if (minplayer[plugin]) { - plugin = minplayer[plugin]; - if (plugin[this.options.template] && plugin[this.options.template].init) { - plugin[this.options.template].init(this); - } - else if (plugin.init) { - plugin.init(this); - } - } - } - - // Set the plugin name within the options. - this.options.pluginName = 'player'; - - /** The controller for this player. */ - this.controller = this.create('controller'); - - /** The play loader for this player. */ - this.playLoader = this.create('playLoader'); - - /** Add the logo for the player. */ - if (this.options.logo && this.elements.logo) { - - var code = ''; - if (this.options.link) { - code += ''; - } - code += ''; - if (this.options.link) { - code += ''; - } - this.logo = this.elements.logo.append(code); - } - - /** Variable to store the current media player. */ - this.currentPlayer = 'html5'; - - // Add key events to the window. - this.addKeyEvents(); - - // Called to add events. - this.addEvents(); - - // Now load these files. - this.load(this.getFiles()); - - // The player is ready. - this.ready(); -}; - -/** - * Set the focus for this player. - * - * @param {boolean} focus If the player is in focus or not. - */ -minplayer.prototype.setFocus = function(focus) { - - // Tell all plugins about this. - minplayer.get.call(this, this.options.id, null, function(plugin) { - plugin.onFocus(focus); - }); - - // Trigger an event that a focus event has occured. - this.trigger('playerFocus', focus); -}; - -/** - * Called when an error occurs. - * - * @param {object} plugin The plugin you wish to bind to. - */ -minplayer.prototype.bindTo = function(plugin) { - plugin.ubind(this.uuid + ':error', (function(player) { - return function(event, data) { - if (player.currentPlayer === 'html5') { - minplayer.player = 'minplayer'; - player.options.file.player = 'minplayer'; - player.loadPlayer(); - } - else { - player.showError(data); - } - }; - })(this)); - - // Bind to the fullscreen event. - plugin.ubind(this.uuid + ':fullscreen', (function(player) { - return function(event, data) { - player.resize(); - }; - })(this)); -}; - -/** - * We need to bind to events we are interested in. - */ -minplayer.prototype.addEvents = function() { - - // Keep track if we are inside the player or not. - var inside = false; - - // Set the focus when they enter the player. - this.display.bind('mouseenter', (function(player) { - return function() { - inside = true; - player.setFocus(true); - }; - })(this)); - - - this.display.bind('mouseleave', (function(player) { - return function() { - inside = false; - player.setFocus(false); - }; - })(this)); - - var moveThrottle = false; - this.display.bind('mousemove', (function(player) { - return function() { - if (!moveThrottle) { - moveThrottle = setTimeout(function() { - moveThrottle = false; - if (inside) { - player.setFocus(true); - } - }, 300); - } - }; - })(this)); - - minplayer.get.call(this, this.options.id, null, (function(player) { - return function(plugin) { - player.bindTo(plugin); - }; - })(this)); -}; - -/** - * Sets an error on the player. - * - * @param {string} error The error to display on the player. - */ -minplayer.prototype.showError = function(error) { - if (typeof error !== 'object') { - error = error || ''; - if (this.elements.error) { - - // Set the error text. - this.elements.error.text(error); - if (error) { - // Show the error message. - this.elements.error.show(); - - // Only show this error for a time interval. - setTimeout((function(player) { - return function() { - player.elements.error.hide('slow'); - }; - })(this), 5000); - } - else { - this.elements.error.hide(); - } - } - } -}; - -/** - * Adds key events to the player. - */ -minplayer.prototype.addKeyEvents = function() { - jQuery(document).bind('keydown', (function(player) { - return function(event) { - switch (event.keyCode) { - case 113: // ESC - case 27: // Q - if (player.isFullScreen()) { - player.fullscreen(false); - } - break; - } - }; - })(this)); -}; - -/** - * Returns all the media files available for this player. - * - * @return {array} All the media files for this player. - */ -minplayer.prototype.getFiles = function() { - - // If they provide the files in the options, use those first. - if (this.options.files) { - return this.options.files; - } - - if (this.options.file) { - return this.options.file; - } - - var files = []; - var mediaSrc = null; - - // Get the files involved... - if (this.elements.media) { - mediaSrc = this.elements.media.attr('src'); - if (mediaSrc) { - files.push({'path': mediaSrc}); - } - jQuery('source', this.elements.media).each(function() { - files.push({ - 'path': jQuery(this).attr('src'), - 'mimetype': jQuery(this).attr('type'), - 'codecs': jQuery(this).attr('codecs') - }); - }); - } - - return files; -}; - -/** - * Returns the full media player object. - * - * @param {array} files An array of files to chose from. - * @return {object} The best media file to play in the current browser. - */ -minplayer.getMediaFile = function(files) { - - // If there are no files then return null. - if (!files) { - return null; - } - - // If the file is already a file object then just return. - if ((typeof files === 'string') || files.path || files.id) { - return new minplayer.file(files); - } - - // Add the files and get the best player to play. - var bestPriority = 0, mFile = null, file = null; - for (var i in files) { - if (files.hasOwnProperty(i)) { - file = new minplayer.file(files[i]); - if (file.player && (file.priority > bestPriority)) { - bestPriority = file.priority; - mFile = file; - } - } - } - - // Return the best minplayer file. - return mFile; -}; - -/** - * Loads a media player based on the current file. - * - * @return {boolean} If a new player was loaded. - */ -minplayer.prototype.loadPlayer = function() { - - // Do nothing if there isn't a file or anywhere to put it. - if (!this.options.file || (this.elements.display.length === 0)) { - return false; - } - - // If no player is set, then also return false. - if (!this.options.file.player) { - return false; - } - - // Reset the error. - this.showError(); - - // Only destroy if the current player is different than the new player. - var player = this.options.file.player.toString(); - - // If there isn't media or if the players are different. - if (!this.media || (player !== this.currentPlayer)) { - - // Set the current media player. - this.currentPlayer = player; - - // Do nothing if we don't have a display. - if (!this.elements.display) { - this.showError('No media display found.'); - return; - } - - // Destroy the current media. - var queue = {}; - if (this.media) { - queue = this.media.queue; - this.media.destroy(); - } - - // Get the class name and create the new player. - pClass = minplayer.players[this.options.file.player]; - - // Create the new media player. - this.options.mediaelement = this.elements.media; - this.media = new pClass(this.elements.display, this.options, queue); - this.media.load(this.options.file); - this.display.addClass('minplayer-player-' + this.media.mediaFile.player); - return true; - } - // If the media object already exists... - else if (this.media) { - - // Now load the different media file. - this.media.options = this.options; - this.display.removeClass('minplayer-player-' + this.media.mediaFile.player); - this.media.load(this.options.file); - this.display.addClass('minplayer-player-' + this.media.mediaFile.player); - return false; - } -}; - -/** - * Load a set of files or a single file for the media player. - * - * @param {array} files An array of files to chose from to load. - */ -minplayer.prototype.load = function(files) { - - // Set the id and class. - var id = '', pClass = ''; - - // If no file was provided, then get it. - this.options.files = files || this.options.files; - this.options.file = minplayer.getMediaFile(this.options.files); - - // Now load the player. - if (this.loadPlayer()) { - - // Add the events since we now have a player. - this.bindTo(this.media); - - // If the player isn't valid, then show an error. - if (this.options.file.mimetype && !this.options.file.player) { - this.showError('Cannot play media: ' + this.options.file.mimetype); - return false; - } - - return true; - } - - return false; -}; - -/** - * Called when the player is resized. - */ -minplayer.prototype.resize = function() { - - // Call onRezie for each plugin. - this.get(function(plugin) { - if (plugin.onResize) { - plugin.onResize(); - } - }); -}; -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** - * @constructor - * @class A class to easily handle images. - * @param {object} context The jQuery context. - * @param {object} options This components options. - */ -minplayer.image = function(context, options) { - - // Determine if the image is loaded. - this.loaded = false; - - // The image loader. - this.loader = null; - - // The ratio of the image. - this.ratio = 0; - - // The image element. - this.img = null; - - // Derive from display - minplayer.display.call(this, 'image', context, options); -}; - -/** Derive from minplayer.display. */ -minplayer.image.prototype = new minplayer.display(); - -/** Reset the constructor. */ -minplayer.image.prototype.constructor = minplayer.image; - -/** - * @see minplayer.plugin.construct - */ -minplayer.image.prototype.construct = function() { - - // Call the media display constructor. - minplayer.display.prototype.construct.call(this); - - // Set the plugin name within the options. - this.options.pluginName = 'image'; - - // Set the container to not show any overflow... - this.display.css('overflow', 'hidden'); - - /** The loader for the image. */ - this.loader = new Image(); - - /** Register for when the image is loaded within the loader. */ - this.loader.onload = (function(image) { - return function() { - image.loaded = true; - image.ratio = (image.loader.width / image.loader.height); - image.resize(); - image.trigger('loaded'); - }; - })(this); - - // We are now ready. - this.ready(); -}; - -/** - * Loads an image. - * - * @param {string} src The source of the image to load. - */ -minplayer.image.prototype.load = function(src) { - - // First clear the previous image. - this.clear(function() { - - // Create the new image, and append to the display. - this.display.empty(); - this.img = jQuery(document.createElement('img')).attr({src: ''}).hide(); - this.display.append(this.img); - this.loader.src = src; - this.img.attr('src', src); - }); -}; - -/** - * Clears an image. - * - * @param {function} callback Called when the image is done clearing. - */ -minplayer.image.prototype.clear = function(callback) { - this.loaded = false; - if (this.img) { - this.img.fadeOut(150, (function(image) { - return function() { - image.img.attr('src', ''); - image.loader.src = ''; - jQuery(this).remove(); - if (callback) { - callback.call(image); - } - }; - })(this)); - } - else if (callback) { - callback.call(this); - } -}; - -/** - * Resize the image provided a width and height or nothing. - * - * @param {integer} width (optional) The width of the container. - * @param {integer} height (optional) The height of the container. - */ -minplayer.image.prototype.resize = function(width, height) { - width = width || this.display.parent().width(); - height = height || this.display.parent().height(); - if (width && height && this.loaded) { - - // Get the scaled rectangle. - var rect = this.getScaledRect(this.ratio, { - width: width, - height: height - }); - - // Now set this image to the new size. - if (this.img) { - this.img.attr('src', this.loader.src).css({ - marginLeft: rect.x, - marginTop: rect.y, - width: rect.width, - height: rect.height - }); - } - - // Show the container. - this.img.fadeIn(150); - } -}; - -/** - * @see minplayer.display#onResize - */ -minplayer.image.prototype.onResize = function() { - - // Resize the image to fit. - this.resize(); -}; -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** - * @constructor - * @class A wrapper class used to provide all the data necessary to control an - * individual file within this media player. - * - * @param {object} file A media file object with minimal required information. - */ -minplayer.file = function(file) { - - // If there isn't a file provided, then just return null. - if (!file) { - return null; - } - - file = (typeof file === 'string') ? {path: file} : file; - - // If we already are a minplayer file, then just return this file. - if (file.hasOwnProperty('isMinPlayerFile')) { - return file; - } - - this.isMinPlayerFile = true; - this.duration = file.duration || 0; - this.bytesTotal = file.bytesTotal || 0; - this.quality = file.quality || 0; - this.stream = file.stream || ''; - this.path = file.path || ''; - this.codecs = file.codecs || ''; - - // These should be provided, but just in case... - this.extension = file.extension || this.getFileExtension(); - this.mimetype = file.mimetype || file.filemime || this.getMimeType(); - this.type = file.type || this.getType(); - - // Fail safe to try and guess the mimetype and media type. - if (!this.type) { - this.mimetype = this.getMimeType(); - this.type = this.getType(); - } - - // Get the player. - this.player = minplayer.player || file.player || this.getBestPlayer(); - this.priority = file.priority || this.getPriority(); - this.id = file.id || this.getId(); - if (!this.path) { - this.path = this.id; - } -}; - -/** Used to force the player for all media. */ -minplayer.player = ''; - -/** - * Returns the best player for the job. - * - * @return {string} The best player to play the media file. - */ -minplayer.file.prototype.getBestPlayer = function() { - var bestplayer = null, bestpriority = 0; - jQuery.each(minplayer.players, (function(file) { - return function(name, player) { - var priority = player.getPriority(file); - if (player.canPlay(file) && (priority > bestpriority)) { - bestplayer = name; - bestpriority = priority; - } - }; - })(this)); - return bestplayer; -}; - -/** - * The priority of this file is determined by the priority of the best - * player multiplied by the priority of the mimetype. - * - * @return {integer} The priority of the media file. - */ -minplayer.file.prototype.getPriority = function() { - var priority = 1; - if (this.player) { - priority = minplayer.players[this.player].getPriority(this); - } - switch (this.mimetype) { - case 'video/x-webm': - case 'video/webm': - case 'application/octet-stream': - case 'application/vnd.apple.mpegurl': - return priority * 10; - case 'video/mp4': - case 'audio/mp4': - case 'audio/mpeg': - return priority * 9; - case 'video/ogg': - case 'audio/ogg': - case 'video/quicktime': - return priority * 8; - default: - return priority * 5; - } -}; - -/** - * Returns the file extension of the file path. - * - * @return {string} The file extension. - */ -minplayer.file.prototype.getFileExtension = function() { - return this.path.substring(this.path.lastIndexOf('.') + 1).toLowerCase(); -}; - -/** - * Returns the proper mimetype based off of the extension. - * - * @return {string} The mimetype of the file based off of extension. - */ -minplayer.file.prototype.getMimeType = function() { - switch (this.extension) { - case 'mp4': case 'm4v': case 'flv': case 'f4v': - return 'video/mp4'; - case 'm3u8': - return 'application/vnd.apple.mpegurl'; - case'webm': - return 'video/webm'; - case 'ogg': case 'ogv': - return 'video/ogg'; - case '3g2': - return 'video/3gpp2'; - case '3gpp': - case '3gp': - return 'video/3gpp'; - case 'mov': - return 'video/quicktime'; - case'swf': - return 'application/x-shockwave-flash'; - case 'oga': - return 'audio/ogg'; - case 'mp3': - return 'audio/mpeg'; - case 'm4a': case 'f4a': - return 'audio/mp4'; - case 'aac': - return 'audio/aac'; - case 'wav': - return 'audio/vnd.wave'; - case 'wma': - return 'audio/x-ms-wma'; - default: - return 'unknown'; - } -}; - -/** - * The type of media this is: video or audio. - * - * @return {string} "video" or "audio" based on what the type of media this - * is. - */ -minplayer.file.prototype.getType = function() { - var type = this.mimetype.match(/([^\/]+)(\/)/); - type = (type && (type.length > 1)) ? type[1] : ''; - if (type === 'video') { - return 'video'; - } - if (type === 'audio') { - return 'audio'; - } - switch (this.mimetype) { - case 'application/octet-stream': - case 'application/x-shockwave-flash': - case 'application/vnd.apple.mpegurl': - return 'video'; - } - return ''; -}; - -/** - * Returns the ID for this media file. - * - * @return {string} The id for this media file which is provided by the player. - */ -minplayer.file.prototype.getId = function() { - var player = minplayer.players[this.player]; - return (player && player.getMediaId) ? player.getMediaId(this) : ''; -}; -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** - * @constructor - * @extends minplayer.display - * @class The play loader base class, which is used to control the busy - * cursor, big play button, and the opaque background which shows when the - * player is paused. - * - * @param {object} context The jQuery context. - * @param {object} options This components options. - */ -minplayer.playLoader = function(context, options) { - - // Clear the variables. - this.clear(); - - // Derive from display - minplayer.display.call(this, 'playLoader', context, options); -}; - -/** Derive from minplayer.display. */ -minplayer.playLoader.prototype = new minplayer.display(); - -/** Reset the constructor. */ -minplayer.playLoader.prototype.constructor = minplayer.playLoader; - -/** - * The constructor. - */ -minplayer.playLoader.prototype.construct = function() { - - // Call the media display constructor. - minplayer.display.prototype.construct.call(this); - - // Set the plugin name within the options. - this.options.pluginName = 'playLoader'; - - // Get the media plugin. - this.initializePlayLoader(); - - // We are now ready. - this.ready(); -}; - -/** - * Initialize the playLoader. - */ -minplayer.playLoader.prototype.initializePlayLoader = function() { - - // Get the media plugin. - this.get('media', function(media) { - - // Only bind if this player does not have its own play loader. - if (!media.hasPlayLoader(this.options.preview)) { - - // Enable the playLoader. - this.enabled = true; - - // Get the poster image. - if (!this.options.preview) { - this.options.preview = media.poster; - } - - // Determine if we should load the image. - var shouldLoad = true; - if (this.preview && this.preview.loader) { - shouldLoad = (this.preview.loader.src !== this.options.preview); - } - - // Only load the image if it is different. - if (shouldLoad) { - // Reset the media's poster image. - media.elements.media.attr('poster', ''); - - // Load the preview image. - this.loadPreview(); - } - - // Trigger a play event when someone clicks on the controller. - if (this.elements.bigPlay) { - minplayer.click(this.elements.bigPlay.unbind(), function(event) { - event.preventDefault(); - jQuery(this).hide(); - media.play(); - }); - } - - // Bind to the player events to control the play loader. - media.ubind(this.uuid + ':loadstart', (function(playLoader) { - return function(event, data, reset) { - playLoader.busy.setFlag('media', true); - playLoader.bigPlay.setFlag('media', true); - playLoader.previewFlag.setFlag('media', true); - playLoader.checkVisibility(); - }; - })(this)); - media.ubind(this.uuid + ':waiting', (function(playLoader) { - return function(event, data, reset) { - if (!reset) { - playLoader.busy.setFlag('media', true); - playLoader.checkVisibility(); - } - }; - })(this)); - media.ubind(this.uuid + ':loadeddata', (function(playLoader) { - return function(event, data, reset) { - if (!reset) { - playLoader.busy.setFlag('media', false); - playLoader.checkVisibility(); - } - }; - })(this)); - media.ubind(this.uuid + ':playing', (function(playLoader) { - return function(event, data, reset) { - if (!reset) { - playLoader.busy.setFlag('media', false); - playLoader.bigPlay.setFlag('media', false); - if (media.mediaFile.type !== 'audio') { - playLoader.previewFlag.setFlag('media', false); - } - playLoader.checkVisibility(); - } - }; - })(this)); - media.ubind(this.uuid + ':pause', (function(playLoader) { - return function(event, data, reset) { - if (!reset) { - playLoader.busy.setFlag('media', false); - playLoader.bigPlay.setFlag('media', true); - playLoader.checkVisibility(); - } - }; - })(this)); - } - else { - - // Hide the display. - this.enabled = false; - this.hide(this.elements.busy); - this.hide(this.elements.bigPlay); - this.hide(this.elements.preview); - this.hide(); - } - }); -}; - -/** - * Clears the playloader. - * - * @param {function} callback Called when the playloader is finished clearing. - */ -minplayer.playLoader.prototype.clear = function(callback) { - - // Define the flags that control the busy cursor. - this.busy = new minplayer.flags(); - - // Define the flags that control the big play button. - this.bigPlay = new minplayer.flags(); - - // Define the flags the control the preview. - this.previewFlag = new minplayer.flags(); - - /** If the playLoader is enabled. */ - this.enabled = true; - - // If the preview is defined, then clear the image. - if (this.preview) { - - this.preview.clear((function(playLoader) { - return function() { - - // Reset the preview. - playLoader.preview = null; - - // If they wish to be called back after it is cleared. - if (callback) { - callback(); - } - }; - })(this)); - } - else { - - /** The preview image. */ - this.preview = null; - - // Return the callback. - if (callback) { - callback(); - } - } -}; - -/** - * Loads the preview image. - * - * @param {string} image The image you would like to load. - * @return {boolean} Returns true if an image was loaded, false otherwise. - */ -minplayer.playLoader.prototype.loadPreview = function(image) { - - // Get the image to load. - image = image || this.options.preview; - this.options.preview = image; - - // Ignore if disabled. - if (!this.enabled || (this.display.length === 0)) { - return; - } - - // If the preview element exists. - if (this.elements.preview) { - - // If there is a preview to show... - if (this.options.preview) { - - // Say that this has a preview. - this.elements.preview.addClass('has-preview').show(); - - // Create a new preview image. - this.preview = new minplayer.image(this.elements.preview, this.options); - - // Create the image. - this.preview.load(this.options.preview); - return true; - } - else { - - // Hide the preview. - this.elements.preview.hide(); - } - } - - return false; -}; - -/** - * Hide or show certain elements based on the state of the busy and big play - * button. - */ -minplayer.playLoader.prototype.checkVisibility = function() { - - // Ignore if disabled. - if (!this.enabled) { - return; - } - - // Hide or show the busy cursor based on the flags. - if (this.busy.flag) { - this.elements.busy.show(); - } - else { - this.elements.busy.hide(); - } - - // Hide or show the big play button based on the flags. - if (this.bigPlay.flag) { - this.elements.bigPlay.show(); - } - else { - this.elements.bigPlay.hide(); - } - - if (this.previewFlag.flag) { - this.elements.preview.show(); - } - else { - this.elements.preview.hide(); - } - - // Show the control either flag is set. - if (this.bigPlay.flag || this.busy.flag || this.previewFlag.flag) { - this.display.show(); - } - - // Hide the whole control if both flags are 0. - if (!this.bigPlay.flag && !this.busy.flag && !this.previewFlag.flag) { - this.display.hide(); - } -}; -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** All the media player implementations */ -minplayer.players = minplayer.players || {}; - -/** - * @constructor - * @extends minplayer.display - * @class The base media player class where all media players derive from. - * - * @param {object} context The jQuery context. - * @param {object} options This components options. - * @param {object} queue The event queue to pass events around. - */ -minplayer.players.base = function(context, options, queue) { - - // Derive from display - minplayer.display.call(this, 'media', context, options, queue); -}; - -/** Derive from minplayer.display. */ -minplayer.players.base.prototype = new minplayer.display(); - -/** Reset the constructor. */ -minplayer.players.base.prototype.constructor = minplayer.players.base; - -/** - * @see minplayer.display.getElements - * @this minplayer.players.base - * @return {object} The elements for this display. - */ -minplayer.players.base.prototype.getElements = function() { - var elements = minplayer.display.prototype.getElements.call(this); - return jQuery.extend(elements, { - media: this.options.mediaelement - }); -}; - - -/** - * Get the default options for this plugin. - * - * @param {object} options The default options for this plugin. - */ -minplayer.players.base.prototype.defaultOptions = function(options) { - options.range = {min: 0, max: 0}; - minplayer.display.prototype.defaultOptions.call(this, options); -}; - -/** - * Get the priority of this media player. - * - * @param {object} file A {@link minplayer.file} object. - * @return {number} The priority of this media player. - */ -minplayer.players.base.getPriority = function(file) { - return 0; -}; - -/** - * Returns the ID for the media being played. - * - * @param {object} file A {@link minplayer.file} object. - * @return {string} The ID for the provided media. - */ -minplayer.players.base.getMediaId = function(file) { - return ''; -}; - -/** - * Determine if we can play the media file. - * - * @param {object} file A {@link minplayer.file} object. - * @return {boolean} If this player can play this media type. - */ -minplayer.players.base.canPlay = function(file) { - return false; -}; - -/** - * @see minplayer.plugin.construct - * @this minplayer.players.base - */ -minplayer.players.base.prototype.construct = function() { - - // Call the media display constructor. - minplayer.display.prototype.construct.call(this); - - // Set the poster if it exists. - if (this.elements.media) { - this.poster = this.elements.media.attr('poster'); - } - - // Set the plugin name within the options. - this.options.pluginName = 'basePlayer'; - - /** The ready queue for this player. */ - this.readyQueue = []; - this.loadedQueue = []; - - /** The currently loaded media file. */ - this.mediaFile = this.options.file; - - // Clear the media player. - this.clear(); - - // Now setup the media player. - this.setupPlayer(); -}; - -/** - * Sets up a new media player. - */ -minplayer.players.base.prototype.setupPlayer = function() { - - // Get the player display object. - if (!this.playerFound()) { - - // Add the new player. - this.addPlayer(); - } - - // Get the player object... - this.player = this.getPlayer(); - - // Toggle playing if they click. - minplayer.click(this.display, (function(player) { - return function() { - if (player.playing) { - player.pause(); - } - else { - player.play(); - } - }; - })(this)); - - // Bind to key events... - jQuery(document).bind('keydown', (function(player) { - return function(event) { - if (player.hasFocus) { - event.preventDefault(); - switch (event.keyCode) { - case 32: // SPACE - case 179: // GOOGLE play/pause button. - if (player.playing) { - player.pause(); - } - else { - player.play(); - } - break; - case 38: // UP - player.setVolumeRelative(0.1); - break; - case 40: // DOWN - player.setVolumeRelative(-0.1); - break; - case 37: // LEFT - case 227: // GOOGLE TV REW - player.seekRelative(-0.05); - break; - case 39: // RIGHT - case 228: // GOOGLE TV FW - player.seekRelative(0.05); - break; - } - } - }; - })(this)); -}; - -/** - * Adds the media player. - */ -minplayer.players.base.prototype.addPlayer = function() { - - // Remove the media element if found - if (this.elements.media) { - this.elements.media.remove(); - } - - // Create a new media player element. - this.elements.media = jQuery(this.createPlayer()); - this.display.html(this.elements.media); -}; - -/** - * @see minplayer.plugin.destroy. - */ -minplayer.players.base.prototype.destroy = function() { - minplayer.plugin.prototype.destroy.call(this); - this.clear(); -}; - -/** - * Clears the media player. - */ -minplayer.players.base.prototype.clear = function() { - - // Reset the ready flag. - this.playerReady = false; - - // Reset the player. - this.reset(); - - // If the player exists, then unbind all events. - if (this.player) { - jQuery(this.player).remove(); - this.player = null; - } -}; - -/** - * Resets all variables. - */ -minplayer.players.base.prototype.reset = function() { - - // The duration of the player. - this.realDuration = 0; - this.duration = new minplayer.async(); - - // The current play time of the player. - this.currentTime = new minplayer.async(); - - // The amount of bytes loaded in the player. - this.bytesLoaded = new minplayer.async(); - - // The total amount of bytes for the media. - this.bytesTotal = new minplayer.async(); - - // The bytes that the download started with. - this.bytesStart = new minplayer.async(); - - // The current volume of the player. - this.volume = new minplayer.async(); - - // Reset focus. - this.hasFocus = false; - - // We are not playing. - this.playing = false; - - // We are not loading. - this.loading = false; - - // If we are loaded. - this.loaded = false; - - // Tell everyone else we reset. - this.trigger('pause', null, true); - this.trigger('waiting', null, true); - this.trigger('progress', {loaded: 0, total: 0, start: 0}, true); - this.trigger('timeupdate', {currentTime: 0, duration: 0}, true); -}; - -/** - * Called when the player is ready to recieve events and commands. - */ -minplayer.players.base.prototype.onReady = function() { - - // Only continue if we are not already ready. - if (this.playerReady) { - return; - } - - // Set the start and stop of the player. - this.setStartStop(); - - // Set the ready flag. - this.playerReady = true; - - // Set the volume to the default. - this.setVolume(this.options.volume / 100); - - // Setup the progress interval. - this.loading = true; - - // Create a poll to get the progress. - this.poll('progress', (function(player) { - return function() { - - // Only do this if the play interval is set. - if (player.loading) { - - // Get the bytes loaded asynchronously. - player.getBytesLoaded(function(bytesLoaded) { - - // Get the bytes total asynchronously. - player.getBytesTotal(function(bytesTotal) { - - // Trigger an event about the progress. - if (bytesLoaded || bytesTotal) { - - // Get the bytes start, but don't require it. - var bytesStart = 0; - player.getBytesStart(function(val) { - bytesStart = val; - }); - - // Trigger a progress event. - player.trigger('progress', { - loaded: bytesLoaded, - total: bytesTotal, - start: bytesStart - }); - - // Say we are not longer loading if they are equal. - if (bytesLoaded >= bytesTotal) { - player.loading = false; - } - } - }); - }); - } - - // Keep polling as long as its loading... - return player.loading; - }; - })(this), 1000); - - // We are now ready. - this.ready(); - - // Make sure the player is ready or errors will occur. - if (this.isReady()) { - - // Iterate through our ready queue. - for (var i in this.readyQueue) { - this.readyQueue[i].call(this); - } - - // Empty the ready queue. - this.readyQueue.length = 0; - this.readyQueue = []; - - if (!this.loaded) { - - // If we are still loading, then trigger that the load has started. - this.trigger('loadstart'); - } - } - else { - - // Empty the ready queue. - this.readyQueue.length = 0; - this.readyQueue = []; - } -}; - -/** - * Parses a time value into seconds. - * - * @param string time - * The time to parse to seconds. - * - * @returns {number} - * The number of seconds this time represents. - */ -minplayer.players.base.prototype.parseTime = function(time) { - var seconds = 0, minutes = 0, hours = 0; - - if (!time) { - return 0; - } - - // Convert to string if we need to. - if (typeof time != 'string') { - time = String(time); - } - - // Get the seconds. - seconds = time.match(/([0-9]+)s/i); - if (seconds) { - seconds = parseInt(seconds[1], 10); - } - - // Get the minutes. - minutes = time.match(/([0-9]+)m/i); - if (minutes) { - seconds += (parseInt(minutes[1], 10) * 60); - } - - // Get the hours. - hours = time.match(/([0-9]+)h/i); - if (hours) { - seconds += (parseInt(hours[1], 10) * 3600); - } - - // If no seconds were found, then just use the raw value. - if (!seconds) { - seconds = time; - } - - // Return the seconds from the time. - return Number(seconds); -}; - -/** - * Sets the start and stop points for the media. - * - * @return {number} The number of seconds we should seek. - */ -minplayer.players.base.prototype.setStartStop = function() { - if (this.startTime) { - return this.startTime; - } - - this.startTime = 0; - this.offsetTime = this.parseTime(this.options.range.min); - - // First check the url for the seek time. - if (minplayer.urlVars) { - this.startTime = this.parseTime(minplayer.urlVars.seek); - } - - // Then check the options range parameter. - if (!this.startTime) { - this.startTime = this.offsetTime; - } - - // Get the stop time. - this.stopTime = this.options.range.max ? this.parseTime(this.options.range.max) : 0; - - // Calculate the range. - this.mediaRange = this.stopTime - this.offsetTime; - if (this.mediaRange < 0) { - this.mediaRange = 0; - } - - // Return the start time. - return this.startTime; -}; - -/** - * Should be called when the media is playing. - */ -minplayer.players.base.prototype.onPlaying = function() { - - // See if we need to autoseek. - if (!this.playing) { - var self = this; - this.getDuration(function(duration) { - if (self.startTime && (self.startTime < duration)) { - self.seek(self.startTime, null, true); - if (self.options.autoplay) { - self.play(); - } - } - }); - } - - // Trigger an event that we are playing. - this.trigger('playing'); - - // Say that this player has focus. - this.hasFocus = true; - - // Set the playInterval to true. - this.playing = true; - this.loaded = true; - - // Create a poll to get the timeupate. - this.poll('timeupdate', (function(player) { - return function() { - - // Only do this if the play interval is set. - if (player.playing) { - - // Get the current time asyncrhonously. - player.getCurrentTime(function(currentTime) { - - // Get the duration asynchronously. - player.getDuration(function(duration) { - - // Convert these to floats. - currentTime = parseFloat(currentTime); - duration = parseFloat(duration); - - // Trigger an event about the progress. - if (currentTime || duration) { - - // Trigger an update event. - player.trigger('timeupdate', { - currentTime: currentTime, - duration: duration - }); - } - }); - }); - } - - // Keep polling as long as it is playing. - return player.playing; - }; - })(this), 500); -}; - -/** - * Should be called when the media is paused. - */ -minplayer.players.base.prototype.onPaused = function() { - - // Trigger an event that we are paused. - this.trigger('pause'); - - // Remove focus. - this.hasFocus = false; - - // Say we are not playing. - this.playing = false; -}; - -/** - * Should be called when the media is complete. - */ -minplayer.players.base.prototype.onComplete = function() { - if (this.playing) { - this.onPaused(); - } - - // Stop the intervals. - this.playing = false; - this.loading = false; - this.hasFocus = false; - this.trigger('ended'); -}; - -/** - * Should be called when the media is done loading. - */ -minplayer.players.base.prototype.onLoaded = function() { - - // See if we are loaded. - var isLoaded = this.loaded; - - // Iterate through our ready queue. - for (var i in this.loadedQueue) { - this.loadedQueue[i].call(this); - } - - // Empty the loaded queue. - this.loadedQueue.length = 0; - this.loadedQueue = []; - - // If we should autoplay, then just play now. - if (!this.loaded && this.options.autoplay) { - this.play(); - } - - // We are now loaded. - this.loaded = true; - - // Trigger this event. - this.trigger('loadeddata'); -}; - -/** - * Should be called when the player is waiting. - */ -minplayer.players.base.prototype.onWaiting = function() { - this.trigger('waiting'); -}; - -/** - * Called when an error occurs. - * - * @param {string} errorCode The error that was triggered. - */ -minplayer.players.base.prototype.onError = function(errorCode) { - this.hasFocus = false; - this.trigger('error', errorCode); -}; - -/** - * @see minplayer.players.base#isReady - * @return {boolean} Checks to see if the Flash is ready. - */ -minplayer.players.base.prototype.isReady = function() { - - // Return that the player is set and the ready flag is good. - return (this.player && this.playerReady); -}; - -/** - * Calls the callback when this player is ready. - * - * @param {function} callback Called when it is done performing this operation. - */ -minplayer.players.base.prototype.whenReady = function(callback) { - - // If the player is ready, then call the callback. - if (this.isReady()) { - callback.call(this); - } - else { - - // Add this to the ready queue. - this.readyQueue.push(callback); - } -}; - -/** - * Calls the callback when this player is loaded. - * - * @param {function} callback Called when it is done performing this operation. - */ -minplayer.players.base.prototype.whenLoaded = function(callback) { - - // If the player is loaded, then call the callback. - if (this.loaded) { - callback.call(this); - } - else { - - // Add this to the loaded queue. - this.loadedQueue.push(callback); - } -}; - -/** - * Determines if the player should show the playloader. - * - * @param {string} preview The preview image. - * @return {bool} If this player implements its own playLoader. - */ -minplayer.players.base.prototype.hasPlayLoader = function(preview) { - return false; -}; - -/** - * Determines if the player should show the controller. - * - * @return {bool} If this player implements its own controller. - */ -minplayer.players.base.prototype.hasController = function() { - return false; -}; - -/** - * Returns if the media player is already within the DOM. - * - * @return {boolean} TRUE - if the player is in the DOM, FALSE otherwise. - */ -minplayer.players.base.prototype.playerFound = function() { - return false; -}; - -/** - * Creates the media player and inserts it in the DOM. - * - * @return {object} The media player entity. - */ -minplayer.players.base.prototype.createPlayer = function() { - this.reset(); - return null; -}; - -/** - * Returns the media player object. - * - * @return {object} The media player object. - */ -minplayer.players.base.prototype.getPlayer = function() { - return this.player; -}; - -/** - * Loads a new media player. - * - * @param {object} file A {@link minplayer.file} object. - * @param {function} callback Called when it is done performing this operation. - */ -minplayer.players.base.prototype.load = function(file, callback) { - - // Store the media file for future lookup. - var isString = (typeof this.mediaFile === 'string'); - var path = isString ? this.mediaFile : this.mediaFile.path; - if (file && (file.path !== path)) { - - // If the player is not ready, then setup. - if (!this.isReady()) { - this.setupPlayer(); - } - - // Reset the media and set the media file. - this.reset(); - this.mediaFile = file; - if (callback) { - callback.call(this); - } - } - - // We still want to play the song if it isn't playing but has autoplay enabled. - else if (this.options.autoplay && !this.playing) { - this.play(); - } - else { - - // Seek to the beginning. - this.seek(0, function() { - this.pause(); - this.trigger('progress', {loaded: 0, total: 0, start: 0}, true); - this.trigger('timeupdate', {currentTime: 0, duration: 0}, true); - }); - } -}; - -/** - * Play the loaded media file. - * - * @param {function} callback Called when it is done performing this operation. - */ -minplayer.players.base.prototype.play = function(callback) { - this.options.autoload = true; - if (typeof this.options.originalAutoPlay == 'undefined') { - this.options.originalAutoPlay = this.options.autoplay; - } - this.options.autoplay = true; - this.whenLoaded(callback); -}; - -/** - * Pause the loaded media file. - * - * @param {function} callback Called when it is done performing this operation. - */ -minplayer.players.base.prototype.pause = function(callback) { - this.whenLoaded(callback); -}; - -/** - * Stop the loaded media file. - * - * @param {function} callback Called when it is done performing this operation. - */ -minplayer.players.base.prototype.stop = function(callback) { - this.playing = false; - this.loading = false; - this.hasFocus = false; - this.whenLoaded(callback); -}; - -/** - * Seeks to relative position. - * - * @param {number} pos Relative position. -1 to 1 (percent), > 1 (seconds). - */ -minplayer.players.base.prototype.seekRelative = function(pos) { - - // Get the current time asyncrhonously. - this.getCurrentTime((function(player) { - return function(currentTime) { - - // Get the duration asynchronously. - player.getDuration(function(duration) { - - // Only do this if we have a duration. - if (duration) { - - // Get the position. - var seekPos = 0; - if ((pos > -1) && (pos < 1)) { - seekPos = ((currentTime / duration) + parseFloat(pos)) * duration; - } - else { - seekPos = (currentTime + parseFloat(pos)); - } - - // Set the seek value. - player.seek(seekPos); - } - }); - }; - })(this)); -}; - -/** - * Seek the loaded media. - * - * @param {number} pos The position to seek the minplayer. 0 to 1. - * @param {function} callback Called when it is done performing this operation. - */ -minplayer.players.base.prototype.seek = function(pos, callback, noOffset) { - this.whenLoaded(function() { - pos = Number(pos); - if (!noOffset) { - pos += this.offsetTime; - } - this._seek(pos); - if (callback) { - callback.call(this); - } - }); -}; - -minplayer.players.base.prototype._seek = function(pos) {}; - -/** - * Set the volume of the loaded minplayer. - * - * @param {number} vol -1 to 1 - The relative amount to increase or decrease. - */ -minplayer.players.base.prototype.setVolumeRelative = function(vol) { - - // Get the volume - this.getVolume((function(player) { - return function(newVol) { - newVol += parseFloat(vol); - newVol = (newVol < 0) ? 0 : newVol; - newVol = (newVol > 1) ? 1 : newVol; - player.setVolume(newVol); - }; - })(this)); -}; - -/** - * Set the volume of the loaded minplayer. - * - * @param {number} vol The volume to set the media. 0 to 1. - * @param {function} callback Called when it is done performing this operation. - */ -minplayer.players.base.prototype.setVolume = function(vol, callback) { - this.trigger('volumeupdate', vol); - this.whenLoaded(callback); -}; - -/** - * Gets a value from the player. - * - * @param {string} getter The getter method on the player. - * @param {string} prop The property to use when getting. - * @param {function} callback The callback function. - */ -minplayer.players.base.prototype.getValue = function(method, prop, callback) { - this.whenLoaded(function() { - var self = this; - this[method](function(value) { - if (value !== null) { - callback.call(self, value); - } - else { - self[prop].get(callback); - } - }); - }); -}; - -/** - * Get the volume from the loaded media. - * - * @param {function} callback Called when the volume is determined. - * @return {number} The volume of the media; 0 to 1. - */ -minplayer.players.base.prototype.getVolume = function(callback) { - this.getValue('_getVolume', 'volume', callback); -}; - -/** - * Implemented by the players to get the current time. - * - * @param callback - * @private - */ -minplayer.players.base.prototype._getVolume = function(callback) { - callback(null); -}; - -/** - * Get the current time for the media being played. - * - * @param {function} callback Called when the time is determined. - * @return {number} The volume of the media; 0 to 1. - */ -minplayer.players.base.prototype.getCurrentTime = function(callback) { - var self = this; - this.getValue('_getCurrentTime', 'currentTime', function(currentTime) { - self.setStartStop(); - if (self.stopTime && (currentTime > self.stopTime)) { - self.stop(function() { - self.onComplete(); - }); - } - currentTime -= self.offsetTime; - callback(currentTime); - }); -}; - -/** - * Implemented by the players to get the current time. - * - * @param callback - * @private - */ -minplayer.players.base.prototype._getCurrentTime = function(callback) { - callback(null); -}; - -/** - * Return the duration of the loaded media. - * - * @param {function} callback Called when the duration is determined. - * @return {number} The duration of the loaded media. - */ -minplayer.players.base.prototype.getDuration = function(callback) { - if (this.options.duration) { - callback(this.options.duration); - } - else { - var self = this; - this.getValue('_getDuration', 'duration', function(duration) { - self.setStartStop(); - self.realDuration = duration; - callback(self.mediaRange ? self.mediaRange : duration); - }); - } -}; - -/** - * Implemented by the players to get the duration. - * - * @param callback - * @private - */ -minplayer.players.base.prototype._getDuration = function(callback) { - callback(null); -}; - -/** - * Return the start bytes for the loaded media. - * - * @param {function} callback Called when the start bytes is determined. - * @return {int} The bytes that were started. - */ -minplayer.players.base.prototype.getBytesStart = function(callback) { - this.getValue('_getBytesStart', 'bytesStart', callback); -}; - -/** - * Implemented by the players to get the start bytes. - * - * @param callback - * @private - */ -minplayer.players.base.prototype._getBytesStart = function(callback) { - callback(null); -}; - -/** - * Return the bytes of media loaded. - * - * @param {function} callback Called when the bytes loaded is determined. - * @return {int} The amount of bytes loaded. - */ -minplayer.players.base.prototype.getBytesLoaded = function(callback) { - this.getValue('_getBytesLoaded', 'bytesLoaded', callback); -}; - -/** - * Implemented by the players to get the loaded bytes. - * - * @param callback - * @private - */ -minplayer.players.base.prototype._getBytesLoaded = function(callback) { - callback(null); -}; - -/** - * Return the total amount of bytes. - * - * @param {function} callback Called when the bytes total is determined. - * @return {int} The total amount of bytes for this media. - */ -minplayer.players.base.prototype.getBytesTotal = function(callback) { - this.getValue('_getBytesTotal', 'bytesTotal', callback); -}; - -/** - * Implemented by the players to get the total bytes. - * - * @param callback - * @private - */ -minplayer.players.base.prototype._getBytesTotal = function(callback) { - callback(null); -}; -/*jshint maxlen:90 */ - -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** All the media player implementations */ -minplayer.players = minplayer.players || {}; - -/** - * @constructor - * @extends minplayer.players.base - * @class The Dailymotion media player. - * - * @param {object} context The jQuery context. - * @param {object} options This components options. - * @param {object} queue The event queue to pass events around. - */ -minplayer.players.dailymotion = function(context, options, queue) { - - /** The quality of the Dailymotion stream. */ - this.quality = 'default'; - - // Derive from players base. - minplayer.players.base.call(this, context, options, queue); -}; - -/** Derive from minplayer.players.base. */ -minplayer.players.dailymotion.prototype = new minplayer.players.base(); - -/** Reset the constructor. */ -minplayer.players.dailymotion.prototype.constructor = minplayer.players.dailymotion; - -/** - * @see minplayer.plugin.construct - * @this minplayer.players.dailymotion - */ -minplayer.players.dailymotion.prototype.construct = function() { - - // Call the players.flash constructor. - minplayer.players.base.prototype.construct.call(this); - - // Set the plugin name within the options. - this.options.pluginName = 'dailymotion'; -}; - -/** - * @see minplayer.players.base#getPriority - * @param {object} file A {@link minplayer.file} object. - * @return {number} The priority of this media player. - */ -minplayer.players.dailymotion.getPriority = function(file) { - return 10; -}; - -/** - * @see minplayer.players.base#canPlay - * - * @param {object} file A {@link minplayer.file} object. - * @return {boolean} If this player can play this media type. - */ -minplayer.players.dailymotion.canPlay = function(file) { - - // Check for the mimetype for dailymotion. - if (file.mimetype === 'video/dailymotion') { - return true; - } - - // If the path is a Dailymotion path, then return true. - var regex = /^http(s)?\:\/\/(www\.)?(dailymotion\.com)/i; - return (file.path.search(regex) === 0); -}; - -/** - * Return the ID for a provided media file. - * - * @param {object} file A {@link minplayer.file} object. - * @return {string} The ID for the provided media. - */ -minplayer.players.dailymotion.getMediaId = function(file) { - var regex = '^http[s]?\\:\\/\\/(www\\.)?'; - regex += '(dailymotion\\.com\\/video/)'; - regex += '([a-z0-9\\-]+)'; - regex += '_*'; - var reg = RegExp(regex, 'i'); - - // Locate the media id. - if (file.path.search(reg) === 0) { - return file.path.match(reg)[3]; - } - else { - return file.path; - } -}; - -/** - * Returns a preview image for this media player. - * - * @param {object} file A {@link minplayer.file} object. - * @param {string} type The type of image. - * @param {function} callback Called when the image is retrieved. - */ -minplayer.players.dailymotion.getImage = function(file, type, callback) { - callback('http://www.dailymotion.com/thumbnail/video/' + file.id); -}; - -/** - * Parse a single playlist node. - * - * @param {object} item The dailymotion item. - * @return {object} The mediafront node. - */ -minplayer.players.dailymotion.parseNode = function(item) { - return { - title: node.title, - description: node.description, - mediafiles: { - image: { - 'thumbnail': { - path: node.thumbnail_small_url - }, - 'image': { - path: node.thumbnail_url - } - }, - media: { - 'media': { - player: 'dailymotion', - id: node.id - } - } - } - }; -}; - -/** - * Returns information about this dailymotion video. - * - * @param {object} file The file to load. - * @param {function} callback Called when the node is loaded. - */ -minplayer.players.dailymotion.getNode = function(file, callback) { - - var url = 'https://api.dailymotion.com/video/' + file.id; - url += '?fields=title,id,description,thumbnail_small_url,thumbnail_url'; - jQuery.get(url, function(data) { - callback(minplayer.players.dailymotion.parseNode(data.data)); - }, 'jsonp'); -}; - -/** - * Called when an API is loaded and ready. - * - * @param {string} event The onReady event that was triggered. - */ -minplayer.players.dailymotion.prototype.onReady = function(event) { - minplayer.players.base.prototype.onReady.call(this); - if (!this.options.autoplay) { - this.pause(); - } - this.onLoaded(); -}; - -/** - * Checks to see if this player can be found. - * @return {bool} TRUE - Player is found, FALSE - otherwise. - */ -minplayer.players.dailymotion.prototype.playerFound = function() { - return (this.display.find(this.mediaFile.type).length > 0); -}; - -/** - * Called when the player quality changes. - * - * @param {string} newQuality The new quality for the change. - */ -minplayer.players.dailymotion.prototype.onQualityChange = function(newQuality) { - this.quality = newQuality.data; -}; - -/** - * Determines if the player should show the playloader. - * - * @param {string} preview The preview image. - * @return {bool} If this player implements its own playLoader. - */ -minplayer.players.dailymotion.prototype.hasPlayLoader = function(preview) { - return minplayer.hasTouch || !preview; -}; - -/** - * Determines if the player should show the controller. - * - * @return {bool} If this player implements its own playLoader. - */ -minplayer.players.dailymotion.prototype.hasController = function() { - return minplayer.isIDevice; -}; - -/** - * @see minplayer.players.base#create - * @return {object} The media player entity. - */ -minplayer.players.dailymotion.prototype.createPlayer = function() { - minplayer.players.base.prototype.createPlayer.call(this); - - // Insert the Dailymotion iframe API player. - var dailymotion_script = document.location.protocol; - dailymotion_script += '//api.dmcdn.net/all.js'; - if (jQuery('script[src="' + dailymotion_script + '"]').length === 0) { - var tag = document.createElement('script'); - tag.src = dailymotion_script; - var firstScriptTag = document.getElementsByTagName('script')[0]; - firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); - } - - // Get the player ID. - this.playerId = this.options.id + '-player'; - - // Poll until the Dailymotion API is ready. - this.poll(this.options.id + '_dailymotion', (function(player) { - return function() { - var ready = jQuery('#' + player.playerId).length > 0; - ready = ready && ('DM' in window); - ready = ready && (typeof DM.player === 'function'); - if (ready) { - // Determine the origin of this script. - jQuery('#' + player.playerId).addClass('dailymotion-player'); - - var params = {}; - params = { - id: player.playerId, - api: minplayer.isIDevice ? 0 : 1, - wmode: 'opaque', - controls: minplayer.isAndroid ? 1 : 0, - related: 0, - info: 0, - logo: 0 - }; - - - // Create the player. - player.player = new DM.player(player.playerId, { - video: player.mediaFile.id, - height: '100%', - width: '100%', - frameborder: 0, - params: params - }); - - player.player.addEventListener('apiready', function() { - player.onReady(player); - }); - player.player.addEventListener('ended', function() { - player.onComplete(player); - }); - player.player.addEventListener('playing', function() { - player.onPlaying(player); - }); - player.player.addEventListener('progress', function() { - player.onWaiting(player); - }); - player.player.addEventListener('pause', function() { - player.onPaused(player); - }); - player.player.addEventListener('error', function() { - player.onError(player); - }); - } - return !ready; - }; - })(this), 200); - - // Return the player. - return jQuery(document.createElement('div')).attr({ - id: this.playerId - }); -}; - -/** - * @see minplayer.players.base#load - */ -minplayer.players.dailymotion.prototype.load = function(file, callback) { - minplayer.players.base.prototype.load.call(this, file, function() { - this.player.load(file.id); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#play - */ -minplayer.players.dailymotion.prototype.play = function(callback) { - minplayer.players.base.prototype.play.call(this, function() { - this.onWaiting(); - this.player.play(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#pause - */ -minplayer.players.dailymotion.prototype.pause = function(callback) { - minplayer.players.base.prototype.pause.call(this, function() { - if (this.loaded) { - this.player.pause(); - if (callback) { - callback.call(this); - } - } - }); -}; - -/** - * @see minplayer.players.base#stop - */ -minplayer.players.dailymotion.prototype.stop = function(callback) { - minplayer.players.base.prototype.stop.call(this, function() { - this.player.pause(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#_seek - */ -minplayer.players.dailymotion.prototype._seek = function(pos) { - this.onWaiting(); - this.player.seek(pos); -}; - -/** - * @see minplayer.players.base#setVolume - */ -minplayer.players.dailymotion.prototype.setVolume = function(vol, callback) { - minplayer.players.base.prototype.setVolume.call(this, vol, function() { - if (this.loaded) { - this.player.setVolume(vol); - if (callback !== undefined) { - callback.call(this); - } - } - }); - -}; - -/** - * @see minplayer.players.base#_getVolume - */ -minplayer.players.dailymotion.prototype._getVolume = function(callback) { - callback(this.player.volume); -}; - -/** - * @see minplayer.players.base#_getDuration. - */ -minplayer.players.dailymotion.prototype._getDuration = function(callback) { - callback(this.player.duration); -}; - -/** - * @see minplayer.players.base#_getCurrentTime - */ -minplayer.players.dailymotion.prototype._getCurrentTime = function(callback) { - callback(this.player.currentTime); -}; -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** All the media player implementations */ -minplayer.players = minplayer.players || {}; - -/** - * @constructor - * @extends minplayer.display - * @class The HTML5 media player implementation. - * - * @param {object} context The jQuery context. - * @param {object} options This components options. - * @param {object} queue The event queue to pass events around. - */ -minplayer.players.html5 = function(context, options, queue) { - - // Derive players base. - minplayer.players.base.call(this, context, options, queue); -}; - -/** Derive from minplayer.players.base. */ -minplayer.players.html5.prototype = new minplayer.players.base(); - -/** Reset the constructor. */ -minplayer.players.html5.prototype.constructor = minplayer.players.html5; - -/** - * @see minplayer.players.base#getPriority - * @param {object} file A {@link minplayer.file} object. - * @return {number} The priority of this media player. - */ -minplayer.players.html5.getPriority = function(file) { - return 10; -}; - -/** - * @see minplayer.players.base#canPlay - * - * @param {object} file A {@link minplayer.file} object. - * @return {boolean} If this player can play this media type. - */ -minplayer.players.html5.canPlay = function(file) { - switch (file.mimetype) { - case 'video/ogg': - return !!minplayer.playTypes.videoOGG; - case 'video/mp4': - case 'video/x-mp4': - case 'video/m4v': - case 'video/x-m4v': - return !!minplayer.playTypes.videoH264; - case 'application/vnd.apple.mpegurl': - return !!minplayer.playTypes.videoMPEGURL; - case 'video/x-webm': - case 'video/webm': - case 'application/octet-stream': - return !!minplayer.playTypes.videoWEBM; - case 'audio/ogg': - return !!minplayer.playTypes.audioOGG; - case 'audio/mpeg': - return !!minplayer.playTypes.audioMP3; - case 'audio/mp4': - return !!minplayer.playTypes.audioMP4; - default: - return false; - } -}; - -/** - * @see minplayer.plugin.construct - */ -minplayer.players.html5.prototype.construct = function() { - - // Call base constructor. - minplayer.players.base.prototype.construct.call(this); - - // Set the plugin name within the options. - this.options.pluginName = 'html5'; - - // See when the player has ended. - this.hasEnded = false; - - // Add the player events. - this.addPlayerEvents(); -}; - -/** - * Adds a new player event. - * - * @param {string} type The type of event being fired. - * @param {function} callback Called when the event is fired. - */ -minplayer.players.html5.prototype.addPlayerEvent = function(type, callback) { - if (this.player) { - - // Add an event listener for this event type. - this.player.addEventListener(type, (function(player) { - - // Get the function name. - var func = type + 'Event'; - - // If the callback already exists, then remove it from the player. - if (player[func]) { - player.player.removeEventListener(type, player[func], false); - } - - // Create a new callback. - player[func] = function(event) { - callback.call(player, event); - }; - - // Return the callback. - return player[func]; - - })(this), false); - } -}; - -/** - * Add events. - * @return {boolean} If this action was performed. - */ -minplayer.players.html5.prototype.addPlayerEvents = function() { - - // Check if the player exists. - if (this.player) { - - this.addPlayerEvent('abort', function() { - this.trigger('abort'); - }); - this.addPlayerEvent('loadstart', function() { - this.onReady(); - if (!this.options.autoload) { - this.onLoaded(); - } - }); - this.addPlayerEvent('loadeddata', function() { - this.onLoaded(); - }); - this.addPlayerEvent('loadedmetadata', function() { - this.onLoaded(); - }); - this.addPlayerEvent('canplaythrough', function() { - this.onLoaded(); - }); - this.addPlayerEvent('ended', function() { - this.hasEnded = true; - this.onComplete(); - }); - this.addPlayerEvent('pause', function() { - this.onPaused(); - }); - this.addPlayerEvent('play', function() { - this.onPlaying(); - }); - this.addPlayerEvent('playing', function() { - this.onPlaying(); - }); - - var errorSent = false; - this.addPlayerEvent('error', function() { - if (!this.hasEnded && !errorSent && this.player) { - errorSent = true; - this.trigger('error', 'An error occured - ' + this.player.error.code); - } - }); - - this.addPlayerEvent('waiting', function() { - this.onWaiting(); - }); - this.addPlayerEvent('durationchange', function() { - if (this.player) { - this.duration.set(this.player.duration); - var self = this; - this.getDuration(function(duration) { - self.trigger('durationchange', {duration: duration}); - }); - } - }); - this.addPlayerEvent('progress', function(event) { - this.bytesTotal.set(event.total); - this.bytesLoaded.set(event.loaded); - }); - return true; - } - - return false; -}; - -/** - * @see minplayer.players.base#onReady - */ -minplayer.players.html5.prototype.onReady = function() { - minplayer.players.base.prototype.onReady.call(this); - - // Android just say we are loaded here. - if (minplayer.isAndroid) { - this.onLoaded(); - } - - // iOS devices are strange in that they don't autoload. - if (minplayer.isIDevice) { - setTimeout((function(player) { - return function() { - player.pause(); - player.onLoaded(); - }; - })(this), 1); - } -}; - -/** - * @see minplayer.players.base#playerFound - * @return {boolean} TRUE - if the player is in the DOM, FALSE otherwise. - */ -minplayer.players.html5.prototype.playerFound = function() { - return (this.display.find(this.mediaFile.type).length > 0); -}; - -/** - * @see minplayer.players.base#create - * @return {object} The media player entity. - */ -minplayer.players.html5.prototype.createPlayer = function() { - minplayer.players.base.prototype.createPlayer.call(this); - var element = jQuery(document.createElement(this.mediaFile.type)) - .attr(this.options.attributes) - .append( - jQuery(document.createElement('source')).attr({ - 'src': this.mediaFile.path - }) - ); - - // Fix the fluid width and height. - element.eq(0)[0].setAttribute('width', '100%'); - element.eq(0)[0].setAttribute('height', '100%'); - var option = this.options.autoload ? 'metadata' : 'none'; - option = minplayer.isIDevice ? 'metadata' : option; - element.eq(0)[0].setAttribute('preload', option); - - // Make sure that we trigger onReady if autoload is false. - if (!this.options.autoload) { - element.eq(0)[0].setAttribute('autobuffer', false); - } - - return element; -}; - -/** - * @see minplayer.players.base#getPlayer - * @return {object} The media player object. - */ -minplayer.players.html5.prototype.getPlayer = function() { - return this.elements.media.eq(0)[0]; -}; - -/** - * @see minplayer.players.base#load - * - * @param {object} file A {@link minplayer.file} object. - */ -minplayer.players.html5.prototype.load = function(file, callback) { - - // See if a load is even necessary. - minplayer.players.base.prototype.load.call(this, file, function() { - - // Reset the has ended flag. - this.hasEnded = false; - - // Get the current source. - var src = this.elements.media.attr('src'); - if (!src) { - src = jQuery('source', this.elements.media).eq(0).attr('src'); - } - - // Only swap out if the new file is different from the source. - if (src !== file.path) { - - // Add a new player. - this.addPlayer(); - - // Set the new player. - this.player = this.getPlayer(); - - // Add the events again. - this.addPlayerEvents(); - - // Change the source... - this.player.src = file.path; - if (callback) { - callback.call(this); - } - } - }); -}; - -/** - * @see minplayer.players.base#play - */ -minplayer.players.html5.prototype.play = function(callback) { - minplayer.players.base.prototype.play.call(this, function() { - this.player.play(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#pause - */ -minplayer.players.html5.prototype.pause = function(callback) { - minplayer.players.base.prototype.pause.call(this, function() { - this.player.pause(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#stop - */ -minplayer.players.html5.prototype.stop = function(callback) { - minplayer.players.base.prototype.stop.call(this, function() { - this.player.pause(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * Clears the media player. - */ -minplayer.players.html5.prototype.clear = function() { - minplayer.players.base.prototype.clear.call(this); - if (this.player) { - this.player.src = ''; - } -}; - -/** - * @see minplayer.players.base#_seek - */ -minplayer.players.html5.prototype._seek = function(pos) { - this.player.currentTime = pos; -}; - -/** - * @see minplayer.players.base#setVolume - */ -minplayer.players.html5.prototype.setVolume = function(vol, callback) { - minplayer.players.base.prototype.setVolume.call(this, vol, function() { - this.player.volume = vol; - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#getVolume - */ -minplayer.players.html5.prototype._getVolume = function(callback) { - callback(this.player.volume); -}; - -/** - * @see minplayer.players.base#_getDuration - */ -minplayer.players.html5.prototype._getDuration = function(callback) { - callback(this.player.duration); -}; - -/** - * @see minplayer.players.base#getCurrentTime - */ -minplayer.players.html5.prototype._getCurrentTime = function(callback) { - callback(this.player.currentTime); -}; - -/** - * @see minplayer.players.base#_getBytesLoaded - */ -minplayer.players.html5.prototype._getBytesLoaded = function(callback) { - var loaded = 0; - - // Check several different possibilities. - if (this.bytesLoaded.value) { - loaded = this.bytesLoaded.value; - } - else if (this.player.buffered && - this.player.buffered.length > 0 && - this.player.buffered.end && - this.player.duration) { - loaded = this.player.buffered.end(0); - } - else if (this.player.bytesTotal !== undefined && - this.player.bytesTotal > 0 && - this.player.bufferedBytes !== undefined) { - loaded = this.player.bufferedBytes; - } - - // Return the loaded amount. - callback(loaded); -}; - -/** - * @see minplayer.players.base#_getBytesTotal - */ -minplayer.players.html5.prototype._getBytesTotal = function(callback) { - var total = 0; - - // Check several different possibilities. - if (this.bytesTotal.value) { - total = this.bytesTotal.value; - } - else if (this.player.buffered && - this.player.buffered.length > 0 && - this.player.buffered.end && - this.player.duration) { - total = this.player.duration; - } - else if (this.player.bytesTotal !== undefined && - this.player.bytesTotal > 0 && - this.player.bufferedBytes !== undefined) { - total = this.player.bytesTotal; - } - - // Return the loaded amount. - callback(total); -}; -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** All the media player implementations */ -minplayer.players = minplayer.players || {}; - -/** - * @constructor - * @extends minplayer.display - * @class The Flash media player class to control the flash fallback. - * - * @param {object} context The jQuery context. - * @param {object} options This components options. - * @param {object} queue The event queue to pass events around. - */ -minplayer.players.flash = function(context, options, queue) { - - // Derive from players base. - minplayer.players.base.call(this, context, options, queue); -}; - -/** Derive from minplayer.players.base. */ -minplayer.players.flash.prototype = new minplayer.players.base(); - -/** Reset the constructor. */ -minplayer.players.flash.prototype.constructor = minplayer.players.flash; - -/** - * @see minplayer.plugin.construct - * @this minplayer.players.flash - */ -minplayer.players.flash.prototype.construct = function() { - - // Call the players.base constructor. - minplayer.players.base.prototype.construct.call(this); - - // Set the plugin name within the options. - this.options.pluginName = 'flash'; -}; - -/** - * @see minplayer.players.base#getPriority - * - * @param {object} file A {@link minplayer.file} object. - * @return {number} The priority of this media player. - */ -minplayer.players.flash.getPriority = function(file) { - return 0; -}; - -/** - * @see minplayer.players.base#canPlay - * - * @param {object} file A {@link minplayer.file} object. - * @return {boolean} If this player can play this media type. - */ -minplayer.players.flash.canPlay = function(file) { - return false; -}; - -/** - * API to return the Flash player code provided params. - * - * @param {object} params The params used to populate the Flash code. - * @return {object} A Flash DOM element. - */ -minplayer.players.flash.prototype.getFlash = function(params) { - // Insert the swfobject javascript. - var tag = document.createElement('script'); - tag.src = '//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js'; - var firstScriptTag = document.getElementsByTagName('script')[0]; - firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); - - // Create the swfobject. - setTimeout((function(player) { - return function tryAgain() { - if (typeof swfobject !== 'undefined') { - swfobject.embedSWF( - params.swf, - params.id, - params.width, - params.height, - '9.0.0', - false, - params.flashvars, - { - allowscriptaccess: 'always', - allowfullscreen: 'true', - wmode: params.wmode, - quality: 'high' - }, - { - id: params.id, - name: params.id, - playerType: 'flash' - }, - function(e) { - player.player = e.ref; - } - ); - } - else { - - // Try again after 200 ms. - setTimeout(tryAgain, 200); - } - }; - })(this), 200); - - // Return the div tag... - return '
'; -}; - -/** - * @see minplayer.players.base#playerFound - * @return {boolean} TRUE - if the player is in the DOM, FALSE otherwise. - */ -minplayer.players.flash.prototype.playerFound = function() { - return (this.display.find('object[playerType="flash"]').length > 0); -}; -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** All the media player implementations */ -minplayer.players = minplayer.players || {}; - -/** - * @constructor - * @extends minplayer.display - * @class The Flash media player class to control the flash fallback. - * - * @param {object} context The jQuery context. - * @param {object} options This components options. - * @param {object} queue The event queue to pass events around. - */ -minplayer.players.minplayer = function(context, options, queue) { - - // Derive from players flash. - minplayer.players.flash.call(this, context, options, queue); -}; - -/** Derive from minplayer.players.flash. */ -minplayer.players.minplayer.prototype = new minplayer.players.flash(); - -/** Reset the constructor. */ -minplayer.players.minplayer.prototype.constructor = minplayer.players.minplayer; - -/** - * @see minplayer.plugin.construct - * @this minplayer.players.minplayer - */ -minplayer.players.minplayer.prototype.construct = function() { - - // Call the players.flash constructor. - minplayer.players.flash.prototype.construct.call(this); - - // Set the plugin name within the options. - this.options.pluginName = 'minplayer'; -}; - -/** - * Called when the Flash player is ready. - * - * @param {string} id The media player ID. - */ -window.onFlashPlayerReady = function(id) { - var media = minplayer.get(id, 'media'); - var i = media.length; - while (i--) { - media[i].onReady(); - } -}; - -/** - * Called when the Flash player updates. - * - * @param {string} id The media player ID. - * @param {string} eventType The event type that was triggered. - */ -window.onFlashPlayerUpdate = function(id, eventType) { - var media = minplayer.get(id, 'media'); - var i = media.length; - while (i--) { - media[i].onMediaUpdate(eventType); - } -}; - -/** - * Used to debug from the Flash player to the browser console. - * - * @param {string} debug The debug string. - */ -window.onFlashPlayerDebug = function(debug) { - if (console && console.log) { - console.log(debug); - } -}; - -/** - * @see minplayer.players.base#getPriority - * @param {object} file A {@link minplayer.file} object. - * @return {number} The priority of this media player. - */ -minplayer.players.minplayer.getPriority = function(file) { - // Force this player if the stream is set. - return file.stream ? 100 : 1; -}; - -/** - * @see minplayer.players.base#canPlay - * - * @param {object} file A {@link minplayer.file} object. - * @return {boolean} If this player can play this media type. - */ -minplayer.players.minplayer.canPlay = function(file) { - - // If this has a stream, then the minplayer must play it. - if (file.stream) { - return true; - } - - var isWEBM = jQuery.inArray(file.mimetype, [ - 'video/x-webm', - 'video/webm', - 'application/octet-stream' - ]) >= 0; - return !isWEBM && (file.type === 'video' || file.type === 'audio'); -}; - -/** - * @see minplayer.players.base#create - * @return {object} The media player entity. - */ -minplayer.players.minplayer.prototype.createPlayer = function() { - - // Make sure we provide default swfplayer... - if (!this.options.swfplayer) { - this.options.swfplayer = 'http://mediafront.org/assets/osmplayer/minplayer'; - this.options.swfplayer += '/flash/minplayer.swf'; - } - - minplayer.players.flash.prototype.createPlayer.call(this); - - // The flash variables for this flash player. - var flashVars = { - 'id': this.options.id, - 'debug': this.options.debug, - 'config': 'nocontrols', - 'file': this.mediaFile.path, - 'autostart': this.options.autoplay, - 'autoload': this.options.autoload - }; - - // Add a stream if one is provided. - if (this.mediaFile.stream) { - flashVars.stream = this.mediaFile.stream; - } - - // Return a flash media player object. - return this.getFlash({ - swf: this.options.swfplayer, - id: this.options.id + '_player', - width: '100%', - height: '100%', - flashvars: flashVars, - wmode: this.options.wmode - }); -}; - -/** - * Called when the Flash player has an update. - * - * @param {string} eventType The event that was triggered in the player. - */ -minplayer.players.minplayer.prototype.onMediaUpdate = function(eventType) { - switch (eventType) { - case 'mediaMeta': - this.onLoaded(); - break; - case 'mediaConnected': - this.onLoaded(); - this.onPaused(); - break; - case 'mediaPlaying': - this.onPlaying(); - break; - case 'mediaPaused': - this.onPaused(); - break; - case 'mediaComplete': - this.onComplete(); - break; - } -}; - -/** - * Load the media in the minplayer. - * - * @param file - * @param callback - * @private - */ -minplayer.players.minplayer.prototype.load = function(file, callback) { - minplayer.players.flash.prototype.load.call(this, file, function() { - if (this.loaded) { - this.stop(function() { - this.player.loadMedia(file.path, file.stream); - if (callback) { - callback.call(this); - } - }); - } - else { - this.player.loadMedia(file.path, file.stream); - if (callback) { - callback.call(this); - } - } - }); -}; - -/** - * @see minplayer.players.base#play - */ -minplayer.players.minplayer.prototype.play = function(callback) { - minplayer.players.flash.prototype.play.call(this, function() { - this.player.playMedia(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#pause - */ -minplayer.players.minplayer.prototype.pause = function(callback) { - minplayer.players.flash.prototype.pause.call(this, function() { - this.player.pauseMedia(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#stop - */ -minplayer.players.minplayer.prototype.stop = function(callback) { - minplayer.players.flash.prototype.stop.call(this, function() { - this.player.stopMedia(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#_seek - */ -minplayer.players.minplayer.prototype._seek = function(pos) { - this.player.seekMedia(pos); -}; - -/** - * @see minplayer.players.base#setVolume - */ -minplayer.players.minplayer.prototype.setVolume = function(vol, callback) { - minplayer.players.flash.prototype.setVolume.call(this, vol, function() { - this.player.setVolume(vol); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#getVolume - */ -minplayer.players.minplayer.prototype._getVolume = function(callback) { - callback(this.player.getVolume()); -}; - -/** - * @see minplayer.players.flash#getDuration - */ -minplayer.players.minplayer.prototype._getDuration = function(callback) { - var self = this, duration = 0; - var tryDuration = function() { - duration = self.player.getDuration(); - if (duration) { - callback(duration); - } - else { - setTimeout(tryDuration, 1000); - } - }; - tryDuration(); -}; - -/** - * @see minplayer.players.base#getCurrentTime - */ -minplayer.players.minplayer.prototype._getCurrentTime = function(callback) { - callback(this.player.getCurrentTime()); -}; - -/** - * @see minplayer.players.base#_getBytesLoaded - */ -minplayer.players.minplayer.prototype._getBytesLoaded = function(callback) { - callback(this.player.getMediaBytesLoaded()); -}; - -/** - * @see minplayer.players.base#_getBytesTotal. - */ -minplayer.players.minplayer.prototype._getBytesTotal = function(callback) { - callback(this.player.getMediaBytesTotal()); -}; -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** All the media player implementations */ -minplayer.players = minplayer.players || {}; - -/** - * @constructor - * @extends minplayer.players.base - * @class The YouTube media player. - * - * @param {object} context The jQuery context. - * @param {object} options This components options. - * @param {object} queue The event queue to pass events around. - */ -minplayer.players.youtube = function(context, options, queue) { - - /** The quality of the YouTube stream. */ - this.quality = 'default'; - - // Derive from players base. - minplayer.players.base.call(this, context, options, queue); -}; - -/** Derive from minplayer.players.base. */ -minplayer.players.youtube.prototype = new minplayer.players.base(); - -/** Reset the constructor. */ -minplayer.players.youtube.prototype.constructor = minplayer.players.youtube; - -/** - * @see minplayer.plugin.construct - * @this minplayer.players.youtube - */ -minplayer.players.youtube.prototype.construct = function() { - - // Call the players.flash constructor. - minplayer.players.base.prototype.construct.call(this); - - // Set the plugin name within the options. - this.options.pluginName = 'youtube'; -}; - -/** - * @see minplayer.players.base#getPriority - * - * @param {object} file A {@link minplayer.file} object. - * @return {number} The priority of this media player. - */ -minplayer.players.youtube.getPriority = function(file) { - return 10; -}; - -/** - * @see minplayer.players.base#canPlay - * - * @param {object} file A {@link minplayer.file} object. - * @return {boolean} If this player can play this media type. - */ -minplayer.players.youtube.canPlay = function(file) { - - // Check for the mimetype for youtube. - if (file.mimetype === 'video/youtube') { - return true; - } - - // If the path is a YouTube path, then return true. - var regex = /^http(s)?\:\/\/(www\.)?(youtube\.com|youtu\.be)/i; - return (file.path.search(regex) === 0); -}; - -/** - * Return the ID for a provided media file. - * - * @param {object} file A {@link minplayer.file} object. - * @return {string} The ID for the provided media. - */ -minplayer.players.youtube.getMediaId = function(file) { - var regex = '^http[s]?\\:\\/\\/(www\\.)?'; - regex += '(youtube\\.com\\/watch\\?v=|youtu\\.be\\/)'; - regex += '([a-zA-Z0-9_\\-]+)'; - var reg = RegExp(regex, 'i'); - - // Locate the media id. - if (file.path.search(reg) === 0) { - return file.path.match(reg)[3]; - } - else { - return file.path; - } -}; - -/** - * Returns a preview image for this media player. - * - * @param {object} file A {@link minplayer.file} object. - * @param {string} type The type of image. - * @param {function} callback Called when the image is retrieved. - */ -minplayer.players.youtube.getImage = function(file, type, callback) { - type = (type === 'thumbnail') ? '1' : '0'; - callback('https://img.youtube.com/vi/' + file.id + '/' + type + '.jpg'); -}; - -/** - * Parse a single playlist node. - * - * @param {object} item The youtube item. - * @return {object} The mediafront node. - */ -minplayer.players.youtube.parseNode = function(item) { - var node = (typeof item.video !== 'undefined') ? item.video : item; - return { - title: node.title, - description: node.description, - mediafiles: { - image: { - 'thumbnail': { - path: node.thumbnail.sqDefault - }, - 'image': { - path: node.thumbnail.hqDefault - } - }, - media: { - 'media': { - player: 'youtube', - id: node.id - } - } - } - }; -}; - -/** - * Returns information about this youtube video. - * - * @param {object} file The file to load. - * @param {function} callback Called when the node is loaded. - */ -minplayer.players.youtube.getNode = function(file, callback) { - var url = 'https://gdata.youtube.com/feeds/api/videos/' + file.id; - url += '?v=2&alt=jsonc'; - jQuery.get(url, function(data) { - callback(minplayer.players.youtube.parseNode(data.data)); - }); -}; - -/** - * Translates the player state for the YouTube API player. - * - * @param {number} playerState The YouTube player state. - */ -minplayer.players.youtube.prototype.setPlayerState = function(playerState) { - switch (playerState) { - case YT.PlayerState.CUED: - break; - case YT.PlayerState.BUFFERING: - this.onWaiting(); - break; - case YT.PlayerState.PAUSED: - this.onPaused(); - break; - case YT.PlayerState.PLAYING: - this.onPlaying(); - break; - case YT.PlayerState.ENDED: - this.onComplete(); - break; - default: - break; - } -}; - -/** - * Called when an error occurs. - * - * @param {string} event The onReady event that was triggered. - */ -minplayer.players.youtube.prototype.onReady = function(event) { - minplayer.players.base.prototype.onReady.call(this); - if (!this.options.autoplay) { - this.pause(); - } - this.onLoaded(); -}; - -/** - * Checks to see if this player can be found. - * @return {bool} TRUE - Player is found, FALSE - otherwise. - */ -minplayer.players.youtube.prototype.playerFound = function() { - var id = 'iframe#' + this.options.id + '-player.youtube-player'; - var iframe = this.display.find(id); - return (iframe.length > 0); -}; - -/** - * Called when the player state changes. - * - * @param {object} event A JavaScript Event. - */ -minplayer.players.youtube.prototype.onPlayerStateChange = function(event) { - this.setPlayerState(event.data); -}; - -/** - * Called when the player quality changes. - * - * @param {string} newQuality The new quality for the change. - */ -minplayer.players.youtube.prototype.onQualityChange = function(newQuality) { - this.quality = newQuality.data; -}; - -/** - * Determines if the player should show the playloader. - * - * @param {string} preview The preview image. - * @return {bool} If this player implements its own playLoader. - */ -minplayer.players.youtube.prototype.hasPlayLoader = function(preview) { - return minplayer.hasTouch || !preview; -}; - -/** - * Determines if the player should show the controller. - * - * @return {bool} If this player implements its own playLoader. - */ -minplayer.players.youtube.prototype.hasController = function() { - return minplayer.isIDevice; -}; - -/** - * @see minplayer.players.base#create - * @return {object} The media player entity. - */ -minplayer.players.youtube.prototype.createPlayer = function() { - minplayer.players.base.prototype.createPlayer.call(this); - - // Insert the YouTube iframe API player. - var youtube_script = 'https://www.youtube.com/iframe_api'; - if (jQuery('script[src="' + youtube_script + '"]').length === 0) { - var tag = document.createElement('script'); - tag.src = youtube_script; - var firstScriptTag = document.getElementsByTagName('script')[0]; - firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); - } - - // Get the player ID. - this.playerId = this.options.id + '-player'; - - // Poll until the YouTube API is ready. - this.poll(this.options.id + '_youtube', (function(player) { - return function() { - var ready = jQuery('#' + player.playerId).length > 0; - ready = ready && ('YT' in window); - ready = ready && (typeof YT.Player === 'function'); - if (ready) { - // Determine the origin of this script. - jQuery('#' + player.playerId).addClass('youtube-player'); - var origin = location.protocol; - origin += '//' + location.hostname; - origin += (location.port && ':' + location.port); - - var playerVars = {}; - if (minplayer.isIDevice) { - playerVars.origin = origin; - } - else { - playerVars = { - enablejsapi: minplayer.isIDevice ? 0 : 1, - origin: origin, - wmode: 'opaque', - controls: minplayer.isAndroid ? 1 : 0, - rel: 0, - showinfo: 0 - }; - } - - // Create the player. - player.player = new YT.Player(player.playerId, { - height: '100%', - width: '100%', - frameborder: 0, - videoId: player.mediaFile.id, - playerVars: playerVars, - events: { - 'onReady': function(event) { - player.onReady(event); - }, - 'onStateChange': function(event) { - player.onPlayerStateChange(event); - }, - 'onPlaybackQualityChange': function(newQuality) { - player.onQualityChange(newQuality); - }, - 'onError': function(errorCode) { - player.onError(errorCode); - } - } - }); - } - return !ready; - }; - })(this), 200); - - // Return the player. - return jQuery(document.createElement('div')).attr({ - id: this.playerId - }); -}; - -/** - * @see minplayer.players.base#load - */ -minplayer.players.youtube.prototype.load = function(file, callback) { - minplayer.players.base.prototype.load.call(this, file, function() { - this.player.loadVideoById(file.id, 0, this.quality); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#play - */ -minplayer.players.youtube.prototype.play = function(callback) { - minplayer.players.base.prototype.play.call(this, function() { - this.onWaiting(); - this.player.playVideo(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#pause - */ -minplayer.players.youtube.prototype.pause = function(callback) { - minplayer.players.base.prototype.pause.call(this, function() { - this.player.pauseVideo(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#stop - */ -minplayer.players.youtube.prototype.stop = function(callback) { - minplayer.players.base.prototype.stop.call(this, function() { - this.player.stopVideo(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#_seek - */ -minplayer.players.youtube.prototype._seek = function(pos) { - this.onWaiting(); - this.player.seekTo(pos, true); -}; - -/** - * @see minplayer.players.base#setVolume - */ -minplayer.players.youtube.prototype.setVolume = function(vol, callback) { - minplayer.players.base.prototype.setVolume.call(this, vol, function() { - this.player.setVolume(vol * 100); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#getVolume - */ -minplayer.players.youtube.prototype._getVolume = function(callback) { - callback(this.player.getVolume()); -}; - -/** - * @see minplayer.players.base#getDuration. - */ -minplayer.players.youtube.prototype._getDuration = function(callback) { - callback(this.player.getDuration()); -}; - -/** - * @see minplayer.players.base#getCurrentTime - */ -minplayer.players.youtube.prototype._getCurrentTime = function(callback) { - callback(this.player.getCurrentTime()); -}; - -/** - * @see minplayer.players.base#getBytesStart. - */ -minplayer.players.youtube.prototype._getBytesStart = function(callback) { - callback(this.player.getVideoStartBytes()); -}; - -/** - * @see minplayer.players.base#getBytesLoaded. - */ -minplayer.players.youtube.prototype._getBytesLoaded = function(callback) { - callback(this.player.getVideoBytesLoaded()); -}; - -/** - * @see minplayer.players.base#getBytesTotal. - */ -minplayer.players.youtube.prototype._getBytesTotal = function(callback) { - callback(this.player.getVideoBytesTotal()); -}; -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** All the media player implementations */ -minplayer.players = minplayer.players || {}; - -/** - * @constructor - * @extends minplayer.players.base - * @class The vimeo media player. - * - * @param {object} context The jQuery context. - * @param {object} options This components options. - * @param {object} queue The event queue to pass events around. - */ -minplayer.players.vimeo = function(context, options, queue) { - - // Derive from players base. - minplayer.players.base.call(this, context, options, queue); -}; - -/** Derive from minplayer.players.base. */ -minplayer.players.vimeo.prototype = new minplayer.players.base(); - -/** Reset the constructor. */ -minplayer.players.vimeo.prototype.constructor = minplayer.players.vimeo; - -/** - * @see minplayer.plugin.construct - * @this minplayer.players.vimeo - */ -minplayer.players.vimeo.prototype.construct = function() { - - // Call the players.flash constructor. - minplayer.players.base.prototype.construct.call(this); - - // Set the plugin name within the options. - this.options.pluginName = 'vimeo'; -}; - -/** - * @see minplayer.players.base#getPriority - * @param {object} file A {@link minplayer.file} object. - * @return {number} The priority of this media player. - */ -minplayer.players.vimeo.getPriority = function(file) { - return 10; -}; - -/** - * @see minplayer.players.base#canPlay - * - * @param {object} file A {@link minplayer.file} object. - * @return {boolean} If this player can play this media type. - */ -minplayer.players.vimeo.canPlay = function(file) { - - // Check for the mimetype for vimeo. - if (file.mimetype === 'video/vimeo') { - return true; - } - - // If the path is a vimeo path, then return true. - return (file.path.search(/^http(s)?\:\/\/(www\.)?vimeo\.com/i) === 0); -}; - -/** - * Determines if the player should show the playloader. - * - * @param {string} preview The preview image. - * @return {bool} If this player implements its own playLoader. - */ -minplayer.players.vimeo.prototype.hasPlayLoader = function(preview) { - return minplayer.hasTouch; -}; - -/** - * Determines if the player should show the playloader. - * - * @return {bool} If this player implements its own playLoader. - */ -minplayer.players.vimeo.prototype.hasController = function() { - return minplayer.hasTouch; -}; - -/** - * Return the ID for a provided media file. - * - * @param {object} file A {@link minplayer.file} object. - * @return {string} The ID for the provided media. - */ -minplayer.players.vimeo.getMediaId = function(file) { - var regex = /^http[s]?\:\/\/(www\.)?vimeo\.com\/(\?v\=)?([0-9]+)/i; - if (file.path.search(regex) === 0) { - return file.path.match(regex)[3]; - } - else { - return file.path; - } -}; - -/** - * Parse a single playlist node. - * - * @param {object} item The vimeo item. - * @return {object} The mediafront node. - */ -minplayer.players.vimeo.parseNode = function(item) { - return { - title: item.title, - description: item.description, - mediafiles: { - image: { - 'thumbnail': { - path: item.thumbnail_small - }, - 'image': { - path: item.thumbnail_large - } - }, - media: { - 'media': { - player: 'vimeo', - id: item.id - } - } - } - }; -}; - -/** Keep track of loaded nodes from vimeo. */ -minplayer.players.vimeo.nodes = {}; - -/** - * Returns information about this vimeo video. - * - * @param {object} file The file to get the node from. - * @param {function} callback Callback when the node is loaded. - */ -minplayer.players.vimeo.getNode = function(file, callback) { - if (minplayer.players.vimeo.nodes.hasOwnProperty(file.id)) { - callback(minplayer.players.vimeo.nodes[file.id]); - } - else { - jQuery.ajax({ - url: 'https://vimeo.com/api/v2/video/' + file.id + '.json', - dataType: 'jsonp', - success: function(data) { - var node = minplayer.players.vimeo.parseNode(data[0]); - minplayer.players.vimeo.nodes[file.id] = node; - callback(node); - } - }); - } -}; - -/** - * Returns a preview image for this media player. - * - * @param {object} file A {@link minplayer.file} object. - * @param {string} type The type of image. - * @param {function} callback Called when the image is retrieved. - */ -minplayer.players.vimeo.getImage = function(file, type, callback) { - minplayer.players.vimeo.getNode(file, function(node) { - callback(node.mediafiles.image.image); - }); -}; - -/** - * @see minplayer.players.base#reset - */ -minplayer.players.vimeo.prototype.reset = function() { - - // Reset the flash variables.. - minplayer.players.base.prototype.reset.call(this); -}; - -/** - * @see minplayer.players.base#create - * @return {object} The media player entity. - */ -minplayer.players.vimeo.prototype.createPlayer = function() { - minplayer.players.base.prototype.createPlayer.call(this); - - // Insert the Vimeo Froogaloop player. - var vimeo_script = 'http://a.vimeocdn.com/js/froogaloop2.min.js'; - if (jQuery('script[src="' + vimeo_script + '"]').length === 0) { - var tag = document.createElement('script'); - tag.src = vimeo_script; - var firstScriptTag = document.getElementsByTagName('script')[0]; - firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); - } - - // Create the iframe for this player. - var iframe = document.createElement('iframe'); - iframe.setAttribute('id', this.options.id + '-player'); - iframe.setAttribute('type', 'text/html'); - iframe.setAttribute('width', '100%'); - iframe.setAttribute('height', '100%'); - iframe.setAttribute('frameborder', '0'); - jQuery(iframe).addClass('vimeo-player'); - - // Get the source. - var src = 'https://player.vimeo.com/video/'; - src += this.mediaFile.id + '?'; - - // Add the parameters to the src. - src += jQuery.param({ - 'wmode': 'opaque', - 'api': 1, - 'player_id': this.options.id + '-player', - 'title': 0, - 'byline': 0, - 'portrait': 0, - 'loop': this.options.loop - }); - - // Set the source of the iframe. - iframe.setAttribute('src', src); - - // Now register this player when the froogaloop code is loaded. - this.poll(this.options.id + '_vimeo', (function(player) { - return function() { - if (window.Froogaloop) { - player.player = window.Froogaloop(iframe); - var playerTimeout = 0; - player.player.addEvent('ready', function() { - clearTimeout(playerTimeout); - player.onReady(); - player.onError(''); - }); - playerTimeout = setTimeout(function() { - player.onReady(); - }, 3000); - } - return !window.Froogaloop; - }; - })(this), 200); - - // Trigger that the load has started. - this.trigger('loadstart'); - - // Return the player. - return iframe; -}; - -/** - * @see minplayer.players.base#onReady - */ -minplayer.players.vimeo.prototype.onReady = function(player_id) { - - // Add the other listeners. - this.player.addEvent('loadProgress', (function(player) { - return function(progress) { - player.duration.set(parseFloat(progress.duration)); - player.bytesLoaded.set(progress.bytesLoaded); - player.bytesTotal.set(progress.bytesTotal); - }; - })(this)); - - this.player.addEvent('playProgress', (function(player) { - return function(progress) { - player.duration.set(parseFloat(progress.duration)); - player.currentTime.set(parseFloat(progress.seconds)); - }; - })(this)); - - this.player.addEvent('play', (function(player) { - return function() { - player.onPlaying(); - }; - })(this)); - - this.player.addEvent('pause', (function(player) { - return function() { - player.onPaused(); - }; - })(this)); - - this.player.addEvent('finish', (function(player) { - return function() { - player.onComplete(); - }; - })(this)); - - minplayer.players.base.prototype.onReady.call(this); - this.onLoaded(); - - // Make sure we autoplay if it is set. - if (this.options.autoplay) { - this.play(); - } -}; - -/** - * Clears the media player. - */ -minplayer.players.vimeo.prototype.clear = function() { - if (this.player) { - this.player.api('unload'); - } - - minplayer.players.base.prototype.clear.call(this); -}; - -/** - * @see minplayer.players.base#load - */ -minplayer.players.vimeo.prototype.load = function(file, callback) { - minplayer.players.base.prototype.load.call(this, file, function() { - this.construct(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#play - */ -minplayer.players.vimeo.prototype.play = function(callback) { - minplayer.players.base.prototype.play.call(this, function() { - this.player.api('play'); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#pause - */ -minplayer.players.vimeo.prototype.pause = function(callback) { - minplayer.players.base.prototype.pause.call(this, function() { - this.player.api('pause'); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#stop - */ -minplayer.players.vimeo.prototype.stop = function(callback) { - minplayer.players.base.prototype.stop.call(this, function() { - this.player.api('unload'); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#_seek - */ -minplayer.players.vimeo.prototype._seek = function(pos) { - this.player.api('seekTo', pos); -}; - -/** - * @see minplayer.players.base#setVolume - */ -minplayer.players.vimeo.prototype.setVolume = function(vol, callback) { - minplayer.players.base.prototype.setVolume.call(this, vol, function() { - this.volume.set(vol); - this.player.api('setVolume', vol); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#getVolume - */ -minplayer.players.vimeo.prototype._getVolume = function(callback) { - this.player.api('getVolume', function(vol) { - callback(vol); - }); -}; - -/** - * @see minplayer.players.base#getDuration. - */ -minplayer.players.vimeo.prototype._getDuration = function(callback) { - this.player.api('getDuration', function(duration) { - callback(duration); - }); -}; -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** All the media player implementations */ -minplayer.players = minplayer.players || {}; - -/** - * @constructor - * @extends minplayer.players.base - * @class The Limelight media player. - * - * @param {object} context The jQuery context. - * @param {object} options This components options. - */ -minplayer.players.limelight = function(context, options) { - - // Derive from players base. - minplayer.players.flash.call(this, context, options); -}; - -/** Derive from minplayer.players.flash. */ -minplayer.players.limelight.prototype = new minplayer.players.flash(); - -/** Reset the constructor. */ -minplayer.players.limelight.prototype.constructor = minplayer.players.limelight; - -/** - * @see minplayer.plugin.construct - * @this minplayer.players.limelight - */ -minplayer.players.limelight.prototype.construct = function() { - - // Call the players.flash constructor. - minplayer.players.flash.prototype.construct.call(this); - - // Set the plugin name within the options. - this.options.pluginName = 'limelight'; -}; - -/** - * @see minplayer.players.base#getPriority - * @return {number} The priority of this media player. - */ -minplayer.players.limelight.getPriority = function() { - return 10; -}; - -/** - * @see minplayer.players.base#canPlay - * - * @param {object} file A {@link minplayer.file} object. - * @return {boolean} If this player can play this media type. - */ -minplayer.players.limelight.canPlay = function(file) { - - // Check for the mimetype for limelight. - if (file.mimetype === 'video/limelight') { - return true; - } - - // If the path is a limelight path, then return true. - var regex = /.*limelight\.com.*/i; - return (file.path.search(regex) === 0); -}; - -/** - * Return the ID for a provided media file. - * - * @param {object} file A {@link minplayer.file} object. - * @return {string} The ID for the provided media. - */ -minplayer.players.limelight.getMediaId = function(file) { - var regex = /.*limelight\.com.*mediaId=([a-zA-Z0-9]+)/i; - if (file.path.search(regex) === 0) { - return file.path.match(regex)[1]; - } - else { - return file.path; - } -}; - -/** - * Register this limelight player so that multiple players can be present - * on the same page without event collision. - */ -minplayer.players.limelight.prototype.register = function() { - - // Register the limelight player. - window.delvePlayerCallback = function(playerId, event, data) { - - // Get the main player ID. - var id = playerId.replace('-player', ''); - - // Dispatch this event to the correct player. - jQuery.each(minplayer.get(id, 'media'), function(key, media) { - media.onMediaUpdate(event, data); - }); - }; -}; - -/** - * The media update method. - * - * @param {string} event The event that was triggered. - * @param {object} data The event object. - */ -minplayer.players.limelight.prototype.onMediaUpdate = function(event, data) { - - // Switch on the event name. - switch (event) { - case 'onPlayerLoad': - this.onReady(); - break; - - case 'onMediaLoad': - // If this media has already completed, then pause it and return... - if (this.complete) { - this.pause(); - this.onPaused(); - return; - } - - this.shouldSeek = (this.startTime > 0); - this.onLoaded(); - break; - - case 'onMediaComplete': - this.complete = true; - this.onComplete(); - break; - - case 'onPlayheadUpdate': - - // Make sure we say this is playing. - if (data.positionInMilliseconds && !this.playing && !this.complete) { - this.onPlaying(); - } - - // Set the complete flag to false. - this.complete = false; - - // Set the duration and current time. - if (this.shouldSeek && this.seekValue) { - this.shouldSeek = false; - this.seek(this.seekValue); - } - else { - this.duration.set(data.durationInMilliseconds / 1000); - this.currentTime.set(data.positionInMilliseconds / 1000); - } - break; - - case 'onError': - this.onError(); - break; - - case 'onPlayStateChanged': - if (data.isPlaying) { - this.onPlaying(); - } - else if (data.isBusy) { - this.onWaiting(); - } - else { - this.onPaused(); - } - break; - } -}; - -/** - * @see minplayer.players.base#create - * @return {object} The media player entity. - */ -minplayer.players.limelight.prototype.createPlayer = function() { - minplayer.players.flash.prototype.createPlayer.call(this); - - // Insert the embed.js. - var tag = document.createElement('script'); - tag.src = 'https://assets.delvenetworks.com/player/embed.js'; - var firstScriptTag = document.getElementsByTagName('script')[0]; - firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); - - // Now register this player. - this.register(); - - // Get the FlashVars. - var flashVars = { - 'deepLink': 'true', - 'autoplay': this.options.autoplay ? 'true' : 'false', - 'startQuality': 'HD' - }, regex = null; - - // Get the channel for this player. - var channel = this.options.channel; - if (!channel) { - regex = /.*limelight\.com.*channelId=([a-zA-Z0-9]+)/i; - if (this.mediaFile.path.search(regex) === 0) { - channel = this.mediaFile.path.match(regex)[1]; - } - } - - // Set the channel. - if (channel && this.mediaFile.queueType === 'media') { - flashVars.adConfigurationChannelId = channel; - } - - // Get the playerForm for this player. - var playerForm = this.options.playerForm; - if (!playerForm) { - regex = /.*limelight\.com.*playerForm=([a-zA-Z0-9]+)/i; - if (this.mediaFile.path.search(regex) === 0) { - playerForm = this.mediaFile.path.match(regex)[1]; - } - } - - // Set the player form. - if (playerForm) { - flashVars.playerForm = playerForm; - } - - // Add the media Id to the flashvars. - flashVars.mediaId = this.mediaFile.id; - - // Set the player ID. - var playerId = this.options.id + '-player'; - - // Check the embed code every second. - setTimeout(function checkLimelight() { - if (window.hasOwnProperty('LimelightPlayerUtil')) { - window.LimelightPlayerUtil.initEmbed(playerId); - } - else { - setTimeout(checkLimelight, 1000); - } - }, 1000); - - // Return a flash media player object. - return this.getFlash({ - swf: document.location.protocol + '//assets.delvenetworks.com/player/loader.swf', - id: playerId, - width: this.options.width, - height: '100%', - flashvars: flashVars, - wmode: this.options.wmode - }); -}; - -/** - * @see minplayer.players.base#play - */ -minplayer.players.limelight.prototype.play = function(callback) { - minplayer.players.flash.prototype.play.call(this, function() { - this.player.doPlay(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#pause - */ -minplayer.players.limelight.prototype.pause = function(callback) { - minplayer.players.flash.prototype.pause.call(this, function() { - this.player.doPause(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#stop - */ -minplayer.players.limelight.prototype.stop = function(callback) { - minplayer.players.flash.prototype.stop.call(this, function() { - this.player.doPause(); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#_seek - */ -minplayer.players.limelight.prototype._seek = function(pos) { - this.seekValue = pos; - this.player.doSeekToSecond(pos); -}; - -/** - * @see minplayer.players.base#setVolume - */ -minplayer.players.limelight.prototype.setVolume = function(vol, callback) { - minplayer.players.flash.prototype.setVolume.call(this, vol, function() { - this.player.doSetVolume(vol); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#getVolume - */ -minplayer.players.limelight.prototype._getVolume = function(callback) { - callback(this.player.doGetVolume()); -}; - -/** - * Perform the Limelight Search Inside. - * - * @param {string} query The query to search for. - */ -minplayer.players.limelight.prototype.search = function(query) { - this.whenReady(function() { - this.player.doSearch(query); - }); -}; -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** All the media player implementations */ -minplayer.players = minplayer.players || {}; - -/** - * @constructor - * @extends minplayer.players.base - * @class The Limelight media player. - * - * @param {object} context The jQuery context. - * @param {object} options This components options. - */ -minplayer.players.kaltura = function(context, options) { - - // Derive from the base player. - minplayer.players.base.call(this, context, options); -}; - -/** Derive from minplayer.players.base. */ -minplayer.players.kaltura.prototype = new minplayer.players.base(); - -/** Reset the constructor. */ -minplayer.players.kaltura.prototype.constructor = minplayer.players.kaltura; - -/** - * @see minplayer.plugin.construct - * @this minplayer.kaltura.limelight - */ -minplayer.players.kaltura.prototype.construct = function() { - - // Call the players.base constructor. - minplayer.players.base.prototype.construct.call(this); - - // Set the plugin name within the options. - this.options.pluginName = 'kaltura'; - - // Determine if an ad is playing. - this.adPlaying = false; -}; - -/** - * Get the default options for this plugin. - * - * @param {object} options The default options for this plugin. - */ -minplayer.players.kaltura.prototype.defaultOptions = function(options) { - - // The Kaltura options for this player. - options.entryId = 0; - options.uiConfId = 0; - options.partnerId = 0; - - minplayer.players.base.prototype.defaultOptions.call(this, options); -}; - -/** - * @see minplayer.players.base#getPriority - * @return {number} The priority of this media player. - */ -minplayer.players.kaltura.getPriority = function() { - return 10; -}; - -/** - * @see minplayer.players.base#canPlay - * - * @param {object} file A {@link minplayer.file} object. - * @return {boolean} If this player can play this media type. - */ -minplayer.players.kaltura.canPlay = function(file) { - - // Check for the mimetype for kaltura. - if (file.mimetype === 'video/kaltura') { - return true; - } - - // If the path is a kaltura path, then return true. - var regex = /.*kaltura\.com.*/i; - return (file.path.search(regex) === 0); -}; - -minplayer.players.kaltura.prototype.adStart = function(data) { - this.adPlaying = true; - this.onPlaying(); -}; - -minplayer.players.kaltura.prototype.adEnd = function(data) { - this.adPlaying = false; -}; - -/** - * Keep track when the player state changes. - * - * @param {type} data - * @returns {undefined} - */ -minplayer.players.kaltura.prototype.playerStateChange = function(data) { - if (!this.adPlaying) { - switch (data) { - case 'ready': - this.onLoaded(); - break; - case 'loading': - case 'buffering': - this.onWaiting(); - break; - case 'playing': - this.onPlaying(); - break; - case 'paused': - this.onPaused(); - break; - } - } -}; - -/** - * Called when the player is ready. - * - * @returns {undefined} - */ -minplayer.players.kaltura.prototype.mediaReady = function() { - this.onLoaded(); -}; - -/** - * Called when the media ends. - * - * @param {type} data - * @returns {undefined} - */ -minplayer.players.kaltura.prototype.playerPlayEnd = function(data) { - this.onComplete(); -}; - -/** - * Called as the play updates. - * - * @param {type} data - * @returns {undefined} - */ -minplayer.players.kaltura.prototype.playUpdate = function(data) { - this.currentTime.set(data); -}; - -/** - * Called when the duration changes. - * - * @param {type} data - * @returns {undefined} - */ -minplayer.players.kaltura.prototype.durationChange = function(data) { - this.duration.set(data.newValue); -}; - -/** - * Returns the name of this player instance. - * - * @returns {String} - */ -minplayer.players.kaltura.prototype.getInstance = function() { - if (this.instanceName) { - return this.instanceName; - } - var ids = this.uuid.split('__'); - var instance = 'minplayer.plugins.' + ids[0]; - instance += '.' + ids[1]; - instance += '[' + (ids[2] - 1) + ']'; - this.instanceName = instance; - return instance; -}; - -/** - * Register for the media player events. - * - * @returns {undefined} - */ -minplayer.players.kaltura.prototype.registerEvents = function() { - this.player.addJsListener("adStart", this.getInstance() + '.adStart'); - this.player.addJsListener("adEnd", this.getInstance() + '.adEnd'); - this.player.addJsListener("playerStateChange", this.getInstance() + '.playerStateChange'); - this.player.addJsListener("durationChange", this.getInstance() + '.durationChange'); - this.player.addJsListener("mediaReady", this.getInstance() + '.mediaReady'); - this.player.addJsListener("playerUpdatePlayhead", this.getInstance() + '.playUpdate'); - this.player.addJsListener("playerPlayEnd", this.getInstance() + '.playerPlayEnd'); -}; - -/** - * @see minplayer.players.base#create - * @return {object} The media player entity. - */ -minplayer.players.kaltura.prototype.createPlayer = function() { - minplayer.players.base.prototype.createPlayer.call(this); - - // Set the items. - var settings = {}; - var self = this; - jQuery.each(['entryId', 'uiConfId', 'partnerId'], function(index, item) { - settings[item] = ''; - if (self.options[item]) { - settings[item] = self.options[item]; - } - else { - var regex = null; - switch (item) { - case 'entryId': - regex = /.*kaltura\.com.*entry_id\/([^\/]+)/i; - break; - case 'uiConfId': - regex = /.*kaltura\.com.*uiconf_id\/([^\/]+)/i; - break; - case 'partnerId': - regex = /.*kaltura\.com.*wid\/_([^\/]+)/i; - break; - } - - // Set the value for this item. - if (regex) { - settings[item] = self.mediaFile.path.match(regex); - if (settings[item]) { - settings[item] = settings[item][1]; - } - } - } - }); - - // Insert the embed javascript. - var tag = document.createElement('script'); - tag.src = 'http://cdnapi.kaltura.com/p/'; - tag.src += settings.partnerId; - tag.src += '/sp/'; - tag.src += settings.partnerId; - tag.src += '00/embedIframeJs/uiconf_id/'; - tag.src += settings.uiConfId; - tag.src += '/partner_id/'; - tag.src += settings.partnerId; - var firstScriptTag = document.getElementsByTagName('script')[0]; - firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); - - // The player Id. - var playerId = this.options.id + '-player'; - - // Check the embed code every second. - setTimeout(function checkKaltura() { - if (window.hasOwnProperty('kWidget')) { - kWidget.embed({ - 'targetId': playerId, - 'wid': '_' + settings.partnerId, - 'uiconf_id' : settings.uiConfId, - 'entry_id' : settings.entryId, - 'flashvars':{ - 'autoPlay': false - }, - 'params':{ - 'wmode': 'transparent' - }, - readyCallback: function( playerId ){ - self.player = jQuery('#' + playerId).get(0); - self.registerEvents(); - self.onReady(); - } - }); - } - else { - setTimeout(checkKaltura, 1000); - } - }, 1000); - - // Return a div tag. - return '
'; -}; - -/** - * @see minplayer.players.base#play - */ -minplayer.players.kaltura.prototype.play = function(callback) { - minplayer.players.base.prototype.play.call(this, function() { - this.player.sendNotification("doPlay"); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#pause - */ -minplayer.players.kaltura.prototype.pause = function(callback) { - minplayer.players.base.prototype.pause.call(this, function() { - this.player.sendNotification("doPause"); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#stop - */ -minplayer.players.kaltura.prototype.stop = function(callback) { - minplayer.players.base.prototype.stop.call(this, function() { - this.player.sendNotification("doStop"); - if (callback) { - callback.call(this); - } - }); -}; - -/** - * @see minplayer.players.base#seek - */ -minplayer.players.kaltura.prototype._seek = function(pos) { - this.seekValue = pos; - this.player.sendNotification("doSeek", pos); -}; - -/** - * @see minplayer.players.base#setVolume - */ -minplayer.players.kaltura.prototype.setVolume = function(vol, callback) { - minplayer.players.base.prototype.setVolume.call(this, vol, function() { - this.player.sendNotification("changeVolume", vol); - if (callback) { - callback.call(this); - } - }); -}; -/** The minplayer namespace. */ -var minplayer = minplayer || {}; - -/** - * @constructor - * @extends minplayer.display - * @class This is the base minplayer controller. Other controllers can derive - * from the base and either build on top of it or simply define the elements - * that this base controller uses. - * - * @param {object} context The jQuery context. - * @param {object} options This components options. - */ -minplayer.controller = function(context, options) { - - // Derive from display - minplayer.display.call(this, 'controller', context, options); -}; - -/** Derive from minplayer.display. */ -minplayer.controller.prototype = new minplayer.display(); - -/** Reset the constructor. */ -minplayer.controller.prototype.constructor = minplayer.controller; - -/** - * A static function that will format a time value into a string time format. - * - * @param {integer} time An integer value of time. - * @return {string} A string representation of the time. - */ -minplayer.formatTime = function(time) { - time = time || 0; - var seconds = 0, minutes = 0, hour = 0, timeString = ''; - - hour = Math.floor(time / 3600); - time -= (hour * 3600); - minutes = Math.floor(time / 60); - time -= (minutes * 60); - seconds = Math.floor(time % 60); - - if (hour) { - timeString += String(hour); - timeString += ':'; - } - - timeString += (minutes >= 10) ? String(minutes) : ('0' + String(minutes)); - timeString += ':'; - timeString += (seconds >= 10) ? String(seconds) : ('0' + String(seconds)); - return {time: timeString, units: ''}; -}; - -/** - * @see minplayer.display#getElements - * @return {object} The elements defined by this display. - */ -minplayer.controller.prototype.getElements = function() { - var elements = minplayer.display.prototype.getElements.call(this); - return jQuery.extend(elements, { - play: null, - pause: null, - fullscreen: null, - seek: null, - progress: null, - volume: null, - timer: null - }); -}; - -/** - * Get the default options for this plugin. - * - * @param {object} options The default options for this plugin. - */ -minplayer.controller.prototype.defaultOptions = function(options) { - options.disptime = 0; - minplayer.display.prototype.defaultOptions.call(this, options); -}; - -/** - * @see minplayer.plugin#construct - */ -minplayer.controller.prototype.construct = function() { - - // Call the minplayer plugin constructor. - minplayer.display.prototype.construct.call(this); - - // Set the plugin name within the options. - this.options.pluginName = 'controller'; - - // Keep track of if we are dragging... - this.dragging = false; - - // Keep track of the current volume. - this.vol = 0; - - // If they have a seek bar. - if (this.elements.seek) { - - // Create the seek bar slider control. - this.seekBar = this.elements.seek.slider({ - range: 'min', - create: function(event, ui) { - jQuery('.ui-slider-range', event.target).addClass('ui-state-active'); - } - }); - } - - // If they have a volume bar. - if (this.elements.volume) { - - // Create the volume bar slider control. - this.volumeBar = this.elements.volume.slider({ - animate: true, - range: 'min', - orientation: 'vertical' - }); - } - - // Get the player plugin. - this.get('player', function(player) { - - // If they have a fullscreen button. - if (this.elements.fullscreen) { - - // Bind to the click event. - minplayer.click(this.elements.fullscreen.unbind(), function() { - player.toggleFullScreen(); - }).css({'pointer' : 'hand'}); - } - }); - - // Get the media plugin. - this.get('media', function(media) { - - // Only bind if this player does not have its own play loader. - if (!media.hasController()) { - - // If they have a pause button - if (this.elements.pause) { - - // Bind to the click on this button. - minplayer.click(this.elements.pause.unbind(), (function(controller) { - return function(event) { - event.preventDefault(); - controller.playPause(false, media); - }; - })(this)); - - // Bind to the pause event of the media. - media.ubind(this.uuid + ':pause', (function(controller) { - return function(event) { - controller.setPlayPause(true); - }; - })(this)); - } - - // If they have a play button - if (this.elements.play) { - - // Bind to the click on this button. - minplayer.click(this.elements.play.unbind(), (function(controller) { - return function(event) { - event.preventDefault(); - controller.playPause(true, media); - }; - })(this)); - - // Bind to the play event of the media. - media.ubind(this.uuid + ':playing', (function(controller) { - return function(event) { - controller.setPlayPause(false); - }; - })(this)); - } - - // If they have a duration, then trigger on duration change. - if (this.elements.duration) { - - // Bind to the duration change event. - media.ubind(this.uuid + ':durationchange', (function(controller) { - return function(event, data) { - var duration = controller.options.disptime || data.duration; - controller.setTimeString('duration', duration); - }; - })(this)); - - // Set the timestring to the duration. - media.getDuration((function(controller) { - return function(duration) { - duration = controller.options.disptime || duration; - controller.setTimeString('duration', duration); - }; - })(this)); - } - - // If they have a progress element. - if (this.elements.progress) { - - // Bind to the progress event. - media.ubind(this.uuid + ':progress', (function(controller) { - return function(event, data) { - var percent = data.total ? (data.loaded / data.total) * 100 : 0; - controller.elements.progress.width(percent + '%'); - }; - })(this)); - } - - // If they have a seek bar or timer, bind to the timeupdate. - if (this.seekBar || this.elements.timer) { - - // Bind to the time update event. - media.ubind(this.uuid + ':timeupdate', (function(controller) { - return function(event, data) { - if (!controller.dragging) { - var value = 0; - if (data.duration) { - value = (data.currentTime / data.duration) * 100; - } - - // Update the seek bar if it exists. - if (controller.seekBar) { - controller.seekBar.slider('option', 'value', value); - } - - controller.setTimeString('timer', data.currentTime); - } - }; - })(this)); - } - - // If they have a seekBar element. - if (this.seekBar) { - - // Register the events for the control bar to control the media. - this.seekBar.slider({ - start: (function(controller) { - return function(event, ui) { - controller.dragging = true; - }; - })(this), - stop: (function(controller) { - return function(event, ui) { - controller.dragging = false; - media.getDuration(function(duration) { - media.seek((ui.value / 100) * duration); - }); - }; - })(this), - slide: (function(controller) { - return function(event, ui) { - media.getDuration(function(duration) { - var time = (ui.value / 100) * duration; - if (!controller.dragging) { - media.seek(time); - } - controller.setTimeString('timer', time); - }); - }; - })(this) - }); - } - - // Setup the mute button. - if (this.elements.mute) { - minplayer.click(this.elements.mute, (function(controller) { - return function(event) { - event.preventDefault(); - var value = controller.volumeBar.slider('option', 'value'); - if (value > 0) { - controller.vol = value; - controller.volumeBar.slider('option', 'value', 0); - media.setVolume(0); - } - else { - controller.volumeBar.slider('option', 'value', controller.vol); - media.setVolume(controller.vol / 100); - } - }; - })(this)); - } - - // Setup the volume bar. - if (this.volumeBar) { - - // Create the slider. - this.volumeBar.slider({ - slide: function(event, ui) { - media.setVolume(ui.value / 100); - } - }); - - media.ubind(this.uuid + ':volumeupdate', (function(controller) { - return function(event, vol) { - controller.volumeBar.slider('option', 'value', (vol * 100)); - }; - })(this)); - - // Set the volume to match that of the player. - media.getVolume((function(controller) { - return function(vol) { - controller.volumeBar.slider('option', 'value', (vol * 100)); - }; - })(this)); - } - } - else { - - // Hide this controller. - this.hide(); - } - }); - - // We are now ready. - this.ready(); -}; - -/** - * Sets the play and pause state of the control bar. - * - * @param {boolean} state TRUE - Show Play, FALSE - Show Pause. - */ -minplayer.controller.prototype.setPlayPause = function(state) { - var css = ''; - if (this.elements.play) { - css = state ? 'inherit' : 'none'; - this.elements.play.css('display', css); - } - if (this.elements.pause) { - css = state ? 'none' : 'inherit'; - this.elements.pause.css('display', css); - } -}; - -/** - * Plays or pauses the media. - * - * @param {bool} state true => play, false => pause. - * @param {object} media The media player object. - */ -minplayer.controller.prototype.playPause = function(state, media) { - var type = state ? 'play' : 'pause'; - this.display.trigger(type); - this.setPlayPause(!state); - if (media) { - media[type](); - } -}; - -/** - * Sets the time string on the control bar. - * - * @param {string} element The name of the element to set. - * @param {number} time The total time amount to set. - */ -minplayer.controller.prototype.setTimeString = function(element, time) { - if (this.elements[element]) { - this.elements[element].text(minplayer.formatTime(time).time); - } -}; -// Add a way to instanciate using jQuery prototype. +function checkPlayType(a,b){if("function"==typeof a.canPlayType){if("object"==typeof b){for(var c=b.length,d="";c--&&!(d=checkPlayType(a,b[c])););return d}var e=a.canPlayType(b);if("no"!==e&&""!==e)return b}return""}var minplayer=minplayer||{};!function(a){!function(){"use strict";var a="undefined"!=typeof module&&module.exports,b="undefined"!=typeof Element&&"ALLOW_KEYBOARD_INPUT"in Element,c=function(){for(var a,b,c=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],d=0,e=c.length,f={};e>d;d++)if(a=c[d],a&&a[1]in document){for(d=0,b=a.length;b>d;d++)f[c[0][d]]=a[d];return f}return!1}(),d={request:function(a){var d=c.requestFullscreen;a=a||document.documentElement,/5\.1[\.\d]* Safari/.test(navigator.userAgent)?a[d]():a[d](b&&Element.ALLOW_KEYBOARD_INPUT)},exit:function(){document[c.exitFullscreen]()},toggle:function(a){this.isFullscreen?this.exit():this.request(a)},onchange:function(){},onerror:function(){},raw:c};return c?(Object.defineProperties(d,{isFullscreen:{get:function(){return!!document[c.fullscreenElement]}},element:{enumerable:!0,get:function(){return document[c.fullscreenElement]}},enabled:{enumerable:!0,get:function(){return!!document[c.fullscreenEnabled]}}}),document.addEventListener(c.fullscreenchange,function(a){d.onchange.call(d,a)}),document.addEventListener(c.fullscreenerror,function(a){d.onerror.call(d,a)}),void(a?module.exports=d:window.screenfull=d)):void(a?module.exports=!1:window.screenfull=!1)}(),a.screenfull=screenfull}(minplayer);var minplayer=minplayer||{};if(minplayer.compatibility=function(){var a=null;a=document.createElement("video"),this.videoOGG=checkPlayType(a,"video/ogg"),this.videoH264=checkPlayType(a,["video/mp4","video/h264"]),this.videoWEBM=checkPlayType(a,["video/x-webm","video/webm","application/octet-stream"]),this.videoMPEGURL=checkPlayType(a,"application/vnd.apple.mpegurl"),a=document.createElement("audio"),this.audioOGG=checkPlayType(a,"audio/ogg"),this.audioMP3=checkPlayType(a,"audio/mpeg"),this.audioMP4=checkPlayType(a,"audio/mp4")},minplayer.playTypes||(minplayer.playTypes=new minplayer.compatibility,minplayer.isAndroid=/android/gi.test(navigator.appVersion),minplayer.isIDevice=/iphone|ipad/gi.test(navigator.appVersion),minplayer.isPlaybook=/playbook/gi.test(navigator.appVersion),minplayer.isTouchPad=/hp-tablet/gi.test(navigator.appVersion),minplayer.hasTouch="ontouchstart"in window&&!minplayer.isTouchPad),!minplayer.urlVars){minplayer.urlVars={};var regEx=/[?&]+([^=&]+)=([^&]*)/gi;window.location.href.replace(regEx,function(a,b,c){minplayer.urlVars[b]=c})}var minplayer=minplayer||{};minplayer.async=function(){this.value=null,this.queue=[]},minplayer.async.prototype.get=function(a){null!==this.value?a(this.value):this.queue.push(a)},minplayer.async.prototype.set=function(a){this.value=a;var b=this.queue.length;if(b){for(;b--;)this.queue[b](a);this.queue=[]}};var minplayer=minplayer||{};minplayer.flags=function(){this.flag=0,this.ids={},this.numFlags=0},minplayer.flags.prototype.setFlag=function(a,b){this.ids.hasOwnProperty(a)||(this.ids[a]=this.numFlags,this.numFlags++),b?this.flag|=1<c;c++)minplayer.queue.hasOwnProperty(c)&&(b=minplayer.queue[c],d=!b.id&&!b.plugin,d|=b.plugin===a.name,d&=!b.id||b.id===this.options.id,d&&!b.addedto.hasOwnProperty(a.options.id)&&(b.addedto[a.options.id]=!0,d=minplayer.bind.call(b.context,b.event,this.options.id,a.name,b.callback,!0)));minplayer.lock=!1},minplayer.eventTypes={},minplayer.plugin.prototype.isEvent=function(a,b){var c=a+"__"+b;if("undefined"!=typeof minplayer.eventTypes[c])return minplayer.eventTypes[c];new RegExp("^(.*:)?"+b+"$","gi");return minplayer.eventTypes[c]=null!==a.match(b),minplayer.eventTypes[c]},minplayer.plugin.prototype.trigger=function(a,b,c){if(!this.active)return this;c||(this.triggered[a]=b);var d=0,e={},f=null;for(var g in this.queue)if(this.isEvent(g,a)){f=this.queue[g];for(d in f)f.hasOwnProperty(d)&&(e=f[d],e.callback({target:this,data:e.data},b))}return this},minplayer.plugin.prototype.ubind=function(a,b,c){return this.unbind(a),this.bind(a,b,c)},minplayer.plugin.prototype.bind=function(a,b,c){if(!this.active)return this;if("function"==typeof b&&(c=b,b=null),a&&c){this.queue[a]=this.queue[a]||[],this.queue[a].push({callback:c,data:b});for(var d in this.triggered)this.triggered.hasOwnProperty(d)&&this.isEvent(a,d)&&c({target:this,data:b},this.triggered[d]);return this}},minplayer.plugin.prototype.unbind=function(a){return this.lock&&setTimeout(function(b){return function(){b.unbind(a)}}(this),10),this.lock=!0,a?this.queue.hasOwnProperty(a)&&this.queue[a].length>0&&(this.queue[a].length=0):this.queue={},this.lock=!1,this},minplayer.addQueue=function(a,b,c,d,e){minplayer.lock?setTimeout(function(){minplayer.addQueue(a,c,b,d,e)},10):minplayer.queue.push({context:a,id:c,event:b,plugin:d,callback:e,addedto:{}})},minplayer.bind=function(a,b,c,d,e){if(!d)return!1;var f=minplayer.plugins,g=null,h=null,i=[],j=function(a,b){if(f.hasOwnProperty(a)&&f[a].hasOwnProperty(b))for(var c=f[a][b].length;c--;)i.push(f[a][b][c])};if(b&&c)j(b,c);else if(!b&&c)for(h in f)j(h,c);else if(b&&!c&&f[b])for(g in f[b])j(b,g);else if(!b&&!c)for(h in f)for(g in f[h])j(h,g);for(var k=i.length;k--;)i[k].bind(a,function(a){return function(b){d.call(a,b.target)}}(this));return e||minplayer.addQueue(this,a,b,c,d),i.length>0},minplayer.get=function(a,b,c){var d=typeof a,e=typeof b,f=typeof c;if("function"===d?(c=a,b=a=null):"function"===e?(c=b,b=a,a=null):"undefined"===e&&"undefined"===f&&(b=a,c=a=null),c="function"==typeof c?c:null)return void minplayer.bind.call(this,"ready",a,b,c);var g=minplayer.plugins,h=null;if(!(a||b||c))return g;if(a&&!b&&!c)return g[a];if(a&&b&&!c)return g[a][b];if(!a&&b&&!c){var i=[];for(h in g)if(g.hasOwnProperty(h)&&g[h].hasOwnProperty(b))for(var j=g[h][b].length;j--;)i.push(g[h][b][j]);return i}},minplayer.display=function(a,b,c,d){minplayer.plugin.call(this,a,b,c,d)},minplayer.display.prototype=new minplayer.plugin,minplayer.display.prototype.constructor=minplayer.display,minplayer.display.prototype.getDisplay=function(a){return a},minplayer.display.prototype.initialize=function(){this.display||(this.display=this.getDisplay(this.context,this.options)),this.display&&(this.options.pluginName="display",this.elements=this.getElements(),minplayer.plugin.prototype.initialize.call(this))},minplayer.display.prototype.construct=function(){if(minplayer.plugin.prototype.construct.call(this),this.autoHide=!1,this.onResize){var a=0;jQuery(window).resize(function(b){return function(){clearTimeout(a),a=setTimeout(function(){b.onResize()},200)}}(this))}},minplayer.display.prototype.onResize=!1,minplayer.display.prototype.hide=function(a){a=a||this.display,a&&(a.forceHide=!0,a.unbind().hide())},minplayer.display.prototype.fullScreenElement=function(){return this.display},minplayer.click=function(a,b){var c=!1;return a=jQuery(a),a.bind("touchstart click",function(a){c||(c=!0,setTimeout(function(){c=!1},100),b.call(this,a))}),a},minplayer.display.prototype.onFocus=function(a){this.hasFocus=this.focus=a,this.autoHide&&this.showThenHide(this.autoHide.element,this.autoHide.timeout,this.autoHide.cb)},minplayer.display.prototype.showThenHide=function(a,b,c){var d=typeof a;"undefined"===d?(c=null,a=this.display):"number"===d?(c=b,b=a,a=this.display):"function"===d&&(c=a,a=this.display),a&&(b=b||5e3,this.autoHide={element:a,timeout:b,cb:c},a.forceHide||("undefined"!=typeof a.showMe?a.showMe&&a.showMe(c):(a.show(),c&&c(!0))),a.hoverState||(jQuery(a).bind("mouseenter",function(){a.hoverState=!0}),jQuery(a).bind("mouseleave",function(){a.hoverState=!1})),clearTimeout(this.showTimer),this.showTimer=setTimeout(function(d){return function e(){a.hoverState?d.showTimer=setTimeout(e,b):"undefined"!=typeof a.hideMe?a.hideMe&&a.hideMe(c):a.hide("slow",function(){c&&c(!1)})}}(this),b))},minplayer.display.prototype.fullscreen=function(a){var b=this.isFullScreen(),c=this.fullScreenElement();b&&!a?(c.removeClass("fullscreen"),minplayer.screenfull&&minplayer.screenfull.exit(),this.trigger("fullscreen",!1)):!b&&a&&(c.addClass("fullscreen"),minplayer.screenfull&&(minplayer.screenfull.request(c[0]),minplayer.screenfull.onchange=function(a){return function(){minplayer.screenfull.isFullscreen||a.fullscreen(!1)}}(this)),this.trigger("fullscreen",!0))},minplayer.display.prototype.toggleFullScreen=function(){this.fullscreen(!this.isFullScreen())},minplayer.display.prototype.isFullScreen=function(){return this.fullScreenElement().hasClass("fullscreen")},minplayer.display.prototype.getScaledRect=function(a,b){var c={};return c.x=b.x?b.x:0,c.y=b.y?b.y:0,c.width=b.width?b.width:0,c.height=b.height?b.height:0,a&&(b.width/b.height>a?(c.height=b.height,c.width=Math.floor(b.height*a)):(c.height=Math.floor(b.width/a),c.width=b.width),c.x=Math.floor((b.width-c.width)/2),c.y=Math.floor((b.height-c.height)/2)),c},minplayer.display.prototype.getElements=function(){return{}},jQuery.fn.minplayer||(jQuery.fn.minplayer=function(a){return jQuery(this).each(function(){a=a||{},a.id=a.id||jQuery(this).attr("id")||Math.random(),minplayer.plugins[a.id]||(a.template=a.template||"default",minplayer[a.template]?new minplayer[a.template](jQuery(this),a):new minplayer(jQuery(this),a))})}),minplayer=jQuery.extend(function(a,b){minplayer.display.call(this,"player",a,b)},minplayer),minplayer.prototype=new minplayer.display,minplayer.prototype.constructor=minplayer,minplayer.prototype.defaultOptions=function(a){a.id="player",a.build=!1,a.wmode="transparent",a.preload=!0,a.autoplay=!1,a.autoload=!0,a.loop=!1,a.width="100%",a.height="350px",a.debug=!1,a.volume=80,a.files=null,a.file="",a.preview="",a.attributes={},a.plugins={},a.logo="",a.link="",a.duration=0,jQuery.each(this.context[0].attributes,function(b,c){a[c.name]=c.value}),minplayer.display.prototype.defaultOptions.call(this,a)},minplayer.prototype.construct=function(){minplayer.display.prototype.construct.call(this);var a=null;for(var b in this.options.plugins)a=this.options.plugins[b],minplayer[a]&&(a=minplayer[a],a[this.options.template]&&a[this.options.template].init?a[this.options.template].init(this):a.init&&a.init(this));if(this.options.pluginName="player",this.controller=this.create("controller"),this.playLoader=this.create("playLoader"),this.options.logo&&this.elements.logo){var c="";this.options.link&&(c+=''),c+='',this.options.link&&(c+=""),this.logo=this.elements.logo.append(c)}this.currentPlayer="html5",this.addKeyEvents(),this.addEvents(),this.load(this.getFiles()),this.ready()},minplayer.prototype.setFocus=function(a){minplayer.get.call(this,this.options.id,null,function(b){b.onFocus(a)}),this.trigger("playerFocus",a)},minplayer.prototype.bindTo=function(a){a.ubind(this.uuid+":error",function(a){return function(b,c){"html5"===a.currentPlayer?(minplayer.player="minplayer",a.options.file.player="minplayer",a.loadPlayer()):a.showError(c)}}(this)),a.ubind(this.uuid+":fullscreen",function(a){return function(){a.resize()}}(this))},minplayer.prototype.addEvents=function(){var a=!1;this.display.bind("mouseenter",function(b){return function(){a=!0,b.setFocus(!0)}}(this)),this.display.bind("mouseleave",function(b){return function(){a=!1,b.setFocus(!1)}}(this));var b=!1;this.display.bind("mousemove",function(c){return function(){b||(b=setTimeout(function(){b=!1,a&&c.setFocus(!0)},300))}}(this)),minplayer.get.call(this,this.options.id,null,function(a){return function(b){a.bindTo(b)}}(this))},minplayer.prototype.showError=function(a){"object"!=typeof a&&(a=a||"",this.elements.error&&(this.elements.error.text(a),a?(this.elements.error.show(),setTimeout(function(a){return function(){a.elements.error.hide("slow")}}(this),5e3)):this.elements.error.hide()))},minplayer.prototype.addKeyEvents=function(){jQuery(document).bind("keydown",function(a){return function(b){switch(b.keyCode){case 113:case 27:a.isFullScreen()&&a.fullscreen(!1)}}}(this))},minplayer.prototype.getFiles=function(){if(this.options.files)return this.options.files;if(this.options.file)return this.options.file;var a=[],b=null;return this.elements.media&&(b=this.elements.media.attr("src"),b&&a.push({path:b}),jQuery("source",this.elements.media).each(function(){a.push({path:jQuery(this).attr("src"),mimetype:jQuery(this).attr("type"),codecs:jQuery(this).attr("codecs")})})),a},minplayer.getMediaFile=function(a){if(!a)return null;if("string"==typeof a||a.path||a.id)return new minplayer.file(a);var b=0,c=null,d=null;for(var e in a)a.hasOwnProperty(e)&&(d=new minplayer.file(a[e]),d.player&&d.priority>b&&(b=d.priority,c=d));return c},minplayer.prototype.loadPlayer=function(){if(!this.options.file||0===this.elements.display.length)return!1;if(!this.options.file.player)return!1;this.showError();var a=this.options.file.player.toString();if(!this.media||a!==this.currentPlayer){if(this.currentPlayer=a,!this.elements.display)return void this.showError("No media display found.");var b={};return this.media&&(b=this.media.queue,this.media.destroy()),pClass=minplayer.players[this.options.file.player],this.options.mediaelement=this.elements.media,this.media=new pClass(this.elements.display,this.options,b),this.media.load(this.options.file),this.display.addClass("minplayer-player-"+this.media.mediaFile.player),!0}return this.media?(this.media.options=this.options,this.display.removeClass("minplayer-player-"+this.media.mediaFile.player),this.media.load(this.options.file),this.display.addClass("minplayer-player-"+this.media.mediaFile.player),!1):void 0},minplayer.prototype.load=function(a){return this.options.files=a||this.options.files,this.options.file=minplayer.getMediaFile(this.options.files),this.loadPlayer()?(this.bindTo(this.media),this.options.file.mimetype&&!this.options.file.player?(this.showError("Cannot play media: "+this.options.file.mimetype),!1):!0):!1},minplayer.prototype.resize=function(){this.get(function(a){a.onResize&&a.onResize()})};var minplayer=minplayer||{};minplayer.image=function(a,b){this.loaded=!1,this.loader=null,this.ratio=0,this.img=null,minplayer.display.call(this,"image",a,b)},minplayer.image.prototype=new minplayer.display,minplayer.image.prototype.constructor=minplayer.image,minplayer.image.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.options.pluginName="image",this.display.css("overflow","hidden"),this.loader=new Image,this.loader.onload=function(a){return function(){a.loaded=!0,a.ratio=a.loader.width/a.loader.height,a.resize(),a.trigger("loaded")}}(this),this.ready()},minplayer.image.prototype.load=function(a){this.clear(function(){this.display.empty(),this.img=jQuery(document.createElement("img")).attr({src:""}).hide(),this.display.append(this.img),this.loader.src=a,this.img.attr("src",a)})},minplayer.image.prototype.clear=function(a){this.loaded=!1,this.img?this.img.fadeOut(150,function(b){return function(){b.img.attr("src",""),b.loader.src="",jQuery(this).remove(),a&&a.call(b)}}(this)):a&&a.call(this)},minplayer.image.prototype.resize=function(a,b){if(a=a||this.display.parent().width(),b=b||this.display.parent().height(),a&&b&&this.loaded){var c=this.getScaledRect(this.ratio,{width:a,height:b});this.img&&this.img.attr("src",this.loader.src).css({marginLeft:c.x,marginTop:c.y,width:c.width,height:c.height}),this.img.fadeIn(150)}},minplayer.image.prototype.onResize=function(){this.resize()};var minplayer=minplayer||{};minplayer.file=function(a){return a?(a="string"==typeof a?{path:a}:a,a.hasOwnProperty("isMinPlayerFile")?a:(this.isMinPlayerFile=!0,this.duration=a.duration||0,this.bytesTotal=a.bytesTotal||0,this.quality=a.quality||0,this.stream=a.stream||"",this.path=a.path||"",this.codecs=a.codecs||"",this.extension=a.extension||this.getFileExtension(),this.mimetype=a.mimetype||a.filemime||this.getMimeType(),this.type=a.type||this.getType(),this.type||(this.mimetype=this.getMimeType(),this.type=this.getType()),this.player=minplayer.player||a.player||this.getBestPlayer(),this.priority=a.priority||this.getPriority(),this.id=a.id||this.getId(),void(this.path||(this.path=this.id)))):null},minplayer.player="",minplayer.file.prototype.getBestPlayer=function(){var a=null,b=0;return jQuery.each(minplayer.players,function(c){return function(d,e){var f=e.getPriority(c);e.canPlay(c)&&f>b&&(a=d,b=f)}}(this)),a},minplayer.file.prototype.getPriority=function(){var a=1;switch(this.player&&(a=minplayer.players[this.player].getPriority(this)),this.mimetype){case"video/x-webm":case"video/webm":case"application/octet-stream":case"application/vnd.apple.mpegurl":return 10*a;case"video/mp4":case"audio/mp4":case"audio/mpeg":return 9*a;case"video/ogg":case"audio/ogg":case"video/quicktime":return 8*a;default:return 5*a}},minplayer.file.prototype.getFileExtension=function(){return this.path.substring(this.path.lastIndexOf(".")+1).toLowerCase()},minplayer.file.prototype.getMimeType=function(){switch(this.extension){case"mp4":case"m4v":case"flv":case"f4v":return"video/mp4";case"m3u8":return"application/vnd.apple.mpegurl";case"webm":return"video/webm";case"ogg":case"ogv":return"video/ogg";case"3g2":return"video/3gpp2";case"3gpp":case"3gp":return"video/3gpp";case"mov":return"video/quicktime";case"swf":return"application/x-shockwave-flash";case"oga":return"audio/ogg";case"mp3":return"audio/mpeg";case"m4a":case"f4a":return"audio/mp4";case"aac":return"audio/aac";case"wav":return"audio/vnd.wave";case"wma":return"audio/x-ms-wma";default:return"unknown"}},minplayer.file.prototype.getType=function(){var a=this.mimetype.match(/([^\/]+)(\/)/);if(a=a&&a.length>1?a[1]:"","video"===a)return"video";if("audio"===a)return"audio";switch(this.mimetype){case"application/octet-stream":case"application/x-shockwave-flash":case"application/vnd.apple.mpegurl":return"video"}return""},minplayer.file.prototype.getId=function(){var a=minplayer.players[this.player];return a&&a.getMediaId?a.getMediaId(this):""};var minplayer=minplayer||{};minplayer.playLoader=function(a,b){this.clear(),minplayer.display.call(this,"playLoader",a,b)},minplayer.playLoader.prototype=new minplayer.display,minplayer.playLoader.prototype.constructor=minplayer.playLoader,minplayer.playLoader.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.options.pluginName="playLoader",this.initializePlayLoader(),this.ready()},minplayer.playLoader.prototype.initializePlayLoader=function(){this.get("media",function(a){if(a.hasPlayLoader(this.options.preview))this.enabled=!1,this.hide(this.elements.busy),this.hide(this.elements.bigPlay),this.hide(this.elements.preview),this.hide();else{this.enabled=!0,this.options.preview||(this.options.preview=a.poster);var b=!0;this.preview&&this.preview.loader&&(b=this.preview.loader.src!==this.options.preview),b&&(a.elements.media.attr("poster",""),this.loadPreview()),this.elements.bigPlay&&minplayer.click(this.elements.bigPlay.unbind(),function(b){b.preventDefault(),jQuery(this).hide(),a.play()}),a.ubind(this.uuid+":loadstart",function(a){return function(){a.busy.setFlag("media",!0),a.bigPlay.setFlag("media",!0),a.previewFlag.setFlag("media",!0),a.checkVisibility()}}(this)),a.ubind(this.uuid+":waiting",function(a){return function(b,c,d){d||(a.busy.setFlag("media",!0),a.checkVisibility())}}(this)),a.ubind(this.uuid+":loadeddata",function(a){return function(b,c,d){d||(a.busy.setFlag("media",!1),a.checkVisibility())}}(this)),a.ubind(this.uuid+":playing",function(b){return function(c,d,e){e||(b.busy.setFlag("media",!1),b.bigPlay.setFlag("media",!1),"audio"!==a.mediaFile.type&&b.previewFlag.setFlag("media",!1),b.checkVisibility())}}(this)),a.ubind(this.uuid+":pause",function(a){return function(b,c,d){d||(a.busy.setFlag("media",!1),a.bigPlay.setFlag("media",!0),a.checkVisibility())}}(this))}})},minplayer.playLoader.prototype.clear=function(a){this.busy=new minplayer.flags,this.bigPlay=new minplayer.flags,this.previewFlag=new minplayer.flags,this.enabled=!0,this.preview?this.preview.clear(function(b){return function(){b.preview=null,a&&a()}}(this)):(this.preview=null,a&&a())},minplayer.playLoader.prototype.loadPreview=function(a){if(a=a||this.options.preview,this.options.preview=a,this.enabled&&0!==this.display.length){if(this.elements.preview){if(this.options.preview)return this.elements.preview.addClass("has-preview").show(),this.preview=new minplayer.image(this.elements.preview,this.options),this.preview.load(this.options.preview),!0;this.elements.preview.hide()}return!1}},minplayer.playLoader.prototype.checkVisibility=function(){this.enabled&&(this.busy.flag?this.elements.busy.show():this.elements.busy.hide(),this.bigPlay.flag?this.elements.bigPlay.show():this.elements.bigPlay.hide(),this.previewFlag.flag?this.elements.preview.show():this.elements.preview.hide(),(this.bigPlay.flag||this.busy.flag||this.previewFlag.flag)&&this.display.show(),this.bigPlay.flag||this.busy.flag||this.previewFlag.flag||this.display.hide())};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.base=function(a,b,c){minplayer.display.call(this,"media",a,b,c)},minplayer.players.base.prototype=new minplayer.display,minplayer.players.base.prototype.constructor=minplayer.players.base,minplayer.players.base.prototype.getElements=function(){var a=minplayer.display.prototype.getElements.call(this);return jQuery.extend(a,{media:this.options.mediaelement})},minplayer.players.base.prototype.defaultOptions=function(a){a.range={min:0,max:0},minplayer.display.prototype.defaultOptions.call(this,a)},minplayer.players.base.getPriority=function(){return 0},minplayer.players.base.getMediaId=function(){return""},minplayer.players.base.canPlay=function(){return!1},minplayer.players.base.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.elements.media&&(this.poster=this.elements.media.attr("poster")),this.options.pluginName="basePlayer",this.readyQueue=[],this.loadedQueue=[],this.mediaFile=this.options.file,this.clear(),this.setupPlayer()},minplayer.players.base.prototype.setupPlayer=function(){this.playerFound()||this.addPlayer(),this.player=this.getPlayer(),minplayer.click(this.display,function(a){return function(){a.playing?a.pause():a.play()}}(this)),jQuery(document).bind("keydown",function(a){return function(b){if(a.hasFocus)switch(b.preventDefault(),b.keyCode){case 32:case 179:a.playing?a.pause():a.play();break;case 38:a.setVolumeRelative(.1);break;case 40:a.setVolumeRelative(-.1);break;case 37:case 227:a.seekRelative(-.05);break;case 39:case 228:a.seekRelative(.05)}}}(this))},minplayer.players.base.prototype.addPlayer=function(){this.elements.media&&this.elements.media.remove(),this.elements.media=jQuery(this.createPlayer()),this.display.html(this.elements.media)},minplayer.players.base.prototype.destroy=function(){minplayer.plugin.prototype.destroy.call(this),this.clear()},minplayer.players.base.prototype.clear=function(){this.playerReady=!1,this.reset(),this.player&&(jQuery(this.player).remove(),this.player=null)},minplayer.players.base.prototype.reset=function(){this.realDuration=0,this.duration=new minplayer.async,this.currentTime=new minplayer.async,this.bytesLoaded=new minplayer.async,this.bytesTotal=new minplayer.async,this.bytesStart=new minplayer.async,this.volume=new minplayer.async,this.hasFocus=!1,this.playing=!1,this.loading=!1,this.loaded=!1,this.trigger("pause",null,!0),this.trigger("waiting",null,!0),this.trigger("progress",{loaded:0,total:0,start:0},!0),this.trigger("timeupdate",{currentTime:0,duration:0},!0)},minplayer.players.base.prototype.onReady=function(){if(!this.playerReady)if(this.setStartStop(),this.playerReady=!0,this.setVolume(this.options.volume/100),this.loading=!0,this.poll("progress",function(a){return function(){return a.loading&&a.getBytesLoaded(function(b){a.getBytesTotal(function(c){if(b||c){var d=0;a.getBytesStart(function(a){d=a}),a.trigger("progress",{loaded:b,total:c,start:d}),b>=c&&(a.loading=!1)}})}),a.loading}}(this),1e3),this.ready(),this.isReady()){for(var a in this.readyQueue)this.readyQueue[a].call(this);this.readyQueue.length=0,this.readyQueue=[],this.loaded||this.trigger("loadstart")}else this.readyQueue.length=0,this.readyQueue=[]},minplayer.players.base.prototype.parseTime=function(a){var b=0,c=0,d=0;return a?("string"!=typeof a&&(a=String(a)),b=a.match(/([0-9]+)s/i),b&&(b=parseInt(b[1],10)),c=a.match(/([0-9]+)m/i),c&&(b+=60*parseInt(c[1],10)),d=a.match(/([0-9]+)h/i),d&&(b+=3600*parseInt(d[1],10)),b||(b=a),Number(b)):0},minplayer.players.base.prototype.setStartStop=function(){return this.startTime?this.startTime:(this.startTime=0,this.offsetTime=this.parseTime(this.options.range.min),minplayer.urlVars&&(this.startTime=this.parseTime(minplayer.urlVars.seek)),this.startTime||(this.startTime=this.offsetTime),this.stopTime=this.options.range.max?this.parseTime(this.options.range.max):0,this.mediaRange=this.stopTime-this.offsetTime,this.mediaRange<0&&(this.mediaRange=0),this.startTime)},minplayer.players.base.prototype.onPlaying=function(){if(!this.playing){var a=this;this.getDuration(function(b){a.startTime&&a.startTime-1&&1>a?(c/d+parseFloat(a))*d:c+parseFloat(a),b.seek(e)}})}}(this))},minplayer.players.base.prototype.seek=function(a,b,c){this.whenLoaded(function(){a=Number(a),c||(a+=this.offsetTime),this._seek(a),b&&b.call(this)})},minplayer.players.base.prototype._seek=function(){},minplayer.players.base.prototype.setVolumeRelative=function(a){this.getVolume(function(b){return function(c){c+=parseFloat(a),c=0>c?0:c,c=c>1?1:c,b.setVolume(c)}}(this))},minplayer.players.base.prototype.setVolume=function(a,b){this.trigger("volumeupdate",a),this.whenLoaded(b)},minplayer.players.base.prototype.getValue=function(a,b,c){this.whenLoaded(function(){var d=this;this[a](function(a){null!==a?c.call(d,a):d[b].get(c)})})},minplayer.players.base.prototype.getVolume=function(a){this.getValue("_getVolume","volume",a)},minplayer.players.base.prototype._getVolume=function(a){a(null)},minplayer.players.base.prototype.getCurrentTime=function(a){var b=this;this.getValue("_getCurrentTime","currentTime",function(c){b.setStartStop(),b.stopTime&&c>b.stopTime&&b.stop(function(){b.onComplete()}),c-=b.offsetTime,a(c)})},minplayer.players.base.prototype._getCurrentTime=function(a){a(null)},minplayer.players.base.prototype.getDuration=function(a){if(this.options.duration)a(this.options.duration);else{var b=this;this.getValue("_getDuration","duration",function(c){b.setStartStop(),b.realDuration=c,a(b.mediaRange?b.mediaRange:c) +})}},minplayer.players.base.prototype._getDuration=function(a){a(null)},minplayer.players.base.prototype.getBytesStart=function(a){this.getValue("_getBytesStart","bytesStart",a)},minplayer.players.base.prototype._getBytesStart=function(a){a(null)},minplayer.players.base.prototype.getBytesLoaded=function(a){this.getValue("_getBytesLoaded","bytesLoaded",a)},minplayer.players.base.prototype._getBytesLoaded=function(a){a(null)},minplayer.players.base.prototype.getBytesTotal=function(a){this.getValue("_getBytesTotal","bytesTotal",a)},minplayer.players.base.prototype._getBytesTotal=function(a){a(null)};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.dailymotion=function(a,b,c){this.quality="default",minplayer.players.base.call(this,a,b,c)},minplayer.players.dailymotion.prototype=new minplayer.players.base,minplayer.players.dailymotion.prototype.constructor=minplayer.players.dailymotion,minplayer.players.dailymotion.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="dailymotion"},minplayer.players.dailymotion.getPriority=function(){return 10},minplayer.players.dailymotion.canPlay=function(a){if("video/dailymotion"===a.mimetype)return!0;var b=/^http(s)?\:\/\/(www\.)?(dailymotion\.com)/i;return 0===a.path.search(b)},minplayer.players.dailymotion.getMediaId=function(a){var b="^http[s]?\\:\\/\\/(www\\.)?";b+="(dailymotion\\.com\\/video/)",b+="([a-z0-9\\-]+)",b+="_*";var c=RegExp(b,"i");return 0===a.path.search(c)?a.path.match(c)[3]:a.path},minplayer.players.dailymotion.getImage=function(a,b,c){c("http://www.dailymotion.com/thumbnail/video/"+a.id)},minplayer.players.dailymotion.parseNode=function(){return{title:node.title,description:node.description,mediafiles:{image:{thumbnail:{path:node.thumbnail_small_url},image:{path:node.thumbnail_url}},media:{media:{player:"dailymotion",id:node.id}}}}},minplayer.players.dailymotion.getNode=function(a,b){var c="https://api.dailymotion.com/video/"+a.id;c+="?fields=title,id,description,thumbnail_small_url,thumbnail_url",jQuery.get(c,function(a){b(minplayer.players.dailymotion.parseNode(a.data))},"jsonp")},minplayer.players.dailymotion.prototype.onReady=function(){minplayer.players.base.prototype.onReady.call(this),this.options.autoplay||this.pause(),this.onLoaded()},minplayer.players.dailymotion.prototype.playerFound=function(){return this.display.find(this.mediaFile.type).length>0},minplayer.players.dailymotion.prototype.onQualityChange=function(a){this.quality=a.data},minplayer.players.dailymotion.prototype.hasPlayLoader=function(a){return minplayer.hasTouch||!a},minplayer.players.dailymotion.prototype.hasController=function(){return minplayer.isIDevice},minplayer.players.dailymotion.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a=document.location.protocol;if(a+="//api.dmcdn.net/all.js",0===jQuery('script[src="'+a+'"]').length){var b=document.createElement("script");b.src=a;var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(b,c)}return this.playerId=this.options.id+"-player",this.poll(this.options.id+"_dailymotion",function(a){return function(){var b=jQuery("#"+a.playerId).length>0;if(b=b&&"DM"in window,b=b&&"function"==typeof DM.player){jQuery("#"+a.playerId).addClass("dailymotion-player");var c={};c={id:a.playerId,api:minplayer.isIDevice?0:1,wmode:"opaque",controls:minplayer.isAndroid?1:0,related:0,info:0,logo:0},a.player=new DM.player(a.playerId,{video:a.mediaFile.id,height:"100%",width:"100%",frameborder:0,params:c}),a.player.addEventListener("apiready",function(){a.onReady(a)}),a.player.addEventListener("ended",function(){a.onComplete(a)}),a.player.addEventListener("playing",function(){a.onPlaying(a)}),a.player.addEventListener("progress",function(){a.onWaiting(a)}),a.player.addEventListener("pause",function(){a.onPaused(a)}),a.player.addEventListener("error",function(){a.onError(a)})}return!b}}(this),200),jQuery(document.createElement("div")).attr({id:this.playerId})},minplayer.players.dailymotion.prototype.load=function(a,b){minplayer.players.base.prototype.load.call(this,a,function(){this.player.load(a.id),b&&b.call(this)})},minplayer.players.dailymotion.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.onWaiting(),this.player.play(),a&&a.call(this)})},minplayer.players.dailymotion.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.loaded&&(this.player.pause(),a&&a.call(this))})},minplayer.players.dailymotion.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.pause(),a&&a.call(this)})},minplayer.players.dailymotion.prototype._seek=function(a){this.onWaiting(),this.player.seek(a)},minplayer.players.dailymotion.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.loaded&&(this.player.setVolume(a),void 0!==b&&b.call(this))})},minplayer.players.dailymotion.prototype._getVolume=function(a){a(this.player.volume)},minplayer.players.dailymotion.prototype._getDuration=function(a){a(this.player.duration)},minplayer.players.dailymotion.prototype._getCurrentTime=function(a){a(this.player.currentTime)};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.html5=function(a,b,c){minplayer.players.base.call(this,a,b,c)},minplayer.players.html5.prototype=new minplayer.players.base,minplayer.players.html5.prototype.constructor=minplayer.players.html5,minplayer.players.html5.getPriority=function(){return 10},minplayer.players.html5.canPlay=function(a){switch(a.mimetype){case"video/ogg":return!!minplayer.playTypes.videoOGG;case"video/mp4":case"video/x-mp4":case"video/m4v":case"video/x-m4v":return!!minplayer.playTypes.videoH264;case"application/vnd.apple.mpegurl":return!!minplayer.playTypes.videoMPEGURL;case"video/x-webm":case"video/webm":case"application/octet-stream":return!!minplayer.playTypes.videoWEBM;case"audio/ogg":return!!minplayer.playTypes.audioOGG;case"audio/mpeg":return!!minplayer.playTypes.audioMP3;case"audio/mp4":return!!minplayer.playTypes.audioMP4;default:return!1}},minplayer.players.html5.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="html5",this.hasEnded=!1,this.addPlayerEvents()},minplayer.players.html5.prototype.addPlayerEvent=function(a,b){this.player&&this.player.addEventListener(a,function(c){var d=a+"Event";return c[d]&&c.player.removeEventListener(a,c[d],!1),c[d]=function(a){b.call(c,a)},c[d]}(this),!1)},minplayer.players.html5.prototype.addPlayerEvents=function(){if(this.player){this.addPlayerEvent("abort",function(){this.trigger("abort")}),this.addPlayerEvent("loadstart",function(){this.onReady(),this.options.autoload||this.onLoaded()}),this.addPlayerEvent("loadeddata",function(){this.onLoaded()}),this.addPlayerEvent("loadedmetadata",function(){this.onLoaded()}),this.addPlayerEvent("canplaythrough",function(){this.onLoaded()}),this.addPlayerEvent("ended",function(){this.hasEnded=!0,this.onComplete()}),this.addPlayerEvent("pause",function(){this.onPaused()}),this.addPlayerEvent("play",function(){this.onPlaying()}),this.addPlayerEvent("playing",function(){this.onPlaying()});var a=!1;return this.addPlayerEvent("error",function(){this.hasEnded||a||!this.player||(a=!0,this.trigger("error","An error occured - "+this.player.error.code))}),this.addPlayerEvent("waiting",function(){this.onWaiting()}),this.addPlayerEvent("durationchange",function(){if(this.player){this.duration.set(this.player.duration);var a=this;this.getDuration(function(b){a.trigger("durationchange",{duration:b})})}}),this.addPlayerEvent("progress",function(a){this.bytesTotal.set(a.total),this.bytesLoaded.set(a.loaded)}),!0}return!1},minplayer.players.html5.prototype.onReady=function(){minplayer.players.base.prototype.onReady.call(this),minplayer.isAndroid&&this.onLoaded(),minplayer.isIDevice&&setTimeout(function(a){return function(){a.pause(),a.onLoaded()}}(this),1)},minplayer.players.html5.prototype.playerFound=function(){return this.display.find(this.mediaFile.type).length>0},minplayer.players.html5.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a=jQuery(document.createElement(this.mediaFile.type)).attr(this.options.attributes).append(jQuery(document.createElement("source")).attr({src:this.mediaFile.path}));a.eq(0)[0].setAttribute("width","100%"),a.eq(0)[0].setAttribute("height","100%");var b=this.options.autoload?"metadata":"none";return b=minplayer.isIDevice?"metadata":b,a.eq(0)[0].setAttribute("preload",b),this.options.autoload||a.eq(0)[0].setAttribute("autobuffer",!1),a},minplayer.players.html5.prototype.getPlayer=function(){return this.elements.media.eq(0)[0]},minplayer.players.html5.prototype.load=function(a,b){minplayer.players.base.prototype.load.call(this,a,function(){this.hasEnded=!1;var c=this.elements.media.attr("src");c||(c=jQuery("source",this.elements.media).eq(0).attr("src")),c!==a.path&&(this.addPlayer(),this.player=this.getPlayer(),this.addPlayerEvents(),this.player.src=a.path,b&&b.call(this))})},minplayer.players.html5.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.player.play(),a&&a.call(this)})},minplayer.players.html5.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.player.pause(),a&&a.call(this)})},minplayer.players.html5.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.pause(),a&&a.call(this)})},minplayer.players.html5.prototype.clear=function(){minplayer.players.base.prototype.clear.call(this),this.player&&(this.player.src="")},minplayer.players.html5.prototype._seek=function(a){this.player.currentTime=a},minplayer.players.html5.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.player.volume=a,b&&b.call(this)})},minplayer.players.html5.prototype._getVolume=function(a){a(this.player.volume)},minplayer.players.html5.prototype._getDuration=function(a){a(this.player.duration)},minplayer.players.html5.prototype._getCurrentTime=function(a){a(this.player.currentTime)},minplayer.players.html5.prototype._getBytesLoaded=function(a){var b=0;this.bytesLoaded.value?b=this.bytesLoaded.value:this.player.buffered&&this.player.buffered.length>0&&this.player.buffered.end&&this.player.duration?b=this.player.buffered.end(0):void 0!==this.player.bytesTotal&&this.player.bytesTotal>0&&void 0!==this.player.bufferedBytes&&(b=this.player.bufferedBytes),a(b)},minplayer.players.html5.prototype._getBytesTotal=function(a){var b=0;this.bytesTotal.value?b=this.bytesTotal.value:this.player.buffered&&this.player.buffered.length>0&&this.player.buffered.end&&this.player.duration?b=this.player.duration:void 0!==this.player.bytesTotal&&this.player.bytesTotal>0&&void 0!==this.player.bufferedBytes&&(b=this.player.bytesTotal),a(b)};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.flash=function(a,b,c){minplayer.players.base.call(this,a,b,c)},minplayer.players.flash.prototype=new minplayer.players.base,minplayer.players.flash.prototype.constructor=minplayer.players.flash,minplayer.players.flash.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="flash"},minplayer.players.flash.getPriority=function(){return 0},minplayer.players.flash.canPlay=function(){return!1},minplayer.players.flash.prototype.getFlash=function(a){var b=document.createElement("script");b.src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js";var c=document.getElementsByTagName("script")[0];return c.parentNode.insertBefore(b,c),setTimeout(function(b){return function c(){"undefined"!=typeof swfobject?swfobject.embedSWF(a.swf,a.id,a.width,a.height,"9.0.0",!1,a.flashvars,{allowscriptaccess:"always",allowfullscreen:"true",wmode:a.wmode,quality:"high"},{id:a.id,name:a.id,playerType:"flash"},function(a){b.player=a.ref}):setTimeout(c,200)}}(this),200),'
'},minplayer.players.flash.prototype.playerFound=function(){return this.display.find('object[playerType="flash"]').length>0};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.minplayer=function(a,b,c){minplayer.players.flash.call(this,a,b,c)},minplayer.players.minplayer.prototype=new minplayer.players.flash,minplayer.players.minplayer.prototype.constructor=minplayer.players.minplayer,minplayer.players.minplayer.prototype.construct=function(){minplayer.players.flash.prototype.construct.call(this),this.options.pluginName="minplayer"},window.onFlashPlayerReady=function(a){for(var b=minplayer.get(a,"media"),c=b.length;c--;)b[c].onReady()},window.onFlashPlayerUpdate=function(a,b){for(var c=minplayer.get(a,"media"),d=c.length;d--;)c[d].onMediaUpdate(b)},window.onFlashPlayerDebug=function(a){console&&console.log&&console.log(a)},minplayer.players.minplayer.getPriority=function(a){return a.stream?100:1},minplayer.players.minplayer.canPlay=function(a){if(a.stream)return!0;var b=jQuery.inArray(a.mimetype,["video/x-webm","video/webm","application/octet-stream"])>=0;return!b&&("video"===a.type||"audio"===a.type)},minplayer.players.minplayer.prototype.createPlayer=function(){this.options.swfplayer||(this.options.swfplayer="http://mediafront.org/assets/osmplayer/minplayer",this.options.swfplayer+="/flash/minplayer.swf"),minplayer.players.flash.prototype.createPlayer.call(this);var a={id:this.options.id,debug:this.options.debug,config:"nocontrols",file:this.mediaFile.path,autostart:this.options.autoplay,autoload:this.options.autoload};return this.mediaFile.stream&&(a.stream=this.mediaFile.stream),this.getFlash({swf:this.options.swfplayer,id:this.options.id+"_player",width:"100%",height:"100%",flashvars:a,wmode:this.options.wmode})},minplayer.players.minplayer.prototype.onMediaUpdate=function(a){switch(a){case"mediaMeta":this.onLoaded();break;case"mediaConnected":this.onLoaded(),this.onPaused();break;case"mediaPlaying":this.onPlaying();break;case"mediaPaused":this.onPaused();break;case"mediaComplete":this.onComplete()}},minplayer.players.minplayer.prototype.load=function(a,b){minplayer.players.flash.prototype.load.call(this,a,function(){this.loaded?this.stop(function(){this.player.loadMedia(a.path,a.stream),b&&b.call(this)}):(this.player.loadMedia(a.path,a.stream),b&&b.call(this))})},minplayer.players.minplayer.prototype.play=function(a){minplayer.players.flash.prototype.play.call(this,function(){this.player.playMedia(),a&&a.call(this)})},minplayer.players.minplayer.prototype.pause=function(a){minplayer.players.flash.prototype.pause.call(this,function(){this.player.pauseMedia(),a&&a.call(this)})},minplayer.players.minplayer.prototype.stop=function(a){minplayer.players.flash.prototype.stop.call(this,function(){this.player.stopMedia(),a&&a.call(this)})},minplayer.players.minplayer.prototype._seek=function(a){this.player.seekMedia(a)},minplayer.players.minplayer.prototype.setVolume=function(a,b){minplayer.players.flash.prototype.setVolume.call(this,a,function(){this.player.setVolume(a),b&&b.call(this)})},minplayer.players.minplayer.prototype._getVolume=function(a){a(this.player.getVolume())},minplayer.players.minplayer.prototype._getDuration=function(a){var b=this,c=0,d=function(){c=b.player.getDuration(),c?a(c):setTimeout(d,1e3)};d()},minplayer.players.minplayer.prototype._getCurrentTime=function(a){a(this.player.getCurrentTime())},minplayer.players.minplayer.prototype._getBytesLoaded=function(a){a(this.player.getMediaBytesLoaded())},minplayer.players.minplayer.prototype._getBytesTotal=function(a){a(this.player.getMediaBytesTotal())};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.youtube=function(a,b,c){this.quality="default",minplayer.players.base.call(this,a,b,c)},minplayer.players.youtube.prototype=new minplayer.players.base,minplayer.players.youtube.prototype.constructor=minplayer.players.youtube,minplayer.players.youtube.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="youtube"},minplayer.players.youtube.getPriority=function(){return 10},minplayer.players.youtube.canPlay=function(a){if("video/youtube"===a.mimetype)return!0;var b=/^http(s)?\:\/\/(www\.)?(youtube\.com|youtu\.be)/i;return 0===a.path.search(b)},minplayer.players.youtube.getMediaId=function(a){var b="^http[s]?\\:\\/\\/(www\\.)?";b+="(youtube\\.com\\/watch\\?v=|youtu\\.be\\/)",b+="([a-zA-Z0-9_\\-]+)";var c=RegExp(b,"i");return 0===a.path.search(c)?a.path.match(c)[3]:a.path},minplayer.players.youtube.getImage=function(a,b,c){b="thumbnail"===b?"1":"0",c("https://img.youtube.com/vi/"+a.id+"/"+b+".jpg")},minplayer.players.youtube.parseNode=function(a){var b="undefined"!=typeof a.video?a.video:a;return{title:b.title,description:b.description,mediafiles:{image:{thumbnail:{path:b.thumbnail.sqDefault},image:{path:b.thumbnail.hqDefault}},media:{media:{player:"youtube",id:b.id}}}}},minplayer.players.youtube.getNode=function(a,b){var c="https://gdata.youtube.com/feeds/api/videos/"+a.id;c+="?v=2&alt=jsonc",jQuery.get(c,function(a){b(minplayer.players.youtube.parseNode(a.data))})},minplayer.players.youtube.prototype.setPlayerState=function(a){switch(a){case YT.PlayerState.CUED:break;case YT.PlayerState.BUFFERING:this.onWaiting();break;case YT.PlayerState.UNSTARTED:case YT.PlayerState.PAUSED:this.onPaused();break;case YT.PlayerState.PLAYING:this.onPlaying();break;case YT.PlayerState.ENDED:this.onComplete()}},minplayer.players.youtube.prototype.onReady=function(){minplayer.players.base.prototype.onReady.call(this),this.options.autoplay||this.pause(),this.onLoaded()},minplayer.players.youtube.prototype.playerFound=function(){var a="iframe#"+this.options.id+"-player.youtube-player",b=this.display.find(a);return b.length>0},minplayer.players.youtube.prototype.onPlayerStateChange=function(a){this.setPlayerState(a.data)},minplayer.players.youtube.prototype.onQualityChange=function(a){this.quality=a.data},minplayer.players.youtube.prototype.hasPlayLoader=function(a){return minplayer.hasTouch||!a},minplayer.players.youtube.prototype.hasController=function(){return minplayer.isIDevice},minplayer.players.youtube.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a="https://www.youtube.com/iframe_api";if(0===jQuery('script[src="'+a+'"]').length){var b=document.createElement("script");b.src=a;var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(b,c)}return this.playerId=this.options.id+"-player",this.poll(this.options.id+"_youtube",function(a){return function(){var b=jQuery("#"+a.playerId).length>0;if(b=b&&"YT"in window,b=b&&"function"==typeof YT.Player){jQuery("#"+a.playerId).addClass("youtube-player");var c=location.protocol;c+="//"+location.hostname,c+=location.port&&":"+location.port;var d={};minplayer.isIDevice?d.origin=c:d={enablejsapi:minplayer.isIDevice?0:1,origin:c,wmode:"opaque",controls:minplayer.isAndroid?1:0,rel:0,showinfo:0},a.player=new YT.Player(a.playerId,{height:"100%",width:"100%",frameborder:0,videoId:a.mediaFile.id,playerVars:d,events:{onReady:function(b){a.onReady(b)},onStateChange:function(b){a.onPlayerStateChange(b)},onPlaybackQualityChange:function(b){a.onQualityChange(b)},onError:function(b){a.onError(b)}}})}return!b}}(this),200),jQuery(document.createElement("div")).attr({id:this.playerId})},minplayer.players.youtube.prototype.load=function(a,b){minplayer.players.base.prototype.load.call(this,a,function(){this.player.loadVideoById(a.id,0,this.quality),b&&b.call(this)})},minplayer.players.youtube.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.onWaiting(),this.player.playVideo(),a&&a.call(this)})},minplayer.players.youtube.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.player.pauseVideo(),a&&a.call(this)})},minplayer.players.youtube.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.stopVideo(),a&&a.call(this)})},minplayer.players.youtube.prototype._seek=function(a){this.onWaiting(),this.player.seekTo(a,!0)},minplayer.players.youtube.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.player.setVolume(100*a),b&&b.call(this)})},minplayer.players.youtube.prototype._getVolume=function(a){a(this.player.getVolume())},minplayer.players.youtube.prototype._getDuration=function(a){a(this.player.getDuration())},minplayer.players.youtube.prototype._getCurrentTime=function(a){a(this.player.getCurrentTime())},minplayer.players.youtube.prototype._getBytesStart=function(a){a(this.player.getVideoStartBytes())},minplayer.players.youtube.prototype._getBytesLoaded=function(a){a(this.player.getVideoBytesLoaded())},minplayer.players.youtube.prototype._getBytesTotal=function(a){a(this.player.getVideoBytesTotal())};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.vimeo=function(a,b,c){minplayer.players.base.call(this,a,b,c)},minplayer.players.vimeo.prototype=new minplayer.players.base,minplayer.players.vimeo.prototype.constructor=minplayer.players.vimeo,minplayer.players.vimeo.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="vimeo"},minplayer.players.vimeo.getPriority=function(){return 10},minplayer.players.vimeo.canPlay=function(a){return"video/vimeo"===a.mimetype?!0:0===a.path.search(/^http(s)?\:\/\/(www\.)?vimeo\.com/i)},minplayer.players.vimeo.prototype.hasPlayLoader=function(){return minplayer.hasTouch},minplayer.players.vimeo.prototype.hasController=function(){return minplayer.hasTouch},minplayer.players.vimeo.getMediaId=function(a){var b=/^http[s]?\:\/\/(www\.)?vimeo\.com\/(\?v\=)?([0-9]+)/i;return 0===a.path.search(b)?a.path.match(b)[3]:a.path},minplayer.players.vimeo.parseNode=function(a){return{title:a.title,description:a.description,mediafiles:{image:{thumbnail:{path:a.thumbnail_small},image:{path:a.thumbnail_large}},media:{media:{player:"vimeo",id:a.id}}}}},minplayer.players.vimeo.nodes={},minplayer.players.vimeo.getNode=function(a,b){minplayer.players.vimeo.nodes.hasOwnProperty(a.id)?b(minplayer.players.vimeo.nodes[a.id]):jQuery.ajax({url:"https://vimeo.com/api/v2/video/"+a.id+".json",dataType:"jsonp",success:function(c){var d=minplayer.players.vimeo.parseNode(c[0]);minplayer.players.vimeo.nodes[a.id]=d,b(d)}})},minplayer.players.vimeo.getImage=function(a,b,c){minplayer.players.vimeo.getNode(a,function(a){c(a.mediafiles.image.image)})},minplayer.players.vimeo.prototype.reset=function(){minplayer.players.base.prototype.reset.call(this)},minplayer.players.vimeo.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a="http://a.vimeocdn.com/js/froogaloop2.min.js";if(0===jQuery('script[src="'+a+'"]').length){var b=document.createElement("script");b.src=a;var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(b,c)}var d=document.createElement("iframe");d.setAttribute("id",this.options.id+"-player"),d.setAttribute("type","text/html"),d.setAttribute("width","100%"),d.setAttribute("height","100%"),d.setAttribute("frameborder","0"),jQuery(d).addClass("vimeo-player");var e="https://player.vimeo.com/video/";return e+=this.mediaFile.id+"?",e+=jQuery.param({wmode:"opaque",api:1,player_id:this.options.id+"-player",title:0,byline:0,portrait:0,loop:this.options.loop}),d.setAttribute("src",e),this.poll(this.options.id+"_vimeo",function(a){return function(){if(window.Froogaloop){a.player=window.Froogaloop(d);var b=0;a.player.addEvent("ready",function(){clearTimeout(b),a.onReady(),a.onError("")}),b=setTimeout(function(){a.onReady()},3e3)}return!window.Froogaloop}}(this),200),this.trigger("loadstart"),d},minplayer.players.vimeo.prototype.onReady=function(){this.player.addEvent("loadProgress",function(a){return function(b){a.duration.set(parseFloat(b.duration)),a.bytesLoaded.set(b.bytesLoaded),a.bytesTotal.set(b.bytesTotal)}}(this)),this.player.addEvent("playProgress",function(a){return function(b){a.duration.set(parseFloat(b.duration)),a.currentTime.set(parseFloat(b.seconds))}}(this)),this.player.addEvent("play",function(a){return function(){a.onPlaying()}}(this)),this.player.addEvent("pause",function(a){return function(){a.onPaused()}}(this)),this.player.addEvent("finish",function(a){return function(){a.onComplete()}}(this)),minplayer.players.base.prototype.onReady.call(this),this.onLoaded(),this.options.autoplay&&this.play()},minplayer.players.vimeo.prototype.clear=function(){this.player&&this.player.api("unload"),minplayer.players.base.prototype.clear.call(this)},minplayer.players.vimeo.prototype.load=function(a,b){minplayer.players.base.prototype.load.call(this,a,function(){this.construct(),b&&b.call(this)})},minplayer.players.vimeo.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.player.api("play"),a&&a.call(this)})},minplayer.players.vimeo.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.player.api("pause"),a&&a.call(this)})},minplayer.players.vimeo.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.api("unload"),a&&a.call(this)})},minplayer.players.vimeo.prototype._seek=function(a){this.player.api("seekTo",a)},minplayer.players.vimeo.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.volume.set(a),this.player.api("setVolume",a),b&&b.call(this)})},minplayer.players.vimeo.prototype._getVolume=function(a){this.player.api("getVolume",function(b){a(b)})},minplayer.players.vimeo.prototype._getDuration=function(a){this.player.api("getDuration",function(b){a(b)})};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.limelight=function(a,b){minplayer.players.flash.call(this,a,b)},minplayer.players.limelight.prototype=new minplayer.players.flash,minplayer.players.limelight.prototype.constructor=minplayer.players.limelight,minplayer.players.limelight.prototype.construct=function(){minplayer.players.flash.prototype.construct.call(this),this.options.pluginName="limelight"},minplayer.players.limelight.getPriority=function(){return 10},minplayer.players.limelight.canPlay=function(a){if("video/limelight"===a.mimetype)return!0;var b=/.*limelight\.com.*/i;return 0===a.path.search(b)},minplayer.players.limelight.getMediaId=function(a){var b=/.*limelight\.com.*mediaId=([a-zA-Z0-9]+)/i;return 0===a.path.search(b)?a.path.match(b)[1]:a.path},minplayer.players.limelight.prototype.register=function(){window.delvePlayerCallback=function(a,b,c){var d=a.replace("-player","");jQuery.each(minplayer.get(d,"media"),function(a,d){d.onMediaUpdate(b,c)})}},minplayer.players.limelight.prototype.onMediaUpdate=function(a,b){switch(a){case"onPlayerLoad":this.onReady();break;case"onMediaLoad":if(this.complete)return this.pause(),void this.onPaused();this.shouldSeek=this.startTime>0,this.onLoaded();break;case"onMediaComplete":this.complete=!0,this.onComplete();break;case"onPlayheadUpdate":!b.positionInMilliseconds||this.playing||this.complete||this.onPlaying(),this.complete=!1,this.shouldSeek&&this.seekValue?(this.shouldSeek=!1,this.seek(this.seekValue)):(this.duration.set(b.durationInMilliseconds/1e3),this.currentTime.set(b.positionInMilliseconds/1e3));break;case"onError":this.onError();break;case"onPlayStateChanged":b.isPlaying?this.onPlaying():b.isBusy?this.onWaiting():this.onPaused()}},minplayer.players.limelight.prototype.createPlayer=function(){minplayer.players.flash.prototype.createPlayer.call(this);var a=document.createElement("script");a.src="https://assets.delvenetworks.com/player/embed.js";var b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b),this.register();var c={deepLink:"true",autoplay:this.options.autoplay?"true":"false",startQuality:"HD"},d=null,e=this.options.channel;e||(d=/.*limelight\.com.*channelId=([a-zA-Z0-9]+)/i,0===this.mediaFile.path.search(d)&&(e=this.mediaFile.path.match(d)[1])),e&&"media"===this.mediaFile.queueType&&(c.adConfigurationChannelId=e);var f=this.options.playerForm;f||(d=/.*limelight\.com.*playerForm=([a-zA-Z0-9]+)/i,0===this.mediaFile.path.search(d)&&(f=this.mediaFile.path.match(d)[1])),f&&(c.playerForm=f),c.mediaId=this.mediaFile.id;var g=this.options.id+"-player";return setTimeout(function h(){window.hasOwnProperty("LimelightPlayerUtil")?window.LimelightPlayerUtil.initEmbed(g):setTimeout(h,1e3)},1e3),this.getFlash({swf:document.location.protocol+"//assets.delvenetworks.com/player/loader.swf",id:g,width:this.options.width,height:"100%",flashvars:c,wmode:this.options.wmode})},minplayer.players.limelight.prototype.play=function(a){minplayer.players.flash.prototype.play.call(this,function(){this.player.doPlay(),a&&a.call(this)})},minplayer.players.limelight.prototype.pause=function(a){minplayer.players.flash.prototype.pause.call(this,function(){this.player.doPause(),a&&a.call(this)})},minplayer.players.limelight.prototype.stop=function(a){minplayer.players.flash.prototype.stop.call(this,function(){this.player.doPause(),a&&a.call(this)})},minplayer.players.limelight.prototype._seek=function(a){this.seekValue=a,this.player.doSeekToSecond(a)},minplayer.players.limelight.prototype.setVolume=function(a,b){minplayer.players.flash.prototype.setVolume.call(this,a,function(){this.player.doSetVolume(a),b&&b.call(this)})},minplayer.players.limelight.prototype._getVolume=function(a){a(this.player.doGetVolume())},minplayer.players.limelight.prototype.search=function(a){this.whenReady(function(){this.player.doSearch(a)})};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.kaltura=function(a,b){minplayer.players.base.call(this,a,b)},minplayer.players.kaltura.prototype=new minplayer.players.base,minplayer.players.kaltura.prototype.constructor=minplayer.players.kaltura,minplayer.players.kaltura.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="kaltura",this.adPlaying=!1},minplayer.players.kaltura.prototype.defaultOptions=function(a){a.entryId=0,a.uiConfId=0,a.partnerId=0,minplayer.players.base.prototype.defaultOptions.call(this,a)},minplayer.players.kaltura.getPriority=function(){return 10},minplayer.players.kaltura.canPlay=function(a){if("video/kaltura"===a.mimetype)return!0;var b=/.*kaltura\.com.*/i;return 0===a.path.search(b)},minplayer.players.kaltura.prototype.adStart=function(){this.adPlaying=!0,this.onPlaying()},minplayer.players.kaltura.prototype.adEnd=function(){this.adPlaying=!1},minplayer.players.kaltura.prototype.playerStateChange=function(a){if(!this.adPlaying)switch(a){case"ready":this.onLoaded();break;case"loading":case"buffering":this.onWaiting();break;case"playing":this.onPlaying();break;case"paused":this.onPaused()}},minplayer.players.kaltura.prototype.mediaReady=function(){this.onLoaded()},minplayer.players.kaltura.prototype.playerPlayEnd=function(){this.onComplete()},minplayer.players.kaltura.prototype.playUpdate=function(a){this.currentTime.set(a)},minplayer.players.kaltura.prototype.durationChange=function(a){this.duration.set(a.newValue)},minplayer.players.kaltura.prototype.getInstance=function(){if(this.instanceName)return this.instanceName;var a=this.uuid.split("__"),b="minplayer.plugins."+a[0];return b+="."+a[1],b+="["+(a[2]-1)+"]",this.instanceName=b,b},minplayer.players.kaltura.prototype.registerEvents=function(){this.player.addJsListener("adStart",this.getInstance()+".adStart"),this.player.addJsListener("adEnd",this.getInstance()+".adEnd"),this.player.addJsListener("playerStateChange",this.getInstance()+".playerStateChange"),this.player.addJsListener("durationChange",this.getInstance()+".durationChange"),this.player.addJsListener("mediaReady",this.getInstance()+".mediaReady"),this.player.addJsListener("playerUpdatePlayhead",this.getInstance()+".playUpdate"),this.player.addJsListener("playerPlayEnd",this.getInstance()+".playerPlayEnd") +},minplayer.players.kaltura.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a={},b=this;jQuery.each(["entryId","uiConfId","partnerId"],function(c,d){if(a[d]="",b.options[d])a[d]=b.options[d];else{var e=null;switch(d){case"entryId":e=/.*kaltura\.com.*entry_id\/([^\/]+)/i;break;case"uiConfId":e=/.*kaltura\.com.*uiconf_id\/([^\/]+)/i;break;case"partnerId":e=/.*kaltura\.com.*wid\/_([^\/]+)/i}e&&(a[d]=b.mediaFile.path.match(e),a[d]&&(a[d]=a[d][1]))}});var c=document.createElement("script");c.src="http://cdnapi.kaltura.com/p/",c.src+=a.partnerId,c.src+="/sp/",c.src+=a.partnerId,c.src+="00/embedIframeJs/uiconf_id/",c.src+=a.uiConfId,c.src+="/partner_id/",c.src+=a.partnerId;var d=document.getElementsByTagName("script")[0];d.parentNode.insertBefore(c,d);var e=this.options.id+"-player";return setTimeout(function f(){window.hasOwnProperty("kWidget")?kWidget.embed({targetId:e,wid:"_"+a.partnerId,uiconf_id:a.uiConfId,entry_id:a.entryId,flashvars:{autoPlay:!1},params:{wmode:"transparent"},readyCallback:function(a){b.player=jQuery("#"+a).get(0),b.registerEvents(),b.onReady()}}):setTimeout(f,1e3)},1e3),'
'},minplayer.players.kaltura.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.player.sendNotification("doPlay"),a&&a.call(this)})},minplayer.players.kaltura.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.player.sendNotification("doPause"),a&&a.call(this)})},minplayer.players.kaltura.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.sendNotification("doStop"),a&&a.call(this)})},minplayer.players.kaltura.prototype._seek=function(a){this.seekValue=a,this.player.sendNotification("doSeek",a)},minplayer.players.kaltura.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.player.sendNotification("changeVolume",a),b&&b.call(this)})};var minplayer=minplayer||{};minplayer.controller=function(a,b){minplayer.display.call(this,"controller",a,b)},minplayer.controller.prototype=new minplayer.display,minplayer.controller.prototype.constructor=minplayer.controller,minplayer.formatTime=function(a){a=a||0;var b=0,c=0,d=0,e="";return d=Math.floor(a/3600),a-=3600*d,c=Math.floor(a/60),a-=60*c,b=Math.floor(a%60),d&&(e+=String(d),e+=":"),e+=c>=10?String(c):"0"+String(c),e+=":",e+=b>=10?String(b):"0"+String(b),{time:e,units:""}},minplayer.controller.prototype.getElements=function(){var a=minplayer.display.prototype.getElements.call(this);return jQuery.extend(a,{play:null,pause:null,fullscreen:null,seek:null,progress:null,volume:null,timer:null})},minplayer.controller.prototype.defaultOptions=function(a){a.disptime=0,minplayer.display.prototype.defaultOptions.call(this,a)},minplayer.controller.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.options.pluginName="controller",this.dragging=!1,this.vol=0,this.elements.seek&&(this.seekBar=this.elements.seek.slider({range:"min",create:function(a){jQuery(".ui-slider-range",a.target).addClass("ui-state-active")}})),this.elements.volume&&(this.volumeBar=this.elements.volume.slider({animate:!0,range:"min",orientation:"vertical"})),this.get("player",function(a){this.elements.fullscreen&&minplayer.click(this.elements.fullscreen.unbind(),function(){a.toggleFullScreen()}).css({pointer:"hand"})}),this.get("media",function(a){a.hasController()?this.hide():(this.elements.pause&&(minplayer.click(this.elements.pause.unbind(),function(b){return function(c){c.preventDefault(),b.playPause(!1,a)}}(this)),a.ubind(this.uuid+":pause",function(a){return function(){a.setPlayPause(!0)}}(this))),this.elements.play&&(minplayer.click(this.elements.play.unbind(),function(b){return function(c){c.preventDefault(),b.playPause(!0,a)}}(this)),a.ubind(this.uuid+":playing",function(a){return function(){a.setPlayPause(!1)}}(this))),this.elements.duration&&(a.ubind(this.uuid+":durationchange",function(a){return function(b,c){var d=a.options.disptime||c.duration;a.setTimeString("duration",d)}}(this)),a.getDuration(function(a){return function(b){b=a.options.disptime||b,a.setTimeString("duration",b)}}(this))),this.elements.progress&&a.ubind(this.uuid+":progress",function(a){return function(b,c){var d=c.total?c.loaded/c.total*100:0;a.elements.progress.width(d+"%")}}(this)),(this.seekBar||this.elements.timer)&&a.ubind(this.uuid+":timeupdate",function(a){return function(b,c){if(!a.dragging){var d=0;c.duration&&(d=c.currentTime/c.duration*100),a.seekBar&&a.seekBar.slider("option","value",d),a.setTimeString("timer",c.currentTime)}}}(this)),this.seekBar&&this.seekBar.slider({start:function(a){return function(){a.dragging=!0}}(this),stop:function(b){return function(c,d){b.dragging=!1,a.getDuration(function(b){a.seek(d.value/100*b)})}}(this),slide:function(b){return function(c,d){a.getDuration(function(c){var e=d.value/100*c;b.dragging||a.seek(e),b.setTimeString("timer",e)})}}(this)}),this.elements.mute&&minplayer.click(this.elements.mute,function(b){return function(c){c.preventDefault();var d=b.volumeBar.slider("option","value");d>0?(b.vol=d,b.volumeBar.slider("option","value",0),a.setVolume(0)):(b.volumeBar.slider("option","value",b.vol),a.setVolume(b.vol/100))}}(this)),this.volumeBar&&(this.volumeBar.slider({slide:function(b,c){a.setVolume(c.value/100)}}),a.ubind(this.uuid+":volumeupdate",function(a){return function(b,c){a.volumeBar.slider("option","value",100*c)}}(this)),a.getVolume(function(a){return function(b){a.volumeBar.slider("option","value",100*b)}}(this))))}),this.ready()},minplayer.controller.prototype.setPlayPause=function(a){var b="";this.elements.play&&(b=a?"inherit":"none",this.elements.play.css("display",b)),this.elements.pause&&(b=a?"none":"inherit",this.elements.pause.css("display",b))},minplayer.controller.prototype.playPause=function(a,b){var c=a?"play":"pause";this.display.trigger(c),this.setPlayPause(!a),b&&b[c]()},minplayer.controller.prototype.setTimeString=function(a,b){this.elements[a]&&this.elements[a].text(minplayer.formatTime(b).time)};var osmplayer = osmplayer || {}; +(function(exports) { +})(osmplayer);// Add a way to instanciate using jQuery prototype. if (!jQuery.fn.osmplayer) { /** @@ -7140,603 +675,6 @@ osmplayer.parser.xsfp = { return playlist; } }; -var osmplayer = osmplayer || {}; -(function(exports) { -/*! - * iScroll Lite base on iScroll v4.1.6 ~ Copyright (c) 2011 Matteo Spinelli, http://cubiq.org - * Released under MIT license, http://cubiq.org/license - */ - -(function(){ -var m = Math, - mround = function (r) { return r >> 0; }, - vendor = (/webkit/i).test(navigator.appVersion) ? 'webkit' : - (/firefox/i).test(navigator.userAgent) ? 'Moz' : - 'opera' in window ? 'O' : '', - - // Browser capabilities - isAndroid = (/android/gi).test(navigator.appVersion), - isIDevice = (/iphone|ipad/gi).test(navigator.appVersion), - isPlaybook = (/playbook/gi).test(navigator.appVersion), - isTouchPad = (/hp-tablet/gi).test(navigator.appVersion), - - has3d = 'WebKitCSSMatrix' in window && 'm11' in new WebKitCSSMatrix(), - hasTouch = 'ontouchstart' in window && !isTouchPad, - hasTransform = vendor + 'Transform' in document.documentElement.style, - hasTransitionEnd = isIDevice || isPlaybook, - - nextFrame = (function() { - return window.requestAnimationFrame - || window.webkitRequestAnimationFrame - || window.mozRequestAnimationFrame - || window.oRequestAnimationFrame - || window.msRequestAnimationFrame - || function(callback) { return setTimeout(callback, 17); } - })(), - cancelFrame = (function () { - return window.cancelRequestAnimationFrame - || window.webkitCancelAnimationFrame - || window.webkitCancelRequestAnimationFrame - || window.mozCancelRequestAnimationFrame - || window.oCancelRequestAnimationFrame - || window.msCancelRequestAnimationFrame - || clearTimeout - })(), - - // Events - RESIZE_EV = 'onorientationchange' in window ? 'orientationchange' : 'resize', - START_EV = hasTouch ? 'touchstart' : 'mousedown', - MOVE_EV = hasTouch ? 'touchmove' : 'mousemove', - END_EV = hasTouch ? 'touchend' : 'mouseup', - CANCEL_EV = hasTouch ? 'touchcancel' : 'mouseup', - - // Helpers - trnOpen = 'translate' + (has3d ? '3d(' : '('), - trnClose = has3d ? ',0)' : ')', - - // Constructor - iScroll = function (el, options) { - var that = this, - doc = document, - i; - - that.wrapper = typeof el == 'object' ? el : doc.getElementById(el); - that.wrapper.style.overflow = 'hidden'; - that.scroller = that.wrapper.children[0]; - - // Default options - that.options = { - hScroll: true, - vScroll: true, - x: 0, - y: 0, - bounce: true, - bounceLock: false, - momentum: true, - lockDirection: true, - useTransform: true, - useTransition: false, - - // Events - onRefresh: null, - onBeforeScrollStart: function (e) { e.preventDefault(); }, - onScrollStart: null, - onBeforeScrollMove: null, - onScrollMove: null, - onBeforeScrollEnd: null, - onScrollEnd: null, - onTouchEnd: null, - onDestroy: null - }; - - // User defined options - for (i in options) that.options[i] = options[i]; - - // Set starting position - that.x = that.options.x; - that.y = that.options.y; - - // Normalize options - that.options.useTransform = hasTransform ? that.options.useTransform : false; - that.options.hScrollbar = that.options.hScroll && that.options.hScrollbar; - that.options.vScrollbar = that.options.vScroll && that.options.vScrollbar; - that.options.useTransition = hasTransitionEnd && that.options.useTransition; - - // Set some default styles - that.scroller.style[vendor + 'TransitionProperty'] = that.options.useTransform ? '-' + vendor.toLowerCase() + '-transform' : 'top left'; - that.scroller.style[vendor + 'TransitionDuration'] = '0'; - that.scroller.style[vendor + 'TransformOrigin'] = '0 0'; - if (that.options.useTransition) that.scroller.style[vendor + 'TransitionTimingFunction'] = 'cubic-bezier(0.33,0.66,0.66,1)'; - - if (that.options.useTransform) that.scroller.style[vendor + 'Transform'] = trnOpen + that.x + 'px,' + that.y + 'px' + trnClose; - else that.scroller.style.cssText += ';position:absolute;top:' + that.y + 'px;left:' + that.x + 'px'; - - that.refresh(); - - that._bind(RESIZE_EV, window); - that._bind(START_EV); - if (!hasTouch) that._bind('mouseout', that.wrapper); - }; - -// Prototype -iScroll.prototype = { - enabled: true, - x: 0, - y: 0, - steps: [], - scale: 1, - - handleEvent: function (e) { - var that = this; - switch(e.type) { - case START_EV: - if (!hasTouch && e.button !== 0) return; - that._start(e); - break; - case MOVE_EV: that._move(e); break; - case END_EV: - case CANCEL_EV: that._end(e); break; - case RESIZE_EV: that._resize(); break; - case 'mouseout': that._mouseout(e); break; - case 'webkitTransitionEnd': that._transitionEnd(e); break; - } - }, - - _resize: function () { - this.refresh(); - }, - - _pos: function (x, y) { - x = this.hScroll ? x : 0; - y = this.vScroll ? y : 0; - - if (this.options.useTransform) { - this.scroller.style[vendor + 'Transform'] = trnOpen + x + 'px,' + y + 'px' + trnClose + ' scale(' + this.scale + ')'; - } else { - x = mround(x); - y = mround(y); - this.scroller.style.left = x + 'px'; - this.scroller.style.top = y + 'px'; - } - - this.x = x; - this.y = y; - }, - - _start: function (e) { - var that = this, - point = hasTouch ? e.touches[0] : e, - matrix, x, y; - - if (!that.enabled) return; - - if (that.options.onBeforeScrollStart) that.options.onBeforeScrollStart.call(that, e); - - if (that.options.useTransition) that._transitionTime(0); - - that.moved = false; - that.animating = false; - that.zoomed = false; - that.distX = 0; - that.distY = 0; - that.absDistX = 0; - that.absDistY = 0; - that.dirX = 0; - that.dirY = 0; - - if (that.options.momentum) { - if (that.options.useTransform) { - // Very lame general purpose alternative to CSSMatrix - matrix = getComputedStyle(that.scroller, null)[vendor + 'Transform'].replace(/[^0-9-.,]/g, '').split(','); - x = matrix[4] * 1; - y = matrix[5] * 1; - } else { - x = getComputedStyle(that.scroller, null).left.replace(/[^0-9-]/g, '') * 1; - y = getComputedStyle(that.scroller, null).top.replace(/[^0-9-]/g, '') * 1; - } - - if (x != that.x || y != that.y) { - if (that.options.useTransition) that._unbind('webkitTransitionEnd'); - else cancelFrame(that.aniTime); - that.steps = []; - that._pos(x, y); - } - } - - that.startX = that.x; - that.startY = that.y; - that.pointX = point.pageX; - that.pointY = point.pageY; - - that.startTime = e.timeStamp || Date.now(); - - if (that.options.onScrollStart) that.options.onScrollStart.call(that, e); - - that._bind(MOVE_EV); - that._bind(END_EV); - that._bind(CANCEL_EV); - }, - - _move: function (e) { - var that = this, - point = hasTouch ? e.touches[0] : e, - deltaX = point.pageX - that.pointX, - deltaY = point.pageY - that.pointY, - newX = that.x + deltaX, - newY = that.y + deltaY, - timestamp = e.timeStamp || Date.now(); - - if (that.options.onBeforeScrollMove) that.options.onBeforeScrollMove.call(that, e); - - that.pointX = point.pageX; - that.pointY = point.pageY; - - // Slow down if outside of the boundaries - if (newX > 0 || newX < that.maxScrollX) { - newX = that.options.bounce ? that.x + (deltaX / 2) : newX >= 0 || that.maxScrollX >= 0 ? 0 : that.maxScrollX; - } - if (newY > 0 || newY < that.maxScrollY) { - newY = that.options.bounce ? that.y + (deltaY / 2) : newY >= 0 || that.maxScrollY >= 0 ? 0 : that.maxScrollY; - } - - that.distX += deltaX; - that.distY += deltaY; - that.absDistX = m.abs(that.distX); - that.absDistY = m.abs(that.distY); - - if (that.absDistX < 6 && that.absDistY < 6) { - return; - } - - // Lock direction - if (that.options.lockDirection) { - if (that.absDistX > that.absDistY + 5) { - newY = that.y; - deltaY = 0; - } else if (that.absDistY > that.absDistX + 5) { - newX = that.x; - deltaX = 0; - } - } - - that.moved = true; - that._pos(newX, newY); - that.dirX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0; - that.dirY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0; - - if (timestamp - that.startTime > 300) { - that.startTime = timestamp; - that.startX = that.x; - that.startY = that.y; - } - - if (that.options.onScrollMove) that.options.onScrollMove.call(that, e); - }, - - _end: function (e) { - if (hasTouch && e.touches.length != 0) return; - - var that = this, - point = hasTouch ? e.changedTouches[0] : e, - target, ev, - momentumX = { dist:0, time:0 }, - momentumY = { dist:0, time:0 }, - duration = (e.timeStamp || Date.now()) - that.startTime, - newPosX = that.x, - newPosY = that.y, - newDuration; - - that._unbind(MOVE_EV); - that._unbind(END_EV); - that._unbind(CANCEL_EV); - - if (that.options.onBeforeScrollEnd) that.options.onBeforeScrollEnd.call(that, e); - - if (!that.moved) { - if (hasTouch) { - // Find the last touched element - target = point.target; - while (target.nodeType != 1) target = target.parentNode; - - if (target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA') { - ev = document.createEvent('MouseEvents'); - ev.initMouseEvent('click', true, true, e.view, 1, - point.screenX, point.screenY, point.clientX, point.clientY, - e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, - 0, null); - ev._fake = true; - target.dispatchEvent(ev); - } - } - - that._resetPos(200); - - if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e); - return; - } - - if (duration < 300 && that.options.momentum) { - momentumX = newPosX ? that._momentum(newPosX - that.startX, duration, -that.x, that.scrollerW - that.wrapperW + that.x, that.options.bounce ? that.wrapperW : 0) : momentumX; - momentumY = newPosY ? that._momentum(newPosY - that.startY, duration, -that.y, (that.maxScrollY < 0 ? that.scrollerH - that.wrapperH + that.y : 0), that.options.bounce ? that.wrapperH : 0) : momentumY; - - newPosX = that.x + momentumX.dist; - newPosY = that.y + momentumY.dist; - - if ((that.x > 0 && newPosX > 0) || (that.x < that.maxScrollX && newPosX < that.maxScrollX)) momentumX = { dist:0, time:0 }; - if ((that.y > 0 && newPosY > 0) || (that.y < that.maxScrollY && newPosY < that.maxScrollY)) momentumY = { dist:0, time:0 }; - } - - if (momentumX.dist || momentumY.dist) { - newDuration = m.max(m.max(momentumX.time, momentumY.time), 10); - - that.scrollTo(mround(newPosX), mround(newPosY), newDuration); - - if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e); - return; - } - - that._resetPos(200); - if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e); - }, - - _resetPos: function (time) { - var that = this, - resetX = that.x >= 0 ? 0 : that.x < that.maxScrollX ? that.maxScrollX : that.x, - resetY = that.y >= 0 || that.maxScrollY > 0 ? 0 : that.y < that.maxScrollY ? that.maxScrollY : that.y; - - if (resetX == that.x && resetY == that.y) { - if (that.moved) { - if (that.options.onScrollEnd) that.options.onScrollEnd.call(that); // Execute custom code on scroll end - that.moved = false; - } - - return; - } - - that.scrollTo(resetX, resetY, time || 0); - }, - - _mouseout: function (e) { - var t = e.relatedTarget; - - if (!t) { - this._end(e); - return; - } - - while (t = t.parentNode) if (t == this.wrapper) return; - - this._end(e); - }, - - _transitionEnd: function (e) { - var that = this; - - if (e.target != that.scroller) return; - - that._unbind('webkitTransitionEnd'); - - that._startAni(); - }, - - /** - * - * Utilities - * - */ - _startAni: function () { - var that = this, - startX = that.x, startY = that.y, - startTime = Date.now(), - step, easeOut, - animate; - - if (that.animating) return; - - if (!that.steps.length) { - that._resetPos(400); - return; - } - - step = that.steps.shift(); - - if (step.x == startX && step.y == startY) step.time = 0; - - that.animating = true; - that.moved = true; - - if (that.options.useTransition) { - that._transitionTime(step.time); - that._pos(step.x, step.y); - that.animating = false; - if (step.time) that._bind('webkitTransitionEnd'); - else that._resetPos(0); - return; - } - - animate = function () { - var now = Date.now(), - newX, newY; - - if (now >= startTime + step.time) { - that._pos(step.x, step.y); - that.animating = false; - if (that.options.onAnimationEnd) that.options.onAnimationEnd.call(that); // Execute custom code on animation end - that._startAni(); - return; - } - - now = (now - startTime) / step.time - 1; - easeOut = m.sqrt(1 - now * now); - newX = (step.x - startX) * easeOut + startX; - newY = (step.y - startY) * easeOut + startY; - that._pos(newX, newY); - if (that.animating) that.aniTime = nextFrame(animate); - }; - - animate(); - }, - - _transitionTime: function (time) { - this.scroller.style[vendor + 'TransitionDuration'] = time + 'ms'; - }, - - _momentum: function (dist, time, maxDistUpper, maxDistLower, size) { - var deceleration = 0.0006, - speed = m.abs(dist) / time, - newDist = (speed * speed) / (2 * deceleration), - newTime = 0, outsideDist = 0; - - // Proportinally reduce speed if we are outside of the boundaries - if (dist > 0 && newDist > maxDistUpper) { - outsideDist = size / (6 / (newDist / speed * deceleration)); - maxDistUpper = maxDistUpper + outsideDist; - speed = speed * maxDistUpper / newDist; - newDist = maxDistUpper; - } else if (dist < 0 && newDist > maxDistLower) { - outsideDist = size / (6 / (newDist / speed * deceleration)); - maxDistLower = maxDistLower + outsideDist; - speed = speed * maxDistLower / newDist; - newDist = maxDistLower; - } - - newDist = newDist * (dist < 0 ? -1 : 1); - newTime = speed / deceleration; - - return { dist: newDist, time: mround(newTime) }; - }, - - _offset: function (el) { - var left = -el.offsetLeft, - top = -el.offsetTop; - - while (el = el.offsetParent) { - left -= el.offsetLeft; - top -= el.offsetTop; - } - - return { left: left, top: top }; - }, - - _bind: function (type, el, bubble) { - (el || this.scroller).addEventListener(type, this, !!bubble); - }, - - _unbind: function (type, el, bubble) { - (el || this.scroller).removeEventListener(type, this, !!bubble); - }, - - - /** - * - * Public methods - * - */ - destroy: function () { - var that = this; - - that.scroller.style[vendor + 'Transform'] = ''; - - // Remove the event listeners - that._unbind(RESIZE_EV, window); - that._unbind(START_EV); - that._unbind(MOVE_EV); - that._unbind(END_EV); - that._unbind(CANCEL_EV); - that._unbind('mouseout', that.wrapper); - if (that.options.useTransition) that._unbind('webkitTransitionEnd'); - - if (that.options.onDestroy) that.options.onDestroy.call(that); - }, - - refresh: function () { - var that = this, - offset; - - that.wrapperW = that.wrapper.clientWidth; - that.wrapperH = that.wrapper.clientHeight; - - that.scrollerW = that.scroller.offsetWidth; - that.scrollerH = that.scroller.offsetHeight; - that.maxScrollX = that.wrapperW - that.scrollerW; - that.maxScrollY = that.wrapperH - that.scrollerH; - that.dirX = 0; - that.dirY = 0; - - that.hScroll = that.options.hScroll && that.maxScrollX < 0; - that.vScroll = that.options.vScroll && (!that.options.bounceLock && !that.hScroll || that.scrollerH > that.wrapperH); - - offset = that._offset(that.wrapper); - that.wrapperOffsetLeft = -offset.left; - that.wrapperOffsetTop = -offset.top; - - - that.scroller.style[vendor + 'TransitionDuration'] = '0'; - - that._resetPos(200); - }, - - scrollTo: function (x, y, time, relative) { - var that = this, - step = x, - i, l; - - that.stop(); - - if (!step.length) step = [{ x: x, y: y, time: time, relative: relative }]; - - for (i=0, l=step.length; i 0 ? 0 : pos.left < that.maxScrollX ? that.maxScrollX : pos.left; - pos.top = pos.top > 0 ? 0 : pos.top < that.maxScrollY ? that.maxScrollY : pos.top; - time = time === undefined ? m.max(m.abs(pos.left)*2, m.abs(pos.top)*2) : time; - - that.scrollTo(pos.left, pos.top, time); - }, - - disable: function () { - this.stop(); - this._resetPos(0); - this.enabled = false; - - // If disabled after touchstart we make sure that there are no left over events - this._unbind(MOVE_EV); - this._unbind(END_EV); - this._unbind(CANCEL_EV); - }, - - enable: function () { - this.enabled = true; - }, - - stop: function () { - cancelFrame(this.aniTime); - this.steps = []; - this.moved = false; - this.animating = false; - } -}; - -if (typeof exports !== 'undefined') exports.iScroll = iScroll; -else window.iScroll = iScroll; - -})(); -})(osmplayer); /** * @constructor * @extends minplayer.display diff --git a/bin/osmplayer.min.js b/bin/osmplayer.min.js new file mode 100644 index 00000000..818d0204 --- /dev/null +++ b/bin/osmplayer.min.js @@ -0,0 +1,3 @@ +function checkPlayType(a,b){if("function"==typeof a.canPlayType){if("object"==typeof b){for(var c=b.length,d="";c--&&!(d=checkPlayType(a,b[c])););return d}var e=a.canPlayType(b);if("no"!==e&&""!==e)return b}return""}var minplayer=minplayer||{};!function(a){!function(){"use strict";var a="undefined"!=typeof module&&module.exports,b="undefined"!=typeof Element&&"ALLOW_KEYBOARD_INPUT"in Element,c=function(){for(var a,b,c=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],d=0,e=c.length,f={};e>d;d++)if(a=c[d],a&&a[1]in document){for(d=0,b=a.length;b>d;d++)f[c[0][d]]=a[d];return f}return!1}(),d={request:function(a){var d=c.requestFullscreen;a=a||document.documentElement,/5\.1[\.\d]* Safari/.test(navigator.userAgent)?a[d]():a[d](b&&Element.ALLOW_KEYBOARD_INPUT)},exit:function(){document[c.exitFullscreen]()},toggle:function(a){this.isFullscreen?this.exit():this.request(a)},onchange:function(){},onerror:function(){},raw:c};return c?(Object.defineProperties(d,{isFullscreen:{get:function(){return!!document[c.fullscreenElement]}},element:{enumerable:!0,get:function(){return document[c.fullscreenElement]}},enabled:{enumerable:!0,get:function(){return!!document[c.fullscreenEnabled]}}}),document.addEventListener(c.fullscreenchange,function(a){d.onchange.call(d,a)}),document.addEventListener(c.fullscreenerror,function(a){d.onerror.call(d,a)}),void(a?module.exports=d:window.screenfull=d)):void(a?module.exports=!1:window.screenfull=!1)}(),a.screenfull=screenfull}(minplayer);var minplayer=minplayer||{};if(minplayer.compatibility=function(){var a=null;a=document.createElement("video"),this.videoOGG=checkPlayType(a,"video/ogg"),this.videoH264=checkPlayType(a,["video/mp4","video/h264"]),this.videoWEBM=checkPlayType(a,["video/x-webm","video/webm","application/octet-stream"]),this.videoMPEGURL=checkPlayType(a,"application/vnd.apple.mpegurl"),a=document.createElement("audio"),this.audioOGG=checkPlayType(a,"audio/ogg"),this.audioMP3=checkPlayType(a,"audio/mpeg"),this.audioMP4=checkPlayType(a,"audio/mp4")},minplayer.playTypes||(minplayer.playTypes=new minplayer.compatibility,minplayer.isAndroid=/android/gi.test(navigator.appVersion),minplayer.isIDevice=/iphone|ipad/gi.test(navigator.appVersion),minplayer.isPlaybook=/playbook/gi.test(navigator.appVersion),minplayer.isTouchPad=/hp-tablet/gi.test(navigator.appVersion),minplayer.hasTouch="ontouchstart"in window&&!minplayer.isTouchPad),!minplayer.urlVars){minplayer.urlVars={};var regEx=/[?&]+([^=&]+)=([^&]*)/gi;window.location.href.replace(regEx,function(a,b,c){minplayer.urlVars[b]=c})}var minplayer=minplayer||{};minplayer.async=function(){this.value=null,this.queue=[]},minplayer.async.prototype.get=function(a){null!==this.value?a(this.value):this.queue.push(a)},minplayer.async.prototype.set=function(a){this.value=a;var b=this.queue.length;if(b){for(;b--;)this.queue[b](a);this.queue=[]}};var minplayer=minplayer||{};minplayer.flags=function(){this.flag=0,this.ids={},this.numFlags=0},minplayer.flags.prototype.setFlag=function(a,b){this.ids.hasOwnProperty(a)||(this.ids[a]=this.numFlags,this.numFlags++),b?this.flag|=1<c;c++)minplayer.queue.hasOwnProperty(c)&&(b=minplayer.queue[c],d=!b.id&&!b.plugin,d|=b.plugin===a.name,d&=!b.id||b.id===this.options.id,d&&!b.addedto.hasOwnProperty(a.options.id)&&(b.addedto[a.options.id]=!0,d=minplayer.bind.call(b.context,b.event,this.options.id,a.name,b.callback,!0)));minplayer.lock=!1},minplayer.eventTypes={},minplayer.plugin.prototype.isEvent=function(a,b){var c=a+"__"+b;return"undefined"!=typeof minplayer.eventTypes[c]?minplayer.eventTypes[c]:(new RegExp("^(.*:)?"+b+"$","gi"),minplayer.eventTypes[c]=null!==a.match(b),minplayer.eventTypes[c])},minplayer.plugin.prototype.trigger=function(a,b,c){if(!this.active)return this;c||(this.triggered[a]=b);var d=0,e={},f=null;for(var g in this.queue)if(this.isEvent(g,a)){f=this.queue[g];for(d in f)f.hasOwnProperty(d)&&(e=f[d],e.callback({target:this,data:e.data},b))}return this},minplayer.plugin.prototype.ubind=function(a,b,c){return this.unbind(a),this.bind(a,b,c)},minplayer.plugin.prototype.bind=function(a,b,c){if(!this.active)return this;if("function"==typeof b&&(c=b,b=null),a&&c){this.queue[a]=this.queue[a]||[],this.queue[a].push({callback:c,data:b});for(var d in this.triggered)this.triggered.hasOwnProperty(d)&&this.isEvent(a,d)&&c({target:this,data:b},this.triggered[d]);return this}},minplayer.plugin.prototype.unbind=function(a){return this.lock&&setTimeout(function(b){return function(){b.unbind(a)}}(this),10),this.lock=!0,a?this.queue.hasOwnProperty(a)&&this.queue[a].length>0&&(this.queue[a].length=0):this.queue={},this.lock=!1,this},minplayer.addQueue=function(a,b,c,d,e){minplayer.lock?setTimeout(function(){minplayer.addQueue(a,c,b,d,e)},10):minplayer.queue.push({context:a,id:c,event:b,plugin:d,callback:e,addedto:{}})},minplayer.bind=function(a,b,c,d,e){if(!d)return!1;var f=minplayer.plugins,g=null,h=null,i=[],j=function(a,b){if(f.hasOwnProperty(a)&&f[a].hasOwnProperty(b))for(var c=f[a][b].length;c--;)i.push(f[a][b][c])};if(b&&c)j(b,c);else if(!b&&c)for(h in f)j(h,c);else if(b&&!c&&f[b])for(g in f[b])j(b,g);else if(!b&&!c)for(h in f)for(g in f[h])j(h,g);for(var k=i.length;k--;)i[k].bind(a,function(a){return function(b){d.call(a,b.target)}}(this));return e||minplayer.addQueue(this,a,b,c,d),i.length>0},minplayer.get=function(a,b,c){var d=typeof a,e=typeof b,f=typeof c;if("function"===d?(c=a,b=a=null):"function"===e?(c=b,b=a,a=null):"undefined"===e&&"undefined"===f&&(b=a,c=a=null),c="function"==typeof c?c:null)return void minplayer.bind.call(this,"ready",a,b,c);var g=minplayer.plugins,h=null;if(!(a||b||c))return g;if(a&&!b&&!c)return g[a];if(a&&b&&!c)return g[a][b];if(!a&&b&&!c){var i=[];for(h in g)if(g.hasOwnProperty(h)&&g[h].hasOwnProperty(b))for(var j=g[h][b].length;j--;)i.push(g[h][b][j]);return i}},minplayer.display=function(a,b,c,d){minplayer.plugin.call(this,a,b,c,d)},minplayer.display.prototype=new minplayer.plugin,minplayer.display.prototype.constructor=minplayer.display,minplayer.display.prototype.getDisplay=function(a){return a},minplayer.display.prototype.initialize=function(){this.display||(this.display=this.getDisplay(this.context,this.options)),this.display&&(this.options.pluginName="display",this.elements=this.getElements(),minplayer.plugin.prototype.initialize.call(this))},minplayer.display.prototype.construct=function(){if(minplayer.plugin.prototype.construct.call(this),this.autoHide=!1,this.onResize){var a=0;jQuery(window).resize(function(b){return function(){clearTimeout(a),a=setTimeout(function(){b.onResize()},200)}}(this))}},minplayer.display.prototype.onResize=!1,minplayer.display.prototype.hide=function(a){a=a||this.display,a&&(a.forceHide=!0,a.unbind().hide())},minplayer.display.prototype.fullScreenElement=function(){return this.display},minplayer.click=function(a,b){var c=!1;return a=jQuery(a),a.bind("touchstart click",function(a){c||(c=!0,setTimeout(function(){c=!1},100),b.call(this,a))}),a},minplayer.display.prototype.onFocus=function(a){this.hasFocus=this.focus=a,this.autoHide&&this.showThenHide(this.autoHide.element,this.autoHide.timeout,this.autoHide.cb)},minplayer.display.prototype.showThenHide=function(a,b,c){var d=typeof a;"undefined"===d?(c=null,a=this.display):"number"===d?(c=b,b=a,a=this.display):"function"===d&&(c=a,a=this.display),a&&(b=b||5e3,this.autoHide={element:a,timeout:b,cb:c},a.forceHide||("undefined"!=typeof a.showMe?a.showMe&&a.showMe(c):(a.show(),c&&c(!0))),a.hoverState||(jQuery(a).bind("mouseenter",function(){a.hoverState=!0}),jQuery(a).bind("mouseleave",function(){a.hoverState=!1})),clearTimeout(this.showTimer),this.showTimer=setTimeout(function(d){return function e(){a.hoverState?d.showTimer=setTimeout(e,b):"undefined"!=typeof a.hideMe?a.hideMe&&a.hideMe(c):a.hide("slow",function(){c&&c(!1)})}}(this),b))},minplayer.display.prototype.fullscreen=function(a){var b=this.isFullScreen(),c=this.fullScreenElement();b&&!a?(c.removeClass("fullscreen"),minplayer.screenfull&&minplayer.screenfull.exit(),this.trigger("fullscreen",!1)):!b&&a&&(c.addClass("fullscreen"),minplayer.screenfull&&(minplayer.screenfull.request(c[0]),minplayer.screenfull.onchange=function(a){return function(){minplayer.screenfull.isFullscreen||a.fullscreen(!1)}}(this)),this.trigger("fullscreen",!0))},minplayer.display.prototype.toggleFullScreen=function(){this.fullscreen(!this.isFullScreen())},minplayer.display.prototype.isFullScreen=function(){return this.fullScreenElement().hasClass("fullscreen")},minplayer.display.prototype.getScaledRect=function(a,b){var c={};return c.x=b.x?b.x:0,c.y=b.y?b.y:0,c.width=b.width?b.width:0,c.height=b.height?b.height:0,a&&(b.width/b.height>a?(c.height=b.height,c.width=Math.floor(b.height*a)):(c.height=Math.floor(b.width/a),c.width=b.width),c.x=Math.floor((b.width-c.width)/2),c.y=Math.floor((b.height-c.height)/2)),c},minplayer.display.prototype.getElements=function(){return{}},jQuery.fn.minplayer||(jQuery.fn.minplayer=function(a){return jQuery(this).each(function(){a=a||{},a.id=a.id||jQuery(this).attr("id")||Math.random(),minplayer.plugins[a.id]||(a.template=a.template||"default",minplayer[a.template]?new minplayer[a.template](jQuery(this),a):new minplayer(jQuery(this),a))})}),minplayer=jQuery.extend(function(a,b){minplayer.display.call(this,"player",a,b)},minplayer),minplayer.prototype=new minplayer.display,minplayer.prototype.constructor=minplayer,minplayer.prototype.defaultOptions=function(a){a.id="player",a.build=!1,a.wmode="transparent",a.preload=!0,a.autoplay=!1,a.autoload=!0,a.loop=!1,a.width="100%",a.height="350px",a.debug=!1,a.volume=80,a.files=null,a.file="",a.preview="",a.attributes={},a.plugins={},a.logo="",a.link="",a.duration=0,jQuery.each(this.context[0].attributes,function(b,c){a[c.name]=c.value}),minplayer.display.prototype.defaultOptions.call(this,a)},minplayer.prototype.construct=function(){minplayer.display.prototype.construct.call(this);var a=null;for(var b in this.options.plugins)a=this.options.plugins[b],minplayer[a]&&(a=minplayer[a],a[this.options.template]&&a[this.options.template].init?a[this.options.template].init(this):a.init&&a.init(this));if(this.options.pluginName="player",this.controller=this.create("controller"),this.playLoader=this.create("playLoader"),this.options.logo&&this.elements.logo){var c="";this.options.link&&(c+=''),c+='',this.options.link&&(c+=""),this.logo=this.elements.logo.append(c)}this.currentPlayer="html5",this.addKeyEvents(),this.addEvents(),this.load(this.getFiles()),this.ready()},minplayer.prototype.setFocus=function(a){minplayer.get.call(this,this.options.id,null,function(b){b.onFocus(a)}),this.trigger("playerFocus",a)},minplayer.prototype.bindTo=function(a){a.ubind(this.uuid+":error",function(a){return function(b,c){"html5"===a.currentPlayer?(minplayer.player="minplayer",a.options.file.player="minplayer",a.loadPlayer()):a.showError(c)}}(this)),a.ubind(this.uuid+":fullscreen",function(a){return function(){a.resize()}}(this))},minplayer.prototype.addEvents=function(){var a=!1;this.display.bind("mouseenter",function(b){return function(){a=!0,b.setFocus(!0)}}(this)),this.display.bind("mouseleave",function(b){return function(){a=!1,b.setFocus(!1)}}(this));var b=!1;this.display.bind("mousemove",function(c){return function(){b||(b=setTimeout(function(){b=!1,a&&c.setFocus(!0)},300))}}(this)),minplayer.get.call(this,this.options.id,null,function(a){return function(b){a.bindTo(b)}}(this))},minplayer.prototype.showError=function(a){"object"!=typeof a&&(a=a||"",this.elements.error&&(this.elements.error.text(a),a?(this.elements.error.show(),setTimeout(function(a){return function(){a.elements.error.hide("slow")}}(this),5e3)):this.elements.error.hide()))},minplayer.prototype.addKeyEvents=function(){jQuery(document).bind("keydown",function(a){return function(b){switch(b.keyCode){case 113:case 27:a.isFullScreen()&&a.fullscreen(!1)}}}(this))},minplayer.prototype.getFiles=function(){if(this.options.files)return this.options.files;if(this.options.file)return this.options.file;var a=[],b=null;return this.elements.media&&(b=this.elements.media.attr("src"),b&&a.push({path:b}),jQuery("source",this.elements.media).each(function(){a.push({path:jQuery(this).attr("src"),mimetype:jQuery(this).attr("type"),codecs:jQuery(this).attr("codecs")})})),a},minplayer.getMediaFile=function(a){if(!a)return null;if("string"==typeof a||a.path||a.id)return new minplayer.file(a);var b=0,c=null,d=null;for(var e in a)a.hasOwnProperty(e)&&(d=new minplayer.file(a[e]),d.player&&d.priority>b&&(b=d.priority,c=d));return c},minplayer.prototype.loadPlayer=function(){if(!this.options.file||0===this.elements.display.length)return!1;if(!this.options.file.player)return!1;this.showError();var a=this.options.file.player.toString();if(!this.media||a!==this.currentPlayer){if(this.currentPlayer=a,!this.elements.display)return void this.showError("No media display found.");var b={};return this.media&&(b=this.media.queue,this.media.destroy()),pClass=minplayer.players[this.options.file.player],this.options.mediaelement=this.elements.media,this.media=new pClass(this.elements.display,this.options,b),this.media.load(this.options.file),this.display.addClass("minplayer-player-"+this.media.mediaFile.player),!0}return this.media?(this.media.options=this.options,this.display.removeClass("minplayer-player-"+this.media.mediaFile.player),this.media.load(this.options.file),this.display.addClass("minplayer-player-"+this.media.mediaFile.player),!1):void 0},minplayer.prototype.load=function(a){return this.options.files=a||this.options.files,this.options.file=minplayer.getMediaFile(this.options.files),this.loadPlayer()?(this.bindTo(this.media),this.options.file.mimetype&&!this.options.file.player?(this.showError("Cannot play media: "+this.options.file.mimetype),!1):!0):!1},minplayer.prototype.resize=function(){this.get(function(a){a.onResize&&a.onResize()})};var minplayer=minplayer||{};minplayer.image=function(a,b){this.loaded=!1,this.loader=null,this.ratio=0,this.img=null,minplayer.display.call(this,"image",a,b)},minplayer.image.prototype=new minplayer.display,minplayer.image.prototype.constructor=minplayer.image,minplayer.image.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.options.pluginName="image",this.display.css("overflow","hidden"),this.loader=new Image,this.loader.onload=function(a){return function(){a.loaded=!0,a.ratio=a.loader.width/a.loader.height,a.resize(),a.trigger("loaded")}}(this),this.ready()},minplayer.image.prototype.load=function(a){this.clear(function(){this.display.empty(),this.img=jQuery(document.createElement("img")).attr({src:""}).hide(),this.display.append(this.img),this.loader.src=a,this.img.attr("src",a)})},minplayer.image.prototype.clear=function(a){this.loaded=!1,this.img?this.img.fadeOut(150,function(b){return function(){b.img.attr("src",""),b.loader.src="",jQuery(this).remove(),a&&a.call(b)}}(this)):a&&a.call(this)},minplayer.image.prototype.resize=function(a,b){if(a=a||this.display.parent().width(),b=b||this.display.parent().height(),a&&b&&this.loaded){var c=this.getScaledRect(this.ratio,{width:a,height:b});this.img&&this.img.attr("src",this.loader.src).css({marginLeft:c.x,marginTop:c.y,width:c.width,height:c.height}),this.img.fadeIn(150)}},minplayer.image.prototype.onResize=function(){this.resize()};var minplayer=minplayer||{};minplayer.file=function(a){return a?(a="string"==typeof a?{path:a}:a,a.hasOwnProperty("isMinPlayerFile")?a:(this.isMinPlayerFile=!0,this.duration=a.duration||0,this.bytesTotal=a.bytesTotal||0,this.quality=a.quality||0,this.stream=a.stream||"",this.path=a.path||"",this.codecs=a.codecs||"",this.extension=a.extension||this.getFileExtension(),this.mimetype=a.mimetype||a.filemime||this.getMimeType(),this.type=a.type||this.getType(),this.type||(this.mimetype=this.getMimeType(),this.type=this.getType()),this.player=minplayer.player||a.player||this.getBestPlayer(),this.priority=a.priority||this.getPriority(),this.id=a.id||this.getId(),void(this.path||(this.path=this.id)))):null},minplayer.player="",minplayer.file.prototype.getBestPlayer=function(){var a=null,b=0;return jQuery.each(minplayer.players,function(c){return function(d,e){var f=e.getPriority(c);e.canPlay(c)&&f>b&&(a=d,b=f)}}(this)),a},minplayer.file.prototype.getPriority=function(){var a=1;switch(this.player&&(a=minplayer.players[this.player].getPriority(this)),this.mimetype){case"video/x-webm":case"video/webm":case"application/octet-stream":case"application/vnd.apple.mpegurl":return 10*a;case"video/mp4":case"audio/mp4":case"audio/mpeg":return 9*a;case"video/ogg":case"audio/ogg":case"video/quicktime":return 8*a;default:return 5*a}},minplayer.file.prototype.getFileExtension=function(){return this.path.substring(this.path.lastIndexOf(".")+1).toLowerCase()},minplayer.file.prototype.getMimeType=function(){switch(this.extension){case"mp4":case"m4v":case"flv":case"f4v":return"video/mp4";case"m3u8":return"application/vnd.apple.mpegurl";case"webm":return"video/webm";case"ogg":case"ogv":return"video/ogg";case"3g2":return"video/3gpp2";case"3gpp":case"3gp":return"video/3gpp";case"mov":return"video/quicktime";case"swf":return"application/x-shockwave-flash";case"oga":return"audio/ogg";case"mp3":return"audio/mpeg";case"m4a":case"f4a":return"audio/mp4";case"aac":return"audio/aac";case"wav":return"audio/vnd.wave";case"wma":return"audio/x-ms-wma";default:return"unknown"}},minplayer.file.prototype.getType=function(){var a=this.mimetype.match(/([^\/]+)(\/)/);if(a=a&&a.length>1?a[1]:"","video"===a)return"video";if("audio"===a)return"audio";switch(this.mimetype){case"application/octet-stream":case"application/x-shockwave-flash":case"application/vnd.apple.mpegurl":return"video"}return""},minplayer.file.prototype.getId=function(){var a=minplayer.players[this.player];return a&&a.getMediaId?a.getMediaId(this):""};var minplayer=minplayer||{};minplayer.playLoader=function(a,b){this.clear(),minplayer.display.call(this,"playLoader",a,b)},minplayer.playLoader.prototype=new minplayer.display,minplayer.playLoader.prototype.constructor=minplayer.playLoader,minplayer.playLoader.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.options.pluginName="playLoader",this.initializePlayLoader(),this.ready()},minplayer.playLoader.prototype.initializePlayLoader=function(){this.get("media",function(a){if(a.hasPlayLoader(this.options.preview))this.enabled=!1,this.hide(this.elements.busy),this.hide(this.elements.bigPlay),this.hide(this.elements.preview),this.hide();else{this.enabled=!0,this.options.preview||(this.options.preview=a.poster);var b=!0;this.preview&&this.preview.loader&&(b=this.preview.loader.src!==this.options.preview),b&&(a.elements.media.attr("poster",""),this.loadPreview()),this.elements.bigPlay&&minplayer.click(this.elements.bigPlay.unbind(),function(b){b.preventDefault(),jQuery(this).hide(),a.play()}),a.ubind(this.uuid+":loadstart",function(a){return function(){a.busy.setFlag("media",!0),a.bigPlay.setFlag("media",!0),a.previewFlag.setFlag("media",!0),a.checkVisibility()}}(this)),a.ubind(this.uuid+":waiting",function(a){return function(b,c,d){d||(a.busy.setFlag("media",!0),a.checkVisibility())}}(this)),a.ubind(this.uuid+":loadeddata",function(a){return function(b,c,d){d||(a.busy.setFlag("media",!1),a.checkVisibility())}}(this)),a.ubind(this.uuid+":playing",function(b){return function(c,d,e){e||(b.busy.setFlag("media",!1),b.bigPlay.setFlag("media",!1),"audio"!==a.mediaFile.type&&b.previewFlag.setFlag("media",!1),b.checkVisibility())}}(this)),a.ubind(this.uuid+":pause",function(a){return function(b,c,d){d||(a.busy.setFlag("media",!1),a.bigPlay.setFlag("media",!0),a.checkVisibility())}}(this))}})},minplayer.playLoader.prototype.clear=function(a){this.busy=new minplayer.flags,this.bigPlay=new minplayer.flags,this.previewFlag=new minplayer.flags,this.enabled=!0,this.preview?this.preview.clear(function(b){return function(){b.preview=null,a&&a()}}(this)):(this.preview=null,a&&a())},minplayer.playLoader.prototype.loadPreview=function(a){if(a=a||this.options.preview,this.options.preview=a,this.enabled&&0!==this.display.length){if(this.elements.preview){if(this.options.preview)return this.elements.preview.addClass("has-preview").show(),this.preview=new minplayer.image(this.elements.preview,this.options),this.preview.load(this.options.preview),!0;this.elements.preview.hide()}return!1}},minplayer.playLoader.prototype.checkVisibility=function(){this.enabled&&(this.busy.flag?this.elements.busy.show():this.elements.busy.hide(),this.bigPlay.flag?this.elements.bigPlay.show():this.elements.bigPlay.hide(),this.previewFlag.flag?this.elements.preview.show():this.elements.preview.hide(),(this.bigPlay.flag||this.busy.flag||this.previewFlag.flag)&&this.display.show(),this.bigPlay.flag||this.busy.flag||this.previewFlag.flag||this.display.hide())};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.base=function(a,b,c){minplayer.display.call(this,"media",a,b,c)},minplayer.players.base.prototype=new minplayer.display,minplayer.players.base.prototype.constructor=minplayer.players.base,minplayer.players.base.prototype.getElements=function(){var a=minplayer.display.prototype.getElements.call(this);return jQuery.extend(a,{media:this.options.mediaelement})},minplayer.players.base.prototype.defaultOptions=function(a){a.range={min:0,max:0},minplayer.display.prototype.defaultOptions.call(this,a)},minplayer.players.base.getPriority=function(){return 0},minplayer.players.base.getMediaId=function(){return""},minplayer.players.base.canPlay=function(){return!1},minplayer.players.base.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.elements.media&&(this.poster=this.elements.media.attr("poster")),this.options.pluginName="basePlayer",this.readyQueue=[],this.loadedQueue=[],this.mediaFile=this.options.file,this.clear(),this.setupPlayer()},minplayer.players.base.prototype.setupPlayer=function(){this.playerFound()||this.addPlayer(),this.player=this.getPlayer(),minplayer.click(this.display,function(a){return function(){a.playing?a.pause():a.play()}}(this)),jQuery(document).bind("keydown",function(a){return function(b){if(a.hasFocus)switch(b.preventDefault(),b.keyCode){case 32:case 179:a.playing?a.pause():a.play();break;case 38:a.setVolumeRelative(.1);break;case 40:a.setVolumeRelative(-.1);break;case 37:case 227:a.seekRelative(-.05);break;case 39:case 228:a.seekRelative(.05)}}}(this))},minplayer.players.base.prototype.addPlayer=function(){this.elements.media&&this.elements.media.remove(),this.elements.media=jQuery(this.createPlayer()),this.display.html(this.elements.media)},minplayer.players.base.prototype.destroy=function(){minplayer.plugin.prototype.destroy.call(this),this.clear()},minplayer.players.base.prototype.clear=function(){this.playerReady=!1,this.reset(),this.player&&(jQuery(this.player).remove(),this.player=null)},minplayer.players.base.prototype.reset=function(){this.realDuration=0,this.duration=new minplayer.async,this.currentTime=new minplayer.async,this.bytesLoaded=new minplayer.async,this.bytesTotal=new minplayer.async,this.bytesStart=new minplayer.async,this.volume=new minplayer.async,this.hasFocus=!1,this.playing=!1,this.loading=!1,this.loaded=!1,this.trigger("pause",null,!0),this.trigger("waiting",null,!0),this.trigger("progress",{loaded:0,total:0,start:0},!0),this.trigger("timeupdate",{currentTime:0,duration:0},!0)},minplayer.players.base.prototype.onReady=function(){if(!this.playerReady)if(this.setStartStop(),this.playerReady=!0,this.setVolume(this.options.volume/100),this.loading=!0,this.poll("progress",function(a){return function(){return a.loading&&a.getBytesLoaded(function(b){a.getBytesTotal(function(c){if(b||c){var d=0;a.getBytesStart(function(a){d=a}),a.trigger("progress",{loaded:b,total:c,start:d}),b>=c&&(a.loading=!1)}})}),a.loading}}(this),1e3),this.ready(),this.isReady()){for(var a in this.readyQueue)this.readyQueue[a].call(this);this.readyQueue.length=0,this.readyQueue=[],this.loaded||this.trigger("loadstart")}else this.readyQueue.length=0,this.readyQueue=[]},minplayer.players.base.prototype.parseTime=function(a){var b=0,c=0,d=0;return a?("string"!=typeof a&&(a=String(a)),b=a.match(/([0-9]+)s/i),b&&(b=parseInt(b[1],10)),c=a.match(/([0-9]+)m/i),c&&(b+=60*parseInt(c[1],10)),d=a.match(/([0-9]+)h/i),d&&(b+=3600*parseInt(d[1],10)),b||(b=a),Number(b)):0},minplayer.players.base.prototype.setStartStop=function(){return this.startTime?this.startTime:(this.startTime=0,this.offsetTime=this.parseTime(this.options.range.min),minplayer.urlVars&&(this.startTime=this.parseTime(minplayer.urlVars.seek)),this.startTime||(this.startTime=this.offsetTime),this.stopTime=this.options.range.max?this.parseTime(this.options.range.max):0,this.mediaRange=this.stopTime-this.offsetTime,this.mediaRange<0&&(this.mediaRange=0),this.startTime)},minplayer.players.base.prototype.onPlaying=function(){if(!this.playing){var a=this;this.getDuration(function(b){a.startTime&&a.startTime-1&&1>a?(c/d+parseFloat(a))*d:c+parseFloat(a),b.seek(e)}})}}(this))},minplayer.players.base.prototype.seek=function(a,b,c){this.whenLoaded(function(){a=Number(a),c||(a+=this.offsetTime),this._seek(a),b&&b.call(this)})},minplayer.players.base.prototype._seek=function(){},minplayer.players.base.prototype.setVolumeRelative=function(a){this.getVolume(function(b){return function(c){c+=parseFloat(a),c=0>c?0:c,c=c>1?1:c,b.setVolume(c)}}(this))},minplayer.players.base.prototype.setVolume=function(a,b){this.trigger("volumeupdate",a),this.whenLoaded(b)},minplayer.players.base.prototype.getValue=function(a,b,c){this.whenLoaded(function(){var d=this;this[a](function(a){null!==a?c.call(d,a):d[b].get(c)})})},minplayer.players.base.prototype.getVolume=function(a){this.getValue("_getVolume","volume",a)},minplayer.players.base.prototype._getVolume=function(a){a(null)},minplayer.players.base.prototype.getCurrentTime=function(a){var b=this;this.getValue("_getCurrentTime","currentTime",function(c){b.setStartStop(),b.stopTime&&c>b.stopTime&&b.stop(function(){b.onComplete()}),c-=b.offsetTime,a(c)})},minplayer.players.base.prototype._getCurrentTime=function(a){a(null)},minplayer.players.base.prototype.getDuration=function(a){if(this.options.duration)a(this.options.duration);else{var b=this;this.getValue("_getDuration","duration",function(c){b.setStartStop(),b.realDuration=c,a(b.mediaRange?b.mediaRange:c) +})}},minplayer.players.base.prototype._getDuration=function(a){a(null)},minplayer.players.base.prototype.getBytesStart=function(a){this.getValue("_getBytesStart","bytesStart",a)},minplayer.players.base.prototype._getBytesStart=function(a){a(null)},minplayer.players.base.prototype.getBytesLoaded=function(a){this.getValue("_getBytesLoaded","bytesLoaded",a)},minplayer.players.base.prototype._getBytesLoaded=function(a){a(null)},minplayer.players.base.prototype.getBytesTotal=function(a){this.getValue("_getBytesTotal","bytesTotal",a)},minplayer.players.base.prototype._getBytesTotal=function(a){a(null)};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.dailymotion=function(a,b,c){this.quality="default",minplayer.players.base.call(this,a,b,c)},minplayer.players.dailymotion.prototype=new minplayer.players.base,minplayer.players.dailymotion.prototype.constructor=minplayer.players.dailymotion,minplayer.players.dailymotion.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="dailymotion"},minplayer.players.dailymotion.getPriority=function(){return 10},minplayer.players.dailymotion.canPlay=function(a){if("video/dailymotion"===a.mimetype)return!0;var b=/^http(s)?\:\/\/(www\.)?(dailymotion\.com)/i;return 0===a.path.search(b)},minplayer.players.dailymotion.getMediaId=function(a){var b="^http[s]?\\:\\/\\/(www\\.)?";b+="(dailymotion\\.com\\/video/)",b+="([a-z0-9\\-]+)",b+="_*";var c=RegExp(b,"i");return 0===a.path.search(c)?a.path.match(c)[3]:a.path},minplayer.players.dailymotion.getImage=function(a,b,c){c("http://www.dailymotion.com/thumbnail/video/"+a.id)},minplayer.players.dailymotion.parseNode=function(){return{title:node.title,description:node.description,mediafiles:{image:{thumbnail:{path:node.thumbnail_small_url},image:{path:node.thumbnail_url}},media:{media:{player:"dailymotion",id:node.id}}}}},minplayer.players.dailymotion.getNode=function(a,b){var c="https://api.dailymotion.com/video/"+a.id;c+="?fields=title,id,description,thumbnail_small_url,thumbnail_url",jQuery.get(c,function(a){b(minplayer.players.dailymotion.parseNode(a.data))},"jsonp")},minplayer.players.dailymotion.prototype.onReady=function(){minplayer.players.base.prototype.onReady.call(this),this.options.autoplay||this.pause(),this.onLoaded()},minplayer.players.dailymotion.prototype.playerFound=function(){return this.display.find(this.mediaFile.type).length>0},minplayer.players.dailymotion.prototype.onQualityChange=function(a){this.quality=a.data},minplayer.players.dailymotion.prototype.hasPlayLoader=function(a){return minplayer.hasTouch||!a},minplayer.players.dailymotion.prototype.hasController=function(){return minplayer.isIDevice},minplayer.players.dailymotion.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a=document.location.protocol;if(a+="//api.dmcdn.net/all.js",0===jQuery('script[src="'+a+'"]').length){var b=document.createElement("script");b.src=a;var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(b,c)}return this.playerId=this.options.id+"-player",this.poll(this.options.id+"_dailymotion",function(a){return function(){var b=jQuery("#"+a.playerId).length>0;if(b=b&&"DM"in window,b=b&&"function"==typeof DM.player){jQuery("#"+a.playerId).addClass("dailymotion-player");var c={};c={id:a.playerId,api:minplayer.isIDevice?0:1,wmode:"opaque",controls:minplayer.isAndroid?1:0,related:0,info:0,logo:0},a.player=new DM.player(a.playerId,{video:a.mediaFile.id,height:"100%",width:"100%",frameborder:0,params:c}),a.player.addEventListener("apiready",function(){a.onReady(a)}),a.player.addEventListener("ended",function(){a.onComplete(a)}),a.player.addEventListener("playing",function(){a.onPlaying(a)}),a.player.addEventListener("progress",function(){a.onWaiting(a)}),a.player.addEventListener("pause",function(){a.onPaused(a)}),a.player.addEventListener("error",function(){a.onError(a)})}return!b}}(this),200),jQuery(document.createElement("div")).attr({id:this.playerId})},minplayer.players.dailymotion.prototype.load=function(a,b){minplayer.players.base.prototype.load.call(this,a,function(){this.player.load(a.id),b&&b.call(this)})},minplayer.players.dailymotion.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.onWaiting(),this.player.play(),a&&a.call(this)})},minplayer.players.dailymotion.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.loaded&&(this.player.pause(),a&&a.call(this))})},minplayer.players.dailymotion.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.pause(),a&&a.call(this)})},minplayer.players.dailymotion.prototype._seek=function(a){this.onWaiting(),this.player.seek(a)},minplayer.players.dailymotion.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.loaded&&(this.player.setVolume(a),void 0!==b&&b.call(this))})},minplayer.players.dailymotion.prototype._getVolume=function(a){a(this.player.volume)},minplayer.players.dailymotion.prototype._getDuration=function(a){a(this.player.duration)},minplayer.players.dailymotion.prototype._getCurrentTime=function(a){a(this.player.currentTime)};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.html5=function(a,b,c){minplayer.players.base.call(this,a,b,c)},minplayer.players.html5.prototype=new minplayer.players.base,minplayer.players.html5.prototype.constructor=minplayer.players.html5,minplayer.players.html5.getPriority=function(){return 10},minplayer.players.html5.canPlay=function(a){switch(a.mimetype){case"video/ogg":return!!minplayer.playTypes.videoOGG;case"video/mp4":case"video/x-mp4":case"video/m4v":case"video/x-m4v":return!!minplayer.playTypes.videoH264;case"application/vnd.apple.mpegurl":return!!minplayer.playTypes.videoMPEGURL;case"video/x-webm":case"video/webm":case"application/octet-stream":return!!minplayer.playTypes.videoWEBM;case"audio/ogg":return!!minplayer.playTypes.audioOGG;case"audio/mpeg":return!!minplayer.playTypes.audioMP3;case"audio/mp4":return!!minplayer.playTypes.audioMP4;default:return!1}},minplayer.players.html5.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="html5",this.hasEnded=!1,this.addPlayerEvents()},minplayer.players.html5.prototype.addPlayerEvent=function(a,b){this.player&&this.player.addEventListener(a,function(c){var d=a+"Event";return c[d]&&c.player.removeEventListener(a,c[d],!1),c[d]=function(a){b.call(c,a)},c[d]}(this),!1)},minplayer.players.html5.prototype.addPlayerEvents=function(){if(this.player){this.addPlayerEvent("abort",function(){this.trigger("abort")}),this.addPlayerEvent("loadstart",function(){this.onReady(),this.options.autoload||this.onLoaded()}),this.addPlayerEvent("loadeddata",function(){this.onLoaded()}),this.addPlayerEvent("loadedmetadata",function(){this.onLoaded()}),this.addPlayerEvent("canplaythrough",function(){this.onLoaded()}),this.addPlayerEvent("ended",function(){this.hasEnded=!0,this.onComplete()}),this.addPlayerEvent("pause",function(){this.onPaused()}),this.addPlayerEvent("play",function(){this.onPlaying()}),this.addPlayerEvent("playing",function(){this.onPlaying()});var a=!1;return this.addPlayerEvent("error",function(){this.hasEnded||a||!this.player||(a=!0,this.trigger("error","An error occured - "+this.player.error.code))}),this.addPlayerEvent("waiting",function(){this.onWaiting()}),this.addPlayerEvent("durationchange",function(){if(this.player){this.duration.set(this.player.duration);var a=this;this.getDuration(function(b){a.trigger("durationchange",{duration:b})})}}),this.addPlayerEvent("progress",function(a){this.bytesTotal.set(a.total),this.bytesLoaded.set(a.loaded)}),!0}return!1},minplayer.players.html5.prototype.onReady=function(){minplayer.players.base.prototype.onReady.call(this),minplayer.isAndroid&&this.onLoaded(),minplayer.isIDevice&&setTimeout(function(a){return function(){a.pause(),a.onLoaded()}}(this),1)},minplayer.players.html5.prototype.playerFound=function(){return this.display.find(this.mediaFile.type).length>0},minplayer.players.html5.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a=jQuery(document.createElement(this.mediaFile.type)).attr(this.options.attributes).append(jQuery(document.createElement("source")).attr({src:this.mediaFile.path}));a.eq(0)[0].setAttribute("width","100%"),a.eq(0)[0].setAttribute("height","100%");var b=this.options.autoload?"metadata":"none";return b=minplayer.isIDevice?"metadata":b,a.eq(0)[0].setAttribute("preload",b),this.options.autoload||a.eq(0)[0].setAttribute("autobuffer",!1),a},minplayer.players.html5.prototype.getPlayer=function(){return this.elements.media.eq(0)[0]},minplayer.players.html5.prototype.load=function(a,b){minplayer.players.base.prototype.load.call(this,a,function(){this.hasEnded=!1;var c=this.elements.media.attr("src");c||(c=jQuery("source",this.elements.media).eq(0).attr("src")),c!==a.path&&(this.addPlayer(),this.player=this.getPlayer(),this.addPlayerEvents(),this.player.src=a.path,b&&b.call(this))})},minplayer.players.html5.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.player.play(),a&&a.call(this)})},minplayer.players.html5.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.player.pause(),a&&a.call(this)})},minplayer.players.html5.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.pause(),a&&a.call(this)})},minplayer.players.html5.prototype.clear=function(){minplayer.players.base.prototype.clear.call(this),this.player&&(this.player.src="")},minplayer.players.html5.prototype._seek=function(a){this.player.currentTime=a},minplayer.players.html5.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.player.volume=a,b&&b.call(this)})},minplayer.players.html5.prototype._getVolume=function(a){a(this.player.volume)},minplayer.players.html5.prototype._getDuration=function(a){a(this.player.duration)},minplayer.players.html5.prototype._getCurrentTime=function(a){a(this.player.currentTime)},minplayer.players.html5.prototype._getBytesLoaded=function(a){var b=0;this.bytesLoaded.value?b=this.bytesLoaded.value:this.player.buffered&&this.player.buffered.length>0&&this.player.buffered.end&&this.player.duration?b=this.player.buffered.end(0):void 0!==this.player.bytesTotal&&this.player.bytesTotal>0&&void 0!==this.player.bufferedBytes&&(b=this.player.bufferedBytes),a(b)},minplayer.players.html5.prototype._getBytesTotal=function(a){var b=0;this.bytesTotal.value?b=this.bytesTotal.value:this.player.buffered&&this.player.buffered.length>0&&this.player.buffered.end&&this.player.duration?b=this.player.duration:void 0!==this.player.bytesTotal&&this.player.bytesTotal>0&&void 0!==this.player.bufferedBytes&&(b=this.player.bytesTotal),a(b)};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.flash=function(a,b,c){minplayer.players.base.call(this,a,b,c)},minplayer.players.flash.prototype=new minplayer.players.base,minplayer.players.flash.prototype.constructor=minplayer.players.flash,minplayer.players.flash.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="flash"},minplayer.players.flash.getPriority=function(){return 0},minplayer.players.flash.canPlay=function(){return!1},minplayer.players.flash.prototype.getFlash=function(a){var b=document.createElement("script");b.src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js";var c=document.getElementsByTagName("script")[0];return c.parentNode.insertBefore(b,c),setTimeout(function(b){return function c(){"undefined"!=typeof swfobject?swfobject.embedSWF(a.swf,a.id,a.width,a.height,"9.0.0",!1,a.flashvars,{allowscriptaccess:"always",allowfullscreen:"true",wmode:a.wmode,quality:"high"},{id:a.id,name:a.id,playerType:"flash"},function(a){b.player=a.ref}):setTimeout(c,200)}}(this),200),'
'},minplayer.players.flash.prototype.playerFound=function(){return this.display.find('object[playerType="flash"]').length>0};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.minplayer=function(a,b,c){minplayer.players.flash.call(this,a,b,c)},minplayer.players.minplayer.prototype=new minplayer.players.flash,minplayer.players.minplayer.prototype.constructor=minplayer.players.minplayer,minplayer.players.minplayer.prototype.construct=function(){minplayer.players.flash.prototype.construct.call(this),this.options.pluginName="minplayer"},window.onFlashPlayerReady=function(a){for(var b=minplayer.get(a,"media"),c=b.length;c--;)b[c].onReady()},window.onFlashPlayerUpdate=function(a,b){for(var c=minplayer.get(a,"media"),d=c.length;d--;)c[d].onMediaUpdate(b)},window.onFlashPlayerDebug=function(a){console&&console.log&&console.log(a)},minplayer.players.minplayer.getPriority=function(a){return a.stream?100:1},minplayer.players.minplayer.canPlay=function(a){if(a.stream)return!0;var b=jQuery.inArray(a.mimetype,["video/x-webm","video/webm","application/octet-stream"])>=0;return!b&&("video"===a.type||"audio"===a.type)},minplayer.players.minplayer.prototype.createPlayer=function(){this.options.swfplayer||(this.options.swfplayer="http://mediafront.org/assets/osmplayer/minplayer",this.options.swfplayer+="/flash/minplayer.swf"),minplayer.players.flash.prototype.createPlayer.call(this);var a={id:this.options.id,debug:this.options.debug,config:"nocontrols",file:this.mediaFile.path,autostart:this.options.autoplay,autoload:this.options.autoload};return this.mediaFile.stream&&(a.stream=this.mediaFile.stream),this.getFlash({swf:this.options.swfplayer,id:this.options.id+"_player",width:"100%",height:"100%",flashvars:a,wmode:this.options.wmode})},minplayer.players.minplayer.prototype.onMediaUpdate=function(a){switch(a){case"mediaMeta":this.onLoaded();break;case"mediaConnected":this.onLoaded(),this.onPaused();break;case"mediaPlaying":this.onPlaying();break;case"mediaPaused":this.onPaused();break;case"mediaComplete":this.onComplete()}},minplayer.players.minplayer.prototype.load=function(a,b){minplayer.players.flash.prototype.load.call(this,a,function(){this.loaded?this.stop(function(){this.player.loadMedia(a.path,a.stream),b&&b.call(this)}):(this.player.loadMedia(a.path,a.stream),b&&b.call(this))})},minplayer.players.minplayer.prototype.play=function(a){minplayer.players.flash.prototype.play.call(this,function(){this.player.playMedia(),a&&a.call(this)})},minplayer.players.minplayer.prototype.pause=function(a){minplayer.players.flash.prototype.pause.call(this,function(){this.player.pauseMedia(),a&&a.call(this)})},minplayer.players.minplayer.prototype.stop=function(a){minplayer.players.flash.prototype.stop.call(this,function(){this.player.stopMedia(),a&&a.call(this)})},minplayer.players.minplayer.prototype._seek=function(a){this.player.seekMedia(a)},minplayer.players.minplayer.prototype.setVolume=function(a,b){minplayer.players.flash.prototype.setVolume.call(this,a,function(){this.player.setVolume(a),b&&b.call(this)})},minplayer.players.minplayer.prototype._getVolume=function(a){a(this.player.getVolume())},minplayer.players.minplayer.prototype._getDuration=function(a){var b=this,c=0,d=function(){c=b.player.getDuration(),c?a(c):setTimeout(d,1e3)};d()},minplayer.players.minplayer.prototype._getCurrentTime=function(a){a(this.player.getCurrentTime())},minplayer.players.minplayer.prototype._getBytesLoaded=function(a){a(this.player.getMediaBytesLoaded())},minplayer.players.minplayer.prototype._getBytesTotal=function(a){a(this.player.getMediaBytesTotal())};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.youtube=function(a,b,c){this.quality="default",minplayer.players.base.call(this,a,b,c)},minplayer.players.youtube.prototype=new minplayer.players.base,minplayer.players.youtube.prototype.constructor=minplayer.players.youtube,minplayer.players.youtube.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="youtube"},minplayer.players.youtube.getPriority=function(){return 10},minplayer.players.youtube.canPlay=function(a){if("video/youtube"===a.mimetype)return!0;var b=/^http(s)?\:\/\/(www\.)?(youtube\.com|youtu\.be)/i;return 0===a.path.search(b)},minplayer.players.youtube.getMediaId=function(a){var b="^http[s]?\\:\\/\\/(www\\.)?";b+="(youtube\\.com\\/watch\\?v=|youtu\\.be\\/)",b+="([a-zA-Z0-9_\\-]+)";var c=RegExp(b,"i");return 0===a.path.search(c)?a.path.match(c)[3]:a.path},minplayer.players.youtube.getImage=function(a,b,c){b="thumbnail"===b?"1":"0",c("https://img.youtube.com/vi/"+a.id+"/"+b+".jpg")},minplayer.players.youtube.parseNode=function(a){var b="undefined"!=typeof a.video?a.video:a;return{title:b.title,description:b.description,mediafiles:{image:{thumbnail:{path:b.thumbnail.sqDefault},image:{path:b.thumbnail.hqDefault}},media:{media:{player:"youtube",id:b.id}}}}},minplayer.players.youtube.getNode=function(a,b){var c="https://gdata.youtube.com/feeds/api/videos/"+a.id;c+="?v=2&alt=jsonc",jQuery.get(c,function(a){b(minplayer.players.youtube.parseNode(a.data))})},minplayer.players.youtube.prototype.setPlayerState=function(a){switch(a){case YT.PlayerState.CUED:break;case YT.PlayerState.BUFFERING:this.onWaiting();break;case YT.PlayerState.UNSTARTED:case YT.PlayerState.PAUSED:this.onPaused();break;case YT.PlayerState.PLAYING:this.onPlaying();break;case YT.PlayerState.ENDED:this.onComplete()}},minplayer.players.youtube.prototype.onReady=function(){minplayer.players.base.prototype.onReady.call(this),this.options.autoplay||this.pause(),this.onLoaded()},minplayer.players.youtube.prototype.playerFound=function(){var a="iframe#"+this.options.id+"-player.youtube-player",b=this.display.find(a);return b.length>0},minplayer.players.youtube.prototype.onPlayerStateChange=function(a){this.setPlayerState(a.data)},minplayer.players.youtube.prototype.onQualityChange=function(a){this.quality=a.data},minplayer.players.youtube.prototype.hasPlayLoader=function(a){return minplayer.hasTouch||!a},minplayer.players.youtube.prototype.hasController=function(){return minplayer.isIDevice},minplayer.players.youtube.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a="https://www.youtube.com/iframe_api";if(0===jQuery('script[src="'+a+'"]').length){var b=document.createElement("script");b.src=a;var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(b,c)}return this.playerId=this.options.id+"-player",this.poll(this.options.id+"_youtube",function(a){return function(){var b=jQuery("#"+a.playerId).length>0;if(b=b&&"YT"in window,b=b&&"function"==typeof YT.Player){jQuery("#"+a.playerId).addClass("youtube-player");var c=location.protocol;c+="//"+location.hostname,c+=location.port&&":"+location.port;var d={};minplayer.isIDevice?d.origin=c:d={enablejsapi:minplayer.isIDevice?0:1,origin:c,wmode:"opaque",controls:minplayer.isAndroid?1:0,rel:0,showinfo:0},a.player=new YT.Player(a.playerId,{height:"100%",width:"100%",frameborder:0,videoId:a.mediaFile.id,playerVars:d,events:{onReady:function(b){a.onReady(b)},onStateChange:function(b){a.onPlayerStateChange(b)},onPlaybackQualityChange:function(b){a.onQualityChange(b)},onError:function(b){a.onError(b)}}})}return!b}}(this),200),jQuery(document.createElement("div")).attr({id:this.playerId})},minplayer.players.youtube.prototype.load=function(a,b){minplayer.players.base.prototype.load.call(this,a,function(){this.player.loadVideoById(a.id,0,this.quality),b&&b.call(this)})},minplayer.players.youtube.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.onWaiting(),this.player.playVideo(),a&&a.call(this)})},minplayer.players.youtube.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.player.pauseVideo(),a&&a.call(this)})},minplayer.players.youtube.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.stopVideo(),a&&a.call(this)})},minplayer.players.youtube.prototype._seek=function(a){this.onWaiting(),this.player.seekTo(a,!0)},minplayer.players.youtube.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.player.setVolume(100*a),b&&b.call(this)})},minplayer.players.youtube.prototype._getVolume=function(a){a(this.player.getVolume())},minplayer.players.youtube.prototype._getDuration=function(a){a(this.player.getDuration())},minplayer.players.youtube.prototype._getCurrentTime=function(a){a(this.player.getCurrentTime())},minplayer.players.youtube.prototype._getBytesStart=function(a){a(this.player.getVideoStartBytes())},minplayer.players.youtube.prototype._getBytesLoaded=function(a){a(this.player.getVideoBytesLoaded())},minplayer.players.youtube.prototype._getBytesTotal=function(a){a(this.player.getVideoBytesTotal())};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.vimeo=function(a,b,c){minplayer.players.base.call(this,a,b,c)},minplayer.players.vimeo.prototype=new minplayer.players.base,minplayer.players.vimeo.prototype.constructor=minplayer.players.vimeo,minplayer.players.vimeo.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="vimeo"},minplayer.players.vimeo.getPriority=function(){return 10},minplayer.players.vimeo.canPlay=function(a){return"video/vimeo"===a.mimetype?!0:0===a.path.search(/^http(s)?\:\/\/(www\.)?vimeo\.com/i)},minplayer.players.vimeo.prototype.hasPlayLoader=function(){return minplayer.hasTouch},minplayer.players.vimeo.prototype.hasController=function(){return minplayer.hasTouch},minplayer.players.vimeo.getMediaId=function(a){var b=/^http[s]?\:\/\/(www\.)?vimeo\.com\/(\?v\=)?([0-9]+)/i;return 0===a.path.search(b)?a.path.match(b)[3]:a.path},minplayer.players.vimeo.parseNode=function(a){return{title:a.title,description:a.description,mediafiles:{image:{thumbnail:{path:a.thumbnail_small},image:{path:a.thumbnail_large}},media:{media:{player:"vimeo",id:a.id}}}}},minplayer.players.vimeo.nodes={},minplayer.players.vimeo.getNode=function(a,b){minplayer.players.vimeo.nodes.hasOwnProperty(a.id)?b(minplayer.players.vimeo.nodes[a.id]):jQuery.ajax({url:"https://vimeo.com/api/v2/video/"+a.id+".json",dataType:"jsonp",success:function(c){var d=minplayer.players.vimeo.parseNode(c[0]);minplayer.players.vimeo.nodes[a.id]=d,b(d)}})},minplayer.players.vimeo.getImage=function(a,b,c){minplayer.players.vimeo.getNode(a,function(a){c(a.mediafiles.image.image)})},minplayer.players.vimeo.prototype.reset=function(){minplayer.players.base.prototype.reset.call(this)},minplayer.players.vimeo.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a="http://a.vimeocdn.com/js/froogaloop2.min.js";if(0===jQuery('script[src="'+a+'"]').length){var b=document.createElement("script");b.src=a;var c=document.getElementsByTagName("script")[0];c.parentNode.insertBefore(b,c)}var d=document.createElement("iframe");d.setAttribute("id",this.options.id+"-player"),d.setAttribute("type","text/html"),d.setAttribute("width","100%"),d.setAttribute("height","100%"),d.setAttribute("frameborder","0"),jQuery(d).addClass("vimeo-player");var e="https://player.vimeo.com/video/";return e+=this.mediaFile.id+"?",e+=jQuery.param({wmode:"opaque",api:1,player_id:this.options.id+"-player",title:0,byline:0,portrait:0,loop:this.options.loop}),d.setAttribute("src",e),this.poll(this.options.id+"_vimeo",function(a){return function(){if(window.Froogaloop){a.player=window.Froogaloop(d);var b=0;a.player.addEvent("ready",function(){clearTimeout(b),a.onReady(),a.onError("")}),b=setTimeout(function(){a.onReady()},3e3)}return!window.Froogaloop}}(this),200),this.trigger("loadstart"),d},minplayer.players.vimeo.prototype.onReady=function(){this.player.addEvent("loadProgress",function(a){return function(b){a.duration.set(parseFloat(b.duration)),a.bytesLoaded.set(b.bytesLoaded),a.bytesTotal.set(b.bytesTotal)}}(this)),this.player.addEvent("playProgress",function(a){return function(b){a.duration.set(parseFloat(b.duration)),a.currentTime.set(parseFloat(b.seconds))}}(this)),this.player.addEvent("play",function(a){return function(){a.onPlaying()}}(this)),this.player.addEvent("pause",function(a){return function(){a.onPaused()}}(this)),this.player.addEvent("finish",function(a){return function(){a.onComplete()}}(this)),minplayer.players.base.prototype.onReady.call(this),this.onLoaded(),this.options.autoplay&&this.play()},minplayer.players.vimeo.prototype.clear=function(){this.player&&this.player.api("unload"),minplayer.players.base.prototype.clear.call(this)},minplayer.players.vimeo.prototype.load=function(a,b){minplayer.players.base.prototype.load.call(this,a,function(){this.construct(),b&&b.call(this)})},minplayer.players.vimeo.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.player.api("play"),a&&a.call(this)})},minplayer.players.vimeo.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.player.api("pause"),a&&a.call(this)})},minplayer.players.vimeo.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.api("unload"),a&&a.call(this)})},minplayer.players.vimeo.prototype._seek=function(a){this.player.api("seekTo",a)},minplayer.players.vimeo.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.volume.set(a),this.player.api("setVolume",a),b&&b.call(this)})},minplayer.players.vimeo.prototype._getVolume=function(a){this.player.api("getVolume",function(b){a(b)})},minplayer.players.vimeo.prototype._getDuration=function(a){this.player.api("getDuration",function(b){a(b)})};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.limelight=function(a,b){minplayer.players.flash.call(this,a,b)},minplayer.players.limelight.prototype=new minplayer.players.flash,minplayer.players.limelight.prototype.constructor=minplayer.players.limelight,minplayer.players.limelight.prototype.construct=function(){minplayer.players.flash.prototype.construct.call(this),this.options.pluginName="limelight"},minplayer.players.limelight.getPriority=function(){return 10},minplayer.players.limelight.canPlay=function(a){if("video/limelight"===a.mimetype)return!0;var b=/.*limelight\.com.*/i;return 0===a.path.search(b)},minplayer.players.limelight.getMediaId=function(a){var b=/.*limelight\.com.*mediaId=([a-zA-Z0-9]+)/i;return 0===a.path.search(b)?a.path.match(b)[1]:a.path},minplayer.players.limelight.prototype.register=function(){window.delvePlayerCallback=function(a,b,c){var d=a.replace("-player","");jQuery.each(minplayer.get(d,"media"),function(a,d){d.onMediaUpdate(b,c)})}},minplayer.players.limelight.prototype.onMediaUpdate=function(a,b){switch(a){case"onPlayerLoad":this.onReady();break;case"onMediaLoad":if(this.complete)return this.pause(),void this.onPaused();this.shouldSeek=this.startTime>0,this.onLoaded();break;case"onMediaComplete":this.complete=!0,this.onComplete();break;case"onPlayheadUpdate":!b.positionInMilliseconds||this.playing||this.complete||this.onPlaying(),this.complete=!1,this.shouldSeek&&this.seekValue?(this.shouldSeek=!1,this.seek(this.seekValue)):(this.duration.set(b.durationInMilliseconds/1e3),this.currentTime.set(b.positionInMilliseconds/1e3));break;case"onError":this.onError();break;case"onPlayStateChanged":b.isPlaying?this.onPlaying():b.isBusy?this.onWaiting():this.onPaused()}},minplayer.players.limelight.prototype.createPlayer=function(){minplayer.players.flash.prototype.createPlayer.call(this);var a=document.createElement("script");a.src="https://assets.delvenetworks.com/player/embed.js";var b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b),this.register();var c={deepLink:"true",autoplay:this.options.autoplay?"true":"false",startQuality:"HD"},d=null,e=this.options.channel;e||(d=/.*limelight\.com.*channelId=([a-zA-Z0-9]+)/i,0===this.mediaFile.path.search(d)&&(e=this.mediaFile.path.match(d)[1])),e&&"media"===this.mediaFile.queueType&&(c.adConfigurationChannelId=e);var f=this.options.playerForm;f||(d=/.*limelight\.com.*playerForm=([a-zA-Z0-9]+)/i,0===this.mediaFile.path.search(d)&&(f=this.mediaFile.path.match(d)[1])),f&&(c.playerForm=f),c.mediaId=this.mediaFile.id;var g=this.options.id+"-player";return setTimeout(function h(){window.hasOwnProperty("LimelightPlayerUtil")?window.LimelightPlayerUtil.initEmbed(g):setTimeout(h,1e3)},1e3),this.getFlash({swf:document.location.protocol+"//assets.delvenetworks.com/player/loader.swf",id:g,width:this.options.width,height:"100%",flashvars:c,wmode:this.options.wmode})},minplayer.players.limelight.prototype.play=function(a){minplayer.players.flash.prototype.play.call(this,function(){this.player.doPlay(),a&&a.call(this)})},minplayer.players.limelight.prototype.pause=function(a){minplayer.players.flash.prototype.pause.call(this,function(){this.player.doPause(),a&&a.call(this)})},minplayer.players.limelight.prototype.stop=function(a){minplayer.players.flash.prototype.stop.call(this,function(){this.player.doPause(),a&&a.call(this)})},minplayer.players.limelight.prototype._seek=function(a){this.seekValue=a,this.player.doSeekToSecond(a)},minplayer.players.limelight.prototype.setVolume=function(a,b){minplayer.players.flash.prototype.setVolume.call(this,a,function(){this.player.doSetVolume(a),b&&b.call(this)})},minplayer.players.limelight.prototype._getVolume=function(a){a(this.player.doGetVolume())},minplayer.players.limelight.prototype.search=function(a){this.whenReady(function(){this.player.doSearch(a)})};var minplayer=minplayer||{};minplayer.players=minplayer.players||{},minplayer.players.kaltura=function(a,b){minplayer.players.base.call(this,a,b)},minplayer.players.kaltura.prototype=new minplayer.players.base,minplayer.players.kaltura.prototype.constructor=minplayer.players.kaltura,minplayer.players.kaltura.prototype.construct=function(){minplayer.players.base.prototype.construct.call(this),this.options.pluginName="kaltura",this.adPlaying=!1},minplayer.players.kaltura.prototype.defaultOptions=function(a){a.entryId=0,a.uiConfId=0,a.partnerId=0,minplayer.players.base.prototype.defaultOptions.call(this,a)},minplayer.players.kaltura.getPriority=function(){return 10},minplayer.players.kaltura.canPlay=function(a){if("video/kaltura"===a.mimetype)return!0;var b=/.*kaltura\.com.*/i;return 0===a.path.search(b)},minplayer.players.kaltura.prototype.adStart=function(){this.adPlaying=!0,this.onPlaying()},minplayer.players.kaltura.prototype.adEnd=function(){this.adPlaying=!1},minplayer.players.kaltura.prototype.playerStateChange=function(a){if(!this.adPlaying)switch(a){case"ready":this.onLoaded();break;case"loading":case"buffering":this.onWaiting();break;case"playing":this.onPlaying();break;case"paused":this.onPaused()}},minplayer.players.kaltura.prototype.mediaReady=function(){this.onLoaded()},minplayer.players.kaltura.prototype.playerPlayEnd=function(){this.onComplete()},minplayer.players.kaltura.prototype.playUpdate=function(a){this.currentTime.set(a)},minplayer.players.kaltura.prototype.durationChange=function(a){this.duration.set(a.newValue)},minplayer.players.kaltura.prototype.getInstance=function(){if(this.instanceName)return this.instanceName;var a=this.uuid.split("__"),b="minplayer.plugins."+a[0];return b+="."+a[1],b+="["+(a[2]-1)+"]",this.instanceName=b,b},minplayer.players.kaltura.prototype.registerEvents=function(){this.player.addJsListener("adStart",this.getInstance()+".adStart"),this.player.addJsListener("adEnd",this.getInstance()+".adEnd"),this.player.addJsListener("playerStateChange",this.getInstance()+".playerStateChange"),this.player.addJsListener("durationChange",this.getInstance()+".durationChange"),this.player.addJsListener("mediaReady",this.getInstance()+".mediaReady"),this.player.addJsListener("playerUpdatePlayhead",this.getInstance()+".playUpdate"),this.player.addJsListener("playerPlayEnd",this.getInstance()+".playerPlayEnd") +},minplayer.players.kaltura.prototype.createPlayer=function(){minplayer.players.base.prototype.createPlayer.call(this);var a={},b=this;jQuery.each(["entryId","uiConfId","partnerId"],function(c,d){if(a[d]="",b.options[d])a[d]=b.options[d];else{var e=null;switch(d){case"entryId":e=/.*kaltura\.com.*entry_id\/([^\/]+)/i;break;case"uiConfId":e=/.*kaltura\.com.*uiconf_id\/([^\/]+)/i;break;case"partnerId":e=/.*kaltura\.com.*wid\/_([^\/]+)/i}e&&(a[d]=b.mediaFile.path.match(e),a[d]&&(a[d]=a[d][1]))}});var c=document.createElement("script");c.src="http://cdnapi.kaltura.com/p/",c.src+=a.partnerId,c.src+="/sp/",c.src+=a.partnerId,c.src+="00/embedIframeJs/uiconf_id/",c.src+=a.uiConfId,c.src+="/partner_id/",c.src+=a.partnerId;var d=document.getElementsByTagName("script")[0];d.parentNode.insertBefore(c,d);var e=this.options.id+"-player";return setTimeout(function f(){window.hasOwnProperty("kWidget")?kWidget.embed({targetId:e,wid:"_"+a.partnerId,uiconf_id:a.uiConfId,entry_id:a.entryId,flashvars:{autoPlay:!1},params:{wmode:"transparent"},readyCallback:function(a){b.player=jQuery("#"+a).get(0),b.registerEvents(),b.onReady()}}):setTimeout(f,1e3)},1e3),'
'},minplayer.players.kaltura.prototype.play=function(a){minplayer.players.base.prototype.play.call(this,function(){this.player.sendNotification("doPlay"),a&&a.call(this)})},minplayer.players.kaltura.prototype.pause=function(a){minplayer.players.base.prototype.pause.call(this,function(){this.player.sendNotification("doPause"),a&&a.call(this)})},minplayer.players.kaltura.prototype.stop=function(a){minplayer.players.base.prototype.stop.call(this,function(){this.player.sendNotification("doStop"),a&&a.call(this)})},minplayer.players.kaltura.prototype._seek=function(a){this.seekValue=a,this.player.sendNotification("doSeek",a)},minplayer.players.kaltura.prototype.setVolume=function(a,b){minplayer.players.base.prototype.setVolume.call(this,a,function(){this.player.sendNotification("changeVolume",a),b&&b.call(this)})};var minplayer=minplayer||{};minplayer.controller=function(a,b){minplayer.display.call(this,"controller",a,b)},minplayer.controller.prototype=new minplayer.display,minplayer.controller.prototype.constructor=minplayer.controller,minplayer.formatTime=function(a){a=a||0;var b=0,c=0,d=0,e="";return d=Math.floor(a/3600),a-=3600*d,c=Math.floor(a/60),a-=60*c,b=Math.floor(a%60),d&&(e+=String(d),e+=":"),e+=c>=10?String(c):"0"+String(c),e+=":",e+=b>=10?String(b):"0"+String(b),{time:e,units:""}},minplayer.controller.prototype.getElements=function(){var a=minplayer.display.prototype.getElements.call(this);return jQuery.extend(a,{play:null,pause:null,fullscreen:null,seek:null,progress:null,volume:null,timer:null})},minplayer.controller.prototype.defaultOptions=function(a){a.disptime=0,minplayer.display.prototype.defaultOptions.call(this,a)},minplayer.controller.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.options.pluginName="controller",this.dragging=!1,this.vol=0,this.elements.seek&&(this.seekBar=this.elements.seek.slider({range:"min",create:function(a){jQuery(".ui-slider-range",a.target).addClass("ui-state-active")}})),this.elements.volume&&(this.volumeBar=this.elements.volume.slider({animate:!0,range:"min",orientation:"vertical"})),this.get("player",function(a){this.elements.fullscreen&&minplayer.click(this.elements.fullscreen.unbind(),function(){a.toggleFullScreen()}).css({pointer:"hand"})}),this.get("media",function(a){a.hasController()?this.hide():(this.elements.pause&&(minplayer.click(this.elements.pause.unbind(),function(b){return function(c){c.preventDefault(),b.playPause(!1,a)}}(this)),a.ubind(this.uuid+":pause",function(a){return function(){a.setPlayPause(!0)}}(this))),this.elements.play&&(minplayer.click(this.elements.play.unbind(),function(b){return function(c){c.preventDefault(),b.playPause(!0,a)}}(this)),a.ubind(this.uuid+":playing",function(a){return function(){a.setPlayPause(!1)}}(this))),this.elements.duration&&(a.ubind(this.uuid+":durationchange",function(a){return function(b,c){var d=a.options.disptime||c.duration;a.setTimeString("duration",d)}}(this)),a.getDuration(function(a){return function(b){b=a.options.disptime||b,a.setTimeString("duration",b)}}(this))),this.elements.progress&&a.ubind(this.uuid+":progress",function(a){return function(b,c){var d=c.total?c.loaded/c.total*100:0;a.elements.progress.width(d+"%")}}(this)),(this.seekBar||this.elements.timer)&&a.ubind(this.uuid+":timeupdate",function(a){return function(b,c){if(!a.dragging){var d=0;c.duration&&(d=c.currentTime/c.duration*100),a.seekBar&&a.seekBar.slider("option","value",d),a.setTimeString("timer",c.currentTime)}}}(this)),this.seekBar&&this.seekBar.slider({start:function(a){return function(){a.dragging=!0}}(this),stop:function(b){return function(c,d){b.dragging=!1,a.getDuration(function(b){a.seek(d.value/100*b)})}}(this),slide:function(b){return function(c,d){a.getDuration(function(c){var e=d.value/100*c;b.dragging||a.seek(e),b.setTimeString("timer",e)})}}(this)}),this.elements.mute&&minplayer.click(this.elements.mute,function(b){return function(c){c.preventDefault();var d=b.volumeBar.slider("option","value");d>0?(b.vol=d,b.volumeBar.slider("option","value",0),a.setVolume(0)):(b.volumeBar.slider("option","value",b.vol),a.setVolume(b.vol/100))}}(this)),this.volumeBar&&(this.volumeBar.slider({slide:function(b,c){a.setVolume(c.value/100)}}),a.ubind(this.uuid+":volumeupdate",function(a){return function(b,c){a.volumeBar.slider("option","value",100*c)}}(this)),a.getVolume(function(a){return function(b){a.volumeBar.slider("option","value",100*b)}}(this))))}),this.ready()},minplayer.controller.prototype.setPlayPause=function(a){var b="";this.elements.play&&(b=a?"inherit":"none",this.elements.play.css("display",b)),this.elements.pause&&(b=a?"none":"inherit",this.elements.pause.css("display",b))},minplayer.controller.prototype.playPause=function(a,b){var c=a?"play":"pause";this.display.trigger(c),this.setPlayPause(!a),b&&b[c]()},minplayer.controller.prototype.setTimeString=function(a,b){this.elements[a]&&this.elements[a].text(minplayer.formatTime(b).time)};var osmplayer=osmplayer||{};!function(){}(osmplayer),jQuery.fn.osmplayer||(jQuery.event.special.playerdestroyed={remove:function(a){a.handler&&a.handler(this)}},jQuery.fn.osmplayer=function(a){return jQuery(this).each(function(){a=a||{},a.id=a.id||jQuery(this).attr("id")||Math.random(),minplayer.plugins[a.id]||(a.template=a.template||"default",osmplayer[a.template]?new osmplayer[a.template](jQuery(this),a):new osmplayer(jQuery(this),a))})}),osmplayer=function(a,b){minplayer.call(this,a,b)},osmplayer.prototype=new minplayer,osmplayer.prototype.constructor=osmplayer,osmplayer.prototype.create=function(a,b,c){return minplayer.prototype.create.call(this,a,"osmplayer",c)},osmplayer.prototype.defaultOptions=function(a){a.playlist="",a.node={},a.link="http://www.mediafront.org",a.logo="http://mediafront.org/assets/osmplayer/logo.png",minplayer.prototype.defaultOptions.call(this,a)},osmplayer.prototype.construct=function(){minplayer.prototype.construct.call(this),jQuery(this.display).bind("playerdestroyed",function(a){return function(b){if(b===a.display.eq(0)[0]){for(var c in minplayer.plugins[a.options.id]){for(var d in minplayer.plugins[a.options.id][c])minplayer.plugins[a.options.id][c][d].destroy(),delete minplayer.plugins[a.options.id][c][d];minplayer.plugins[a.options.id][c].length=0}delete minplayer.plugins[a.options.id],minplayer.plugins[a.options.id]=null}}}(this)),this.playQueue=[],this.playIndex=0,this.hasPlaylist=!1,this.create("playlist","osmplayer"),this.get("playlist",function(a){a.ubind(this.uuid+":nodeLoad",function(a){return function(b,c){a.hasPlaylist=!0,!a.options.autoplay&&c.autoplay&&("undefined"==typeof a.options.originalAutoPlay&&(a.options.originalAutoPlay=a.options.autoplay),a.options.autoplay=!0),a.loadNode(c)}}(this))}),this.get("media",function(a){a.ubind(this.uuid+":ended",function(a){return function(){"undefined"==typeof a.options.originalAutoPlay&&(a.options.originalAutoPlay=a.options.autoplay),a.options.autoplay=!0,a.playNext()}}(this))}),this.loadNode(this.options.node)},osmplayer.prototype.fullScreenElement=function(){return this.elements.minplayer},osmplayer.prototype.reset=function(a){this.playQueue.length=0,this.playQueue=[],this.playIndex=0,this.playLoader&&this.options.preview?(this.options.preview="",this.playLoader.clear(function(b){return function(){a.call(b)}}(this))):a&&a.call(this)},osmplayer.prototype.loadNode=function(a){return!a||a.hasOwnProperty("length")&&0===a.length?!1:void this.reset(function(){if(this.hasMedia=a&&a.mediafiles&&a.mediafiles.media,this.hasMedia=this.hasMedia||this.options.file,a&&a.mediafiles){var b=a.mediafiles.media;if(b){var c=null,d=[];d=minplayer.isAndroid||minplayer.isIDevice?["media"]:["intro","commercial","prereel","media","postreel"],jQuery.each(d,function(a){return function(d,e){c=a.addToQueue(b[e]),c&&(c.queueType=e)}}(this))}else this.display.addClass("nomedia");this.playNext(),osmplayer.getImage(a.mediafiles,"preview",function(a){return function(b){a.playLoader&&a.playLoader.display.length>0&&(a.playLoader.enabled=!0,a.playLoader.loadPreview(b.path),a.playLoader.previewFlag.setFlag("media",!0),a.hasMedia||(a.playLoader.busy.setFlag("media",!1),a.playLoader.bigPlay.setFlag("media",!1)),a.playLoader.checkVisibility())}}(this))}})},osmplayer.prototype.addToQueue=function(a){return a=minplayer.getMediaFile(a),a&&this.playQueue.push(a),a},osmplayer.prototype.playNext=function(){this.playQueue.length>this.playIndex?(this.load(this.playQueue[this.playIndex]),this.playIndex++):this.options.repeat?(this.playIndex=0,this.playNext()):this.playQueue.length>0?this.hasPlaylist&&this.options.autoNext?this.trigger("player_ended"):(this.options.autoplay=!1,this.playIndex=0,this.playNext()):this.media&&("undefined"!=typeof this.options.originalAutoPlay&&(this.options.autoplay=this.options.originalAutoPlay),this.media.stop(),this.options.file?this.load():this.loadNode())},osmplayer.getNode=function(a,b){if(a&&a.mediafiles&&a.mediafiles.media){var c=minplayer.getMediaFile(a.mediafiles.media.media);if(c){var d=minplayer.players[c.player];d&&"function"==typeof d.getNode&&d.getNode(c,function(a){b(a)})}}},osmplayer.getImage=function(a,b,c){var d="",e=a.image;if(e)if(e[b])d=e[b];else if(e.image)d=e.image;else for(b in e)if(e.hasOwnProperty(b)){d=e[b];break}if(d)c(new minplayer.file(d));else{var f=minplayer.getMediaFile(a.media.media);if(f){var g=minplayer.players[f.player];g&&"function"==typeof g.getImage&&g.getImage(f,b,function(a){c(new minplayer.file(a))})}}};var osmplayer=osmplayer||{};osmplayer.parser=osmplayer.parser||{},osmplayer.parser["default"]={priority:1,valid:function(){return!0},getType:function(){return"json"},getFeed:function(a,b,c){return a=a.replace(/(.*)\??(.*)/i,"$1"),a+="?start-index="+b,a+="&max-results="+c},parse:function(a){return a}};var osmplayer=osmplayer||{};osmplayer.parser=osmplayer.parser||{},osmplayer.parser.youtube={priority:10,valid:function(a){return 0===a.search(/^http(s)?\:\/\/gdata\.youtube\.com/i)},getType:function(){return"jsonp"},getFeed:function(a,b,c){return a=a.replace(/(.*)\??(.*)/i,"$1"),a+="?start-index="+(b+1),a+="&max-results="+c,a+="&v=2&alt=jsonc"},parse:function(a){a=a.data;var b={total_rows:a.totalItems,nodes:[]},c=null;for(var d in a.items)a.items.hasOwnProperty(d)&&(c=minplayer.players.youtube.parseNode(a.items[d]),b.nodes.push(c));return b}};var osmplayer=osmplayer||{};osmplayer.parser=osmplayer.parser||{},osmplayer.parser.rss={priority:8,valid:function(a){return a=a.replace(/(.*)\??(.*)/i,"$1"),null!==a.match(/\.rss$/i)},getType:function(){return"xml"},getFeed:function(a){return a},parse:function(a){var b={total_rows:0,nodes:[]};return jQuery("rss channel",a).find("item").each(function(){osmplayer.parser.rss.addRSSItem(b,jQuery(this))}),b},addRSSItem:function(a,b){a.total_rows++;var c={},d="",e="",f="",g="";d=b.find("title"),d.length&&(c.title=d.text()),e=b.find("annotation"),e.length&&(c.description=e.text()),c.mediafiles={},f=b.find("image"),f.length&&(c.mediafiles.image={image:{path:f.text()}}),g=b.find("location"),g.length&&(c.mediafiles.media={media:{path:g.text()}}),a.nodes.push(c)}};var osmplayer=osmplayer||{};osmplayer.parser=osmplayer.parser||{},osmplayer.parser.asx={priority:8,valid:function(a){return a=a.replace(/(.*)\??(.*)/i,"$1"),null!==a.match(/\.asx$/i)},getType:function(){return"xml"},getFeed:function(a){return a},parse:function(a){var b={total_rows:0,nodes:[]};return jQuery("asx entry",a).each(function(){osmplayer.parser.rss.addRSSItem(b,jQuery(this))}),b}};var osmplayer=osmplayer||{};osmplayer.parser=osmplayer.parser||{},osmplayer.parser.xsfp={priority:8,valid:function(a){return a=a.replace(/(.*)\??(.*)/i,"$1"),null!==a.match(/\.xml$/i)},getType:function(){return"xml"},getFeed:function(a){return a},parse:function(a){var b={total_rows:0,nodes:[]};return jQuery("playlist trackList track",a).each(function(){osmplayer.parser.rss.addRSSItem(b,jQuery(this))}),b}},osmplayer.playlist=function(a,b){minplayer.display.call(this,"playlist",a,b)},osmplayer.playlist.prototype=new minplayer.display,osmplayer.playlist.prototype.constructor=osmplayer.playlist,osmplayer.playlist.prototype.defaultOptions=function(a){a.vertical=!0,a.playlist="",a.pageLimit=10,a.autoNext=!0,a.shuffle=!1,a.loop=!1,a.hysteresis=40,a.scrollSpeed=20,a.scrollMode="auto",minplayer.display.prototype.defaultOptions.call(this,a)},osmplayer.playlist.prototype.construct=function(){this.nodes=[],this.page=-1,this.totalItems=0,this.currentItem=-1,this.playqueue=[],this.playqueuepos=0,this.playlist=this.options.playlist,this.scroll=null,this.orient={pos:this.options.vertical?"y":"x",pagePos:this.options.vertical?"pageY":"pageX",offset:this.options.vertical?"top":"left",wrapperSize:this.options.vertical?"wrapperH":"wrapperW",minScroll:this.options.vertical?"minScrollY":"minScrollX",maxScroll:this.options.vertical?"maxScrollY":"maxScrollX",size:this.options.vertical?"height":"width"},this.pager=this.create("pager","osmplayer"),this.pager.ubind(this.uuid+":nextPage",function(a){return function(){a.nextPage()}}(this)),this.pager.ubind(this.uuid+":prevPage",function(a){return function(){a.prevPage()}}(this)),minplayer.display.prototype.construct.call(this),this.hasPlaylist=this.next(),this.ready()},osmplayer.playlist.prototype.onAdded=function(a){this.options.autoNext&&a.get("player",function(a){return function(b){b.ubind(a.uuid+":player_ended",function(){a.hasPlaylist&&("undefined"==typeof b.options.originalAutoPlay&&(b.options.originalAutoPlay=b.options.autoplay),b.options.autoplay=!0,a.next())})}}(this))},osmplayer.playlist.prototype.scrollTo=function(a,b){this.scroll&&(this.scroll.options.hideScrollbar=!1,this.options.vertical?this.scroll.scrollTo(0,a,0,b):this.scroll.scrollTo(a,0,0,b),this.scroll.options.hideScrollbar=!0)},osmplayer.playlist.prototype.refreshScroll=function(){if(!window.addEventListener)return void setTimeout(function(a){return function(){a.refreshScroll.call(a)}}(this),200);var a=this.elements.list,b=this.elements.scroll;if(this.scroll&&(this.scroll.scrollTo(0,0),this.scroll.destroy(),this.scroll=null,this.elements.list.unbind("mousemove").unbind("mouseenter").unbind("mouseleave")),!this.options.vertical){var c=0;jQuery.each(this.elements.list.children(),function(){c+=jQuery(this).outerWidth()}),this.elements.list.width(c)}a.length>0&&b.length>0&&a[this.orient.size]()>b[this.orient.size]()&&(this.scroll=new osmplayer.iScroll(this.elements.scroll.eq(0)[0],{hScroll:!this.options.vertical,hScrollbar:!this.options.vertical,vScroll:this.options.vertical,vScrollbar:this.options.vertical,hideScrollbar:"none"!==this.options.scrollMode}),"auto"!=this.options.scrollMode||minplayer.hasTouch||this.elements.list.bind("mousemove",function(a){return function(b){b.preventDefault();var c=a.display.offset()[a.orient.offset];a.mousePos=b[a.orient.pagePos],a.mousePos-=c}}(this)).bind("mouseenter",function(a){return function(b){b.preventDefault(),a.scrolling=!0;var c=function(){if(a.scrolling){var b=a.scroll[a.orient.wrapperSize],d=b/2,e=a.mousePos-d;if(Math.abs(e)>a.options.hysteresis){var f=a.options.hysteresis;f*=e>0?-1:0,e=a.options.scrollSpeed*(e+f),e/=d;var g=a.scroll[a.orient.pos]-e,h=a.scroll[a.orient.minScroll]||0,i=a.scroll[a.orient.maxScroll];g>=h?a.scrollTo(h):i>=g?a.scrollTo(i):a.scrollTo(e,!0)}setTimeout(c,30)}};c()}}(this)).bind("mouseleave",function(a){return function(b){b.preventDefault(),a.scrolling=!1}}(this)),this.scroll.refresh(),this.scroll.scrollTo(0,0,200))},osmplayer.playlist.prototype.addNode=function(a){var b=this.nodes.length,c=this.create("teaser","osmplayer",this.elements.list);c.setNode(a),c.ubind(this.uuid+":nodeLoad",function(a){return function(){a.loadItem(b,!0)}}(this)),this.nodes.push(c)},osmplayer.playlist.prototype.set=function(a,b){if("object"!=typeof a)return void this.trigger("error","Playlist must be an object to set");if(!a.hasOwnProperty("total_rows"))return void this.trigger("error","Unknown playlist format.");if(a.total_rows&&a.nodes.length){this.totalItems=a.total_rows,this.currentItem=0,(this.page+1)*this.options.pageLimit>=this.totalItems||this.totalItems==a.nodes.length?this.pager.nextPage.hide():this.pager.nextPage.show();var c=a.nodes.length;this.elements.list.empty(),this.nodes=[];for(var d=0;c>d;d++)this.addNode(a.nodes[d]),b===d&&this.loadItem(d);this.refreshScroll(),this.trigger("playlistLoad",a)}this.elements.playlist_busy&&this.elements.playlist_busy.hide()},osmplayer.playlist.prototype.setQueue=function(){this.playqueue.push({page:this.page,item:this.currentItem}),this.playqueuepos=this.playqueue.length},osmplayer.playlist.prototype.next=function(){var a=0,b=this.page;if(this.playqueuepos>=this.playqueue.length)return this.options.shuffle?(a=Math.floor(Math.random()*this.totalItems),b=Math.floor(a/this.options.pageLimit),a%=this.options.pageLimit,this.load(b,a)):(a=this.currentItem+1,a>=this.nodes.length?this.load(b+1,0):this.loadItem(a));this.playqueuepos=this.playqueuepos+1;var c=this.playqueue[this.playqueuepos];return this.load(c.page,c.item)},osmplayer.playlist.prototype.prev=function(){this.playqueuepos=this.playqueuepos-1,this.playqueuepos=this.playqueuepos<0?0:this.playqueuepos;var a=this.playqueue[this.playqueuepos];return a?this.load(a.page,a.item):!1},osmplayer.playlist.prototype.loadItem=function(a,b){if(ac){if(!this.options.loop)return!1;a=0,b=0}if(this.elements.playlist_busy&&this.elements.playlist_busy.show(),a=a||0,a=0>a?0:a,this.setQueue(),this.page=a,0===this.page?this.pager.prevPage.hide():this.pager.prevPage.show(),"object"==typeof this.playlist)return this.set(this.playlist,b),this.playlist.endpoint&&(this.playlist=this.options.playlist=this.playlist.endpoint),!0;var d=osmplayer.parser["default"];for(var e in osmplayer.parser)osmplayer.parser.hasOwnProperty(e)&&osmplayer.parser[e].valid(this.playlist)&&osmplayer.parser[e].priority>d.priority&&(d=osmplayer.parser[e]);var f=this.page*this.options.pageLimit,g=d.getFeed(this.playlist,f,this.options.pageLimit),h={type:"GET",url:g,success:function(a){return function(c){a.set(d.parse(c),b)}}(this),error:function(a){return function(b,c){a.elements.playlist_busy&&a.elements.playlist_busy.hide(),a.trigger("error",c)}}(this)},i=d.getType();return i&&(h.dataType=i),jQuery.ajax(h),!0};var osmplayer=osmplayer||{};osmplayer.pager=function(a,b){minplayer.display.call(this,"pager",a,b)},osmplayer.pager.prototype=new minplayer.display,osmplayer.pager.prototype.constructor=osmplayer.pager,osmplayer.pager.prototype.construct=function(){minplayer.display.prototype.construct.call(this),this.elements.prevPage&&(this.prevPage=this.elements.prevPage.click(function(a){return function(b){b.preventDefault(),a.trigger("prevPage")}}(this))),this.elements.nextPage&&(this.nextPage=this.elements.nextPage.click(function(a){return function(b){b.preventDefault(),a.trigger("nextPage")}}(this)))};var osmplayer=osmplayer||{};osmplayer.teaser=function(a,b){this.preview=null,minplayer.display.call(this,"teaser",a,b)},osmplayer.teaser.prototype=new minplayer.display,osmplayer.teaser.prototype.constructor=osmplayer.teaser,osmplayer.teaser.prototype.select=function(){},osmplayer.teaser.prototype.setNode=function(a){this.node=a,this.elements.title&&(a.title?this.elements.title.text(a.title):osmplayer.getNode(a,function(a){return function(b){a.elements.title.text(b.title)}}(this))),a.mediafiles&&osmplayer.getImage(a.mediafiles,"thumbnail",function(a){return function(b){b&&a.elements.image&&(a.preview=new minplayer.image(a.elements.image),a.preview.load(b.path))}}(this)),this.display.unbind("click").click(function(a){return function(b){b.preventDefault(),a.trigger("nodeLoad",a.node)}}(this))}; \ No newline at end of file diff --git a/doc/classes.list.html b/doc/classes.list.html new file mode 100644 index 00000000..ef9f4320 --- /dev/null +++ b/doc/classes.list.html @@ -0,0 +1,214 @@ + + + + + + Documentation Classes + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Classes

+
+ +
+

+ +

+ +
+ + + +
+ + + + +
+ +
+ +
+ + +
+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/global.html b/doc/global.html new file mode 100644 index 00000000..b7464533 --- /dev/null +++ b/doc/global.html @@ -0,0 +1,577 @@ + + + + + + Documentation Global + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Global

+
+ +
+

+ +

+ +
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + +

Members

+ +
+ +
+

osmplayer

+ + +
+
+ +
+ The osmplayer namespace. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

osmplayer

+ + +
+
+ +
+ The osmplayer namespace. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

osmplayer

+ + +
+
+ +
+ The osmplayer namespace. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

osmplayer

+ + +
+
+ +
+ The osmplayer namespace. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

osmplayer

+ + +
+
+ +
+ The osmplayer namespace. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

osmplayer

+ + +
+
+ +
+ The osmplayer namespace. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

osmplayer

+ + +
+
+ +
+ The osmplayer namespace. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ +
+ + + + + + + +
+ +
+ + + + +
+ +
+ +
+ + +
+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/global.html#osmplayer b/doc/global.html#osmplayer new file mode 100644 index 00000000..ba6401fe --- /dev/null +++ b/doc/global.html#osmplayer @@ -0,0 +1,1959 @@ + + + + + + Documentation Class: osmplayer + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Class: osmplayer

+
+ +
+

+ osmplayer +

+ +
The main osmplayer class. + +

Usage: +


+
+  // Create a media player.
+  var player = jQuery("#player").osmplayer({
+
+  });
+
+
+

+ +
+ +
+
+ + + + +
+

new osmplayer(context, options)

+ + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
context + + +object + + + + The jQuery context.
options + + +object + + + + This components options.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + +
+ + +

Extends

+ +
    +
  • minplayer
  • +
+ + + + + + + +

Classes

+ +
+
pager
+
+ +
playlist
+
+ +
teaser
+
+
+ + + + + +

Members

+ +
+ +
+

<static> parser

+ + +
+
+ +
+ The parser object. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

<static> parser

+ + +
+
+ +
+ The parser object. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

<static> parser

+ + +
+
+ +
+ The parser object. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

<static> parser

+ + +
+
+ +
+ The parser object. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

<static> parser

+ + +
+
+ +
+ The parser object. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

constructor

+ + +
+
+ +
+ Reset the constructor. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

playQueue

+ + +
+
+ +
+ The play queue and index. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

<static> getImage(mediafiles, type, callback)

+ + +
+
+ + +
+ Returns an image provided image array. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
mediafiles + + +object + + + + The mediafiles to search within.
type + + +string + + + + The type of image to look for.
callback + + +function + + + + Called when the image is retrieved.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

<static> getNode(node, callback)

+ + +
+
+ + +
+ Returns a node. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
node + + +object + + + + The node to get.
callback + + +function + + + + Called when the node is retrieved.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

addToQueue(file) → {object}

+ + +
+
+ + +
+ Adds a file to the play queue. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
file + + +object + + + + The file to add to the queue.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+ The file that was added to the queue. +
+ + + +
+
+ Type +
+
+ +object + + +
+
+ + + + + +
+ + + +
+

construct()

+ + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + +
See:
+
+
    +
  • minplayer.plugin.construct
  • +
+
+ + + +
+ + + + + + + + + + + + + +
+ + + +
+

create(name, base, context) → {object}

+ + +
+
+ + +
+ Creates a new plugin within this context. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + +string + + + + The name of the plugin you wish to create.
base + + +object + + + + The base object for this plugin.
context + + +object + + + + The context which you would like to create.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+ The new plugin object. +
+ + + +
+
+ Type +
+
+ +object + + +
+
+ + + + + +
+ + + +
+

defaultOptions(options)

+ + +
+
+ + +
+ Get the default options for this plugin. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +object + + + + The default options for this plugin.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

fullScreenElement() → {object}

+ + +
+
+ + +
+ Gets the full screen element. +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+ The element that will go into fullscreen. +
+ + + +
+
+ Type +
+
+ +object + + +
+
+ + + + + +
+ + + +
+

loadNode(node) → {boolean}

+ + +
+
+ + +
+ The load node function. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
node + + +object + + + + A media node object.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+ If the node was loaded. +
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + + +
+ + + +
+

playNext()

+ + +
+
+ + +
+ Plays the next media file in the queue. +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

reset(callback)

+ + +
+
+ + +
+ Reset the osmplayer. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
callback + + +function + + + + Called when it is done resetting.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ +
+ +
+ + +
+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/img/glyphicons-halflings-white.png b/doc/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 zcmZvC1yGz#v+m*$LXcp=A$ZWB0fL7wNbp_U*$~{_gL`my3oP#L!5tQYy99Ta`+g_q zKlj|KJ2f@c)ARJx{q*bbkhN_!|Wn*Vos8{TEhUT@5e;_WJsIMMcG5%>DiS&dv_N`4@J0cnAQ-#>RjZ z00W5t&tJ^l-QC*ST1-p~00u^9XJ=AUl7oW-;2a+x2k__T=grN{+1c4XK0ZL~^z^i$ zp&>vEhr@4fZWb380S18T&!0cQ3IKpHF)?v=b_NIm0Q>vwY7D0baZ)n z31Fa5sELUQARIVaU0nqf0XzT+fB_63aA;@<$l~wse|mcA;^G1TmX?-)e)jkGPfkuA z92@|!<>h5S_4f8QP-JRq>d&7)^Yin8l7K8gED$&_FaV?gY+wLjpoW%~7NDe=nHfMG z5DO3j{R9kv5GbssrUpO)OyvVrlx>u0UKD0i;Dpm5S5dY16(DL5l{ixz|mhJU@&-OWCTb7_%}8-fE(P~+XIRO zJU|wp1|S>|J3KrLcz^+v1f&BDpd>&MAaibR4#5A_4(MucZwG9E1h4@u0P@C8;oo+g zIVj7kfJi{oV~E(NZ*h(@^-(Q(C`Psb3KZ{N;^GB(a8NE*Vwc715!9 zr-H4Ao|T_c6+VT_JH9H+P3>iXSt!a$F`>s`jn`w9GZ_~B!{0soaiV|O_c^R2aWa%}O3jUE)WO=pa zs~_Wz08z|ieY5A%$@FcBF9^!1a}m5ks@7gjn;67N>}S~Hrm`4sM5Hh`q7&5-N{|31 z6x1{ol7BnskoViZ0GqbLa#kW`Z)VCjt1MysKg|rT zi!?s##Ck>8c zpi|>$lGlw#@yMNi&V4`6OBGJ(H&7lqLlcTQ&1zWriG_fL>BnFcr~?;E93{M-xIozQ zO=EHQ#+?<}%@wbWWv23#!V70h9MOuUVaU>3kpTvYfc|LBw?&b*89~Gc9i&8tlT#kF ztpbZoAzkdB+UTy=tx%L3Z4)I{zY(Kb)eg{InobSJmNwPZt$14aS-uc4eKuY8h$dtfyxu^a%zA)>fYI&)@ZXky?^{5>xSC?;w4r&td6vBdi%vHm4=XJH!3yL3?Ep+T5aU_>i;yr_XGq zxZfCzUU@GvnoIk+_Nd`aky>S&H!b*{A%L>?*XPAgWL(Vf(k7qUS}>Zn=U(ZfcOc{B z3*tOHH@t5Ub5D~#N7!Fxx}P2)sy{vE_l(R7$aW&CX>c|&HY+7};vUIietK%}!phrCuh+;C@1usp;XLU<8Gq8P!rEI3ieg#W$!= zQcZr{hp>8sF?k&Yl0?B84OneiQxef-4TEFrq3O~JAZR}yEJHA|Xkqd49tR&8oq{zP zY@>J^HBV*(gJvJZc_0VFN7Sx?H7#75E3#?N8Z!C+_f53YU}pyggxx1?wQi5Yb-_`I`_V*SMx5+*P^b=ec5RON-k1cIlsBLk}(HiaJyab0`CI zo0{=1_LO$~oE2%Tl_}KURuX<`+mQN_sTdM&* zkFf!Xtl^e^gTy6ON=&gTn6)$JHQq2)33R@_!#9?BLNq-Wi{U|rVX7Vny$l6#+SZ@KvQt@VYb%<9JfapI^b9j=wa+Tqb4ei;8c5 z&1>Uz@lVFv6T4Z*YU$r4G`g=91lSeA<=GRZ!*KTWKDPR}NPUW%peCUj`Ix_LDq!8| zMH-V`Pv!a~QkTL||L@cqiTz)*G-0=ytr1KqTuFPan9y4gYD5>PleK`NZB$ev@W%t= zkp)_=lBUTLZJpAtZg;pjI;7r2y|26-N7&a(hX|`1YNM9N8{>8JAuv}hp1v`3JHT-=5lbXpbMq7X~2J5Kl zh7tyU`_AusMFZ{ej9D;Uyy;SQ!4nwgSnngsYBwdS&EO3NS*o04)*juAYl;57c2Ly0(DEZ8IY?zSph-kyxu+D`tt@oU{32J#I{vmy=#0ySPK zA+i(A3yl)qmTz*$dZi#y9FS;$;h%bY+;StNx{_R56Otq+?pGe^T^{5d7Gs&?`_r`8 zD&dzOA|j8@3A&FR5U3*eQNBf<4^4W_iS_()*8b4aaUzfk2 zzIcMWSEjm;EPZPk{j{1>oXd}pXAj!NaRm8{Sjz!D=~q3WJ@vmt6ND_?HI~|wUS1j5 z9!S1MKr7%nxoJ3k`GB^7yV~*{n~O~n6($~x5Bu{7s|JyXbAyKI4+tO(zZYMslK;Zc zzeHGVl{`iP@jfSKq>R;{+djJ9n%$%EL()Uw+sykjNQdflkJZSjqV_QDWivbZS~S{K zkE@T^Jcv)Dfm93!mf$XYnCT--_A$zo9MOkPB6&diM8MwOfV?+ApNv`moV@nqn>&lv zYbN1-M|jc~sG|yLN^1R2=`+1ih3jCshg`iP&mY$GMTcY^W^T`WOCX!{-KHmZ#GiRH zYl{|+KLn5!PCLtBy~9i}`#d^gCDDx$+GQb~uc;V#K3OgbbOG0j5{BRG-si%Bo{@lB zGIt+Ain8^C`!*S0d0OSWVO+Z89}}O8aFTZ>p&k}2gGCV zh#<$gswePFxWGT$4DC^8@84_e*^KT74?7n8!$8cg=sL$OlKr&HMh@Rr5%*Wr!xoOl zo7jItnj-xYgVTX)H1=A2bD(tleEH57#V{xAeW_ezISg5OC zg=k>hOLA^urTH_e6*vSYRqCm$J{xo}-x3@HH;bsHD1Z`Pzvsn}%cvfw%Q(}h`Dgtb z0_J^niUmoCM5$*f)6}}qi(u;cPgxfyeVaaVmOsG<)5`6tzU4wyhF;k|~|x>7-2hXpVBpc5k{L4M`Wbe6Q?tr^*B z`Y*>6*&R#~%JlBIitlZ^qGe3s21~h3U|&k%%jeMM;6!~UH|+0+<5V-_zDqZQN79?n?!Aj!Nj`YMO9?j>uqI9-Tex+nJD z%e0#Yca6(zqGUR|KITa?9x-#C0!JKJHO(+fy@1!B$%ZwJwncQW7vGYv?~!^`#L~Um zOL++>4qmqW`0Chc0T23G8|vO)tK=Z2`gvS4*qpqhIJCEv9i&&$09VO8YOz|oZ+ubd zNXVdLc&p=KsSgtmIPLN69P7xYkYQ1vJ?u1g)T!6Ru`k2wkdj*wDC)VryGu2=yb0?F z>q~~e>KZ0d_#7f3UgV%9MY1}vMgF{B8yfE{HL*pMyhYF)WDZ^^3vS8F zGlOhs%g_~pS3=WQ#494@jAXwOtr^Y|TnQ5zki>qRG)(oPY*f}U_=ip_{qB0!%w7~G zWE!P4p3khyW-JJnE>eECuYfI?^d366Shq!Wm#x&jAo>=HdCllE$>DPO0N;y#4G)D2y#B@5=N=+F%Xo2n{gKcPcK2!hP*^WSXl+ut; zyLvVoY>VL{H%Kd9^i~lsb8j4>$EllrparEOJNT?Ym>vJa$(P^tOG)5aVb_5w^*&M0 zYOJ`I`}9}UoSnYg#E(&yyK(tqr^@n}qU2H2DhkK-`2He% zgXr_4kpXoQHxAO9S`wEdmqGU4j=1JdG!OixdqB4PPP6RXA}>GM zumruUUH|ZG2$bBj)Qluj&uB=dRb)?^qomw?Z$X%#D+Q*O97eHrgVB2*mR$bFBU`*} zIem?dM)i}raTFDn@5^caxE^XFXVhBePmH9fqcTi`TLaXiueH=@06sl}>F%}h9H_e9 z>^O?LxM1EjX}NVppaO@NNQr=AtHcH-BU{yBT_vejJ#J)l^cl69Z7$sk`82Zyw7Wxt z=~J?hZm{f@W}|96FUJfy65Gk8?^{^yjhOahUMCNNpt5DJw}ZKH7b!bGiFY9y6OY&T z_N)?Jj(MuLTN36ZCJ6I5Xy7uVlrb$o*Z%=-)kPo9s?<^Yqz~!Z* z_mP8(unFq65XSi!$@YtieSQ!<7IEOaA9VkKI?lA`*(nURvfKL8cX}-+~uw9|_5)uC2`ZHcaeX7L8aG6Ghleg@F9aG%X$#g6^yP5apnB>YTz&EfS{q z9UVfSyEIczebC)qlVu5cOoMzS_jrC|)rQlAzK7sfiW0`M8mVIohazPE9Jzn*qPt%6 zZL8RELY@L09B83@Be;x5V-IHnn$}{RAT#<2JA%ttlk#^(%u}CGze|1JY5MPhbfnYG zIw%$XfBmA-<_pKLpGKwbRF$#P;@_)ech#>vj25sv25VM$ouo)?BXdRcO{)*OwTw)G zv43W~T6ekBMtUD%5Bm>`^Ltv!w4~65N!Ut5twl!Agrzyq4O2Fi3pUMtCU~>9gt_=h-f% z;1&OuSu?A_sJvIvQ+dZNo3?m1%b1+s&UAx?8sUHEe_sB7zkm4R%6)<@oYB_i5>3Ip zIA+?jVdX|zL{)?TGpx+=Ta>G80}0}Ax+722$XFNJsC1gcH56{8B)*)eU#r~HrC&}` z|EWW92&;6y;3}!L5zXa385@?-D%>dSvyK;?jqU2t_R3wvBW;$!j45uQ7tyEIQva;Db}r&bR3kqNSh)Q_$MJ#Uj3Gj1F;)sO|%6z#@<+ zi{pbYsYS#u`X$Nf($OS+lhw>xgjos1OnF^$-I$u;qhJswhH~p|ab*nO>zBrtb0ndn zxV0uh!LN`&xckTP+JW}gznSpU492)u+`f{9Yr)js`NmfYH#Wdtradc0TnKNz@Su!e zu$9}G_=ku;%4xk}eXl>)KgpuT>_<`Ud(A^a++K&pm3LbN;gI}ku@YVrA%FJBZ5$;m zobR8}OLtW4-i+qPPLS-(7<>M{)rhiPoi@?&vDeVq5%fmZk=mDdRV>Pb-l7pP1y6|J z8I>sF+TypKV=_^NwBU^>4JJq<*14GLfM2*XQzYdlqqjnE)gZsPW^E@mp&ww* zW9i>XL=uwLVZ9pO*8K>t>vdL~Ek_NUL$?LQi5sc#1Q-f6-ywKcIT8Kw?C(_3pbR`e|)%9S-({if|E+hR2W!&qfQ&UiF^I!|M#xhdWsenv^wpKCBiuxXbnp85`{i|;BM?Ba`lqTA zyRm=UWJl&E{8JzYDHFu>*Z10-?#A8D|5jW9Ho0*CAs0fAy~MqbwYuOq9jjt9*nuHI zbDwKvh)5Ir$r!fS5|;?Dt>V+@F*v8=TJJF)TdnC#Mk>+tGDGCw;A~^PC`gUt*<(|i zB{{g{`uFehu`$fm4)&k7`u{xIV)yvA(%5SxX9MS80p2EKnLtCZ>tlX>*Z6nd&6-Mv$5rHD*db;&IBK3KH&M<+ArlGXDRdX1VVO4)&R$f4NxXI>GBh zSv|h>5GDAI(4E`@F?EnW zS>#c&Gw6~_XL`qQG4bK`W*>hek4LX*efn6|_MY+rXkNyAuu?NxS%L7~9tD3cn7&p( zCtfqe6sjB&Q-Vs7BP5+%;#Gk};4xtwU!KY0XXbmkUy$kR9)!~?*v)qw00!+Yg^#H> zc#8*z6zZo>+(bud?K<*!QO4ehiTCK&PD4G&n)Tr9X_3r-we z?fI+}-G~Yn93gI6F{}Dw_SC*FLZ)5(85zp4%uubtD)J)UELLkvGk4#tw&Tussa)mTD$R2&O~{ zCI3>fr-!-b@EGRI%g0L8UU%%u_<;e9439JNV;4KSxd|78v+I+8^rmMf3f40Jb}wEszROD?xBZu>Ll3;sUIoNxDK3|j3*sam2tC@@e$ z^!;+AK>efeBJB%ALsQ{uFui)oDoq()2USi?n=6C3#eetz?wPswc={I<8x=(8lE4EIsUfyGNZ{|KYn1IR|=E==f z(;!A5(-2y^2xRFCSPqzHAZn5RCN_bp22T(KEtjA(rFZ%>a4@STrHZflxKoqe9Z4@^ zM*scx_y73?Q{vt6?~WEl?2q*;@8 z3M*&@%l)SQmXkcUm)d@GT2#JdzhfSAP9|n#C;$E8X|pwD!r#X?0P>0ZisQ~TNqupW z*lUY~+ikD`vQb?@SAWX#r*Y+;=_|oacL$2CL$^(mV}aKO77pg}O+-=T1oLBT5sL2i z42Qth2+0@C`c+*D0*5!qy26sis<9a7>LN2{z%Qj49t z=L@x`4$ALHb*3COHoT?5S_c(Hs}g!V>W^=6Q0}zaubkDn)(lTax0+!+%B}9Vqw6{H zvL|BRM`O<@;eVi1DzM!tXtBrA20Ce@^Jz|>%X-t`vi-%WweXCh_LhI#bUg2*pcP~R z*RuTUzBKLXO~~uMd&o$v3@d0shHfUjC6c539PE6rF&;Ufa(Rw@K1*m7?f5)t`MjH0 z)_V(cajV5Am>f!kWcI@5rE8t6$S>5M=k=aRZROH6fA^jJp~2NlR4;Q2>L$7F#RT#9 z>4@1RhWG`Khy>P2j1Yx^BBL{S`niMaxlSWV-JBU0-T9zZ%>7mR3l$~QV$({o0;jTI ze5=cN^!Bc2bT|BcojXp~K#2cM>OTe*cM{Kg-j*CkiW)EGQot^}s;cy8_1_@JA0Whq zlrNr+R;Efa+`6N)s5rH*|E)nYZ3uqkk2C(E7@A|3YI`ozP~9Lexx#*1(r8luq+YPk z{J}c$s` zPM35Fx(YWB3Z5IYnN+L_4|jaR(5iWJi2~l&xy}aU7kW?o-V*6Av2wyZTG!E2KSW2* zGRLQkQU;Oz##ie-Z4fI)WSRxn$(ZcD;TL+;^r=a4(G~H3ZhK$lSXZj?cvyY8%d9JM zzc3#pD^W_QnWy#rx#;c&N@sqHhrnHRmj#i;s%zLm6SE(n&BWpd&f7>XnjV}OlZntI70fq%8~9<7 zMYaw`E-rp49-oC1N_uZTo)Cu%RR2QWdHpzQIcNsoDp`3xfP+`gI?tVQZ4X={qU?(n zV>0ASES^Xuc;9JBji{)RnFL(Lez;8XbB1uWaMp@p?7xhXk6V#!6B@aP4Rz7-K%a>i z?fvf}va_DGUXlI#4--`A3qK7J?-HwnG7O~H2;zR~RLW)_^#La!=}+>KW#anZ{|^D3 B7G?kd literal 0 HcmV?d00001 diff --git a/doc/img/glyphicons-halflings.png b/doc/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 zcma*OWmH^Ivn@*S;K3nSf_t!#;0f+&pm7Po8`nk}2q8f5;M%x$SdAkd9FAvlc$ zx660V9e3Ox@4WZ^?7jZ%QFGU-T~%||Ug4iK6bbQY@zBuF2$hxOw9wF=A)nUSxR_5@ zEX>HBryGrjyuOFFv$Y4<+|3H@gQfEqD<)+}a~mryD|1U9*I_FOG&F%+Ww{SJ-V2BR zjt<81Ek$}Yb*95D4RS0HCps|uLyovt;P05hchQb-u2bzLtmog&f2}1VlNhxXV);S9 zM2buBg~!q9PtF)&KGRgf3#z7B(hm5WlNClaCWFs!-P!4-u*u5+=+D|ZE9e`KvhTHT zJBnLwGM%!u&vlE%1ytJ=!xt~y_YkFLQb6bS!E+s8l7PiPGSt9xrmg?LV&&SL?J~cI zS(e9TF1?SGyh+M_p@o1dyWu7o7_6p;N6hO!;4~ z2B`I;y`;$ZdtBpvK5%oQ^p4eR2L)BH>B$FQeC*t)c`L71gXHPUa|vyu`Bnz)H$ZcXGve(}XvR!+*8a>BLV;+ryG1kt0=)ytl zNJxFUN{V7P?#|Cp85QTa@(*Q3%K-R(Pkv1N8YU*(d(Y}9?PQ(j;NzWoEVWRD-~H$=f>j9~PN^BM2okI(gY-&_&BCV6RP&I$FnSEM3d=0fCxbxA6~l>54-upTrw zYgX@%m>jsSGi`0cQt6b8cX~+02IghVlNblR7eI;0ps}mpWUcxty1yG56C5rh%ep(X z?)#2d?C<4t-KLc*EAn>>M8%HvC1TyBSoPNg(4id~H8JwO#I)Bf;N*y6ai6K9_bA`4 z_g9(-R;qyH&6I$`b42v|0V3Z8IXN*p*8g$gE98+JpXNY+jXxU0zsR^W$#V=KP z3AEFp@OL}WqwOfsV<)A^UTF4&HF1vQecz?LWE@p^Z2){=KEC_3Iopx_eS42>DeiDG zWMXGbYfG~W7C8s@@m<_?#Gqk;!&)_Key@^0xJxrJahv{B&{^!>TV7TEDZlP|$=ZCz zmX=ZWtt4QZKx**)lQQoW8y-XLiOQy#T`2t}p6l*S`68ojyH@UXJ-b~@tN`WpjF z%7%Yzv807gsO!v=!(2uR)16!&U5~VPrPHtGzUU?2w(b1Xchq}(5Ed^G|SD7IG+kvgyVksU) z(0R)SW1V(>&q2nM%Z!C9=;pTg!(8pPSc%H01urXmQI6Gi^dkYCYfu6b4^tW))b^U+ z$2K&iOgN_OU7n#GC2jgiXU{caO5hZt0(>k+c^(r><#m|#J^s?zA6pi;^#*rp&;aqL zRcZi0Q4HhVX3$ybclxo4FFJW*`IV`)Bj_L3rQe?5{wLJh168Ve1jZv+f1D}f0S$N= zm4i|9cEWz&C9~ZI3q*gwWH^<6sBWuphgy@S3Qy?MJiL>gwd|E<2h9-$3;gT9V~S6r z)cAcmE0KXOwDA5eJ02-75d~f?3;n7a9d_xPBJaO;Z)#@s7gk5$Qn(Fc^w@9c5W0zY z59is0?Mt^@Rolcn{4%)Ioat(kxQH6}hIykSA)zht=9F_W*D#<}N(k&&;k;&gKkWIL z0Of*sP=X(Uyu$Pw;?F@?j{}=>{aSHFcii#78FC^6JGrg-)!)MV4AKz>pXnhVgTgx8 z1&5Y=>|8RGA6++FrSy=__k_imx|z-EI@foKi>tK0Hq2LetjUotCgk2QFXaej!BWYL zJc{fv(&qA7UUJ|AXLc5z*_NW#yWzKtl(c8mEW{A>5Hj^gfZ^HC9lQNQ?RowXjmuCj4!!54Us1=hY z0{@-phvC}yls!PmA~_z>Y&n&IW9FQcj}9(OLO-t^NN$c0o}YksCUWt|DV(MJB%%Sr zdf}8!9ylU2TW!=T{?)g-ojAMKc>3pW;KiZ7f0;&g)k}K^#HBhE5ot)%oxq$*$W@b# zg4p<Ou`ME|Kd1WHK@8 zzLD+0(NHWa`B{em3Ye?@aVsEi>y#0XVZfaFuq#;X5C3{*ikRx7UY4FF{ZtNHNO?A_ z#Q?hwRv~D8fPEc%B5E-ZMI&TAmikl||EERumQCRh7p;)>fdZMxvKq;ky0}7IjhJph zW*uuu*(Y6)S;Od--8uR^R#sb$cmFCnPcj9PPCWhPN;n`i1Q#Qn>ii z{WR|0>8F`vf&#E(c2NsoH=I7Cd-FV|%(7a`i}gZw4N~QFFG2WtS^H%@c?%9UZ+kez z;PwGgg_r6V>Kn5n(nZ40P4qMyrCP3bDkJp@hp6&X3>gzC>=f@Hsen<%I~7W+x@}b> z0}Et*vx_50-q@PIV=(3&Tbm}}QRo*FP2@)A#XX-8jYspIhah`9ukPBr)$8>Tmtg&R z?JBoH17?+1@Y@r>anoKPQ}F8o9?vhcG79Cjv^V6ct709VOQwg{c0Q#rBSsSmK3Q;O zBpNihl3S0_IGVE)^`#94#j~$;7+u870yWiV$@={|GrBmuz4b)*bCOPkaN0{6$MvazOEBxFdKZDlbVvv{8_*kJ zfE6C`4&Kkz<5u%dEdStd85-5UHG5IOWbo8i9azgg#zw-(P1AA049hddAB*UdG3Vn0 zX`OgM+EM|<+KhJ<=k?z~WA5waVj?T9eBdfJGebVifBKS1u<$#vl^BvSg)xsnT5Aw_ZY#}v*LXO#htB>f}x3qDdDHoFeb zAq7;0CW;XJ`d&G*9V)@H&739DpfWYzdQt+Kx_E1K#Cg1EMtFa8eQRk_JuUdHD*2;W zR~XFnl!L2A?48O;_iqCVr1oxEXvOIiN_9CUVTZs3C~P+11}ebyTRLACiJuMIG#`xP zKlC|E(S@QvN+%pBc6vPiQS8KgQAUh75C0a2xcPQDD$}*bM&z~g8+=9ltmkT$;c;s z5_=8%i0H^fEAOQbHXf0;?DN5z-5+1 zDxj50yYkz4ox9p$HbZ|H?8ukAbLE^P$@h}L%i6QVcY>)i!w=hkv2zvrduut%!8>6b zcus3bh1w~L804EZ*s96?GB&F7c5?m?|t$-tp2rKMy>F*=4;w*jW}^;8v`st&8)c; z2Ct2{)?S(Z;@_mjAEjb8x=qAQvx=}S6l9?~H?PmP`-xu;ME*B8sm|!h@BX4>u(xg_ zIHmQzp4Tgf*J}Y=8STR5_s)GKcmgV!$JKTg@LO402{{Wrg>#D4-L%vjmtJ4r?p&$F!o-BOf7ej~ z6)BuK^^g1b#(E>$s`t3i13{6-mmSp7{;QkeG5v}GAN&lM2lQT$@(aQCcFP(%UyZbF z#$HLTqGT^@F#A29b0HqiJsRJAlh8kngU`BDI6 zJUE~&!cQ*&f95Ot$#mxU5+*^$qg_DWNdfu+1irglB7yDglzH()2!@#rpu)^3S8weW z_FE$=j^GTY*|5SH95O8o8W9FluYwB=2PwtbW|JG6kcV^dMVmX(wG+Otj;E$%gfu^K z!t~<3??8=()WQSycsBKy24>NjRtuZ>zxJIED;YXaUz$@0z4rl+TW zWxmvM$%4jYIpO>j5k1t1&}1VKM~s!eLsCVQ`TTjn3JRXZD~>GM z$-IT~(Y)flNqDkC%DfbxaV9?QuWCV&-U1yzrV@0jRhE;)ZO0=r-{s@W?HOFbRHDDV zq;eLo+wOW;nI|#mNf(J?RImB9{YSO2Y`9825Lz#u4(nk3)RGv3X8B(A$TsontJ8L! z9JP^eWxtKC?G8^xAZa1HECx*rp35s!^%;&@Jyk)NexVc)@U4$^X1Dag6`WKs|(HhZ#rzO2KEw3xh~-0<;|zcs0L>OcO#YYX{SN8m6`9pp+ zQG@q$I)T?aoe#AoR@%om_#z=c@ych!bj~lV13Qi-xg$i$hXEAB#l=t7QWENGbma4L zbBf*X*4oNYZUd_;1{Ln_ZeAwQv4z?n9$eoxJeI?lU9^!AB2Y~AwOSq67dT9ADZ)s@ zCRYS7W$Zpkdx$3T>7$I%3EI2ik~m!f7&$Djpt6kZqDWZJ-G{*_eXs*B8$1R4+I}Kf zqniwCI64r;>h2Lu{0c(#Atn)%E8&)=0S4BMhq9$`vu|Ct;^ur~gL`bD>J@l)P$q_A zO7b3HGOUG`vgH{}&&AgrFy%K^>? z>wf**coZ2vdSDcNYSm~dZ(vk6&m6bVKmVgrx-X<>{QzA!)2*L+HLTQz$e8UcB&Djq zl)-%s$ZtUN-R!4ZiG=L0#_P=BbUyH+YPmFl_ogkkQ$=s@T1v}rNnZ^eMaqJ|quc+6 z*ygceDOrldsL30w`H;rNu+IjlS+G~p&0SawXCA1+D zC%cZtjUkLNq%FadtHE?O(yQTP486A{1x<{krq#rpauNQaeyhM3*i0%tBpQHQo-u)x z{0{&KS`>}vf2_}b160XZO2$b)cyrHq7ZSeiSbRvaxnKUH{Q`-P(nL&^fcF2){vhN- zbX&WEjP7?b4A%0y6n_=m%l00uZ+}mCYO(!x?j$+O$*TqoD_Q5EoyDJ?w?^UIa491H zE}87(bR`X;@u#3Qy~9wWdWQIg1`cXrk$x9=ccR|RY1~%{fAJ@uq@J3e872x0v$hmv ze_KcL(wM|n0EOp;t{hKoohYyDmYO;!`7^Lx;0k=PWPGZpI>V5qYlzjSL_(%|mud50 z7#{p97s`U|Sn$WYF>-i{i4`kzlrV6a<}=72q2sAT7Zh{>P%*6B;Zl;~0xWymt10Mo zl5{bmR(wJefJpNGK=fSRP|mpCI-)Nf6?Pv==FcFmpSwF1%CTOucV{yqxSyx4Zws3O z8hr5Uyd%ezIO7?PnEO0T%af#KOiXD$e?V&OX-B|ZX-YsgSs%sv-6U+sLPuz{D4bq| zpd&|o5tNCmpT>(uIbRf?8c}d3IpOb3sn6>_dr*26R#ev<_~vi)wleW$PX|5)$_ z+_|=pi(0D(AB_sjQ;sQQSM&AWqzDO1@NHw;C9cPdXRKRI#@nUW)CgFxzQ1nyd!+h& zcjU!U=&u|>@}R(9D$%lu2TlV>@I2-n@fCr5PrZNVyKWR7hm zWjoy^p7v8m#$qN0K#8jT- zq`mSirDZDa1Jxm;Rg3rAPhC)LcI4@-RvKT+@9&KsR3b0_0zuM!Fg7u>oF>3bzOxZPU&$ab$Z9@ zY)f7pKh22I7ZykL{YsdjcqeN++=0a}elQM-4;Q)(`Ep3|VFHqnXOh14`!Bus& z9w%*EWK6AiAM{s$6~SEQS;A>ey$#`7)khZvamem{P?>k)5&7Sl&&NXKk}o!%vd;-! zpo2p-_h^b$DNBO>{h4JdGB=D>fvGIYN8v&XsfxU~VaefL?q} z3ekM?iOKkCzQHkBkhg=hD!@&(L}FcHKoa zbZ7)H1C|lHjwEb@tu=n^OvdHOo7o+W`0-y3KdP#bb~wM=Vr_gyoEq|#B?$&d$tals ziIs-&7isBpvS|CjC|7C&3I0SE?~`a%g~$PI%;au^cUp@ER3?mn-|vyu!$7MV6(uvt z+CcGuM(Ku2&G0tcRCo7#D$Dirfqef2qPOE5I)oCGzmR5G!o#Q~(k~)c=LpIfrhHQk zeAva6MilEifE7rgP1M7AyWmLOXK}i8?=z2;N=no)`IGm#y%aGE>-FN zyXCp0Sln{IsfOBuCdE*#@CQof%jzuU*jkR*Su3?5t}F(#g0BD0Zzu|1MDes8U7f9; z$JBg|mqTXt`muZ8=Z`3wx$uizZG_7>GI7tcfOHW`C2bKxNOR)XAwRkLOaHS4xwlH4 zDpU29#6wLXI;H?0Se`SRa&I_QmI{zo7p%uveBZ0KZKd9H6@U?YGArbfm)D*^5=&Rp z`k{35?Z5GbZnv>z@NmJ%+sx=1WanWg)8r}C_>EGR8mk(NR$pW<-l8OTU^_u3M@gwS z7}GGa1)`z5G|DZirw;FB@VhH7Dq*0qc=|9lLe{w2#`g+_nt>_%o<~9(VZe=zI*SSz4w43-_o>4E4`M@NPKTWZuQJs)?KXbWp1M zimd5F;?AP(LWcaI-^Sl{`~>tmxsQB9Y$Xi*{Zr#py_+I$vx7@NY`S?HFfS!hUiz$a z{>!&e1(16T!Om)m)&k1W#*d#GslD^4!TwiF2WjFBvi=Ms!ADT)ArEW6zfVuIXcXVk z>AHjPADW+mJzY`_Ieq(s?jbk4iD2Rb8*V3t6?I+E06(K8H!!xnDzO%GB;Z$N-{M|B zeT`jo%9)s%op*XZKDd6*)-^lWO{#RaIGFdBH+;XXjI(8RxpBc~azG1H^2v7c^bkFE zZCVPE+E*Q=FSe8Vm&6|^3ki{9~qafiMAf7i4APZg>b%&5>nT@pHH z%O*pOv(77?ZiT{W zBibx}Q12tRc7Py1NcZTp`Q4ey%T_nj@1WKg5Fz_Rjl4wlJQj)rtp8yL3r!Shy zvZvnmh!tH4T6Js-?vI0<-rzzl{mgT*S0d_7^AU_8gBg^03o-J=p(1o6kww2hx|!%T z-jqp}m^G*W?$!R#M%Ef?&2jYxmx+lXWZszpI4d$pUN`(S)|*c^CgdwY>Fa>> zgGBJhwe8y#Xd*q0=@SLEgPF>+Qe4?%E*v{a`||luZ~&dqMBrRfJ{SDMaJ!s_;cSJp zSqZHXIdc@@XteNySUZs^9SG7xK`8=NBNM)fRVOjw)D^)w%L2OPkTQ$Tel-J)GD3=YXy+F4in(ILy*A3m@3o73uv?JC}Q>f zrY&8SWmesiba0|3X-jmlMT3 z*ST|_U@O=i*sM_*48G)dgXqlwoFp5G6qSM3&%_f_*n!PiT>?cNI)fAUkA{qWnqdMi+aNK_yVQ&lx4UZknAc9FIzVk% zo6JmFH~c{_tK!gt4+o2>)zoP{sR}!!vfRjI=13!z5}ijMFQ4a4?QIg-BE4T6!#%?d&L;`j5=a`4is>U;%@Rd~ zXC~H7eGQhhYWhMPWf9znDbYIgwud(6$W3e>$W4$~d%qoJ z+JE`1g$qJ%>b|z*xCKenmpV$0pM=Gl-Y*LT8K+P)2X#;XYEFF4mRbc~jj?DM@(1e`nL=F4Syv)TKIePQUz)bZ?Bi3@G@HO$Aps1DvDGkYF50O$_welu^cL7;vPiMGho74$;4fDqKbE{U zd1h{;LfM#Fb|Z&uH~Rm_J)R~Vy4b;1?tW_A)Iz#S_=F|~pISaVkCnQ0&u%Yz%o#|! zS-TSg87LUfFSs{tTuM3$!06ZzH&MFtG)X-l7>3)V?Txuj2HyG*5u;EY2_5vU0ujA? zHXh5G%6e3y7v?AjhyX79pnRBVr}RmPmtrxoB7lkxEzChX^(vKd+sLh?SBic=Q)5nA zdz7Mw3_iA>;T^_Kl~?1|5t%GZ;ki_+i>Q~Q1EVdKZ)$Sh3LM@ea&D~{2HOG++7*wF zAC6jW4>fa~!Vp5+$Z{<)Qxb|{unMgCv2)@%3j=7)Zc%U<^i|SAF88s!A^+Xs!OASYT%7;Jx?olg_6NFP1475N z#0s<@E~FI}#LNQ{?B1;t+N$2k*`K$Hxb%#8tRQi*Z#No0J}Pl;HWb){l7{A8(pu#@ zfE-OTvEreoz1+p`9sUI%Y{e5L-oTP_^NkgpYhZjp&ykinnW;(fu1;ttpSsgYM8ABX4dHe_HxU+%M(D=~) zYM}XUJ5guZ;=_ZcOsC`_{CiU$zN3$+x&5C`vX-V3`8&RjlBs^rf00MNYZW+jCd~7N z%{jJuUUwY(M`8$`B>K&_48!Li682ZaRknMgQ3~dnlp8C?__!P2z@=Auv;T^$yrsNy zCARmaA@^Yo2sS%2$`031-+h9KMZsIHfB>s@}>Y(z988e!`%4=EDoAQ0kbk>+lCoK60Mx9P!~I zlq~wf7kcm_NFImt3ZYlE(b3O1K^QWiFb$V^a2Jlwvm(!XYx<`i@ZMS3UwFt{;x+-v zhx{m=m;4dgvkKp5{*lfSN3o^keSpp9{hlXj%=}e_7Ou{Yiw(J@NXuh*;pL6@$HsfB zh?v+r^cp@jQ4EspC#RqpwPY(}_SS$wZ{S959`C25777&sgtNh%XTCo9VHJC-G z;;wi9{-iv+ETiY;K9qvlEc04f;ZnUP>cUL_T*ms``EtGoP^B#Q>n2dSrbAg8a>*Lg zd0EJ^=tdW~7fbcLFsqryFEcy*-8!?;n%;F+8i{eZyCDaiYxghr z$8k>L|2&-!lhvuVdk!r-kpSFl`5F5d4DJr%M4-qOy3gdmQbqF1=aBtRM7)c_Ae?$b8 zQg4c8*KQ{XJmL)1c7#0Yn0#PTMEs4-IHPjkn0!=;JdhMXqzMLeh`yOylXROP- zl#z3+fwM9l3%VN(6R77ua*uI9%hO7l7{+Hcbr(peh;afUK?B4EC09J{-u{mv)+u#? zdKVBCPt`eU@IzL)OXA`Ebu`Xp?u0m%h&X41}FNfnJ*g1!1wcbbpo%F4x!-#R9ft!8{5`Ho}04?FI#Kg zL|k`tF1t_`ywdy8(wnTut>HND(qNnq%Sq=AvvZbXnLx|mJhi!*&lwG2g|edBdVgLy zjvVTKHAx(+&P;P#2Xobo7_RttUi)Nllc}}hX>|N?-u5g7VJ-NNdwYcaOG?NK=5)}` zMtOL;o|i0mSKm(UI_7BL_^6HnVOTkuPI6y@ZLR(H?c1cr-_ouSLp{5!bx^DiKd*Yb z{K78Ci&Twup zTKm)ioN|wcYy%Qnwb)IzbH>W!;Ah5Zdm_jRY`+VRJ2 zhkspZ9hbK3iQD91A$d!0*-1i#%x81|s+SPRmD}d~<1p6!A13(!vABP2kNgqEG z?AMgl^P+iRoIY(9@_I?n1829lGvAsRnHwS~|5vD2+Zi53j<5N4wNn0{q>>jF9*bI) zL$kMXM-awNOElF>{?Jr^tOz1glbwaD-M0OKOlTeW3C!1ZyxRbB>8JDof(O&R1bh%3x#>y2~<>OXO#IIedH0Q`(&&?eo-c~ z>*Ah#3~09unym~UC-UFqqI>{dmUD$Y4@evG#ORLI*{ZM)Jl=e1it!XzY($S3V zLG!Y6fCjE>x6r@5FG1n|8ompSZaJ>9)q6jqU;XxCQk9zV(?C9+i*>w z21+KYt1gXX&0`x3E)hS7I5}snbBzox9C@Xzcr|{B8Hw;SY1$}&BoYKXH^hpjW-RgJ z-Fb}tannKCv>y~^`r|(1Q9;+sZlYf3XPSX|^gR01UFtu$B*R;$sPZdIZShRr>|b@J z;#G{EdoY+O;REEjQ}X7_YzWLO+Ey3>a_KDe1CjSe| z6arqcEZ)CX!8r(si`dqbF$uu&pnf^Np{1f*TdJ`r2;@SaZ z#hb4xlaCA@Pwqj#LlUEe5L{I$k(Zj$d3(~)u(F%&xb8={N9hKxlZIO1ABsM{Mt|)2 zJ^t9Id;?%4PfR4&Ph9B9cFK~@tG3wlFW-0fXZS_L4U*EiAA%+`h%q2^6BCC;t0iO4V=s4Qug{M|iDV@s zC7|ef-dxiR7T&Mpre!%hiUhHM%3Qxi$Lzw6&(Tvlx9QA_7LhYq<(o~=Y>3ka-zrQa zhGpfFK@)#)rtfz61w35^sN1=IFw&Oc!Nah+8@qhJ0UEGr;JplaxOGI82OVqZHsqfX ze1}r{jy;G?&}Da}a7>SCDsFDuzuseeCKof|Dz2BPsP8? zY;a)Tkr2P~0^2BeO?wnzF_Ul-ekY=-w26VnU%U3f19Z-pj&2 z4J_a|o4Dci+MO)mPQIM>kdPG1xydiR9@#8m zh27D7GF{p|a{8({Q-Pr-;#jV{2zHR>lGoFtIfIpoMo?exuQyX_A;;l0AP4!)JEM$EwMInZkj+8*IHP4vKRd zKx_l-i*>A*C@{u%ct`y~s6MWAfO{@FPIX&sg8H{GMDc{4M3%$@c8&RAlw0-R<4DO3 trJqdc$mBpWeznn?E0M$F`|3v=`3%T2A17h;rxP7$%JLd=6(2u;`(N3pt&so# literal 0 HcmV?d00001 diff --git a/doc/index.html b/doc/index.html index 7adc1f16..1ce1e71b 100644 --- a/doc/index.html +++ b/doc/index.html @@ -1,250 +1,149 @@ - - - - - - JsDoc Reference - Index - - - - - - - - - - -
-

Class Index

- - -
-

_global_

- -
-
- - -
- -
-

osmplayer

- The main osmplayer class. -
-
- -
-

osmplayer.pager

- This class provides pager functionality. -
-
- -
-

osmplayer.playlist

- This class creates the playlist functionality for the minplayer. -
-
- -
-

osmplayer.teaser

- This class provides teaser functionality. -
-
- - -
-
- - Documentation generated by JsDoc Toolkit 2.4.0 on Thu Mar 20 2014 20:47:07 GMT-0500 (CDT) -
- + + + + + + Documentation Index + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + + + Index + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + +
+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/osmplayer.js.html b/doc/osmplayer.js.html new file mode 100644 index 00000000..80dca12b --- /dev/null +++ b/doc/osmplayer.js.html @@ -0,0 +1,531 @@ + + + + + + Documentation Source: osmplayer.js + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Source: osmplayer.js

+ +
+
+
// Add a way to instanciate using jQuery prototype.
+if (!jQuery.fn.osmplayer) {
+
+  /**
+   * A special jQuery event to handle the player being removed from DOM.
+   *
+   * @this The element that is being triggered with.
+   **/
+  jQuery.event.special.playerdestroyed = {
+    remove: function(o) {
+      if (o.handler) {
+        o.handler(this);
+      }
+    }
+  };
+
+  /**
+   * @constructor
+   *
+   * Define a jQuery osmplayer prototype.
+   *
+   * @param {object} options The options for this jQuery prototype.
+   * @return {Array} jQuery object.
+   */
+  jQuery.fn.osmplayer = function(options) {
+    return jQuery(this).each(function() {
+      options = options || {};
+      options.id = options.id || jQuery(this).attr('id') || Math.random();
+      if (!minplayer.plugins[options.id]) {
+        options.template = options.template || 'default';
+        if (osmplayer[options.template]) {
+          new osmplayer[options.template](jQuery(this), options);
+        }
+        else {
+          new osmplayer(jQuery(this), options);
+        }
+      }
+    });
+  };
+}
+
+/**
+ * @constructor
+ * @extends minplayer
+ * @class The main osmplayer class.
+ *
+ * <p><strong>Usage:</strong>
+ * <pre><code>
+ *
+ *   // Create a media player.
+ *   var player = jQuery("#player").osmplayer({
+ *
+ *   });
+ *
+ * </code></pre>
+ * </p>
+ *
+ * @param {object} context The jQuery context.
+ * @param {object} options This components options.
+ */
+osmplayer = function(context, options) {
+
+  // Derive from minplayer
+  minplayer.call(this, context, options);
+};
+
+/** Derive from minplayer. */
+osmplayer.prototype = new minplayer();
+
+/** Reset the constructor. */
+osmplayer.prototype.constructor = osmplayer;
+
+/**
+ * Creates a new plugin within this context.
+ *
+ * @param {string} name The name of the plugin you wish to create.
+ * @param {object} base The base object for this plugin.
+ * @param {object} context The context which you would like to create.
+ * @return {object} The new plugin object.
+ */
+osmplayer.prototype.create = function(name, base, context) {
+  return minplayer.prototype.create.call(this, name, 'osmplayer', context);
+};
+
+/**
+ * Get the default options for this plugin.
+ *
+ * @param {object} options The default options for this plugin.
+ */
+osmplayer.prototype.defaultOptions = function(options) {
+  options.playlist = '';
+  options.node = {};
+  options.link = 'http://www.mediafront.org';
+  options.logo = 'http://mediafront.org/assets/osmplayer/logo.png';
+  minplayer.prototype.defaultOptions.call(this, options);
+};
+
+/**
+ * @see minplayer.plugin.construct
+ */
+osmplayer.prototype.construct = function() {
+
+  // Call the minplayer display constructor.
+  minplayer.prototype.construct.call(this);
+
+  // We need to cleanup the player when it has been destroyed.
+  jQuery(this.display).bind('playerdestroyed', (function(player) {
+    return function(element) {
+      if (element === player.display.eq(0)[0]) {
+        for (var plugin in minplayer.plugins[player.options.id]) {
+          for (var index in minplayer.plugins[player.options.id][plugin]) {
+            minplayer.plugins[player.options.id][plugin][index].destroy();
+            delete minplayer.plugins[player.options.id][plugin][index];
+          }
+          minplayer.plugins[player.options.id][plugin].length = 0;
+        }
+        delete minplayer.plugins[player.options.id];
+        minplayer.plugins[player.options.id] = null;
+      }
+    };
+  })(this));
+
+  /** The play queue and index. */
+  this.playQueue = [];
+  this.playIndex = 0;
+  this.hasPlaylist = false;
+
+  /** The playlist for this media player. */
+  this.create('playlist', 'osmplayer');
+
+  /** Get the playlist or any other playlist that connects. */
+  this.get('playlist', function(playlist) {
+    playlist.ubind(this.uuid + ':nodeLoad', (function(player) {
+      return function(event, data) {
+        player.hasPlaylist = true;
+        if (!player.options.autoplay && !!data.autoplay) {
+          if (typeof player.options.originalAutoPlay == 'undefined') {
+            player.options.originalAutoPlay = player.options.autoplay;
+          }
+          player.options.autoplay = true;
+        }
+        player.loadNode(data);
+      };
+    })(this));
+  });
+
+  // Play each media sequentially...
+  this.get('media', function(media) {
+    media.ubind(this.uuid + ':ended', (function(player) {
+      return function() {
+        if (typeof player.options.originalAutoPlay == 'undefined') {
+          player.options.originalAutoPlay = player.options.autoplay;
+        }
+        player.options.autoplay = true;
+        player.playNext();
+      };
+    })(this));
+  });
+
+  // Load the node if one is provided.
+  this.loadNode(this.options.node);
+};
+
+/**
+ * Gets the full screen element.
+ *
+ * @return {object} The element that will go into fullscreen.
+ */
+osmplayer.prototype.fullScreenElement = function() {
+  return this.elements.minplayer;
+};
+
+/**
+ * Reset the osmplayer.
+ *
+ * @param {function} callback Called when it is done resetting.
+ */
+osmplayer.prototype.reset = function(callback) {
+
+  // Empty the playqueue.
+  this.playQueue.length = 0;
+  this.playQueue = [];
+  this.playIndex = 0;
+
+  // Clear the playloader.
+  if (this.playLoader && this.options.preview) {
+    this.options.preview = '';
+    this.playLoader.clear((function(player) {
+      return function() {
+        callback.call(player);
+      };
+    })(this));
+  }
+  else if (callback) {
+    callback.call(this);
+  }
+};
+
+/**
+ * The load node function.
+ *
+ * @param {object} node A media node object.
+ * @return {boolean} If the node was loaded.
+ */
+osmplayer.prototype.loadNode = function(node) {
+
+  // Make sure this is a valid node.
+  if (!node || (node.hasOwnProperty('length') && (node.length === 0))) {
+    return false;
+  }
+
+  // Reset the player.
+  this.reset(function() {
+
+    // Set the hasMedia flag.
+    this.hasMedia = node && node.mediafiles && node.mediafiles.media;
+    this.hasMedia = this.hasMedia || this.options.file;
+
+    // If this node is set and has files.
+    if (node && node.mediafiles) {
+
+      // Load the media files.
+      var media = node.mediafiles.media;
+      if (media) {
+        var file = null;
+        var types = [];
+
+        // For mobile devices, we should only show the main media.
+        if (minplayer.isAndroid || minplayer.isIDevice) {
+          types = ['media'];
+        }
+        else {
+          types = ['intro', 'commercial', 'prereel', 'media', 'postreel'];
+        }
+
+        // Iterate through the types.
+        jQuery.each(types, (function(player) {
+          return function(key, type) {
+            file = player.addToQueue(media[type]);
+            if (file) {
+              file.queueType = type;
+            }
+          };
+        })(this));
+      }
+      else {
+
+        // Add a class to the display to let themes handle this.
+        this.display.addClass('nomedia');
+      }
+
+      // Play the next media
+      this.playNext();
+
+      // Load the preview image.
+      osmplayer.getImage(node.mediafiles, 'preview', (function(player) {
+        return function(image) {
+          if (player.playLoader && (player.playLoader.display.length > 0)) {
+            player.playLoader.enabled = true;
+            player.playLoader.loadPreview(image.path);
+            player.playLoader.previewFlag.setFlag('media', true);
+            if (!player.hasMedia) {
+              player.playLoader.busy.setFlag('media', false);
+              player.playLoader.bigPlay.setFlag('media', false);
+            }
+            player.playLoader.checkVisibility();
+          }
+        };
+      })(this));
+    }
+  });
+};
+
+/**
+ * Adds a file to the play queue.
+ *
+ * @param {object} file The file to add to the queue.
+ * @return {object} The file that was added to the queue.
+ */
+osmplayer.prototype.addToQueue = function(file) {
+  file = minplayer.getMediaFile(file);
+  if (file) {
+    this.playQueue.push(file);
+  }
+  return file;
+};
+
+/**
+ * Plays the next media file in the queue.
+ */
+osmplayer.prototype.playNext = function() {
+  if (this.playQueue.length > this.playIndex) {
+    this.load(this.playQueue[this.playIndex]);
+    this.playIndex++;
+  }
+  else if (this.options.repeat) {
+    this.playIndex = 0;
+    this.playNext();
+  }
+  else if (this.playQueue.length > 0) {
+
+    // If we have a playlist, let them handle what to do next.
+    if (this.hasPlaylist && this.options.autoNext) {
+      this.trigger('player_ended');
+    }
+    else {
+      // If there is no playlist, and no repeat, we will
+      // just seek to the beginning and pause.
+      this.options.autoplay = false;
+      this.playIndex = 0;
+      this.playNext();
+    }
+  }
+  else if (this.media) {
+
+    // Reset the autoplay variable.
+    if (typeof this.options.originalAutoPlay != 'undefined') {
+      this.options.autoplay = this.options.originalAutoPlay;
+    }
+
+    this.media.stop();
+
+    // Load the media again.
+    if (this.options.file) {
+      this.load();
+    }
+    else {
+      this.loadNode();
+    }
+  }
+};
+
+/**
+ * Returns a node.
+ *
+ * @param {object} node The node to get.
+ * @param {function} callback Called when the node is retrieved.
+ */
+osmplayer.getNode = function(node, callback) {
+  if (node && node.mediafiles && node.mediafiles.media) {
+    var mediaFile = minplayer.getMediaFile(node.mediafiles.media.media);
+    if (mediaFile) {
+      var player = minplayer.players[mediaFile.player];
+      if (player && (typeof player.getNode === 'function')) {
+        player.getNode(mediaFile, function(node) {
+          callback(node);
+        });
+      }
+    }
+  }
+};
+
+/**
+ * Returns an image provided image array.
+ *
+ * @param {object} mediafiles The mediafiles to search within.
+ * @param {string} type The type of image to look for.
+ * @param {function} callback Called when the image is retrieved.
+ */
+osmplayer.getImage = function(mediafiles, type, callback) {
+
+  var image = '';
+  var images = mediafiles.image;
+  if (images) {
+
+    // If the image type exists, then just use that one...
+    if (images[type]) {
+      image = images[type];
+    }
+    // Or try the original image...
+    else if (images.image) {
+      image = images.image;
+    }
+    // Otherwise, just try ANY image...
+    else {
+
+      // Or, just pick the first one available.
+      for (type in images) {
+        if (images.hasOwnProperty(type)) {
+          image = images[type];
+          break;
+        }
+      }
+    }
+  }
+
+  // If the image exists, then callback with that image.
+  if (image) {
+    callback(new minplayer.file(image));
+  }
+  else {
+    // Get the image from the media player...
+    var mediaFile = minplayer.getMediaFile(mediafiles.media.media);
+    if (mediaFile) {
+      var player = minplayer.players[mediaFile.player];
+      if (player && (typeof player.getImage === 'function')) {
+        player.getImage(mediaFile, type, function(src) {
+          callback(new minplayer.file(src));
+        });
+      }
+    }
+  }
+};
+
+
+
+ + + + + +
+ +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/osmplayer.pager.html b/doc/osmplayer.pager.html new file mode 100644 index 00000000..64363c52 --- /dev/null +++ b/doc/osmplayer.pager.html @@ -0,0 +1,442 @@ + + + + + + Documentation Class: pager + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Class: pager

+
+ +
+

+ osmplayer. + + pager +

+ +
This class provides pager functionality.
+ +
+ +
+
+ + + + +
+

new pager(context, options)

+ + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
context + + +object + + + + The jQuery context.
options + + +object + + + + This components options.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + +
+ + +

Extends

+ +
    +
  • minplayer.display
  • +
+ + + + + + + + + + + +

Members

+ +
+ +
+

constructor

+ + +
+
+ +
+ Reset the constructor. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

construct()

+ + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + +
See:
+
+
    +
  • minplayer.plugin#construct
  • +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ +
+ +
+ + +
+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/osmplayer.pager.js.html b/doc/osmplayer.pager.js.html new file mode 100644 index 00000000..2cdbe37b --- /dev/null +++ b/doc/osmplayer.pager.js.html @@ -0,0 +1,179 @@ + + + + + + Documentation Source: osmplayer.pager.js + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Source: osmplayer.pager.js

+ +
+
+
/** The osmplayer namespace. */
+var osmplayer = osmplayer || {};
+
+/**
+ * @constructor
+ * @extends minplayer.display
+ * @class This class provides pager functionality.
+ *
+ * @param {object} context The jQuery context.
+ * @param {object} options This components options.
+ */
+osmplayer.pager = function(context, options) {
+
+  // Derive from display
+  minplayer.display.call(this, 'pager', context, options);
+};
+
+/** Derive from minplayer.display. */
+osmplayer.pager.prototype = new minplayer.display();
+
+/** Reset the constructor. */
+osmplayer.pager.prototype.constructor = osmplayer.pager;
+
+/**
+ * @see minplayer.plugin#construct
+ */
+osmplayer.pager.prototype.construct = function() {
+
+  // Call the minplayer plugin constructor.
+  minplayer.display.prototype.construct.call(this);
+
+  // Setup the prev button.
+  if (this.elements.prevPage) {
+    this.prevPage = this.elements.prevPage.click((function(pager) {
+      return function(event) {
+        event.preventDefault();
+        pager.trigger('prevPage');
+      };
+    })(this));
+  }
+
+  // Setup the next button.
+  if (this.elements.nextPage) {
+    this.nextPage = this.elements.nextPage.click((function(pager) {
+      return function(event) {
+        event.preventDefault();
+        pager.trigger('nextPage');
+      };
+    })(this));
+  }
+};
+
+
+
+ + + + + +
+ +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/osmplayer.parser.asx.js.html b/doc/osmplayer.parser.asx.js.html new file mode 100644 index 00000000..298bbbbf --- /dev/null +++ b/doc/osmplayer.parser.asx.js.html @@ -0,0 +1,172 @@ + + + + + + Documentation Source: osmplayer.parser.asx.js + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Source: osmplayer.parser.asx.js

+ +
+
+
/** The osmplayer namespace. */
+var osmplayer = osmplayer || {};
+
+/** The parser object. */
+osmplayer.parser = osmplayer.parser || {};
+
+/**
+ * The asx parser object.
+ *
+ * @return {object} The asx parser.
+ **/
+osmplayer.parser.asx = {
+
+  // The priority for this parser.
+  priority: 8,
+
+  // Return if this is a valid youtube feed.
+  valid: function(feed) {
+    feed = feed.replace(/(.*)\??(.*)/i, '$1');
+    return feed.match(/\.asx$/i) !== null;
+  },
+
+  // Returns the type of request to make.
+  getType: function(feed) {
+    return 'xml';
+  },
+
+  // Returns the feed provided the start and numItems.
+  getFeed: function(feed, start, numItems) {
+    return feed;
+  },
+
+  // Parse the feed.
+  parse: function(data) {
+    var playlist = {
+      total_rows: 0,
+      nodes: []
+    };
+    jQuery('asx entry', data).each(function(index) {
+      osmplayer.parser.rss.addRSSItem(playlist, jQuery(this));
+    });
+    return playlist;
+  }
+};
+
+
+
+ + + + + +
+ +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/osmplayer.parser.default.js.html b/doc/osmplayer.parser.default.js.html new file mode 100644 index 00000000..f5e51662 --- /dev/null +++ b/doc/osmplayer.parser.default.js.html @@ -0,0 +1,167 @@ + + + + + + Documentation Source: osmplayer.parser.default.js + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Source: osmplayer.parser.default.js

+ +
+
+
/** The osmplayer namespace. */
+var osmplayer = osmplayer || {};
+
+/** The parser object. */
+osmplayer.parser = osmplayer.parser || {};
+
+/**
+ * The default parser object.
+ *
+ * @return {object} The default parser.
+ **/
+osmplayer.parser['default'] = {
+
+  // The priority for this parser.
+  priority: 1,
+
+  // This parser is always valid.
+  valid: function(feed) {
+    return true;
+  },
+
+  // Returns the type of request to make.
+  getType: function(feed) {
+    return 'json';
+  },
+
+  // Returns the feed provided the start and numItems.
+  getFeed: function(feed, start, numItems) {
+    feed = feed.replace(/(.*)\??(.*)/i, '$1');
+    feed += '?start-index=' + start;
+    feed += '&max-results=' + numItems;
+    return feed;
+  },
+
+  // Parse the feed.
+  parse: function(data) {
+    return data;
+  }
+};
+
+
+
+ + + + + +
+ +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/osmplayer.parser.rss.js.html b/doc/osmplayer.parser.rss.js.html new file mode 100644 index 00000000..dc83c479 --- /dev/null +++ b/doc/osmplayer.parser.rss.js.html @@ -0,0 +1,216 @@ + + + + + + Documentation Source: osmplayer.parser.rss.js + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Source: osmplayer.parser.rss.js

+ +
+
+
/** The osmplayer namespace. */
+var osmplayer = osmplayer || {};
+
+/** The parser object. */
+osmplayer.parser = osmplayer.parser || {};
+
+/**
+ * The rss parser object.
+ *
+ * @return {object} The rss parser.
+ **/
+osmplayer.parser.rss = {
+
+  // The priority for this parser.
+  priority: 8,
+
+  // Return if this is a valid youtube feed.
+  valid: function(feed) {
+    feed = feed.replace(/(.*)\??(.*)/i, '$1');
+    return feed.match(/\.rss$/i) !== null;
+  },
+
+  // Returns the type of request to make.
+  getType: function(feed) {
+    return 'xml';
+  },
+
+  // Returns the feed provided the start and numItems.
+  getFeed: function(feed, start, numItems) {
+    return feed;
+  },
+
+  // Parse the feed.
+  parse: function(data) {
+    var playlist = {
+      total_rows: 0,
+      nodes: []
+    };
+    jQuery('rss channel', data).find('item').each(function(index) {
+      osmplayer.parser.rss.addRSSItem(playlist, jQuery(this));
+    });
+    return playlist;
+  },
+
+  // Parse an RSS item.
+  addRSSItem: function(playlist, item) {
+    playlist.total_rows++;
+    var node = {}, title = '', desc = '', img = '', media = '';
+
+    // Get the title.
+    title = item.find('title');
+    if (title.length) {
+      node.title = title.text();
+    }
+
+    // Get the description.
+    desc = item.find('annotation');
+    if (desc.length) {
+      node.description = desc.text();
+    }
+
+    // Add the media files.
+    node.mediafiles = {};
+
+    // Get the image.
+    img = item.find('image');
+    if (img.length) {
+      node.mediafiles.image = {
+        image: {
+          path: img.text()
+        }
+      };
+    }
+
+    // Get the media.
+    media = item.find('location');
+    if (media.length) {
+      node.mediafiles.media = {
+        media: {
+          path: media.text()
+        }
+      };
+    }
+
+    // Add this node to the playlist.
+    playlist.nodes.push(node);
+  }
+};
+
+
+
+ + + + + +
+ +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/osmplayer.parser.xspf.js.html b/doc/osmplayer.parser.xspf.js.html new file mode 100644 index 00000000..ab17d7ab --- /dev/null +++ b/doc/osmplayer.parser.xspf.js.html @@ -0,0 +1,172 @@ + + + + + + Documentation Source: osmplayer.parser.xspf.js + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Source: osmplayer.parser.xspf.js

+ +
+
+
/** The osmplayer namespace. */
+var osmplayer = osmplayer || {};
+
+/** The parser object. */
+osmplayer.parser = osmplayer.parser || {};
+
+/**
+ * The xsfp parser object.
+ *
+ * @return {object} The xsfp parser.
+ **/
+osmplayer.parser.xsfp = {
+
+  // The priority for this parser.
+  priority: 8,
+
+  // Return if this is a valid youtube feed.
+  valid: function(feed) {
+    feed = feed.replace(/(.*)\??(.*)/i, '$1');
+    return feed.match(/\.xml$/i) !== null;
+  },
+
+  // Returns the type of request to make.
+  getType: function(feed) {
+    return 'xml';
+  },
+
+  // Returns the feed provided the start and numItems.
+  getFeed: function(feed, start, numItems) {
+    return feed;
+  },
+
+  // Parse the feed.
+  parse: function(data) {
+    var playlist = {
+      total_rows: 0,
+      nodes: []
+    };
+    jQuery('playlist trackList track', data).each(function(index) {
+      osmplayer.parser.rss.addRSSItem(playlist, jQuery(this));
+    });
+    return playlist;
+  }
+};
+
+
+
+ + + + + +
+ +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/osmplayer.parser.youtube.js.html b/doc/osmplayer.parser.youtube.js.html new file mode 100644 index 00000000..25c2f949 --- /dev/null +++ b/doc/osmplayer.parser.youtube.js.html @@ -0,0 +1,183 @@ + + + + + + Documentation Source: osmplayer.parser.youtube.js + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Source: osmplayer.parser.youtube.js

+ +
+
+
/** The osmplayer namespace. */
+var osmplayer = osmplayer || {};
+
+/** The parser object. */
+osmplayer.parser = osmplayer.parser || {};
+
+/**
+ * The youtube parser object.
+ *
+ * @return {object} The youtube parser.
+ **/
+osmplayer.parser.youtube = {
+
+  // The priority for this parser.
+  priority: 10,
+
+  // Return if this is a valid youtube feed.
+  valid: function(feed) {
+    return (feed.search(/^http(s)?\:\/\/gdata\.youtube\.com/i) === 0);
+  },
+
+  // Returns the type of request to make.
+  getType: function(feed) {
+    return 'jsonp';
+  },
+
+  // Returns the feed provided the start and numItems.
+  getFeed: function(feed, start, numItems) {
+    feed = feed.replace(/(.*)\??(.*)/i, '$1');
+    feed += '?start-index=' + (start + 1);
+    feed += '&max-results=' + (numItems);
+    feed += '&v=2&alt=jsonc';
+    return feed;
+  },
+
+  // Parse the feed.
+  parse: function(data) {
+    data = data.data;
+    var playlist = {
+      total_rows: data.totalItems,
+      nodes: []
+    };
+
+    // Iterate through the items and parse it.
+    var node = null;
+    for (var index in data.items) {
+      if (data.items.hasOwnProperty(index)) {
+        node = minplayer.players.youtube.parseNode(data.items[index]);
+        playlist.nodes.push(node);
+      }
+    }
+
+    return playlist;
+  }
+};
+
+
+
+ + + + + +
+ +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/osmplayer.playlist.html b/doc/osmplayer.playlist.html new file mode 100644 index 00000000..ad860b32 --- /dev/null +++ b/doc/osmplayer.playlist.html @@ -0,0 +1,1995 @@ + + + + + + Documentation Class: playlist + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Class: playlist

+
+ +
+

+ osmplayer. + + playlist +

+ +
This class creates the playlist functionality for the minplayer.
+ +
+ +
+
+ + + + +
+

new playlist(context, options)

+ + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
context + + +object + + + + The jQuery context.
options + + +object + + + + This components options.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + +
+ + +

Extends

+ +
    +
  • minplayer.display
  • +
+ + + + + + + + + + + +

Members

+ +
+ +
+

constructor

+ + +
+
+ +
+ Reset the constructor. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

nodes

+ + +
+
+ +
+ The nodes within this playlist. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

addNode(node)

+ + +
+
+ + +
+ Adds a new node to the playlist. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
node + + +object + + + + The node that you would like to add to the playlist.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

construct()

+ + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + +
See:
+
+
    +
  • minplayer.plugin#construct
  • +
+
+ + + +
+ + + + + + + + + + + + + +
+ + + +
+

defaultOptions(options)

+ + +
+
+ + +
+ Returns the default options for this plugin. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +object + + + + The default options for this plugin.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

load(page, loadIndex) → {boolean}

+ + +
+
+ + +
+ Loads a playlist. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
page + + +integer + + + + The page to load.
loadIndex + + +integer + + + + The index of the item to load.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+ TRUE if loaded, FALSE if not. +
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + + +
+ + + +
+

loadItem(index) → {boolean}

+ + +
+
+ + +
+ Loads a playlist node. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
index + + +number + + + + The index of the item you would like to load.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+ TRUE if loaded, FALSE if not. +
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + + +
+ + + +
+

next() → {boolean}

+ + +
+
+ + +
+ Loads the next item. +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+ TRUE if loaded, FALSE if not. +
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + + +
+ + + +
+

nextPage(loadIndex) → {boolean}

+ + +
+
+ + +
+ Loads the next page. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
loadIndex + + +integer + + + + The index of the item to load.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+ TRUE if loaded, FALSE if not. +
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + + +
+ + + +
+

onAdded()

+ + +
+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + +
See:
+
+
    +
  • minplayer.plugin.onAdded
  • +
+
+ + + +
+ + + + + + + + + + + + + +
+ + + +
+

prev() → {boolean}

+ + +
+
+ + +
+ Loads the previous item. +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+ TRUE if loaded, FALSE if not. +
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + + +
+ + + +
+

prevPage(loadIndex) → {boolean}

+ + +
+
+ + +
+ Loads the previous page. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
loadIndex + + +integer + + + + The index of the item to load.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+ TRUE if loaded, FALSE if not. +
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + + +
+ + + +
+

refreshScroll()

+ + +
+
+ + +
+ Refresh the scrollbar. +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

scrollTo(pos, relative)

+ + +
+
+ + +
+ Wrapper around the scroll scrollTo method. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
pos + + +number + + + + The position you would like to set the list.
relative + + +boolean + + + + If this is a relative position change.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

set(playlist, loadIndex)

+ + +
+
+ + +
+ Sets the playlist. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
playlist + + +object + + + + The playlist object.
loadIndex + + +integer + + + + The index of the item to load.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

setQueue()

+ + +
+
+ + +
+ Stores the current playlist state in the playqueue. +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ +
+ +
+ + +
+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/osmplayer.playlist.js.html b/doc/osmplayer.playlist.js.html new file mode 100644 index 00000000..cbdd2451 --- /dev/null +++ b/doc/osmplayer.playlist.js.html @@ -0,0 +1,713 @@ + + + + + + Documentation Source: osmplayer.playlist.js + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Source: osmplayer.playlist.js

+ +
+
+
/**
+ * @constructor
+ * @extends minplayer.display
+ * @class This class creates the playlist functionality for the minplayer.
+ *
+ * @param {object} context The jQuery context.
+ * @param {object} options This components options.
+ */
+osmplayer.playlist = function(context, options) {
+
+  // Derive from display
+  minplayer.display.call(this, 'playlist', context, options);
+};
+
+/** Derive from minplayer.display. */
+osmplayer.playlist.prototype = new minplayer.display();
+
+/** Reset the constructor. */
+osmplayer.playlist.prototype.constructor = osmplayer.playlist;
+
+/**
+ * Returns the default options for this plugin.
+ *
+ * @param {object} options The default options for this plugin.
+ */
+osmplayer.playlist.prototype.defaultOptions = function(options) {
+  options.vertical = true;
+  options.playlist = '';
+  options.pageLimit = 10;
+  options.autoNext = true;
+  options.shuffle = false;
+  options.loop = false;
+  options.hysteresis = 40;
+  options.scrollSpeed = 20;
+  options.scrollMode = 'auto';
+  minplayer.display.prototype.defaultOptions.call(this, options);
+};
+
+/**
+ * @see minplayer.plugin#construct
+ */
+osmplayer.playlist.prototype.construct = function() {
+
+  /** The nodes within this playlist. */
+  this.nodes = [];
+
+  // Current page.
+  this.page = -1;
+
+  // The total amount of nodes.
+  this.totalItems = 0;
+
+  // The current loaded item index.
+  this.currentItem = -1;
+
+  // The play playqueue.
+  this.playqueue = [];
+
+  // The playqueue position.
+  this.playqueuepos = 0;
+
+  // The current playlist.
+  this.playlist = this.options.playlist;
+
+  // Create the scroll bar.
+  this.scroll = null;
+
+  // Create our orientation variable.
+  this.orient = {
+    pos: this.options.vertical ? 'y' : 'x',
+    pagePos: this.options.vertical ? 'pageY' : 'pageX',
+    offset: this.options.vertical ? 'top' : 'left',
+    wrapperSize: this.options.vertical ? 'wrapperH' : 'wrapperW',
+    minScroll: this.options.vertical ? 'minScrollY' : 'minScrollX',
+    maxScroll: this.options.vertical ? 'maxScrollY' : 'maxScrollX',
+    size: this.options.vertical ? 'height' : 'width'
+  };
+
+  // Create the pager.
+  this.pager = this.create('pager', 'osmplayer');
+  this.pager.ubind(this.uuid + ':nextPage', (function(playlist) {
+    return function(event) {
+      playlist.nextPage();
+    };
+  })(this));
+  this.pager.ubind(this.uuid + ':prevPage', (function(playlist) {
+    return function(event) {
+      playlist.prevPage();
+    };
+  })(this));
+
+  // Call the minplayer plugin constructor.
+  minplayer.display.prototype.construct.call(this);
+
+  // Load the "next" item.
+  this.hasPlaylist = this.next();
+
+  // Say that we are ready.
+  this.ready();
+};
+
+/**
+ * @see minplayer.plugin.onAdded
+ */
+osmplayer.playlist.prototype.onAdded = function(plugin) {
+
+  // Get the media.
+  if (this.options.autoNext) {
+
+    // Get the player from this plugin.
+    plugin.get('player', (function(playlist) {
+      return function(player) {
+        player.ubind(playlist.uuid + ':player_ended', function(event) {
+          if (playlist.hasPlaylist) {
+            if (typeof player.options.originalAutoPlay == 'undefined') {
+              player.options.originalAutoPlay = player.options.autoplay;
+            }
+            player.options.autoplay = true;
+            playlist.next();
+          }
+        });
+      };
+    })(this));
+  }
+};
+
+/**
+ * Wrapper around the scroll scrollTo method.
+ *
+ * @param {number} pos The position you would like to set the list.
+ * @param {boolean} relative If this is a relative position change.
+ */
+osmplayer.playlist.prototype.scrollTo = function(pos, relative) {
+  if (this.scroll) {
+    this.scroll.options.hideScrollbar = false;
+    if (this.options.vertical) {
+      this.scroll.scrollTo(0, pos, 0, relative);
+    }
+    else {
+      this.scroll.scrollTo(pos, 0, 0, relative);
+    }
+    this.scroll.options.hideScrollbar = true;
+  }
+};
+
+/**
+ * Refresh the scrollbar.
+ */
+osmplayer.playlist.prototype.refreshScroll = function() {
+
+  // Make sure that our window has the addEventListener to keep IE happy.
+  if (!window.addEventListener) {
+    setTimeout((function(playlist) {
+      return function() {
+        playlist.refreshScroll.call(playlist);
+      };
+    })(this), 200);
+    return;
+  }
+
+  // Check the size of the playlist.
+  var list = this.elements.list;
+  var scroll = this.elements.scroll;
+
+  // Destroy the scroll bar first.
+  if (this.scroll) {
+    this.scroll.scrollTo(0, 0);
+    this.scroll.destroy();
+    this.scroll = null;
+    this.elements.list
+        .unbind('mousemove')
+        .unbind('mouseenter')
+        .unbind('mouseleave');
+  }
+
+  // Need to force the width of the list.
+  if (!this.options.vertical) {
+    var listSize = 0;
+    jQuery.each(this.elements.list.children(), function() {
+      listSize += jQuery(this).outerWidth();
+    });
+    this.elements.list.width(listSize);
+  }
+
+  // Check to see if we should add a scroll bar functionality.
+  if ((list.length > 0) &&
+      (scroll.length > 0) &&
+      (list[this.orient.size]() > scroll[this.orient.size]())) {
+
+    // Setup the osmplayer.iScroll component.
+    this.scroll = new osmplayer.iScroll(this.elements.scroll.eq(0)[0], {
+      hScroll: !this.options.vertical,
+      hScrollbar: !this.options.vertical,
+      vScroll: this.options.vertical,
+      vScrollbar: this.options.vertical,
+      hideScrollbar: (this.options.scrollMode !== 'none')
+    });
+
+    // Use autoScroll for non-touch devices.
+    if ((this.options.scrollMode == 'auto') && !minplayer.hasTouch) {
+
+      // Bind to the mouse events for autoscrolling.
+      this.elements.list.bind('mousemove', (function(playlist) {
+        return function(event) {
+          event.preventDefault();
+          var offset = playlist.display.offset()[playlist.orient.offset];
+          playlist.mousePos = event[playlist.orient.pagePos];
+          playlist.mousePos -= offset;
+        };
+      })(this)).bind('mouseenter', (function(playlist) {
+        return function(event) {
+          event.preventDefault();
+          playlist.scrolling = true;
+          var setScroll = function() {
+            if (playlist.scrolling) {
+              var scrollSize = playlist.scroll[playlist.orient.wrapperSize];
+              var scrollMid = (scrollSize / 2);
+              var delta = playlist.mousePos - scrollMid;
+              if (Math.abs(delta) > playlist.options.hysteresis) {
+                var hyst = playlist.options.hysteresis;
+                hyst *= (delta > 0) ? -1 : 0;
+                delta = (playlist.options.scrollSpeed * (delta + hyst));
+                delta /= scrollMid;
+                var pos = playlist.scroll[playlist.orient.pos] - delta;
+                var min = playlist.scroll[playlist.orient.minScroll] || 0;
+                var max = playlist.scroll[playlist.orient.maxScroll];
+                if (pos >= min) {
+                  playlist.scrollTo(min);
+                }
+                else if (pos <= max) {
+                  playlist.scrollTo(max);
+                }
+                else {
+                  playlist.scrollTo(delta, true);
+                }
+              }
+
+              // Set timeout to try again.
+              setTimeout(setScroll, 30);
+            }
+          };
+          setScroll();
+        };
+      })(this)).bind('mouseleave', (function(playlist) {
+        return function(event) {
+          event.preventDefault();
+          playlist.scrolling = false;
+        };
+      })(this));
+    }
+
+    this.scroll.refresh();
+    this.scroll.scrollTo(0, 0, 200);
+  }
+};
+
+/**
+ * Adds a new node to the playlist.
+ *
+ * @param {object} node The node that you would like to add to the playlist.
+ */
+osmplayer.playlist.prototype.addNode = function(node) {
+
+  // Get the current index for this node.
+  var index = this.nodes.length;
+
+  // Create the teaser object.
+  var teaser = this.create('teaser', 'osmplayer', this.elements.list);
+
+  // Set the node for this teaser.
+  teaser.setNode(node);
+
+  // Bind to when it loads.
+  teaser.ubind(this.uuid + ':nodeLoad', (function(playlist) {
+    return function(event, data) {
+      playlist.loadItem(index, true);
+    };
+  })(this));
+
+  // Add this to our nodes array.
+  this.nodes.push(teaser);
+};
+
+/**
+ * Sets the playlist.
+ *
+ * @param {object} playlist The playlist object.
+ * @param {integer} loadIndex The index of the item to load.
+ */
+osmplayer.playlist.prototype.set = function(playlist, loadIndex) {
+
+  // Check to make sure the playlist is an object.
+  if (typeof playlist !== 'object') {
+    this.trigger('error', 'Playlist must be an object to set');
+    return;
+  }
+
+  // Check to make sure the playlist has correct format.
+  if (!playlist.hasOwnProperty('total_rows')) {
+    this.trigger('error', 'Unknown playlist format.');
+    return;
+  }
+
+  // Make sure the playlist has some rows.
+  if (playlist.total_rows && playlist.nodes.length) {
+
+    // Set the total rows.
+    this.totalItems = playlist.total_rows;
+    this.currentItem = 0;
+
+    // Show or hide the next page if there is or is not a next page.
+    if ((((this.page + 1) * this.options.pageLimit) >= this.totalItems) ||
+        (this.totalItems == playlist.nodes.length)) {
+      this.pager.nextPage.hide();
+    }
+    else {
+      this.pager.nextPage.show();
+    }
+
+    var teaser = null;
+    var numNodes = playlist.nodes.length;
+    this.elements.list.empty();
+    this.nodes = [];
+
+    // Iterate through all the nodes.
+    for (var index = 0; index < numNodes; index++) {
+
+      // Add this node to the playlist.
+      this.addNode(playlist.nodes[index]);
+
+      // If the index is equal to the loadIndex.
+      if (loadIndex === index) {
+        this.loadItem(index);
+      }
+    }
+
+    // Refresh the sizes.
+    this.refreshScroll();
+
+    // Trigger that the playlist has loaded.
+    this.trigger('playlistLoad', playlist);
+  }
+
+  // Show that we are no longer busy.
+  if (this.elements.playlist_busy) {
+    this.elements.playlist_busy.hide();
+  }
+};
+
+/**
+ * Stores the current playlist state in the playqueue.
+ */
+osmplayer.playlist.prototype.setQueue = function() {
+
+  // Add this item to the playqueue.
+  this.playqueue.push({
+    page: this.page,
+    item: this.currentItem
+  });
+
+  // Store the current playqueue position.
+  this.playqueuepos = this.playqueue.length;
+};
+
+/**
+ * Loads the next item.
+ *
+ * @return {boolean} TRUE if loaded, FALSE if not.
+ */
+osmplayer.playlist.prototype.next = function() {
+  var item = 0, page = this.page;
+
+  // See if we are at the front of the playqueue.
+  if (this.playqueuepos >= this.playqueue.length) {
+
+    // If this is shuffle, then load a random item.
+    if (this.options.shuffle) {
+      item = Math.floor(Math.random() * this.totalItems);
+      page = Math.floor(item / this.options.pageLimit);
+      item = item % this.options.pageLimit;
+      return this.load(page, item);
+    }
+    else {
+
+      // Otherwise, increment the current item by one.
+      item = (this.currentItem + 1);
+      if (item >= this.nodes.length) {
+        return this.load(page + 1, 0);
+      }
+      else {
+        return this.loadItem(item);
+      }
+    }
+  }
+  else {
+
+    // Load the next item in the playqueue.
+    this.playqueuepos = this.playqueuepos + 1;
+    var currentQueue = this.playqueue[this.playqueuepos];
+    return this.load(currentQueue.page, currentQueue.item);
+  }
+};
+
+/**
+ * Loads the previous item.
+ *
+ * @return {boolean} TRUE if loaded, FALSE if not.
+ */
+osmplayer.playlist.prototype.prev = function() {
+
+  // Move back into the playqueue.
+  this.playqueuepos = this.playqueuepos - 1;
+  this.playqueuepos = (this.playqueuepos < 0) ? 0 : this.playqueuepos;
+  var currentQueue = this.playqueue[this.playqueuepos];
+  if (currentQueue) {
+    return this.load(currentQueue.page, currentQueue.item);
+  }
+  return false;
+};
+
+/**
+ * Loads a playlist node.
+ *
+ * @param {number} index The index of the item you would like to load.
+ * @return {boolean} TRUE if loaded, FALSE if not.
+ */
+osmplayer.playlist.prototype.loadItem = function(index, autoplay) {
+  if (index < this.nodes.length) {
+    this.setQueue();
+
+    // Get the teaser at the current index and deselect it.
+    var teaser = this.nodes[this.currentItem];
+    teaser.select(false);
+    this.currentItem = index;
+
+    // Get the new teaser and select it.
+    teaser = this.nodes[index];
+    teaser.select(true);
+    teaser.node.autoplay = !!autoplay;
+    this.trigger('nodeLoad', teaser.node);
+    return true;
+  }
+
+  return false;
+};
+
+/**
+ * Loads the next page.
+ *
+ * @param {integer} loadIndex The index of the item to load.
+ * @return {boolean} TRUE if loaded, FALSE if not.
+ */
+osmplayer.playlist.prototype.nextPage = function(loadIndex) {
+  return this.load(this.page + 1, loadIndex);
+};
+
+/**
+ * Loads the previous page.
+ *
+ * @param {integer} loadIndex The index of the item to load.
+ * @return {boolean} TRUE if loaded, FALSE if not.
+ */
+osmplayer.playlist.prototype.prevPage = function(loadIndex) {
+  return this.load(this.page - 1, loadIndex);
+};
+
+/**
+ * Loads a playlist.
+ *
+ * @param {integer} page The page to load.
+ * @param {integer} loadIndex The index of the item to load.
+ * @return {boolean} TRUE if loaded, FALSE if not.
+ */
+osmplayer.playlist.prototype.load = function(page, loadIndex) {
+
+  // If the playlist and pages are the same, then no need to load.
+  if ((this.playlist == this.options.playlist) && (page == this.page)) {
+    return this.loadItem(loadIndex);
+  }
+
+  // Set the new playlist.
+  this.playlist = this.options.playlist;
+
+  // Return if there aren't any playlists to play.
+  if (!this.playlist) {
+    return false;
+  }
+
+  // Determine if we need to loop.
+  var maxPages = Math.floor(this.totalItems / this.options.pageLimit);
+  if (page > maxPages) {
+    if (this.options.loop) {
+      page = 0;
+      loadIndex = 0;
+    }
+    else {
+      return false;
+    }
+  }
+
+  // Say that we are busy.
+  if (this.elements.playlist_busy) {
+    this.elements.playlist_busy.show();
+  }
+
+  // Normalize the page.
+  page = page || 0;
+  page = (page < 0) ? 0 : page;
+
+  // Set the queue.
+  this.setQueue();
+
+  // Set the new page.
+  this.page = page;
+
+  // Hide or show the page based on if we are on the first page.
+  if (this.page === 0) {
+    this.pager.prevPage.hide();
+  }
+  else {
+    this.pager.prevPage.show();
+  }
+
+  // If the playlist is an object, then go ahead and set it.
+  if (typeof this.playlist == 'object') {
+    this.set(this.playlist, loadIndex);
+    if (this.playlist.endpoint) {
+      this.playlist = this.options.playlist = this.playlist.endpoint;
+    }
+    return true;
+  }
+
+  // Get the highest priority parser.
+  var parser = osmplayer.parser['default'];
+  for (var name in osmplayer.parser) {
+    if (osmplayer.parser.hasOwnProperty(name)) {
+      if (osmplayer.parser[name].valid(this.playlist)) {
+        if (osmplayer.parser[name].priority > parser.priority) {
+          parser = osmplayer.parser[name];
+        }
+      }
+    }
+  }
+
+  // The start index.
+  var start = this.page * this.options.pageLimit;
+
+  // Get the feed from the parser.
+  var feed = parser.getFeed(
+    this.playlist,
+    start,
+    this.options.pageLimit
+  );
+
+  // Build our request.
+  var request = {
+    type: 'GET',
+    url: feed,
+    success: (function(playlist) {
+      return function(data) {
+        playlist.set(parser.parse(data), loadIndex);
+      };
+    })(this),
+    error: (function(playlist) {
+      return function(XMLHttpRequest, textStatus, errorThrown) {
+        if (playlist.elements.playlist_busy) {
+          playlist.elements.playlist_busy.hide();
+        }
+        playlist.trigger('error', textStatus);
+      };
+    })(this)
+  };
+
+  // Set the data if applicable.
+  var dataType = parser.getType();
+  if (dataType) {
+    request.dataType = dataType;
+  }
+
+  // Perform an ajax callback.
+  jQuery.ajax(request);
+
+  // Return that we did something.
+  return true;
+};
+
+
+
+ + + + + +
+ +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/osmplayer.teaser.html b/doc/osmplayer.teaser.html new file mode 100644 index 00000000..345a877c --- /dev/null +++ b/doc/osmplayer.teaser.html @@ -0,0 +1,660 @@ + + + + + + Documentation Class: teaser + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Class: teaser

+
+ +
+

+ osmplayer. + + teaser +

+ +
This class provides teaser functionality.
+ +
+ +
+
+ + + + +
+

new teaser(context, options)

+ + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
context + + +object + + + + The jQuery context.
options + + +object + + + + This components options.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + +
+ + +

Extends

+ +
    +
  • minplayer.display
  • +
+ + + + + + + + + + + +

Members

+ +
+ +
+

constructor

+ + +
+
+ +
+ Reset the constructor. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

preview

+ + +
+
+ +
+ The preview image. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ +
+ + + +

Methods

+ +
+ +
+

select(selected)

+ + +
+
+ + +
+ Selects the teaser. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
selected + + +boolean + + + + TRUE if selected, FALSE otherwise.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

setNode(node)

+ + +
+
+ + +
+ Sets the node. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
node + + +object + + + + The node object to set.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+ +
+ +
+ + +
+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/osmplayer.teaser.js.html b/doc/osmplayer.teaser.js.html new file mode 100644 index 00000000..90d904f1 --- /dev/null +++ b/doc/osmplayer.teaser.js.html @@ -0,0 +1,206 @@ + + + + + + Documentation Source: osmplayer.teaser.js + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Source: osmplayer.teaser.js

+ +
+
+
/** The osmplayer namespace. */
+var osmplayer = osmplayer || {};
+
+/**
+ * @constructor
+ * @extends minplayer.display
+ * @class This class provides teaser functionality.
+ *
+ * @param {object} context The jQuery context.
+ * @param {object} options This components options.
+ */
+osmplayer.teaser = function(context, options) {
+
+  /** The preview image. */
+  this.preview = null;
+
+  // Derive from display
+  minplayer.display.call(this, 'teaser', context, options);
+};
+
+/** Derive from minplayer.display. */
+osmplayer.teaser.prototype = new minplayer.display();
+
+/** Reset the constructor. */
+osmplayer.teaser.prototype.constructor = osmplayer.teaser;
+
+/**
+ * Selects the teaser.
+ *
+ * @param {boolean} selected TRUE if selected, FALSE otherwise.
+ */
+osmplayer.teaser.prototype.select = function(selected) {
+};
+
+/**
+ * Sets the node.
+ *
+ * @param {object} node The node object to set.
+ */
+osmplayer.teaser.prototype.setNode = function(node) {
+
+  // Add this to the node info for this teaser.
+  this.node = node;
+
+  // Set the title of the teaser.
+  if (this.elements.title) {
+    if (node.title) {
+      this.elements.title.text(node.title);
+    }
+    else {
+      osmplayer.getNode(node, (function(teaser) {
+        return function(node) {
+          teaser.elements.title.text(node.title);
+        };
+      })(this));
+    }
+  }
+
+  // Load the thumbnail image if it exists.
+  if (node.mediafiles) {
+    osmplayer.getImage(node.mediafiles, 'thumbnail', (function(teaser) {
+      return function(image) {
+        if (image && teaser.elements.image) {
+          teaser.preview = new minplayer.image(teaser.elements.image);
+          teaser.preview.load(image.path);
+        }
+      };
+    })(this));
+  }
+
+  // Bind when they click on this teaser.
+  this.display.unbind('click').click((function(teaser) {
+    return function(event) {
+      event.preventDefault();
+      teaser.trigger('nodeLoad', teaser.node);
+    };
+  })(this));
+};
+
+
+
+ + + + + +
+ +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/prototype..html b/doc/prototype..html new file mode 100644 index 00000000..9b034819 --- /dev/null +++ b/doc/prototype..html @@ -0,0 +1,298 @@ + + + + + + Documentation Class: Define a jQuery osmplayer prototype. + + + + + + + + + + +
+ + +
+ + +
+ +
+ + + +

Class: Define a jQuery osmplayer prototype.

+
+ +
+

+ Define a jQuery osmplayer prototype. +

+ +
+ +
+
+ + + + +
+

new Define a jQuery osmplayer prototype.(options) → {Array}

+ + +
+
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + +object + + + + The options for this jQuery prototype.
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+ jQuery object. +
+ + + +
+
+ Type +
+
+ +Array + + +
+
+ + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+ +
+ + +
+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/scripts/URI.js b/doc/scripts/URI.js new file mode 100644 index 00000000..f8546c72 --- /dev/null +++ b/doc/scripts/URI.js @@ -0,0 +1,1429 @@ +/*! + * URI.js - Mutating URLs + * + * Version: 1.8.3 + * + * Author: Rodney Rehm + * Web: http://medialize.github.com/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * GPL v3 http://opensource.org/licenses/GPL-3.0 + * + */ +(function(root, factory) { + // https://github.com/umdjs/umd/blob/master/returnExports.js + if (typeof exports === 'object') { + // Node + module.exports = factory(require('./punycode'), require('./IPv6'), require('./SecondLevelDomains')); + } else if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['./punycode', './IPv6', './SecondLevelDomains'], factory); + } else { + // Browser globals (root is window) + root.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains); + } +}(this, function(punycode, IPv6, SLD) { + "use strict"; + + function URI(url, base) { + // Allow instantiation without the 'new' keyword + if (!(this instanceof URI)) { + return new URI(url, base); + } + if (url === undefined) { + if (typeof location !== 'undefined') { + url = location.href + ""; + } else { + url = ""; + } + } + this.href(url); + // resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor + if (base !== undefined) { + return this.absoluteTo(base); + } + return this; + }; + var p = URI.prototype; + var hasOwn = Object.prototype.hasOwnProperty; + + function escapeRegEx(string) { + // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963 + return string.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); + } + + function isArray(obj) { + return String(Object.prototype.toString.call(obj)) === "[object Array]"; + } + + function filterArrayValues(data, value) { + var lookup = {}; + var i, length; + if (isArray(value)) { + for (i = 0, length = value.length; i < length; i++) { + lookup[value[i]] = true; + } + } else { + lookup[value] = true; + } + for (i = 0, length = data.length; i < length; i++) { + if (lookup[data[i]] !== undefined) { + data.splice(i, 1); + length--; + i--; + } + } + return data; + } + URI._parts = function() { + return { + protocol: null, + username: null, + password: null, + hostname: null, + urn: null, + port: null, + path: null, + query: null, + fragment: null, + // state + duplicateQueryParameters: URI.duplicateQueryParameters + }; + }; + // state: allow duplicate query parameters (a=1&a=1) + URI.duplicateQueryParameters = false; + // static properties + URI.protocol_expression = /^[a-z][a-z0-9-+-]*$/i; + URI.idn_expression = /[^a-z0-9\.-]/i; + URI.punycode_expression = /(xn--)/i; + // well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care? + URI.ip4_expression = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/; + // credits to Rich Brown + // source: http://forums.intermapper.com/viewtopic.php?p=1096#1096 + // specification: http://www.ietf.org/rfc/rfc4291.txt + URI.ip6_expression = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/; + // gruber revised expression - http://rodneyrehm.de/t/url-regex.html + URI.find_uri_expression = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig; + // http://www.iana.org/assignments/uri-schemes.html + // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports + URI.defaultPorts = { + http: "80", + https: "443", + ftp: "21", + gopher: "70", + ws: "80", + wss: "443" + }; + // allowed hostname characters according to RFC 3986 + // ALPHA DIGIT "-" "." "_" "~" "!" "$" "&" "'" "(" ")" "*" "+" "," ";" "=" %encoded + // I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . - + URI.invalid_hostname_characters = /[^a-zA-Z0-9\.-]/; + // encoding / decoding according to RFC3986 + + function strictEncodeURIComponent(string) { + // see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent + return encodeURIComponent(string).replace(/[!'()*]/g, escape).replace(/\*/g, "%2A"); + } + URI.encode = strictEncodeURIComponent; + URI.decode = decodeURIComponent; + URI.iso8859 = function() { + URI.encode = escape; + URI.decode = unescape; + }; + URI.unicode = function() { + URI.encode = strictEncodeURIComponent; + URI.decode = decodeURIComponent; + }; + URI.characters = { + pathname: { + encode: { + // RFC3986 2.1: For consistency, URI producers and normalizers should + // use uppercase hexadecimal digits for all percent-encodings. + expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig, + map: { + // -._~!'()* + "%24": "$", + "%26": "&", + "%2B": "+", + "%2C": ",", + "%3B": ";", + "%3D": "=", + "%3A": ":", + "%40": "@" + } + }, + decode: { + expression: /[\/\?#]/g, + map: { + "/": "%2F", + "?": "%3F", + "#": "%23" + } + } + }, + reserved: { + encode: { + // RFC3986 2.1: For consistency, URI producers and normalizers should + // use uppercase hexadecimal digits for all percent-encodings. + expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig, + map: { + // gen-delims + "%3A": ":", + "%2F": "/", + "%3F": "?", + "%23": "#", + "%5B": "[", + "%5D": "]", + "%40": "@", + // sub-delims + "%21": "!", + "%24": "$", + "%26": "&", + "%27": "'", + "%28": "(", + "%29": ")", + "%2A": "*", + "%2B": "+", + "%2C": ",", + "%3B": ";", + "%3D": "=" + } + } + } + }; + URI.encodeQuery = function(string) { + return URI.encode(string + "").replace(/%20/g, '+'); + }; + URI.decodeQuery = function(string) { + return URI.decode((string + "").replace(/\+/g, '%20')); + }; + URI.recodePath = function(string) { + var segments = (string + "").split('/'); + for (var i = 0, length = segments.length; i < length; i++) { + segments[i] = URI.encodePathSegment(URI.decode(segments[i])); + } + return segments.join('/'); + }; + URI.decodePath = function(string) { + var segments = (string + "").split('/'); + for (var i = 0, length = segments.length; i < length; i++) { + segments[i] = URI.decodePathSegment(segments[i]); + } + return segments.join('/'); + }; + // generate encode/decode path functions + var _parts = { + 'encode': 'encode', + 'decode': 'decode' + }; + var _part; + var generateAccessor = function(_group, _part) { + return function(string) { + return URI[_part](string + "").replace(URI.characters[_group][_part].expression, function(c) { + return URI.characters[_group][_part].map[c]; + }); + }; + }; + for (_part in _parts) { + URI[_part + "PathSegment"] = generateAccessor("pathname", _parts[_part]); + } + URI.encodeReserved = generateAccessor("reserved", "encode"); + URI.parse = function(string, parts) { + var pos, t; + if (!parts) { + parts = {}; + } + // [protocol"://"[username[":"password]"@"]hostname[":"port]"/"?][path]["?"querystring]["#"fragment] + // extract fragment + pos = string.indexOf('#'); + if (pos > -1) { + // escaping? + parts.fragment = string.substring(pos + 1) || null; + string = string.substring(0, pos); + } + // extract query + pos = string.indexOf('?'); + if (pos > -1) { + // escaping? + parts.query = string.substring(pos + 1) || null; + string = string.substring(0, pos); + } + // extract protocol + if (string.substring(0, 2) === '//') { + // relative-scheme + parts.protocol = ''; + string = string.substring(2); + // extract "user:pass@host:port" + string = URI.parseAuthority(string, parts); + } else { + pos = string.indexOf(':'); + if (pos > -1) { + parts.protocol = string.substring(0, pos); + if (parts.protocol && !parts.protocol.match(URI.protocol_expression)) { + // : may be within the path + parts.protocol = undefined; + } else if (parts.protocol === 'file') { + // the file scheme: does not contain an authority + string = string.substring(pos + 3); + } else if (string.substring(pos + 1, pos + 3) === '//') { + string = string.substring(pos + 3); + // extract "user:pass@host:port" + string = URI.parseAuthority(string, parts); + } else { + string = string.substring(pos + 1); + parts.urn = true; + } + } + } + // what's left must be the path + parts.path = string; + // and we're done + return parts; + }; + URI.parseHost = function(string, parts) { + // extract host:port + var pos = string.indexOf('/'); + var bracketPos; + var t; + if (pos === -1) { + pos = string.length; + } + if (string[0] === "[") { + // IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6 + // I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts + // IPv6+port in the format [2001:db8::1]:80 (for the time being) + bracketPos = string.indexOf(']'); + parts.hostname = string.substring(1, bracketPos) || null; + parts.port = string.substring(bracketPos + 2, pos) || null; + } else if (string.indexOf(':') !== string.lastIndexOf(':')) { + // IPv6 host contains multiple colons - but no port + // this notation is actually not allowed by RFC 3986, but we're a liberal parser + parts.hostname = string.substring(0, pos) || null; + parts.port = null; + } else { + t = string.substring(0, pos).split(':'); + parts.hostname = t[0] || null; + parts.port = t[1] || null; + } + if (parts.hostname && string.substring(pos)[0] !== '/') { + pos++; + string = "/" + string; + } + return string.substring(pos) || '/'; + }; + URI.parseAuthority = function(string, parts) { + string = URI.parseUserinfo(string, parts); + return URI.parseHost(string, parts); + }; + URI.parseUserinfo = function(string, parts) { + // extract username:password + var pos = string.indexOf('@'); + var firstSlash = string.indexOf('/'); + var t; + // authority@ must come before /path + if (pos > -1 && (firstSlash === -1 || pos < firstSlash)) { + t = string.substring(0, pos).split(':'); + parts.username = t[0] ? URI.decode(t[0]) : null; + t.shift(); + parts.password = t[0] ? URI.decode(t.join(':')) : null; + string = string.substring(pos + 1); + } else { + parts.username = null; + parts.password = null; + } + return string; + }; + URI.parseQuery = function(string) { + if (!string) { + return {}; + } + // throw out the funky business - "?"[name"="value"&"]+ + string = string.replace(/&+/g, '&').replace(/^\?*&*|&+$/g, ''); + if (!string) { + return {}; + } + var items = {}; + var splits = string.split('&'); + var length = splits.length; + var v, name, value; + for (var i = 0; i < length; i++) { + v = splits[i].split('='); + name = URI.decodeQuery(v.shift()); + // no "=" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters + value = v.length ? URI.decodeQuery(v.join('=')) : null; + if (items[name]) { + if (typeof items[name] === "string") { + items[name] = [items[name]]; + } + items[name].push(value); + } else { + items[name] = value; + } + } + return items; + }; + URI.build = function(parts) { + var t = ""; + if (parts.protocol) { + t += parts.protocol + ":"; + } + if (!parts.urn && (t || parts.hostname)) { + t += '//'; + } + t += (URI.buildAuthority(parts) || ''); + if (typeof parts.path === "string") { + if (parts.path[0] !== '/' && typeof parts.hostname === "string") { + t += '/'; + } + t += parts.path; + } + if (typeof parts.query === "string" && parts.query) { + t += '?' + parts.query; + } + if (typeof parts.fragment === "string" && parts.fragment) { + t += '#' + parts.fragment; + } + return t; + }; + URI.buildHost = function(parts) { + var t = ""; + if (!parts.hostname) { + return ""; + } else if (URI.ip6_expression.test(parts.hostname)) { + if (parts.port) { + t += "[" + parts.hostname + "]:" + parts.port; + } else { + // don't know if we should always wrap IPv6 in [] + // the RFC explicitly says SHOULD, not MUST. + t += parts.hostname; + } + } else { + t += parts.hostname; + if (parts.port) { + t += ':' + parts.port; + } + } + return t; + }; + URI.buildAuthority = function(parts) { + return URI.buildUserinfo(parts) + URI.buildHost(parts); + }; + URI.buildUserinfo = function(parts) { + var t = ""; + if (parts.username) { + t += URI.encode(parts.username); + if (parts.password) { + t += ':' + URI.encode(parts.password); + } + t += "@"; + } + return t; + }; + URI.buildQuery = function(data, duplicates) { + // according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html + // being »-._~!$&'()*+,;=:@/?« %HEX and alnum are allowed + // the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax! + // URI.js treats the query string as being application/x-www-form-urlencoded + // see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type + var t = ""; + var unique, key, i, length; + for (key in data) { + if (hasOwn.call(data, key) && key) { + if (isArray(data[key])) { + unique = {}; + for (i = 0, length = data[key].length; i < length; i++) { + if (data[key][i] !== undefined && unique[data[key][i] + ""] === undefined) { + t += "&" + URI.buildQueryParameter(key, data[key][i]); + if (duplicates !== true) { + unique[data[key][i] + ""] = true; + } + } + } + } else if (data[key] !== undefined) { + t += '&' + URI.buildQueryParameter(key, data[key]); + } + } + } + return t.substring(1); + }; + URI.buildQueryParameter = function(name, value) { + // http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded + // don't append "=" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization + return URI.encodeQuery(name) + (value !== null ? "=" + URI.encodeQuery(value) : ""); + }; + URI.addQuery = function(data, name, value) { + if (typeof name === "object") { + for (var key in name) { + if (hasOwn.call(name, key)) { + URI.addQuery(data, key, name[key]); + } + } + } else if (typeof name === "string") { + if (data[name] === undefined) { + data[name] = value; + return; + } else if (typeof data[name] === "string") { + data[name] = [data[name]]; + } + if (!isArray(value)) { + value = [value]; + } + data[name] = data[name].concat(value); + } else { + throw new TypeError("URI.addQuery() accepts an object, string as the name parameter"); + } + }; + URI.removeQuery = function(data, name, value) { + var i, length, key; + if (isArray(name)) { + for (i = 0, length = name.length; i < length; i++) { + data[name[i]] = undefined; + } + } else if (typeof name === "object") { + for (key in name) { + if (hasOwn.call(name, key)) { + URI.removeQuery(data, key, name[key]); + } + } + } else if (typeof name === "string") { + if (value !== undefined) { + if (data[name] === value) { + data[name] = undefined; + } else if (isArray(data[name])) { + data[name] = filterArrayValues(data[name], value); + } + } else { + data[name] = undefined; + } + } else { + throw new TypeError("URI.addQuery() accepts an object, string as the first parameter"); + } + }; + URI.commonPath = function(one, two) { + var length = Math.min(one.length, two.length); + var pos; + // find first non-matching character + for (pos = 0; pos < length; pos++) { + if (one[pos] !== two[pos]) { + pos--; + break; + } + } + if (pos < 1) { + return one[0] === two[0] && one[0] === '/' ? '/' : ''; + } + // revert to last / + if (one[pos] !== '/') { + pos = one.substring(0, pos).lastIndexOf('/'); + } + return one.substring(0, pos + 1); + }; + URI.withinString = function(string, callback) { + // expression used is "gruber revised" (@gruber v2) determined to be the best solution in + // a regex sprint we did a couple of ages ago at + // * http://mathiasbynens.be/demo/url-regex + // * http://rodneyrehm.de/t/url-regex.html + return string.replace(URI.find_uri_expression, callback); + }; + URI.ensureValidHostname = function(v) { + // Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986) + // they are not part of DNS and therefore ignored by URI.js + if (v.match(URI.invalid_hostname_characters)) { + // test punycode + if (!punycode) { + throw new TypeError("Hostname '" + v + "' contains characters other than [A-Z0-9.-] and Punycode.js is not available"); + } + if (punycode.toASCII(v).match(URI.invalid_hostname_characters)) { + throw new TypeError("Hostname '" + v + "' contains characters other than [A-Z0-9.-]"); + } + } + }; + p.build = function(deferBuild) { + if (deferBuild === true) { + this._deferred_build = true; + } else if (deferBuild === undefined || this._deferred_build) { + this._string = URI.build(this._parts); + this._deferred_build = false; + } + return this; + }; + p.clone = function() { + return new URI(this); + }; + p.valueOf = p.toString = function() { + return this.build(false)._string; + }; + // generate simple accessors + _parts = { + protocol: 'protocol', + username: 'username', + password: 'password', + hostname: 'hostname', + port: 'port' + }; + generateAccessor = function(_part) { + return function(v, build) { + if (v === undefined) { + return this._parts[_part] || ""; + } else { + this._parts[_part] = v; + this.build(!build); + return this; + } + }; + }; + for (_part in _parts) { + p[_part] = generateAccessor(_parts[_part]); + } + // generate accessors with optionally prefixed input + _parts = { + query: '?', + fragment: '#' + }; + generateAccessor = function(_part, _key) { + return function(v, build) { + if (v === undefined) { + return this._parts[_part] || ""; + } else { + if (v !== null) { + v = v + ""; + if (v[0] === _key) { + v = v.substring(1); + } + } + this._parts[_part] = v; + this.build(!build); + return this; + } + }; + }; + for (_part in _parts) { + p[_part] = generateAccessor(_part, _parts[_part]); + } + // generate accessors with prefixed output + _parts = { + search: ['?', 'query'], + hash: ['#', 'fragment'] + }; + generateAccessor = function(_part, _key) { + return function(v, build) { + var t = this[_part](v, build); + return typeof t === "string" && t.length ? (_key + t) : t; + }; + }; + for (_part in _parts) { + p[_part] = generateAccessor(_parts[_part][1], _parts[_part][0]); + } + p.pathname = function(v, build) { + if (v === undefined || v === true) { + var res = this._parts.path || (this._parts.urn ? '' : '/'); + return v ? URI.decodePath(res) : res; + } else { + this._parts.path = v ? URI.recodePath(v) : "/"; + this.build(!build); + return this; + } + }; + p.path = p.pathname; + p.href = function(href, build) { + var key; + if (href === undefined) { + return this.toString(); + } + this._string = ""; + this._parts = URI._parts(); + var _URI = href instanceof URI; + var _object = typeof href === "object" && (href.hostname || href.path); + // window.location is reported to be an object, but it's not the sort + // of object we're looking for: + // * location.protocol ends with a colon + // * location.query != object.search + // * location.hash != object.fragment + // simply serializing the unknown object should do the trick + // (for location, not for everything...) + if (!_URI && _object && Object.prototype.toString.call(href) !== "[object Object]") { + href = href.toString(); + } + if (typeof href === "string") { + this._parts = URI.parse(href, this._parts); + } else if (_URI || _object) { + var src = _URI ? href._parts : href; + for (key in src) { + if (hasOwn.call(this._parts, key)) { + this._parts[key] = src[key]; + } + } + } else { + throw new TypeError("invalid input"); + } + this.build(!build); + return this; + }; + // identification accessors + p.is = function(what) { + var ip = false; + var ip4 = false; + var ip6 = false; + var name = false; + var sld = false; + var idn = false; + var punycode = false; + var relative = !this._parts.urn; + if (this._parts.hostname) { + relative = false; + ip4 = URI.ip4_expression.test(this._parts.hostname); + ip6 = URI.ip6_expression.test(this._parts.hostname); + ip = ip4 || ip6; + name = !ip; + sld = name && SLD && SLD.has(this._parts.hostname); + idn = name && URI.idn_expression.test(this._parts.hostname); + punycode = name && URI.punycode_expression.test(this._parts.hostname); + } + switch (what.toLowerCase()) { + case 'relative': + return relative; + case 'absolute': + return !relative; + // hostname identification + case 'domain': + case 'name': + return name; + case 'sld': + return sld; + case 'ip': + return ip; + case 'ip4': + case 'ipv4': + case 'inet4': + return ip4; + case 'ip6': + case 'ipv6': + case 'inet6': + return ip6; + case 'idn': + return idn; + case 'url': + return !this._parts.urn; + case 'urn': + return !!this._parts.urn; + case 'punycode': + return punycode; + } + return null; + }; + // component specific input validation + var _protocol = p.protocol; + var _port = p.port; + var _hostname = p.hostname; + p.protocol = function(v, build) { + if (v !== undefined) { + if (v) { + // accept trailing :// + v = v.replace(/:(\/\/)?$/, ''); + if (v.match(/[^a-zA-z0-9\.+-]/)) { + throw new TypeError("Protocol '" + v + "' contains characters other than [A-Z0-9.+-]"); + } + } + } + return _protocol.call(this, v, build); + }; + p.scheme = p.protocol; + p.port = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + if (v !== undefined) { + if (v === 0) { + v = null; + } + if (v) { + v += ""; + if (v[0] === ":") { + v = v.substring(1); + } + if (v.match(/[^0-9]/)) { + throw new TypeError("Port '" + v + "' contains characters other than [0-9]"); + } + } + } + return _port.call(this, v, build); + }; + p.hostname = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + if (v !== undefined) { + var x = {}; + URI.parseHost(v, x); + v = x.hostname; + } + return _hostname.call(this, v, build); + }; + // compound accessors + p.host = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + if (v === undefined) { + return this._parts.hostname ? URI.buildHost(this._parts) : ""; + } else { + URI.parseHost(v, this._parts); + this.build(!build); + return this; + } + }; + p.authority = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + if (v === undefined) { + return this._parts.hostname ? URI.buildAuthority(this._parts) : ""; + } else { + URI.parseAuthority(v, this._parts); + this.build(!build); + return this; + } + }; + p.userinfo = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + if (v === undefined) { + if (!this._parts.username) { + return ""; + } + var t = URI.buildUserinfo(this._parts); + return t.substring(0, t.length - 1); + } else { + if (v[v.length - 1] !== '@') { + v += '@'; + } + URI.parseUserinfo(v, this._parts); + this.build(!build); + return this; + } + }; + p.resource = function(v, build) { + var parts; + if (v === undefined) { + return this.path() + this.search() + this.hash(); + } + parts = URI.parse(v); + this._parts.path = parts.path; + this._parts.query = parts.query; + this._parts.fragment = parts.fragment; + this.build(!build); + return this; + }; + // fraction accessors + p.subdomain = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + // convenience, return "www" from "www.example.org" + if (v === undefined) { + if (!this._parts.hostname || this.is('IP')) { + return ""; + } + // grab domain and add another segment + var end = this._parts.hostname.length - this.domain().length - 1; + return this._parts.hostname.substring(0, end) || ""; + } else { + var e = this._parts.hostname.length - this.domain().length; + var sub = this._parts.hostname.substring(0, e); + var replace = new RegExp('^' + escapeRegEx(sub)); + if (v && v[v.length - 1] !== '.') { + v += "."; + } + if (v) { + URI.ensureValidHostname(v); + } + this._parts.hostname = this._parts.hostname.replace(replace, v); + this.build(!build); + return this; + } + }; + p.domain = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + if (typeof v === 'boolean') { + build = v; + v = undefined; + } + // convenience, return "example.org" from "www.example.org" + if (v === undefined) { + if (!this._parts.hostname || this.is('IP')) { + return ""; + } + // if hostname consists of 1 or 2 segments, it must be the domain + var t = this._parts.hostname.match(/\./g); + if (t && t.length < 2) { + return this._parts.hostname; + } + // grab tld and add another segment + var end = this._parts.hostname.length - this.tld(build).length - 1; + end = this._parts.hostname.lastIndexOf('.', end - 1) + 1; + return this._parts.hostname.substring(end) || ""; + } else { + if (!v) { + throw new TypeError("cannot set domain empty"); + } + URI.ensureValidHostname(v); + if (!this._parts.hostname || this.is('IP')) { + this._parts.hostname = v; + } else { + var replace = new RegExp(escapeRegEx(this.domain()) + "$"); + this._parts.hostname = this._parts.hostname.replace(replace, v); + } + this.build(!build); + return this; + } + }; + p.tld = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + if (typeof v === 'boolean') { + build = v; + v = undefined; + } + // return "org" from "www.example.org" + if (v === undefined) { + if (!this._parts.hostname || this.is('IP')) { + return ""; + } + var pos = this._parts.hostname.lastIndexOf('.'); + var tld = this._parts.hostname.substring(pos + 1); + if (build !== true && SLD && SLD.list[tld.toLowerCase()]) { + return SLD.get(this._parts.hostname) || tld; + } + return tld; + } else { + var replace; + if (!v) { + throw new TypeError("cannot set TLD empty"); + } else if (v.match(/[^a-zA-Z0-9-]/)) { + if (SLD && SLD.is(v)) { + replace = new RegExp(escapeRegEx(this.tld()) + "$"); + this._parts.hostname = this._parts.hostname.replace(replace, v); + } else { + throw new TypeError("TLD '" + v + "' contains characters other than [A-Z0-9]"); + } + } else if (!this._parts.hostname || this.is('IP')) { + throw new ReferenceError("cannot set TLD on non-domain host"); + } else { + replace = new RegExp(escapeRegEx(this.tld()) + "$"); + this._parts.hostname = this._parts.hostname.replace(replace, v); + } + this.build(!build); + return this; + } + }; + p.directory = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + if (v === undefined || v === true) { + if (!this._parts.path && !this._parts.hostname) { + return ''; + } + if (this._parts.path === '/') { + return '/'; + } + var end = this._parts.path.length - this.filename().length - 1; + var res = this._parts.path.substring(0, end) || (this._parts.hostname ? "/" : ""); + return v ? URI.decodePath(res) : res; + } else { + var e = this._parts.path.length - this.filename().length; + var directory = this._parts.path.substring(0, e); + var replace = new RegExp('^' + escapeRegEx(directory)); + // fully qualifier directories begin with a slash + if (!this.is('relative')) { + if (!v) { + v = '/'; + } + if (v[0] !== '/') { + v = "/" + v; + } + } + // directories always end with a slash + if (v && v[v.length - 1] !== '/') { + v += '/'; + } + v = URI.recodePath(v); + this._parts.path = this._parts.path.replace(replace, v); + this.build(!build); + return this; + } + }; + p.filename = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + if (v === undefined || v === true) { + if (!this._parts.path || this._parts.path === '/') { + return ""; + } + var pos = this._parts.path.lastIndexOf('/'); + var res = this._parts.path.substring(pos + 1); + return v ? URI.decodePathSegment(res) : res; + } else { + var mutatedDirectory = false; + if (v[0] === '/') { + v = v.substring(1); + } + if (v.match(/\.?\//)) { + mutatedDirectory = true; + } + var replace = new RegExp(escapeRegEx(this.filename()) + "$"); + v = URI.recodePath(v); + this._parts.path = this._parts.path.replace(replace, v); + if (mutatedDirectory) { + this.normalizePath(build); + } else { + this.build(!build); + } + return this; + } + }; + p.suffix = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + if (v === undefined || v === true) { + if (!this._parts.path || this._parts.path === '/') { + return ""; + } + var filename = this.filename(); + var pos = filename.lastIndexOf('.'); + var s, res; + if (pos === -1) { + return ""; + } + // suffix may only contain alnum characters (yup, I made this up.) + s = filename.substring(pos + 1); + res = (/^[a-z0-9%]+$/i).test(s) ? s : ""; + return v ? URI.decodePathSegment(res) : res; + } else { + if (v[0] === '.') { + v = v.substring(1); + } + var suffix = this.suffix(); + var replace; + if (!suffix) { + if (!v) { + return this; + } + this._parts.path += '.' + URI.recodePath(v); + } else if (!v) { + replace = new RegExp(escapeRegEx("." + suffix) + "$"); + } else { + replace = new RegExp(escapeRegEx(suffix) + "$"); + } + if (replace) { + v = URI.recodePath(v); + this._parts.path = this._parts.path.replace(replace, v); + } + this.build(!build); + return this; + } + }; + p.segment = function(segment, v, build) { + var separator = this._parts.urn ? ':' : '/'; + var path = this.path(); + var absolute = path.substring(0, 1) === '/'; + var segments = path.split(separator); + if (typeof segment !== 'number') { + build = v; + v = segment; + segment = undefined; + } + if (segment !== undefined && typeof segment !== 'number') { + throw new Error("Bad segment '" + segment + "', must be 0-based integer"); + } + if (absolute) { + segments.shift(); + } + if (segment < 0) { + // allow negative indexes to address from the end + segment = Math.max(segments.length + segment, 0); + } + if (v === undefined) { + return segment === undefined ? segments : segments[segment]; + } else if (segment === null || segments[segment] === undefined) { + if (isArray(v)) { + segments = v; + } else if (v || (typeof v === "string" && v.length)) { + if (segments[segments.length - 1] === "") { + // empty trailing elements have to be overwritten + // to prefent results such as /foo//bar + segments[segments.length - 1] = v; + } else { + segments.push(v); + } + } + } else { + if (v || (typeof v === "string" && v.length)) { + segments[segment] = v; + } else { + segments.splice(segment, 1); + } + } + if (absolute) { + segments.unshift(""); + } + return this.path(segments.join(separator), build); + }; + // mutating query string + var q = p.query; + p.query = function(v, build) { + if (v === true) { + return URI.parseQuery(this._parts.query); + } else if (v !== undefined && typeof v !== "string") { + this._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters); + this.build(!build); + return this; + } else { + return q.call(this, v, build); + } + }; + p.addQuery = function(name, value, build) { + var data = URI.parseQuery(this._parts.query); + URI.addQuery(data, name, value === undefined ? null : value); + this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters); + if (typeof name !== "string") { + build = value; + } + this.build(!build); + return this; + }; + p.removeQuery = function(name, value, build) { + var data = URI.parseQuery(this._parts.query); + URI.removeQuery(data, name, value); + this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters); + if (typeof name !== "string") { + build = value; + } + this.build(!build); + return this; + }; + p.addSearch = p.addQuery; + p.removeSearch = p.removeQuery; + // sanitizing URLs + p.normalize = function() { + if (this._parts.urn) { + return this.normalizeProtocol(false).normalizeQuery(false).normalizeFragment(false).build(); + } + return this.normalizeProtocol(false).normalizeHostname(false).normalizePort(false).normalizePath(false).normalizeQuery(false).normalizeFragment(false).build(); + }; + p.normalizeProtocol = function(build) { + if (typeof this._parts.protocol === "string") { + this._parts.protocol = this._parts.protocol.toLowerCase(); + this.build(!build); + } + return this; + }; + p.normalizeHostname = function(build) { + if (this._parts.hostname) { + if (this.is('IDN') && punycode) { + this._parts.hostname = punycode.toASCII(this._parts.hostname); + } else if (this.is('IPv6') && IPv6) { + this._parts.hostname = IPv6.best(this._parts.hostname); + } + this._parts.hostname = this._parts.hostname.toLowerCase(); + this.build(!build); + } + return this; + }; + p.normalizePort = function(build) { + // remove port of it's the protocol's default + if (typeof this._parts.protocol === "string" && this._parts.port === URI.defaultPorts[this._parts.protocol]) { + this._parts.port = null; + this.build(!build); + } + return this; + }; + p.normalizePath = function(build) { + if (this._parts.urn) { + return this; + } + if (!this._parts.path || this._parts.path === '/') { + return this; + } + var _was_relative; + var _was_relative_prefix; + var _path = this._parts.path; + var _parent, _pos; + // handle relative paths + if (_path[0] !== '/') { + if (_path[0] === '.') { + _was_relative_prefix = _path.substring(0, _path.indexOf('/')); + } + _was_relative = true; + _path = '/' + _path; + } + // resolve simples + _path = _path.replace(/(\/(\.\/)+)|\/{2,}/g, '/'); + // resolve parents + while (true) { + _parent = _path.indexOf('/../'); + if (_parent === -1) { + // no more ../ to resolve + break; + } else if (_parent === 0) { + // top level cannot be relative... + _path = _path.substring(3); + break; + } + _pos = _path.substring(0, _parent).lastIndexOf('/'); + if (_pos === -1) { + _pos = _parent; + } + _path = _path.substring(0, _pos) + _path.substring(_parent + 3); + } + // revert to relative + if (_was_relative && this.is('relative')) { + if (_was_relative_prefix) { + _path = _was_relative_prefix + _path; + } else { + _path = _path.substring(1); + } + } + _path = URI.recodePath(_path); + this._parts.path = _path; + this.build(!build); + return this; + }; + p.normalizePathname = p.normalizePath; + p.normalizeQuery = function(build) { + if (typeof this._parts.query === "string") { + if (!this._parts.query.length) { + this._parts.query = null; + } else { + this.query(URI.parseQuery(this._parts.query)); + } + this.build(!build); + } + return this; + }; + p.normalizeFragment = function(build) { + if (!this._parts.fragment) { + this._parts.fragment = null; + this.build(!build); + } + return this; + }; + p.normalizeSearch = p.normalizeQuery; + p.normalizeHash = p.normalizeFragment; + p.iso8859 = function() { + // expect unicode input, iso8859 output + var e = URI.encode; + var d = URI.decode; + URI.encode = escape; + URI.decode = decodeURIComponent; + this.normalize(); + URI.encode = e; + URI.decode = d; + return this; + }; + p.unicode = function() { + // expect iso8859 input, unicode output + var e = URI.encode; + var d = URI.decode; + URI.encode = strictEncodeURIComponent; + URI.decode = unescape; + this.normalize(); + URI.encode = e; + URI.decode = d; + return this; + }; + p.readable = function() { + var uri = this.clone(); + // removing username, password, because they shouldn't be displayed according to RFC 3986 + uri.username("").password("").normalize(); + var t = ''; + if (uri._parts.protocol) { + t += uri._parts.protocol + '://'; + } + if (uri._parts.hostname) { + if (uri.is('punycode') && punycode) { + t += punycode.toUnicode(uri._parts.hostname); + if (uri._parts.port) { + t += ":" + uri._parts.port; + } + } else { + t += uri.host(); + } + } + if (uri._parts.hostname && uri._parts.path && uri._parts.path[0] !== '/') { + t += '/'; + } + t += uri.path(true); + if (uri._parts.query) { + var q = ''; + for (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) { + var kv = (qp[i] || "").split('='); + q += '&' + URI.decodeQuery(kv[0]).replace(/&/g, '%26'); + if (kv[1] !== undefined) { + q += "=" + URI.decodeQuery(kv[1]).replace(/&/g, '%26'); + } + } + t += '?' + q.substring(1); + } + t += uri.hash(); + return t; + }; + // resolving relative and absolute URLs + p.absoluteTo = function(base) { + var resolved = this.clone(); + var properties = ['protocol', 'username', 'password', 'hostname', 'port']; + var basedir, i, p; + if (this._parts.urn) { + throw new Error('URNs do not have any generally defined hierachical components'); + } + if (this._parts.hostname) { + return resolved; + } + if (!(base instanceof URI)) { + base = new URI(base); + } + for (i = 0, p; p = properties[i]; i++) { + resolved._parts[p] = base._parts[p]; + } + properties = ['query', 'path']; + for (i = 0, p; p = properties[i]; i++) { + if (!resolved._parts[p] && base._parts[p]) { + resolved._parts[p] = base._parts[p]; + } + } + if (resolved.path()[0] !== '/') { + basedir = base.directory(); + resolved._parts.path = (basedir ? (basedir + '/') : '') + resolved._parts.path; + resolved.normalizePath(); + } + resolved.build(); + return resolved; + }; + p.relativeTo = function(base) { + var relative = this.clone(); + var properties = ['protocol', 'username', 'password', 'hostname', 'port']; + var common, _base, _this, _base_diff, _this_diff; + if (this._parts.urn) { + throw new Error('URNs do not have any generally defined hierachical components'); + } + if (!(base instanceof URI)) { + base = new URI(base); + } + if (this.path()[0] !== '/' || base.path()[0] !== '/') { + throw new Error('Cannot calculate common path from non-relative URLs'); + } + // determine common sub path + common = URI.commonPath(relative.path(), base.path()); + // no relation if there's nothing in common + if (!common || common === '/') { + return relative; + } + // relative paths don't have authority + for (var i = 0, p; p = properties[i]; i++) { + relative._parts[p] = null; + } + _base = base.directory(); + _this = this.directory(); + // base and this are on the same level + if (_base === _this) { + relative._parts.path = './' + relative.filename(); + return relative.build(); + } + _base_diff = _base.substring(common.length); + _this_diff = _this.substring(common.length); + // this is a descendant of base + if (_base + '/' === common) { + if (_this_diff) { + _this_diff += '/'; + } + relative._parts.path = './' + _this_diff + relative.filename(); + return relative.build(); + } + // this is a descendant of base + var parents = '../'; + var _common = new RegExp('^' + escapeRegEx(common)); + var _parents = _base.replace(_common, '/').match(/\//g).length - 1; + while (_parents--) { + parents += '../'; + } + relative._parts.path = relative._parts.path.replace(_common, parents); + return relative.build(); + }; + // comparing URIs + p.equals = function(uri) { + var one = this.clone(); + var two = new URI(uri); + var one_map = {}; + var two_map = {}; + var checked = {}; + var one_query, two_query, key; + one.normalize(); + two.normalize(); + // exact match + if (one.toString() === two.toString()) { + return true; + } + // extract query string + one_query = one.query(); + two_query = two.query(); + one.query(""); + two.query(""); + // definitely not equal if not even non-query parts match + if (one.toString() !== two.toString()) { + return false; + } + // query parameters have the same length, even if they're permutated + if (one_query.length !== two_query.length) { + return false; + } + one_map = URI.parseQuery(one_query); + two_map = URI.parseQuery(two_query); + for (key in one_map) { + if (hasOwn.call(one_map, key)) { + if (!isArray(one_map[key])) { + if (one_map[key] !== two_map[key]) { + return false; + } + } else { + if (!isArray(two_map[key])) { + return false; + } + // arrays can't be equal if they have different amount of content + if (one_map[key].length !== two_map[key].length) { + return false; + } + one_map[key].sort(); + two_map[key].sort(); + for (var i = 0, l = one_map[key].length; i < l; i++) { + if (one_map[key][i] !== two_map[key][i]) { + return false; + } + } + } + checked[key] = true; + } + } + for (key in two_map) { + if (hasOwn.call(two_map, key)) { + if (!checked[key]) { + // two contains a parameter not present in one + return false; + } + } + } + return true; + }; + // state + p.duplicateQueryParameters = function(v) { + this._parts.duplicateQueryParameters = !! v; + return this; + }; + return URI; +})); \ No newline at end of file diff --git a/doc/scripts/bootstrap-dropdown.js b/doc/scripts/bootstrap-dropdown.js new file mode 100644 index 00000000..1e8a2a13 --- /dev/null +++ b/doc/scripts/bootstrap-dropdown.js @@ -0,0 +1,165 @@ +/* ============================================================ + * bootstrap-dropdown.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + $parent.toggleClass('open') + } + + $this.focus() + + return false + } + + , keydown: function (e) { + var $this + , $items + , $active + , $parent + , isActive + , index + + if (!/(38|40|27)/.test(e.keyCode)) return + + $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + if (!isActive || (isActive && e.keyCode == 27)) { + if (e.which == 27) $parent.find(toggle).focus() + return $this.click() + } + + $items = $('[role=menu] li:not(.divider):visible a', $parent) + + if (!$items.length) return + + index = $items.index($items.filter(':focus')) + + if (e.keyCode == 38 && index > 0) index-- // up + if (e.keyCode == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items + .eq(index) + .focus() + } + + } + + function clearMenus() { + $(toggle).each(function () { + getParent($(this)).removeClass('open') + }) + } + + function getParent($this) { + var selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = selector && $(selector) + + if (!$parent || !$parent.length) $parent = $this.parent() + + return $parent + } + + + /* DROPDOWN PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.dropdown + + $.fn.dropdown = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('dropdown') + if (!data) $this.data('dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.dropdown.Constructor = Dropdown + + + /* DROPDOWN NO CONFLICT + * ==================== */ + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + /* APPLY TO STANDARD DROPDOWN ELEMENTS + * =================================== */ + + $(document) + .on('click.dropdown.data-api', clearMenus) + .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.dropdown-menu', function (e) { e.stopPropagation() }) + .on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle) + .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) + +}(window.jQuery); diff --git a/doc/scripts/bootstrap-tab.js b/doc/scripts/bootstrap-tab.js new file mode 100644 index 00000000..26c976b7 --- /dev/null +++ b/doc/scripts/bootstrap-tab.js @@ -0,0 +1,144 @@ +/* ======================================================== + * bootstrap-tab.js v2.3.0 + * http://twitter.github.com/bootstrap/javascript.html#tabs + * ======================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* TAB CLASS DEFINITION + * ==================== */ + + var Tab = function (element) { + this.element = $(element) + } + + Tab.prototype = { + + constructor: Tab + + , show: function () { + var $this = this.element + , $ul = $this.closest('ul:not(.dropdown-menu)') + , selector = $this.attr('data-target') + , previous + , $target + , e + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + if ( $this.parent('li').hasClass('active') ) return + + previous = $ul.find('.active:last a')[0] + + e = $.Event('show', { + relatedTarget: previous + }) + + $this.trigger(e) + + if (e.isDefaultPrevented()) return + + $target = $(selector) + + this.activate($this.parent('li'), $ul) + this.activate($target, $target.parent(), function () { + $this.trigger({ + type: 'shown' + , relatedTarget: previous + }) + }) + } + + , activate: function ( element, container, callback) { + var $active = container.find('> .active') + , transition = callback + && $.support.transition + && $active.hasClass('fade') + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + + element.addClass('active') + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if ( element.parent('.dropdown-menu') ) { + element.closest('li.dropdown').addClass('active') + } + + callback && callback() + } + + transition ? + $active.one($.support.transition.end, next) : + next() + + $active.removeClass('in') + } + } + + + /* TAB PLUGIN DEFINITION + * ===================== */ + + var old = $.fn.tab + + $.fn.tab = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('tab') + if (!data) $this.data('tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.tab.Constructor = Tab + + + /* TAB NO CONFLICT + * =============== */ + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + /* TAB DATA-API + * ============ */ + + $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { + e.preventDefault() + $(this).tab('show') + }) + +}(window.jQuery); \ No newline at end of file diff --git a/doc/scripts/jquery.localScroll.js b/doc/scripts/jquery.localScroll.js new file mode 100644 index 00000000..afdcbfbc --- /dev/null +++ b/doc/scripts/jquery.localScroll.js @@ -0,0 +1,130 @@ +/*! + * jQuery.LocalScroll + * Copyright (c) 2007-2013 Ariel Flesler - afleslergmailcom | http://flesler.blogspot.com + * Dual licensed under MIT and GPL. + * http://flesler.blogspot.com/2007/10/jquerylocalscroll-10.html + * @author Ariel Flesler + * @version 1.2.8 + * + * @id jQuery.fn.localScroll + * @param {Object} settings Hash of settings, it is passed in to jQuery.ScrollTo, none is required. + * @return {jQuery} Returns the same jQuery object, for chaining. + * + * @example $('ul.links').localScroll(); + * + * @example $('ul.links').localScroll({ filter:'.animated', duration:400, axis:'x' }); + * + * @example $.localScroll({ target:'#pane', axis:'xy', queue:true, event:'mouseover' }); + * + * Notes: + * - The plugin requires jQuery.ScrollTo. + * - The hash of settings, is passed to jQuery.ScrollTo, so the settings are valid for that plugin as well. + * - jQuery.localScroll can be used if the desired links, are all over the document, it accepts the same settings. + * - If the setting 'lazy' is set to true, then the binding will still work for later added anchors. + * - If onBefore returns false, the event is ignored. + */ +;(function( $ ){ + var URI = location.href.replace(/#.*/,''); // local url without hash + + var $localScroll = $.localScroll = function( settings ){ + $('body').localScroll( settings ); + }; + + // Many of these defaults, belong to jQuery.ScrollTo, check it's demo for an example of each option. + // @see http://flesler.demos.com/jquery/scrollTo/ + // The defaults are public and can be overriden. + $localScroll.defaults = { + duration:1000, // How long to animate. + axis:'y', // Which of top and left should be modified. + event:'click', // On which event to react. + stop:true, // Avoid queuing animations + target: window, // What to scroll (selector or element). The whole window by default. + reset: true // Used by $.localScroll.hash. If true, elements' scroll is resetted before actual scrolling + /* + lock:false, // ignore events if already animating + lazy:false, // if true, links can be added later, and will still work. + filter:null, // filter some anchors out of the matched elements. + hash: false // if true, the hash of the selected link, will appear on the address bar. + */ + }; + + // If the URL contains a hash, it will scroll to the pointed element + $localScroll.hash = function( settings ){ + if( location.hash ){ + settings = $.extend( {}, $localScroll.defaults, settings ); + settings.hash = false; // can't be true + + if( settings.reset ){ + var d = settings.duration; + delete settings.duration; + $(settings.target).scrollTo( 0, settings ); + settings.duration = d; + } + scroll( 0, location, settings ); + } + }; + + $.fn.localScroll = function( settings ){ + settings = $.extend( {}, $localScroll.defaults, settings ); + + return settings.lazy ? + // use event delegation, more links can be added later. + this.bind( settings.event, function( e ){ + // Could use closest(), but that would leave out jQuery -1.3.x + var a = $([e.target, e.target.parentNode]).filter(filter)[0]; + // if a valid link was clicked + if( a ) + scroll( e, a, settings ); // do scroll. + }) : + // bind concretely, to each matching link + this.find('a,area') + .filter( filter ).bind( settings.event, function(e){ + scroll( e, this, settings ); + }).end() + .end(); + + function filter(){// is this a link that points to an anchor and passes a possible filter ? href is checked to avoid a bug in FF. + return !!this.href && !!this.hash && this.href.replace(this.hash,'') == URI && (!settings.filter || $(this).is( settings.filter )); + }; + }; + + function scroll( e, link, settings ){ + var id = link.hash.slice(1), + elem = document.getElementById(id) || document.getElementsByName(id)[0]; + + if ( !elem ) + return; + + if( e ) + e.preventDefault(); + + var $target = $( settings.target ); + + if( settings.lock && $target.is(':animated') || + settings.onBefore && settings.onBefore(e, elem, $target) === false ) + return; + + if( settings.stop ) + $target._scrollable().stop(true); // remove all its animations + + if( settings.hash ){ + var attr = elem.id == id ? 'id' : 'name', + $a = $(' ').attr(attr, id).css({ + position:'absolute', + top: $(window).scrollTop(), + left: $(window).scrollLeft() + }); + + elem[attr] = ''; + $('body').prepend($a); + location = link.hash; + $a.remove(); + elem[attr] = id; + } + + $target + .scrollTo( elem, settings ) // do scroll + .trigger('notify.serialScroll',[elem]); // notify serialScroll about this change + }; + +})( jQuery ); \ No newline at end of file diff --git a/doc/scripts/jquery.min.js b/doc/scripts/jquery.min.js new file mode 100644 index 00000000..335c4773 --- /dev/null +++ b/doc/scripts/jquery.min.js @@ -0,0 +1,3522 @@ +/*! jQuery v1.8.3 jquery.com | jquery.org/license */ +(function(e, t) { + function _(e) { + var t = M[e] = {}; + return v.each(e.split(y), function(e, n) { + t[n] = !0 + }), t + } + + function H(e, n, r) { + if (r === t && e.nodeType === 1) { + var i = "data-" + n.replace(P, "-$1").toLowerCase(); + r = e.getAttribute(i); + if (typeof r == "string") { + try { + r = r === "true" ? !0 : r === "false" ? !1 : r === "null" ? null : +r + "" === r ? +r : D.test(r) ? v.parseJSON(r) : r + } catch (s) {} + v.data(e, n, r) + } else r = t + } + return r + } + + function B(e) { + var t; + for (t in e) { + if (t === "data" && v.isEmptyObject(e[t])) continue; + if (t !== "toJSON") return !1 + } + return !0 + } + + function et() { + return !1 + } + + function tt() { + return !0 + } + + function ut(e) { + return !e || !e.parentNode || e.parentNode.nodeType === 11 + } + + function at(e, t) { + do e = e[t]; + while (e && e.nodeType !== 1); + return e + } + + function ft(e, t, n) { + t = t || 0; + if (v.isFunction(t)) return v.grep(e, function(e, r) { + var i = !! t.call(e, r, e); + return i === n + }); + if (t.nodeType) return v.grep(e, function(e, r) { + return e === t === n + }); + if (typeof t == "string") { + var r = v.grep(e, function(e) { + return e.nodeType === 1 + }); + if (it.test(t)) return v.filter(t, r, !n); + t = v.filter(t, r) + } + return v.grep(e, function(e, r) { + return v.inArray(e, t) >= 0 === n + }) + } + + function lt(e) { + var t = ct.split("|"), + n = e.createDocumentFragment(); + if (n.createElement) while (t.length) n.createElement(t.pop()); + return n + } + + function Lt(e, t) { + return e.getElementsByTagName(t)[0] || e.appendChild(e.ownerDocument.createElement(t)) + } + + function At(e, t) { + if (t.nodeType !== 1 || !v.hasData(e)) return; + var n, r, i, s = v._data(e), + o = v._data(t, s), + u = s.events; + if (u) { + delete o.handle, o.events = {}; + for (n in u) for (r = 0, i = u[n].length; r < i; r++) v.event.add(t, n, u[n][r]) + } + o.data && (o.data = v.extend({}, o.data)) + } + + function Ot(e, t) { + var n; + if (t.nodeType !== 1) return; + t.clearAttributes && t.clearAttributes(), t.mergeAttributes && t.mergeAttributes(e), n = t.nodeName.toLowerCase(), n === "object" ? (t.parentNode && (t.outerHTML = e.outerHTML), v.support.html5Clone && e.innerHTML && !v.trim(t.innerHTML) && (t.innerHTML = e.innerHTML)) : n === "input" && Et.test(e.type) ? (t.defaultChecked = t.checked = e.checked, t.value !== e.value && (t.value = e.value)) : n === "option" ? t.selected = e.defaultSelected : n === "input" || n === "textarea" ? t.defaultValue = e.defaultValue : n === "script" && t.text !== e.text && (t.text = e.text), t.removeAttribute(v.expando) + } + + function Mt(e) { + return typeof e.getElementsByTagName != "undefined" ? e.getElementsByTagName("*") : typeof e.querySelectorAll != "undefined" ? e.querySelectorAll("*") : [] + } + + function _t(e) { + Et.test(e.type) && (e.defaultChecked = e.checked) + } + + function Qt(e, t) { + if (t in e) return t; + var n = t.charAt(0).toUpperCase() + t.slice(1), + r = t, + i = Jt.length; + while (i--) { + t = Jt[i] + n; + if (t in e) return t + } + return r + } + + function Gt(e, t) { + return e = t || e, v.css(e, "display") === "none" || !v.contains(e.ownerDocument, e) + } + + function Yt(e, t) { + var n, r, i = [], + s = 0, + o = e.length; + for (; s < o; s++) { + n = e[s]; + if (!n.style) continue; + i[s] = v._data(n, "olddisplay"), t ? (!i[s] && n.style.display === "none" && (n.style.display = ""), n.style.display === "" && Gt(n) && (i[s] = v._data(n, "olddisplay", nn(n.nodeName)))) : (r = Dt(n, "display"), !i[s] && r !== "none" && v._data(n, "olddisplay", r)) + } + for (s = 0; s < o; s++) { + n = e[s]; + if (!n.style) continue; + if (!t || n.style.display === "none" || n.style.display === "") n.style.display = t ? i[s] || "" : "none" + } + return e + } + + function Zt(e, t, n) { + var r = Rt.exec(t); + return r ? Math.max(0, r[1] - (n || 0)) + (r[2] || "px") : t + } + + function en(e, t, n, r) { + var i = n === (r ? "border" : "content") ? 4 : t === "width" ? 1 : 0, + s = 0; + for (; i < 4; i += 2) n === "margin" && (s += v.css(e, n + $t[i], !0)), r ? (n === "content" && (s -= parseFloat(Dt(e, "padding" + $t[i])) || 0), n !== "margin" && (s -= parseFloat(Dt(e, "border" + $t[i] + "Width")) || 0)) : (s += parseFloat(Dt(e, "padding" + $t[i])) || 0, n !== "padding" && (s += parseFloat(Dt(e, "border" + $t[i] + "Width")) || 0)); + return s + } + + function tn(e, t, n) { + var r = t === "width" ? e.offsetWidth : e.offsetHeight, + i = !0, + s = v.support.boxSizing && v.css(e, "boxSizing") === "border-box"; + if (r <= 0 || r == null) { + r = Dt(e, t); + if (r < 0 || r == null) r = e.style[t]; + if (Ut.test(r)) return r; + i = s && (v.support.boxSizingReliable || r === e.style[t]), r = parseFloat(r) || 0 + } + return r + en(e, t, n || (s ? "border" : "content"), i) + "px" + } + + function nn(e) { + if (Wt[e]) return Wt[e]; + var t = v("<" + e + ">").appendTo(i.body), + n = t.css("display"); + t.remove(); + if (n === "none" || n === "") { + Pt = i.body.appendChild(Pt || v.extend(i.createElement("iframe"), { + frameBorder: 0, + width: 0, + height: 0 + })); + if (!Ht || !Pt.createElement) Ht = (Pt.contentWindow || Pt.contentDocument).document, Ht.write(""), Ht.close(); + t = Ht.body.appendChild(Ht.createElement(e)), n = Dt(t, "display"), i.body.removeChild(Pt) + } + return Wt[e] = n, n + } + + function fn(e, t, n, r) { + var i; + if (v.isArray(t)) v.each(t, function(t, i) { + n || sn.test(e) ? r(e, i) : fn(e + "[" + (typeof i == "object" ? t : "") + "]", i, n, r) + }); + else if (!n && v.type(t) === "object") for (i in t) fn(e + "[" + i + "]", t[i], n, r); + else r(e, t) + } + + function Cn(e) { + return function(t, n) { + typeof t != "string" && (n = t, t = "*"); + var r, i, s, o = t.toLowerCase().split(y), + u = 0, + a = o.length; + if (v.isFunction(n)) for (; u < a; u++) r = o[u], s = /^\+/.test(r), s && (r = r.substr(1) || "*"), i = e[r] = e[r] || [], i[s ? "unshift" : "push"](n) + } + } + + function kn(e, n, r, i, s, o) { + s = s || n.dataTypes[0], o = o || {}, o[s] = !0; + var u, a = e[s], + f = 0, + l = a ? a.length : 0, + c = e === Sn; + for (; f < l && (c || !u); f++) u = a[f](n, r, i), typeof u == "string" && (!c || o[u] ? u = t : (n.dataTypes.unshift(u), u = kn(e, n, r, i, u, o))); + return (c || !u) && !o["*"] && (u = kn(e, n, r, i, "*", o)), u + } + + function Ln(e, n) { + var r, i, s = v.ajaxSettings.flatOptions || {}; + for (r in n) n[r] !== t && ((s[r] ? e : i || (i = {}))[r] = n[r]); + i && v.extend(!0, e, i) + } + + function An(e, n, r) { + var i, s, o, u, a = e.contents, + f = e.dataTypes, + l = e.responseFields; + for (s in l) s in r && (n[l[s]] = r[s]); + while (f[0] === "*") f.shift(), i === t && (i = e.mimeType || n.getResponseHeader("content-type")); + if (i) for (s in a) if (a[s] && a[s].test(i)) { + f.unshift(s); + break + } + if (f[0] in r) o = f[0]; + else { + for (s in r) { + if (!f[0] || e.converters[s + " " + f[0]]) { + o = s; + break + } + u || (u = s) + } + o = o || u + } + if (o) return o !== f[0] && f.unshift(o), r[o] + } + + function On(e, t) { + var n, r, i, s, o = e.dataTypes.slice(), + u = o[0], + a = {}, + f = 0; + e.dataFilter && (t = e.dataFilter(t, e.dataType)); + if (o[1]) for (n in e.converters) a[n.toLowerCase()] = e.converters[n]; + for (; i = o[++f];) if (i !== "*") { + if (u !== "*" && u !== i) { + n = a[u + " " + i] || a["* " + i]; + if (!n) for (r in a) { + s = r.split(" "); + if (s[1] === i) { + n = a[u + " " + s[0]] || a["* " + s[0]]; + if (n) { + n === !0 ? n = a[r] : a[r] !== !0 && (i = s[0], o.splice(f--, 0, i)); + break + } + } + } + if (n !== !0) if (n && e["throws"]) t = n(t); + else try { + t = n(t) + } catch (l) { + return { + state: "parsererror", + error: n ? l : "No conversion from " + u + " to " + i + } + } + } + u = i + } + return { + state: "success", + data: t + } + } + + function Fn() { + try { + return new e.XMLHttpRequest + } catch (t) {} + } + + function In() { + try { + return new e.ActiveXObject("Microsoft.XMLHTTP") + } catch (t) {} + } + + function $n() { + return setTimeout(function() { + qn = t + }, 0), qn = v.now() + } + + function Jn(e, t) { + v.each(t, function(t, n) { + var r = (Vn[t] || []).concat(Vn["*"]), + i = 0, + s = r.length; + for (; i < s; i++) if (r[i].call(e, t, n)) return + }) + } + + function Kn(e, t, n) { + var r, i = 0, + s = 0, + o = Xn.length, + u = v.Deferred().always(function() { + delete a.elem + }), + a = function() { + var t = qn || $n(), + n = Math.max(0, f.startTime + f.duration - t), + r = n / f.duration || 0, + i = 1 - r, + s = 0, + o = f.tweens.length; + for (; s < o; s++) f.tweens[s].run(i); + return u.notifyWith(e, [f, i, n]), i < 1 && o ? n : (u.resolveWith(e, [f]), !1) + }, + f = u.promise({ + elem: e, + props: v.extend({}, t), + opts: v.extend(!0, { + specialEasing: {} + }, n), + originalProperties: t, + originalOptions: n, + startTime: qn || $n(), + duration: n.duration, + tweens: [], + createTween: function(t, n, r) { + var i = v.Tween(e, f.opts, t, n, f.opts.specialEasing[t] || f.opts.easing); + return f.tweens.push(i), i + }, + stop: function(t) { + var n = 0, + r = t ? f.tweens.length : 0; + for (; n < r; n++) f.tweens[n].run(1); + return t ? u.resolveWith(e, [f, t]) : u.rejectWith(e, [f, t]), this + } + }), + l = f.props; + Qn(l, f.opts.specialEasing); + for (; i < o; i++) { + r = Xn[i].call(f, e, l, f.opts); + if (r) return r + } + return Jn(f, l), v.isFunction(f.opts.start) && f.opts.start.call(e, f), v.fx.timer(v.extend(a, { + anim: f, + queue: f.opts.queue, + elem: e + })), f.progress(f.opts.progress).done(f.opts.done, f.opts.complete).fail(f.opts.fail).always(f.opts.always) + } + + function Qn(e, t) { + var n, r, i, s, o; + for (n in e) { + r = v.camelCase(n), i = t[r], s = e[n], v.isArray(s) && (i = s[1], s = e[n] = s[0]), n !== r && (e[r] = s, delete e[n]), o = v.cssHooks[r]; + if (o && "expand" in o) { + s = o.expand(s), delete e[r]; + for (n in s) n in e || (e[n] = s[n], t[n] = i) + } else t[r] = i + } + } + + function Gn(e, t, n) { + var r, i, s, o, u, a, f, l, c, h = this, + p = e.style, + d = {}, + m = [], + g = e.nodeType && Gt(e); + n.queue || (l = v._queueHooks(e, "fx"), l.unqueued == null && (l.unqueued = 0, c = l.empty.fire, l.empty.fire = function() { + l.unqueued || c() + }), l.unqueued++, h.always(function() { + h.always(function() { + l.unqueued--, v.queue(e, "fx").length || l.empty.fire() + }) + })), e.nodeType === 1 && ("height" in t || "width" in t) && (n.overflow = [p.overflow, p.overflowX, p.overflowY], v.css(e, "display") === "inline" && v.css(e, "float") === "none" && (!v.support.inlineBlockNeedsLayout || nn(e.nodeName) === "inline" ? p.display = "inline-block" : p.zoom = 1)), n.overflow && (p.overflow = "hidden", v.support.shrinkWrapBlocks || h.done(function() { + p.overflow = n.overflow[0], p.overflowX = n.overflow[1], p.overflowY = n.overflow[2] + })); + for (r in t) { + s = t[r]; + if (Un.exec(s)) { + delete t[r], a = a || s === "toggle"; + if (s === (g ? "hide" : "show")) continue; + m.push(r) + } + } + o = m.length; + if (o) { + u = v._data(e, "fxshow") || v._data(e, "fxshow", {}), "hidden" in u && (g = u.hidden), a && (u.hidden = !g), g ? v(e).show() : h.done(function() { + v(e).hide() + }), h.done(function() { + var t; + v.removeData(e, "fxshow", !0); + for (t in d) v.style(e, t, d[t]) + }); + for (r = 0; r < o; r++) i = m[r], f = h.createTween(i, g ? u[i] : 0), d[i] = u[i] || v.style(e, i), i in u || (u[i] = f.start, g && (f.end = f.start, f.start = i === "width" || i === "height" ? 1 : 0)) + } + } + + function Yn(e, t, n, r, i) { + return new Yn.prototype.init(e, t, n, r, i) + } + + function Zn(e, t) { + var n, r = { + height: e + }, + i = 0; + t = t ? 1 : 0; + for (; i < 4; i += 2 - t) n = $t[i], r["margin" + n] = r["padding" + n] = e; + return t && (r.opacity = r.width = e), r + } + + function tr(e) { + return v.isWindow(e) ? e : e.nodeType === 9 ? e.defaultView || e.parentWindow : !1 + } + var n, r, i = e.document, + s = e.location, + o = e.navigator, + u = e.jQuery, + a = e.$, + f = Array.prototype.push, + l = Array.prototype.slice, + c = Array.prototype.indexOf, + h = Object.prototype.toString, + p = Object.prototype.hasOwnProperty, + d = String.prototype.trim, + v = function(e, t) { + return new v.fn.init(e, t, n) + }, + m = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source, + g = /\S/, + y = /\s+/, + b = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + w = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + E = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, + S = /^[\],:{}\s]*$/, + x = /(?:^|:|,)(?:\s*\[)+/g, + T = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, + N = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g, + C = /^-ms-/, + k = /-([\da-z])/gi, + L = function(e, t) { + return (t + "").toUpperCase() + }, + A = function() { + i.addEventListener ? (i.removeEventListener("DOMContentLoaded", A, !1), v.ready()) : i.readyState === "complete" && (i.detachEvent("onreadystatechange", A), v.ready()) + }, + O = {}; + v.fn = v.prototype = { + constructor: v, + init: function(e, n, r) { + var s, o, u, a; + if (!e) return this; + if (e.nodeType) return this.context = this[0] = e, this.length = 1, this; + if (typeof e == "string") { + e.charAt(0) === "<" && e.charAt(e.length - 1) === ">" && e.length >= 3 ? s = [null, e, null] : s = w.exec(e); + if (s && (s[1] || !n)) { + if (s[1]) return n = n instanceof v ? n[0] : n, a = n && n.nodeType ? n.ownerDocument || n : i, e = v.parseHTML(s[1], a, !0), E.test(s[1]) && v.isPlainObject(n) && this.attr.call(e, n, !0), v.merge(this, e); + o = i.getElementById(s[2]); + if (o && o.parentNode) { + if (o.id !== s[2]) return r.find(e); + this.length = 1, this[0] = o + } + return this.context = i, this.selector = e, this + } + return !n || n.jquery ? (n || r).find(e) : this.constructor(n).find(e) + } + return v.isFunction(e) ? r.ready(e) : (e.selector !== t && (this.selector = e.selector, this.context = e.context), v.makeArray(e, this)) + }, + selector: "", + jquery: "1.8.3", + length: 0, + size: function() { + return this.length + }, + toArray: function() { + return l.call(this) + }, + get: function(e) { + return e == null ? this.toArray() : e < 0 ? this[this.length + e] : this[e] + }, + pushStack: function(e, t, n) { + var r = v.merge(this.constructor(), e); + return r.prevObject = this, r.context = this.context, t === "find" ? r.selector = this.selector + (this.selector ? " " : "") + n : t && (r.selector = this.selector + "." + t + "(" + n + ")"), r + }, + each: function(e, t) { + return v.each(this, e, t) + }, + ready: function(e) { + return v.ready.promise().done(e), this + }, + eq: function(e) { + return e = +e, e === -1 ? this.slice(e) : this.slice(e, e + 1) + }, + first: function() { + return this.eq(0) + }, + last: function() { + return this.eq(-1) + }, + slice: function() { + return this.pushStack(l.apply(this, arguments), "slice", l.call(arguments).join(",")) + }, + map: function(e) { + return this.pushStack(v.map(this, function(t, n) { + return e.call(t, n, t) + })) + }, + end: function() { + return this.prevObject || this.constructor(null) + }, + push: f, + sort: [].sort, + splice: [].splice + }, v.fn.init.prototype = v.fn, v.extend = v.fn.extend = function() { + var e, n, r, i, s, o, u = arguments[0] || {}, + a = 1, + f = arguments.length, + l = !1; + typeof u == "boolean" && (l = u, u = arguments[1] || {}, a = 2), typeof u != "object" && !v.isFunction(u) && (u = {}), f === a && (u = this, --a); + for (; a < f; a++) if ((e = arguments[a]) != null) for (n in e) { + r = u[n], i = e[n]; + if (u === i) continue; + l && i && (v.isPlainObject(i) || (s = v.isArray(i))) ? (s ? (s = !1, o = r && v.isArray(r) ? r : []) : o = r && v.isPlainObject(r) ? r : {}, u[n] = v.extend(l, o, i)) : i !== t && (u[n] = i) + } + return u + }, v.extend({ + noConflict: function(t) { + return e.$ === v && (e.$ = a), t && e.jQuery === v && (e.jQuery = u), v + }, + isReady: !1, + readyWait: 1, + holdReady: function(e) { + e ? v.readyWait++ : v.ready(!0) + }, + ready: function(e) { + if (e === !0 ? --v.readyWait : v.isReady) return; + if (!i.body) return setTimeout(v.ready, 1); + v.isReady = !0; + if (e !== !0 && --v.readyWait > 0) return; + r.resolveWith(i, [v]), v.fn.trigger && v(i).trigger("ready").off("ready") + }, + isFunction: function(e) { + return v.type(e) === "function" + }, + isArray: Array.isArray || + function(e) { + return v.type(e) === "array" + }, + isWindow: function(e) { + return e != null && e == e.window + }, + isNumeric: function(e) { + return !isNaN(parseFloat(e)) && isFinite(e) + }, + type: function(e) { + return e == null ? String(e) : O[h.call(e)] || "object" + }, + isPlainObject: function(e) { + if (!e || v.type(e) !== "object" || e.nodeType || v.isWindow(e)) return !1; + try { + if (e.constructor && !p.call(e, "constructor") && !p.call(e.constructor.prototype, "isPrototypeOf")) return !1 + } catch (n) { + return !1 + } + var r; + for (r in e); + return r === t || p.call(e, r) + }, + isEmptyObject: function(e) { + var t; + for (t in e) return !1; + return !0 + }, + error: function(e) { + throw new Error(e) + }, + parseHTML: function(e, t, n) { + var r; + return !e || typeof e != "string" ? null : (typeof t == "boolean" && (n = t, t = 0), t = t || i, (r = E.exec(e)) ? [t.createElement(r[1])] : (r = v.buildFragment([e], t, n ? null : []), v.merge([], (r.cacheable ? v.clone(r.fragment) : r.fragment).childNodes))) + }, + parseJSON: function(t) { + if (!t || typeof t != "string") return null; + t = v.trim(t); + if (e.JSON && e.JSON.parse) return e.JSON.parse(t); + if (S.test(t.replace(T, "@").replace(N, "]").replace(x, ""))) return (new Function("return " + t))(); + v.error("Invalid JSON: " + t) + }, + parseXML: function(n) { + var r, i; + if (!n || typeof n != "string") return null; + try { + e.DOMParser ? (i = new DOMParser, r = i.parseFromString(n, "text/xml")) : (r = new ActiveXObject("Microsoft.XMLDOM"), r.async = "false", r.loadXML(n)) + } catch (s) { + r = t + } + return (!r || !r.documentElement || r.getElementsByTagName("parsererror").length) && v.error("Invalid XML: " + n), r + }, + noop: function() {}, + globalEval: function(t) { + t && g.test(t) && (e.execScript || + function(t) { + e.eval.call(e, t) + })(t) + }, + camelCase: function(e) { + return e.replace(C, "ms-").replace(k, L) + }, + nodeName: function(e, t) { + return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() + }, + each: function(e, n, r) { + var i, s = 0, + o = e.length, + u = o === t || v.isFunction(e); + if (r) { + if (u) { + for (i in e) if (n.apply(e[i], r) === !1) break + } else for (; s < o;) if (n.apply(e[s++], r) === !1) break + } else if (u) { + for (i in e) if (n.call(e[i], i, e[i]) === !1) break + } else for (; s < o;) if (n.call(e[s], s, e[s++]) === !1) break; + return e + }, + trim: d && !d.call("\ufeff\u00a0") ? + function(e) { + return e == null ? "" : d.call(e) + } : function(e) { + return e == null ? "" : (e + "").replace(b, "") + }, + makeArray: function(e, t) { + var n, r = t || []; + return e != null && (n = v.type(e), e.length == null || n === "string" || n === "function" || n === "regexp" || v.isWindow(e) ? f.call(r, e) : v.merge(r, e)), r + }, + inArray: function(e, t, n) { + var r; + if (t) { + if (c) return c.call(t, e, n); + r = t.length, n = n ? n < 0 ? Math.max(0, r + n) : n : 0; + for (; n < r; n++) if (n in t && t[n] === e) return n + } + return -1 + }, + merge: function(e, n) { + var r = n.length, + i = e.length, + s = 0; + if (typeof r == "number") for (; s < r; s++) e[i++] = n[s]; + else while (n[s] !== t) e[i++] = n[s++]; + return e.length = i, e + }, + grep: function(e, t, n) { + var r, i = [], + s = 0, + o = e.length; + n = !! n; + for (; s < o; s++) r = !! t(e[s], s), n !== r && i.push(e[s]); + return i + }, + map: function(e, n, r) { + var i, s, o = [], + u = 0, + a = e.length, + f = e instanceof v || a !== t && typeof a == "number" && (a > 0 && e[0] && e[a - 1] || a === 0 || v.isArray(e)); + if (f) for (; u < a; u++) i = n(e[u], u, r), i != null && (o[o.length] = i); + else for (s in e) i = n(e[s], s, r), i != null && (o[o.length] = i); + return o.concat.apply([], o) + }, + guid: 1, + proxy: function(e, n) { + var r, i, s; + return typeof n == "string" && (r = e[n], n = e, e = r), v.isFunction(e) ? (i = l.call(arguments, 2), s = function() { + return e.apply(n, i.concat(l.call(arguments))) + }, s.guid = e.guid = e.guid || v.guid++, s) : t + }, + access: function(e, n, r, i, s, o, u) { + var a, f = r == null, + l = 0, + c = e.length; + if (r && typeof r == "object") { + for (l in r) v.access(e, n, l, r[l], 1, o, i); + s = 1 + } else if (i !== t) { + a = u === t && v.isFunction(i), f && (a ? (a = n, n = function(e, t, n) { + return a.call(v(e), n) + }) : (n.call(e, i), n = null)); + if (n) for (; l < c; l++) n(e[l], r, a ? i.call(e[l], l, n(e[l], r)) : i, u); + s = 1 + } + return s ? e : f ? n.call(e) : c ? n(e[0], r) : o + }, + now: function() { + return (new Date).getTime() + } + }), v.ready.promise = function(t) { + if (!r) { + r = v.Deferred(); + if (i.readyState === "complete") setTimeout(v.ready, 1); + else if (i.addEventListener) i.addEventListener("DOMContentLoaded", A, !1), e.addEventListener("load", v.ready, !1); + else { + i.attachEvent("onreadystatechange", A), e.attachEvent("onload", v.ready); + var n = !1; + try { + n = e.frameElement == null && i.documentElement + } catch (s) {} + n && n.doScroll && + function o() { + if (!v.isReady) { + try { + n.doScroll("left") + } catch (e) { + return setTimeout(o, 50) + } + v.ready() + } + }() + } + } + return r.promise(t) + }, v.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(e, t) { + O["[object " + t + "]"] = t.toLowerCase() + }), n = v(i); + var M = {}; + v.Callbacks = function(e) { + e = typeof e == "string" ? M[e] || _(e) : v.extend({}, e); + var n, r, i, s, o, u, a = [], + f = !e.once && [], + l = function(t) { + n = e.memory && t, r = !0, u = s || 0, s = 0, o = a.length, i = !0; + for (; a && u < o; u++) if (a[u].apply(t[0], t[1]) === !1 && e.stopOnFalse) { + n = !1; + break + } + i = !1, a && (f ? f.length && l(f.shift()) : n ? a = [] : c.disable()) + }, + c = { + add: function() { + if (a) { + var t = a.length; + (function r(t) { + v.each(t, function(t, n) { + var i = v.type(n); + i === "function" ? (!e.unique || !c.has(n)) && a.push(n) : n && n.length && i !== "string" && r(n) + }) + })(arguments), i ? o = a.length : n && (s = t, l(n)) + } + return this + }, + remove: function() { + return a && v.each(arguments, function(e, t) { + var n; + while ((n = v.inArray(t, a, n)) > -1) a.splice(n, 1), i && (n <= o && o--, n <= u && u--) + }), this + }, + has: function(e) { + return v.inArray(e, a) > -1 + }, + empty: function() { + return a = [], this + }, + disable: function() { + return a = f = n = t, this + }, + disabled: function() { + return !a + }, + lock: function() { + return f = t, n || c.disable(), this + }, + locked: function() { + return !f + }, + fireWith: function(e, t) { + return t = t || [], t = [e, t.slice ? t.slice() : t], a && (!r || f) && (i ? f.push(t) : l(t)), this + }, + fire: function() { + return c.fireWith(this, arguments), this + }, + fired: function() { + return !!r + } + }; + return c + }, v.extend({ + Deferred: function(e) { + var t = [ + ["resolve", "done", v.Callbacks("once memory"), "resolved"], + ["reject", "fail", v.Callbacks("once memory"), "rejected"], + ["notify", "progress", v.Callbacks("memory")] + ], + n = "pending", + r = { + state: function() { + return n + }, + always: function() { + return i.done(arguments).fail(arguments), this + }, + then: function() { + var e = arguments; + return v.Deferred(function(n) { + v.each(t, function(t, r) { + var s = r[0], + o = e[t]; + i[r[1]](v.isFunction(o) ? + function() { + var e = o.apply(this, arguments); + e && v.isFunction(e.promise) ? e.promise().done(n.resolve).fail(n.reject).progress(n.notify) : n[s + "With"](this === i ? n : this, [e]) + } : n[s]) + }), e = null + }).promise() + }, + promise: function(e) { + return e != null ? v.extend(e, r) : r + } + }, + i = {}; + return r.pipe = r.then, v.each(t, function(e, s) { + var o = s[2], + u = s[3]; + r[s[1]] = o.add, u && o.add(function() { + n = u + }, t[e ^ 1][2].disable, t[2][2].lock), i[s[0]] = o.fire, i[s[0] + "With"] = o.fireWith + }), r.promise(i), e && e.call(i, i), i + }, + when: function(e) { + var t = 0, + n = l.call(arguments), + r = n.length, + i = r !== 1 || e && v.isFunction(e.promise) ? r : 0, + s = i === 1 ? e : v.Deferred(), + o = function(e, t, n) { + return function(r) { + t[e] = this, n[e] = arguments.length > 1 ? l.call(arguments) : r, n === u ? s.notifyWith(t, n) : --i || s.resolveWith(t, n) + } + }, + u, a, f; + if (r > 1) { + u = new Array(r), a = new Array(r), f = new Array(r); + for (; t < r; t++) n[t] && v.isFunction(n[t].promise) ? n[t].promise().done(o(t, f, n)).fail(s.reject).progress(o(t, a, u)) : --i + } + return i || s.resolveWith(f, n), s.promise() + } + }), v.support = function() { + var t, n, r, s, o, u, a, f, l, c, h, p = i.createElement("div"); + p.setAttribute("className", "t"), p.innerHTML = "
a", n = p.getElementsByTagName("*"), r = p.getElementsByTagName("a")[0]; + if (!n || !r || !n.length) return {}; + s = i.createElement("select"), o = s.appendChild(i.createElement("option")), u = p.getElementsByTagName("input")[0], r.style.cssText = "top:1px;float:left;opacity:.5", t = { + leadingWhitespace: p.firstChild.nodeType === 3, + tbody: !p.getElementsByTagName("tbody").length, + htmlSerialize: !! p.getElementsByTagName("link").length, + style: /top/.test(r.getAttribute("style")), + hrefNormalized: r.getAttribute("href") === "/a", + opacity: /^0.5/.test(r.style.opacity), + cssFloat: !! r.style.cssFloat, + checkOn: u.value === "on", + optSelected: o.selected, + getSetAttribute: p.className !== "t", + enctype: !! i.createElement("form").enctype, + html5Clone: i.createElement("nav").cloneNode(!0).outerHTML !== "<:nav>", + boxModel: i.compatMode === "CSS1Compat", + submitBubbles: !0, + changeBubbles: !0, + focusinBubbles: !1, + deleteExpando: !0, + noCloneEvent: !0, + inlineBlockNeedsLayout: !1, + shrinkWrapBlocks: !1, + reliableMarginRight: !0, + boxSizingReliable: !0, + pixelPosition: !1 + }, u.checked = !0, t.noCloneChecked = u.cloneNode(!0).checked, s.disabled = !0, t.optDisabled = !o.disabled; + try { + delete p.test + } catch (d) { + t.deleteExpando = !1 + }!p.addEventListener && p.attachEvent && p.fireEvent && (p.attachEvent("onclick", h = function() { + t.noCloneEvent = !1 + }), p.cloneNode(!0).fireEvent("onclick"), p.detachEvent("onclick", h)), u = i.createElement("input"), u.value = "t", u.setAttribute("type", "radio"), t.radioValue = u.value === "t", u.setAttribute("checked", "checked"), u.setAttribute("name", "t"), p.appendChild(u), a = i.createDocumentFragment(), a.appendChild(p.lastChild), t.checkClone = a.cloneNode(!0).cloneNode(!0).lastChild.checked, t.appendChecked = u.checked, a.removeChild(u), a.appendChild(p); + if (p.attachEvent) for (l in { + submit: !0, + change: !0, + focusin: !0 + }) f = "on" + l, c = f in p, c || (p.setAttribute(f, "return;"), c = typeof p[f] == "function"), t[l + "Bubbles"] = c; + return v(function() { + var n, r, s, o, u = "padding:0;margin:0;border:0;display:block;overflow:hidden;", + a = i.getElementsByTagName("body")[0]; + if (!a) return; + n = i.createElement("div"), n.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px", a.insertBefore(n, a.firstChild), r = i.createElement("div"), n.appendChild(r), r.innerHTML = "
t
", s = r.getElementsByTagName("td"), s[0].style.cssText = "padding:0;margin:0;border:0;display:none", c = s[0].offsetHeight === 0, s[0].style.display = "", s[1].style.display = "none", t.reliableHiddenOffsets = c && s[0].offsetHeight === 0, r.innerHTML = "", r.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;", t.boxSizing = r.offsetWidth === 4, t.doesNotIncludeMarginInBodyOffset = a.offsetTop !== 1, e.getComputedStyle && (t.pixelPosition = (e.getComputedStyle(r, null) || {}).top !== "1%", t.boxSizingReliable = (e.getComputedStyle(r, null) || { + width: "4px" + }).width === "4px", o = i.createElement("div"), o.style.cssText = r.style.cssText = u, o.style.marginRight = o.style.width = "0", r.style.width = "1px", r.appendChild(o), t.reliableMarginRight = !parseFloat((e.getComputedStyle(o, null) || {}).marginRight)), typeof r.style.zoom != "undefined" && (r.innerHTML = "", r.style.cssText = u + "width:1px;padding:1px;display:inline;zoom:1", t.inlineBlockNeedsLayout = r.offsetWidth === 3, r.style.display = "block", r.style.overflow = "visible", r.innerHTML = "
", r.firstChild.style.width = "5px", t.shrinkWrapBlocks = r.offsetWidth !== 3, n.style.zoom = 1), a.removeChild(n), n = r = s = o = null + }), a.removeChild(p), n = r = s = o = u = a = p = null, t + }(); + var D = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, + P = /([A-Z])/g; + v.extend({ + cache: {}, + deletedIds: [], + uuid: 0, + expando: "jQuery" + (v.fn.jquery + Math.random()).replace(/\D/g, ""), + noData: { + embed: !0, + object: "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + applet: !0 + }, + hasData: function(e) { + return e = e.nodeType ? v.cache[e[v.expando]] : e[v.expando], !! e && !B(e) + }, + data: function(e, n, r, i) { + if (!v.acceptData(e)) return; + var s, o, u = v.expando, + a = typeof n == "string", + f = e.nodeType, + l = f ? v.cache : e, + c = f ? e[u] : e[u] && u; + if ((!c || !l[c] || !i && !l[c].data) && a && r === t) return; + c || (f ? e[u] = c = v.deletedIds.pop() || v.guid++ : c = u), l[c] || (l[c] = {}, f || (l[c].toJSON = v.noop)); + if (typeof n == "object" || typeof n == "function") i ? l[c] = v.extend(l[c], n) : l[c].data = v.extend(l[c].data, n); + return s = l[c], i || (s.data || (s.data = {}), s = s.data), r !== t && (s[v.camelCase(n)] = r), a ? (o = s[n], o == null && (o = s[v.camelCase(n)])) : o = s, o + }, + removeData: function(e, t, n) { + if (!v.acceptData(e)) return; + var r, i, s, o = e.nodeType, + u = o ? v.cache : e, + a = o ? e[v.expando] : v.expando; + if (!u[a]) return; + if (t) { + r = n ? u[a] : u[a].data; + if (r) { + v.isArray(t) || (t in r ? t = [t] : (t = v.camelCase(t), t in r ? t = [t] : t = t.split(" "))); + for (i = 0, s = t.length; i < s; i++) delete r[t[i]]; + if (!(n ? B : v.isEmptyObject)(r)) return + } + } + if (!n) { + delete u[a].data; + if (!B(u[a])) return + } + o ? v.cleanData([e], !0) : v.support.deleteExpando || u != u.window ? delete u[a] : u[a] = null + }, + _data: function(e, t, n) { + return v.data(e, t, n, !0) + }, + acceptData: function(e) { + var t = e.nodeName && v.noData[e.nodeName.toLowerCase()]; + return !t || t !== !0 && e.getAttribute("classid") === t + } + }), v.fn.extend({ + data: function(e, n) { + var r, i, s, o, u, a = this[0], + f = 0, + l = null; + if (e === t) { + if (this.length) { + l = v.data(a); + if (a.nodeType === 1 && !v._data(a, "parsedAttrs")) { + s = a.attributes; + for (u = s.length; f < u; f++) o = s[f].name, o.indexOf("data-") || (o = v.camelCase(o.substring(5)), H(a, o, l[o])); + v._data(a, "parsedAttrs", !0) + } + } + return l + } + return typeof e == "object" ? this.each(function() { + v.data(this, e) + }) : (r = e.split(".", 2), r[1] = r[1] ? "." + r[1] : "", i = r[1] + "!", v.access(this, function(n) { + if (n === t) return l = this.triggerHandler("getData" + i, [r[0]]), l === t && a && (l = v.data(a, e), l = H(a, e, l)), l === t && r[1] ? this.data(r[0]) : l; + r[1] = n, this.each(function() { + var t = v(this); + t.triggerHandler("setData" + i, r), v.data(this, e, n), t.triggerHandler("changeData" + i, r) + }) + }, null, n, arguments.length > 1, null, !1)) + }, + removeData: function(e) { + return this.each(function() { + v.removeData(this, e) + }) + } + }), v.extend({ + queue: function(e, t, n) { + var r; + if (e) return t = (t || "fx") + "queue", r = v._data(e, t), n && (!r || v.isArray(n) ? r = v._data(e, t, v.makeArray(n)) : r.push(n)), r || [] + }, + dequeue: function(e, t) { + t = t || "fx"; + var n = v.queue(e, t), + r = n.length, + i = n.shift(), + s = v._queueHooks(e, t), + o = function() { + v.dequeue(e, t) + }; + i === "inprogress" && (i = n.shift(), r--), i && (t === "fx" && n.unshift("inprogress"), delete s.stop, i.call(e, o, s)), !r && s && s.empty.fire() + }, + _queueHooks: function(e, t) { + var n = t + "queueHooks"; + return v._data(e, n) || v._data(e, n, { + empty: v.Callbacks("once memory").add(function() { + v.removeData(e, t + "queue", !0), v.removeData(e, n, !0) + }) + }) + } + }), v.fn.extend({ + queue: function(e, n) { + var r = 2; + return typeof e != "string" && (n = e, e = "fx", r--), arguments.length < r ? v.queue(this[0], e) : n === t ? this : this.each(function() { + var t = v.queue(this, e, n); + v._queueHooks(this, e), e === "fx" && t[0] !== "inprogress" && v.dequeue(this, e) + }) + }, + dequeue: function(e) { + return this.each(function() { + v.dequeue(this, e) + }) + }, + delay: function(e, t) { + return e = v.fx ? v.fx.speeds[e] || e : e, t = t || "fx", this.queue(t, function(t, n) { + var r = setTimeout(t, e); + n.stop = function() { + clearTimeout(r) + } + }) + }, + clearQueue: function(e) { + return this.queue(e || "fx", []) + }, + promise: function(e, n) { + var r, i = 1, + s = v.Deferred(), + o = this, + u = this.length, + a = function() { + --i || s.resolveWith(o, [o]) + }; + typeof e != "string" && (n = e, e = t), e = e || "fx"; + while (u--) r = v._data(o[u], e + "queueHooks"), r && r.empty && (i++, r.empty.add(a)); + return a(), s.promise(n) + } + }); + var j, F, I, q = /[\t\r\n]/g, + R = /\r/g, + U = /^(?:button|input)$/i, + z = /^(?:button|input|object|select|textarea)$/i, + W = /^a(?:rea|)$/i, + X = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + V = v.support.getSetAttribute; + v.fn.extend({ + attr: function(e, t) { + return v.access(this, v.attr, e, t, arguments.length > 1) + }, + removeAttr: function(e) { + return this.each(function() { + v.removeAttr(this, e) + }) + }, + prop: function(e, t) { + return v.access(this, v.prop, e, t, arguments.length > 1) + }, + removeProp: function(e) { + return e = v.propFix[e] || e, this.each(function() { + try { + this[e] = t, delete this[e] + } catch (n) {} + }) + }, + addClass: function(e) { + var t, n, r, i, s, o, u; + if (v.isFunction(e)) return this.each(function(t) { + v(this).addClass(e.call(this, t, this.className)) + }); + if (e && typeof e == "string") { + t = e.split(y); + for (n = 0, r = this.length; n < r; n++) { + i = this[n]; + if (i.nodeType === 1) if (!i.className && t.length === 1) i.className = e; + else { + s = " " + i.className + " "; + for (o = 0, u = t.length; o < u; o++) s.indexOf(" " + t[o] + " ") < 0 && (s += t[o] + " "); + i.className = v.trim(s) + } + } + } + return this + }, + removeClass: function(e) { + var n, r, i, s, o, u, a; + if (v.isFunction(e)) return this.each(function(t) { + v(this).removeClass(e.call(this, t, this.className)) + }); + if (e && typeof e == "string" || e === t) { + n = (e || "").split(y); + for (u = 0, a = this.length; u < a; u++) { + i = this[u]; + if (i.nodeType === 1 && i.className) { + r = (" " + i.className + " ").replace(q, " "); + for (s = 0, o = n.length; s < o; s++) while (r.indexOf(" " + n[s] + " ") >= 0) r = r.replace(" " + n[s] + " ", " "); + i.className = e ? v.trim(r) : "" + } + } + } + return this + }, + toggleClass: function(e, t) { + var n = typeof e, + r = typeof t == "boolean"; + return v.isFunction(e) ? this.each(function(n) { + v(this).toggleClass(e.call(this, n, this.className, t), t) + }) : this.each(function() { + if (n === "string") { + var i, s = 0, + o = v(this), + u = t, + a = e.split(y); + while (i = a[s++]) u = r ? u : !o.hasClass(i), o[u ? "addClass" : "removeClass"](i) + } else if (n === "undefined" || n === "boolean") this.className && v._data(this, "__className__", this.className), this.className = this.className || e === !1 ? "" : v._data(this, "__className__") || "" + }) + }, + hasClass: function(e) { + var t = " " + e + " ", + n = 0, + r = this.length; + for (; n < r; n++) if (this[n].nodeType === 1 && (" " + this[n].className + " ").replace(q, " ").indexOf(t) >= 0) return !0; + return !1 + }, + val: function(e) { + var n, r, i, s = this[0]; + if (!arguments.length) { + if (s) return n = v.valHooks[s.type] || v.valHooks[s.nodeName.toLowerCase()], n && "get" in n && (r = n.get(s, "value")) !== t ? r : (r = s.value, typeof r == "string" ? r.replace(R, "") : r == null ? "" : r); + return + } + return i = v.isFunction(e), this.each(function(r) { + var s, o = v(this); + if (this.nodeType !== 1) return; + i ? s = e.call(this, r, o.val()) : s = e, s == null ? s = "" : typeof s == "number" ? s += "" : v.isArray(s) && (s = v.map(s, function(e) { + return e == null ? "" : e + "" + })), n = v.valHooks[this.type] || v.valHooks[this.nodeName.toLowerCase()]; + if (!n || !("set" in n) || n.set(this, s, "value") === t) this.value = s + }) + } + }), v.extend({ + valHooks: { + option: { + get: function(e) { + var t = e.attributes.value; + return !t || t.specified ? e.value : e.text + } + }, + select: { + get: function(e) { + var t, n, r = e.options, + i = e.selectedIndex, + s = e.type === "select-one" || i < 0, + o = s ? null : [], + u = s ? i + 1 : r.length, + a = i < 0 ? u : s ? i : 0; + for (; a < u; a++) { + n = r[a]; + if ((n.selected || a === i) && (v.support.optDisabled ? !n.disabled : n.getAttribute("disabled") === null) && (!n.parentNode.disabled || !v.nodeName(n.parentNode, "optgroup"))) { + t = v(n).val(); + if (s) return t; + o.push(t) + } + } + return o + }, + set: function(e, t) { + var n = v.makeArray(t); + return v(e).find("option").each(function() { + this.selected = v.inArray(v(this).val(), n) >= 0 + }), n.length || (e.selectedIndex = -1), n + } + } + }, + attrFn: {}, + attr: function(e, n, r, i) { + var s, o, u, a = e.nodeType; + if (!e || a === 3 || a === 8 || a === 2) return; + if (i && v.isFunction(v.fn[n])) return v(e)[n](r); + if (typeof e.getAttribute == "undefined") return v.prop(e, n, r); + u = a !== 1 || !v.isXMLDoc(e), u && (n = n.toLowerCase(), o = v.attrHooks[n] || (X.test(n) ? F : j)); + if (r !== t) { + if (r === null) { + v.removeAttr(e, n); + return + } + return o && "set" in o && u && (s = o.set(e, r, n)) !== t ? s : (e.setAttribute(n, r + ""), r) + } + return o && "get" in o && u && (s = o.get(e, n)) !== null ? s : (s = e.getAttribute(n), s === null ? t : s) + }, + removeAttr: function(e, t) { + var n, r, i, s, o = 0; + if (t && e.nodeType === 1) { + r = t.split(y); + for (; o < r.length; o++) i = r[o], i && (n = v.propFix[i] || i, s = X.test(i), s || v.attr(e, i, ""), e.removeAttribute(V ? i : n), s && n in e && (e[n] = !1)) + } + }, + attrHooks: { + type: { + set: function(e, t) { + if (U.test(e.nodeName) && e.parentNode) v.error("type property can't be changed"); + else if (!v.support.radioValue && t === "radio" && v.nodeName(e, "input")) { + var n = e.value; + return e.setAttribute("type", t), n && (e.value = n), t + } + } + }, + value: { + get: function(e, t) { + return j && v.nodeName(e, "button") ? j.get(e, t) : t in e ? e.value : null + }, + set: function(e, t, n) { + if (j && v.nodeName(e, "button")) return j.set(e, t, n); + e.value = t + } + } + }, + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + prop: function(e, n, r) { + var i, s, o, u = e.nodeType; + if (!e || u === 3 || u === 8 || u === 2) return; + return o = u !== 1 || !v.isXMLDoc(e), o && (n = v.propFix[n] || n, s = v.propHooks[n]), r !== t ? s && "set" in s && (i = s.set(e, r, n)) !== t ? i : e[n] = r : s && "get" in s && (i = s.get(e, n)) !== null ? i : e[n] + }, + propHooks: { + tabIndex: { + get: function(e) { + var n = e.getAttributeNode("tabindex"); + return n && n.specified ? parseInt(n.value, 10) : z.test(e.nodeName) || W.test(e.nodeName) && e.href ? 0 : t + } + } + } + }), F = { + get: function(e, n) { + var r, i = v.prop(e, n); + return i === !0 || typeof i != "boolean" && (r = e.getAttributeNode(n)) && r.nodeValue !== !1 ? n.toLowerCase() : t + }, + set: function(e, t, n) { + var r; + return t === !1 ? v.removeAttr(e, n) : (r = v.propFix[n] || n, r in e && (e[r] = !0), e.setAttribute(n, n.toLowerCase())), n + } + }, V || (I = { + name: !0, + id: !0, + coords: !0 + }, j = v.valHooks.button = { + get: function(e, n) { + var r; + return r = e.getAttributeNode(n), r && (I[n] ? r.value !== "" : r.specified) ? r.value : t + }, + set: function(e, t, n) { + var r = e.getAttributeNode(n); + return r || (r = i.createAttribute(n), e.setAttributeNode(r)), r.value = t + "" + } + }, v.each(["width", "height"], function(e, t) { + v.attrHooks[t] = v.extend(v.attrHooks[t], { + set: function(e, n) { + if (n === "") return e.setAttribute(t, "auto"), n + } + }) + }), v.attrHooks.contenteditable = { + get: j.get, + set: function(e, t, n) { + t === "" && (t = "false"), j.set(e, t, n) + } + }), v.support.hrefNormalized || v.each(["href", "src", "width", "height"], function(e, n) { + v.attrHooks[n] = v.extend(v.attrHooks[n], { + get: function(e) { + var r = e.getAttribute(n, 2); + return r === null ? t : r + } + }) + }), v.support.style || (v.attrHooks.style = { + get: function(e) { + return e.style.cssText.toLowerCase() || t + }, + set: function(e, t) { + return e.style.cssText = t + "" + } + }), v.support.optSelected || (v.propHooks.selected = v.extend(v.propHooks.selected, { + get: function(e) { + var t = e.parentNode; + return t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex), null + } + })), v.support.enctype || (v.propFix.enctype = "encoding"), v.support.checkOn || v.each(["radio", "checkbox"], function() { + v.valHooks[this] = { + get: function(e) { + return e.getAttribute("value") === null ? "on" : e.value + } + } + }), v.each(["radio", "checkbox"], function() { + v.valHooks[this] = v.extend(v.valHooks[this], { + set: function(e, t) { + if (v.isArray(t)) return e.checked = v.inArray(v(e).val(), t) >= 0 + } + }) + }); + var $ = /^(?:textarea|input|select)$/i, + J = /^([^\.]*|)(?:\.(.+)|)$/, + K = /(?:^|\s)hover(\.\S+|)\b/, + Q = /^key/, + G = /^(?:mouse|contextmenu)|click/, + Y = /^(?:focusinfocus|focusoutblur)$/, + Z = function(e) { + return v.event.special.hover ? e : e.replace(K, "mouseenter$1 mouseleave$1") + }; + v.event = { + add: function(e, n, r, i, s) { + var o, u, a, f, l, c, h, p, d, m, g; + if (e.nodeType === 3 || e.nodeType === 8 || !n || !r || !(o = v._data(e))) return; + r.handler && (d = r, r = d.handler, s = d.selector), r.guid || (r.guid = v.guid++), a = o.events, a || (o.events = a = {}), u = o.handle, u || (o.handle = u = function(e) { + return typeof v == "undefined" || !! e && v.event.triggered === e.type ? t : v.event.dispatch.apply(u.elem, arguments) + }, u.elem = e), n = v.trim(Z(n)).split(" "); + for (f = 0; f < n.length; f++) { + l = J.exec(n[f]) || [], c = l[1], h = (l[2] || "").split(".").sort(), g = v.event.special[c] || {}, c = (s ? g.delegateType : g.bindType) || c, g = v.event.special[c] || {}, p = v.extend({ + type: c, + origType: l[1], + data: i, + handler: r, + guid: r.guid, + selector: s, + needsContext: s && v.expr.match.needsContext.test(s), + namespace: h.join(".") + }, d), m = a[c]; + if (!m) { + m = a[c] = [], m.delegateCount = 0; + if (!g.setup || g.setup.call(e, i, h, u) === !1) e.addEventListener ? e.addEventListener(c, u, !1) : e.attachEvent && e.attachEvent("on" + c, u) + } + g.add && (g.add.call(e, p), p.handler.guid || (p.handler.guid = r.guid)), s ? m.splice(m.delegateCount++, 0, p) : m.push(p), v.event.global[c] = !0 + } + e = null + }, + global: {}, + remove: function(e, t, n, r, i) { + var s, o, u, a, f, l, c, h, p, d, m, g = v.hasData(e) && v._data(e); + if (!g || !(h = g.events)) return; + t = v.trim(Z(t || "")).split(" "); + for (s = 0; s < t.length; s++) { + o = J.exec(t[s]) || [], u = a = o[1], f = o[2]; + if (!u) { + for (u in h) v.event.remove(e, u + t[s], n, r, !0); + continue + } + p = v.event.special[u] || {}, u = (r ? p.delegateType : p.bindType) || u, d = h[u] || [], l = d.length, f = f ? new RegExp("(^|\\.)" + f.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null; + for (c = 0; c < d.length; c++) m = d[c], (i || a === m.origType) && (!n || n.guid === m.guid) && (!f || f.test(m.namespace)) && (!r || r === m.selector || r === "**" && m.selector) && (d.splice(c--, 1), m.selector && d.delegateCount--, p.remove && p.remove.call(e, m)); + d.length === 0 && l !== d.length && ((!p.teardown || p.teardown.call(e, f, g.handle) === !1) && v.removeEvent(e, u, g.handle), delete h[u]) + } + v.isEmptyObject(h) && (delete g.handle, v.removeData(e, "events", !0)) + }, + customEvent: { + getData: !0, + setData: !0, + changeData: !0 + }, + trigger: function(n, r, s, o) { + if (!s || s.nodeType !== 3 && s.nodeType !== 8) { + var u, a, f, l, c, h, p, d, m, g, y = n.type || n, + b = []; + if (Y.test(y + v.event.triggered)) return; + y.indexOf("!") >= 0 && (y = y.slice(0, -1), a = !0), y.indexOf(".") >= 0 && (b = y.split("."), y = b.shift(), b.sort()); + if ((!s || v.event.customEvent[y]) && !v.event.global[y]) return; + n = typeof n == "object" ? n[v.expando] ? n : new v.Event(y, n) : new v.Event(y), n.type = y, n.isTrigger = !0, n.exclusive = a, n.namespace = b.join("."), n.namespace_re = n.namespace ? new RegExp("(^|\\.)" + b.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, h = y.indexOf(":") < 0 ? "on" + y : ""; + if (!s) { + u = v.cache; + for (f in u) u[f].events && u[f].events[y] && v.event.trigger(n, r, u[f].handle.elem, !0); + return + } + n.result = t, n.target || (n.target = s), r = r != null ? v.makeArray(r) : [], r.unshift(n), p = v.event.special[y] || {}; + if (p.trigger && p.trigger.apply(s, r) === !1) return; + m = [ + [s, p.bindType || y] + ]; + if (!o && !p.noBubble && !v.isWindow(s)) { + g = p.delegateType || y, l = Y.test(g + y) ? s : s.parentNode; + for (c = s; l; l = l.parentNode) m.push([l, g]), c = l; + c === (s.ownerDocument || i) && m.push([c.defaultView || c.parentWindow || e, g]) + } + for (f = 0; f < m.length && !n.isPropagationStopped(); f++) l = m[f][0], n.type = m[f][1], d = (v._data(l, "events") || {})[n.type] && v._data(l, "handle"), d && d.apply(l, r), d = h && l[h], d && v.acceptData(l) && d.apply && d.apply(l, r) === !1 && n.preventDefault(); + return n.type = y, !o && !n.isDefaultPrevented() && (!p._default || p._default.apply(s.ownerDocument, r) === !1) && (y !== "click" || !v.nodeName(s, "a")) && v.acceptData(s) && h && s[y] && (y !== "focus" && y !== "blur" || n.target.offsetWidth !== 0) && !v.isWindow(s) && (c = s[h], c && (s[h] = null), v.event.triggered = y, s[y](), v.event.triggered = t, c && (s[h] = c)), n.result + } + return + }, + dispatch: function(n) { + n = v.event.fix(n || e.event); + var r, i, s, o, u, a, f, c, h, p, d = (v._data(this, "events") || {})[n.type] || [], + m = d.delegateCount, + g = l.call(arguments), + y = !n.exclusive && !n.namespace, + b = v.event.special[n.type] || {}, + w = []; + g[0] = n, n.delegateTarget = this; + if (b.preDispatch && b.preDispatch.call(this, n) === !1) return; + if (m && (!n.button || n.type !== "click")) for (s = n.target; s != this; s = s.parentNode || this) if (s.disabled !== !0 || n.type !== "click") { + u = {}, f = []; + for (r = 0; r < m; r++) c = d[r], h = c.selector, u[h] === t && (u[h] = c.needsContext ? v(h, this).index(s) >= 0 : v.find(h, this, null, [s]).length), u[h] && f.push(c); + f.length && w.push({ + elem: s, + matches: f + }) + } + d.length > m && w.push({ + elem: this, + matches: d.slice(m) + }); + for (r = 0; r < w.length && !n.isPropagationStopped(); r++) { + a = w[r], n.currentTarget = a.elem; + for (i = 0; i < a.matches.length && !n.isImmediatePropagationStopped(); i++) { + c = a.matches[i]; + if (y || !n.namespace && !c.namespace || n.namespace_re && n.namespace_re.test(c.namespace)) n.data = c.data, n.handleObj = c, o = ((v.event.special[c.origType] || {}).handle || c.handler).apply(a.elem, g), o !== t && (n.result = o, o === !1 && (n.preventDefault(), n.stopPropagation())) + } + } + return b.postDispatch && b.postDispatch.call(this, n), n.result + }, + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + fixHooks: {}, + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function(e, t) { + return e.which == null && (e.which = t.charCode != null ? t.charCode : t.keyCode), e + } + }, + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function(e, n) { + var r, s, o, u = n.button, + a = n.fromElement; + return e.pageX == null && n.clientX != null && (r = e.target.ownerDocument || i, s = r.documentElement, o = r.body, e.pageX = n.clientX + (s && s.scrollLeft || o && o.scrollLeft || 0) - (s && s.clientLeft || o && o.clientLeft || 0), e.pageY = n.clientY + (s && s.scrollTop || o && o.scrollTop || 0) - (s && s.clientTop || o && o.clientTop || 0)), !e.relatedTarget && a && (e.relatedTarget = a === e.target ? n.toElement : a), !e.which && u !== t && (e.which = u & 1 ? 1 : u & 2 ? 3 : u & 4 ? 2 : 0), e + } + }, + fix: function(e) { + if (e[v.expando]) return e; + var t, n, r = e, + s = v.event.fixHooks[e.type] || {}, + o = s.props ? this.props.concat(s.props) : this.props; + e = v.Event(r); + for (t = o.length; t;) n = o[--t], e[n] = r[n]; + return e.target || (e.target = r.srcElement || i), e.target.nodeType === 3 && (e.target = e.target.parentNode), e.metaKey = !! e.metaKey, s.filter ? s.filter(e, r) : e + }, + special: { + load: { + noBubble: !0 + }, + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + beforeunload: { + setup: function(e, t, n) { + v.isWindow(this) && (this.onbeforeunload = n) + }, + teardown: function(e, t) { + this.onbeforeunload === t && (this.onbeforeunload = null) + } + } + }, + simulate: function(e, t, n, r) { + var i = v.extend(new v.Event, n, { + type: e, + isSimulated: !0, + originalEvent: {} + }); + r ? v.event.trigger(i, null, t) : v.event.dispatch.call(t, i), i.isDefaultPrevented() && n.preventDefault() + } + }, v.event.handle = v.event.dispatch, v.removeEvent = i.removeEventListener ? + function(e, t, n) { + e.removeEventListener && e.removeEventListener(t, n, !1) + } : function(e, t, n) { + var r = "on" + t; + e.detachEvent && (typeof e[r] == "undefined" && (e[r] = null), e.detachEvent(r, n)) + }, v.Event = function(e, t) { + if (!(this instanceof v.Event)) return new v.Event(e, t); + e && e.type ? (this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || e.returnValue === !1 || e.getPreventDefault && e.getPreventDefault() ? tt : et) : this.type = e, t && v.extend(this, t), this.timeStamp = e && e.timeStamp || v.now(), this[v.expando] = !0 + }, v.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = tt; + var e = this.originalEvent; + if (!e) return; + e.preventDefault ? e.preventDefault() : e.returnValue = !1 + }, + stopPropagation: function() { + this.isPropagationStopped = tt; + var e = this.originalEvent; + if (!e) return; + e.stopPropagation && e.stopPropagation(), e.cancelBubble = !0 + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = tt, this.stopPropagation() + }, + isDefaultPrevented: et, + isPropagationStopped: et, + isImmediatePropagationStopped: et + }, v.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" + }, function(e, t) { + v.event.special[e] = { + delegateType: t, + bindType: t, + handle: function(e) { + var n, r = this, + i = e.relatedTarget, + s = e.handleObj, + o = s.selector; + if (!i || i !== r && !v.contains(r, i)) e.type = s.origType, n = s.handler.apply(this, arguments), e.type = t; + return n + } + } + }), v.support.submitBubbles || (v.event.special.submit = { + setup: function() { + if (v.nodeName(this, "form")) return !1; + v.event.add(this, "click._submit keypress._submit", function(e) { + var n = e.target, + r = v.nodeName(n, "input") || v.nodeName(n, "button") ? n.form : t; + r && !v._data(r, "_submit_attached") && (v.event.add(r, "submit._submit", function(e) { + e._submit_bubble = !0 + }), v._data(r, "_submit_attached", !0)) + }) + }, + postDispatch: function(e) { + e._submit_bubble && (delete e._submit_bubble, this.parentNode && !e.isTrigger && v.event.simulate("submit", this.parentNode, e, !0)) + }, + teardown: function() { + if (v.nodeName(this, "form")) return !1; + v.event.remove(this, "._submit") + } + }), v.support.changeBubbles || (v.event.special.change = { + setup: function() { + if ($.test(this.nodeName)) { + if (this.type === "checkbox" || this.type === "radio") v.event.add(this, "propertychange._change", function(e) { + e.originalEvent.propertyName === "checked" && (this._just_changed = !0) + }), v.event.add(this, "click._change", function(e) { + this._just_changed && !e.isTrigger && (this._just_changed = !1), v.event.simulate("change", this, e, !0) + }); + return !1 + } + v.event.add(this, "beforeactivate._change", function(e) { + var t = e.target; + $.test(t.nodeName) && !v._data(t, "_change_attached") && (v.event.add(t, "change._change", function(e) { + this.parentNode && !e.isSimulated && !e.isTrigger && v.event.simulate("change", this.parentNode, e, !0) + }), v._data(t, "_change_attached", !0)) + }) + }, + handle: function(e) { + var t = e.target; + if (this !== t || e.isSimulated || e.isTrigger || t.type !== "radio" && t.type !== "checkbox") return e.handleObj.handler.apply(this, arguments) + }, + teardown: function() { + return v.event.remove(this, "._change"), !$.test(this.nodeName) + } + }), v.support.focusinBubbles || v.each({ + focus: "focusin", + blur: "focusout" + }, function(e, t) { + var n = 0, + r = function(e) { + v.event.simulate(t, e.target, v.event.fix(e), !0) + }; + v.event.special[t] = { + setup: function() { + n++ === 0 && i.addEventListener(e, r, !0) + }, + teardown: function() { + --n === 0 && i.removeEventListener(e, r, !0) + } + } + }), v.fn.extend({ + on: function(e, n, r, i, s) { + var o, u; + if (typeof e == "object") { + typeof n != "string" && (r = r || n, n = t); + for (u in e) this.on(u, n, r, e[u], s); + return this + } + r == null && i == null ? (i = n, r = n = t) : i == null && (typeof n == "string" ? (i = r, r = t) : (i = r, r = n, n = t)); + if (i === !1) i = et; + else if (!i) return this; + return s === 1 && (o = i, i = function(e) { + return v().off(e), o.apply(this, arguments) + }, i.guid = o.guid || (o.guid = v.guid++)), this.each(function() { + v.event.add(this, e, i, r, n) + }) + }, + one: function(e, t, n, r) { + return this.on(e, t, n, r, 1) + }, + off: function(e, n, r) { + var i, s; + if (e && e.preventDefault && e.handleObj) return i = e.handleObj, v(e.delegateTarget).off(i.namespace ? i.origType + "." + i.namespace : i.origType, i.selector, i.handler), this; + if (typeof e == "object") { + for (s in e) this.off(s, n, e[s]); + return this + } + if (n === !1 || typeof n == "function") r = n, n = t; + return r === !1 && (r = et), this.each(function() { + v.event.remove(this, e, r, n) + }) + }, + bind: function(e, t, n) { + return this.on(e, null, t, n) + }, + unbind: function(e, t) { + return this.off(e, null, t) + }, + live: function(e, t, n) { + return v(this.context).on(e, this.selector, t, n), this + }, + die: function(e, t) { + return v(this.context).off(e, this.selector || "**", t), this + }, + delegate: function(e, t, n, r) { + return this.on(t, e, n, r) + }, + undelegate: function(e, t, n) { + return arguments.length === 1 ? this.off(e, "**") : this.off(t, e || "**", n) + }, + trigger: function(e, t) { + return this.each(function() { + v.event.trigger(e, t, this) + }) + }, + triggerHandler: function(e, t) { + if (this[0]) return v.event.trigger(e, t, this[0], !0) + }, + toggle: function(e) { + var t = arguments, + n = e.guid || v.guid++, + r = 0, + i = function(n) { + var i = (v._data(this, "lastToggle" + e.guid) || 0) % r; + return v._data(this, "lastToggle" + e.guid, i + 1), n.preventDefault(), t[i].apply(this, arguments) || !1 + }; + i.guid = n; + while (r < t.length) t[r++].guid = n; + return this.click(i) + }, + hover: function(e, t) { + return this.mouseenter(e).mouseleave(t || e) + } + }), v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "), function(e, t) { + v.fn[t] = function(e, n) { + return n == null && (n = e, e = null), arguments.length > 0 ? this.on(t, null, e, n) : this.trigger(t) + }, Q.test(t) && (v.event.fixHooks[t] = v.event.keyHooks), G.test(t) && (v.event.fixHooks[t] = v.event.mouseHooks) + }), function(e, t) { + function nt(e, t, n, r) { + n = n || [], t = t || g; + var i, s, a, f, l = t.nodeType; + if (!e || typeof e != "string") return n; + if (l !== 1 && l !== 9) return []; + a = o(t); + if (!a && !r) if (i = R.exec(e)) if (f = i[1]) { + if (l === 9) { + s = t.getElementById(f); + if (!s || !s.parentNode) return n; + if (s.id === f) return n.push(s), n + } else if (t.ownerDocument && (s = t.ownerDocument.getElementById(f)) && u(t, s) && s.id === f) return n.push(s), n + } else { + if (i[2]) return S.apply(n, x.call(t.getElementsByTagName(e), 0)), n; + if ((f = i[3]) && Z && t.getElementsByClassName) return S.apply(n, x.call(t.getElementsByClassName(f), 0)), n + } + return vt(e.replace(j, "$1"), t, n, r, a) + } + + function rt(e) { + return function(t) { + var n = t.nodeName.toLowerCase(); + return n === "input" && t.type === e + } + } + + function it(e) { + return function(t) { + var n = t.nodeName.toLowerCase(); + return (n === "input" || n === "button") && t.type === e + } + } + + function st(e) { + return N(function(t) { + return t = +t, N(function(n, r) { + var i, s = e([], n.length, t), + o = s.length; + while (o--) n[i = s[o]] && (n[i] = !(r[i] = n[i])) + }) + }) + } + + function ot(e, t, n) { + if (e === t) return n; + var r = e.nextSibling; + while (r) { + if (r === t) return -1; + r = r.nextSibling + } + return 1 + } + + function ut(e, t) { + var n, r, s, o, u, a, f, l = L[d][e + " "]; + if (l) return t ? 0 : l.slice(0); + u = e, a = [], f = i.preFilter; + while (u) { + if (!n || (r = F.exec(u))) r && (u = u.slice(r[0].length) || u), a.push(s = []); + n = !1; + if (r = I.exec(u)) s.push(n = new m(r.shift())), u = u.slice(n.length), n.type = r[0].replace(j, " "); + for (o in i.filter)(r = J[o].exec(u)) && (!f[o] || (r = f[o](r))) && (s.push(n = new m(r.shift())), u = u.slice(n.length), n.type = o, n.matches = r); + if (!n) break + } + return t ? u.length : u ? nt.error(e) : L(e, a).slice(0) + } + + function at(e, t, r) { + var i = t.dir, + s = r && t.dir === "parentNode", + o = w++; + return t.first ? + function(t, n, r) { + while (t = t[i]) if (s || t.nodeType === 1) return e(t, n, r) + } : function(t, r, u) { + if (!u) { + var a, f = b + " " + o + " ", + l = f + n; + while (t = t[i]) if (s || t.nodeType === 1) { + if ((a = t[d]) === l) return t.sizset; + if (typeof a == "string" && a.indexOf(f) === 0) { + if (t.sizset) return t + } else { + t[d] = l; + if (e(t, r, u)) return t.sizset = !0, t; + t.sizset = !1 + } + } + } else while (t = t[i]) if (s || t.nodeType === 1) if (e(t, r, u)) return t + } + } + + function ft(e) { + return e.length > 1 ? + function(t, n, r) { + var i = e.length; + while (i--) if (!e[i](t, n, r)) return !1; + return !0 + } : e[0] + } + + function lt(e, t, n, r, i) { + var s, o = [], + u = 0, + a = e.length, + f = t != null; + for (; u < a; u++) if (s = e[u]) if (!n || n(s, r, i)) o.push(s), f && t.push(u); + return o + } + + function ct(e, t, n, r, i, s) { + return r && !r[d] && (r = ct(r)), i && !i[d] && (i = ct(i, s)), N(function(s, o, u, a) { + var f, l, c, h = [], + p = [], + d = o.length, + v = s || dt(t || "*", u.nodeType ? [u] : u, []), + m = e && (s || !t) ? lt(v, h, e, u, a) : v, + g = n ? i || (s ? e : d || r) ? [] : o : m; + n && n(m, g, u, a); + if (r) { + f = lt(g, p), r(f, [], u, a), l = f.length; + while (l--) if (c = f[l]) g[p[l]] = !(m[p[l]] = c) + } + if (s) { + if (i || e) { + if (i) { + f = [], l = g.length; + while (l--)(c = g[l]) && f.push(m[l] = c); + i(null, g = [], f, a) + } + l = g.length; + while (l--)(c = g[l]) && (f = i ? T.call(s, c) : h[l]) > -1 && (s[f] = !(o[f] = c)) + } + } else g = lt(g === o ? g.splice(d, g.length) : g), i ? i(null, o, g, a) : S.apply(o, g) + }) + } + + function ht(e) { + var t, n, r, s = e.length, + o = i.relative[e[0].type], + u = o || i.relative[" "], + a = o ? 1 : 0, + f = at(function(e) { + return e === t + }, u, !0), + l = at(function(e) { + return T.call(t, e) > -1 + }, u, !0), + h = [function(e, n, r) { + return !o && (r || n !== c) || ((t = n).nodeType ? f(e, n, r) : l(e, n, r)) + }]; + for (; a < s; a++) if (n = i.relative[e[a].type]) h = [at(ft(h), n)]; + else { + n = i.filter[e[a].type].apply(null, e[a].matches); + if (n[d]) { + r = ++a; + for (; r < s; r++) if (i.relative[e[r].type]) break; + return ct(a > 1 && ft(h), a > 1 && e.slice(0, a - 1).join("").replace(j, "$1"), n, a < r && ht(e.slice(a, r)), r < s && ht(e = e.slice(r)), r < s && e.join("")) + } + h.push(n) + } + return ft(h) + } + + function pt(e, t) { + var r = t.length > 0, + s = e.length > 0, + o = function(u, a, f, l, h) { + var p, d, v, m = [], + y = 0, + w = "0", + x = u && [], + T = h != null, + N = c, + C = u || s && i.find.TAG("*", h && a.parentNode || a), + k = b += N == null ? 1 : Math.E; + T && (c = a !== g && a, n = o.el); + for (; + (p = C[w]) != null; w++) { + if (s && p) { + for (d = 0; v = e[d]; d++) if (v(p, a, f)) { + l.push(p); + break + } + T && (b = k, n = ++o.el) + } + r && ((p = !v && p) && y--, u && x.push(p)) + } + y += w; + if (r && w !== y) { + for (d = 0; v = t[d]; d++) v(x, m, a, f); + if (u) { + if (y > 0) while (w--)!x[w] && !m[w] && (m[w] = E.call(l)); + m = lt(m) + } + S.apply(l, m), T && !u && m.length > 0 && y + t.length > 1 && nt.uniqueSort(l) + } + return T && (b = k, c = N), x + }; + return o.el = 0, r ? N(o) : o + } + + function dt(e, t, n) { + var r = 0, + i = t.length; + for (; r < i; r++) nt(e, t[r], n); + return n + } + + function vt(e, t, n, r, s) { + var o, u, f, l, c, h = ut(e), + p = h.length; + if (!r && h.length === 1) { + u = h[0] = h[0].slice(0); + if (u.length > 2 && (f = u[0]).type === "ID" && t.nodeType === 9 && !s && i.relative[u[1].type]) { + t = i.find.ID(f.matches[0].replace($, ""), t, s)[0]; + if (!t) return n; + e = e.slice(u.shift().length) + } + for (o = J.POS.test(e) ? -1 : u.length - 1; o >= 0; o--) { + f = u[o]; + if (i.relative[l = f.type]) break; + if (c = i.find[l]) if (r = c(f.matches[0].replace($, ""), z.test(u[0].type) && t.parentNode || t, s)) { + u.splice(o, 1), e = r.length && u.join(""); + if (!e) return S.apply(n, x.call(r, 0)), n; + break + } + } + } + return a(e, h)(r, t, s, n, z.test(e)), n + } + + function mt() {} + var n, r, i, s, o, u, a, f, l, c, h = !0, + p = "undefined", + d = ("sizcache" + Math.random()).replace(".", ""), + m = String, + g = e.document, + y = g.documentElement, + b = 0, + w = 0, + E = [].pop, + S = [].push, + x = [].slice, + T = [].indexOf || + function(e) { + var t = 0, + n = this.length; + for (; t < n; t++) if (this[t] === e) return t; + return -1 + }, + N = function(e, t) { + return e[d] = t == null || t, e + }, + C = function() { + var e = {}, + t = []; + return N(function(n, r) { + return t.push(n) > i.cacheLength && delete e[t.shift()], e[n + " "] = r + }, e) + }, + k = C(), + L = C(), + A = C(), + O = "[\\x20\\t\\r\\n\\f]", + M = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+", + _ = M.replace("w", "w#"), + D = "([*^$|!~]?=)", + P = "\\[" + O + "*(" + M + ")" + O + "*(?:" + D + O + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + _ + ")|)|)" + O + "*\\]", + H = ":(" + M + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + P + ")|[^:]|\\\\.)*|.*))\\)|)", + B = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + O + "*((?:-\\d)?\\d*)" + O + "*\\)|)(?=[^-]|$)", + j = new RegExp("^" + O + "+|((?:^|[^\\\\])(?:\\\\.)*)" + O + "+$", "g"), + F = new RegExp("^" + O + "*," + O + "*"), + I = new RegExp("^" + O + "*([\\x20\\t\\r\\n\\f>+~])" + O + "*"), + q = new RegExp(H), + R = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/, + U = /^:not/, + z = /[\x20\t\r\n\f]*[+~]/, + W = /:not\($/, + X = /h\d/i, + V = /input|select|textarea|button/i, + $ = /\\(?!\\)/g, + J = { + ID: new RegExp("^#(" + M + ")"), + CLASS: new RegExp("^\\.(" + M + ")"), + NAME: new RegExp("^\\[name=['\"]?(" + M + ")['\"]?\\]"), + TAG: new RegExp("^(" + M.replace("w", "w*") + ")"), + ATTR: new RegExp("^" + P), + PSEUDO: new RegExp("^" + H), + POS: new RegExp(B, "i"), + CHILD: new RegExp("^:(only|nth|first|last)-child(?:\\(" + O + "*(even|odd|(([+-]|)(\\d*)n|)" + O + "*(?:([+-]|)" + O + "*(\\d+)|))" + O + "*\\)|)", "i"), + needsContext: new RegExp("^" + O + "*[>+~]|" + B, "i") + }, + K = function(e) { + var t = g.createElement("div"); + try { + return e(t) + } catch (n) { + return !1 + } finally { + t = null + } + }, + Q = K(function(e) { + return e.appendChild(g.createComment("")), !e.getElementsByTagName("*").length + }), + G = K(function(e) { + return e.innerHTML = "", e.firstChild && typeof e.firstChild.getAttribute !== p && e.firstChild.getAttribute("href") === "#" + }), + Y = K(function(e) { + e.innerHTML = ""; + var t = typeof e.lastChild.getAttribute("multiple"); + return t !== "boolean" && t !== "string" + }), + Z = K(function(e) { + return e.innerHTML = "", !e.getElementsByClassName || !e.getElementsByClassName("e").length ? !1 : (e.lastChild.className = "e", e.getElementsByClassName("e").length === 2) + }), + et = K(function(e) { + e.id = d + 0, e.innerHTML = "
", y.insertBefore(e, y.firstChild); + var t = g.getElementsByName && g.getElementsByName(d).length === 2 + g.getElementsByName(d + 0).length; + return r = !g.getElementById(d), y.removeChild(e), t + }); + try { + x.call(y.childNodes, 0)[0].nodeType + } catch (tt) { + x = function(e) { + var t, n = []; + for (; t = this[e]; e++) n.push(t); + return n + } + } + nt.matches = function(e, t) { + return nt(e, null, null, t) + }, nt.matchesSelector = function(e, t) { + return nt(t, null, null, [e]).length > 0 + }, s = nt.getText = function(e) { + var t, n = "", + r = 0, + i = e.nodeType; + if (i) { + if (i === 1 || i === 9 || i === 11) { + if (typeof e.textContent == "string") return e.textContent; + for (e = e.firstChild; e; e = e.nextSibling) n += s(e) + } else if (i === 3 || i === 4) return e.nodeValue + } else for (; t = e[r]; r++) n += s(t); + return n + }, o = nt.isXML = function(e) { + var t = e && (e.ownerDocument || e).documentElement; + return t ? t.nodeName !== "HTML" : !1 + }, u = nt.contains = y.contains ? + function(e, t) { + var n = e.nodeType === 9 ? e.documentElement : e, + r = t && t.parentNode; + return e === r || !! (r && r.nodeType === 1 && n.contains && n.contains(r)) + } : y.compareDocumentPosition ? + function(e, t) { + return t && !! (e.compareDocumentPosition(t) & 16) + } : function(e, t) { + while (t = t.parentNode) if (t === e) return !0; + return !1 + }, nt.attr = function(e, t) { + var n, r = o(e); + return r || (t = t.toLowerCase()), (n = i.attrHandle[t]) ? n(e) : r || Y ? e.getAttribute(t) : (n = e.getAttributeNode(t), n ? typeof e[t] == "boolean" ? e[t] ? t : null : n.specified ? n.value : null : null) + }, i = nt.selectors = { + cacheLength: 50, + createPseudo: N, + match: J, + attrHandle: G ? {} : { + href: function(e) { + return e.getAttribute("href", 2) + }, + type: function(e) { + return e.getAttribute("type") + } + }, + find: { + ID: r ? + function(e, t, n) { + if (typeof t.getElementById !== p && !n) { + var r = t.getElementById(e); + return r && r.parentNode ? [r] : [] + } + } : function(e, n, r) { + if (typeof n.getElementById !== p && !r) { + var i = n.getElementById(e); + return i ? i.id === e || typeof i.getAttributeNode !== p && i.getAttributeNode("id").value === e ? [i] : t : [] + } + }, + TAG: Q ? + function(e, t) { + if (typeof t.getElementsByTagName !== p) return t.getElementsByTagName(e) + } : function(e, t) { + var n = t.getElementsByTagName(e); + if (e === "*") { + var r, i = [], + s = 0; + for (; r = n[s]; s++) r.nodeType === 1 && i.push(r); + return i + } + return n + }, + NAME: et && + function(e, t) { + if (typeof t.getElementsByName !== p) return t.getElementsByName(name) + }, + CLASS: Z && + function(e, t, n) { + if (typeof t.getElementsByClassName !== p && !n) return t.getElementsByClassName(e) + } + }, + relative: { + ">": { + dir: "parentNode", + first: !0 + }, + " ": { + dir: "parentNode" + }, + "+": { + dir: "previousSibling", + first: !0 + }, + "~": { + dir: "previousSibling" + } + }, + preFilter: { + ATTR: function(e) { + return e[1] = e[1].replace($, ""), e[3] = (e[4] || e[5] || "").replace($, ""), e[2] === "~=" && (e[3] = " " + e[3] + " "), e.slice(0, 4) + }, + CHILD: function(e) { + return e[1] = e[1].toLowerCase(), e[1] === "nth" ? (e[2] || nt.error(e[0]), e[3] = +(e[3] ? e[4] + (e[5] || 1) : 2 * (e[2] === "even" || e[2] === "odd")), e[4] = +(e[6] + e[7] || e[2] === "odd")) : e[2] && nt.error(e[0]), e + }, + PSEUDO: function(e) { + var t, n; + if (J.CHILD.test(e[0])) return null; + if (e[3]) e[2] = e[3]; + else if (t = e[4]) q.test(t) && (n = ut(t, !0)) && (n = t.indexOf(")", t.length - n) - t.length) && (t = t.slice(0, n), e[0] = e[0].slice(0, n)), e[2] = t; + return e.slice(0, 3) + } + }, + filter: { + ID: r ? + function(e) { + return e = e.replace($, ""), function(t) { + return t.getAttribute("id") === e + } + } : function(e) { + return e = e.replace($, ""), function(t) { + var n = typeof t.getAttributeNode !== p && t.getAttributeNode("id"); + return n && n.value === e + } + }, + TAG: function(e) { + return e === "*" ? + function() { + return !0 + } : (e = e.replace($, "").toLowerCase(), function(t) { + return t.nodeName && t.nodeName.toLowerCase() === e + }) + }, + CLASS: function(e) { + var t = k[d][e + " "]; + return t || (t = new RegExp("(^|" + O + ")" + e + "(" + O + "|$)")) && k(e, function(e) { + return t.test(e.className || typeof e.getAttribute !== p && e.getAttribute("class") || "") + }) + }, + ATTR: function(e, t, n) { + return function(r, i) { + var s = nt.attr(r, e); + return s == null ? t === "!=" : t ? (s += "", t === "=" ? s === n : t === "!=" ? s !== n : t === "^=" ? n && s.indexOf(n) === 0 : t === "*=" ? n && s.indexOf(n) > -1 : t === "$=" ? n && s.substr(s.length - n.length) === n : t === "~=" ? (" " + s + " ").indexOf(n) > -1 : t === "|=" ? s === n || s.substr(0, n.length + 1) === n + "-" : !1) : !0 + } + }, + CHILD: function(e, t, n, r) { + return e === "nth" ? + function(e) { + var t, i, s = e.parentNode; + if (n === 1 && r === 0) return !0; + if (s) { + i = 0; + for (t = s.firstChild; t; t = t.nextSibling) if (t.nodeType === 1) { + i++; + if (e === t) break + } + } + return i -= r, i === n || i % n === 0 && i / n >= 0 + } : function(t) { + var n = t; + switch (e) { + case "only": + case "first": + while (n = n.previousSibling) if (n.nodeType === 1) return !1; + if (e === "first") return !0; + n = t; + case "last": + while (n = n.nextSibling) if (n.nodeType === 1) return !1; + return !0 + } + } + }, + PSEUDO: function(e, t) { + var n, r = i.pseudos[e] || i.setFilters[e.toLowerCase()] || nt.error("unsupported pseudo: " + e); + return r[d] ? r(t) : r.length > 1 ? (n = [e, e, "", t], i.setFilters.hasOwnProperty(e.toLowerCase()) ? N(function(e, n) { + var i, s = r(e, t), + o = s.length; + while (o--) i = T.call(e, s[o]), e[i] = !(n[i] = s[o]) + }) : function(e) { + return r(e, 0, n) + }) : r + } + }, + pseudos: { + not: N(function(e) { + var t = [], + n = [], + r = a(e.replace(j, "$1")); + return r[d] ? N(function(e, t, n, i) { + var s, o = r(e, null, i, []), + u = e.length; + while (u--) if (s = o[u]) e[u] = !(t[u] = s) + }) : function(e, i, s) { + return t[0] = e, r(t, null, s, n), !n.pop() + } + }), + has: N(function(e) { + return function(t) { + return nt(e, t).length > 0 + } + }), + contains: N(function(e) { + return function(t) { + return (t.textContent || t.innerText || s(t)).indexOf(e) > -1 + } + }), + enabled: function(e) { + return e.disabled === !1 + }, + disabled: function(e) { + return e.disabled === !0 + }, + checked: function(e) { + var t = e.nodeName.toLowerCase(); + return t === "input" && !! e.checked || t === "option" && !! e.selected + }, + selected: function(e) { + return e.parentNode && e.parentNode.selectedIndex, e.selected === !0 + }, + parent: function(e) { + return !i.pseudos.empty(e) + }, + empty: function(e) { + var t; + e = e.firstChild; + while (e) { + if (e.nodeName > "@" || (t = e.nodeType) === 3 || t === 4) return !1; + e = e.nextSibling + } + return !0 + }, + header: function(e) { + return X.test(e.nodeName) + }, + text: function(e) { + var t, n; + return e.nodeName.toLowerCase() === "input" && (t = e.type) === "text" && ((n = e.getAttribute("type")) == null || n.toLowerCase() === t) + }, + radio: rt("radio"), + checkbox: rt("checkbox"), + file: rt("file"), + password: rt("password"), + image: rt("image"), + submit: it("submit"), + reset: it("reset"), + button: function(e) { + var t = e.nodeName.toLowerCase(); + return t === "input" && e.type === "button" || t === "button" + }, + input: function(e) { + return V.test(e.nodeName) + }, + focus: function(e) { + var t = e.ownerDocument; + return e === t.activeElement && (!t.hasFocus || t.hasFocus()) && !! (e.type || e.href || ~e.tabIndex) + }, + active: function(e) { + return e === e.ownerDocument.activeElement + }, + first: st(function() { + return [0] + }), + last: st(function(e, t) { + return [t - 1] + }), + eq: st(function(e, t, n) { + return [n < 0 ? n + t : n] + }), + even: st(function(e, t) { + for (var n = 0; n < t; n += 2) e.push(n); + return e + }), + odd: st(function(e, t) { + for (var n = 1; n < t; n += 2) e.push(n); + return e + }), + lt: st(function(e, t, n) { + for (var r = n < 0 ? n + t : n; --r >= 0;) e.push(r); + return e + }), + gt: st(function(e, t, n) { + for (var r = n < 0 ? n + t : n; ++r < t;) e.push(r); + return e + }) + } + }, f = y.compareDocumentPosition ? + function(e, t) { + return e === t ? (l = !0, 0) : (!e.compareDocumentPosition || !t.compareDocumentPosition ? e.compareDocumentPosition : e.compareDocumentPosition(t) & 4) ? -1 : 1 + } : function(e, t) { + if (e === t) return l = !0, 0; + if (e.sourceIndex && t.sourceIndex) return e.sourceIndex - t.sourceIndex; + var n, r, i = [], + s = [], + o = e.parentNode, + u = t.parentNode, + a = o; + if (o === u) return ot(e, t); + if (!o) return -1; + if (!u) return 1; + while (a) i.unshift(a), a = a.parentNode; + a = u; + while (a) s.unshift(a), a = a.parentNode; + n = i.length, r = s.length; + for (var f = 0; f < n && f < r; f++) if (i[f] !== s[f]) return ot(i[f], s[f]); + return f === n ? ot(e, s[f], -1) : ot(i[f], t, 1) + }, [0, 0].sort(f), h = !l, nt.uniqueSort = function(e) { + var t, n = [], + r = 1, + i = 0; + l = h, e.sort(f); + if (l) { + for (; t = e[r]; r++) t === e[r - 1] && (i = n.push(r)); + while (i--) e.splice(n[i], 1) + } + return e + }, nt.error = function(e) { + throw new Error("Syntax error, unrecognized expression: " + e) + }, a = nt.compile = function(e, t) { + var n, r = [], + i = [], + s = A[d][e + " "]; + if (!s) { + t || (t = ut(e)), n = t.length; + while (n--) s = ht(t[n]), s[d] ? r.push(s) : i.push(s); + s = A(e, pt(i, r)) + } + return s + }, g.querySelectorAll && + function() { + var e, t = vt, + n = /'|\\/g, + r = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, + i = [":focus"], + s = [":active"], + u = y.matchesSelector || y.mozMatchesSelector || y.webkitMatchesSelector || y.oMatchesSelector || y.msMatchesSelector; + K(function(e) { + e.innerHTML = "", e.querySelectorAll("[selected]").length || i.push("\\[" + O + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)"), e.querySelectorAll(":checked").length || i.push(":checked") + }), K(function(e) { + e.innerHTML = "

", e.querySelectorAll("[test^='']").length && i.push("[*^$]=" + O + "*(?:\"\"|'')"), e.innerHTML = "", e.querySelectorAll(":enabled").length || i.push(":enabled", ":disabled") + }), i = new RegExp(i.join("|")), vt = function(e, r, s, o, u) { + if (!o && !u && !i.test(e)) { + var a, f, l = !0, + c = d, + h = r, + p = r.nodeType === 9 && e; + if (r.nodeType === 1 && r.nodeName.toLowerCase() !== "object") { + a = ut(e), (l = r.getAttribute("id")) ? c = l.replace(n, "\\$&") : r.setAttribute("id", c), c = "[id='" + c + "'] ", f = a.length; + while (f--) a[f] = c + a[f].join(""); + h = z.test(e) && r.parentNode || r, p = a.join(",") + } + if (p) try { + return S.apply(s, x.call(h.querySelectorAll(p), 0)), s + } catch (v) {} finally { + l || r.removeAttribute("id") + } + } + return t(e, r, s, o, u) + }, u && (K(function(t) { + e = u.call(t, "div"); + try { + u.call(t, "[test!='']:sizzle"), s.push("!=", H) + } catch (n) {} + }), s = new RegExp(s.join("|")), nt.matchesSelector = function(t, n) { + n = n.replace(r, "='$1']"); + if (!o(t) && !s.test(n) && !i.test(n)) try { + var a = u.call(t, n); + if (a || e || t.document && t.document.nodeType !== 11) return a + } catch (f) {} + return nt(n, null, null, [t]).length > 0 + }) + }(), i.pseudos.nth = i.pseudos.eq, i.filters = mt.prototype = i.pseudos, i.setFilters = new mt, nt.attr = v.attr, v.find = nt, v.expr = nt.selectors, v.expr[":"] = v.expr.pseudos, v.unique = nt.uniqueSort, v.text = nt.getText, v.isXMLDoc = nt.isXML, v.contains = nt.contains + }(e); + var nt = /Until$/, + rt = /^(?:parents|prev(?:Until|All))/, + it = /^.[^:#\[\.,]*$/, + st = v.expr.match.needsContext, + ot = { + children: !0, + contents: !0, + next: !0, + prev: !0 + }; + v.fn.extend({ + find: function(e) { + var t, n, r, i, s, o, u = this; + if (typeof e != "string") return v(e).filter(function() { + for (t = 0, n = u.length; t < n; t++) if (v.contains(u[t], this)) return !0 + }); + o = this.pushStack("", "find", e); + for (t = 0, n = this.length; t < n; t++) { + r = o.length, v.find(e, this[t], o); + if (t > 0) for (i = r; i < o.length; i++) for (s = 0; s < r; s++) if (o[s] === o[i]) { + o.splice(i--, 1); + break + } + } + return o + }, + has: function(e) { + var t, n = v(e, this), + r = n.length; + return this.filter(function() { + for (t = 0; t < r; t++) if (v.contains(this, n[t])) return !0 + }) + }, + not: function(e) { + return this.pushStack(ft(this, e, !1), "not", e) + }, + filter: function(e) { + return this.pushStack(ft(this, e, !0), "filter", e) + }, + is: function(e) { + return !!e && (typeof e == "string" ? st.test(e) ? v(e, this.context).index(this[0]) >= 0 : v.filter(e, this).length > 0 : this.filter(e).length > 0) + }, + closest: function(e, t) { + var n, r = 0, + i = this.length, + s = [], + o = st.test(e) || typeof e != "string" ? v(e, t || this.context) : 0; + for (; r < i; r++) { + n = this[r]; + while (n && n.ownerDocument && n !== t && n.nodeType !== 11) { + if (o ? o.index(n) > -1 : v.find.matchesSelector(n, e)) { + s.push(n); + break + } + n = n.parentNode + } + } + return s = s.length > 1 ? v.unique(s) : s, this.pushStack(s, "closest", e) + }, + index: function(e) { + return e ? typeof e == "string" ? v.inArray(this[0], v(e)) : v.inArray(e.jquery ? e[0] : e, this) : this[0] && this[0].parentNode ? this.prevAll().length : -1 + }, + add: function(e, t) { + var n = typeof e == "string" ? v(e, t) : v.makeArray(e && e.nodeType ? [e] : e), + r = v.merge(this.get(), n); + return this.pushStack(ut(n[0]) || ut(r[0]) ? r : v.unique(r)) + }, + addBack: function(e) { + return this.add(e == null ? this.prevObject : this.prevObject.filter(e)) + } + }), v.fn.andSelf = v.fn.addBack, v.each({ + parent: function(e) { + var t = e.parentNode; + return t && t.nodeType !== 11 ? t : null + }, + parents: function(e) { + return v.dir(e, "parentNode") + }, + parentsUntil: function(e, t, n) { + return v.dir(e, "parentNode", n) + }, + next: function(e) { + return at(e, "nextSibling") + }, + prev: function(e) { + return at(e, "previousSibling") + }, + nextAll: function(e) { + return v.dir(e, "nextSibling") + }, + prevAll: function(e) { + return v.dir(e, "previousSibling") + }, + nextUntil: function(e, t, n) { + return v.dir(e, "nextSibling", n) + }, + prevUntil: function(e, t, n) { + return v.dir(e, "previousSibling", n) + }, + siblings: function(e) { + return v.sibling((e.parentNode || {}).firstChild, e) + }, + children: function(e) { + return v.sibling(e.firstChild) + }, + contents: function(e) { + return v.nodeName(e, "iframe") ? e.contentDocument || e.contentWindow.document : v.merge([], e.childNodes) + } + }, function(e, t) { + v.fn[e] = function(n, r) { + var i = v.map(this, t, n); + return nt.test(e) || (r = n), r && typeof r == "string" && (i = v.filter(r, i)), i = this.length > 1 && !ot[e] ? v.unique(i) : i, this.length > 1 && rt.test(e) && (i = i.reverse()), this.pushStack(i, e, l.call(arguments).join(",")) + } + }), v.extend({ + filter: function(e, t, n) { + return n && (e = ":not(" + e + ")"), t.length === 1 ? v.find.matchesSelector(t[0], e) ? [t[0]] : [] : v.find.matches(e, t) + }, + dir: function(e, n, r) { + var i = [], + s = e[n]; + while (s && s.nodeType !== 9 && (r === t || s.nodeType !== 1 || !v(s).is(r))) s.nodeType === 1 && i.push(s), s = s[n]; + return i + }, + sibling: function(e, t) { + var n = []; + for (; e; e = e.nextSibling) e.nodeType === 1 && e !== t && n.push(e); + return n + } + }); + var ct = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + ht = / jQuery\d+="(?:null|\d+)"/g, + pt = /^\s+/, + dt = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + vt = /<([\w:]+)/, + mt = /]", "i"), + Et = /^(?:checkbox|radio)$/, + St = /checked\s*(?:[^=]|=\s*.checked.)/i, + xt = /\/(java|ecma)script/i, + Tt = /^\s*\s*$/g, + Nt = { + option: [1, ""], + legend: [1, "
", "
"], + thead: [1, "", "
"], + tr: [2, "", "
"], + td: [3, "", "
"], + col: [2, "", "
"], + area: [1, "", ""], + _default: [0, "", ""] + }, + Ct = lt(i), + kt = Ct.appendChild(i.createElement("div")); + Nt.optgroup = Nt.option, Nt.tbody = Nt.tfoot = Nt.colgroup = Nt.caption = Nt.thead, Nt.th = Nt.td, v.support.htmlSerialize || (Nt._default = [1, "X
", "
"]), v.fn.extend({ + text: function(e) { + return v.access(this, function(e) { + return e === t ? v.text(this) : this.empty().append((this[0] && this[0].ownerDocument || i).createTextNode(e)) + }, null, e, arguments.length) + }, + wrapAll: function(e) { + if (v.isFunction(e)) return this.each(function(t) { + v(this).wrapAll(e.call(this, t)) + }); + if (this[0]) { + var t = v(e, this[0].ownerDocument).eq(0).clone(!0); + this[0].parentNode && t.insertBefore(this[0]), t.map(function() { + var e = this; + while (e.firstChild && e.firstChild.nodeType === 1) e = e.firstChild; + return e + }).append(this) + } + return this + }, + wrapInner: function(e) { + return v.isFunction(e) ? this.each(function(t) { + v(this).wrapInner(e.call(this, t)) + }) : this.each(function() { + var t = v(this), + n = t.contents(); + n.length ? n.wrapAll(e) : t.append(e) + }) + }, + wrap: function(e) { + var t = v.isFunction(e); + return this.each(function(n) { + v(this).wrapAll(t ? e.call(this, n) : e) + }) + }, + unwrap: function() { + return this.parent().each(function() { + v.nodeName(this, "body") || v(this).replaceWith(this.childNodes) + }).end() + }, + append: function() { + return this.domManip(arguments, !0, function(e) { + (this.nodeType === 1 || this.nodeType === 11) && this.appendChild(e) + }) + }, + prepend: function() { + return this.domManip(arguments, !0, function(e) { + (this.nodeType === 1 || this.nodeType === 11) && this.insertBefore(e, this.firstChild) + }) + }, + before: function() { + if (!ut(this[0])) return this.domManip(arguments, !1, function(e) { + this.parentNode.insertBefore(e, this) + }); + if (arguments.length) { + var e = v.clean(arguments); + return this.pushStack(v.merge(e, this), "before", this.selector) + } + }, + after: function() { + if (!ut(this[0])) return this.domManip(arguments, !1, function(e) { + this.parentNode.insertBefore(e, this.nextSibling) + }); + if (arguments.length) { + var e = v.clean(arguments); + return this.pushStack(v.merge(this, e), "after", this.selector) + } + }, + remove: function(e, t) { + var n, r = 0; + for (; + (n = this[r]) != null; r++) if (!e || v.filter(e, [n]).length)!t && n.nodeType === 1 && (v.cleanData(n.getElementsByTagName("*")), v.cleanData([n])), n.parentNode && n.parentNode.removeChild(n); + return this + }, + empty: function() { + var e, t = 0; + for (; + (e = this[t]) != null; t++) { + e.nodeType === 1 && v.cleanData(e.getElementsByTagName("*")); + while (e.firstChild) e.removeChild(e.firstChild) + } + return this + }, + clone: function(e, t) { + return e = e == null ? !1 : e, t = t == null ? e : t, this.map(function() { + return v.clone(this, e, t) + }) + }, + html: function(e) { + return v.access(this, function(e) { + var n = this[0] || {}, + r = 0, + i = this.length; + if (e === t) return n.nodeType === 1 ? n.innerHTML.replace(ht, "") : t; + if (typeof e == "string" && !yt.test(e) && (v.support.htmlSerialize || !wt.test(e)) && (v.support.leadingWhitespace || !pt.test(e)) && !Nt[(vt.exec(e) || ["", ""])[1].toLowerCase()]) { + e = e.replace(dt, "<$1>"); + try { + for (; r < i; r++) n = this[r] || {}, n.nodeType === 1 && (v.cleanData(n.getElementsByTagName("*")), n.innerHTML = e); + n = 0 + } catch (s) {} + } + n && this.empty().append(e) + }, null, e, arguments.length) + }, + replaceWith: function(e) { + return ut(this[0]) ? this.length ? this.pushStack(v(v.isFunction(e) ? e() : e), "replaceWith", e) : this : v.isFunction(e) ? this.each(function(t) { + var n = v(this), + r = n.html(); + n.replaceWith(e.call(this, t, r)) + }) : (typeof e != "string" && (e = v(e).detach()), this.each(function() { + var t = this.nextSibling, + n = this.parentNode; + v(this).remove(), t ? v(t).before(e) : v(n).append(e) + })) + }, + detach: function(e) { + return this.remove(e, !0) + }, + domManip: function(e, n, r) { + e = [].concat.apply([], e); + var i, s, o, u, a = 0, + f = e[0], + l = [], + c = this.length; + if (!v.support.checkClone && c > 1 && typeof f == "string" && St.test(f)) return this.each(function() { + v(this).domManip(e, n, r) + }); + if (v.isFunction(f)) return this.each(function(i) { + var s = v(this); + e[0] = f.call(this, i, n ? s.html() : t), s.domManip(e, n, r) + }); + if (this[0]) { + i = v.buildFragment(e, this, l), o = i.fragment, s = o.firstChild, o.childNodes.length === 1 && (o = s); + if (s) { + n = n && v.nodeName(s, "tr"); + for (u = i.cacheable || c - 1; a < c; a++) r.call(n && v.nodeName(this[a], "table") ? Lt(this[a], "tbody") : this[a], a === u ? o : v.clone(o, !0, !0)) + } + o = s = null, l.length && v.each(l, function(e, t) { + t.src ? v.ajax ? v.ajax({ + url: t.src, + type: "GET", + dataType: "script", + async: !1, + global: !1, + "throws": !0 + }) : v.error("no ajax") : v.globalEval((t.text || t.textContent || t.innerHTML || "").replace(Tt, "")), t.parentNode && t.parentNode.removeChild(t) + }) + } + return this + } + }), v.buildFragment = function(e, n, r) { + var s, o, u, a = e[0]; + return n = n || i, n = !n.nodeType && n[0] || n, n = n.ownerDocument || n, e.length === 1 && typeof a == "string" && a.length < 512 && n === i && a.charAt(0) === "<" && !bt.test(a) && (v.support.checkClone || !St.test(a)) && (v.support.html5Clone || !wt.test(a)) && (o = !0, s = v.fragments[a], u = s !== t), s || (s = n.createDocumentFragment(), v.clean(e, n, s, r), o && (v.fragments[a] = u && s)), { + fragment: s, + cacheable: o + } + }, v.fragments = {}, v.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" + }, function(e, t) { + v.fn[e] = function(n) { + var r, i = 0, + s = [], + o = v(n), + u = o.length, + a = this.length === 1 && this[0].parentNode; + if ((a == null || a && a.nodeType === 11 && a.childNodes.length === 1) && u === 1) return o[t](this[0]), this; + for (; i < u; i++) r = (i > 0 ? this.clone(!0) : this).get(), v(o[i])[t](r), s = s.concat(r); + return this.pushStack(s, e, o.selector) + } + }), v.extend({ + clone: function(e, t, n) { + var r, i, s, o; + v.support.html5Clone || v.isXMLDoc(e) || !wt.test("<" + e.nodeName + ">") ? o = e.cloneNode(!0) : (kt.innerHTML = e.outerHTML, kt.removeChild(o = kt.firstChild)); + if ((!v.support.noCloneEvent || !v.support.noCloneChecked) && (e.nodeType === 1 || e.nodeType === 11) && !v.isXMLDoc(e)) { + Ot(e, o), r = Mt(e), i = Mt(o); + for (s = 0; r[s]; ++s) i[s] && Ot(r[s], i[s]) + } + if (t) { + At(e, o); + if (n) { + r = Mt(e), i = Mt(o); + for (s = 0; r[s]; ++s) At(r[s], i[s]) + } + } + return r = i = null, o + }, + clean: function(e, t, n, r) { + var s, o, u, a, f, l, c, h, p, d, m, g, y = t === i && Ct, + b = []; + if (!t || typeof t.createDocumentFragment == "undefined") t = i; + for (s = 0; + (u = e[s]) != null; s++) { + typeof u == "number" && (u += ""); + if (!u) continue; + if (typeof u == "string") if (!gt.test(u)) u = t.createTextNode(u); + else { + y = y || lt(t), c = t.createElement("div"), y.appendChild(c), u = u.replace(dt, "<$1>"), a = (vt.exec(u) || ["", ""])[1].toLowerCase(), f = Nt[a] || Nt._default, l = f[0], c.innerHTML = f[1] + u + f[2]; + while (l--) c = c.lastChild; + if (!v.support.tbody) { + h = mt.test(u), p = a === "table" && !h ? c.firstChild && c.firstChild.childNodes : f[1] === "" && !h ? c.childNodes : []; + for (o = p.length - 1; o >= 0; --o) v.nodeName(p[o], "tbody") && !p[o].childNodes.length && p[o].parentNode.removeChild(p[o]) + }!v.support.leadingWhitespace && pt.test(u) && c.insertBefore(t.createTextNode(pt.exec(u)[0]), c.firstChild), u = c.childNodes, c.parentNode.removeChild(c) + } + u.nodeType ? b.push(u) : v.merge(b, u) + } + c && (u = c = y = null); + if (!v.support.appendChecked) for (s = 0; + (u = b[s]) != null; s++) v.nodeName(u, "input") ? _t(u) : typeof u.getElementsByTagName != "undefined" && v.grep(u.getElementsByTagName("input"), _t); + if (n) { + m = function(e) { + if (!e.type || xt.test(e.type)) return r ? r.push(e.parentNode ? e.parentNode.removeChild(e) : e) : n.appendChild(e) + }; + for (s = 0; + (u = b[s]) != null; s++) if (!v.nodeName(u, "script") || !m(u)) n.appendChild(u), typeof u.getElementsByTagName != "undefined" && (g = v.grep(v.merge([], u.getElementsByTagName("script")), m), b.splice.apply(b, [s + 1, 0].concat(g)), s += g.length) + } + return b + }, + cleanData: function(e, t) { + var n, r, i, s, o = 0, + u = v.expando, + a = v.cache, + f = v.support.deleteExpando, + l = v.event.special; + for (; + (i = e[o]) != null; o++) if (t || v.acceptData(i)) { + r = i[u], n = r && a[r]; + if (n) { + if (n.events) for (s in n.events) l[s] ? v.event.remove(i, s) : v.removeEvent(i, s, n.handle); + a[r] && (delete a[r], f ? delete i[u] : i.removeAttribute ? i.removeAttribute(u) : i[u] = null, v.deletedIds.push(r)) + } + } + } + }), function() { + var e, t; + v.uaMatch = function(e) { + e = e.toLowerCase(); + var t = /(chrome)[ \/]([\w.]+)/.exec(e) || /(webkit)[ \/]([\w.]+)/.exec(e) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e) || /(msie) ([\w.]+)/.exec(e) || e.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e) || []; + return { + browser: t[1] || "", + version: t[2] || "0" + } + }, e = v.uaMatch(o.userAgent), t = {}, e.browser && (t[e.browser] = !0, t.version = e.version), t.chrome ? t.webkit = !0 : t.webkit && (t.safari = !0), v.browser = t, v.sub = function() { + function e(t, n) { + return new e.fn.init(t, n) + } + v.extend(!0, e, this), e.superclass = this, e.fn = e.prototype = this(), e.fn.constructor = e, e.sub = this.sub, e.fn.init = function(r, i) { + return i && i instanceof v && !(i instanceof e) && (i = e(i)), v.fn.init.call(this, r, i, t) + }, e.fn.init.prototype = e.fn; + var t = e(i); + return e + } + }(); + var Dt, Pt, Ht, Bt = /alpha\([^)]*\)/i, + jt = /opacity=([^)]*)/, + Ft = /^(top|right|bottom|left)$/, + It = /^(none|table(?!-c[ea]).+)/, + qt = /^margin/, + Rt = new RegExp("^(" + m + ")(.*)$", "i"), + Ut = new RegExp("^(" + m + ")(?!px)[a-z%]+$", "i"), + zt = new RegExp("^([-+])=(" + m + ")", "i"), + Wt = { + BODY: "block" + }, + Xt = { + position: "absolute", + visibility: "hidden", + display: "block" + }, + Vt = { + letterSpacing: 0, + fontWeight: 400 + }, + $t = ["Top", "Right", "Bottom", "Left"], + Jt = ["Webkit", "O", "Moz", "ms"], + Kt = v.fn.toggle; + v.fn.extend({ + css: function(e, n) { + return v.access(this, function(e, n, r) { + return r !== t ? v.style(e, n, r) : v.css(e, n) + }, e, n, arguments.length > 1) + }, + show: function() { + return Yt(this, !0) + }, + hide: function() { + return Yt(this) + }, + toggle: function(e, t) { + var n = typeof e == "boolean"; + return v.isFunction(e) && v.isFunction(t) ? Kt.apply(this, arguments) : this.each(function() { + (n ? e : Gt(this)) ? v(this).show() : v(this).hide() + }) + } + }), v.extend({ + cssHooks: { + opacity: { + get: function(e, t) { + if (t) { + var n = Dt(e, "opacity"); + return n === "" ? "1" : n + } + } + } + }, + cssNumber: { + fillOpacity: !0, + fontWeight: !0, + lineHeight: !0, + opacity: !0, + orphans: !0, + widows: !0, + zIndex: !0, + zoom: !0 + }, + cssProps: { + "float": v.support.cssFloat ? "cssFloat" : "styleFloat" + }, + style: function(e, n, r, i) { + if (!e || e.nodeType === 3 || e.nodeType === 8 || !e.style) return; + var s, o, u, a = v.camelCase(n), + f = e.style; + n = v.cssProps[a] || (v.cssProps[a] = Qt(f, a)), u = v.cssHooks[n] || v.cssHooks[a]; + if (r === t) return u && "get" in u && (s = u.get(e, !1, i)) !== t ? s : f[n]; + o = typeof r, o === "string" && (s = zt.exec(r)) && (r = (s[1] + 1) * s[2] + parseFloat(v.css(e, n)), o = "number"); + if (r == null || o === "number" && isNaN(r)) return; + o === "number" && !v.cssNumber[a] && (r += "px"); + if (!u || !("set" in u) || (r = u.set(e, r, i)) !== t) try { + f[n] = r + } catch (l) {} + }, + css: function(e, n, r, i) { + var s, o, u, a = v.camelCase(n); + return n = v.cssProps[a] || (v.cssProps[a] = Qt(e.style, a)), u = v.cssHooks[n] || v.cssHooks[a], u && "get" in u && (s = u.get(e, !0, i)), s === t && (s = Dt(e, n)), s === "normal" && n in Vt && (s = Vt[n]), r || i !== t ? (o = parseFloat(s), r || v.isNumeric(o) ? o || 0 : s) : s + }, + swap: function(e, t, n) { + var r, i, s = {}; + for (i in t) s[i] = e.style[i], e.style[i] = t[i]; + r = n.call(e); + for (i in t) e.style[i] = s[i]; + return r + } + }), e.getComputedStyle ? Dt = function(t, n) { + var r, i, s, o, u = e.getComputedStyle(t, null), + a = t.style; + return u && (r = u.getPropertyValue(n) || u[n], r === "" && !v.contains(t.ownerDocument, t) && (r = v.style(t, n)), Ut.test(r) && qt.test(n) && (i = a.width, s = a.minWidth, o = a.maxWidth, a.minWidth = a.maxWidth = a.width = r, r = u.width, a.width = i, a.minWidth = s, a.maxWidth = o)), r + } : i.documentElement.currentStyle && (Dt = function(e, t) { + var n, r, i = e.currentStyle && e.currentStyle[t], + s = e.style; + return i == null && s && s[t] && (i = s[t]), Ut.test(i) && !Ft.test(t) && (n = s.left, r = e.runtimeStyle && e.runtimeStyle.left, r && (e.runtimeStyle.left = e.currentStyle.left), s.left = t === "fontSize" ? "1em" : i, i = s.pixelLeft + "px", s.left = n, r && (e.runtimeStyle.left = r)), i === "" ? "auto" : i + }), v.each(["height", "width"], function(e, t) { + v.cssHooks[t] = { + get: function(e, n, r) { + if (n) return e.offsetWidth === 0 && It.test(Dt(e, "display")) ? v.swap(e, Xt, function() { + return tn(e, t, r) + }) : tn(e, t, r) + }, + set: function(e, n, r) { + return Zt(e, n, r ? en(e, t, r, v.support.boxSizing && v.css(e, "boxSizing") === "border-box") : 0) + } + } + }), v.support.opacity || (v.cssHooks.opacity = { + get: function(e, t) { + return jt.test((t && e.currentStyle ? e.currentStyle.filter : e.style.filter) || "") ? .01 * parseFloat(RegExp.$1) + "" : t ? "1" : "" + }, + set: function(e, t) { + var n = e.style, + r = e.currentStyle, + i = v.isNumeric(t) ? "alpha(opacity=" + t * 100 + ")" : "", + s = r && r.filter || n.filter || ""; + n.zoom = 1; + if (t >= 1 && v.trim(s.replace(Bt, "")) === "" && n.removeAttribute) { + n.removeAttribute("filter"); + if (r && !r.filter) return + } + n.filter = Bt.test(s) ? s.replace(Bt, i) : s + " " + i + } + }), v(function() { + v.support.reliableMarginRight || (v.cssHooks.marginRight = { + get: function(e, t) { + return v.swap(e, { + display: "inline-block" + }, function() { + if (t) return Dt(e, "marginRight") + }) + } + }), !v.support.pixelPosition && v.fn.position && v.each(["top", "left"], function(e, t) { + v.cssHooks[t] = { + get: function(e, n) { + if (n) { + var r = Dt(e, t); + return Ut.test(r) ? v(e).position()[t] + "px" : r + } + } + } + }) + }), v.expr && v.expr.filters && (v.expr.filters.hidden = function(e) { + return e.offsetWidth === 0 && e.offsetHeight === 0 || !v.support.reliableHiddenOffsets && (e.style && e.style.display || Dt(e, "display")) === "none" + }, v.expr.filters.visible = function(e) { + return !v.expr.filters.hidden(e) + }), v.each({ + margin: "", + padding: "", + border: "Width" + }, function(e, t) { + v.cssHooks[e + t] = { + expand: function(n) { + var r, i = typeof n == "string" ? n.split(" ") : [n], + s = {}; + for (r = 0; r < 4; r++) s[e + $t[r] + t] = i[r] || i[r - 2] || i[0]; + return s + } + }, qt.test(e) || (v.cssHooks[e + t].set = Zt) + }); + var rn = /%20/g, + sn = /\[\]$/, + on = /\r?\n/g, + un = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, + an = /^(?:select|textarea)/i; + v.fn.extend({ + serialize: function() { + return v.param(this.serializeArray()) + }, + serializeArray: function() { + return this.map(function() { + return this.elements ? v.makeArray(this.elements) : this + }).filter(function() { + return this.name && !this.disabled && (this.checked || an.test(this.nodeName) || un.test(this.type)) + }).map(function(e, t) { + var n = v(this).val(); + return n == null ? null : v.isArray(n) ? v.map(n, function(e, n) { + return { + name: t.name, + value: e.replace(on, "\r\n") + } + }) : { + name: t.name, + value: n.replace(on, "\r\n") + } + }).get() + } + }), v.param = function(e, n) { + var r, i = [], + s = function(e, t) { + t = v.isFunction(t) ? t() : t == null ? "" : t, i[i.length] = encodeURIComponent(e) + "=" + encodeURIComponent(t) + }; + n === t && (n = v.ajaxSettings && v.ajaxSettings.traditional); + if (v.isArray(e) || e.jquery && !v.isPlainObject(e)) v.each(e, function() { + s(this.name, this.value) + }); + else for (r in e) fn(r, e[r], n, s); + return i.join("&").replace(rn, "+") + }; + var ln, cn, hn = /#.*$/, + pn = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, + dn = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/, + vn = /^(?:GET|HEAD)$/, + mn = /^\/\//, + gn = /\?/, + yn = /)<[^<]*)*<\/script>/gi, + bn = /([?&])_=[^&]*/, + wn = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/, + En = v.fn.load, + Sn = {}, + xn = {}, + Tn = ["*/"] + ["*"]; + try { + cn = s.href + } catch (Nn) { + cn = i.createElement("a"), cn.href = "", cn = cn.href + } + ln = wn.exec(cn.toLowerCase()) || [], v.fn.load = function(e, n, r) { + if (typeof e != "string" && En) return En.apply(this, arguments); + if (!this.length) return this; + var i, s, o, u = this, + a = e.indexOf(" "); + return a >= 0 && (i = e.slice(a, e.length), e = e.slice(0, a)), v.isFunction(n) ? (r = n, n = t) : n && typeof n == "object" && (s = "POST"), v.ajax({ + url: e, + type: s, + dataType: "html", + data: n, + complete: function(e, t) { + r && u.each(r, o || [e.responseText, t, e]) + } + }).done(function(e) { + o = arguments, u.html(i ? v("
").append(e.replace(yn, "")).find(i) : e) + }), this + }, v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function(e, t) { + v.fn[t] = function(e) { + return this.on(t, e) + } + }), v.each(["get", "post"], function(e, n) { + v[n] = function(e, r, i, s) { + return v.isFunction(r) && (s = s || i, i = r, r = t), v.ajax({ + type: n, + url: e, + data: r, + success: i, + dataType: s + }) + } + }), v.extend({ + getScript: function(e, n) { + return v.get(e, t, n, "script") + }, + getJSON: function(e, t, n) { + return v.get(e, t, n, "json") + }, + ajaxSetup: function(e, t) { + return t ? Ln(e, v.ajaxSettings) : (t = e, e = v.ajaxSettings), Ln(e, t), e + }, + ajaxSettings: { + url: cn, + isLocal: dn.test(ln[1]), + global: !0, + type: "GET", + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + processData: !0, + async: !0, + accepts: { + xml: "application/xml, text/xml", + html: "text/html", + text: "text/plain", + json: "application/json, text/javascript", + "*": Tn + }, + contents: { + xml: /xml/, + html: /html/, + json: /json/ + }, + responseFields: { + xml: "responseXML", + text: "responseText" + }, + converters: { + "* text": e.String, + "text html": !0, + "text json": v.parseJSON, + "text xml": v.parseXML + }, + flatOptions: { + context: !0, + url: !0 + } + }, + ajaxPrefilter: Cn(Sn), + ajaxTransport: Cn(xn), + ajax: function(e, n) { + function T(e, n, s, a) { + var l, y, b, w, S, T = n; + if (E === 2) return; + E = 2, u && clearTimeout(u), o = t, i = a || "", x.readyState = e > 0 ? 4 : 0, s && (w = An(c, x, s)); + if (e >= 200 && e < 300 || e === 304) c.ifModified && (S = x.getResponseHeader("Last-Modified"), S && (v.lastModified[r] = S), S = x.getResponseHeader("Etag"), S && (v.etag[r] = S)), e === 304 ? (T = "notmodified", l = !0) : (l = On(c, w), T = l.state, y = l.data, b = l.error, l = !b); + else { + b = T; + if (!T || e) T = "error", e < 0 && (e = 0) + } + x.status = e, x.statusText = (n || T) + "", l ? d.resolveWith(h, [y, T, x]) : d.rejectWith(h, [x, T, b]), x.statusCode(g), g = t, f && p.trigger("ajax" + (l ? "Success" : "Error"), [x, c, l ? y : b]), m.fireWith(h, [x, T]), f && (p.trigger("ajaxComplete", [x, c]), --v.active || v.event.trigger("ajaxStop")) + } + typeof e == "object" && (n = e, e = t), n = n || {}; + var r, i, s, o, u, a, f, l, c = v.ajaxSetup({}, n), + h = c.context || c, + p = h !== c && (h.nodeType || h instanceof v) ? v(h) : v.event, + d = v.Deferred(), + m = v.Callbacks("once memory"), + g = c.statusCode || {}, + b = {}, + w = {}, + E = 0, + S = "canceled", + x = { + readyState: 0, + setRequestHeader: function(e, t) { + if (!E) { + var n = e.toLowerCase(); + e = w[n] = w[n] || e, b[e] = t + } + return this + }, + getAllResponseHeaders: function() { + return E === 2 ? i : null + }, + getResponseHeader: function(e) { + var n; + if (E === 2) { + if (!s) { + s = {}; + while (n = pn.exec(i)) s[n[1].toLowerCase()] = n[2] + } + n = s[e.toLowerCase()] + } + return n === t ? null : n + }, + overrideMimeType: function(e) { + return E || (c.mimeType = e), this + }, + abort: function(e) { + return e = e || S, o && o.abort(e), T(0, e), this + } + }; + d.promise(x), x.success = x.done, x.error = x.fail, x.complete = m.add, x.statusCode = function(e) { + if (e) { + var t; + if (E < 2) for (t in e) g[t] = [g[t], e[t]]; + else t = e[x.status], x.always(t) + } + return this + }, c.url = ((e || c.url) + "").replace(hn, "").replace(mn, ln[1] + "//"), c.dataTypes = v.trim(c.dataType || "*").toLowerCase().split(y), c.crossDomain == null && (a = wn.exec(c.url.toLowerCase()), c.crossDomain = !(!a || a[1] === ln[1] && a[2] === ln[2] && (a[3] || (a[1] === "http:" ? 80 : 443)) == (ln[3] || (ln[1] === "http:" ? 80 : 443)))), c.data && c.processData && typeof c.data != "string" && (c.data = v.param(c.data, c.traditional)), kn(Sn, c, n, x); + if (E === 2) return x; + f = c.global, c.type = c.type.toUpperCase(), c.hasContent = !vn.test(c.type), f && v.active++ === 0 && v.event.trigger("ajaxStart"); + if (!c.hasContent) { + c.data && (c.url += (gn.test(c.url) ? "&" : "?") + c.data, delete c.data), r = c.url; + if (c.cache === !1) { + var N = v.now(), + C = c.url.replace(bn, "$1_=" + N); + c.url = C + (C === c.url ? (gn.test(c.url) ? "&" : "?") + "_=" + N : "") + } + }(c.data && c.hasContent && c.contentType !== !1 || n.contentType) && x.setRequestHeader("Content-Type", c.contentType), c.ifModified && (r = r || c.url, v.lastModified[r] && x.setRequestHeader("If-Modified-Since", v.lastModified[r]), v.etag[r] && x.setRequestHeader("If-None-Match", v.etag[r])), x.setRequestHeader("Accept", c.dataTypes[0] && c.accepts[c.dataTypes[0]] ? c.accepts[c.dataTypes[0]] + (c.dataTypes[0] !== "*" ? ", " + Tn + "; q=0.01" : "") : c.accepts["*"]); + for (l in c.headers) x.setRequestHeader(l, c.headers[l]); + if (!c.beforeSend || c.beforeSend.call(h, x, c) !== !1 && E !== 2) { + S = "abort"; + for (l in { + success: 1, + error: 1, + complete: 1 + }) x[l](c[l]); + o = kn(xn, c, n, x); + if (!o) T(-1, "No Transport"); + else { + x.readyState = 1, f && p.trigger("ajaxSend", [x, c]), c.async && c.timeout > 0 && (u = setTimeout(function() { + x.abort("timeout") + }, c.timeout)); + try { + E = 1, o.send(b, T) + } catch (k) { + if (!(E < 2)) throw k; + T(-1, k) + } + } + return x + } + return x.abort() + }, + active: 0, + lastModified: {}, + etag: {} + }); + var Mn = [], + _n = /\?/, + Dn = /(=)\?(?=&|$)|\?\?/, + Pn = v.now(); + v.ajaxSetup({ + jsonp: "callback", + jsonpCallback: function() { + var e = Mn.pop() || v.expando + "_" + Pn++; + return this[e] = !0, e + } + }), v.ajaxPrefilter("json jsonp", function(n, r, i) { + var s, o, u, a = n.data, + f = n.url, + l = n.jsonp !== !1, + c = l && Dn.test(f), + h = l && !c && typeof a == "string" && !(n.contentType || "").indexOf("application/x-www-form-urlencoded") && Dn.test(a); + if (n.dataTypes[0] === "jsonp" || c || h) return s = n.jsonpCallback = v.isFunction(n.jsonpCallback) ? n.jsonpCallback() : n.jsonpCallback, o = e[s], c ? n.url = f.replace(Dn, "$1" + s) : h ? n.data = a.replace(Dn, "$1" + s) : l && (n.url += (_n.test(f) ? "&" : "?") + n.jsonp + "=" + s), n.converters["script json"] = function() { + return u || v.error(s + " was not called"), u[0] + }, n.dataTypes[0] = "json", e[s] = function() { + u = arguments + }, i.always(function() { + e[s] = o, n[s] && (n.jsonpCallback = r.jsonpCallback, Mn.push(s)), u && v.isFunction(o) && o(u[0]), u = o = t + }), "script" + }), v.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /javascript|ecmascript/ + }, + converters: { + "text script": function(e) { + return v.globalEval(e), e + } + } + }), v.ajaxPrefilter("script", function(e) { + e.cache === t && (e.cache = !1), e.crossDomain && (e.type = "GET", e.global = !1) + }), v.ajaxTransport("script", function(e) { + if (e.crossDomain) { + var n, r = i.head || i.getElementsByTagName("head")[0] || i.documentElement; + return { + send: function(s, o) { + n = i.createElement("script"), n.async = "async", e.scriptCharset && (n.charset = e.scriptCharset), n.src = e.url, n.onload = n.onreadystatechange = function(e, i) { + if (i || !n.readyState || /loaded|complete/.test(n.readyState)) n.onload = n.onreadystatechange = null, r && n.parentNode && r.removeChild(n), n = t, i || o(200, "success") + }, r.insertBefore(n, r.firstChild) + }, + abort: function() { + n && n.onload(0, 1) + } + } + } + }); + var Hn, Bn = e.ActiveXObject ? + function() { + for (var e in Hn) Hn[e](0, 1) + } : !1, + jn = 0; + v.ajaxSettings.xhr = e.ActiveXObject ? + function() { + return !this.isLocal && Fn() || In() + } : Fn, function(e) { + v.extend(v.support, { + ajax: !! e, + cors: !! e && "withCredentials" in e + }) + }(v.ajaxSettings.xhr()), v.support.ajax && v.ajaxTransport(function(n) { + if (!n.crossDomain || v.support.cors) { + var r; + return { + send: function(i, s) { + var o, u, a = n.xhr(); + n.username ? a.open(n.type, n.url, n.async, n.username, n.password) : a.open(n.type, n.url, n.async); + if (n.xhrFields) for (u in n.xhrFields) a[u] = n.xhrFields[u]; + n.mimeType && a.overrideMimeType && a.overrideMimeType(n.mimeType), !n.crossDomain && !i["X-Requested-With"] && (i["X-Requested-With"] = "XMLHttpRequest"); + try { + for (u in i) a.setRequestHeader(u, i[u]) + } catch (f) {} + a.send(n.hasContent && n.data || null), r = function(e, i) { + var u, f, l, c, h; + try { + if (r && (i || a.readyState === 4)) { + r = t, o && (a.onreadystatechange = v.noop, Bn && delete Hn[o]); + if (i) a.readyState !== 4 && a.abort(); + else { + u = a.status, l = a.getAllResponseHeaders(), c = {}, h = a.responseXML, h && h.documentElement && (c.xml = h); + try { + c.text = a.responseText + } catch (p) {} + try { + f = a.statusText + } catch (p) { + f = "" + }!u && n.isLocal && !n.crossDomain ? u = c.text ? 200 : 404 : u === 1223 && (u = 204) + } + } + } catch (d) { + i || s(-1, d) + } + c && s(u, f, c, l) + }, n.async ? a.readyState === 4 ? setTimeout(r, 0) : (o = ++jn, Bn && (Hn || (Hn = {}, v(e).unload(Bn)), Hn[o] = r), a.onreadystatechange = r) : r() + }, + abort: function() { + r && r(0, 1) + } + } + } + }); + var qn, Rn, Un = /^(?:toggle|show|hide)$/, + zn = new RegExp("^(?:([-+])=|)(" + m + ")([a-z%]*)$", "i"), + Wn = /queueHooks$/, + Xn = [Gn], + Vn = { + "*": [function(e, t) { + var n, r, i = this.createTween(e, t), + s = zn.exec(t), + o = i.cur(), + u = +o || 0, + a = 1, + f = 20; + if (s) { + n = +s[2], r = s[3] || (v.cssNumber[e] ? "" : "px"); + if (r !== "px" && u) { + u = v.css(i.elem, e, !0) || n || 1; + do a = a || ".5", u /= a, v.style(i.elem, e, u + r); + while (a !== (a = i.cur() / o) && a !== 1 && --f) + } + i.unit = r, i.start = u, i.end = s[1] ? u + (s[1] + 1) * n : n + } + return i + }] + }; + v.Animation = v.extend(Kn, { + tweener: function(e, t) { + v.isFunction(e) ? (t = e, e = ["*"]) : e = e.split(" "); + var n, r = 0, + i = e.length; + for (; r < i; r++) n = e[r], Vn[n] = Vn[n] || [], Vn[n].unshift(t) + }, + prefilter: function(e, t) { + t ? Xn.unshift(e) : Xn.push(e) + } + }), v.Tween = Yn, Yn.prototype = { + constructor: Yn, + init: function(e, t, n, r, i, s) { + this.elem = e, this.prop = n, this.easing = i || "swing", this.options = t, this.start = this.now = this.cur(), this.end = r, this.unit = s || (v.cssNumber[n] ? "" : "px") + }, + cur: function() { + var e = Yn.propHooks[this.prop]; + return e && e.get ? e.get(this) : Yn.propHooks._default.get(this) + }, + run: function(e) { + var t, n = Yn.propHooks[this.prop]; + return this.options.duration ? this.pos = t = v.easing[this.easing](e, this.options.duration * e, 0, 1, this.options.duration) : this.pos = t = e, this.now = (this.end - this.start) * t + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), n && n.set ? n.set(this) : Yn.propHooks._default.set(this), this + } + }, Yn.prototype.init.prototype = Yn.prototype, Yn.propHooks = { + _default: { + get: function(e) { + var t; + return e.elem[e.prop] == null || !! e.elem.style && e.elem.style[e.prop] != null ? (t = v.css(e.elem, e.prop, !1, ""), !t || t === "auto" ? 0 : t) : e.elem[e.prop] + }, + set: function(e) { + v.fx.step[e.prop] ? v.fx.step[e.prop](e) : e.elem.style && (e.elem.style[v.cssProps[e.prop]] != null || v.cssHooks[e.prop]) ? v.style(e.elem, e.prop, e.now + e.unit) : e.elem[e.prop] = e.now + } + } + }, Yn.propHooks.scrollTop = Yn.propHooks.scrollLeft = { + set: function(e) { + e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now) + } + }, v.each(["toggle", "show", "hide"], function(e, t) { + var n = v.fn[t]; + v.fn[t] = function(r, i, s) { + return r == null || typeof r == "boolean" || !e && v.isFunction(r) && v.isFunction(i) ? n.apply(this, arguments) : this.animate(Zn(t, !0), r, i, s) + } + }), v.fn.extend({ + fadeTo: function(e, t, n, r) { + return this.filter(Gt).css("opacity", 0).show().end().animate({ + opacity: t + }, e, n, r) + }, + animate: function(e, t, n, r) { + var i = v.isEmptyObject(e), + s = v.speed(t, n, r), + o = function() { + var t = Kn(this, v.extend({}, e), s); + i && t.stop(!0) + }; + return i || s.queue === !1 ? this.each(o) : this.queue(s.queue, o) + }, + stop: function(e, n, r) { + var i = function(e) { + var t = e.stop; + delete e.stop, t(r) + }; + return typeof e != "string" && (r = n, n = e, e = t), n && e !== !1 && this.queue(e || "fx", []), this.each(function() { + var t = !0, + n = e != null && e + "queueHooks", + s = v.timers, + o = v._data(this); + if (n) o[n] && o[n].stop && i(o[n]); + else for (n in o) o[n] && o[n].stop && Wn.test(n) && i(o[n]); + for (n = s.length; n--;) s[n].elem === this && (e == null || s[n].queue === e) && (s[n].anim.stop(r), t = !1, s.splice(n, 1)); + (t || !r) && v.dequeue(this, e) + }) + } + }), v.each({ + slideDown: Zn("show"), + slideUp: Zn("hide"), + slideToggle: Zn("toggle"), + fadeIn: { + opacity: "show" + }, + fadeOut: { + opacity: "hide" + }, + fadeToggle: { + opacity: "toggle" + } + }, function(e, t) { + v.fn[e] = function(e, n, r) { + return this.animate(t, e, n, r) + } + }), v.speed = function(e, t, n) { + var r = e && typeof e == "object" ? v.extend({}, e) : { + complete: n || !n && t || v.isFunction(e) && e, + duration: e, + easing: n && t || t && !v.isFunction(t) && t + }; + r.duration = v.fx.off ? 0 : typeof r.duration == "number" ? r.duration : r.duration in v.fx.speeds ? v.fx.speeds[r.duration] : v.fx.speeds._default; + if (r.queue == null || r.queue === !0) r.queue = "fx"; + return r.old = r.complete, r.complete = function() { + v.isFunction(r.old) && r.old.call(this), r.queue && v.dequeue(this, r.queue) + }, r + }, v.easing = { + linear: function(e) { + return e + }, + swing: function(e) { + return.5 - Math.cos(e * Math.PI) / 2 + } + }, v.timers = [], v.fx = Yn.prototype.init, v.fx.tick = function() { + var e, n = v.timers, + r = 0; + qn = v.now(); + for (; r < n.length; r++) e = n[r], !e() && n[r] === e && n.splice(r--, 1); + n.length || v.fx.stop(), qn = t + }, v.fx.timer = function(e) { + e() && v.timers.push(e) && !Rn && (Rn = setInterval(v.fx.tick, v.fx.interval)) + }, v.fx.interval = 13, v.fx.stop = function() { + clearInterval(Rn), Rn = null + }, v.fx.speeds = { + slow: 600, + fast: 200, + _default: 400 + }, v.fx.step = {}, v.expr && v.expr.filters && (v.expr.filters.animated = function(e) { + return v.grep(v.timers, function(t) { + return e === t.elem + }).length + }); + var er = /^(?:body|html)$/i; + v.fn.offset = function(e) { + if (arguments.length) return e === t ? this : this.each(function(t) { + v.offset.setOffset(this, e, t) + }); + var n, r, i, s, o, u, a, f = { + top: 0, + left: 0 + }, + l = this[0], + c = l && l.ownerDocument; + if (!c) return; + return (r = c.body) === l ? v.offset.bodyOffset(l) : (n = c.documentElement, v.contains(n, l) ? (typeof l.getBoundingClientRect != "undefined" && (f = l.getBoundingClientRect()), i = tr(c), s = n.clientTop || r.clientTop || 0, o = n.clientLeft || r.clientLeft || 0, u = i.pageYOffset || n.scrollTop, a = i.pageXOffset || n.scrollLeft, { + top: f.top + u - s, + left: f.left + a - o + }) : f) + }, v.offset = { + bodyOffset: function(e) { + var t = e.offsetTop, + n = e.offsetLeft; + return v.support.doesNotIncludeMarginInBodyOffset && (t += parseFloat(v.css(e, "marginTop")) || 0, n += parseFloat(v.css(e, "marginLeft")) || 0), { + top: t, + left: n + } + }, + setOffset: function(e, t, n) { + var r = v.css(e, "position"); + r === "static" && (e.style.position = "relative"); + var i = v(e), + s = i.offset(), + o = v.css(e, "top"), + u = v.css(e, "left"), + a = (r === "absolute" || r === "fixed") && v.inArray("auto", [o, u]) > -1, + f = {}, + l = {}, + c, h; + a ? (l = i.position(), c = l.top, h = l.left) : (c = parseFloat(o) || 0, h = parseFloat(u) || 0), v.isFunction(t) && (t = t.call(e, n, s)), t.top != null && (f.top = t.top - s.top + c), t.left != null && (f.left = t.left - s.left + h), "using" in t ? t.using.call(e, f) : i.css(f) + } + }, v.fn.extend({ + position: function() { + if (!this[0]) return; + var e = this[0], + t = this.offsetParent(), + n = this.offset(), + r = er.test(t[0].nodeName) ? { + top: 0, + left: 0 + } : t.offset(); + return n.top -= parseFloat(v.css(e, "marginTop")) || 0, n.left -= parseFloat(v.css(e, "marginLeft")) || 0, r.top += parseFloat(v.css(t[0], "borderTopWidth")) || 0, r.left += parseFloat(v.css(t[0], "borderLeftWidth")) || 0, { + top: n.top - r.top, + left: n.left - r.left + } + }, + offsetParent: function() { + return this.map(function() { + var e = this.offsetParent || i.body; + while (e && !er.test(e.nodeName) && v.css(e, "position") === "static") e = e.offsetParent; + return e || i.body + }) + } + }), v.each({ + scrollLeft: "pageXOffset", + scrollTop: "pageYOffset" + }, function(e, n) { + var r = /Y/.test(n); + v.fn[e] = function(i) { + return v.access(this, function(e, i, s) { + var o = tr(e); + if (s === t) return o ? n in o ? o[n] : o.document.documentElement[i] : e[i]; + o ? o.scrollTo(r ? v(o).scrollLeft() : s, r ? s : v(o).scrollTop()) : e[i] = s + }, e, i, arguments.length, null) + } + }), v.each({ + Height: "height", + Width: "width" + }, function(e, n) { + v.each({ + padding: "inner" + e, + content: n, + "": "outer" + e + }, function(r, i) { + v.fn[i] = function(i, s) { + var o = arguments.length && (r || typeof i != "boolean"), + u = r || (i === !0 || s === !0 ? "margin" : "border"); + return v.access(this, function(n, r, i) { + var s; + return v.isWindow(n) ? n.document.documentElement["client" + e] : n.nodeType === 9 ? (s = n.documentElement, Math.max(n.body["scroll" + e], s["scroll" + e], n.body["offset" + e], s["offset" + e], s["client" + e])) : i === t ? v.css(n, r, i, u) : v.style(n, r, i, u) + }, n, o ? i : t, o, null) + } + }) + }), e.jQuery = e.$ = v, typeof define == "function" && define.amd && define.amd.jQuery && define("jquery", [], function() { + return v + }) +})(window); \ No newline at end of file diff --git a/doc/scripts/jquery.scrollTo.js b/doc/scripts/jquery.scrollTo.js new file mode 100644 index 00000000..1076f955 --- /dev/null +++ b/doc/scripts/jquery.scrollTo.js @@ -0,0 +1,217 @@ +/*! + * jQuery.ScrollTo + * Copyright (c) 2007-2013 Ariel Flesler - afleslergmailcom | http://flesler.blogspot.com + * Dual licensed under MIT and GPL. + * + * @projectDescription Easy element scrolling using jQuery. + * http://flesler.blogspot.com/2007/10/jqueryscrollto.html + * @author Ariel Flesler + * @version 1.4.5 + * + * @id jQuery.scrollTo + * @id jQuery.fn.scrollTo + * @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements. + * The different options for target are: + * - A number position (will be applied to all axes). + * - A string position ('44', '100px', '+=90', etc ) will be applied to all axes + * - A jQuery/DOM element ( logically, child of the element to scroll ) + * - A string selector, that will be relative to the element to scroll ( 'li:eq(2)', etc ) + * - A hash { top:x, left:y }, x and y can be any kind of number/string like above. + * - A percentage of the container's dimension/s, for example: 50% to go to the middle. + * - The string 'max' for go-to-end. + * @param {Number, Function} duration The OVERALL length of the animation, this argument can be the settings object instead. + * @param {Object,Function} settings Optional set of settings or the onAfter callback. + * @option {String} axis Which axis must be scrolled, use 'x', 'y', 'xy' or 'yx'. + * @option {Number, Function} duration The OVERALL length of the animation. + * @option {String} easing The easing method for the animation. + * @option {Boolean} margin If true, the margin of the target element will be deducted from the final position. + * @option {Object, Number} offset Add/deduct from the end position. One number for both axes or { top:x, left:y }. + * @option {Object, Number} over Add/deduct the height/width multiplied by 'over', can be { top:x, left:y } when using both axes. + * @option {Boolean} queue If true, and both axis are given, the 2nd axis will only be animated after the first one ends. + * @option {Function} onAfter Function to be called after the scrolling ends. + * @option {Function} onAfterFirst If queuing is activated, this function will be called after the first scrolling ends. + * @return {jQuery} Returns the same jQuery object, for chaining. + * + * @desc Scroll to a fixed position + * @example $('div').scrollTo( 340 ); + * + * @desc Scroll relatively to the actual position + * @example $('div').scrollTo( '+=340px', { axis:'y' } ); + * + * @desc Scroll using a selector (relative to the scrolled element) + * @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } ); + * + * @desc Scroll to a DOM element (same for jQuery object) + * @example var second_child = document.getElementById('container').firstChild.nextSibling; + * $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){ + * alert('scrolled!!'); + * }}); + * + * @desc Scroll on both axes, to different values + * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } ); + */ + +;(function( $ ){ + + var $scrollTo = $.scrollTo = function( target, duration, settings ){ + $(window).scrollTo( target, duration, settings ); + }; + + $scrollTo.defaults = { + axis:'xy', + duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1, + limit:true + }; + + // Returns the element that needs to be animated to scroll the window. + // Kept for backwards compatibility (specially for localScroll & serialScroll) + $scrollTo.window = function( scope ){ + return $(window)._scrollable(); + }; + + // Hack, hack, hack :) + // Returns the real elements to scroll (supports window/iframes, documents and regular nodes) + $.fn._scrollable = function(){ + return this.map(function(){ + var elem = this, + isWin = !elem.nodeName || $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1; + + if( !isWin ) + return elem; + + var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem; + + return /webkit/i.test(navigator.userAgent) || doc.compatMode == 'BackCompat' ? + doc.body : + doc.documentElement; + }); + }; + + $.fn.scrollTo = function( target, duration, settings ){ + if( typeof duration == 'object' ){ + settings = duration; + duration = 0; + } + if( typeof settings == 'function' ) + settings = { onAfter:settings }; + + if( target == 'max' ) + target = 9e9; + + settings = $.extend( {}, $scrollTo.defaults, settings ); + // Speed is still recognized for backwards compatibility + duration = duration || settings.duration; + // Make sure the settings are given right + settings.queue = settings.queue && settings.axis.length > 1; + + if( settings.queue ) + // Let's keep the overall duration + duration /= 2; + settings.offset = both( settings.offset ); + settings.over = both( settings.over ); + + return this._scrollable().each(function(){ + // Null target yields nothing, just like jQuery does + if (target == null) return; + + var elem = this, + $elem = $(elem), + targ = target, toff, attr = {}, + win = $elem.is('html,body'); + + switch( typeof targ ){ + // A number will pass the regex + case 'number': + case 'string': + if( /^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ) ){ + targ = both( targ ); + // We are done + break; + } + // Relative selector, no break! + targ = $(targ,this); + if (!targ.length) return; + case 'object': + // DOMElement / jQuery + if( targ.is || targ.style ) + // Get the real position of the target + toff = (targ = $(targ)).offset(); + } + $.each( settings.axis.split(''), function( i, axis ){ + var Pos = axis == 'x' ? 'Left' : 'Top', + pos = Pos.toLowerCase(), + key = 'scroll' + Pos, + old = elem[key], + max = $scrollTo.max(elem, axis); + + if( toff ){// jQuery / DOMElement + attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] ); + + // If it's a dom element, reduce the margin + if( settings.margin ){ + attr[key] -= parseInt(targ.css('margin'+Pos)) || 0; + attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0; + } + + attr[key] += settings.offset[pos] || 0; + + if( settings.over[pos] ) + // Scroll to a fraction of its width/height + attr[key] += targ[axis=='x'?'width':'height']() * settings.over[pos]; + }else{ + var val = targ[pos]; + // Handle percentage values + attr[key] = val.slice && val.slice(-1) == '%' ? + parseFloat(val) / 100 * max + : val; + } + + // Number or 'number' + if( settings.limit && /^\d+$/.test(attr[key]) ) + // Check the limits + attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max ); + + // Queueing axes + if( !i && settings.queue ){ + // Don't waste time animating, if there's no need. + if( old != attr[key] ) + // Intermediate animation + animate( settings.onAfterFirst ); + // Don't animate this axis again in the next iteration. + delete attr[key]; + } + }); + + animate( settings.onAfter ); + + function animate( callback ){ + $elem.animate( attr, duration, settings.easing, callback && function(){ + callback.call(this, target, settings); + }); + }; + + }).end(); + }; + + // Max scrolling position, works on quirks mode + // It only fails (not too badly) on IE, quirks mode. + $scrollTo.max = function( elem, axis ){ + var Dim = axis == 'x' ? 'Width' : 'Height', + scroll = 'scroll'+Dim; + + if( !$(elem).is('html,body') ) + return elem[scroll] - $(elem)[Dim.toLowerCase()](); + + var size = 'client' + Dim, + html = elem.ownerDocument.documentElement, + body = elem.ownerDocument.body; + + return Math.max( html[scroll], body[scroll] ) + - Math.min( html[size] , body[size] ); + }; + + function both( val ){ + return typeof val == 'object' ? val : { top:val, left:val }; + }; + +})( jQuery ); \ No newline at end of file diff --git a/doc/scripts/jquery.sunlight.js b/doc/scripts/jquery.sunlight.js new file mode 100644 index 00000000..ce444af2 --- /dev/null +++ b/doc/scripts/jquery.sunlight.js @@ -0,0 +1,18 @@ +/** + * jQuery plugin for Sunlight http://sunlightjs.com/ + * + * by Tommy Montgomery http://tmont.com/ + * licensed under WTFPL http://sam.zoy.org/wtfpl/ + */ +(function($, window){ + + $.fn.sunlight = function(options) { + var highlighter = new window.Sunlight.Highlighter(options); + this.each(function() { + highlighter.highlightNode(this); + }); + + return this; + }; + +}(jQuery, this)); \ No newline at end of file diff --git a/doc/scripts/prettify/Apache-License-2.0.txt b/doc/scripts/prettify/Apache-License-2.0.txt new file mode 100644 index 00000000..75b52484 --- /dev/null +++ b/doc/scripts/prettify/Apache-License-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/doc/scripts/prettify/jquery.min.js b/doc/scripts/prettify/jquery.min.js new file mode 100644 index 00000000..969e7cbe --- /dev/null +++ b/doc/scripts/prettify/jquery.min.js @@ -0,0 +1,6 @@ +/*! jQuery v2.0.0 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery.min.map +*/ +(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],f="2.0.0",p=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=f.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return p.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,f,p,h,d,g,m,y="sizzle"+-new Date,v=e.document,b={},w=0,T=0,C=ot(),k=ot(),N=ot(),E=!1,S=function(){return 0},j=typeof undefined,D=1<<31,A=[],L=A.pop,q=A.push,H=A.push,O=A.slice,F=A.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},P="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",R="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=M.replace("w","w#"),$="\\["+R+"*("+M+")"+R+"*(?:([*^$|!~]?=)"+R+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+R+"*\\]",B=":("+M+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",I=RegExp("^"+R+"+|((?:^|[^\\\\])(?:\\\\.)*)"+R+"+$","g"),z=RegExp("^"+R+"*,"+R+"*"),_=RegExp("^"+R+"*([>+~]|"+R+")"+R+"*"),X=RegExp(R+"*[+~]"),U=RegExp("="+R+"*([^\\]'\"]*)"+R+"*\\]","g"),Y=RegExp(B),V=RegExp("^"+W+"$"),G={ID:RegExp("^#("+M+")"),CLASS:RegExp("^\\.("+M+")"),TAG:RegExp("^("+M.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+B),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+R+"*(even|odd|(([+-]|)(\\d*)n|)"+R+"*(?:([+-]|)"+R+"*(\\d+)|))"+R+"*\\)|)","i"),"boolean":RegExp("^(?:"+P+")$","i"),needsContext:RegExp("^"+R+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+R+"*((?:-\\d)?\\d*)"+R+"*\\)|)(?=[^-]|$)","i")},J=/^[^{]+\{\s*\[native \w/,Q=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,et=/'|\\/g,tt=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,nt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{H.apply(A=O.call(v.childNodes),v.childNodes),A[v.childNodes.length].nodeType}catch(rt){H={apply:A.length?function(e,t){q.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function it(e){return J.test(e+"")}function ot(){var e,t=[];return e=function(n,i){return t.push(n+=" ")>r.cacheLength&&delete e[t.shift()],e[n]=i}}function st(e){return e[y]=!0,e}function at(e){var t=c.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ut(e,t,n,r){var i,o,s,a,u,f,d,g,x,w;if((t?t.ownerDocument||t:v)!==c&&l(t),t=t||c,n=n||[],!e||"string"!=typeof e)return n;if(1!==(a=t.nodeType)&&9!==a)return[];if(p&&!r){if(i=Q.exec(e))if(s=i[1]){if(9===a){if(o=t.getElementById(s),!o||!o.parentNode)return n;if(o.id===s)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(s))&&m(t,o)&&o.id===s)return n.push(o),n}else{if(i[2])return H.apply(n,t.getElementsByTagName(e)),n;if((s=i[3])&&b.getElementsByClassName&&t.getElementsByClassName)return H.apply(n,t.getElementsByClassName(s)),n}if(b.qsa&&(!h||!h.test(e))){if(g=d=y,x=t,w=9===a&&e,1===a&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(d=t.getAttribute("id"))?g=d.replace(et,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=f.length;while(u--)f[u]=g+mt(f[u]);x=X.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return H.apply(n,x.querySelectorAll(w)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(I,"$1"),t,n,r)}o=ut.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},l=ut.setDocument=function(e){var t=e?e.ownerDocument||e:v;return t!==c&&9===t.nodeType&&t.documentElement?(c=t,f=t.documentElement,p=!o(t),b.getElementsByTagName=at(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),b.attributes=at(function(e){return e.className="i",!e.getAttribute("className")}),b.getElementsByClassName=at(function(e){return e.innerHTML="
",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),b.sortDetached=at(function(e){return 1&e.compareDocumentPosition(c.createElement("div"))}),b.getById=at(function(e){return f.appendChild(e).id=y,!t.getElementsByName||!t.getElementsByName(y).length}),b.getById?(r.find.ID=function(e,t){if(typeof t.getElementById!==j&&p){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},r.filter.ID=function(e){var t=e.replace(tt,nt);return function(e){return e.getAttribute("id")===t}}):(r.find.ID=function(e,t){if(typeof t.getElementById!==j&&p){var n=t.getElementById(e);return n?n.id===e||typeof n.getAttributeNode!==j&&n.getAttributeNode("id").value===e?[n]:undefined:[]}},r.filter.ID=function(e){var t=e.replace(tt,nt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),r.find.TAG=b.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=b.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&p?t.getElementsByClassName(e):undefined},d=[],h=[],(b.qsa=it(t.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+R+"*(?:value|"+P+")"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){var t=c.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&h.push("[*^$]="+R+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(b.matchesSelector=it(g=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){b.disconnectedMatch=g.call(e,"div"),g.call(e,"[s!='']:x"),d.push("!=",B)}),h=h.length&&RegExp(h.join("|")),d=d.length&&RegExp(d.join("|")),m=it(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,n){if(e===n)return E=!0,0;var r=n.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(n);return r?1&r||!b.sortDetached&&n.compareDocumentPosition(e)===r?e===t||m(v,e)?-1:n===t||m(v,n)?1:u?F.call(u,e)-F.call(u,n):0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],l=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:u?F.call(u,e)-F.call(u,n):0;if(o===s)return lt(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)l.unshift(r);while(a[i]===l[i])i++;return i?lt(a[i],l[i]):a[i]===v?-1:l[i]===v?1:0},c):c},ut.matches=function(e,t){return ut(e,null,null,t)},ut.matchesSelector=function(e,t){if((e.ownerDocument||e)!==c&&l(e),t=t.replace(U,"='$1']"),!(!b.matchesSelector||!p||d&&d.test(t)||h&&h.test(t)))try{var n=g.call(e,t);if(n||b.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return ut(t,c,null,[e]).length>0},ut.contains=function(e,t){return(e.ownerDocument||e)!==c&&l(e),m(e,t)},ut.attr=function(e,t){(e.ownerDocument||e)!==c&&l(e);var n=r.attrHandle[t.toLowerCase()],i=n&&n(e,t,!p);return i===undefined?b.attributes||!p?e.getAttribute(t):(i=e.getAttributeNode(t))&&i.specified?i.value:null:i},ut.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ut.uniqueSort=function(e){var t,n=[],r=0,i=0;if(E=!b.detectDuplicates,u=!b.sortStable&&e.slice(0),e.sort(S),E){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return e};function lt(e,t){var n=t&&e,r=n&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ct(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}function ft(e,t,n){var r;return n?undefined:r=e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ht(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function dt(e){return st(function(t){return t=+t,st(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}i=ut.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r];r++)n+=i(t);return n},r=ut.selectors={cacheLength:50,createPseudo:st,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(tt,nt),e[3]=(e[4]||e[5]||"").replace(tt,nt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ut.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ut.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return G.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&Y.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(tt,nt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+R+")"+e+"("+R+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ut.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,v=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){f=t;while(f=f[g])if(a?f.nodeName.toLowerCase()===v:1===f.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[y]||(m[y]={}),l=c[e]||[],h=l[0]===w&&l[1],p=l[0]===w&&l[2],f=h&&m.childNodes[h];while(f=++h&&f&&f[g]||(p=h=0)||d.pop())if(1===f.nodeType&&++p&&f===t){c[e]=[w,h,p];break}}else if(x&&(l=(t[y]||(t[y]={}))[e])&&l[0]===w)p=l[1];else while(f=++h&&f&&f[g]||(p=h=0)||d.pop())if((a?f.nodeName.toLowerCase()===v:1===f.nodeType)&&++p&&(x&&((f[y]||(f[y]={}))[e]=[w,p]),f===t))break;return p-=i,p===r||0===p%r&&p/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||ut.error("unsupported pseudo: "+e);return i[y]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?st(function(e,n){var r,o=i(e,t),s=o.length;while(s--)r=F.call(e,o[s]),e[r]=!(n[r]=o[s])}):function(e){return i(e,0,n)}):i}},pseudos:{not:st(function(e){var t=[],n=[],r=s(e.replace(I,"$1"));return r[y]?st(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:st(function(e){return function(t){return ut(e,t).length>0}}),contains:st(function(e){return function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:st(function(e){return V.test(e||"")||ut.error("unsupported lang: "+e),e=e.replace(tt,nt).toLowerCase(),function(t){var n;do if(n=p?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===c.activeElement&&(!c.hasFocus||c.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Z.test(e.nodeName)},input:function(e){return K.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:dt(function(){return[0]}),last:dt(function(e,t){return[t-1]}),eq:dt(function(e,t,n){return[0>n?n+t:n]}),even:dt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:dt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:dt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:dt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=ht(t);function gt(e,t){var n,i,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=r.preFilter;while(a){(!n||(i=z.exec(a)))&&(i&&(a=a.slice(i[0].length)||a),u.push(o=[])),n=!1,(i=_.exec(a))&&(n=i.shift(),o.push({value:n,type:i[0].replace(I," ")}),a=a.slice(n.length));for(s in r.filter)!(i=G[s].exec(a))||l[s]&&!(i=l[s](i))||(n=i.shift(),o.push({value:n,type:s,matches:i}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ut.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,r){var i=t.dir,o=r&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,r,a){var u,l,c,f=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,r,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[y]||(t[y]={}),(l=c[i])&&l[0]===f){if((u=l[1])===!0||u===n)return u===!0}else if(l=c[i]=[f],l[1]=e(t,r,a)||n,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[y]&&(r=bt(r)),i&&!i[y]&&(i=bt(i,o)),st(function(o,s,a,u){var l,c,f,p=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,p,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(f=l[c])&&(y[h[c]]=!(m[h[c]]=f))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(f=y[c])&&l.push(m[c]=f);i(null,y=[],l,u)}c=y.length;while(c--)(f=y[c])&&(l=i?F.call(o,f):p[c])>-1&&(o[l]=!(s[l]=f))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):H.apply(s,y)})}function wt(e){var t,n,i,o=e.length,s=r.relative[e[0].type],u=s||r.relative[" "],l=s?1:0,c=yt(function(e){return e===t},u,!0),f=yt(function(e){return F.call(t,e)>-1},u,!0),p=[function(e,n,r){return!s&&(r||n!==a)||((t=n).nodeType?c(e,n,r):f(e,n,r))}];for(;o>l;l++)if(n=r.relative[e[l].type])p=[yt(vt(p),n)];else{if(n=r.filter[e[l].type].apply(null,e[l].matches),n[y]){for(i=++l;o>i;i++)if(r.relative[e[i].type])break;return bt(l>1&&vt(p),l>1&&mt(e.slice(0,l-1)).replace(I,"$1"),n,i>l&&wt(e.slice(l,i)),o>i&&wt(e=e.slice(i)),o>i&&mt(e))}p.push(n)}return vt(p)}function Tt(e,t){var i=0,o=t.length>0,s=e.length>0,u=function(u,l,f,p,h){var d,g,m,y=[],v=0,x="0",b=u&&[],T=null!=h,C=a,k=u||s&&r.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(a=l!==c&&l,n=i);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,f)){p.push(d);break}T&&(w=N,n=++i)}o&&((d=!m&&d)&&v--,u&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,f);if(u){if(v>0)while(x--)b[x]||y[x]||(y[x]=L.call(p));y=xt(y)}H.apply(p,y),T&&!u&&y.length>0&&v+t.length>1&&ut.uniqueSort(p)}return T&&(w=N,a=C),b};return o?st(u):u}s=ut.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[y]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ut(e,t[r],n);return n}function kt(e,t,n,i){var o,a,u,l,c,f=gt(e);if(!i&&1===f.length){if(a=f[0]=f[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&p&&r.relative[a[1].type]){if(t=(r.find.ID(u.matches[0].replace(tt,nt),t)||[])[0],!t)return n;e=e.slice(a.shift().value.length)}o=G.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],r.relative[l=u.type])break;if((c=r.find[l])&&(i=c(u.matches[0].replace(tt,nt),X.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=i.length&&mt(a),!e)return H.apply(n,i),n;break}}}return s(e,f)(i,t,!p,n,X.test(e)),n}r.pseudos.nth=r.pseudos.eq;function Nt(){}Nt.prototype=r.filters=r.pseudos,r.setFilters=new Nt,b.sortStable=y.split("").sort(S).join("")===y,l(),[0,0].sort(S),b.detectDuplicates=E,at(function(e){if(e.innerHTML="
","#"!==e.firstChild.getAttribute("href")){var t="type|href|height|width".split("|"),n=t.length;while(n--)r.attrHandle[t[n]]=ft}}),at(function(e){if(null!=e.getAttribute("disabled")){var t=P.split("|"),n=t.length;while(n--)r.attrHandle[t[n]]=ct}}),x.find=ut,x.expr=ut.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ut.uniqueSort,x.text=ut.getText,x.isXMLDoc=ut.isXML,x.contains=ut.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(f){for(t=e.memory&&f,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(f[0],f[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!a||n&&!u||(r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))this.cache[i]=t;else for(r in t)o[r]=t[r]},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){return t===undefined||t&&"string"==typeof t&&n===undefined?this.get(e,t):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i=this.key(e),o=this.cache[i];if(t===undefined)this.cache[i]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):t in o?r=[t]:(r=x.camelCase(t),r=r in o?[r]:r.match(w)||[]),n=r.length;while(n--)delete o[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){delete this.cache[this.key(e)]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.substring(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t); +x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,i="boolean"==typeof t;return x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,s=0,a=x(this),u=t,l=e.match(w)||[];while(o=l[s++])u=i?u:!a.hasClass(o),a[u?"addClass":"removeClass"](o)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i,o=x(this);1===this.nodeType&&(i=r?e.call(this,n,o.val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.boolean.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.boolean.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.boolean.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,f,p,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(p=x.event.special[d]||{},d=(o?p.delegateType:p.bindType)||d,p=x.event.special[d]||{},f=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,p.setup&&p.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),p.add&&(p.add.call(e,f),f.handler.guid||(f.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,f):h.push(f),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,f,p,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){f=x.event.special[h]||{},h=(r?f.delegateType:f.bindType)||h,p=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));s&&!p.length&&(f.teardown&&f.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,f,p,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),p=x.event.special[d]||{},i||!p.trigger||p.trigger.apply(r,n)!==!1)){if(!i&&!p.noBubble&&!x.isWindow(r)){for(l=p.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:p.bindType||d,f=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),f&&f.apply(a,n),f=c&&a[c],f&&x.acceptData(a)&&f.apply&&f.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||p._default&&p._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return 3===e.target.nodeType&&(e.target=e.target.parentNode),s.filter?s.filter(e,o):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=x.expr.match.needsContext,Q={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return t=this,this.pushStack(x(e).filter(function(){for(r=0;i>r;r++)if(x.contains(t[r],this))return!0}));for(n=[],r=0;i>r;r++)x.find(e,this[r],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(Z(this,e||[],!0))},filter:function(e){return this.pushStack(Z(this,e||[],!1))},is:function(e){return!!e&&("string"==typeof e?J.test(e)?x(e,this.context).index(this[0])>=0:x.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],s=J.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function K(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return K(e,"nextSibling")},prev:function(e){return K(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(Q[e]||x.unique(i),"p"===e[0]&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function Z(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var et=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,tt=/<([\w:]+)/,nt=/<|&#?\w+;/,rt=/<(?:script|style|link)/i,it=/^(?:checkbox|radio)$/i,ot=/checked\s*(?:[^=]|=\s*.checked.)/i,st=/^$|\/(?:java|ecma)script/i,at=/^true\/(.*)/,ut=/^\s*\s*$/g,lt={option:[1,""],thead:[1,"
","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};lt.optgroup=lt.option,lt.tbody=lt.tfoot=lt.colgroup=lt.caption=lt.col=lt.thead,lt.th=lt.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=ct(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=ct(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(gt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&ht(gt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(gt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!rt.test(e)&&!lt[(tt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(et,"<$1>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(gt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=p.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,f=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&ot.test(d))return this.each(function(r){var i=f.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(gt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,gt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,pt),l=0;s>l;l++)a=o[l],st.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(ut,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=gt(a),o=gt(e),r=0,i=o.length;i>r;r++)mt(o[r],s[r]);if(t)if(n)for(o=o||gt(e),s=s||gt(a),r=0,i=o.length;i>r;r++)dt(o[r],s[r]);else dt(e,a);return s=gt(a,"script"),s.length>0&&ht(s,!u&>(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,f=e.length,p=t.createDocumentFragment(),h=[];for(;f>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(nt.test(i)){o=o||p.appendChild(t.createElement("div")),s=(tt.exec(i)||["",""])[1].toLowerCase(),a=lt[s]||lt._default,o.innerHTML=a[1]+i.replace(et,"<$1>")+a[2],l=a[0];while(l--)o=o.firstChild;x.merge(h,o.childNodes),o=p.firstChild,o.textContent=""}else h.push(t.createTextNode(i));p.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=gt(p.appendChild(i),"script"),u&&ht(o),n)){l=0;while(i=o[l++])st.test(i.type||"")&&n.push(i)}return p},cleanData:function(e){var t,n,r,i=e.length,o=0,s=x.event.special;for(;i>o;o++){if(n=e[o],x.acceptData(n)&&(t=q.access(n)))for(r in t.events)s[r]?x.event.remove(n,r):x.removeEvent(n,r,t.handle);L.discard(n),q.discard(n)}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"text",async:!1,global:!1,success:x.globalEval})}});function ct(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function pt(e){var t=at.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function ht(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function dt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=x.extend({},o),l=o.events,q.set(t,s),l)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function gt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function mt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&it.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var yt,vt,xt=/^(none|table(?!-c[ea]).+)/,bt=/^margin/,wt=RegExp("^("+b+")(.*)$","i"),Tt=RegExp("^("+b+")(?!px)[a-z%]+$","i"),Ct=RegExp("^([+-])=("+b+")","i"),kt={BODY:"block"},Nt={position:"absolute",visibility:"hidden",display:"block"},Et={letterSpacing:0,fontWeight:400},St=["Top","Right","Bottom","Left"],jt=["Webkit","O","Moz","ms"];function Dt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=jt.length;while(i--)if(t=jt[i]+n,t in e)return t;return r}function At(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function Lt(t){return e.getComputedStyle(t,null)}function qt(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&At(r)&&(o[s]=q.access(r,"olddisplay",Pt(r.nodeName)))):o[s]||(i=At(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=Lt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return qt(this,!0)},hide:function(){return qt(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:At(this))?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=yt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=Dt(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=Ct.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=Dt(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=yt(e,t,r)),"normal"===i&&t in Et&&(i=Et[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),yt=function(e,t,n){var r,i,o,s=n||Lt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Tt.test(a)&&bt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ht(e,t,n){var r=wt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ot(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+St[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+St[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+St[o]+"Width",!0,i))):(s+=x.css(e,"padding"+St[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+St[o]+"Width",!0,i)));return s}function Ft(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Lt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=yt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Tt.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ot(e,t,n||(s?"border":"content"),r,o)+"px"}function Pt(e){var t=o,n=kt[e];return n||(n=Rt(e,t),"none"!==n&&n||(vt=(vt||x("