From 223933ca0bab4a0baecb2cf187f56f922192a7ba Mon Sep 17 00:00:00 2001 From: Riccardo Zaccarelli Date: Thu, 30 Jun 2011 15:11:22 +0000 Subject: [PATCH] deleted ui (will be restored) --- timeside/ui/README | 22 - timeside/ui/js/libs/jquery-1.6.min.js | 16 - timeside/ui/js/libs/raphael-min.js | 7 - .../ui/js/libs/soundmanager2-nodebug-jsmin.js | 75 - timeside/ui/js/libs/soundmanager2.js | 3015 ----------------- timeside/ui/js/markermap.js | 252 -- timeside/ui/js/player.js | 1078 ------ timeside/ui/js/ruler.js | 475 --- timeside/ui/js/rulermarker.js | 259 -- timeside/ui/js/timeside.js | 791 ----- timeside/ui/skins/classic/img/forward.png | Bin 922 -> 0 bytes timeside/ui/skins/classic/img/pause.png | Bin 635 -> 0 bytes timeside/ui/skins/classic/img/play.png | Bin 794 -> 0 bytes .../ui/skins/classic/img/player_controlbg.png | Bin 227 -> 0 bytes timeside/ui/skins/classic/img/rewind.png | Bin 945 -> 0 bytes timeside/ui/skins/classic/img/setmarker.png | Bin 932 -> 0 bytes timeside/ui/skins/classic/img/volumeoff.png | Bin 1156 -> 0 bytes timeside/ui/skins/classic/img/volumeon.png | Bin 806 -> 0 bytes timeside/ui/skins/classic/img/wait.gif | Bin 1849 -> 0 bytes timeside/ui/skins/classic/style.css | 152 - .../ui/skins/lab/img/controlbg-inverted.png | Bin 173 -> 0 bytes timeside/ui/skins/lab/img/controlbg.png | Bin 172 -> 0 bytes timeside/ui/skins/lab/img/empty.png | Bin 240 -> 0 bytes timeside/ui/skins/lab/img/forward.png | Bin 620 -> 0 bytes timeside/ui/skins/lab/img/pause.png | Bin 442 -> 0 bytes timeside/ui/skins/lab/img/play.png | Bin 582 -> 0 bytes timeside/ui/skins/lab/img/rewind.png | Bin 623 -> 0 bytes timeside/ui/skins/lab/img/setmarker.png | Bin 666 -> 0 bytes timeside/ui/skins/lab/img/volume.png | Bin 1860 -> 0 bytes timeside/ui/skins/lab/img/volumeoff.png | Bin 882 -> 0 bytes timeside/ui/skins/lab/img/volumeon.png | Bin 564 -> 0 bytes timeside/ui/skins/lab/img/wait.gif | Bin 10819 -> 0 bytes timeside/ui/skins/lab/img/wait2.gif | Bin 2248 -> 0 bytes timeside/ui/skins/lab/img/wait3.gif | Bin 2239 -> 0 bytes timeside/ui/skins/lab/style.css | 145 - timeside/ui/swf/soundmanager2.swf | Bin 2867 -> 0 bytes timeside/ui/swf/soundmanager2_debug.swf | Bin 3302 -> 0 bytes timeside/ui/swf/soundmanager2_flash9.swf | Bin 8606 -> 0 bytes .../ui/swf/soundmanager2_flash9_debug.swf | Bin 16524 -> 0 bytes 39 files changed, 6287 deletions(-) delete mode 100644 timeside/ui/README delete mode 100644 timeside/ui/js/libs/jquery-1.6.min.js delete mode 100644 timeside/ui/js/libs/raphael-min.js delete mode 100755 timeside/ui/js/libs/soundmanager2-nodebug-jsmin.js delete mode 100755 timeside/ui/js/libs/soundmanager2.js delete mode 100644 timeside/ui/js/markermap.js delete mode 100644 timeside/ui/js/player.js delete mode 100644 timeside/ui/js/ruler.js delete mode 100644 timeside/ui/js/rulermarker.js delete mode 100644 timeside/ui/js/timeside.js delete mode 100644 timeside/ui/skins/classic/img/forward.png delete mode 100644 timeside/ui/skins/classic/img/pause.png delete mode 100644 timeside/ui/skins/classic/img/play.png delete mode 100644 timeside/ui/skins/classic/img/player_controlbg.png delete mode 100644 timeside/ui/skins/classic/img/rewind.png delete mode 100644 timeside/ui/skins/classic/img/setmarker.png delete mode 100644 timeside/ui/skins/classic/img/volumeoff.png delete mode 100644 timeside/ui/skins/classic/img/volumeon.png delete mode 100644 timeside/ui/skins/classic/img/wait.gif delete mode 100644 timeside/ui/skins/classic/style.css delete mode 100644 timeside/ui/skins/lab/img/controlbg-inverted.png delete mode 100755 timeside/ui/skins/lab/img/controlbg.png delete mode 100644 timeside/ui/skins/lab/img/empty.png delete mode 100755 timeside/ui/skins/lab/img/forward.png delete mode 100755 timeside/ui/skins/lab/img/pause.png delete mode 100755 timeside/ui/skins/lab/img/play.png delete mode 100755 timeside/ui/skins/lab/img/rewind.png delete mode 100644 timeside/ui/skins/lab/img/setmarker.png delete mode 100644 timeside/ui/skins/lab/img/volume.png delete mode 100644 timeside/ui/skins/lab/img/volumeoff.png delete mode 100644 timeside/ui/skins/lab/img/volumeon.png delete mode 100644 timeside/ui/skins/lab/img/wait.gif delete mode 100644 timeside/ui/skins/lab/img/wait2.gif delete mode 100644 timeside/ui/skins/lab/img/wait3.gif delete mode 100755 timeside/ui/skins/lab/style.css delete mode 100755 timeside/ui/swf/soundmanager2.swf delete mode 100755 timeside/ui/swf/soundmanager2_debug.swf delete mode 100755 timeside/ui/swf/soundmanager2_flash9.swf delete mode 100755 timeside/ui/swf/soundmanager2_flash9_debug.swf diff --git a/timeside/ui/README b/timeside/ui/README deleted file mode 100644 index 8c96ad2..0000000 --- a/timeside/ui/README +++ /dev/null @@ -1,22 +0,0 @@ -=============================== -TimeSide - Web Audio Components -=============================== - -TimeSide UI Dependencies -======================== - -* SoundManager 2 >= 2.91 : http://www.schillmania.com/projects/soundmanager2 -* jQuery => 1.2.6 : http://www.jquery.com -* jsGraphics => 3.03 http://www.walterzorn.com/jsgraphics/jsgraphics_e.htm - -Licensing -========= - -Copyright (c) 2008-2009 Samalyse -Author: Olivier Guilyardi - -TimeSide is released under the terms of the GNU General Public License -version 2. Please see the LICENSE file for details. - - - diff --git a/timeside/ui/js/libs/jquery-1.6.min.js b/timeside/ui/js/libs/jquery-1.6.min.js deleted file mode 100644 index c72011d..0000000 --- a/timeside/ui/js/libs/jquery-1.6.min.js +++ /dev/null @@ -1,16 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Mon May 2 13:50:00 2011 -0400 - */ -(function(a,b){function cw(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function ct(a){if(!ch[a]){var b=f("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d===""){ci||(ci=c.createElement("iframe"),ci.frameBorder=ci.width=ci.height=0),c.body.appendChild(ci);if(!cj||!ci.createElement)cj=(ci.contentWindow||ci.contentDocument).document,cj.write("");b=cj.createElement(a),cj.body.appendChild(b),d=f.css(b,"display"),c.body.removeChild(ci)}ch[a]=d}return ch[a]}function cs(a,b){var c={};f.each(cn.concat.apply([],cn.slice(0,b)),function(){c[this]=a});return c}function cr(){co=b}function cq(){setTimeout(cr,0);return co=f.now()}function cg(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cf(){try{return new a.XMLHttpRequest}catch(b){}}function b_(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){name="data-"+c.replace(j,"$1-$2").toLowerCase(),d=a.getAttribute(name);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(e){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function H(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(H,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=d.userAgent,x,y,z,A=Object.prototype.toString,B=Object.prototype.hasOwnProperty,C=Array.prototype.push,D=Array.prototype.slice,E=String.prototype.trim,F=Array.prototype.indexOf,G={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?g=[null,a,null]:g=i.exec(a);if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6",length:0,size:function(){return this.length},toArray:function(){return D.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?C.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),y.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(D.apply(this,arguments),"slice",D.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:C,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;y.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!y){y=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",z,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",z),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&H()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):G[A.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!B.call(a,"constructor")&&!B.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||B.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",b=a.getElementsByTagName("*"),d=a.getElementsByTagName("a")[0];if(!b||!b.length||!d)return{};e=c.createElement("select"),f=e.appendChild(c.createElement("option")),g=a.getElementsByTagName("input")[0],i={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.55$/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:g.value==="on",optSelected:f.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},g.checked=!0,i.noCloneChecked=g.cloneNode(!0).checked,e.disabled=!0,i.optDisabled=!f.disabled;try{delete a.test}catch(r){i.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function click(){i.noCloneEvent=!1,a.detachEvent("onclick",click)}),a.cloneNode(!0).fireEvent("onclick")),g=c.createElement("input"),g.value="t",g.setAttribute("type","radio"),i.radioValue=g.value==="t",g.setAttribute("checked","checked"),a.appendChild(g),j=c.createDocumentFragment(),j.appendChild(a.firstChild),i.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",k=c.createElement("body"),l={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"};for(p in l)k.style[p]=l[p];k.appendChild(a),c.documentElement.appendChild(k),i.appendChecked=g.checked,i.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,i.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",i.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",m=a.getElementsByTagName("td"),q=m[0].offsetHeight===0,m[0].style.display="",m[1].style.display="none",i.reliableHiddenOffsets=q&&m[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(h=c.createElement("div"),h.style.width="0",h.style.marginRight="0",a.appendChild(h),i.reliableMarginRight=(parseInt(c.defaultView.getComputedStyle(h,null).marginRight,10)||0)===0),k.innerHTML="",c.documentElement.removeChild(k);if(a.attachEvent)for(p in{submit:1,change:1,focusin:1})o="on"+p,q=o in a,q||(a.setAttribute(o,"return;"),q=typeof a[o]=="function"),i[p+"Bubbles"]=q;return i}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[c]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;return(e.value||"").replace(p,"")}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||"set"in c&&c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b=a.selectedIndex,c=[],d=a.options,e=a.type==="select-one";if(b<0)return null;for(var g=e?b:0,h=e?b+1:d.length;g=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex",readonly:"readOnly"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);var h,i,j=g!==1||!f.isXMLDoc(a);c=j&&f.attrFix[c]||c,i=f.attrHooks[c]||(v&&(f.nodeName(a,"form")||u.test(c))?v:b);if(d!==b){if(d===null||d===!1&&!t.test(c)){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;d===!0&&!t.test(c)&&(d=c),a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j)return i.get(a,c);h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.getAttribute("value");a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}},propFix:{},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);c=i&&f.propFix[c]||c,h=f.propHooks[c];return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),f.support.getSetAttribute||(f.attrFix=f.extend(f.attrFix,{"for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder"}),v=f.attrHooks.name=f.attrHooks.value=f.valHooks.button={get:function(a,c){var d;if(c==="value"&&!f.nodeName(a,"button"))return a.getAttribute(c);d=a.getAttributeNode(c);return d&&d.specified?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=Object.prototype.hasOwnProperty,x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function J(a){var c=a.target,d,e;if(!!y.test(c.nodeName)&&!c.readOnly){d=f._data(c,"_change_data"),e=I(c),(a.type!=="focusout"||c.type!=="radio")&&f._data(c,"_change_data",e);if(d===b||e===d)return;if(d!=null||e)a.type="change",a.liveFired=b,f.event.trigger(a,arguments[1],c)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){return a.nodeName.toLowerCase()==="input"&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!be[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[];for(var i=0,j;(j=a[i])!=null;i++){typeof j=="number"&&(j+="");if(!j)continue;if(typeof j=="string")if(!ba.test(j))j=b.createTextNode(j);else{j=j.replace(Z,"<$1>");var k=($.exec(j)||["",""])[1].toLowerCase(),l=be[k]||be._default,m=l[0],n=b.createElement("div");n.innerHTML=l[1]+j+l[2];while(m--)n=n.lastChild;if(!f.support.tbody){var o=_.test(j),p=k==="table"&&!o?n.firstChild&&n.firstChild.childNodes:l[1]===""&&!o?n.childNodes:[];for(var q=p.length-1;q>=0;--q)f.nodeName(p[q],"tbody")&&!p[q].childNodes.length&&p[q].parentNode.removeChild(p[q])}!f.support.leadingWhitespace&&Y.test(j)&&n.insertBefore(b.createTextNode(Y.exec(j)[0]),n.firstChild),j=n.childNodes}var r;if(!f.support.appendChecked)if(j[0]&&typeof (r=j.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV;try{bU=e.href}catch(bW){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bX(bS),ajaxTransport:bX(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?b$(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b_(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bY(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bY(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bZ(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var ca=f.now(),cb=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+ca++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cb.test(b.url)||e&&cb.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cb,l),b.url===j&&(e&&(k=k.replace(cb,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cc=a.ActiveXObject?function(){for(var a in ce)ce[a](0,1)}:!1,cd=0,ce;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cf()||cg()}:cf,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cc&&delete ce[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cd,cc&&(ce||(ce={},f(a).unload(cc)),ce[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ch={},ci,cj,ck=/^(?:toggle|show|hide)$/,cl=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cm,cn=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],co,cp=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cs("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a=f.timers,b=a.length;while(b--)a[b]()||a.splice(b,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cm),cm=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cu=/^t(?:able|d|h)$/i,cv=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cw(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!cu.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cv.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cv.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cw(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cw(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){return this[0]?parseFloat(f.css(this[0],d,"padding")):null},f.fn["outer"+c]=function(a){return this[0]?parseFloat(f.css(this[0],d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/timeside/ui/js/libs/raphael-min.js b/timeside/ui/js/libs/raphael-min.js deleted file mode 100644 index e5e7126..0000000 --- a/timeside/ui/js/libs/raphael-min.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Raphael 1.5.2 - JavaScript Vector Library - * - * Copyright (c) 2010 Dmitry Baranovskiy (http://raphaeljs.com) - * Licensed under the MIT (http://raphaeljs.com/license.html) license. - */ -(function(){function a(){if(a.is(arguments[0],G)){var b=arguments[0],d=bV[m](a,b.splice(0,3+a.is(b[0],E))),e=d.set();for(var g=0,h=b[w];g";bg=bf.firstChild;bg.style.behavior="url(#default#VML)";if(!(bg&&typeof bg.adj=="object"))return a.type=null;bf=null}a.svg=!(a.vml=a.type=="VML");j[e]=a[e];k=j[e];a._id=0;a._oid=0;a.fn={};a.is=function(a,b){b=x.call(b);if(b=="finite")return!O[f](+a);return b=="null"&&a===null||b==typeof a||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||J.call(a).slice(8,-1).toLowerCase()==b};a.angle=function(b,c,d,e,f,g){{if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return((h<0)*180+y.atan(-i/-h)*180/D+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)}};a.rad=function(a){return a%360*D/180};a.deg=function(a){return a*180/D%360};a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,G)){var e=b.length;while(e--)if(B(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(fb-d)return c-f+b}return c};function bh(){var a=[],b=0;for(;b<32;b++)a[b]=(~(~(y.random()*16)))[H](16);a[12]=4;a[16]=(a[16]&3|8)[H](16);return"r-"+a[v]("")}a.setWindow=function(a){h=a;g=h.document};var bi=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("");e.close();d=e.body}catch(a){d=createPopup().document.body}var f=d.createTextRange();bi=bm(function(a){try{d.style.color=r(a)[Y](c,p);var b=f.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b[H](16)).slice(-6)}catch(a){return"none"}})}else{var h=g.createElement("i");h.title="Raphaël Colour Picker";h.style.display="none";g.body[l](h);bi=bm(function(a){h.style.color=a;return g.defaultView.getComputedStyle(h,p).getPropertyValue("color")})}return bi(b)},bj=function(){return"hsb("+[this.h,this.s,this.b]+")"},bk=function(){return"hsl("+[this.h,this.s,this.l]+")"},bl=function(){return this.hex};a.hsb2rgb=function(b,c,d,e){if(a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b){d=b.b;c=b.s;b=b.h;e=b.o}return a.hsl2rgb(b,c,d/2,e)};a.hsl2rgb=function(b,c,d,e){if(a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b){d=b.l;c=b.s;b=b.h}if(b>1||c>1||d>1){b/=360;c/=100;d/=100}var f={},g=["r","g","b"],h,i,j,k,l,m;if(c){d<0.5?h=d*(1+c):h=d+c-d*c;i=2*d-h;for(var n=0;n<3;n++){j=b+1/3*-(n-1);j<0&&j++;j>1&&j--;j*6<1?f[g[n]]=i+(h-i)*6*j:j*2<1?f[g[n]]=h:j*3<2?f[g[n]]=i+(h-i)*(2/3-j)*6:f[g[n]]=i}}else f={r:d,g:d,b:d};f.r*=255;f.g*=255;f.b*=255;f.hex="#"+(16777216|f.b|f.g<<8|f.r<<16).toString(16).slice(1);a.is(e,"finite")&&(f.opacity=e);f.toString=bl;return f};a.rgb2hsb=function(b,c,d){if(c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b){d=b.b;c=b.g;b=b.r}if(c==null&&a.is(b,F)){var e=a.getRGB(b);b=e.r;c=e.g;d=e.b}if(b>1||c>1||d>1){b/=255;c/=255;d/=255}var f=z(b,c,d),g=A(b,c,d),h,i,j=f;{if(g==f)return{h:0,s:0,b:f,toString:bj};var k=f-g;i=k/f;b==f?h=(c-d)/k:c==f?h=2+(d-b)/k:h=4+(b-c)/k;h/=6;h<0&&h++;h>1&&h--}return{h:h,s:i,b:j,toString:bj}};a.rgb2hsl=function(b,c,d){if(c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b){d=b.b;c=b.g;b=b.r}if(c==null&&a.is(b,F)){var e=a.getRGB(b);b=e.r;c=e.g;d=e.b}if(b>1||c>1||d>1){b/=255;c/=255;d/=255}var f=z(b,c,d),g=A(b,c,d),h,i,j=(f+g)/2,k;if(g==f)k={h:0,s:0,l:j};else{var l=f-g;i=j<0.5?l/(f+g):l/(2-f-g);b==f?h=(c-d)/l:c==f?h=2+(d-b)/l:h=4+(b-c)/l;h/=6;h<0&&h++;h>1&&h--;k={h:h,s:i,l:j}}k.toString=bk;return k};a._path2string=function(){return this.join(",")[Y](ba,"$1")};function bm(a,b,c){function d(){var g=Array[e].slice.call(arguments,0),h=g[v]("►"),i=d.cache=d.cache||{},j=d.count=d.count||[];if(i[f](h))return c?c(i[h]):i[h];j[w]>=1000&&delete i[j.shift()];j[L](h);i[h]=a[m](b,g);return c?c(i[h]):i[h]}return d}a.getRGB=bm(function(b){if(!b||!(!((b=r(b)).indexOf("-")+1)))return{r:-1,g:-1,b:-1,hex:"none",error:1};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none"};!(_[f](b.toLowerCase().substring(0,2))||b.charAt()=="#")&&(b=bi(b));var c,d,e,g,h,i,j,k=b.match(N);if(k){if(k[2]){g=T(k[2].substring(5),16);e=T(k[2].substring(3,5),16);d=T(k[2].substring(1,3),16)}if(k[3]){g=T((i=k[3].charAt(3))+i,16);e=T((i=k[3].charAt(2))+i,16);d=T((i=k[3].charAt(1))+i,16)}if(k[4]){j=k[4][s]($);d=S(j[0]);j[0].slice(-1)=="%"&&(d*=2.55);e=S(j[1]);j[1].slice(-1)=="%"&&(e*=2.55);g=S(j[2]);j[2].slice(-1)=="%"&&(g*=2.55);k[1].toLowerCase().slice(0,4)=="rgba"&&(h=S(j[3]));j[3]&&j[3].slice(-1)=="%"&&(h/=100)}if(k[5]){j=k[5][s]($);d=S(j[0]);j[0].slice(-1)=="%"&&(d*=2.55);e=S(j[1]);j[1].slice(-1)=="%"&&(e*=2.55);g=S(j[2]);j[2].slice(-1)=="%"&&(g*=2.55);(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360);k[1].toLowerCase().slice(0,4)=="hsba"&&(h=S(j[3]));j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,g,h)}if(k[6]){j=k[6][s]($);d=S(j[0]);j[0].slice(-1)=="%"&&(d*=2.55);e=S(j[1]);j[1].slice(-1)=="%"&&(e*=2.55);g=S(j[2]);j[2].slice(-1)=="%"&&(g*=2.55);(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360);k[1].toLowerCase().slice(0,4)=="hsla"&&(h=S(j[3]));j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,g,h)}k={r:d,g:e,b:g};k.hex="#"+(16777216|g|e<<8|d<<16).toString(16).slice(1);a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1}},a);a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||0.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=0.075;if(b.h>1){b.h=0;b.s-=0.2;b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})}return c.hex};a.getColor.reset=function(){delete this.start};a.parsePathString=bm(function(b){if(!b)return null;var c={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},d=[];a.is(b,G)&&a.is(b[0],G)&&(d=bo(b));d[w]||r(b)[Y](bb,function(a,b,e){var f=[],g=x.call(b);e[Y](bc,function(a,b){b&&f[L](+b)});if(g=="m"&&f[w]>2){d[L]([b][n](f.splice(0,2)));g="l";b=b=="m"?"l":"L"}while(f[w]>=c[g]){d[L]([b][n](f.splice(0,c[g])));if(!c[g])break}});d[H]=a._path2string;return d});a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=C(j,3)*a+C(j,2)*3*i*c+j*3*i*i*e+C(i,3)*g,l=C(j,3)*b+C(j,2)*3*i*d+j*3*i*i*f+C(i,3)*h,m=a+2*i*(c-a)+i*i*(e-2*c+a),n=b+2*i*(d-b)+i*i*(f-2*d+b),o=c+2*i*(e-c)+i*i*(g-2*e+c),p=d+2*i*(f-d)+i*i*(h-2*f+d),q=(1-i)*a+i*c,r=(1-i)*b+i*d,s=(1-i)*e+i*g,t=(1-i)*f+i*h,u=90-y.atan((m-o)/(n-p))*180/D;(m>o||n1){x=y.sqrt(x);c=x*c;d=x*d}var z=c*c,A=d*d,C=(f==g?-1:1)*y.sqrt(B((z*A-z*u*u-A*t*t)/(z*u*u+A*t*t))),E=C*c*u/d+(a+h)/2,F=C*-d*t/c+(b+i)/2,G=y.asin(((b-F)/d).toFixed(9)),H=y.asin(((i-F)/d).toFixed(9));G=aH&&(G=G-D*2);!g&&H>G&&(H=H-D*2)}var I=H-G;if(B(I)>k){var J=H,K=h,L=i;H=G+k*(g&&H>G?1:-1);h=E+c*y.cos(H);i=F+d*y.sin(H);m=bt(h,i,c,d,e,0,g,K,L,[H,J,E,F])}I=H-G;var M=y.cos(G),N=y.sin(G),O=y.cos(H),P=y.sin(H),Q=y.tan(I/4),R=4/3*c*Q,S=4/3*d*Q,T=[a,b],U=[a+R*N,b-S*M],V=[h+R*P,i-S*O],W=[h,i];U[0]=2*T[0]-U[0];U[1]=2*T[1]-U[1];{if(j)return[U,V,W][n](m);m=[U,V,W][n](m)[v]()[s](",");var X=[];for(var Y=0,Z=m[w];Y"1e12"&&(l=0.5);B(n)>"1e12"&&(n=0.5);if(l>0&&l<1){q=bu(a,b,c,d,e,f,g,h,l);p[L](q.x);o[L](q.y)}if(n>0&&n<1){q=bu(a,b,c,d,e,f,g,h,n);p[L](q.x);o[L](q.y)}i=f-2*d+b-(h-2*f+d);j=2*(d-b)-2*(f-d);k=b-d;l=(-j+y.sqrt(j*j-4*i*k))/2/i;n=(-j-y.sqrt(j*j-4*i*k))/2/i;B(l)>"1e12"&&(l=0.5);B(n)>"1e12"&&(n=0.5);if(l>0&&l<1){q=bu(a,b,c,d,e,f,g,h,l);p[L](q.x);o[L](q.y)}if(n>0&&n<1){q=bu(a,b,c,d,e,f,g,h,n);p[L](q.x);o[L](q.y)}return{min:{x:A[m](0,p),y:A[m](0,o)},max:{x:z[m](0,p),y:z[m](0,o)}}}),bw=bm(function(a,b){var c=bq(a),d=b&&bq(b),e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1];b.Y=a[2];break;case"A":a=["C"][n](bt[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x));d=b.y+(b.y-(b.by||b.y));a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x));b.qy=b.y+(b.y-(b.qy||b.y));a=["C"][n](bs(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1];b.qy=a[2];a=["C"][n](bs(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](br(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](br(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](br(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](br(b.x,b.y,b.X,b.Y));break}return a},h=function(a,b){if(a[b][w]>7){a[b].shift();var e=a[b];while(e[w])a.splice(b++,0,["C"][n](e.splice(0,6)));a.splice(b,1);k=z(c[w],d&&d[w]||0)}},i=function(a,b,e,f,g){if(a&&b&&a[g][0]=="M"&&b[g][0]!="M"){b.splice(g,0,["M",f.x,f.y]);e.bx=0;e.by=0;e.x=a[g][1];e.y=a[g][2];k=z(c[w],d&&d[w]||0)}};for(var j=0,k=z(c[w],d&&d[w]||0);j0.5)*2-1;C(e-0.5,2)+C(f-0.5,2)>0.25&&(f=y.sqrt(0.25-C(e-0.5,2))*g+0.5)&&f!=0.5&&(f=f.toFixed(5)-0.00001*g)}return p});b=b[s](/\s*\-\s*/);if(d=="linear"){var i=b.shift();i=-S(i);if(isNaN(i))return null;var j=[0,0,y.cos(i*D/180),y.sin(i*D/180)],k=1/(z(B(j[2]),B(j[3]))||1);j[2]*=k;j[3]*=k;if(j[2]<0){j[0]=-j[2];j[2]=0}if(j[3]<0){j[1]=-j[3];j[3]=0}}var m=bx(b);if(!m)return null;var n=a.getAttribute(I);n=n.match(/^url\(#(.*)\)$/);n&&c.defs.removeChild(g.getElementById(n[1]));var o=bG(d+"Gradient");o.id=bh();bG(o,d=="radial"?{fx:e,fy:f}:{x1:j[0],y1:j[1],x2:j[2],y2:j[3]});c.defs[l](o);for(var q=0,t=m[w];q1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(o);h[R](n,G.hex);n=="stroke"&&G[f]("opacity")&&bG(h,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity});break;case"gradient":(({circle:1,ellipse:1})[f](c.type)||r(o).charAt()!="r")&&bI(h,o,c.paper);break;case"opacity":i.gradient&&!i[f]("stroke-opacity")&&bG(h,{"stroke-opacity":o>1?o/100:o});case"fill-opacity":if(i.gradient){var H=g.getElementById(h.getAttribute(I)[Y](/^url\(#|\)$/g,p));if(H){var J=H.getElementsByTagName("stop");J[J[w]-1][R]("stop-opacity",o)}break}default:n=="font-size"&&(o=T(o,10)+"px");var K=n[Y](/(\-.)/g,function(a){return V.call(a.substring(1))});h.style[K]=o;h[R](n,o);break}}}bM(c,d);m?c.rotate(m.join(q)):S(j)&&c.rotate(j,true)},bL=1.2,bM=function(b,c){if(b.type!="text"||!(c[f]("text")||c[f]("font")||c[f]("font-size")||c[f]("x")||c[f]("y")))return;var d=b.attrs,e=b.node,h=e.firstChild?T(g.defaultView.getComputedStyle(e.firstChild,p).getPropertyValue("font-size"),10):10;if(c[f]("text")){d.text=c.text;while(e.firstChild)e.removeChild(e.firstChild);var i=r(c.text)[s]("\n");for(var j=0,k=i[w];jb.height&&(b.height=e.y+e.height-b.y);e.x+e.width-b.x>b.width&&(b.width=e.x+e.width-b.x)}}a&&this.hide();return b};bN[e].attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);this._.rt.deg&&(d.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(d.scale=this.scale());d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient;return d}if(c==null&&a.is(b,F)){if(b=="translation")return cz.call(this);if(b=="rotation")return this.rotate();if(b=="scale")return this.scale();if(b==I&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return this.attrs[b]}if(c==null&&a.is(b,G)){var g={};for(var h=0,i=b.length;h"));m.W=h.w=m.paper.span.offsetWidth;m.H=h.h=m.paper.span.offsetHeight;m.X=h.x;m.Y=h.y+Q(m.H/2);switch(h["text-anchor"]){case"start":m.node.style["v-text-align"]="left";m.bbx=Q(m.W/2);break;case"end":m.node.style["v-text-align"]="right";m.bbx=-Q(m.W/2);break;default:m.node.style["v-text-align"]="center";break}}};bI=function(a,b){a.attrs=a.attrs||{};var c=a.attrs,d,e="linear",f=".5 .5";a.attrs.gradient=b;b=r(b)[Y](bd,function(a,b,c){e="radial";if(b&&c){b=S(b);c=S(c);C(b-0.5,2)+C(c-0.5,2)>0.25&&(c=y.sqrt(0.25-C(b-0.5,2))*((c>0.5)*2-1)+0.5);f=b+q+c}return p});b=b[s](/\s*\-\s*/);if(e=="linear"){var g=b.shift();g=-S(g);if(isNaN(g))return null}var h=bx(b);if(!h)return null;a=a.shape||a.node;d=a.getElementsByTagName(I)[0]||cd(I);!d.parentNode&&a.appendChild(d);if(h[w]){d.on=true;d.method="none";d.color=h[0].color;d.color2=h[h[w]-1].color;var i=[];for(var j=0,k=h[w];j")}}catch(a){cd=function(a){return g.createElement("<"+a+" xmlns=\"urn:schemas-microsoft.com:vml\" class=\"rvml\">")}}bV=function(){var b=by[m](0,arguments),c=b.container,d=b.height,e,f=b.width,h=b.x,i=b.y;if(!c)throw new Error("VML container not found.");var k=new j,n=k.canvas=g.createElement("div"),o=n.style;h=h||0;i=i||0;f=f||512;d=d||342;f==+f&&(f+="px");d==+d&&(d+="px");k.width=1000;k.height=1000;k.coordsize=b_*1000+q+b_*1000;k.coordorigin="0 0";k.span=g.createElement("span");k.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";n[l](k.span);o.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d);if(c==1){g.body[l](n);o.left=h+"px";o.top=i+"px";o.position="absolute"}else c.firstChild?c.insertBefore(n,c.firstChild):c[l](n);bz.call(k,k,a.fn);return k};k.clear=function(){this.canvas.innerHTML=p;this.span=g.createElement("span");this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";this.canvas[l](this.span);this.bottom=this.top=null};k.remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bF(a);return true}}var ce=navigator.userAgent.match(/Version\\x2f(.*?)\s/);navigator.vendor=="Apple Computer, Inc."&&(ce&&ce[1]<4||navigator.platform.slice(0,2)=="iP")?k.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});h.setTimeout(function(){a.remove()})}:k.safari=function(){};var cf=function(){this.returnValue=false},cg=function(){return this.originalEvent.preventDefault()},ch=function(){this.cancelBubble=true},ci=function(){return this.originalEvent.stopPropagation()},cj=(function(){{if(g.addEventListener)return function(a,b,c,d){var e=o&&u[b]?u[b]:b,g=function(e){if(o&&u[f](b))for(var g=0,h=e.targetTouches&&e.targetTouches.length;g1&&(a=Array[e].splice.call(arguments,0,arguments[w]));return new cC(a)};k.setSize=bU;k.top=k.bottom=null;k.raphael=a;function co(){return this.x+q+this.y}bO.resetScale=function(){if(this.removed)return this;this._.sx=1;this._.sy=1;this.attrs.scale="1 1"};bO.scale=function(a,b,c,d){if(this.removed)return this;if(a==null&&b==null)return{x:this._.sx,y:this._.sy,toString:co};b=b||a;!(+b)&&(b=a);var e,f,g,h,i=this.attrs;if(a!=0){var j=this.getBBox(),k=j.x+j.width/2,l=j.y+j.height/2,m=B(a/this._.sx),o=B(b/this._.sy);c=+c||c==0?c:k;d=+d||d==0?d:l;var r=this._.sx>0,s=this._.sy>0,t=~(~(a/B(a))),u=~(~(b/B(b))),x=m*t,y=o*u,z=this.node.style,A=c+B(k-c)*x*(k>c==r?1:-1),C=d+B(l-d)*y*(l>d==s?1:-1),D=a*t>b*u?o:m;switch(this.type){case"rect":case"image":var E=i.width*m,F=i.height*o;this.attr({height:F,r:i.r*D,width:E,x:A-E/2,y:C-F/2});break;case"circle":case"ellipse":this.attr({rx:i.rx*m,ry:i.ry*o,r:i.r*D,cx:A,cy:C});break;case"text":this.attr({x:A,y:C});break;case"path":var G=bp(i.path),H=true,I=r?x:m,J=s?y:o;for(var K=0,L=G[w];Kr)p=n.data[r*l];else{p=a.findDotsAtSegment(b,c,d,e,f,g,h,i,r/l);n.data[r]=p}r&&(k+=C(C(o.x-p.x,2)+C(o.y-p.y,2),0.5));if(j!=null&&k>=j)return p;o=p}if(j==null)return k},cr=function(b,c){return function(d,e,f){d=bw(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;oe){if(c&&!l.start){m=cq(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);k+=["C",m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k;k=["M",m.x,m.y+"C",m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]][v]();n+=j;g=+i[5];h=+i[6];continue}if(!b&&!c){m=cq(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j;g=+i[5];h=+i[6]}k+=i}l.end=k;m=b?n:c?l:a.findDotsAtSegment(g,h,i[1],i[2],i[3],i[4],i[5],i[6],1);m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cs=cr(1),ct=cr(),cu=cr(0,1);bO.getTotalLength=function(){if(this.type!="path")return;if(this.node.getTotalLength)return this.node.getTotalLength();return cs(this.attrs.path)};bO.getPointAtLength=function(a){if(this.type!="path")return;return ct(this.attrs.path,a)};bO.getSubpath=function(a,b){if(this.type!="path")return;if(B(this.getTotalLength()-b)<"1e-6")return cu(this.attrs.path,a).end;var c=cu(this.attrs.path,b,1);return a?cu(c,a).end:c};a.easing_formulas={linear:function(a){return a},"<":function(a){return C(a,3)},">":function(a){return C(a-1,3)+1},"<>":function(a){a=a*2;if(a<1)return C(a,3)/2;a-=2;return(C(a,3)+2)/2},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==0||a==1)return a;var b=0.3,c=b/4;return C(2,-10*a)*y.sin((a-c)*(2*D)/b)+1},bounce:function(a){var b=7.5625,c=2.75,d;if(a<1/c)d=b*a*a;else if(a<2/c){a-=1.5/c;d=b*a*a+0.75}else if(a<2.5/c){a-=2.25/c;d=b*a*a+0.9375}else{a-=2.625/c;d=b*a*a+0.984375}return d}};var cv=[],cw=function(){var b=+(new Date);for(var c=0;cd)return d;while(cf?c=e:d=e;e=(d-c)/2+c}return e}return n(a,1/(200*f))}bO.onAnimation=function(a){this._run=a||0;return this};bO.animate=function(c,d,e,g){var h=this;h.timeouts=h.timeouts||[];if(a.is(e,"function")||!e)g=e||null;if(h.removed){g&&g.call(h);return h}var i={},j={},k=false,l={};for(var m in c)if(c[f](m)){if(X[f](m)||h.paper.customAttributes[f](m)){k=true;i[m]=h.attr(m);i[m]==null&&(i[m]=W[m]);j[m]=c[m];switch(X[m]){case"along":var n=cs(c[m]),o=ct(c[m],n*!(!c.back)),p=h.getBBox();l[m]=n/d;l.tx=p.x;l.ty=p.y;l.sx=o.x;l.sy=o.y;j.rot=c.rot;j.back=c.back;j.len=n;c.rot&&(l.r=S(h.rotate())||0);break;case E:l[m]=(j[m]-i[m])/d;break;case"colour":i[m]=a.getRGB(i[m]);var q=a.getRGB(j[m]);l[m]={r:(q.r-i[m].r)/d,g:(q.g-i[m].g)/d,b:(q.b-i[m].b)/d};break;case"path":var t=bw(i[m],j[m]);i[m]=t[0];var u=t[1];l[m]=[];for(var v=0,x=i[m][w];v8&&c.useMovieStar){if(d.isMovieStar===null)d.isMovieStar=d.serverURL||d.type&&d.type.match(c.netStreamPattern)||d.url.match(c.netStreamPattern)?!0:!1;if(d.isMovieStar&&d.usePeakData)d.usePeakData= -!1}d=T(d,"soundManager.createSound(): ");f=a();if(k===8)c.o._createSound(d.id,d.onjustbeforefinishtime,d.loops||1,d.usePolicyFile);else if(c.o._createSound(d.id,d.url,d.onjustbeforefinishtime,d.usePeakData,d.useWaveformData,d.useEQData,d.isMovieStar,d.isMovieStar?d.bufferTime:!1,d.loops||1,d.serverURL,d.duration||null,d.autoPlay,!0,d.autoLoad,d.usePolicyFile),!d.serverURL)f.connected=!0,d.onconnect&&d.onconnect.apply(f);(d.autoLoad||d.autoPlay)&&!d.serverURL&&f.load(d)}d.autoPlay&&!d.serverURL&&f.play(); -return f};this.destroySound=function(b,a){if(!j(b))return!1;var e=c.sounds[b],f;e._iO={};e.stop();e.unload();for(f=0;f0)a.resume();else{a.playState=1;a.paused=!1;(!a.instanceCount||a._iO.multiShotEvents||k>8&&!a.isHTML5&&!a.getAutoPlay())&&a.instanceCount++;a.position=typeof a._iO.position!=="undefined"&&!isNaN(a._iO.position)?a._iO.position:0;if(!a.isHTML5)a._iO=T(S(a._iO));if(a._iO.onplay&& -W)a._iO.onplay.apply(a),a._onplay_called=!0;a.setVolume(a._iO.volume,!0);a.setPan(a._iO.pan,!0);a.isHTML5?(d(),a._setup_html5().play()):c.o._start(a.sID,a._iO.loops||1,k===9?a.position:a.position/1E3)}return a};this.stop=function(b){if(a.playState===1){a._onbufferchange(0);a.resetOnPosition(0);if(!a.isHTML5)a.playState=0;a.paused=!1;a._iO.onstop&&a._iO.onstop.apply(a);if(a.isHTML5){if(a._a)a.setPosition(0),a._a.pause(),a.playState=0,a._onTimer(),f(),a.unload()}else c.o._stop(a.sID,b),a._iO.serverURL&& -a.unload();a.instanceCount=0;a._iO={}}return a};this.setAutoPlay=function(b){a._iO.autoPlay=b;a.isHTML5?a._a&&b&&a.play():c.o._setAutoPlay(a.sID,b);b&&!a.instanceCount&&a.readyState===1&&a.instanceCount++};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPosition=function(b){b===void 0&&(b=0);var d=a.isHTML5?Math.max(b,0):Math.min(a.duration||a._iO.duration,Math.max(b,0));a.position=d;b=a.position/1E3;a.resetOnPosition(a.position);a._iO.position=d;if(a.isHTML5){if(a._a&&a._html5_canplay&& -a._a.currentTime!==b)try{a._a.currentTime=b}catch(e){}}else b=k===9?a.position:b,a.readyState&&a.readyState!==2&&c.o._setPosition(a.sID,b,a.paused||!a.playState);a.isHTML5&&a.paused&&a._onTimer(!0);return a};this.pause=function(b){if(a.paused||a.playState===0&&a.readyState!==1)return a;a.paused=!0;a.isHTML5?(a._setup_html5().pause(),f()):(b||b===void 0)&&c.o._pause(a.sID);a._iO.onpause&&a._iO.onpause.apply(a);return a};this.resume=function(){if(!a.paused)return a;a.paused=!1;a.playState=1;a.isHTML5? -(a._setup_html5().play(),d()):(a._iO.isMovieStar&&a.setPosition(a.position),c.o._pause(a.sID));!a._onplay_called&&a._iO.onplay?(a._iO.onplay.apply(a),a._onplay_called=!0):a._iO.onresume&&a._iO.onresume.apply(a);return a};this.togglePause=function(){if(a.playState===0)return a.play({position:k===9&&!a.isHTML5?a.position:a.position/1E3}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(b,d){typeof b==="undefined"&&(b=0);typeof d==="undefined"&&(d=!1);a.isHTML5||c.o._setPan(a.sID,b);a._iO.pan= -b;if(!d)a.pan=b,a.options.pan=b;return a};this.setVolume=function(b,d){typeof b==="undefined"&&(b=100);typeof d==="undefined"&&(d=!1);if(a.isHTML5){if(a._a)a._a.volume=Math.max(0,Math.min(1,b/100))}else c.o._setVolume(a.sID,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;if(!d)a.volume=b,a.options.volume=b;return a};this.mute=function(){a.muted=!0;if(a.isHTML5){if(a._a)a._a.muted=!0}else c.o._setVolume(a.sID,0);return a};this.unmute=function(){a.muted=!1;var b=typeof a._iO.volume!=="undefined";if(a.isHTML5){if(a._a)a._a.muted= -!1}else c.o._setVolume(a.sID,b?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=function(c,b,d){a._onPositionItems.push({position:c,method:b,scope:typeof d!=="undefined"?d:a,fired:!1});return a};this.processOnPosition=function(){var b,d;b=a._onPositionItems.length;if(!b||!a.playState||a._onPositionFired>=b)return!1;for(;b--;)if(d=a._onPositionItems[b],!d.fired&&a.position>=d.position)d.method.apply(d.scope,[d.position]),d.fired= -!0,c._onPositionFired++;return!0};this.resetOnPosition=function(b){var d,e;d=a._onPositionItems.length;if(!d)return!1;for(;d--;)if(e=a._onPositionItems[d],e.fired&&b<=e.position)e.fired=!1,c._onPositionFired--;return!0};this._onTimer=function(c){var b={};if(a._hasTimer||c)return a._a&&(c||(a.playState>0||a.readyState===1)&&!a.paused)?(a.duration=a._get_html5_duration(),a.durationEstimate=a.duration,c=a._a.currentTime?a._a.currentTime*1E3:0,a._whileplaying(c,b,b,b,b),!0):!1};this._get_html5_duration= -function(){var c=a._a?a._a.duration*1E3:a._iO?a._iO.duration:void 0;return c&&!isNaN(c)&&c!==Infinity?c:a._iO?a._iO.duration:null};d=function(){a.isHTML5&&wa(a)};f=function(){a.isHTML5&&xa(a)};e=function(){a._onPositionItems=[];a._onPositionFired=0;a._hasTimer=null;a._onplay_called=!1;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal=null;a.position=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.failures=0;a.loaded=!1;a.playState=0;a.paused=!1;a.readyState= -0;a.muted=!1;a.didBeforeFinish=!1;a.didJustBeforeFinish=!1;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.eqData=[];a.eqData.left=[];a.eqData.right=[]};e();this._setup_html5=function(b){var b=o(a._iO,b),d=K?c._global_a:a._a;decodeURI(b.url);var f=d&&d._t?d._t.instanceOptions:null;if(d){if(d._t&&f.url===b.url&&(!a._lastURL||a._lastURL===f.url))return d;K&&d._t&&d._t.playState&&b.url!==f.url&&d._t.stop();e();d.src=b.url;a.url= -b.url;a._lastURL=b.url;d._called_load=!1}else if(d=new Audio(b.url),d._called_load=!1,K)c._global_a=d;a.isHTML5=!0;a._a=d;d._t=a;a._add_html5_events();d.loop=b.loops>1?"loop":"";b.autoLoad||b.autoPlay?(d.autobuffer="auto",d.preload="auto",a.load(),d._called_load=!0):(d.autobuffer=!1,d.preload="none");d.loop=b.loops>1?"loop":"";return d};this._add_html5_events=function(){if(a._a._added_events)return!1;var b;a._a._added_events=!0;for(b in c._html5_events)c._html5_events.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b, -c._html5_events[b],!1);return!0};this._remove_html5_events=function(){a._a._added_events=!1;for(var b in c._html5_events)c._html5_events.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,c._html5_events[b],!1)};this._whileloading=function(c,b,d,e){a.bytesLoaded=c;a.bytesTotal=b;a.duration=Math.floor(d);a.bufferLength=e;if(a._iO.isMovieStar)a.durationEstimate=a.duration;else if(a.durationEstimate=a._iO.duration?a.duration>a._iO.duration?a.duration:a._iO.duration:parseInt(a.bytesTotal/a.bytesLoaded* -a.duration,10),a.durationEstimate===void 0)a.durationEstimate=a.duration;a.readyState!==3&&a._iO.whileloading&&a._iO.whileloading.apply(a)};this._onid3=function(c,b){var d=[],e,f;e=0;for(f=c.length;e0&&(b=0);a.position=b;a.processOnPosition();if(k>8&&!a.isHTML5){if(a._iO.usePeakData&&typeof d!=="undefined"&&d)a.peakData={left:d.leftPeak,right:d.rightPeak}; -if(a._iO.useWaveformData&&typeof e!=="undefined"&&e)a.waveformData={left:e.split(","),right:f.split(",")};if(a._iO.useEQData&&typeof g!=="undefined"&&g&&g.leftEQ&&(b=g.leftEQ.split(","),a.eqData=b,a.eqData.left=b,typeof g.rightEQ!=="undefined"&&g.rightEQ))a.eqData.right=g.rightEQ.split(",")}a.playState===1&&(!a.isHTML5&&c.flashVersion===8&&!a.position&&a.isBuffering&&a._onbufferchange(0),a._iO.whileplaying&&a._iO.whileplaying.apply(a),(a.loaded||!a.loaded&&a._iO.isMovieStar)&&a._iO.onbeforefinish&& -a._iO.onbeforefinishtime&&!a.didBeforeFinish&&a.duration-a.position<=a._iO.onbeforefinishtime&&a._onbeforefinish());return!0};this._onconnect=function(b){b=b===1;if(a.connected=b)a.failures=0,j(a.sID)&&(a.getAutoPlay()?a.play(void 0,a.getAutoPlay()):a._iO.autoLoad&&a.load()),a._iO.onconnect&&a._iO.onconnect.apply(a,[b])};this._onload=function(b){b=b?!0:!1;a.loaded=b;a.readyState=b?3:2;a._onbufferchange(0);a._iO.onload&&a._iO.onload.apply(a,[b]);return!0};this._onfailure=function(b,c,d){a.failures++; -if(a._iO.onfailure&&a.failures===1)a._iO.onfailure(a,b,c,d)};this._onbeforefinish=function(){if(!a.didBeforeFinish)a.didBeforeFinish=!0,a._iO.onbeforefinish&&a._iO.onbeforefinish.apply(a)};this._onjustbeforefinish=function(){if(!a.didJustBeforeFinish)a.didJustBeforeFinish=!0,a._iO.onjustbeforefinish&&a._iO.onjustbeforefinish.apply(a)};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a.resetOnPosition(0);a._iO.onbeforefinishcomplete&&a._iO.onbeforefinishcomplete.apply(a);a.didBeforeFinish= -!1;a.didJustBeforeFinish=!1;if(a.instanceCount){a.instanceCount--;if(!a.instanceCount)a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},f();(!a.instanceCount||a._iO.multiShotEvents)&&b&&b.apply(a)}};this._onbufferchange=function(b){if(a.playState===0)return!1;if(b&&a.isBuffering||!b&&!a.isBuffering)return!1;a.isBuffering=b===1;a._iO.onbufferchange&&a._iO.onbufferchange.apply(a);return!0};this._ondataerror=function(){a.playState>0&&a._iO.ondataerror&&a._iO.ondataerror.apply(a)}}; -ea=function(){return g.body?g.body:g._docElement?g.documentElement:g.getElementsByTagName("div")[0]};y=function(b){return g.getElementById(b)};o=function(b,a){var e={},f,d;for(f in b)b.hasOwnProperty(f)&&(e[f]=b[f]);f=typeof a==="undefined"?c.defaultOptions:a;for(d in f)f.hasOwnProperty(d)&&typeof e[d]==="undefined"&&(e[d]=f[d]);return e};l=function(){function b(a){var a=Da.call(a),b=a.length;c?(a[1]="on"+a[1],b>3&&a.pop()):b===3&&a.push(!1);return a}function a(a,b){var g=a.shift(),h=[f[b]];if(c)g[h](a[0], -a[1]);else g[h].apply(g,a)}var c=h.attachEvent,f={add:c?"attachEvent":"addEventListener",remove:c?"detachEvent":"removeEventListener"};return{add:function(){a(b(arguments),"add")},remove:function(){a(b(arguments),"remove")}}}();V=function(b){return!b.serverURL&&(b.type?J({type:b.type}):J(b.url)||p)};J=function(b){if(!c.useHTML5Audio||!c.hasHTML5)return!1;var a,e=c.audioFormats;if(!s){s=[];for(a in e)e.hasOwnProperty(a)&&(s.push(a),e[a].related&&(s=s.concat(e[a].related)));s=RegExp("\\.("+s.join("|")+ -")","i")}a=typeof b.type!=="undefined"?b.type:null;b=typeof b==="string"?b.toLowerCase().match(s):null;if(!b||!b.length)if(a)b=a.indexOf(";"),b=(b!==-1?a.substr(0,b):a).substr(6);else return!1;else b=b[0].substr(1);if(b&&typeof c.html5[b]!=="undefined")return c.html5[b];else{if(!a)if(b&&c.html5[b])return c.html5[b];else a="audio/"+b;a=c.html5.canPlayType(a);return c.html5[b]=a}};za=function(){function b(b){var d,e,f=!1;if(!a||typeof a.canPlayType!=="function")return!1;if(b instanceof Array){d=0;for(e= -b.length;d1&&b.stream)b.stream=!1;return b};T=function(b){if(b&&!b.usePolicyFile&&(b.onid3||b.usePeakData||b.useWaveformData||b.useEQData))b.usePolicyFile=!0;return b};ia=function(b){typeof console!=="undefined"&&typeof console.warn!=="undefined"&&console.warn(b)};$=function(){return!1};ua=function(b){for(var a in b)b.hasOwnProperty(a)&&typeof b[a]==="function"&&(b[a]=$)};R=function(b){typeof b==="undefined"&& -(b=!1);(t||b)&&c.disable(b)};va=function(b){var a=null;if(b)if(b.match(/\.swf(\?.*)?$/i)){if(a=b.substr(b.toLowerCase().lastIndexOf(".swf?")+4))return b}else b.lastIndexOf("/")!==b.length-1&&(b+="/");return(b&&b.lastIndexOf("/")!==-1?b.substr(0,b.lastIndexOf("/")+1):"./")+c.movieURL};ca=function(){if(k!==8&&k!==9)c.flashVersion=8;var b=c.debugMode||c.debugFlash?"_debug.swf":".swf";if(c.useHTML5Audio&&!p&&c.audioFormats.mp4.required&&c.flashVersion<9)c.flashVersion=9;k=c.flashVersion;c.version=c.versionNumber+ -(p?" (HTML5-only mode)":k===9?" (AS3/Flash 9)":" (AS2/Flash 8)");if(k>8)c.defaultOptions=o(c.defaultOptions,c.flash9Options),c.features.buffering=!0;k>8&&c.useMovieStar?(c.defaultOptions=o(c.defaultOptions,c.movieStarOptions),c.filePatterns.flash9=RegExp("\\.(mp3|"+c.netStreamTypes.join("|")+")(\\?.*)?$","i"),c.mimePattern=c.netStreamMimeTypes,c.features.movieStar=!0):(c.useMovieStar=!1,c.features.movieStar=!1);c.filePattern=c.filePatterns[k!==8?"flash9":"flash8"];c.movieURL=(k===8?"soundmanager2.swf": -"soundmanager2_flash9.swf").replace(".swf",b);c.features.peakData=c.features.waveformData=c.features.eqData=k>8};ta=function(b,a){if(!c.o||!c.allowPolling)return!1;c.o._setPolling(b,a)};Q=function(b,a){var e=a?a:c.url,f=c.altURL?c.altURL:e,d;d=ea();var h,k,i=B(),j,l=null,l=(l=g.getElementsByTagName("html")[0])&&l.dir&&l.dir.match(/rtl/i),b=typeof b==="undefined"?c.id:b;if(E&&F)return!1;if(p)return ca(),c.oMC=y(c.movieID),O(),F=E=!0,!1;E=!0;ca();c.url=va(c._overHTTP?e:f);a=c.url;c.wmode=!c.wmode&& -c.useHighPerformance&&!c.useMovieStar?"transparent":c.wmode;if(c.wmode!==null&&(n.match(/msie 8/i)||!q&&!c.useHighPerformance)&&navigator.platform.match(/win32|win64/i))c.specialWmodeCase=!0,c.wmode=null;d={name:b,id:b,src:a,width:"100%",height:"100%",quality:"high",allowScriptAccess:c.allowScriptAccess,bgcolor:c.bgColor,pluginspage:c._http+"//www.macromedia.com/go/getflashplayer",type:"application/x-shockwave-flash",wmode:c.wmode,hasPriority:"true"};if(c.debugFlash)d.FlashVars="debug=1";c.wmode|| -delete d.wmode;if(q)e=g.createElement("div"),k=''+(c.wmode?' ':"")+ -''+(c.debugFlash?'':"")+"";else for(h in e=g.createElement("embed"),d)d.hasOwnProperty(h)&&e.setAttribute(h,d[h]);pa();i=B();if(d=ea())if(c.oMC=y(c.movieID)?y(c.movieID):g.createElement("div"),c.oMC.id){j=c.oMC.className;c.oMC.className=(j?j+" ":c.swfCSS.swfDefault)+(i?" "+i:"");c.oMC.appendChild(e);if(q)h=c.oMC.appendChild(g.createElement("div")),h.className=c.swfCSS.swfBox,h.innerHTML=k;F=!0}else{c.oMC.id= -c.movieID;c.oMC.className=c.swfCSS.swfDefault+" "+i;h=i=null;if(!c.useFlashBlock)if(c.useHighPerformance)i={position:"fixed",width:"8px",height:"8px",bottom:"0px",left:"0px",overflow:"hidden"};else if(i={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},l)i.left=Math.abs(parseInt(i.left,10))+"px";if(Fa)c.oMC.style.zIndex=1E4;if(!c.debugFlash)for(j in i)i.hasOwnProperty(j)&&(c.oMC.style[j]=i[j]);try{q||c.oMC.appendChild(e);d.appendChild(c.oMC);if(q)h=c.oMC.appendChild(g.createElement("div")), -h.className=c.swfCSS.swfBox,h.innerHTML=k;F=!0}catch(m){throw Error(w("appXHTML"));}}return!0};j=this.getSoundById;H=function(){if(p)return Q(),!1;if(c.o)return!1;c.o=c.getMovie(c.id);if(!c.o)I?(q?c.oMC.innerHTML=ga:c.oMC.appendChild(I),I=null,E=!0):Q(c.id,c.url),c.o=c.getMovie(c.id);c.oninitmovie instanceof Function&&setTimeout(c.oninitmovie,1);return!0};ba=function(b){if(b)c.url=b;H()};P=function(){setTimeout(ra,500)};ra=function(){if(U)return!1;U=!0;l.remove(h,"load",P);if(D&&!na)return!1;var b; -m||(b=c.getMoviePercent());setTimeout(function(){b=c.getMoviePercent();!m&&Ca&&(b===null?c.useFlashBlock||c.flashLoadTimeout===0?c.useFlashBlock&&ha():R(!0):c.flashLoadTimeout!==0&&R(!0))},c.flashLoadTimeout)};ba=function(b){if(b)c.url=b;H()};B=function(){var b=[];c.debugMode&&b.push(c.swfCSS.sm2Debug);c.debugFlash&&b.push(c.swfCSS.flashDebug);c.useHighPerformance&&b.push(c.swfCSS.highPerf);return b.join(" ")};ha=function(){w("fbHandler");var b=c.getMoviePercent(),a=c.swfCSS;if(c.ok()){if(c.oMC)c.oMC.className= -[B(),a.swfDefault,a.swfLoaded+(c.didFlashBlock?" "+a.swfUnblocked:"")].join(" ")}else{if(x)c.oMC.className=B()+" "+a.swfDefault+" "+(b===null?a.swfTimedout:a.swfError);c.didFlashBlock=!0;u({type:"ontimeout",ignoreInit:!0});c.onerror instanceof Function&&c.onerror.apply(h)}};v=function(){function b(){l.remove(h,"focus",v);l.remove(h,"load",v)}if(na||!D)return b(),!0;na=Ca=!0;L&&D&&l.remove(h,"mousemove",v);U=!1;b();return!0};G=function(b){if(m)return!1;if(p)return m=!0,u(),z(),!0;c.useFlashBlock&& -c.flashLoadTimeout&&!c.getMoviePercent()||(m=!0);if(t||b){if(c.useFlashBlock)c.oMC.className=B()+" "+(c.getMoviePercent()===null?c.swfCSS.swfTimedout:c.swfCSS.swfError);u({type:"ontimeout"});c.onerror instanceof Function&&c.onerror.apply(h);return!1}l.add(h,"unload",$);if(c.waitForWindowLoad&&!qa)return l.add(h,"load",z),!1;else z();return!0};aa=function(b,a,c){typeof r[b]==="undefined"&&(r[b]=[]);r[b].push({method:a,scope:c||null,fired:!1})};u=function(b){b||(b={type:"onready"});if(!m&&b&&!b.ignoreInit)return!1; -var a={success:b&&b.ignoreInit?c.ok():!t},e=b&&b.type?r[b.type]||[]:[],b=[],f,d=x&&c.useFlashBlock&&!c.ok();for(f=0;f0) - 'onid3': null, // callback function for "ID3 data is added/available" - 'onload': null, // callback function for "load finished" - 'whileloading': null, // callback function for "download progress update" (X of Y bytes received) - 'onplay': null, // callback for "play" start - 'onpause': null, // callback for "pause" - 'onresume': null, // callback for "resume" (pause toggle) - 'whileplaying': null, // callback during play (position update) - 'onstop': null, // callback for "user stop" - 'onfailure': null, // callback function for when playing fails - 'onfinish': null, // callback function for "sound finished playing" - 'onbeforefinish': null, // callback for "before sound finished playing (at [time])" - 'onbeforefinishtime': 5000, // offset (milliseconds) before end of sound to trigger beforefinish (eg. 1000 msec = 1 second) - 'onbeforefinishcomplete': null,// function to call when said sound finishes playing - 'onjustbeforefinish': null, // callback for [n] msec before end of current sound - 'onjustbeforefinishtime': 200, // [n] - if not using, set to 0 (or null handler) and event will not fire. - 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time - 'multiShotEvents': false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled - 'position': null, // offset (milliseconds) to seek to within loaded sound data. - 'pan': 0, // "pan" settings, left-to-right, -100 to 100 - 'type': null, // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3 - 'usePolicyFile': false, // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access) - 'volume': 100 // self-explanatory. 0-100, the latter being the max. - }; - - this.flash9Options = { // flash 9-only options, merged into defaultOptions if flash 9 is being used - 'isMovieStar': null, // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL - 'usePeakData': false, // enable left/right channel peak (level) data - 'useWaveformData': false, // enable sound spectrum (raw waveform data) - WARNING: CPU-INTENSIVE: may set CPUs on fire. - 'useEQData': false, // enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive. - 'onbufferchange': null, // callback for "isBuffering" property change - 'ondataerror': null // callback for waveform/eq data access error (flash playing audio in other tabs/domains) - }; - - this.movieStarOptions = { // flash 9.0r115+ MPEG4 audio options, merged into defaultOptions if flash 9+movieStar mode is enabled - 'bufferTime': 3, // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.) - 'serverURL': null, // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants - 'onconnect': null, // rtmp: callback for connection to flash media server - 'duration': null // rtmp: song duration (msec) - }; - - this.version = null; - this.versionNumber = 'V2.97a.20110424'; - this.movieURL = null; - this.url = (smURL || null); - this.altURL = null; - this.swfLoaded = false; - this.enabled = false; - this.o = null; - this.movieID = 'sm2-container'; - this.id = (smID || 'sm2movie'); - this.swfCSS = { - 'swfBox': 'sm2-object-box', - 'swfDefault': 'movieContainer', - 'swfError': 'swf_error', // SWF loaded, but SM2 couldn't start (other error) - 'swfTimedout': 'swf_timedout', - 'swfLoaded': 'swf_loaded', - 'swfUnblocked': 'swf_unblocked', // or loaded OK - 'sm2Debug': 'sm2_debug', - 'highPerf': 'high_performance', - 'flashDebug': 'flash_debug' - }; - this.oMC = null; - this.sounds = {}; - this.soundIDs = []; - this.muted = false; - this.debugID = 'soundmanager-debug'; - this.debugURLParam = /([#?&])debug=1/i; - this.specialWmodeCase = false; - this.didFlashBlock = false; - - this.filePattern = null; - this.filePatterns = { - 'flash8': /\.mp3(\?.*)?$/i, - 'flash9': /\.mp3(\?.*)?$/i - }; - - this.baseMimeTypes = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // mp3 - this.netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // mp3, mp4, aac etc. - this.netStreamTypes = ['aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'mp4v', '3gp', '3g2']; // Flash v9.0r115+ "moviestar" formats - this.netStreamPattern = new RegExp('\\.(' + this.netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); - this.mimePattern = this.baseMimeTypes; - - this.features = { - 'buffering': false, - 'peakData': false, - 'waveformData': false, - 'eqData': false, - 'movieStar': false - }; - - this.sandbox = { - // - 'type': null, - 'types': { - 'remote': 'remote (domain-based) rules', - 'localWithFile': 'local with file access (no internet access)', - 'localWithNetwork': 'local with network (internet access only, no local access)', - 'localTrusted': 'local, trusted (local+internet access)' - }, - 'description': null, - 'noRemote': null, - 'noLocal': null - // - }; - - this.hasHTML5 = null; // switch for handling logic - this.html5 = { // stores canPlayType() results, etc. treat as read-only. - // mp3: boolean - // mp4: boolean - 'usingFlash': null // set if/when flash fallback is needed - }; - this.ignoreFlash = false; // used for special cases (eg. iPad/iPhone/palm OS?) - - // --- private SM2 internals --- - - var SMSound, - _s = this, _sm = 'soundManager', _smc = _sm+'::', _h5 = 'HTML5::', _id, _ua = navigator.userAgent, _win = window, _wl = _win.location.href.toString(), _fV = this.flashVersion, _doc = document, _doNothing, _init, _on_queue = [], _debugOpen = true, _debugTS, _didAppend = false, _appendSuccess = false, _didInit = false, _disabled = false, _windowLoaded = false, _wDS, _wdCount = 0, _initComplete, _mixin, _addOnEvent, _processOnEvents, _initUserOnload, _go, _delayWaitForEI, _waitForEI, _setVersionInfo, _handleFocus, _beginInit, _strings, _initMovie, _dcLoaded, _didDCLoaded, _getDocument, _createMovie, _die, _setPolling, _debugLevels = ['log', 'info', 'warn', 'error'], _defaultFlashVersion = 8, _disableObject, _failSafely, _normalizeMovieURL, _oRemoved = null, _oRemovedHTML = null, _str, _flashBlockHandler, _getSWFCSS, _toggleDebug, _loopFix, _policyFix, _complain, _idCheck, _waitingForEI = false, _initPending = false, _smTimer, _onTimer, _startTimer, _stopTimer, _needsFlash = null, _featureCheck, _html5OK, _html5Only = false, _html5CanPlay, _html5Ext, _dcIE, _testHTML5, _event, _slice = Array.prototype.slice, _useGlobalHTML5Audio = false, _hasFlash, _detectFlash, _badSafariFix, - _is_pre = _ua.match(/pre\//i), _is_iDevice = _ua.match(/(ipad|iphone|ipod)/i), _isMobile = (_ua.match(/mobile/i) || _is_pre || _is_iDevice), _isIE = _ua.match(/msie/i), _isWebkit = _ua.match(/webkit/i), _isSafari = (_ua.match(/safari/i) && !_ua.match(/chrome/i)), _isOpera = (_ua.match(/opera/i)), - _isBadSafari = (!_wl.match(/usehtml5audio/i) && !_wl.match(/sm2\-ignorebadua/i) && _isSafari && _ua.match(/OS X 10_6_([3-9])/i)), // Safari 4 and 5 occasionally fail to load/play HTML5 audio on Snow Leopard due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Known Apple "radar" bug. https://bugs.webkit.org/show_bug.cgi?id=32159 - _hasConsole = (typeof console !== 'undefined' && typeof console.log !== 'undefined'), _isFocused = (typeof _doc.hasFocus !== 'undefined'?_doc.hasFocus():null), _tryInitOnFocus = (typeof _doc.hasFocus === 'undefined' && _isSafari), _okToDisable = !_tryInitOnFocus; - - this._use_maybe = (_wl.match(/sm2\-useHTML5Maybe\=1/i)); // temporary feature: #sm2-useHTML5Maybe=1 forces loose canPlay() check - this._overHTTP = (_doc.location?_doc.location.protocol.match(/http/i):null); - this._http = (!this._overHTTP ? 'http:' : ''); - this.useAltURL = !this._overHTTP; // use altURL if not "online" - this._global_a = null; - - if (_is_iDevice || _is_pre) { - // during HTML5 beta period (off by default), may as well force it on Apple + Palm, flash support unlikely - _s.useHTML5Audio = true; - _s.ignoreFlash = true; - if (_s.useGlobalHTML5Audio) { - _useGlobalHTML5Audio = true; - } - } - - if (_is_pre || this._use_maybe) { - // less-strict canPlayType() checking option - _s.html5Test = /^(probably|maybe)$/i; - } - - // Temporary feature: allow force of HTML5 via URL: #sm2-usehtml5audio=0 or 1 - // - (function(){ - var a = '#sm2-usehtml5audio=', l = _wl, b = null; - if (l.indexOf(a) !== -1) { - b = (l.charAt(l.indexOf(a)+a.length) === '1'); - if (typeof console !== 'undefined' && typeof console.log !== 'undefined') { - console.log((b?'Enabling ':'Disabling ')+'useHTML5Audio via URL parameter'); - } - _s.useHTML5Audio = b; - } - }()); - // - - // --- public API methods --- - - this.ok = function() { - return (_needsFlash?(_didInit && !_disabled):(_s.useHTML5Audio && _s.hasHTML5)); - }; - - this.supported = this.ok; // legacy - - this.getMovie = function(smID) { - return _isIE?_win[smID]:(_isSafari?_id(smID) || _doc[smID]:_id(smID)); - }; - - this.createSound = function(oOptions) { - var _cs = _sm+'.createSound(): ', - thisOptions = null, oSound = null, _tO = null; - if (!_didInit || !_s.ok()) { - _complain(_cs + _str(!_didInit?'notReady':'notOK')); - return false; - } - if (arguments.length === 2) { - // function overloading in JS! :) ..assume simple createSound(id,url) use case - oOptions = { - 'id': arguments[0], - 'url': arguments[1] - }; - } - thisOptions = _mixin(oOptions); // inherit from defaultOptions - _tO = thisOptions; // alias - // - if (_tO.id.toString().charAt(0).match(/^[0-9]$/)) { - _s._wD(_cs + _str('badID', _tO.id), 2); - } - _s._wD(_cs + _tO.id + ' (' + _tO.url + ')', 1); - // - if (_idCheck(_tO.id, true)) { - _s._wD(_cs + _tO.id + ' exists', 1); - return _s.sounds[_tO.id]; - } - - function make() { - thisOptions = _loopFix(thisOptions); - _s.sounds[_tO.id] = new SMSound(_tO); - _s.soundIDs.push(_tO.id); - return _s.sounds[_tO.id]; - } - - if (_html5OK(_tO)) { - oSound = make(); - _s._wD('Loading sound '+_tO.id+' via HTML5'); - oSound._setup_html5(_tO); - } else { - if (_fV > 8 && _s.useMovieStar) { - if (_tO.isMovieStar === null) { - _tO.isMovieStar = ((_tO.serverURL || (_tO.type?_tO.type.match(_s.netStreamPattern):false)||_tO.url.match(_s.netStreamPattern))?true:false); - } - if (_tO.isMovieStar) { - _s._wD(_cs + 'using MovieStar handling'); - } - if (_tO.isMovieStar) { - if (_tO.usePeakData) { - _wDS('noPeak'); - _tO.usePeakData = false; - } - if (_tO.loops > 1) { - _wDS('noNSLoop'); - } - } - } - _tO = _policyFix(_tO, _cs); - oSound = make(); - if (_fV === 8) { - _s.o._createSound(_tO.id, _tO.onjustbeforefinishtime, _tO.loops||1, _tO.usePolicyFile); - } else { - _s.o._createSound(_tO.id, _tO.url, _tO.onjustbeforefinishtime, _tO.usePeakData, _tO.useWaveformData, _tO.useEQData, _tO.isMovieStar, (_tO.isMovieStar?_tO.bufferTime:false), _tO.loops||1, _tO.serverURL, _tO.duration||null, _tO.autoPlay, true, _tO.autoLoad, _tO.usePolicyFile); - if (!_tO.serverURL) { - // We are connected immediately - oSound.connected = true; - if (_tO.onconnect) { - _tO.onconnect.apply(oSound); - } - } - } - - if ((_tO.autoLoad || _tO.autoPlay) && !_tO.serverURL) { - oSound.load(_tO); // call load for non-rtmp streams - } - } - - if (_tO.autoPlay && !_tO.serverURL) { // rtmp will play in onconnect - oSound.play(); - } - return oSound; - }; - - this.destroySound = function(sID, _bFromSound) { - // explicitly destroy a sound before normal page unload, etc. - if (!_idCheck(sID)) { - return false; - } - var oS = _s.sounds[sID], i; - oS._iO = {}; // Disable all callbacks while the sound is being destroyed - oS.stop(); - oS.unload(); - for (i = 0; i < _s.soundIDs.length; i++) { - if (_s.soundIDs[i] === sID) { - _s.soundIDs.splice(i, 1); - break; - } - } - if (!_bFromSound) { - // ignore if being called from SMSound instance - oS.destruct(true); - } - oS = null; - delete _s.sounds[sID]; - return true; - }; - - this.load = function(sID, oOptions) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].load(oOptions); - }; - - this.unload = function(sID) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].unload(); - }; - - this.play = function(sID, oOptions) { - var fN = _sm+'.play(): '; - if (!_didInit || !_s.ok()) { - _complain(fN + _str(!_didInit?'notReady':'notOK')); - return false; - } - if (!_idCheck(sID)) { - if (!(oOptions instanceof Object)) { - oOptions = { - url: oOptions - }; // overloading use case: play('mySound','/path/to/some.mp3'); - } - if (oOptions && oOptions.url) { - // overloading use case, create+play: .play('someID',{url:'/path/to.mp3'}); - _s._wD(fN + 'attempting to create "' + sID + '"', 1); - oOptions.id = sID; - return _s.createSound(oOptions).play(); - } else { - return false; - } - } - return _s.sounds[sID].play(oOptions); - }; - - this.start = this.play; // just for convenience - - this.setPosition = function(sID, nMsecOffset) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].setPosition(nMsecOffset); - }; - - this.stop = function(sID) { - if (!_idCheck(sID)) { - return false; - } - _s._wD(_sm+'.stop(' + sID + ')', 1); - return _s.sounds[sID].stop(); - }; - - this.stopAll = function() { - _s._wD(_sm+'.stopAll()', 1); - for (var oSound in _s.sounds) { - if (_s.sounds[oSound] instanceof SMSound) { - _s.sounds[oSound].stop(); // apply only to sound objects - } - } - }; - - this.pause = function(sID) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].pause(); - }; - - this.pauseAll = function() { - for (var i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].pause(); - } - }; - - this.resume = function(sID) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].resume(); - }; - - this.resumeAll = function() { - for (var i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].resume(); - } - }; - - this.togglePause = function(sID) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].togglePause(); - }; - - this.setPan = function(sID, nPan) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].setPan(nPan); - }; - - this.setVolume = function(sID, nVol) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].setVolume(nVol); - }; - - this.mute = function(sID) { - var fN = _sm+'.mute(): ', - i = 0; - if (typeof sID !== 'string') { - sID = null; - } - if (!sID) { - _s._wD(fN + 'Muting all sounds'); - for (i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].mute(); - } - _s.muted = true; - } else { - if (!_idCheck(sID)) { - return false; - } - _s._wD(fN + 'Muting "' + sID + '"'); - return _s.sounds[sID].mute(); - } - return true; - }; - - this.muteAll = function() { - _s.mute(); - }; - - this.unmute = function(sID) { - var fN = _sm+'.unmute(): ', i; - if (typeof sID !== 'string') { - sID = null; - } - if (!sID) { - _s._wD(fN + 'Unmuting all sounds'); - for (i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].unmute(); - } - _s.muted = false; - } else { - if (!_idCheck(sID)) { - return false; - } - _s._wD(fN + 'Unmuting "' + sID + '"'); - return _s.sounds[sID].unmute(); - } - return true; - }; - - this.unmuteAll = function() { - _s.unmute(); - }; - - this.toggleMute = function(sID) { - if (!_idCheck(sID)) { - return false; - } - return _s.sounds[sID].toggleMute(); - }; - - this.getMemoryUse = function() { - if (_fV === 8) { - return 0; - } - if (_s.o) { - return parseInt(_s.o._getMemoryUse(), 10); - } - }; - - this.disable = function(bNoDisable) { - // destroy all functions - if (typeof bNoDisable === 'undefined') { - bNoDisable = false; - } - if (_disabled) { - return false; - } - _disabled = true; - _wDS('shutdown', 1); - for (var i = _s.soundIDs.length; i--;) { - _disableObject(_s.sounds[_s.soundIDs[i]]); - } - _initComplete(bNoDisable); // fire "complete", despite fail - _event.remove(_win, 'load', _initUserOnload); - return true; - }; - - this.canPlayMIME = function(sMIME) { - var result; - if (_s.hasHTML5) { - result = _html5CanPlay({type:sMIME}); - } - if (!_needsFlash || result) { - // no flash, or OK - return result; - } else { - return (sMIME?(sMIME.match(_s.mimePattern)?true:false):null); - } - }; - - this.canPlayURL = function(sURL) { - var result; - if (_s.hasHTML5) { - result = _html5CanPlay(sURL); - } - if (!_needsFlash || result) { - // no flash, or OK - return result; - } else { - return (sURL?(sURL.match(_s.filePattern)?true:false):null); - } - }; - - this.canPlayLink = function(oLink) { - if (typeof oLink.type !== 'undefined' && oLink.type) { - if (_s.canPlayMIME(oLink.type)) { - return true; - } - } - return _s.canPlayURL(oLink.href); - }; - - this.getSoundById = function(sID, suppressDebug) { - if (!sID) { - throw new Error(_sm+'.getSoundById(): sID is null/undefined'); - } - var result = _s.sounds[sID]; - if (!result && !suppressDebug) { - _s._wD('"' + sID + '" is an invalid sound ID.', 2); - } - return result; - }; - - this.onready = function(oMethod, oScope) { - var sType = 'onready'; - if (oMethod && oMethod instanceof Function) { - if (_didInit) { - _wDS('queue', sType); - } - if (!oScope) { - oScope = _win; - } - _addOnEvent(sType, oMethod, oScope); - _processOnEvents(); - return true; - } else { - throw _str('needFunction', sType); - } - }; - - this.ontimeout = function(oMethod, oScope) { - var sType = 'ontimeout'; - if (oMethod && oMethod instanceof Function) { - if (_didInit) { - _wDS('queue'); - } - if (!oScope) { - oScope = _win; - } - _addOnEvent(sType, oMethod, oScope); - _processOnEvents({type:sType}); - return true; - } else { - throw _str('needFunction', sType); - } - }; - - this.getMoviePercent = function() { - return (_s.o && typeof _s.o.PercentLoaded !== 'undefined'?_s.o.PercentLoaded():null); - }; - - this._writeDebug = function(sText, sType, bTimestamp) { - // pseudo-private console.log()-style output - // - var sDID = 'soundmanager-debug', o, oItem, sMethod; - if (!_s.debugMode) { - return false; - } - if (typeof bTimestamp !== 'undefined' && bTimestamp) { - sText = sText + ' | ' + new Date().getTime(); - } - if (_hasConsole && _s.useConsole) { - sMethod = _debugLevels[sType]; - if (typeof console[sMethod] !== 'undefined') { - console[sMethod](sText); - } else { - console.log(sText); - } - if (_s.useConsoleOnly) { - return true; - } - } - try { - o = _id(sDID); - if (!o) { - return false; - } - oItem = _doc.createElement('div'); - if (++_wdCount % 2 === 0) { - oItem.className = 'sm2-alt'; - } - if (typeof sType === 'undefined') { - sType = 0; - } else { - sType = parseInt(sType, 10); - } - oItem.appendChild(_doc.createTextNode(sText)); - if (sType) { - if (sType >= 2) { - oItem.style.fontWeight = 'bold'; - } - if (sType === 3) { - oItem.style.color = '#ff3333'; - } - } - // o.appendChild(oItem); // top-to-bottom - o.insertBefore(oItem, o.firstChild); // bottom-to-top - } catch(e) { - // oh well - } - o = null; - // - return true; - }; - this._wD = this._writeDebug; // alias - - this._debug = function() { - // - _wDS('currentObj', 1); - for (var i = 0, j = _s.soundIDs.length; i < j; i++) { - _s.sounds[_s.soundIDs[i]]._debug(); - } - // - }; - - this.reboot = function() { - // attempt to reset and init SM2 - _s._wD(_sm+'.reboot()'); - if (_s.soundIDs.length) { - _s._wD('Destroying ' + _s.soundIDs.length + ' SMSound objects...'); - } - var i, j; - for (i = _s.soundIDs.length; i--;) { - _s.sounds[_s.soundIDs[i]].destruct(); - } - // trash ze flash - try { - if (_isIE) { - _oRemovedHTML = _s.o.innerHTML; - } - _oRemoved = _s.o.parentNode.removeChild(_s.o); - _s._wD('Flash movie removed.'); - } catch(e) { - // uh-oh. - _wDS('badRemove', 2); - } - // actually, force recreate of movie. - _oRemovedHTML = _oRemoved = null; - _s.enabled = _didInit = _waitingForEI = _initPending = _didAppend = _appendSuccess = _disabled = _s.swfLoaded = false; - _s.soundIDs = _s.sounds = []; - _s.o = null; - for (i in _on_queue) { - if (_on_queue.hasOwnProperty(i)) { - for (j = _on_queue[i].length; j--;) { - _on_queue[i][j].fired = false; - } - } - } - _s._wD(_sm + ': Rebooting...'); - _win.setTimeout(function() { - _s.beginDelayedInit(); - }, 20); - }; - - this.destruct = function() { - _s._wD(_sm+'.destruct()'); - _s.disable(true); - }; - - this.beginDelayedInit = function() { - // _s._wD(_sm+'.beginDelayedInit()'); - _windowLoaded = true; - _dcLoaded(); - setTimeout(_beginInit, 20); - _delayWaitForEI(); - }; - - - // Wrap html5 event handlers so we don't call them on destroyed sounds - function _html5_event(oFn) { - return function(e) { - if (!this._t || !this._t._a) { - if (this._t && this._t.sID) { - _s._wD(_h5+'ignoring '+e.type+': '+this._t.sID); - } else { - _s._wD(_h5+'ignoring '+e.type); - } - return null; - } else { - return oFn.call(this, e); - } - }; - } - - this._html5_events = { - - // HTML5 event-name-to-handler map - abort: _html5_event(function(e) { - _s._wD(_h5+'abort: '+this._t.sID); - }), - - // enough has loaded to play - canplay: _html5_event(function(e) { - _s._wD(_h5+'canplay: '+this._t.sID+', '+this._t.url); - this._t._onbufferchange(0); - var position1K = (!isNaN(this._t.position)?this._t.position/1000:null); - // set the position if position was set before the sound loaded - this._t._html5_canplay = true; - if (this._t.position && this.currentTime !== position1K) { - _s._wD(_h5+'canplay: setting position to '+position1K+''); - try { - this.currentTime = position1K; - } catch(ee) { - _s._wD(_h5+'setting position failed: '+ee.message, 2); - } - } - }), - - load: _html5_event(function(e) { - if (!this._t.loaded) { - this._t._onbufferchange(0); - // should be 1, and the same - this._t._whileloading(this._t.bytesTotal, this._t.bytesTotal, this._t._get_html5_duration()); - this._t._onload(true); - } - }), - - emptied: _html5_event(function(e) { - _s._wD(_h5+'emptied: '+this._t.sID); - }), - - ended: _html5_event(function(e) { - _s._wD(_h5+'ended: '+this._t.sID); - this._t._onfinish(); - }), - - error: _html5_event(function(e) { - _s._wD(_h5+'error: '+this.error.code); - // call load with error state? - this._t._onload(false); - }), - - loadeddata: _html5_event(function(e) { - _s._wD(_h5+'loadeddata: '+this._t.sID); - }), - - loadedmetadata: _html5_event(function(e) { - _s._wD(_h5+'loadedmetadata: '+this._t.sID); - }), - - loadstart: _html5_event(function(e) { - _s._wD(_h5+'loadstart: '+this._t.sID); - // assume buffering at first - this._t._onbufferchange(1); - }), - - play: _html5_event(function(e) { - _s._wD(_h5+'play: '+this._t.sID+', '+this._t.url); - // once play starts, no buffering - this._t._onbufferchange(0); - }), - - // TODO: verify if this is actually implemented anywhere yet. - playing: _html5_event(function(e) { - _s._wD(_h5+'playing: '+this._t.sID+', '+this._t.url); - // once play starts, no buffering - this._t._onbufferchange(0); - }), - - progress: _html5_event(function(e) { - - if (this._t.loaded) { - return false; - } - - var i, j, str, loadSum = 0, buffered = 0, - isProgress = (e.type === 'progress'), - ranges = e.target.buffered, - loaded = (e.loaded||0), // firefox 3.6 implements e.loaded/total (bytes) - total = (e.total||1); - - if (ranges && ranges.length) { - - // if loaded is 0, try TimeRanges implementation as % of load - // https://developer.mozilla.org/en/DOM/TimeRanges - for (i=ranges.length; i--;) { - buffered = (ranges.end(i) - ranges.start(i)); - } - - // linear case, buffer sum; does not account for seeking and HTTP partials / byte ranges - loaded = buffered/e.target.duration; - - // - if (isProgress && ranges.length > 1) { - str = []; - j = ranges.length; - for (i=0; i - - if (isProgress && !isNaN(loaded)) { - _s._wD(_h5+'progress: '+this._t.sID+': ' + Math.floor(loaded*100)+'% loaded'); - } - - } - - if (!isNaN(loaded)) { - - this._t._onbufferchange(0); // if progress, likely not buffering - this._t._whileloading(loaded, total, this._t._get_html5_duration()); - - if (loaded && total && loaded === total) { - // in case "onload" doesn't fire (eg. gecko 1.9.2) - _s._html5_events.load.call(this, e); - } - - } - - }), - - ratechange: _html5_event(function(e) { - _s._wD(_h5+'ratechange: '+this._t.sID); - }), - - suspend: _html5_event(function(e) { - // download paused/stopped, may have finished (eg. onload) - _s._wD(_h5+'suspend: '+this._t.sID); - _s._html5_events.progress.call(this, e); - }), - - stalled: _html5_event(function(e) { - _s._wD(_h5+'stalled: '+this._t.sID); - }), - - timeupdate: _html5_event(function(e) { - this._t._onTimer(); - }), - - waiting: _html5_event(function(e) { // see also: seeking - _s._wD(_h5+'waiting: '+this._t.sID); - // playback faster than download rate, etc. - this._t._onbufferchange(1); - }) - - }; - - // --- SMSound (sound object) instance --- - - SMSound = function(oOptions) { - var _t = this, _resetProperties, _stop_html5_timer, _start_html5_timer; - this.sID = oOptions.id; - this.url = oOptions.url; - this.options = _mixin(oOptions); - this.instanceOptions = this.options; // per-play-instance-specific options - this._iO = this.instanceOptions; // short alias - // assign property defaults - this.pan = this.options.pan; - this.volume = this.options.volume; - this._lastURL = null; - this.isHTML5 = false; - this._a = null; - - // --- public methods --- - - this.id3 = {}; - - this._debug = function() { - // - // pseudo-private console.log()-style output - if (_s.debugMode) { - var stuff = null, msg = [], sF, sfBracket, maxLength = 64; - for (stuff in _t.options) { - if (_t.options[stuff] !== null) { - if (_t.options[stuff] instanceof Function) { - // handle functions specially - sF = _t.options[stuff].toString(); - sF = sF.replace(/\s\s+/g, ' '); // normalize spaces - sfBracket = sF.indexOf('{'); - msg.push(' ' + stuff + ': {' + sF.substr(sfBracket + 1, (Math.min(Math.max(sF.indexOf('\n') - 1, maxLength), maxLength))).replace(/\n/g, '') + '... }'); - } else { - msg.push(' ' + stuff + ': ' + _t.options[stuff]); - } - } - } - _s._wD('SMSound() merged options: {\n' + msg.join(', \n') + '\n}'); - } - // - }; - - this._debug(); - - this.load = function(oOptions) { - var oS = null; - if (typeof oOptions !== 'undefined') { - _t._iO = _mixin(oOptions, _t.options); - _t.instanceOptions = _t._iO; - } else { - oOptions = _t.options; - _t._iO = oOptions; - _t.instanceOptions = _t._iO; - if (_t._lastURL && _t._lastURL !== _t.url) { - _wDS('manURL'); - _t._iO.url = _t.url; - _t.url = null; - } - } - if (!_t._iO.url) { - _t._iO.url = _t.url; - } - _s._wD('SMSound.load(): ' + _t._iO.url, 1); - if (_t._iO.url === _t.url && _t.readyState !== 0 && _t.readyState !== 2) { - _wDS('onURL', 1); - return _t; - } - _t._lastURL = _t.url; - _t.loaded = false; - _t.readyState = 1; - _t.playState = 0; - if (_html5OK(_t._iO)) { - oS = _t._setup_html5(_t._iO); - if (!oS._called_load) { - _s._wD(_h5+'load: '+_t.sID); - oS.load(); - oS._called_load = true; - if (_t._iO.autoPlay) { - _t.play(); - } - } else { - _s._wD('HTML5 ignoring request to load again: '+_t.sID); - } - } else { - try { - _t.isHTML5 = false; - _t._iO = _policyFix(_loopFix(_t._iO)); - if (_fV === 8) { - _s.o._load(_t.sID, _t._iO.url, _t._iO.stream, _t._iO.autoPlay, (_t._iO.whileloading?1:0), _t._iO.loops||1, _t._iO.usePolicyFile); - } else { - _s.o._load(_t.sID, _t._iO.url, _t._iO.stream?true:false, _t._iO.autoPlay?true:false, _t._iO.loops||1, _t._iO.autoLoad?true:false, _t._iO.usePolicyFile); - } - } catch(e) { - _wDS('smError', 2); - _debugTS('onload', false); - _die(); - } - } - return _t; - }; - - this.unload = function() { - // Flash 8/AS2 can't "close" a stream - fake it by loading an empty MP3 - // Flash 9/AS3: Close stream, preventing further load - if (_t.readyState !== 0) { - _s._wD('SMSound.unload(): "' + _t.sID + '"'); - if (!_t.isHTML5) { - if (_fV === 8) { - _s.o._unload(_t.sID, _s.nullURL); - } else { - _s.o._unload(_t.sID); - } - } else { - _stop_html5_timer(); - if (_t._a) { - // abort()-style method here, stop loading? (doesn't exist?) - _t._a.pause(); -// if (!_useGlobalHTML5Audio || (_useGlobalHTML5Audio && _t.playState)) { // if global audio, only unload if actively playing - _t._a.src = ''; // https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media -// } - } - } - // reset load/status flags - _resetProperties(); - } - return _t; - }; - - this.destruct = function(_bFromSM) { - _s._wD('SMSound.destruct(): "' + _t.sID + '"'); - if (!_t.isHTML5) { - // kill sound within Flash - // Disable the onfailure handler - _t._iO.onfailure = null; - _s.o._destroySound(_t.sID); - } else { - _stop_html5_timer(); - if (_t._a) { - // abort()-style method here, stop loading? (doesn't exist?) - _t._a.pause(); - _t._a.src = ''; // https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media - if (!_useGlobalHTML5Audio) { - _t._remove_html5_events(); - } - } - } - if (!_bFromSM) { - _s.destroySound(_t.sID, true); // ensure deletion from controller - } - }; - - this.play = function(oOptions, _updatePlayState) { - var fN = 'SMSound.play(): ', allowMulti; - _updatePlayState = _updatePlayState === undefined ? true : _updatePlayState; // default true - if (!oOptions) { - oOptions = {}; - } - _t._iO = _mixin(oOptions, _t._iO); - _t._iO = _mixin(_t._iO, _t.options); - _t.instanceOptions = _t._iO; - if (_t._iO.serverURL) { - if (!_t.connected) { - if (!_t.getAutoPlay()) { - _s._wD(fN+' Netstream not connected yet - setting autoPlay'); - _t.setAutoPlay(true); - } - return _t; // play will be called in _onconnect() - } - } - if (_html5OK(_t._iO)) { - _t._setup_html5(_t._iO); - _start_html5_timer(); - } - if (_t.playState === 1 && !_t.paused) { - allowMulti = _t._iO.multiShot; - if (!allowMulti) { - _s._wD(fN + '"' + _t.sID + '" already playing (one-shot)', 1); - return _t; - } else { - _s._wD(fN + '"' + _t.sID + '" already playing (multi-shot)', 1); - if (_t.isHTML5) { - // TODO: BUG? - _t.setPosition(_t._iO.position); - } - } - } - if (!_t.loaded) { - if (_t.readyState === 0) { - _s._wD(fN + 'Attempting to load "' + _t.sID + '"', 1); - // try to get this sound playing ASAP - if (!_t.isHTML5) { - _t._iO.autoPlay = true; // assign directly because setAutoPlay() increments the instanceCount - _t.load(_t._iO); - } else { - _t.load(_t._iO); - // _t.readyState = 1; // redundant - } - } else if (_t.readyState === 2) { - _s._wD(fN + 'Could not load "' + _t.sID + '" - exiting', 2); - return _t; - } else { - _s._wD(fN + '"' + _t.sID + '" is loading - attempting to play..', 1); - } - } else { - _s._wD(fN + '"' + _t.sID + '"'); - } - // Streams will pause when their buffer is full if they are being loaded. - // In this case paused is true, but the song hasn't started playing yet. If - // we just call resume() the onplay() callback will never be called. So - // only call resume() if the position is > 0. - // Another reason is because options like volume won't have been applied yet. - if (_t.paused && _t.position && _t.position > 0) { // https://gist.github.com/37b17df75cc4d7a90bf6 - _s._wD(fN + '"' + _t.sID + '" is resuming from paused state',1); - _t.resume(); - } else { - _s._wD(fN+'"'+ _t.sID+'" is starting to play'); - _t.playState = 1; - _t.paused = false; - if (!_t.instanceCount || _t._iO.multiShotEvents || (_fV > 8 && !_t.isHTML5 && !_t.getAutoPlay())) { - _t.instanceCount++; - } - _t.position = (typeof _t._iO.position !== 'undefined' && !isNaN(_t._iO.position)?_t._iO.position:0); - if (!_t.isHTML5) { - _t._iO = _policyFix(_loopFix(_t._iO)); - } - if (_t._iO.onplay && _updatePlayState) { - _t._iO.onplay.apply(_t); - _t._onplay_called = true; - } - _t.setVolume(_t._iO.volume, true); - _t.setPan(_t._iO.pan, true); - if (!_t.isHTML5) { - _s.o._start(_t.sID, _t._iO.loops || 1, (_fV === 9?_t.position:_t.position / 1000)); - } else { - _start_html5_timer(); - _t._setup_html5().play(); - } - } - return _t; - }; - - this.start = this.play; // just for convenience - - this.stop = function(bAll) { - if (_t.playState === 1) { - _t._onbufferchange(0); - _t.resetOnPosition(0); - if (!_t.isHTML5) { - _t.playState = 0; - } - _t.paused = false; - if (_t._iO.onstop) { - _t._iO.onstop.apply(_t); - } - if (!_t.isHTML5) { - _s.o._stop(_t.sID, bAll); - // hack for netStream: just unload - if (_t._iO.serverURL) { - _t.unload(); - } - } else { - if (_t._a) { - _t.setPosition(0); // act like Flash, though - _t._a.pause(); // html5 has no stop() - _t.playState = 0; - _t._onTimer(); // and update UI - _stop_html5_timer(); - _t.unload(); - } - } - _t.instanceCount = 0; - _t._iO = {}; - } - return _t; - }; - - this.setAutoPlay = function(autoPlay) { - _s._wD('sound '+_t.sID+' turned autoplay ' + (autoPlay ? 'on' : 'off')); - _t._iO.autoPlay = autoPlay; - if (_t.isHTML5) { - if (_t._a && autoPlay) { - _t.play(); // HTML5 onload isn't reliable - } - } else { - _s.o._setAutoPlay(_t.sID, autoPlay); - } - if (autoPlay) { - // only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP) - if (!_t.instanceCount && _t.readyState === 1) { - _t.instanceCount++; - _s._wD('sound '+_t.sID+' incremented instance count to '+_t.instanceCount); - } - } - }; - - this.getAutoPlay = function() { - return _t._iO.autoPlay; - }; - - this.setPosition = function(nMsecOffset, bNoDebug) { - if (nMsecOffset === undefined) { - nMsecOffset = 0; - } - // Use the duration from the instance options, if we don't have a track duration yet. - var original_pos, position, position1K, offset = (_t.isHTML5 ? Math.max(nMsecOffset,0) : Math.min(_t.duration || _t._iO.duration, Math.max(nMsecOffset, 0))); // position >= 0 and <= current available (loaded) duration - original_pos = _t.position; - _t.position = offset; - position1K = _t.position/1000; - _t.resetOnPosition(_t.position); - _t._iO.position = offset; - if (!_t.isHTML5) { - position = _fV === 9 ? _t.position : position1K; - if (_t.readyState && _t.readyState !== 2) { - _s.o._setPosition(_t.sID, position, (_t.paused || !_t.playState)); // if paused or not playing, will not resume (by playing) - } - } else if (_t._a) { - // Set the position in the canplay handler if the sound is not ready yet - if (_t._html5_canplay) { - if (_t._a.currentTime !== position1K) { - // Only set the position if we need to. - // DOM/JS errors/exceptions to watch out for: - // if seek is beyond (loaded?) position, "DOM exception 11" - // "INDEX_SIZE_ERR": DOM exception 1 - _s._wD('setPosition('+position1K+'): setting position'); - try { - _t._a.currentTime = position1K; - } catch(e) { - _s._wD('setPosition('+position1K+'): setting position failed: '+e.message, 2); - } - } - } else { - _s._wD('setPosition('+position1K+'): delaying, sound not ready'); - } - } - if (_t.isHTML5) { - if (_t.paused) { // if paused, refresh UI right away - _t._onTimer(true); // force update - } - } - return _t; - }; - - this.pause = function(bCallFlash) { - if (_t.paused || (_t.playState === 0 && _t.readyState !== 1)) { - return _t; - } - _s._wD('SMSound.pause()'); - _t.paused = true; - if (!_t.isHTML5) { - if (bCallFlash || bCallFlash === undefined) { - _s.o._pause(_t.sID); - } - } else { - _t._setup_html5().pause(); - _stop_html5_timer(); - } - if (_t._iO.onpause) { - _t._iO.onpause.apply(_t); - } - return _t; - }; - - // When auto-loaded streams pause on buffer full they have a playState of 0. - // We need to make sure that the playState is set to 1 when these streams "resume". - // - // When a paused stream is resumed, we need to trigger the onplay() callback if it - // hasn't been called already. In this case since the sound is being played for the - // first time, I think it's more appropriate to call onplay() rather than onresume(). - this.resume = function() { - if (!_t.paused) { - return _t; - } - _s._wD('SMSound.resume()'); - _t.paused = false; - _t.playState = 1; - if (!_t.isHTML5) { - if (_t._iO.isMovieStar) { - // Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition. - _t.setPosition(_t.position); - } - _s.o._pause(_t.sID); // flash method is toggle-based (pause/resume) - } else { - _t._setup_html5().play(); - _start_html5_timer(); - } - if (!_t._onplay_called && _t._iO.onplay) { - _t._iO.onplay.apply(_t); - _t._onplay_called = true; - } else if (_t._iO.onresume) { - _t._iO.onresume.apply(_t); - } - return _t; - }; - - this.togglePause = function() { - _s._wD('SMSound.togglePause()'); - if (_t.playState === 0) { - _t.play({ - position: (_fV === 9 && !_t.isHTML5 ? _t.position:_t.position / 1000) - }); - return _t; - } - if (_t.paused) { - _t.resume(); - } else { - _t.pause(); - } - return _t; - }; - - this.setPan = function(nPan, bInstanceOnly) { - if (typeof nPan === 'undefined') { - nPan = 0; - } - if (typeof bInstanceOnly === 'undefined') { - bInstanceOnly = false; - } - if (!_t.isHTML5) { - _s.o._setPan(_t.sID, nPan); - } // else { no HTML5 pan? } - _t._iO.pan = nPan; - if (!bInstanceOnly) { - _t.pan = nPan; - _t.options.pan = nPan; - } - return _t; - }; - - this.setVolume = function(nVol, bInstanceOnly) { - if (typeof nVol === 'undefined') { - nVol = 100; - } - if (typeof bInstanceOnly === 'undefined') { - bInstanceOnly = false; - } - if (!_t.isHTML5) { - _s.o._setVolume(_t.sID, (_s.muted && !_t.muted) || _t.muted?0:nVol); - } else if (_t._a) { - _t._a.volume = Math.max(0, Math.min(1, nVol/100)); // valid range: 0-1 - } - _t._iO.volume = nVol; - if (!bInstanceOnly) { - _t.volume = nVol; - _t.options.volume = nVol; - } - return _t; - }; - - this.mute = function() { - _t.muted = true; - if (!_t.isHTML5) { - _s.o._setVolume(_t.sID, 0); - } else if (_t._a) { - _t._a.muted = true; - } - return _t; - }; - - this.unmute = function() { - _t.muted = false; - var hasIO = typeof _t._iO.volume !== 'undefined'; - if (!_t.isHTML5) { - _s.o._setVolume(_t.sID, hasIO?_t._iO.volume:_t.options.volume); - } else if (_t._a) { - _t._a.muted = false; - } - return _t; - }; - - this.toggleMute = function() { - return (_t.muted?_t.unmute():_t.mute()); - }; - - this.onposition = function(nPosition, oMethod, oScope) { - // TODO: allow for ranges, too? eg. (nPosition instanceof Array) - _t._onPositionItems.push({ - position: nPosition, - method: oMethod, - scope: (typeof oScope !== 'undefined'?oScope:_t), - fired: false - }); - return _t; - }; - - this.processOnPosition = function() { - var i, item, j = _t._onPositionItems.length; - if (!j || !_t.playState || _t._onPositionFired >= j) { - return false; - } - for (i=j; i--;) { - item = _t._onPositionItems[i]; - if (!item.fired && _t.position >= item.position) { - item.method.apply(item.scope,[item.position]); - item.fired = true; - _s._onPositionFired++; - } - } - return true; - }; - - this.resetOnPosition = function(nPosition) { - // reset "fired" for items interested in this position - var i, item, j = _t._onPositionItems.length; - if (!j) { - return false; - } - for (i=j; i--;) { - item = _t._onPositionItems[i]; - if (item.fired && nPosition <= item.position) { - item.fired = false; - _s._onPositionFired--; - } - } - return true; - }; - - // pseudo-private soundManager reference - - this._onTimer = function(bForce) { - // HTML5-only _whileplaying() etc. - var time, x = {}; - if (_t._hasTimer || bForce) { - if (_t._a && (bForce || ((_t.playState > 0 || _t.readyState === 1) && !_t.paused))) { // TODO: May not need to track readyState (1 = loading) - _t.duration = _t._get_html5_duration(); - _t.durationEstimate = _t.duration; - time = _t._a.currentTime?_t._a.currentTime*1000:0; - _t._whileplaying(time,x,x,x,x); - return true; - } else { - _s._wD('_onTimer: Warn for "'+_t.sID+'": '+(!_t._a?'Could not find element. ':'')+(_t.playState === 0?'playState bad, 0?':'playState = '+_t.playState+', OK')); - return false; - } - } - }; - - // --- private internals --- - - this._get_html5_duration = function() { - var d = (_t._a ? _t._a.duration*1000 : (_t._iO ? _t._iO.duration : undefined)); - return (d && !isNaN(d) && d !== Infinity ? d : (_t._iO ? _t._iO.duration : null)); - }; - - _start_html5_timer = function() { - if (_t.isHTML5) { - _startTimer(_t); - } - }; - - _stop_html5_timer = function() { - if (_t.isHTML5) { - _stopTimer(_t); - } - }; - - _resetProperties = function(bLoaded) { - _t._onPositionItems = []; - _t._onPositionFired = 0; - _t._hasTimer = null; - _t._onplay_called = false; - _t._a = null; - _t._html5_canplay = false; - _t.bytesLoaded = null; - _t.bytesTotal = null; - _t.position = null; - _t.duration = (_t._iO && _t._iO.duration?_t._iO.duration:null); - _t.durationEstimate = null; - _t.failures = 0; - _t.loaded = false; - _t.playState = 0; - _t.paused = false; - _t.readyState = 0; // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success - _t.muted = false; - _t.didBeforeFinish = false; - _t.didJustBeforeFinish = false; - _t.isBuffering = false; - _t.instanceOptions = {}; - _t.instanceCount = 0; - _t.peakData = { - left: 0, - right: 0 - }; - _t.waveformData = { - left: [], - right: [] - }; - _t.eqData = []; // legacy: 1D array - _t.eqData.left = []; - _t.eqData.right = []; - }; - - _resetProperties(); - - // pseudo-private methods used by soundManager - - this._setup_html5 = function(oOptions) { - var _iO = _mixin(_t._iO, oOptions), d = decodeURI, - _a = _useGlobalHTML5Audio ? _s._global_a : _t._a, - _dURL = d(_iO.url), - _oldIO = (_a && _a._t ? _a._t.instanceOptions : null); - if (_a) { - if (_a._t && _oldIO.url === _iO.url && (!_t._lastURL || (_t._lastURL === _oldIO.url))) { - return _a; // same url, ignore request - } - _s._wD('setting new URL on existing object: ' + _dURL + (_t._lastURL ? ', old URL: ' + _t._lastURL : '')); - /* - * "First things first, I, Poppa.." (reset the previous state of the old sound, if playing) - * Fixes case with devices that can only play one sound at a time - * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state - */ - if (_useGlobalHTML5Audio && _a._t && _a._t.playState && _iO.url !== _oldIO.url) { - _a._t.stop(); - } - _resetProperties(); // new URL, so reset load/playstate and so on - _a.src = _iO.url; - _t.url = _iO.url; - _t._lastURL = _iO.url; - _a._called_load = false; - } else { - _s._wD('creating HTML5 Audio() element with URL: '+_dURL); - _a = new Audio(_iO.url); - _a._called_load = false; - if (_useGlobalHTML5Audio) { - _s._global_a = _a; - } - } - _t.isHTML5 = true; - _t._a = _a; // store a ref on the track - _a._t = _t; // store a ref on the audio - _t._add_html5_events(); - _a.loop = (_iO.loops>1?'loop':''); - if (_iO.autoLoad || _iO.autoPlay) { - _a.autobuffer = 'auto'; // early HTML5 implementation (non-standard) - _a.preload = 'auto'; // standard - _t.load(); - _a._called_load = true; - } else { - _a.autobuffer = false; // early HTML5 implementation (non-standard) - _a.preload = 'none'; // standard - } - _a.loop = (_iO.loops>1?'loop':''); // boolean instead of "loop", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop - return _a; - }; - - // related private methods - - this._add_html5_events = function() { - if (_t._a._added_events) { - return false; - } - - var f; - - function add(oEvt, oFn, bCapture) { - return _t._a ? _t._a.addEventListener(oEvt, oFn, bCapture||false) : null; - } - - _s._wD(_h5+'adding event listeners: '+_t.sID); - _t._a._added_events = true; - - for (f in _s._html5_events) { - if (_s._html5_events.hasOwnProperty(f)) { - add(f, _s._html5_events[f]); - } - } - - return true; - }; - - // Keep this externally accessible - this._remove_html5_events = function() { - // Remove event listeners - function remove(oEvt, oFn, bCapture) { - return (_t._a ? _t._a.removeEventListener(oEvt, oFn, bCapture||false) : null); - } - _s._wD(_h5+'removing event listeners: '+_t.sID); - _t._a._added_events = false; - - for (var f in _s._html5_events) { - if (_s._html5_events.hasOwnProperty(f)) { - remove(f, _s._html5_events[f]); - } - } - }; - - // --- "private" methods called by Flash --- - - this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) { - _t.bytesLoaded = nBytesLoaded; - _t.bytesTotal = nBytesTotal; - _t.duration = Math.floor(nDuration); - _t.bufferLength = nBufferLength; - if (!_t._iO.isMovieStar) { - if (_t._iO.duration) { - // use options, if specified and larger - _t.durationEstimate = (_t.duration > _t._iO.duration) ? _t.duration : _t._iO.duration; - } else { - _t.durationEstimate = parseInt((_t.bytesTotal / _t.bytesLoaded) * _t.duration, 10); - } - if (_t.durationEstimate === undefined) { - _t.durationEstimate = _t.duration; - } - if (_t.readyState !== 3 && _t._iO.whileloading) { - _t._iO.whileloading.apply(_t); - } - } else { - _t.durationEstimate = _t.duration; - if (_t.readyState !== 3 && _t._iO.whileloading) { - _t._iO.whileloading.apply(_t); - } - } - }; - - this._onid3 = function(oID3PropNames, oID3Data) { - // oID3PropNames: string array (names) - // ID3Data: string array (data) - _s._wD('SMSound._onid3(): "' + this.sID + '" ID3 data received.'); - var oData = [], i, j; - for (i = 0, j = oID3PropNames.length; i < j; i++) { - oData[oID3PropNames[i]] = oID3Data[i]; - } - _t.id3 = _mixin(_t.id3, oData); - if (_t._iO.onid3) { - _t._iO.onid3.apply(_t); - } - }; - - this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) { - if (isNaN(nPosition) || nPosition === null) { - return false; // flash safety net - } - if (_t.playState === 0 && nPosition > 0) { - // invalid position edge case for end/stop - nPosition = 0; - } - _t.position = nPosition; - _t.processOnPosition(); - if (_fV > 8 && !_t.isHTML5) { - if (_t._iO.usePeakData && typeof oPeakData !== 'undefined' && oPeakData) { - _t.peakData = { - left: oPeakData.leftPeak, - right: oPeakData.rightPeak - }; - } - if (_t._iO.useWaveformData && typeof oWaveformDataLeft !== 'undefined' && oWaveformDataLeft) { - _t.waveformData = { - left: oWaveformDataLeft.split(','), - right: oWaveformDataRight.split(',') - }; - } - if (_t._iO.useEQData) { - if (typeof oEQData !== 'undefined' && oEQData && oEQData.leftEQ) { - var eqLeft = oEQData.leftEQ.split(','); - _t.eqData = eqLeft; - _t.eqData.left = eqLeft; - if (typeof oEQData.rightEQ !== 'undefined' && oEQData.rightEQ) { - _t.eqData.right = oEQData.rightEQ.split(','); - } - } - } - } - if (_t.playState === 1) { - // special case/hack: ensure buffering is false if loading from cache (and not yet started) - if (!_t.isHTML5 && _s.flashVersion === 8 && !_t.position && _t.isBuffering) { - _t._onbufferchange(0); - } - if (_t._iO.whileplaying) { - _t._iO.whileplaying.apply(_t); // flash may call after actual finish - } - if ((_t.loaded || (!_t.loaded && _t._iO.isMovieStar)) && _t._iO.onbeforefinish && _t._iO.onbeforefinishtime && !_t.didBeforeFinish && _t.duration - _t.position <= _t._iO.onbeforefinishtime) { - _t._onbeforefinish(); - } - } - return true; - }; - - // Only applies to RTMP - this._onconnect = function(bSuccess) { - var fN = 'SMSound._onconnect(): '; - bSuccess = (bSuccess === 1); - _s._wD(fN+'"'+_t.sID+'"'+(bSuccess?' connected.':' failed to connect? - '+_t.url), (bSuccess?1:2)); - _t.connected = bSuccess; - if (bSuccess) { - _t.failures = 0; - if (_idCheck(_t.sID)) { - if (_t.getAutoPlay()) { - _t.play(undefined, _t.getAutoPlay()); // only update the play state if auto playing - } else if (_t._iO.autoLoad) { - _t.load(); - } - } - if (_t._iO.onconnect) { - _t._iO.onconnect.apply(_t,[bSuccess]); - } - } - }; - - this._onload = function(nSuccess) { - var fN = 'SMSound._onload(): ', loadOK = (nSuccess?true:false); - _s._wD(fN + '"' + _t.sID + '"' + (loadOK?' loaded.':' failed to load? - ' + _t.url), (loadOK?1:2)); - // - if (!loadOK && !_t.isHTML5) { - if (_s.sandbox.noRemote === true) { - _s._wD(fN + _str('noNet'), 1); - } - if (_s.sandbox.noLocal === true) { - _s._wD(fN + _str('noLocal'), 1); - } - } - // - _t.loaded = loadOK; - _t.readyState = loadOK?3:2; - _t._onbufferchange(0); - if (_t._iO.onload) { - _t._iO.onload.apply(_t, [loadOK]); - } - return true; - }; - - // fire onfailure() only once at most - // at this point we just recreate failed sounds rather than trying to reconnect. - this._onfailure = function(msg, level, code) { - _t.failures++; - _s._wD('SMSound._onfailure(): "'+_t.sID+'" count '+_t.failures); - if (_t._iO.onfailure && _t.failures === 1) { - _t._iO.onfailure(_t, msg, level, code); - } else { - _s._wD('SMSound._onfailure(): ignoring'); - } - }; - - this._onbeforefinish = function() { - if (!_t.didBeforeFinish) { - _t.didBeforeFinish = true; - if (_t._iO.onbeforefinish) { - _s._wD('SMSound._onbeforefinish(): "' + _t.sID + '"'); - _t._iO.onbeforefinish.apply(_t); - } - } - }; - - this._onjustbeforefinish = function(msOffset) { - if (!_t.didJustBeforeFinish) { - _t.didJustBeforeFinish = true; - if (_t._iO.onjustbeforefinish) { - _s._wD('SMSound._onjustbeforefinish(): "' + _t.sID + '"'); - _t._iO.onjustbeforefinish.apply(_t); - } - } - }; - - this._onfinish = function() { - // _s._wD('SMSound._onfinish(): "' + _t.sID + '" got instanceCount '+_t.instanceCount); - var _io_onfinish = _t._iO.onfinish; // store local copy before it gets trashed.. - _t._onbufferchange(0); - _t.resetOnPosition(0); - if (_t._iO.onbeforefinishcomplete) { - _t._iO.onbeforefinishcomplete.apply(_t); - } - // reset some state items - _t.didBeforeFinish = false; - _t.didJustBeforeFinish = false; - if (_t.instanceCount) { - _t.instanceCount--; - if (!_t.instanceCount) { - // reset instance options - _t.playState = 0; - _t.paused = false; - _t.instanceCount = 0; - _t.instanceOptions = {}; - _t._iO = {}; - _stop_html5_timer(); - } - if (!_t.instanceCount || _t._iO.multiShotEvents) { - // fire onfinish for last, or every instance - if (_io_onfinish) { - _s._wD('SMSound._onfinish(): "' + _t.sID + '"'); - _io_onfinish.apply(_t); - } - } - } - }; - - this._onbufferchange = function(nIsBuffering) { - var fN = 'SMSound._onbufferchange()'; - if (_t.playState === 0) { - // ignore if not playing - return false; - } - if ((nIsBuffering && _t.isBuffering) || (!nIsBuffering && !_t.isBuffering)) { - return false; - } - _t.isBuffering = (nIsBuffering === 1); - if (_t._iO.onbufferchange) { - _s._wD(fN + ': ' + nIsBuffering); - _t._iO.onbufferchange.apply(_t); - } - return true; - }; - - this._ondataerror = function(sError) { - // flash 9 wave/eq data handler - if (_t.playState > 0) { // hack: called at start, and end from flash at/after onfinish() - _s._wD('SMSound._ondataerror(): ' + sError); - if (_t._iO.ondataerror) { - _t._iO.ondataerror.apply(_t); - } - } - }; - - }; // SMSound() - - // --- private SM2 internals --- - - _getDocument = function() { - return (_doc.body?_doc.body:(_doc._docElement?_doc.documentElement:_doc.getElementsByTagName('div')[0])); - }; - - _id = function(sID) { - return _doc.getElementById(sID); - }; - - _mixin = function(oMain, oAdd) { - // non-destructive merge - var o1 = {}, i, o2, o; - for (i in oMain) { // clone c1 - if (oMain.hasOwnProperty(i)) { - o1[i] = oMain[i]; - } - } - o2 = (typeof oAdd === 'undefined'?_s.defaultOptions:oAdd); - for (o in o2) { - if (o2.hasOwnProperty(o) && typeof o1[o] === 'undefined') { - o1[o] = o2[o]; - } - } - return o1; - }; - - _event = (function() { - - var old = (_win.attachEvent), - evt = { - add: (old?'attachEvent':'addEventListener'), - remove: (old?'detachEvent':'removeEventListener') - }; - - function getArgs(oArgs) { - var args = _slice.call(oArgs), len = args.length; - if (old) { - args[1] = 'on' + args[1]; // prefix - if (len > 3) { - args.pop(); // no capture - } - } else if (len === 3) { - args.push(false); - } - return args; - } - - function apply(args, sType) { - var element = args.shift(), - method = [evt[sType]]; - if (old) { - element[method](args[0], args[1]); - } else { - element[method].apply(element, args); - } - } - - function add() { - apply(getArgs(arguments), 'add'); - } - - function remove() { - apply(getArgs(arguments), 'remove'); - } - - return { - 'add': add, - 'remove': remove - }; - - }()); - - _html5OK = function(iO) { - return (!iO.serverURL && (iO.type?_html5CanPlay({type:iO.type}):_html5CanPlay(iO.url)||_html5Only)); // Use type, if specified. If HTML5-only mode, no other options, so just give 'er - }; - - _html5CanPlay = function(sURL) { - // try to find MIME, test and return truthiness - if (!_s.useHTML5Audio || !_s.hasHTML5) { - return false; - } - var result, mime, offset, fileExt, item, aF = _s.audioFormats; - if (!_html5Ext) { - _html5Ext = []; - for (item in aF) { - if (aF.hasOwnProperty(item)) { - _html5Ext.push(item); - if (aF[item].related) { - _html5Ext = _html5Ext.concat(aF[item].related); - } - } - } - _html5Ext = new RegExp('\\.('+_html5Ext.join('|')+')','i'); - } - mime = (typeof sURL.type !== 'undefined'?sURL.type:null); - fileExt = (typeof sURL === 'string'?sURL.toLowerCase().match(_html5Ext):null); // TODO: Strip URL queries, etc. - if (!fileExt || !fileExt.length) { - if (!mime) { - return false; - } else { - // audio/mp3 -> mp3, result should be known - offset = mime.indexOf(';'); - fileExt = (offset !== -1?mime.substr(0,offset):mime).substr(6); // strip "audio/X; codecs.." - } - } else { - fileExt = fileExt[0].substr(1); // "mp3", for example - } - if (fileExt && typeof _s.html5[fileExt] !== 'undefined') { - // result known - return _s.html5[fileExt]; - } else { - if (!mime) { - if (fileExt && _s.html5[fileExt]) { - return _s.html5[fileExt]; - } else { - // best-case guess, audio/whatever-dot-filename-format-you're-playing - mime = 'audio/'+fileExt; - } - } - result = _s.html5.canPlayType(mime); - _s.html5[fileExt] = result; - // _s._wD('canPlayType, found result: '+result); - return result; - } - }; - - _testHTML5 = function() { - if (!_s.useHTML5Audio || typeof Audio === 'undefined') { - return false; - } - // double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load "null" as a URL. :/ - var a = (typeof Audio !== 'undefined' ? (_isOpera ? new Audio(null) : new Audio()) : null), item, support = {}, aF, i, _hasFlash = _detectFlash(); - function _cp(m) { - var canPlay, i, j, isOK = false; - if (!a || typeof a.canPlayType !== 'function') { - return false; - } - if (m instanceof Array) { - // iterate through all mime types, return any successes - for (i=0, j=m.length; i - notReady: 'Not loaded yet - wait for soundManager.onload()/onready()', - notOK: 'Audio support is not available.', - appXHTML: _smc + 'createMovie(): appendChild/innerHTML set failed. May be app/xhtml+xml DOM-related.', - spcWmode: _smc + 'createMovie(): Removing wmode, preventing known SWF loading issue(s)', - swf404: _sm + ': Verify that %s is a valid path.', - tryDebug: 'Try ' + _sm + '.debugFlash = true for more security details (output goes to SWF.)', - checkSWF: 'See SWF output for more debug info.', - localFail: _sm + ': Non-HTTP page (' + _doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/', - waitFocus: _sm + ': Special case: Waiting for focus-related event..', - waitImpatient: _sm + ': Getting impatient, still waiting for Flash%s...', - waitForever: _sm + ': Waiting indefinitely for Flash (will recover if unblocked)...', - needFunction: _sm + ': Function object expected for %s', - badID: 'Warning: Sound ID "%s" should be a string, starting with a non-numeric character', - noMS: 'MovieStar mode not enabled. Exiting.', - currentObj: '--- ' + _sm + '._debug(): Current sound objects ---', - waitEI: _smc + 'initMovie(): Waiting for ExternalInterface call from Flash..', - waitOnload: _sm + ': Waiting for window.onload()', - docLoaded: _sm + ': Document already loaded', - onload: _smc + 'initComplete(): calling soundManager.onload()', - onloadOK: _sm + '.onload() complete', - init: '-- ' + _smc + 'init() --', - didInit: _smc + 'init(): Already called?', - flashJS: _sm + ': Attempting to call Flash from JS..', - noPolling: _sm + ': Polling (whileloading()/whileplaying() support) is disabled.', - secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html', - badRemove: 'Warning: Failed to remove flash movie.', - noPeak: 'Warning: peakData features unsupported for movieStar formats', - shutdown: _sm + '.disable(): Shutting down', - queue: _sm + ': Queueing %s handler', - smFail: _sm + ': Failed to initialise.', - smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.', - fbTimeout: 'No flash response, applying .'+_s.swfCSS.swfTimedout+' CSS..', - fbLoaded: 'Flash loaded', - fbHandler: _smc+'flashBlockHandler()', - manURL: 'SMSound.load(): Using manually-assigned URL', - onURL: _sm + '.load(): current URL already assigned.', - badFV: _sm + '.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.', - as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)', - noNSLoop: 'Note: Looping not implemented for MovieStar formats', - needfl9: 'Note: Switching to flash 9, required for MP4 formats.', - mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case', - mfOn: 'mobileFlash::enabling on-screen flash repositioning', - policy: 'Enabling usePolicyFile for data access' - // - }; - - _str = function() { // o [,items to replace] - // - var args = _slice.call(arguments), // real array, please - o = args.shift(), // first arg - str = (_strings && _strings[o]?_strings[o]:''), i, j; - if (str && args && args.length) { - for (i = 0, j = args.length; i < j; i++) { - str = str.replace('%s', args[i]); - } - } - return str; - // - }; - - _loopFix = function(sOpt) { - // flash 8 requires stream = false for looping to work - if (_fV === 8 && sOpt.loops > 1 && sOpt.stream) { - _wDS('as2loop'); - sOpt.stream = false; - } - return sOpt; - }; - - _policyFix = function(sOpt, sPre) { - if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) { - _s._wD((sPre?sPre+':':'') + _str('policy')); - sOpt.usePolicyFile = true; - } - return sOpt; - }; - - _complain = function(sMsg) { - if (typeof console !== 'undefined' && typeof console.warn !== 'undefined') { - console.warn(sMsg); - } else { - _s._wD(sMsg); - } - }; - - _doNothing = function() { - return false; - }; - - _disableObject = function(o) { - for (var oProp in o) { - if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') { - o[oProp] = _doNothing; - } - } - oProp = null; - }; - - _failSafely = function(bNoDisable) { - // general failure exception handler - if (typeof bNoDisable === 'undefined') { - bNoDisable = false; - } - if (_disabled || bNoDisable) { - _wDS('smFail', 2); - _s.disable(bNoDisable); - } - }; - - _normalizeMovieURL = function(smURL) { - var urlParams = null; - if (smURL) { - if (smURL.match(/\.swf(\?.*)?$/i)) { - urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4); - if (urlParams) { - return smURL; // assume user knows what they're doing - } - } else if (smURL.lastIndexOf('/') !== smURL.length - 1) { - smURL = smURL + '/'; - } - } - return (smURL && smURL.lastIndexOf('/') !== - 1?smURL.substr(0, smURL.lastIndexOf('/') + 1):'./') + _s.movieURL; - }; - - _setVersionInfo = function() { - if (_fV !== 8 && _fV !== 9) { - _s._wD(_str('badFV', _fV, _defaultFlashVersion)); - _s.flashVersion = _defaultFlashVersion; - } - var isDebug = (_s.debugMode || _s.debugFlash?'_debug.swf':'.swf'); // debug flash movie, if applicable - if (_s.useHTML5Audio && !_html5Only && _s.audioFormats.mp4.required && _s.flashVersion < 9) { - _s._wD(_str('needfl9')); - _s.flashVersion = 9; - } - _fV = _s.flashVersion; // short-hand for internal use - _s.version = _s.versionNumber + (_html5Only?' (HTML5-only mode)':(_fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)')); - // set up default options - if (_fV > 8) { - _s.defaultOptions = _mixin(_s.defaultOptions, _s.flash9Options); - _s.features.buffering = true; - } - if (_fV > 8 && _s.useMovieStar) { - // flash 9+ support for movieStar formats as well as MP3 - _s.defaultOptions = _mixin(_s.defaultOptions, _s.movieStarOptions); - _s.filePatterns.flash9 = new RegExp('\\.(mp3|' + _s.netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); - _s.mimePattern = _s.netStreamMimeTypes; - _s.features.movieStar = true; - } else { - _s.useMovieStar = false; - _s.features.movieStar = false; - } - _s.filePattern = _s.filePatterns[(_fV !== 8?'flash9':'flash8')]; - _s.movieURL = (_fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf',isDebug); - _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_fV > 8); - }; - - _setPolling = function(bPolling, bHighPerformance) { - if (!_s.o || !_s.allowPolling) { - return false; - } - _s.o._setPolling(bPolling, bHighPerformance); - }; - - function _initDebug() { - if (_s.debugURLParam.test(_wl)) { - _s.debugMode = true; // allow force of debug mode via URL - } - // - if (_id(_s.debugID)) { - return false; - } - var oD, oDebug, oTarget, oToggle, tmp; - if (_s.debugMode && !_id(_s.debugID) && ((!_hasConsole || !_s.useConsole) || (_s.useConsole && _hasConsole && !_s.consoleOnly))) { - oD = _doc.createElement('div'); - oD.id = _s.debugID + '-toggle'; - oToggle = { - 'position': 'fixed', - 'bottom': '0px', - 'right': '0px', - 'width': '1.2em', - 'height': '1.2em', - 'lineHeight': '1.2em', - 'margin': '2px', - 'textAlign': 'center', - 'border': '1px solid #999', - 'cursor': 'pointer', - 'background': '#fff', - 'color': '#333', - 'zIndex': 10001 - }; - oD.appendChild(_doc.createTextNode('-')); - oD.onclick = _toggleDebug; - oD.title = 'Toggle SM2 debug console'; - if (_ua.match(/msie 6/i)) { - oD.style.position = 'absolute'; - oD.style.cursor = 'hand'; - } - for (tmp in oToggle) { - if (oToggle.hasOwnProperty(tmp)) { - oD.style[tmp] = oToggle[tmp]; - } - } - oDebug = _doc.createElement('div'); - oDebug.id = _s.debugID; - oDebug.style.display = (_s.debugMode?'block':'none'); - if (_s.debugMode && !_id(oD.id)) { - try { - oTarget = _getDocument(); - oTarget.appendChild(oD); - } catch(e2) { - throw new Error(_str('appXHTML')); - } - oTarget.appendChild(oDebug); - } - } - oTarget = null; - // - } - - _createMovie = function(smID, smURL) { - - var specialCase = null, - remoteURL = (smURL?smURL:_s.url), - localURL = (_s.altURL?_s.altURL:remoteURL), - oEmbed, oMovie, oTarget = _getDocument(), tmp, movieHTML, oEl, extraClass = _getSWFCSS(), s, x, sClass, side = '100%', isRTL = null, html = _doc.getElementsByTagName('html')[0]; - isRTL = (html && html.dir && html.dir.match(/rtl/i)); - smID = (typeof smID === 'undefined'?_s.id:smID); - - if (_didAppend && _appendSuccess) { - return false; // ignore if already succeeded - } - - function _initMsg() { - _s._wD('-- SoundManager 2 ' + _s.version + (!_html5Only && _s.useHTML5Audio?(_s.hasHTML5?' + HTML5 audio':', no HTML5 audio support'):'') + (!_html5Only ? (_s.useMovieStar?', MovieStar mode':'') + (_s.useHighPerformance?', high performance mode, ':', ') + (( _s.flashPollingInterval ? 'custom (' + _s.flashPollingInterval + 'ms)' : (_s.useFastPolling?'fast':'normal')) + ' polling') + (_s.wmode?', wmode: ' + _s.wmode:'') + (_s.debugFlash?', flash debug mode':'') + (_s.useFlashBlock?', flashBlock mode':'') : '') + ' --', 1); - } - - if (_html5Only) { - _setVersionInfo(); - _initMsg(); - _s.oMC = _id(_s.movieID); - _init(); - // prevent multiple init attempts - _didAppend = true; - _appendSuccess = true; - return false; - } - - _didAppend = true; - - // safety check for legacy (change to Flash 9 URL) - _setVersionInfo(); - _s.url = _normalizeMovieURL(_s._overHTTP?remoteURL:localURL); - smURL = _s.url; - - _s.wmode = (!_s.wmode && _s.useHighPerformance && !_s.useMovieStar?'transparent':_s.wmode); - - if (_s.wmode !== null && (_ua.match(/msie 8/i) || (!_isIE && !_s.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) { - _s.specialWmodeCase = true; - // extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here - // does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout - // wmode breaks IE 8 on Vista + Win7 too in some cases, as of Jan.2011 (?) - _wDS('spcWmode'); - _s.wmode = null; - } - - oEmbed = { - 'name': smID, - 'id': smID, - 'src': smURL, - 'width': side, - 'height': side, - 'quality': 'high', - 'allowScriptAccess': _s.allowScriptAccess, - 'bgcolor': _s.bgColor, - 'pluginspage': _s._http+'//www.macromedia.com/go/getflashplayer', - 'type': 'application/x-shockwave-flash', - 'wmode': _s.wmode, - 'hasPriority': 'true' // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html - }; - - if (_s.debugFlash) { - oEmbed.FlashVars = 'debug=1'; - } - - if (!_s.wmode) { - delete oEmbed.wmode; // don't write empty attribute - } - - if (_isIE) { - // IE is "special". - oMovie = _doc.createElement('div'); - movieHTML = '' + (_s.wmode?' ':'') + '' + (_s.debugFlash?'':'') + ''; - } else { - oMovie = _doc.createElement('embed'); - for (tmp in oEmbed) { - if (oEmbed.hasOwnProperty(tmp)) { - oMovie.setAttribute(tmp, oEmbed[tmp]); - } - } - } - - _initDebug(); - extraClass = _getSWFCSS(); - oTarget = _getDocument(); - - if (oTarget) { - _s.oMC = _id(_s.movieID)?_id(_s.movieID):_doc.createElement('div'); - if (!_s.oMC.id) { - _s.oMC.id = _s.movieID; - _s.oMC.className = _s.swfCSS.swfDefault + ' ' + extraClass; - // "hide" flash movie - s = null; - oEl = null; - if (!_s.useFlashBlock) { - if (_s.useHighPerformance) { - s = { - 'position': 'fixed', - 'width': '8px', - 'height': '8px', - // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes. - 'bottom': '0px', - 'left': '0px', - 'overflow': 'hidden' - }; - } else { - s = { - 'position': 'absolute', - 'width': '6px', - 'height': '6px', - 'top': '-9999px', - 'left': '-9999px' - }; - if (isRTL) { - s.left = Math.abs(parseInt(s.left,10))+'px'; - } - } - } - if (_isWebkit) { - _s.oMC.style.zIndex = 10000; // soundcloud-reported render/crash fix, safari 5 - } - if (!_s.debugFlash) { - for (x in s) { - if (s.hasOwnProperty(x)) { - _s.oMC.style[x] = s[x]; - } - } - } - try { - if (!_isIE) { - _s.oMC.appendChild(oMovie); - } - oTarget.appendChild(_s.oMC); - if (_isIE) { - oEl = _s.oMC.appendChild(_doc.createElement('div')); - oEl.className = _s.swfCSS.swfBox; - oEl.innerHTML = movieHTML; - } - _appendSuccess = true; - } catch(e) { - throw new Error(_str('appXHTML')); - } - } else { - // it's already in the document. - sClass = _s.oMC.className; - _s.oMC.className = (sClass?sClass+' ':_s.swfCSS.swfDefault) + (extraClass?' '+extraClass:''); - _s.oMC.appendChild(oMovie); - if (_isIE) { - oEl = _s.oMC.appendChild(_doc.createElement('div')); - oEl.className = _s.swfCSS.swfBox; - oEl.innerHTML = movieHTML; - } - _appendSuccess = true; - } - } - - if (specialCase) { - _s._wD(specialCase); - } - - _initMsg(); - _s._wD(_smc+'createMovie(): Trying to load ' + smURL + (!_s._overHTTP && _s.altURL?' (alternate URL)':''), 1); - - return true; - }; - - _idCheck = this.getSoundById; - - _initMovie = function() { - if (_html5Only) { - _createMovie(); - return false; - } - // attempt to get, or create, movie - if (_s.o) { - return false; // may already exist - } - _s.o = _s.getMovie(_s.id); // inline markup - if (!_s.o) { - if (!_oRemoved) { - // try to create - _createMovie(_s.id, _s.url); - } else { - // try to re-append removed movie after reboot() - if (!_isIE) { - _s.oMC.appendChild(_oRemoved); - } else { - _s.oMC.innerHTML = _oRemovedHTML; - } - _oRemoved = null; - _didAppend = true; - } - _s.o = _s.getMovie(_s.id); - } - if (_s.o) { - _s._wD(_smc+'initMovie(): Got '+_s.o.nodeName+' element ('+(_didAppend?'created via JS':'static HTML')+')'); - _wDS('waitEI'); - } - if (_s.oninitmovie instanceof Function) { - setTimeout(_s.oninitmovie, 1); - } - return true; - }; - - _go = function(sURL) { - // where it all begins. - if (sURL) { - _s.url = sURL; - } - _initMovie(); - }; - - _delayWaitForEI = function() { - setTimeout(_waitForEI, 500); - }; - - _waitForEI = function() { - if (_waitingForEI) { - return false; - } - _waitingForEI = true; - _event.remove(_win, 'load', _delayWaitForEI); - if (_tryInitOnFocus && !_isFocused) { - _wDS('waitFocus'); - return false; - } - var p; - if (!_didInit) { - p = _s.getMoviePercent(); - _s._wD(_str('waitImpatient', (p === 100?' (SWF loaded)':(p > 0?' (SWF ' + p + '% loaded)':'')))); - } - setTimeout(function() { - p = _s.getMoviePercent(); - if (!_didInit) { - _s._wD(_sm + ': No Flash response within expected time.\nLikely causes: ' + (p === 0?'Loading ' + _s.movieURL + ' may have failed (and/or Flash ' + _fV + '+ not present?), ':'') + 'Flash blocked or JS-Flash security error.' + (_s.debugFlash?' ' + _str('checkSWF'):''), 2); - if (!_s._overHTTP && p) { - _wDS('localFail', 2); - if (!_s.debugFlash) { - _wDS('tryDebug', 2); - } - } - if (p === 0) { - // if 0 (not null), probably a 404. - _s._wD(_str('swf404', _s.url)); - } - _debugTS('flashtojs', false, ': Timed out' + _s._overHTTP?' (Check flash security or flash blockers)':' (No plugin/missing SWF?)'); - } - // give up / time-out, depending - if (!_didInit && _okToDisable) { - if (p === null) { - // SWF failed. Maybe blocked. - if (_s.useFlashBlock || _s.flashLoadTimeout === 0) { - if (_s.useFlashBlock) { - _flashBlockHandler(); - } - _wDS('waitForever'); - } else { - // old SM2 behaviour, simply fail - _failSafely(true); - } - } else { - // flash loaded? Shouldn't be a blocking issue, then. - if (_s.flashLoadTimeout === 0) { - _wDS('waitForever'); - } else { - _failSafely(true); - } - } - } - }, _s.flashLoadTimeout); - }; - - _go = function(sURL) { - // where it all begins. - if (sURL) { - _s.url = sURL; - } - _initMovie(); - }; - - // - _wDS = function(o, errorLevel) { - if (!o) { - return ''; - } else { - return _s._wD(_str(o), errorLevel); - } - }; - - if (_wl.indexOf('debug=alert') + 1 && _s.debugMode) { - _s._wD = function(sText) {window.alert(sText);}; - } - - _toggleDebug = function() { - var o = _id(_s.debugID), - oT = _id(_s.debugID + '-toggle'); - if (!o) { - return false; - } - if (_debugOpen) { - // minimize - oT.innerHTML = '+'; - o.style.display = 'none'; - } else { - oT.innerHTML = '-'; - o.style.display = 'block'; - } - _debugOpen = !_debugOpen; - }; - - _debugTS = function(sEventType, bSuccess, sMessage) { - // troubleshooter debug hooks - if (typeof sm2Debugger !== 'undefined') { - try { - sm2Debugger.handleEvent(sEventType, bSuccess, sMessage); - } catch(e) { - // oh well - } - } - return true; - }; - // - - _getSWFCSS = function() { - var css = []; - if (_s.debugMode) { - css.push(_s.swfCSS.sm2Debug); - } - if (_s.debugFlash) { - css.push(_s.swfCSS.flashDebug); - } - if (_s.useHighPerformance) { - css.push(_s.swfCSS.highPerf); - } - return css.join(' '); - }; - - _flashBlockHandler = function() { - // *possible* flash block situation. - var name = _str('fbHandler'), p = _s.getMoviePercent(), css = _s.swfCSS; - if (!_s.ok()) { - if (_needsFlash) { - // make the movie more visible, so user can fix - _s.oMC.className = _getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError); - _s._wD(name+': '+_str('fbTimeout')+(p?' ('+_str('fbLoaded')+')':'')); - } - _s.didFlashBlock = true; - _processOnEvents({type:'ontimeout',ignoreInit:true}); // fire onready(), complain lightly - if (_s.onerror instanceof Function) { - _s.onerror.apply(_win); - } - } else { - // SM2 loaded OK (or recovered) - if (_s.didFlashBlock) { - _s._wD(name+': Unblocked'); - } - if (_s.oMC) { - _s.oMC.className = [_getSWFCSS(), css.swfDefault, css.swfLoaded + (_s.didFlashBlock?' '+css.swfUnblocked:'')].join(' '); - } - } - }; - - _handleFocus = function() { - function cleanup() { - _event.remove(_win, 'focus', _handleFocus); - _event.remove(_win, 'load', _handleFocus); - } - if (_isFocused || !_tryInitOnFocus) { - cleanup(); - return true; - } - _okToDisable = true; - _isFocused = true; - _s._wD(_smc+'handleFocus()'); - if (_isSafari && _tryInitOnFocus) { - // giant Safari 3.1 hack - assume mousemove = focus given lack of focus event - _event.remove(_win, 'mousemove', _handleFocus); - } - // allow init to restart - _waitingForEI = false; - cleanup(); - return true; - }; - - _initComplete = function(bNoDisable) { - if (_didInit) { - return false; - } - if (_html5Only) { - // all good. - _s._wD('-- SoundManager 2: loaded --'); - _didInit = true; - _processOnEvents(); - _initUserOnload(); - return true; - } - var sClass = _s.oMC.className, - wasTimeout = (_s.useFlashBlock && _s.flashLoadTimeout && !_s.getMoviePercent()); - if (!wasTimeout) { - _didInit = true; - } - _s._wD('-- SoundManager 2 ' + (_disabled?'failed to load':'loaded') + ' (' + (_disabled?'security/load error':'OK') + ') --', 1); - if (_disabled || bNoDisable) { - if (_s.useFlashBlock) { - _s.oMC.className = _getSWFCSS() + ' ' + (_s.getMoviePercent() === null?_s.swfCSS.swfTimedout:_s.swfCSS.swfError); - } - _processOnEvents({type:'ontimeout'}); - _debugTS('onload', false); - if (_s.onerror instanceof Function) { - _s.onerror.apply(_win); - } - return false; - } else { - _debugTS('onload', true); - } - _event.add(_win, 'unload', _doNothing); // prevent browser from showing cached state via back button, because flash will be dead - if (_s.waitForWindowLoad && !_windowLoaded) { - _wDS('waitOnload'); - _event.add(_win, 'load', _initUserOnload); - return false; - } else { - if (_s.waitForWindowLoad && _windowLoaded) { - _wDS('docLoaded'); - } - _initUserOnload(); - } - return true; - }; - - _addOnEvent = function(sType, oMethod, oScope) { - if (typeof _on_queue[sType] === 'undefined') { - _on_queue[sType] = []; - } - _on_queue[sType].push({ - 'method': oMethod, - 'scope': (oScope || null), - 'fired': false - }); - }; - - _processOnEvents = function(oOptions) { - if (!oOptions) { // assume onready, if unspecified - oOptions = { - type: 'onready' - }; - } - if (!_didInit && oOptions && !oOptions.ignoreInit) { - // not ready yet. - return false; - } - var status = { - success: (oOptions && oOptions.ignoreInit?_s.ok():!_disabled) - }, - srcQueue = (oOptions && oOptions.type?_on_queue[oOptions.type]||[]:[]), // queue specified by type, or none - queue = [], i, j, - canRetry = (_needsFlash && _s.useFlashBlock && !_s.ok()); - for (i = 0; i < srcQueue.length; i++) { - if (srcQueue[i].fired !== true) { - queue.push(srcQueue[i]); - } - } - if (queue.length) { - _s._wD(_sm + ': Firing ' + queue.length + ' '+oOptions.type+'() item' + (queue.length === 1?'':'s')); - for (i = 0, j = queue.length; i < j; i++) { - if (queue[i].scope) { - queue[i].method.apply(queue[i].scope, [status]); - } else { - queue[i].method(status); - } - if (!canRetry) { // flashblock case doesn't count here - queue[i].fired = true; - } - } - } - return true; - }; - - _initUserOnload = function() { - _win.setTimeout(function() { - if (_s.useFlashBlock) { - _flashBlockHandler(); - } - _processOnEvents(); - // call user-defined "onload", scoped to window - if (_s.onload instanceof Function) { - _wDS('onload', 1); - _s.onload.apply(_win); - _wDS('onloadOK', 1); - } - if (_s.waitForWindowLoad) { - _event.add(_win, 'load', _initUserOnload); - } - },1); - }; - - _detectFlash = function() { - - // hat tip: Flash Detect library (BSD, (C) 2007) by Carl "DocYes" S. Yestrau - http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt - - if (_hasFlash !== undefined) { - // this work has already been done. - return _hasFlash; - } - - var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = _win.ActiveXObject; - - if (nP && nP.length) { - - type = 'application/x-shockwave-flash'; - types = n.mimeTypes; - if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) { - hasPlugin = true; - } - - } else if (typeof AX !== 'undefined') { - - try { - obj = new AX('ShockwaveFlash.ShockwaveFlash'); - } catch(e) { - // oh well - } - hasPlugin = (!!obj); - - } - - _hasFlash = hasPlugin; - - return hasPlugin; - - }; - - _featureCheck = function() { - var needsFlash, item, - isSpecial = (_ua.match(/iphone os (1|2|3_0|3_1)/i)?true:false); // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (iPad) + iOS4 works. - if (isSpecial) { - _s.hasHTML5 = false; // has Audio(), but is broken; let it load links directly. - _html5Only = true; // ignore flash case, however - if (_s.oMC) { - _s.oMC.style.display = 'none'; - } - return false; - } - if (_s.useHTML5Audio) { - if (!_s.html5 || !_s.html5.canPlayType) { - _s._wD('SoundManager: No HTML5 Audio() support detected.'); - _s.hasHTML5 = false; - return true; - } else { - _s.hasHTML5 = true; - } - if (_isBadSafari) { - _s._wD(_smc+'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - '+(!_hasFlash?' would use flash fallback for MP3/MP4, but none detected.':'will use flash fallback for MP3/MP4, if available'),1); - if (_detectFlash()) { - return true; - } - } - } else { - // flash required. - return true; - } - for (item in _s.audioFormats) { - if (_s.audioFormats.hasOwnProperty(item) && _s.audioFormats[item].required && !_s.html5.canPlayType(_s.audioFormats[item].type)) { - // may need flash for this format? - needsFlash = true; - } - } - // sanity check.. - if (_s.ignoreFlash) { - needsFlash = false; - } - _html5Only = (_s.useHTML5Audio && _s.hasHTML5 && !needsFlash && !_s.requireFlash); - return (_detectFlash() && needsFlash); - }; - - _init = function() { - var item, tests = []; - _wDS('init'); - - // called after onload() - if (_didInit) { - _wDS('didInit'); - return false; - } - - function _cleanup() { - _event.remove(_win, 'load', _s.beginDelayedInit); - } - - if (_s.hasHTML5) { - for (item in _s.audioFormats) { - if (_s.audioFormats.hasOwnProperty(item)) { - tests.push(item+': '+_s.html5[item]); - } - } - _s._wD('-- SoundManager 2: HTML5 support tests ('+_s.html5Test+'): '+tests.join(', ')+' --',1); - } - - if (_html5Only) { - if (!_didInit) { - // we don't need no steenking flash! - _cleanup(); - _s.enabled = true; - _initComplete(); - } - return true; - } - - // flash path - _initMovie(); - try { - _wDS('flashJS'); - _s.o._externalInterfaceTest(false); // attempt to talk to Flash - if (!_s.allowPolling) { - _wDS('noPolling', 1); - } else { - _setPolling(true, _s.flashPollingInterval ? _s.flashPollingInterval : (_s.useFastPolling ? 10 : 50)); - } - if (!_s.debugMode) { - _s.o._disableDebug(); - } - _s.enabled = true; - _debugTS('jstoflash', true); - } catch(e) { - _s._wD('js/flash exception: ' + e.toString()); - _debugTS('jstoflash', false); - _failSafely(true); // don't disable, for reboot() - _initComplete(); - return false; - } - _initComplete(); - // event cleanup - _cleanup(); - return true; - }; - - _beginInit = function() { - if (_initPending) { - return false; - } - _createMovie(); - _initMovie(); - _initPending = true; - return true; - }; - - _dcLoaded = function() { - if (_didDCLoaded) { - return false; - } - _didDCLoaded = true; - _initDebug(); - if (!_s.useHTML5Audio) { - if (!_detectFlash()) { - _s._wD('SoundManager: No Flash detected, trying HTML5'); - _s.useHTML5Audio = true; - } - } - _testHTML5(); - _s.html5.usingFlash = _featureCheck(); - _needsFlash = _s.html5.usingFlash; - _didDCLoaded = true; - if (_doc.removeEventListener) { - _doc.removeEventListener('DOMContentLoaded', _dcLoaded, false); - } - _go(); - return true; - }; - - _startTimer = function(oSound) { - if (!oSound._hasTimer) { - oSound._hasTimer = true; - } - }; - - _stopTimer = function(oSound) { - if (oSound._hasTimer) { - oSound._hasTimer = false; - } - }; - - _die = function() { - if (_s.onerror instanceof Function) { - _s.onerror(); - } - _s.disable(); - }; - - _badSafariFix = function() { - // special case: "bad" Safari can fall back to flash for MP3/MP4 - if (!_isBadSafari || !_detectFlash()) { - return false; // doesn't apply - } - var aF = _s.audioFormats, i, item; - for (item in aF) { - if (aF.hasOwnProperty(item)) { - // special case: "bad" Safari can fall back to flash for MP3/MP4 - if (item === 'mp3' || item === 'mp4') { - _s._wD(_sm+': Using flash fallback for '+item+' format'); - _s.html5[item] = false; - // assign result to related formats, too - if (aF[item] && aF[item].related) { - for (i = aF[item].related.length; i--;) { - _s.html5[aF[item].related[i]] = false; - } - } - } - } - } - }; - - // pseudo-private methods called by Flash - - this._setSandboxType = function(sandboxType) { - // - var sb = _s.sandbox; - sb.type = sandboxType; - sb.description = sb.types[(typeof sb.types[sandboxType] !== 'undefined'?sandboxType:'unknown')]; - _s._wD('Flash security sandbox type: ' + sb.type); - if (sb.type === 'localWithFile') { - sb.noRemote = true; - sb.noLocal = false; - _wDS('secNote', 2); - } else if (sb.type === 'localWithNetwork') { - sb.noRemote = false; - sb.noLocal = true; - } else if (sb.type === 'localTrusted') { - sb.noRemote = false; - sb.noLocal = false; - } - // - }; - - this._externalInterfaceOK = function(flashDate) { - // flash callback confirming flash loaded, EI working etc. - // flashDate = approx. timing/delay info for JS/flash bridge - if (_s.swfLoaded) { - return false; - } - var eiTime = new Date().getTime(); - _s._wD(_smc+'externalInterfaceOK()' + (flashDate?' (~' + (eiTime - flashDate) + ' ms)':'')); - _debugTS('swf', true); - _debugTS('flashtojs', true); - _s.swfLoaded = true; - _tryInitOnFocus = false; - if (_isBadSafari) { - _badSafariFix(); - } - if (_isIE) { - // IE needs a timeout OR delay until window.onload - may need TODO: investigating - setTimeout(_init, 100); - } else { - _init(); - } - }; - - _dcIE = function() { - if (_doc.readyState === 'complete') { - _dcLoaded(); - _doc.detachEvent('onreadystatechange', _dcIE); - } - return true; - }; - - // focus and window load, init - if (!_s.hasHTML5 || _needsFlash) { - // only applies to Flash mode - _event.add(_win, 'focus', _handleFocus); - _event.add(_win, 'load', _handleFocus); - _event.add(_win, 'load', _delayWaitForEI); - if (_isSafari && _tryInitOnFocus) { - _event.add(_win, 'mousemove', _handleFocus); // massive Safari focus hack - } - } - - if (_doc.addEventListener) { - _doc.addEventListener('DOMContentLoaded', _dcLoaded, false); - } else if (_doc.attachEvent) { - _doc.attachEvent('onreadystatechange', _dcIE); - } else { - // no add/attachevent support - safe to assume no JS -> Flash either - _debugTS('onload', false); - _die(); - } - - if (_doc.readyState === 'complete') { - setTimeout(_dcLoaded,100); - } - -} // SoundManager() - -// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading -if (typeof SM2_DEFER === 'undefined' || !SM2_DEFER) { - soundManager = new SoundManager(); -} - -// public interfaces -window.SoundManager = SoundManager; // constructor -window.soundManager = soundManager; // public API, flash callbacks etc - -}(window)); diff --git a/timeside/ui/js/markermap.js b/timeside/ui/js/markermap.js deleted file mode 100644 index ad3ae8c..0000000 --- a/timeside/ui/js/markermap.js +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (C) 2007-2011 Parisson - * Copyright (c) 2011 Riccardo Zaccarelli - * - * This file is part of TimeSide. - * - * TimeSide is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * TimeSide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with TimeSide. If not, see . - * - * Author: Riccardo Zaccarelli - */ - -/** - * class fior managing markers in the player. This class extends TimesideArray (see timeside.js), and communicates with the other - * two TimesideArrays of the player which receive edit events (click, keys events etcetera): the ruler (ruler.js) and the markermapdiv (divmarker.js) - * All bindings between these three classes are set in in the player (See player.js , in particular loadMarkers method) - */ -Timeside.classes.MarkerMap = Timeside.classes.TimesideArray.extend({ - - init: function() { - this._super(); - }, - - pFloat: parseFloat, //reference to function parseFloat for faster lookup - //overridden - add: function(newMarker) { - if(!('offset' in newMarker)){ - return -1; - } - - if(typeof newMarker.offset != 'number'){ //check to be sure: - newMarker.offset = this.pFloat(newMarker.offset); - } - if(!('id' in newMarker)){ - newMarker.id = this.$TU.uniqid(); //Timeside.utils.uniqid(); - } - if(!('isEditable' in newMarker)){ - newMarker.isEditable = false; - } - var marker = newMarker; - var idx = this.insertionIndex(marker); - if(idx>=0){ //it exists? there is a problem.... - this.debug('markermap.add: adding an already existing marker!!'); //should not happen. however... - return -1; - } - - idx = -idx-1; - //we do not call the super add cause we want to insert at a specified index - this._super(marker,idx); - //notifies controller.onMarkerMapAdd - - this.fire('add', { - marker: marker, - index: idx - }); - - return idx; - }, - - //overridden method. Contrarily to super method, - //where the first argument is the index (integer), here the - //the first argument can also be a marker. Its index will be found and, if valid, the super method will be called - //RETURNS -1 IF SOMETHING HAS GONE WRONG, OTHERWISE THE - remove: function(markerOrMarkerIndex) { - var idx = -1; - if(typeof markerOrMarkerIndex == 'number'){ - idx = markerOrMarkerIndex; - }else if('id' in markerOrMarkerIndex && 'offset' in markerOrMarkerIndex){ - idx = this.insertionIndex(markerOrMarkerIndex); - //idx>=0 ONLY if marker has been found - } - if(idx<0 || idx>=this.length){ - this.debug('markermap.remove: index out of bounds or marker not found'); - return -1; - } - var marker = this._super(idx); - this.fire('remove',{ - 'index':idx, - 'marker':marker - }); - return idx; - }, - - //overridden method. Contrarily to super method, - //where the first argument is the 'from' index, here the - //the first argument can also be a marker - move: function(markerOrMarkerIndex, newOffset){ - var oldIndex = -1; - if(typeof markerOrMarkerIndex == 'number'){ - oldIndex = markerOrMarkerIndex; - }else if('id' in markerOrMarkerIndex && 'offset' in markerOrMarkerIndex){ - oldIndex = this.insertionIndex(markerOrMarkerIndex); - //oldIndex>=0 ONLY if marker has been found - } - if(oldIndex<0 || oldIndex>=this.length){ - this.debug('markermap.move: index out of bounds or marker not found'); - return -1; - } - - var newIndex = this.insertionIndex(newOffset); - //select the case: - if(newIndex<0){ //newindex should ALWAYS be lower than zero, as insertionIndex(number) should not match any marker - //we didn't move the marker on another marker (newOffset does not correspond to any marker) - //just return the real insertionIndex - newIndex = -newIndex-1; - } - - //now: if the isnertionIndex is greater than the marker index (oldIndex), - //we decrement newIndex cause super.move will first REMOVE the marker and then set it at newIndex - if(newIndex > oldIndex){ - newIndex--; - } - newIndex = this._super(oldIndex,newIndex); - - if(newIndex <0){ - this.debug('markermap.move: new index out of bounds'); - return -1; - } - - var markers = this.toArray(); - var marker = markers[newIndex]; - var oldOffset = marker.offset; - marker.offset = newOffset; - this.fire('move', { - marker: marker, - fromIndex: oldIndex, - toIndex: newIndex, - oldOffset: oldOffset - }); - return newIndex; - }, - - - //returns the insertion index of object in this sorted array by means of a binary search algorithm. - // A) If object is a marker and: - // a1) Is found (ie, there is a marker in this map - // with same offset and same id), returns the index of the marker found, in the range [0, this.length-1]. Otherwise, if - // a2) Is not found, then returns -(insertionIndex-1), where insertionIndex is the - // index at which object would be inserted preserving the array order. Note that this assures that a - // number lower than zero means that object is not present in the array, and viceversa - // B) If object is a number or a string number (eg, "12.567"), then a marker with offset = object is built and compared - // against the markers in the map. Note however that in this case that equality between marker's offset is sufficient, - // as object is not provided with an id. THEREFORE, IF THE MAP CONTAINS SEVERAL MARKERS AT INDICES i, i+1, ... i+n - // WITH SAME OFFSET == object, THERE IS NO WAY TO DETERMINE WHICH INDEX IN [i, i+1, ... i+n] WILL BE RETURNED. - // See player.forward and player.rewind for an example of the B) case. - //LAST NOTE: BE SURE object is either a number (float) or object.offset is a number (float). - //In case it is not known, If it is a string number such as - //"4.562" the comparison falis (eg, "2.567" > "10.544") but obviously, no error is thrown in javascript - // - insertionIndex: function(object){ - //default comparator function: - //returns 1 as the first argument is greater than the second - //returns -1 as the first argument is lower than the second - //returns 0 if the arguments are equal - var comparatorFunction = function(markerInMap,newMarker){ - var a = markerInMap.offset; - var b = newMarker.offset; - if(ab){ - return 1; - }else{ - var a1 = markerInMap.id; - var b1 = newMarker.id; - if(a1b1){ - return 1; - } - } - return 0; - }; - if(!(typeof object == 'object')){ - var offset; - if(typeof object == 'number'){ - offset = object; - }else{ //to be sure... - offset = parseFloat(object); - } - object = { - 'offset':offset - }; - //key will never be found, so return either 1 or -1: - comparatorFunction = function(markerInMap,newMarker){ - var a = markerInMap.offset; - var b = newMarker.offset; - return a < b ? -1 : (a>b ? 1 : 0); - }; - } - - var data = this.toArray(); - var low = 0; - var high = data.length-1; - - while (low <= high) { - var mid = (low + high) >>> 1; - //biwise operation is not as fast as in compiled languages such as C and java (see Jslint web page) - //However (tested on a PC in Chrome, IE and FF), it is faster than the equivalent: - //var mid = parseInt((low + high)/2); - //even if we reference parseInt before this loop and we call the variable assigned to it - var midVal = data[mid]; - var cmp = comparatorFunction(midVal,object); - if (cmp < 0){ - //the midvalue is lower than the searched index element - low = mid + 1; - }else if (cmp > 0){ - //the midvalue is greater than the searched index element - high = mid - 1; - }else{ - return mid; // key found - } - } - return -(low + 1); // key not found - }, - - //sets isEditable to value - setEditable: function(markerOrMarkerIndex, value) { - var idx = -1; - if(typeof markerOrMarkerIndex == 'number'){ - idx = markerOrMarkerIndex; - }else if('id' in markerOrMarkerIndex && 'offset' in markerOrMarkerIndex){ - idx = this.insertionIndex(markerOrMarkerIndex); - //idx>=0 ONLY if marker has been found - } - if(idx<0 || idx>=this.length){ - this.debug('markermap.setEditable: index out of bounds or marker not found'); - return -1; - } - var marker = this.toArray()[idx]; - var oldVal = marker.isEditable ? true : false; - marker.isEditable = value; - this.fire('markerEditStateChanged',{ - 'index':idx, - 'marker':marker, - 'oldValue':oldVal, - 'value':value - }); - return idx; - } - -} -); \ No newline at end of file diff --git a/timeside/ui/js/player.js b/timeside/ui/js/player.js deleted file mode 100644 index b963f6f..0000000 --- a/timeside/ui/js/player.js +++ /dev/null @@ -1,1078 +0,0 @@ -/* - * Copyright (C) 2007-2011 Parisson - * Copyright (c) 2011 Riccardo Zaccarelli - * Copyright (c) 2010 Olivier Guilyardi - * - * This file is part of TimeSide. - * - * TimeSide is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * TimeSide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with TimeSide. If not, see . - * - * Authors: Riccardo Zaccarelli - * Olivier Guilyardi - */ - -/** - * The player class to instantiate a new player. Requires all necessary js (timeside, ruler, markermap etcetera...) and - * jQuery - */ - -//playerDiv, sound, durationInMsec, visualizers, markerMap); -Timeside.classes.Player = Timeside.classes.TimesideClass.extend({ - - //sound duration is in milliseconds because the soundmanager has that unit, - //player (according to timeside syntax) has durations in seconds - // newMarkerCallback must be either a string or a function, the necessary checks is done in Timeside.load - // (which calls this method) - //if markersArray is not an array, it defaults to [] - init: function(configObject) { - this._super(); - var $J = this.$J; - var me=this; - - var msgs = configObject.messages; - if(msgs){ - for(var k in msgs){ - if(msgs.hasOwnProperty(k)){ - var ms = msgs[k]; - if(typeof ms === 'string'){ - this.msgs[k] = ms; - } - } - } - } - - var onError = configObject.onError; - if(typeof onError !== 'function'){ - onError = function(msg){}; - } - - var onReady = configObject.onReady; - if(typeof onReady !== 'function'){ - onReady = function(player){}; - } - - var onReadyWithImage = configObject.onReadyWithImage; - - if(typeof onReadyWithImage === 'function'){ - var onReadyWithImageNamespace = 'imgRefreshed.temp_'+new Date().getTime(); //get an unique namespace - this.bind(onReadyWithImageNamespace,function(data){ - onReadyWithImage(me); - me.unbind(onReadyWithImageNamespace); - }); - } - - var container = configObject.container; - container = container instanceof $J ? container : $J(container); - container = container.length ? container.eq(0) : undefined; - if (!container || !container.length){ - onError('container not defined or invalid'); - return; - } - - var sMan = soundManager; - var sound = configObject.sound; - var createSound = false; - if(this.$TU.flashFailed){ - this.soundErrorMsg = 'soundManager error. If your browser does not support HTML5, Flash player (version '+sMan.flashVersion+'+) must be installed.\nIf flash is installed, try to:\n - Reload the page\n - Empty the cache (see browser preferences/options/tools) and reload the page\n - Restart the browser'; - }else{ - if(typeof sound !== 'string' && typeof sound !== 'object'){ - this.soundErrorMsg ='bad sound parameter: specify a a valid soundManager sound-object, an object with at least two properties, url and id, or URL as string'; - }else if(typeof sound === 'string'){ - createSound = true; - var soundURL = sound; - sound = { - id: 'ts-sound', - autoLoad: false, - url: soundURL, - multiShot: false - }; - //do a raw check to see if it is a soundmanager object - }else if(!sound.hasWonProperty('sID') || !sound.hasWonProperty('_iO') || !sound.hasWonProperty('url')){ - if(!sound.hasWonProperty('url') || !sound.hasWonProperty('id')){ //it is not a soundManager object, has at least an url??? - this.soundErrorMsg = 'bad sound parameter: object requires properties url and id at minimum'; - }else{ - createSound = true; - } - } - if(createSound){ - var soundOptions = sound; - if(sMan.canPlayURL(soundOptions.url)){ //this actually checks only if the url is well formed, not if the file is there - //check if we specified a valid sound duration, otherwise the sound must be loaded - sound = sMan.createSound(soundOptions); - }else{ - this.soundErrorMsg = 'bad sound parameter (soundManager.canPlayURL returned false)'; - } - } - } - if(this.soundErrorMsg){ - this.getSound = function(){ - return undefined; - }; - }else{ - this.getSound = function(){ - return sound; - }; - } - var soundDurationInMsec = configObject.soundDuration; - if(typeof soundDurationInMsec !== 'number' || soundDurationInMsec<=0){ - onError('invalid soundDurationInMsec: NaN or not positive'); - return; - } - - - var soundImgFcn = configObject.soundImage; - - if(!(typeof soundImgFcn === 'string' || typeof soundImgFcn === 'function')){ - onError('invalid sound soundImgFcn. Provide a callback(width,height) or a string denoting a valid URL'); - return; - }else{ - if(typeof soundImgFcn === 'string'){ - var url = soundImgFcn; - this.imageCallback = new function(w,h){ - return url; - }; - }else{ //surely a function - this.imageCallback = soundImgFcn; - } - } - - var soundImgSize = configObject.imageSize; - var markersArray = configObject.markersArray; - var newMarker = configObject.newMarker; - - - - this.playState = 0; //0: not playing, 1: loading, 2:buffering, 3 playing (sound heard) - //container is the div #player - - this.getContainer = function(){ - return container; - }; - - - - var sd = this.toSec(soundDurationInMsec); - this.getSoundDuration = function(){ - return sd; - }; - - this.soundPosition = sound.position ? this.toSec(sound.position) : 0; - this.soundVolume = 100; //set to maximum - - - // - - //initializing markermap and markerui - var map = new Timeside.classes.MarkerMap(); - this.getMarkerMap = function(){ - return map; - }; - - var canAddMarkers = false; - if(newMarker === true || (typeof newMarker === 'function')){ - canAddMarkers = true; - if(typeof newMarker === 'function'){ - this.newMarker = newMarker; - } - } - - //build the innerHTML as array, then join it. This is usually faster than string concatenation in some browsers. - //Note that the player image (see below) is not created now, however, if it was, it should be given a src - //as NOT specifying any src for image tags can be harmful, - //see http://www.nczonline.net/blog/2009/11/30/empty-image-src-can-destroy-your-site/ and - //http://geekswithblogs.net/bcaraway/archive/2007/08/24/114945.aspx for details - var html = [ - "
", - "
", - "
", - "
", - //lazily created: "", //not providing a src attribute is harmful. Dummy src attribute - "
", - "
", - "
", - "", - "", - "", - "", - "", - "", - "
", - "", - "", - "", - "
", - "
", - "
"]; - - container.html(html.join('')); - - var control = container.find('.ts-control'); - - //bind events to buttons: - var rewind = control.find('.ts-rewind'); - rewind.attr('href', '#').click(function(e){ - me.rewind.apply(me); - return false; - }); - - var forward = control.find('.ts-forward'); - forward.attr('href', '#').click(function(e){ - me.forward.apply(me); - return false; - }); - - var pause = control.find('.ts-pause'); - pause.attr('href', '#').bind('click', function(){ - me.pause.apply(me); - return false; - }); - - var play = control.find('.ts-play'); - play.attr('href', '#').bind('click', function(){ - me.play.apply(me); - return false; - }); - - var setMarkerButton = control.find('.ts-set-marker'); - - if(canAddMarkers){ - setMarkerButton.show().attr('href','#').unbind('click').bind('click', function(){ - me.addMarker(me.soundPosition); - return false; - }); - }else{ - setMarkerButton.hide().unbind('click'); - } - - - //volume: - var volumeSpeaker = control.find('.ts-volume-speaker'); - var volumeBarContainer = control.find('.ts-volume-bar-container'); - var volumeBar = volumeBarContainer.find('.ts-volume-bar'); - - var getVol = function(x){ - var vol = 100*x/volumeBarContainer.width(); - //allow click to easily set to zero or 100, ie set a margin to 5%: - var margin = 5; - if (vol < margin){ - vol=0; - }else if(vol >100-margin){ - vol = 100; - } - return vol; - }; - function setVolume(event,volumeElement){ - var x = event.pageX - volumeElement.offset().left; //using absolute coordinates allows us to - //avoid using layerX (not supported in all browsers) and clientX (which needs the window scrollLeft variable) - me.setSoundVolume(getVol(x)); - return false; - } - volumeBarContainer.attr('href', '#').click(function(event){ - return setVolume(event,volumeBar); - }); - volumeSpeaker.attr('href', '#').click(function(){ - me.setSoundVolume(me.soundVolume>0 ? 0 : getVol(volumeBar.outerWidth())); - return false; - }); - this.setSoundVolume(this.soundVolume); - - control.find('a').attr('href', '#') ; - - //SET NECESSARY CSS (THIS WILL OVERRIDE CSS SET IN STYLESHEETS): - //var viewer = container.find('.ts-viewer'); - var wave = container.find('.ts-wave'); - var ruler_ = container.find('.ts-ruler'); - wave.add(control).add(ruler_).css({ - 'position':'relative', - 'overflow':'hidden' - }); - //assigning display and title to all anchors - var subcontrolsToBeSetVisible = control.find('*'); - if(!canAddMarkers){ - subcontrolsToBeSetVisible = subcontrolsToBeSetVisible.filter(':not(a.ts-set-marker)'); - } - subcontrolsToBeSetVisible.css({ - 'display':'inline-block', - 'overflow':'hidden' - }); - - var waitImg = control.find('.ts-wait'); - waitImg.html('wait').css({ - 'position':'absolute' - }); - - var div = control.find('.ts-volume-wrapper-div'); - div.css({ - 'position':'absolute', - 'left':(volumeSpeaker.position().left+volumeSpeaker.outerWidth(true))+'px', - 'top':0, - 'width':'auto', - 'height':'100%' - }); - //END NECESSARY CSS - - //creating the ruler - var waveImage = container.find('.ts-image-canvas'); - var ruler = new Timeside.classes.Ruler(ruler_, waveImage, this.getSoundDuration()); - //var ruler = new Timeside.classes.Ruler(viewer, this.getSoundDuration()); - this.getRuler = function(){ - return ruler; - }; - //bind mouse events: - ruler.bind('rulermarkermouseevent', function(data){ - var idx = data.index; - data.marker = idx > -1 ? me.getMarker(idx) : undefined; - me.fire('markerMouseEvent',data); - }); - - //setting image size (if provided) and resize player. Note that _setImageSize (with underscore) is intended to be - //a private method (faster). setImageSize (without underscore) is the public method to use outside of player object - if(soundImgSize){ - this._setImageSize(soundImgSize.width,soundImgSize.height,container, wave,true); //calls this.resize which calls ruler.resize - }else{ - this._setImageSize('','',container, wave,true); //calls this.resize which calls ruler.resize - } - - //binds click for the pointer: - var v = wave; //.add(ruler); - v.unbind('click').click(function(evt){ - var w = v.width(); - var x = evt.pageX - v.offset().left; //using absolute coordinates allows us to - //avoid checking whether or not we are clicking on a vertical marker line, on a subdiv etcetera - var sd = me.getSoundDuration(); - me.setSoundPosition(sd*x/w); - }); - - - - //finally, load markers and bind events for markers (see method below): - //NOTE: loadMarkers ASYNCHRONOUSLY CALLS THE SERVER, SO METHODS WRITTEN AFTER IT MIGHT BE EXECUTED BEFORE - //loadMarkers has finished its job - //this.loadMarkers(callback); - if(!(markersArray) || !(markersArray.length)){ - markersArray = []; - } - this.loadMarkers(markersArray); - - - //IE7 BUG: the divs wave and control do not shift downwards after canvas is drawn and covers part of the rulrer. - //Weird enough (with IE it isn't actually), we have just to set the property we already set in the css: - //ie, top: auto. This is however useful even if somebody specified a top property on the divs - ruler_.add(wave).add(control).css('top','auto'); - onReady(this); - }, - - //functions for converting seconds (player unit) to milliseconds (sound manager unit) and viceversa: - toSec: function(milliseconds){ - return milliseconds/1000; - }, - toMsec : function(seconds){ //this function has less performances than toSec, as it calls Math.round - return Math.round(1000*seconds); //however, it is assumed that it is NOT called in loops - }, - - setSoundPosition: function(newPositionInSeconds){ - //if the player is playing and NOT yet fully loaded, simply calling: - //this.getSound().setPosition(this.toMsec(newPositionInSeconds)); - //resets the position to zero. So we use this workaround: - // this.getSound().stop(); //calling this.pause() hides the waiting bar, which is not the case here - // this.soundPosition = newPositionInSeconds; - // this.play(); - //however, that causes fast pointer move effect is undesiderable - //So: - var wasPlaying = this.playState > 0; - if(wasPlaying){ - this.getSound().stop(); //dont call this.pause cause it hides the waitbar, if visible and resets the playState - } - //update pointer position. If this call is due to a pointer move (mouse release), - //ruler.isPointerMovingFromMouse=true and the following code has no effect (the pointer is already at the good position) - var ruler = this.getRuler(); - if(ruler){ - ruler.movePointer(newPositionInSeconds); - } - //set sound position: - var oldSoundPosition = this.soundPosition; - this.soundPosition = newPositionInSeconds; - - //resume playing if it was playing: - if(wasPlaying){ - var player = this; - - //delay a little bit the play resume, this might avoid fast pointer repositioning - //(it should not be the case, but it happens. why??) - setTimeout(function(){ - player.play.apply(player); - },100); - } - this.fire('soundPositionSet',{ - player:this, - oldSoundPosition:oldSoundPosition - }); - - }, - showSoundErroMessage: function(){ - alert(this.soundErrorMsg); - }, - readyState : function(){ - var s = this.getSound(); - return s ? s.readyState : 2; - //attach onload event only if the sound is NOT already loaded: - /*sound.readyState - * Numeric value indicating a sound's current load status - * -1: sound error on construcotr, sound is undefined - * 0 = uninitialised - * 1 = loading - * 2 = failed/error - * 3 = loaded/success - */ - }, - //given a marker at index I, specifies that a marker corss event is fired whenever the sound position (pointer) - //is in the interval ]markerCrossedOffsetMargin-I,I+markerCrossedOffsetMargin[ - //the value is in seconds - //markerCrossedOffsetMargin : 0.5, - play : function(){ - - if(this.soundErrorMsg){ - alert(this.soundErrorMsg); - return false; - } - - var player = this; - var sound = player.getSound(); - - if(!player || !sound){ //just check. The cases here (especially, sound = undefined, should be - //together with this.soundErrorMsg != "", so we should have catch the case above - return false; - } - - - var playOptions = {}; //the play options to be passed to the play method - - var readyState = this.readyState(); - - //create event loadErrorFunction only if the sound is NOT already loaded: - /* - * Numeric value indicating a sound's current load status - * 0 = uninitialised - * 1 = loading - * 2 = failed/error - * 3 = loaded/success - */ - if(readyState !== 3){ - playOptions.onload = function(success){ - if(!success){ - sound.stop(); - player.playState = 0; - player.setWait(player.isImgRefreshing ? player.msgs.imgRefreshing : ''); - player.soundErrorMsg = 'Error while loading sound: check sound url'; - player.showSoundErroMessage(); - } - }; - - if(sound.readyState === 2){ - playOptions.onload(false); - return false; - } - } - - - var fireOnMarkerPosition = function(seconds){}; //does nothing by default - var map = player.getMarkerMap(); - var markerCrossListeners = player.listenersMap['markerCrossed']; - //optimizing: if no listeners associated to markerCrossListeners, avoid creating a function - if(map && map.length && markerCrossListeners){ - var idx = 0; - if(player.soundPosition>0){ - idx = map.insertionIndex(player.soundPosition); - if(idx<0){ - idx=-idx-1; - } - } - var len = map.length; - if(idx>-1 && idx < len){ - var markers = map.toArray(); - var marker = markers[idx]; - var margin = 0.5; //1 second (0.5*2) of margin (before+after) - var offs = marker.offset; - var intervalUpperBound = offs+margin; - var intervalLowerBound = offs-margin; - var data = { //if you change data, change it also below - index:idx, - marker:marker, - currentSoundPosition: player.soundPosition, - nextMarkerTimeInterval: undefined - }; - fireOnMarkerPosition = function(seconds){ - if(marker){ - if(seconds>intervalLowerBound && seconds < intervalUpperBound){ - idx++; - marker = idx < len ? markers[idx] : undefined; - offs = marker ? marker.offset : undefined; - data.currentSoundPosition = seconds; - data.nextMarkerTimeInterval = marker ? [offs-margin, offs+margin] : undefined; - player.fire('markerCrossed',data); - - if(idx= this.getSoundDuration()){ - playOptions.onfinish(); - }else{ - sound.setVolume(this.soundVolume); //workaround. Just to be sure. Sometimes it fails when we re-play - sound.play(playOptions); - // soundManager.play(sound.sId,{ - // onload: function(success){ - // alert(success); - // } - // }); - } - - return false; - }, - - msgs : { - loading : 'loading', - buffering: 'buffering', - imgRefreshing : 'refreshing img' - }, - pause: function(){ - var sound = this.getSound(); - //we don't check if it's playing, as the stop must really stop anyway - //if(sound && this.isPlaying()){ - if(sound){ - //var v = this.isPlaying(); - sound.stop(); - var data = { - player:this, - oldPlayState:this.playState, - endOfPlayback:false - }; - this.playState = 0; - this.fire('playStateChanged',data); - this.setWait(this.isImgRefreshing ? this.msgs.imgRefreshing : ''); - } - return false; - }, - - getWaitElement: function(){ - return this.getContainer().find('.ts-control').find('.ts-wait'); - }, - - setWait: function(msg){ - var wait = undefined; - - wait = this.getWaitElement(); - if(!wait || msg === undefined){ - return; - } - if(wait.html()!=msg){ - wait.html(msg); - } - - var visible = wait.css('display') != 'none'; - - if(msg && !visible){ - wait.show(); - this.fire('waitShown'); - }else if(!msg && visible){ - wait.hide(); - this.fire('waitHidden'); - } - }, - - /** - * sets whether or not window resize resizes also this player. When true, a variable _dynamicResize =setInterval(...) is attached to - * this class. When false, if _dynamicResize is in this class, clearInterval(_dynamicResize) is called and then the key is deleted - */ - setDynamicResize: function(value){ - var key = '_dynamicResize'; - if(!value && key in this){ - clearInterval(this[key]); - delete this[key]; - return; - } - var wdw = this.$J(window); - var w = wdw.width(); - //var h = wdw.height(); - var me = this; - this.dynamicResize = setInterval(function(){ - var newW = wdw.width(); - if(w!=newW){ - w = newW; - //still wait a second: are we still adjusting the window? (call resize just once): - setTimeout(function(){ - if(wdw.width()==newW){ - me.resize.apply(me); - } - },200); - } - },100); - }, - - resize: function() { - var height; - var container = this.getContainer(); - - var wave = container.find('.ts-wave'); - - height = wave.height(); - // if(!height){ - // height = this.minWaveHeight; - // wave.css('height',height+'px'); - // } - //if (height) { - //set image, imagecontainer and canvas (container on imagecontainer for lines and pointer triangles) css - var elements = wave.find('.ts-image-container').css('zIndex','0') - .add(wave.find('.ts-image-canvas').css('zIndex','1')); //the two children of ts-wave. Set also the zIndex - //in order to visualize the canvas OVER the wav image - var style = { - width: wave.width(), - height: height, - border: 0, - padding:0, - margin:0, - top:0, - left:0 - }; - elements.css(style); - elements.css('position','absolute'); - //} - - //refreshing images: - this.refreshImage(); - this.getRuler().resize(); - }, - getImageUrl : function(){ - var image = this.getContainer().find('.ts-image'); - if(image && image.length){ - return image.attr('src'); - } - return ''; - }, - refreshImage: function(){ - var container = this.getContainer(); - var imageC = container.find('.ts-image-container'); - var image = imageC.find('.ts-image'); - - - var size = this.getImageSize(); - - if(!size.width || !size.height){ - return; - } - var imgSrc = this.imageCallback(size.width,size.height); - var imageNotYetCreated = image.length == 0; - if(!imageNotYetCreated && image.attr('src')==imgSrc){ - return; - } - - var player= this; - - if(imageNotYetCreated){ - image = this.$J(''); - } - - //image inside ts-image-container: - image.css({ - 'width':'100%', - 'height':'100%' - }); // for IE7. Does not seem to hurt IE8, FF, Chrome - - var updateWait = function(){}; - var ir = player.msgs.imgRefreshing; - var we = player.getWaitElement(); - if(ir && we){ - updateWait = function(){ - if(!player.playState || player.playState==3){ - player.setWait(''); - } - } - } - image.load(function(){ - image.unbind('load'); - if(imageNotYetCreated){ - imageC.append(image.addClass('ts-image')); - } - updateWait(); - player.isImgRefreshing = false; - player.fire('imgRefreshed'); - }); - if(ir && we && (!this.playState || this.playState===3)){ //if loading (1) or buffering (2) do not update wait. - //If not playing (undefined or 0) playing (3) update wait - this.setWait(ir); - } - this.isImgRefreshing = true; - this.fire('imgRefreshing'); - image.attr('src', imgSrc); - - }, - getImageSize: function(){ - var wave = this.getContainer().find('.ts-wave'); - return { - width: wave.width(), - height:wave.height() - } - }, - - setImageSize: function(width,height){ - var container = this.getContainer(); - var wave = container.find('.ts-wave'); - this._setImageSize(width,height,container, wave,true); - }, - //this is intended to be a private method, use setImageSize from outside the player object) - _setImageSize: function(width,height,jQueryContainerElement, jQueryWaveElement, resize){ - if(width || height){ - var re = /(?:px|ex|em|%)$/; - if(width){ - width+=''; - width = re.exec(width) ? width : width+'px'; - jQueryContainerElement.css('width',width); - } - if(height){ - height+=''; - height = re.exec(height) ? height : height+'px'; - jQueryWaveElement.css('height',height); - } - } - if(resize){ - this.resize(); - } - }, - - //moves the pointer (and sound position) forward till the next marker or the end of sound - forward: function() { - var map = this.getMarkerMap(); - var markers = map.toArray(); - var len = markers.length; - var offset = this.getSoundDuration(); - var position = this.soundPosition; //parseFloat(this.getSoundPosition()); - var idx = map.insertionIndex(position); - if(idx<0){ - idx = -idx-1; //cursor is not on a a marker, get the insertion index - }else{ - //cursor is on a marker. As there might be several markers with the same offset - //(see MarkerMap.insertionIndex), move to the outmost right - while(idx0 && markers[idx-1].offset == position){ - idx--; - } - } - idx--; //move backward (rewind) - if(idx>=0){ - offset = markers[idx].offset; - } - this.setSoundPosition(offset); - return false; - }, - - setSoundVolume: function(volume){ - - if(typeof volume != 'number'){ //note: typeof for primitive values, instanceof for the rest - //see topic http://stackoverflow.com/questions/472418/why-is-4-not-an-instance-of-number - volume = 100; - } - - if(volume<0){ - volume = 0; - }else if(volume>100){ - volume = 100; - } - volume = Math.round(volume); - this.soundVolume = volume; - if(this.playState>0){ - var s = this.getSound(); - if(s){ - s.setVolume(volume); - } - } - var control = this.getContainer().find('.ts-control'); - var volumeSpeaker = control.find('.ts-volume-speaker'); - var volumeBarContainer = control.find('.ts-volume-bar-container'); - var volumeBar = volumeBarContainer.find('.ts-volume-bar'); - if(volume==0){ - volumeSpeaker.removeClass('ts-volume-speaker-on').addClass('ts-volume-speaker-off'); - volumeBar.css('visibility','hidden'); - }else{ - volumeSpeaker.removeClass('ts-volume-speaker-off').addClass('ts-volume-speaker-on'); - volumeBar.css('visibility','visible'); - volumeBar.css({ - 'height':'100%', - 'width':volume+'%' - }); - } - }, - - each: function(){ - var map = this.getMarkerMap(); - if(map){ - map.each.apply(map,arguments); - } - }, - - newMarker: function(offset){ - return { - offset:offset - }; - }, - addMarker: function(offset){ - var map = this.getMarkerMap(); - if(map){ - map.add(this.newMarker(offset)); - } - }, - - removeMarker: function(identifier){ //identifier can be an number (marker index) or a marker (the index will be aearched) - //see marlermap.remove - var map = this.getMarkerMap(); - if(map){ - map.remove(identifier); - } - }, - - moveMarker: function(identifier, newOffset){ //identifier can be an number (marker index) or a marker (the index will be aearched) - var map = this.getMarkerMap(); - if(map){ - map.move(identifier,newOffset); - } - }, - - getMarker: function(index){ - var map = this.getMarkerMap(); - if(map){ - return map.toArray()[index]; - } - return undefined; - }, - - setMarkerEditable: function(identifier, value){ - var map = this.getMarkerMap(); - if(map){ - return map.setEditable(identifier,value); - } - return undefined; - }, - - //markers is an array of objects with at least the field offset:sconds.milliseconds - loadMarkers: function(markers){ - //ruler.bind('markermoved',this.markerMoved,this); - //var $J = this.$J; //reference to jQuery - - var player = this; - //initialize the map. - var map = this.getMarkerMap(); - //var mapUI = this.getMarkersUI(); - var ruler = this.getRuler(); - - //TODO: think about if clearing or not: we assign some bindings in the constructor, too: - // map.clear(); - // ruler.clear(); - - - var rulerAdd = ruler.add; - - if(markers){ - //add markers to the map. No listeners associated to it (for the moment) - for(var i =0; i< markers.length; i++){ - map.add.apply(map,[markers[i]]); - } - //add markers to ruler and div - map.each(function(i,marker){ - //isEditable and id are added if not present - rulerAdd.apply(ruler,[marker.offset, i, marker.isEditable]); - }); - } - - - - //the function above calls map.add: - //add bindings when adding a marker: - map.bind('add',function(data){ - //mapuiAdd.apply(mapUI,[data.marker, data.index,data.isNew]); - rulerAdd.apply(ruler,[data.marker.offset, data.index,data.marker.isEditable]); - player.fire('markerAdded',data); - }); - - //2) MOVE - - //add the binding when we move a marker on the ruler: - ruler.bind('markermoved',function(data){ - var soundPos = data.soundPosition; - var isPointer = data.isPointer; - if(isPointer){ - player.setSoundPosition(soundPos); - }else{ - map.move(data.markerElement.getIndex(), soundPos); - } - }); - - //and now add a binding to the map when we move a marker: - - map.bind('move', function(data){ - var from = data.fromIndex; - var to = data.toIndex; - ruler.move.apply(ruler,[from,to,data.marker.offset]); - player.fire('markerMoved',data); - }); - - - //remove - map.bind('remove',function(data){ - ruler.remove.apply(ruler, [data.index]); - player.fire('markerRemoved',data); - }); - - //edit state changed - map.bind('markerEditStateChanged',function(data){ - ruler.setEditable.apply(ruler, [data.index, data.value]); - player.fire('markerEditStateChanged',data); - }); - - } - -}); \ No newline at end of file diff --git a/timeside/ui/js/ruler.js b/timeside/ui/js/ruler.js deleted file mode 100644 index 259d7f3..0000000 --- a/timeside/ui/js/ruler.js +++ /dev/null @@ -1,475 +0,0 @@ -/* - * Copyright (C) 2007-2011 Parisson - * Copyright (c) 2011 Riccardo Zaccarelli - * Copyright (c) 2010 Olivier Guilyardi - * - * This file is part of TimeSide. - * - * TimeSide is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * TimeSide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with TimeSide. If not, see . - * - * Authors: Riccardo Zaccarelli - * Olivier Guilyardi - */ - -/** - * Class representing the ruler (upper part) of the player. Requires jQuery - * and Raphael - */ -Timeside.classes.Ruler = Timeside.classes.TimesideArray.extend({ - //init constructor: soundDuration is IN SECONDS!!! (float) - init: function(rulerContainer, waveContainer, soundDuration){ - this._super(); - - this.getSoundDuration= function(){ - return soundDuration; - }; - - this.getWaveContainer =function(){ - return waveContainer; - }; - - this.getContainerWidth =function(){ - return waveContainer.width(); - }; - - this.getRulerContainer = function(){ - return rulerContainer; - } - }, - - resize : function(){ - var duration = this.getSoundDuration(); //in seconds - if (!duration) { - this.debug("ruler.resize: Can't draw ruler with a duration of 0"); - return; - } - - var $J = this.$J; - var rulerContainer = this.getRulerContainer(); - - //remove all elements not pointer or marker - rulerContainer.find(':not(a.ts-pointer,a.ts-marker,a.ts-pointer>*,a.ts-marker>*)').remove(); - - //calculate h with an artifice: create a span (that will be reused later) with the "standard" label - var firstSpan = $J('').css({ - 'display':'block', - 'position':'absolute' - }).html('00000'); //typical timelabel should be '00:00', with '00000' we assure a bit of extra safety space - //note also that display and position must be set as below to calculate the proper outerHeight - rulerContainer.append(firstSpan); //to calculate height, element must be in the document, append it - var verticalMargin = 1; - var h = 2*(verticalMargin+firstSpan.outerHeight()); - //h is the default height of the ruler svg (according to ruler font size) - //to accomodate the necessary space for the labels - //however, if we set a custom height on the ruler, ie h2 is nonzero: - var h2 = rulerContainer.height(); - //then, set the custom height as height for the canvas: - //note that, as markers and pointer have position: absolute, they do not affect div height - if(h2){ - h = h2; - } - var obj = this.calculateRulerElements(rulerContainer.width(),h,firstSpan.outerWidth()); - this.drawRuler(rulerContainer,h,obj.path); - - var labels = obj.labels; - if(labels && labels.length){ - for(var i=0; i ')); - span.html(labels[i][0]).css({ - 'display':'block', - 'position':'absolute', - 'width':'', - 'height':'', - 'right':'', - 'bottom':'', - 'top':'0', - 'left':labels[i][1]+'px' - }); - rulerContainer.append(span); - } - }else{ - firstSpan.html(this.makeTimeLabel(0)); - } - - var pointer = undefined; - if('getPointer' in this){ - pointer = this.getPointer(); - } - if(!pointer){ - pointer = this.add(0,-1); - this.getPointer = function(){ - return pointer; - }; - }else{ - pointer.refreshPosition(); - - } - this.each(function(i,rulermarker){ - rulermarker.refreshPosition(); - }); - - - }, - - drawRuler: function(rulerContainer,h,rulerLinesPath){ - var cssPref = this.cssPrefix; - var upperRectClass = cssPref + 'svg-' + 'ruler-upper-rect'; - var rulerLinesClass = cssPref + 'svg-' + 'ruler-lines'; - - var vml = this.$TU.vml; - if(vml){ - //we create each time a new Raphael object. This is not a big performance issue - var paper = Raphael(rulerContainer[0], rulerContainer.width(), h); - var rect = paper.rect(0,0, rulerContainer.width(), h/2); - var path = paper.path(rulerLinesPath); - var attr = vml.getVmlAttr; - rect.attr(attr(upperRectClass)); - path.attr(attr(rulerLinesClass)); - return; - } - //create svg. Note that elements must be created within a namespace (createElementNS) - //and attributes must be set via .setAttributeNS(null,name,value) - //in other words, jQuery does not work (maybe in future releases) - var $J = this.$J; - var svgNS = "http://www.w3.org/2000/svg"; - var d = document; - var svg = d.createElementNS(svgNS, "svg:svg"); - svg.setAttributeNS( null, "width", rulerContainer.width()); //TODO: optimize width is called also below - svg.setAttributeNS( null, "height", h); - rulerContainer.append($J(svg)); - - var rect = d.createElementNS(svgNS, "svg:rect"); - rect.setAttributeNS( null, "x", 0); - rect.setAttributeNS( null, "y", 0); - rect.setAttributeNS( null, "width", rulerContainer.width()); - rect.setAttributeNS( null, "height", (h/2)); - rect.setAttributeNS( null, "class", upperRectClass); - svg.appendChild(rect); - var lines = d.createElementNS(svgNS, "svg:path"); - lines.setAttributeNS( null, "d", rulerLinesPath); - lines.setAttributeNS( null, "class", rulerLinesClass); - svg.appendChild(lines); - }, - /** - * returns an object with the following properties: - * path: (string) the path of the ruler to be drawn - * labels (array) an array of arrays ['text',x,y] - */ - calculateRulerElements: function(w,h,timeLabelWidth){ - - var duration = this.getSoundDuration(); - - var fontLeftMargin = 2; //should be eual or greater to the ruler stroke width, so that - //the labels are not overlapping the vertical ruler lines - timeLabelWidth+=fontLeftMargin; - - var timeLabelDuration = timeLabelWidth*duration/w; - - //determine the ticks: - var sectionDurations = [1,2,5,10,30,60,120,300,1800,3600,7200,18000,36000]; - //sectionDurations in seconds. Note that 60=1 minute, 3600=1 hour (so the maximum sectionDuration is 36000=10hours) - var i=0; - var len = sectionDurations.length; - while(isectionDurations[i]){ - i++; - } - var sectionDuration = sectionDurations[i]; - var sectionNums = parseInt(0.5+(duration/sectionDurations[i])); //ceil - var sectionWidth = w*sectionDuration/duration; - - - var tickCounts = [10,5,2,1]; - i=0; - var tickCount = tickCounts[0]; - while(isectionWidth){ - i++; - } - var tickAtHalfSectionWidthHigher = i==0 || i==2; //draw tick at half section higher if ticks are even - tickCount = tickCounts[i]; - var tickWidth = sectionWidth/tickCount; - var makeTimeLabel = this.makeTimeLabel; - var h_1 = h-1; //TODO: use line tickness instead of 1 - var path = new Array(parseInt(0.5+(w/tickWidth))); - path[0] = ['M 0 '+h_1]; - len = path.length; - for(i=0; i < len; i+=tickCount){ - for(var j=1; j=0 && index < a.length){ - this._setEditable(a[index],value,false); - } - }, - //do not call, use setEditable(index,value) instead - _setEditable: function(pointerOrMarker, value, isPointer){ - var eventNamespace = this.eventNamespace; - var doc = this.$J(document); - var lbl = pointerOrMarker.getLabel(); - var me = this; - var mme = this.mouseEventType; - - - lbl.unbind('.'+eventNamespace); //this should delete all previous events - - lbl.bind('mouseenter.'+eventNamespace,function(evt){ - me.fire(mme,{ - eventName: 'mouseenter', - eventObj: evt, - index: isPointer ? -1 : pointerOrMarker.getIndex() - }); - return false; - }); - lbl.bind('mouseleave.'+eventNamespace,function(evt){ - me.fire(mme,{ - eventName: 'mouseleave', - eventObj: evt, - index: isPointer ? -1 : pointerOrMarker.getIndex() - }); - return false; - }); - - //to prevent page scrolling after mouseup, as click is also fired - lbl.bind('click.'+this.eventNamespace, function(evt){ - return false; - }); - - - lbl.bind('mousedown.'+eventNamespace,function(evt) { - if(evt.which===1){ - if(value){ - pointerOrMarker.isMovedByMouse = true; - } - - var launchDragStart = true; - - var startX = evt.pageX; - var startPos = lbl.position().left+lbl.width()/2; - - evt.stopPropagation(); //dont notify the ruler or other elements; - var newPos = startPos; - doc.bind('mousemove.'+eventNamespace, function(evt_){ - //preventClickFire=true; - if(value){ - var x = evt_.pageX; - newPos = startPos+(x-startX); - pointerOrMarker.move(newPos); - //update the text if pointer - if(isPointer){ - pointerOrMarker.setText(me.makeTimeLabel(me.toSoundPosition(newPos))); - } - } - if(launchDragStart){ - launchDragStart = false; - me.fire(mme,{ - eventName: 'dragstart', - eventObj: evt_, - index: isPointer ? -1 : pointerOrMarker.getIndex() - }); - } - return false; - - }); - //to avoid scrolling - ////TODO: check IE bug on mouseup on the ruler (pointer is moving too) - //TODO: what happens if the user releases the mouse OUTSIDE the browser???? check bug in IE (mouse release) - var mouseup = function(evt_){ - - doc.unbind('mousemove.'+eventNamespace); - doc.unbind('mouseup.'+eventNamespace); - evt_.stopPropagation(); - if(value){ - if(newPos !== startPos){ - - var data = { - 'markerElement':pointerOrMarker, - 'soundPosition': me.toSoundPosition.apply(me,[newPos]), - 'isPointer':isPointer - }; - me.fire('markermoved',data); - } - pointerOrMarker.isMovedByMouse = false; - } - if(evt_.pageX !== startX){ - me.fire(mme,{ - eventName: 'dragend', - eventObj: evt_, - index: isPointer ? -1 : pointerOrMarker.getIndex() - }); - }else{ - me.fire(mme,{ - eventName: 'click', - eventObj: evt_, - index: isPointer ? -1 : pointerOrMarker.getIndex() - }); - } - return false; - }; - doc.bind('mouseup.'+eventNamespace, mouseup); - } - - me.fire(mme,{ - eventName: 'mousedown', - eventObj: evt, - index: isPointer ? -1 : pointerOrMarker.getIndex() - }); - - - return false; - }); - }, - - //moves the pointer, does not notify any listener. - //soundPosition is in seconds (float) - movePointer : function(soundPosition) { - var pointer = this.getPointer(); - if (pointer && !pointer.isMovedByMouse) { - var pixelOffset = this.toPixelOffset(soundPosition); - //first set text, so the label width is set, then call move: - pointer.setText(this.makeTimeLabel(soundPosition)); - pointer.move(pixelOffset); //does NOT fire any move method - } - return soundPosition; - }, - - //soundPosition is in seconds (float) - toPixelOffset: function(soundPosition) { - var duration = this.getSoundDuration(); - if (soundPosition < 0){ - soundPosition = 0; - }else if (soundPosition > duration){ - soundPosition = duration; - } - var width = this.getContainerWidth(); - var pixelOffset = (soundPosition / duration) * width; - return pixelOffset; - }, - - //returns the soundPosition is in seconds (float) - toSoundPosition: function(pixelOffset) { - var width = this.getContainerWidth(); - - if (pixelOffset < 0){ - pixelOffset = 0; - }else if (pixelOffset > width){ - pixelOffset = width; - } - var duration = this.getSoundDuration(); - var soundPosition = (pixelOffset / width) *duration; - return soundPosition; - } -}); diff --git a/timeside/ui/js/rulermarker.js b/timeside/ui/js/rulermarker.js deleted file mode 100644 index e98730c..0000000 --- a/timeside/ui/js/rulermarker.js +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (C) 2007-2011 Parisson - * Copyright (c) 2011 Riccardo Zaccarelli - * Copyright (c) 2010 Olivier Guilyardi - * - * This file is part of TimeSide. - * - * TimeSide is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * TimeSide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with TimeSide. If not, see . - * - * Authors: Riccardo Zaccarelli - * Olivier Guilyardi - */ - -/** - * Class representing a RulerMarker in TimesideUI - * Requires jQuery Raphael and all associated player classes. rulerDiv position MUST be relative - * (if this class is called from within player, it is) - */ - -Timeside.classes.RulerMarker = Timeside.classes.TimesideClass.extend({ - - - init: function(ruler, waveImgDiv, className) { - this._super(); - var rulerDiv = ruler.getRulerContainer(); - var $J = this.$J; - - var tooltip = ''; - - var cssPref = this.cssPrefix; - - var label = $J('') - .addClass(cssPref + className) - .css({ - display: 'block', - textAlign: 'center', - position: 'absolute', - zIndex: 1000 - }).append($J('')).attr('href', '#'); - - if (tooltip){ - label.attr('title', tooltip); - } - rulerDiv.append(label); - - //rulerDiv MUST HAVE POSITON relative or absolute (it is relative, see player.resize) - if(className != "pointer"){ - label.css('bottom','0'); - }else{ - label.css('top','0'); - } - - //set the index, - var index = -1; - this.setIndex = function(idx, optionalUpdateLabelWidth){ - index = idx; - this.setText(idx+1, optionalUpdateLabelWidth ? true : false); - }; - this.getIndex = function(){ - return index; - }; - - //end======================================================= - //creating public methods: - this.getLabel = function(){ - return label; - }; - - - this.getRulerWidth = function(){ - return rulerDiv.width(); - }; - this.getWaveHeight = function(){ - return waveImgDiv.height(); - }; - - this.positionInPixels = 0; - this.positionAsViewerRatio = 0; - - var arrowBaselineWidth = 9; - - var canvas = undefined; - var canvasClass = cssPref + 'svg-'+className+'-line'; - var vml = this.$TU.vml; //if vml, this class is populated with methods and NOT undefined - var round = Math.round; - if(!vml){ - canvas = this.createCanvasSvg(waveImgDiv, arrowBaselineWidth); - var path = canvas.childNodes[0]; //note that $J(canvas).find('path') does not work in FF at least 3.5 - path.setAttributeNS(null,'class',canvasClass); - this.moveCanvas = function(pixelOffset){ - pixelOffset = round(pixelOffset); - canvas.setAttributeNS( null, "transform", "translate("+pixelOffset+",0)"); - }; - this.jQueryCanvas = $J(canvas); - }else{ - canvas = this.createCanvasVml(waveImgDiv, arrowBaselineWidth); - this.jQueryCanvas = $J(canvas.node); - var attributes = vml.getVmlAttr(canvasClass); - canvas.attr(attributes); //Raphael method - this.moveCanvas = function(pixelOffset){ - pixelOffset = round(pixelOffset); - //for some reason, coordinates inside the VML object are stored by raphael with a zoom of 10: - this.jQueryCanvas.css('left',(10*pixelOffset)+'px'); - }; - //apparently, when resizing the markers loose their attributes. Therefore: - var r = this.refreshPosition; //reference to current refreshPosition - this.refreshPosition = function(){ - r.apply(this); - canvas.attr(attributes); - } - } - }, - - //sets the text of the marker, if the text changes the marker width and optionalUpdateLabelPosition=true, - //re-arranges the marker position to be center-aligned with its vertical line (the one lying on the wav image) - setText: function(text, optionalUpdateLabelPosition) { - var label = this.getLabel(); - if (label) { - var oldWidth = label.width(); - label.find('span').html(text); - var labelWidth = label.width(); - if(oldWidth != labelWidth && optionalUpdateLabelPosition){ - this.refreshLabelPosition(); - } - } - return this; - }, - - //these methods are executed only if marker is movable (see Ruler.js) - move : function(pixelOffset) { - var width = this.getRulerWidth(); - if (this.positionInPixels != pixelOffset) { - if (pixelOffset < 0) { - pixelOffset = 0; - } else if (pixelOffset >= width) { - pixelOffset = width - 1; - } - //defined in the init method (it depends on wehter the current browser supports SVG or not) - this.moveCanvas(pixelOffset); - - this.positionInPixels = pixelOffset; - this.refreshLabelPosition(width); - //store relative position (see refreshPosition below) - this.positionAsViewerRatio = pixelOffset == width-1 ? 1 : pixelOffset/width; - } - return this; - }, - - refreshLabelPosition : function(optionalContainerWidth){ - if(!(optionalContainerWidth)){ - optionalContainerWidth = this.getRulerWidth(); - } - var label = this.getLabel(); - var width = optionalContainerWidth; - var pixelOffset = this.positionInPixels; - var labelWidth = label.outerWidth(); //consider margins and padding - var labelPixelOffset = pixelOffset - labelWidth / 2; - if (labelPixelOffset < 0){ - labelPixelOffset = 0; - }else if (labelPixelOffset + labelWidth > width){ - labelPixelOffset = width - labelWidth; - } - label.css({ - left: this.mRound(labelPixelOffset) + 'px' - }); - - }, - - //function called on ruler.resize. Instead of recreating all markers, simply redraw them - refreshPosition : function(){ - var width = this.getRulerWidth(); - //store relativePosition: - var rp = this.positionAsViewerRatio; - this.move(this.mRound(this.positionAsViewerRatio*width)); - //reset relative position, which does not have to change - //but in move might have been rounded: - this.positionAsViewerRatio = rp; - }, - - - remove : function() { - var label = this.getLabel(); - label.remove(); - this.jQueryCanvas.remove(); //defined in the constructor - return this; - }, - - - createCanvasSvg: function(container, arrowBaseWidth){ - //create svg. Note that elements must be created within a namespace (createElementNS) - //and attributes must be set via .setAttributeNS(null,name,value) - //in other words, jQuery does not work (maybe in future releases) - var $J = this.$J; - var svgNS = "http://www.w3.org/2000/svg"; - var d = document; - var svg = undefined; - if(container.children().length>0){ - svg = container.children().get(0); - }else{ - svg = d.createElementNS(svgNS, "svg:svg"); - container.append($J(svg)); - } - var group = d.createElementNS(svgNS, "svg:g"); - group.setAttributeNS( null, "transform", "translate(0,0)"); - - var path = d.createElementNS(svgNS, "svg:path"); - path.setAttributeNS( null, "d", this.createCanvasPath(0,arrowBaseWidth)); - - group.appendChild(path); - svg.appendChild(group); - - return group; //return the group, not the path, as it is the group that will be translated when moving - }, - - createCanvasVml: function(container, arrowBaseWidth){ - var vml = this.$TU.vml; - var paper = vml.Raphael(container.get(0),container.width(),container.height()); - var shape = paper.path(this.createCanvasPath(0, arrowBaseWidth)); - return shape; - }, - - //w must be odd. Cause the central line must be centered. Example: - // - // xxxxx - // xxx - // x - // x - // x - // - createCanvasPath: function(x,w){ - var halfW = w >>> 1; - //in order to calculate the line height, we could simply set the wave height. However, due to potential - //resizing afterwards, the line could not stretch till the bottom (if it overflows it's fine, as the wave div container has - //overflow = hidden). As we do not want to rebuild the canvas on resize, - //we assess an height which will 99% overflow the wave height in any case. - //We use the wave height and the window height, and take 2 times - //the maximum of those heights: - var wdwH = this.$J(window).height(); - var waveH = this.getWaveHeight(); - var h = 2* (wdwH > waveH ? wdwH : waveH); - return 'M '+(x-halfW)+' 0 L '+(x)+' '+(halfW)+' L '+x+' '+h+ - ' L '+ (x+1)+' '+h+' L '+(x+1)+ ' '+(halfW)+' L '+(x+halfW+1)+' 0 z'; - }, - - //used for faster lookup - mRound: Math.round - -}); diff --git a/timeside/ui/js/timeside.js b/timeside/ui/js/timeside.js deleted file mode 100644 index ed0cb99..0000000 --- a/timeside/ui/js/timeside.js +++ /dev/null @@ -1,791 +0,0 @@ -/* - * Copyright (C) 2007-2011 Parisson - * Copyright (c) 2011 Riccardo Zaccarelli - * Copyright (c) 2010 Olivier Guilyardi - * - * This file is part of TimeSide. - * - * TimeSide is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * TimeSide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with TimeSide. If not, see . - * - * Authors: Riccardo Zaccarelli - * Olivier Guilyardi - */ - -/** - * Root javascript file for TimesideUI, to be manually included in your web page (see online doc) - */ - -/** - *global variable housing all Timeside variables/mathods/classes: - */ -var Timeside = { - Class:undefined, - classes:{}, - player:undefined, - config: { - - /** - *set to true to see debug messages on the console (only error or warning messages shown) - */ - debug: false, - /* - * timeside scripts to be loaded when Timeside.load is called. URL paths are relative to the timeside folder, which - * will be determined according to the src attribute of the timeside.js script path (to be included in the of the page) - */ - timesideScripts: ['rulermarker.js','markermap.js', 'player.js', 'ruler.js'], - //vml config variables. Used only if svg is NOT supported - vml : { - /* - * raphael script to be loaded when Timeside.load is called and svg is not supported. It will be prepended to the - * timesideScripts array defined above in config. URL paths are relative to the timeside folder, which - * will be determined according to the src attribute of the timeside.js script path (to be included in the of the page) - */ - raphaelScript : 'libs/raphael-min.js', - /* - * available attributes which can be converted from css-svg to Raphael attributes (see Raphael.js): - */ - raphaelAttributes : ["clip-rect", "cursor",'fill', "fill-opacity",'opacity', 'stroke', "stroke-dasharray", "stroke-linecap", "stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width", "text-anchor"] - } - }, - utils:{ - /** - * Returns an uniqid by creating the current local time in millisecond + a random number. - * Used for markers in markermap. The method is kind of public in order to be more accessible for other functions - * by calling Timeside.utils.uniqid(), in case it is needed - */ - uniqid : function() { - var d = new Date(); - return new String(d.getTime() + '' + Math.floor(Math.random() * 1000000)).substr(0, 18); - }, - /** - * vml object which will be populated by vml functions to interface timeside and raphael. See timeside.load. - * We could implement functions here for code readability, however, - * we delegate Timeside.load so that if svg is supported memory is free from unused vml methods. - * IN ANY CASE, svg support can be detected anywhere by calling, eg: - * var svg = !Timeside.utils.vml; - */ - vml: undefined, - - /** - * property that will be set to true if soundManager fails to initialize flash - */ - flashFailed : false - } -}; - - -/* Simple JavaScript Inheritance - * By John Resig http://ejohn.org/ - * MIT Licensed. - * (Inspired by base2 and Prototype) - */ - -/* - * In few words: the lightest and most-comprehensive way to implement inhertance and OOP in javascript. Usages can be found below. - * Basically, - * 1) a new Class is instantiated with Class.extend(). This function takes a dictionary - * of properties/methods which will be put IN THE PROTOTYPE of the class, so that each instance will share the same properties/methods - * and the latter don't have to be created for each instance separately. - * 2) If var A = Class.extend({...}) and var B = A.extend({..}), then methods which are found in B will override the same methods in A. - * In this case, the variable this._super inside the overridden methods will refers to the super-method and can thus be called safely. - * Consequently, if a _super property/method is implemented in the extend dictionary, it WILL NOT be accessible - * to the overriding methods of B. Basically, don't use _super as a key of the argument of extend. - * 3) AFTER the prototype has been populated, the init function, if exists, is called. The latter can be seen as a class constructor in java, - * with a substantial difference: when executing the init() method the class prototype has already been populated with all inherited methods. - * Private variable can be declared in the init function, as well as - * relative getters and setters, if needed. Downside is that the privileged getters and setters can’t be put in the prototype, - * i.e. they are created for each instance separately, and the _super keyword does not apply to them. Another issue is the overhead of closures in general (basically, write as less as possible - * in the init function, in particular if the class has to be declared several times) - * Of course, the this._super keyword of methods implemented in the init constructor does not work - * - * EXAMPLE: - * var MyClass = Class.extend({ - * init: function(optionalArray){ //constructor - * this._super(); //!!!ERROR: Class is the base class and does not have a super construcor - * var me = []; //private variable - * this.count = 6; //set the value of the public property defined below - * this.getMe = function(){ //public method - * this._super(); //!!!ERROR: methods defined in the init function don't have acces to _super - * } - * this.alert = function(){ //another public method, !!!WARNING: this will be put in the MyClass scope (NOT in the prototype) - * alert('ok'); - * } - * }, - * count:0, //public property - * alert: function(){ //public method. !!!WARNING: this method will be put in the prototype BEFORE the init is called, - * alert('no'); // so the alert defined above will be actually called - * } - * }); - * var MyClass2 = MyClass.extend({ - * init: function(){ - * this._super(); //call the super constructor - * } - * alert: function(){ //override a method - * this._super(); //call the super method, ie alerts 'no'. WARNING: However, as long as there is an alert written - * //in the init method of the superclass (see above), THAT method will be called - * } - * }); - * - */ - - -(function(parent){ - - var initializing = false, fnTest = /xyz/.test(function(){ - xyz; - }) ? /\b_super\b/ : /.*/; - - /*The xyz test above determines whether the browser can inspect the textual body of a function. - *If it can, you can perform an optimization by only wrapping an overridden method if it - *actually calls this._super() somewhere in its body. - *Since it requires an additional closure and function call overhead to support _super, - *it’s nice to skip that step if it isn’t needed. - */ - - //ADDED BY ME: - // before was: this.Class = function(){}, where this here is the DomWindow - // In order to chose where to attach the Class object, we added the argument parent (see above): - //if parent is undefined, attach Class to the DomWindow (same as before): - if(!parent){ - parent= window; - } - parent.Class = function(){}; - - //from here on, the code is untouched: - // - //We have the base Class implementation (does nothing) - //and we write here below the method extend which returns the Class with inhertance implemented: - // Create a new Class that inherits from this class - parent.Class.extend = function(prop) { - var _super = this.prototype; - - // Instantiate a base class (but only create the instance, - // don't run the init constructor) - initializing = true; - var prototype = new this(); - initializing = false; - - // Copy the properties over onto the new prototype - for (var name in prop) { - // Check if we're overwriting an existing function - prototype[name] = typeof prop[name] == "function" && - typeof _super[name] == "function" && fnTest.test(prop[name]) ? - (function(name, fn){ - return function() { - var tmp = this._super; - - // Add a new ._super() method that is the same method - // but on the super-class - this._super = _super[name]; - - // The method only need to be bound temporarily, so we - // remove it when we're done executing - var ret = fn.apply(this, arguments); - this._super = tmp; - - return ret; - }; - })(name, prop[name]) : - prop[name]; - } - - // The dummy class constructor - function Class() { - // All construction is actually done in the init method - if ( !initializing && this.init ){ - this.init.apply(this, arguments); - } - } - - // Populate our constructed prototype object - Class.prototype = prototype; - - // Enforce the constructor to be what we expect - Class.constructor = Class; - - // And make this class extendable - Class.extend = arguments.callee; - - return Class; - }; -})(Timeside); - - - -//Defining the base TimeClass class. Timeside.classes.[Player, Ruler, MarkerMap...] are typical implementations (see js files) -//Basically we store here static methods which must be accessible in several timside sub-classes -Timeside.classes.TimesideClass = Timeside.Class.extend({ - //init constructor. Define the 'bind' and 'fire' (TODO: rename as 'trigger'?) methods - //we do it in the init function so that we can set a private variable storing all - //listeners. This means we have to re-write all methods - init: function(){ - //the map for listeners. Must be declared in the init as it's private and NOT shared by all instances - //(ie, every instance has its own copy) - this.listenersMap={}; - }, - - cssPrefix : 'ts-', //actually almost uneuseful, still here for backward compatibility with old code (TODO: remove?) - $J : jQuery, //reference to jQuery for faster lookup inside methods - $TU : Timeside.utils, //reference to Timeside variable for faster lookup inside methods - debugging : false, - debug : Timeside.config.debug ? function(message) { - var C = console; - if (C && C.log) { - C.log(message); - } - } : function(message){}, - - /** - * 3 methods defining listeners, events fire and bind (aloing the lines of jQuery.bind, unbind and trigger. - * the only difference is that 'trigger' is 'fire' here). namespaces are allowed as in jQuery - */ - bind : function(eventType, callback, optionalThisArgInCallback){ - if(!callback || typeof callback !== 'function'){ - this.debug('TimesideClass.bind: cannot bind '+eventType+' to callback: the latter is null or not a function'); - return; - } - if(!eventType){ - this.debug('TimesideClass.bind: eventType is empty in bind'); - return; - } - var listenersMap = this.listenersMap; - if(optionalThisArgInCallback){ - var cb = callback; - callback = function(data){ - cb.apply(optionalThisArgInCallback,[data]); - }; - } - - if(listenersMap.hasOwnProperty(eventType)){ - listenersMap[eventType].push(callback); - }else{ - listenersMap[eventType] = [callback]; - } - - var idx = eventType.indexOf('.'); - if(idx <= 0 || idx >= eventType.length-1){ - return; - } - - eventType = eventType.substring(0,idx); - - - if(listenersMap.hasOwnProperty(eventType)){ - listenersMap[eventType].push(callback); - }else{ - listenersMap[eventType] = [callback]; - } - - }, - unbind : function(){ - var listenersMap = this.listenersMap; - var key,keyPlusDot; - if(arguments.length>0){ - key = arguments[0]; - if(listenersMap.hasOwnProperty(key)){ - var callbacks = listenersMap[key]; - var idx = key.indexOf('.'); - if(idx>0 && idx < key.length-1){ - //key is "eventtype.namespace", delete also functions stored in "eventType", if any - var baseKey = key.substring(0,idx); - var baseCallbacks = listenersMap[baseKey]; - if(baseCallbacks){ - for( var i = baseCallbacks.length; i>-1; i--){ - var bc = baseCallbacks[i]; - for( var j = callbacks.length; j>-1; j--){ - if(bc === callbacks[j]){ - baseCallbacks.splice(i,1); - } - } - } - } - }else if(idx<0){ - //key is "eventtype", delete also all functions stored in "eventType.namespace", if any - keyPlusDot = key+'.'; - for(var k in listenersMap){ - if(listenersMap.hasOwnProperty(k) && k.indexOf(keyPlusDot)==0 && k.length > keyPlusDot.length){ - delete listenersMap[k]; - } - } - } - delete listenersMap[key]; - } - }else{ - for(key in listenersMap){ - if(listenersMap.hasOwnProperty(key)){ - delete listenersMap[key]; - } - } - } - }, - fire : function(key, dataArgument){ - var listenersMap = this.listenersMap; - if(!(listenersMap.hasOwnProperty(key))){ - return; - } - if(arguments.length < 2 || !dataArgument){ - dataArgument = {}; - } - var callbacks = listenersMap[key]; - var len = callbacks && callbacks.length ? callbacks.length : 0; - for(var i=0; i0){ - ret[i] = separator+ret[i]; - } - } - return ret.join(""); - } -}); - -/** - * An Array-like implementation that suits the need of Marker mnanagement - * Ruler, MarkerMap and MarkerMapDiv implement this class - */ -Timeside.classes.TimesideArray = Timeside.classes.TimesideClass.extend({ - init: function(optionalArray){ - this._super(); - //here methods that CANNOT be overridden - var me= optionalArray ? optionalArray : []; - //note that this method written here OVERRIDES the same method written outside init in the children!!!! - this.toArray = function(returnACopy){ - if(returnACopy){ - var ret = []; - for(var i=0; i= l){ - return; - } - startInclusive = arg[0]=== undefined ? 0 : arg[0]; - endExclusive = l; - break; - default: - startInclusive = arg[0]=== undefined ? 0 : arg[0]; - endExclusive = arg[1]=== undefined ? l : arg[1]; - } - callback = arg[len-1]; - if(!(callback instanceof Function)){ - this.debug('TimesideClass.each: callback NOT a function!!!'); - return; - } - var me =this.toArray(); - for(var i = startInclusive; i=len)||(to<0 || to>=len)){ - return -1; - } - var elm = me.splice(from,1)[0]; - me.splice(to,0,elm); - - return to; - } -}); - - - -/** - *Main Timeside method to load player (see Timeside online doc) - */ - -Timeside.load =function(config){ - - var $J = jQuery; - var win = window; - var doc = document; - //function to be called onready or onerror: - var loadAll = function() { - - - //get the current script path (this file name is timeside.js?... or simplt timeside.js) - var scripts = $J('script'); - var thisScriptPath = ''; - scripts.each(function(i,s){ - var src = $J(s).attr('src'); - if(src){ - var srcName = src.split(/\//); - if(srcName.length){ - srcName = srcName[srcName.length-1]; - //is this script ? consider the case here we are loading timeside.js?.... - if(srcName.replace(/\.js(?:\?[^\?]*)*$/,'.js') == 'timeside.js'){ - src[src.length-1] = ''; - thisScriptPath = src.replace(/\/[^\/]+$/, ''); - } - } - } - }); - - var ts = Timeside; - var ts_scripts = ts.config.timesideScripts; - //detect SVG support and load Raphael in case. Copied from Raphael code v 1.5.2: - var svg = (win.SVGAngle || doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1")); - if(!svg){ - //add the raphael path. Raphael will be loaded in Timeside.load (see below) - ts_scripts.splice(0,0,ts.config.vml.raphaelScript); - //populate the vml object with methods to be used in ruler and rulermarker: - - //global private variable: - //map to store each class name to the relative dictionary for raphael attr function (VML only) - var classToRaphaelAttr = {}; - //get the raphael attributes for which a conversion css -> raphael_attribute is possible: - var availableAttrs = ts.config.vml.raphaelAttributes; - //here below we store Raphael paper objects. var paper = Raphael(htmlElement) is the raphel method to build - //a new paper object. Internally, the method builds a div embedding vmls inside htmlElement, retriavable via the - //paper.node property. - //However, calling again var paper = Raphael(htmlElement) does not use the already created paper, - //but creates a new paper with a new paper.node (div). Too bad. The possibility to wrap existing paper node - //into a Raphael paper would be a nice and almost necessary feature, which however is not even - //planned to be implemented according to raphael developers (see raphael forums). - //In case of markers lines, we want to draw a new marker - //on the same raphael paper. Therefore, we store here raphael papers in a map htmlElement -> paper - var raphael_papers = {}; - ts.utils.vml = { - getVmlAttr: function(className){ - - if(classToRaphaelAttr.hasOwnProperty(className)){ - //if(className in classToRaphaelAttr){ - return classToRaphaelAttr[className]; - } - var d = document; - var dottedclassName = className.replace(/^\.*/,'.'); //add a dot if not present - var ssheets = d.styleSheets; - var len = ssheets.length-1; - - var attr = {}; - for(var i=0; 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 Y0s65!AK6`1y8r+H07*qoM6N<$g8j;GuK)l5 diff --git a/timeside/ui/skins/classic/img/player_controlbg.png b/timeside/ui/skins/classic/img/player_controlbg.png deleted file mode 100644 index c2b7f47d7fc7f247a44eb94597c8ba1ca551be30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{I!3HE3#9loE5-1LGcVbv~PUa<$!O>_%)r1c48n{Iv*t(u1=&kHeO=ja@JI-9@_APMoCOq;EOCt}an8@p zP0cG|a4t$sEJ;mKD9X$@I{1#lw)#RX~#% NJYD@<);T3K0RSm7M2G+Y diff --git a/timeside/ui/skins/classic/img/rewind.png b/timeside/ui/skins/classic/img/rewind.png deleted file mode 100644 index ec45b3852a6ef7409015ce54eb4bb689af4af9be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 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 diff --git a/timeside/ui/skins/classic/img/wait.gif b/timeside/ui/skins/classic/img/wait.gif deleted file mode 100644 index 5b33f7e54f4e55b6b8774d86d96895db9af044b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1849 zcma*odr(tX9tZI2z31lM+(&YVk%mZ}5P~KlG2s=WSbGzm0!x7^P##Mnh7t-jP!X0Q zk_SQ}Po-L1tlDK;6l?(>v)e5ZBQx4|Y-Q?nr@Px3?9h(3ZWr3^tj=`TP57gKr87N$ zp2wWee1GRRCwo_xahnw)5cxNPJbCg2L6DV|6`#+yw6v6!mDS$f9-JvFD^n;GQ&UrZ zzh5jCkByB101O60U0q#p_1BM>Cv-vP?&s4@g_((4_1L=L$(a91)0=J91Gas#R{McE znYG^9*0A5YZ>#;~+Wkn(W5B0^yELIYLP!K}mB~<)AM@1&nqekynuaEGqPrzoH|KodRXJy)%+w_fu3nE5>@Bd_b zqC$EQ;{c`T&?EsNO|igL9gC7Ygxv?aQUEXMq?~>wg{EyW;VcJ37CUF#HjrT=KQO_* zS>M9yydXk18D(+QDJ1>r);Lav_uYKp$T?4vr{Q$lTo&pKv^?(>L-)G2*lwH!Ah7k? z7oH<8h-(KTKt5V6$8gF)C7Io&P5=SjTh)=zV=E2EUhQZP##L8S{d%UK>>+y82>+FV+#^BzW7u3F)Bb>=lYQ%%j`F>ASe zo*cw@V#u6T`A2He;70mR(V&iV&-7{qP~=SRf&jm9-T{*ZeZ}$rd0#6c&fLG^xJcf5 z+p<`wJYgW+_s*V{uI$nMB;%8`S_3>PfGOj3Rq}@Cx^+j?rk92fANSFDBYnOqQ>Vdj z)(|$AhP4t&Lb=Gvo2#3Gl%9<=Gv`Mz?Po@P4iLF!x}GUWJICDlFk-hS^Whyh7x~VH z@0vD1>HYD4&e+~yzS*-sFR{9`{QEEZO1zg7>R&7cHts-6j!xHVdA8eI+ZlVzd%`es zJT@$#GX(gvCJ1oJN%yLBK}{V=V;seo;!w|Yte!W1%5qLNFWqvZW>h&IiH+oPT=b@E zPhGzv5=(Un*X>v`>%8h_nj^NdYcE6NHS_ifkCV$*D)Tqrbu`s;<=t<4 zAHNqNV?6(g<1PY-w@#I-WYFViz?9TrkMr)u0g`O`u|>T;k|2sV*YF^punvT;$SuTy{j3Gv)yqD!R_CF>yR)MzmmYS5v+~R zXAdD%ng9?df;wd8GxR#%3O+gz};Vo;)sK%Bj-q>Oq%R7JU-KD?vYu>#2UjaDo z&8$>5xW~?KPD_#XFToU1hIb*VOMidUr6iYiO0N|i-7s`T8!cFT`rN!^1Pt78J93i6 z5HI1wIM$94m{3SLDvISDe6$ZG1;eq_D9RTaaC>=cO{@Bs>$IlPCPJJ$h$)-3vzNUQ6OsN#_zWxey!_9%hxwH2_dEJi=yY|1c7nDm2_Lm!Cof8-R_+9UkS zcBE(o47yE)oMR(Q=dp1a2wTX5KvvGyLqlWTa7V&!A*|w|)ax~1_~aJ0=_Lilg*0iQk7#ZD EAHN$8j{pDw diff --git a/timeside/ui/skins/classic/style.css b/timeside/ui/skins/classic/style.css deleted file mode 100644 index 068b72a..0000000 --- a/timeside/ui/skins/classic/style.css +++ /dev/null @@ -1,152 +0,0 @@ -/* -* Style for the timeside player. The player div is supposed to be of class .ts-player. Change if needed -* For details, see http://code.google.com/p/timeside/wiki/UiGuide?ts=1308677096&updated=UiGuide#CSS_and_skins -*/ - -.ts-player { - padding: 0; - border: solid 1px #ADADAD; - margin-top: 2px; -} - - -.ts-player .ts-ruler{ - color: #ADADAD; - background-color: #F2F2F2; - font-size: 10px; - line-height: 13px; -} -/*svg style, MUST BE A SINGLE SELECTOR. FOR INSTANCE, THIS DOES NOT WORK WHEN SVG IS NOT SUPPORTED: - ".ts-player .ts-ruler .ts-svg-ruler-upper-rect" */ -.ts-svg-ruler-upper-rect{ - fill: #FFFFFF; - stroke-width:0; - stroke: #FFFFFF; /*to be sure...*/ -} -/*svg style, MUST BE A SINGLE SELECTOR. FOR INSTANCE, THIS DOES NOT WORK WHEN SVG IS NOT SUPPORTED: - ".ts-player .ts-ruler .ts-svg-ruler-lines"*/ -.ts-svg-ruler-lines{ - stroke-width:1; - stroke: #ADADAD; -} - -/*wave:*/ -.ts-player .ts-wave { - height: 130px; -} - -/*.ts-player .ts-viewer .ts-marker {*/ -.ts-player .ts-ruler .ts-marker { - padding: 0 0.5em; - background: #fff; - border: 1px solid #92bdd4; - color: #92bdd4; - text-decoration: none; -} -/*svg style, MUST BE A SINGLE SELECTOR. FOR INSTANCE, THIS DOES NOT WORK WHEN SVG IS NOT SUPPORTED: - ".ts-player .ts-wave .ts-image-canvas .ts-svg-marker-line" */ -.ts-svg-marker-line { - fill: #92bdd4; - stroke-width:0; -} - -/*.ts-player .ts-viewer a.ts-pointer {*/ -.ts-player .ts-ruler a.ts-pointer { - color: white ; - background-color: #92bde4; - padding: 0 0.5em; - /*border: solid 1px #92bde4;*/ - - text-decoration: none; - -moz-border-radius: .3em; - -webkit-border-radius: .3em; - border-radius: .3em; - /*color: #3c4251; #6A0307 !important;*/ -} -/*svg style, MUST BE A SINGLE SELECTOR. FOR INSTANCE, THIS DOES NOT WORK WHEN SVG IS NOT SUPPORTED: - ".ts-player .ts-wave .ts-image-canvas .ts-svg-pointer-line" */ -.ts-svg-pointer-line { - fill: #92bde4; - stroke-width:0; -} - -.ts-player .ts-wave .ts-image { - background: #090e0d ; -} - -.ts-player .ts-control { - background: url('img/player_controlbg.png'); -} - - /** display (inline-block) and overflow of a is set inside javascript*/ -.ts-player .ts-control .ts-button { - background-repeat: no-repeat; - margin:4px; - height:21px; - width:21px; - /* background-position: 0px 0px;*/ -} -.ts-player .ts-control .ts-button:hover { - background-position: 0px -21px; -} -.ts-player .ts-control .ts-play { - background-image: url('img/play.png'); -} - -.ts-player .ts-control .ts-pause { - background-image: url('img/pause.png'); -} - -.ts-player .ts-control .ts-rewind { - background-image: url('img/rewind.png'); -} - -.ts-player .ts-control .ts-forward { - background-image: url('img/forward.png'); -} - -.ts-player .ts-control .ts-set-marker { - background-image: url('img/setmarker.png'); -} - -.ts-player .ts-control .ts-volume-speaker-on { - background-image: url('img/volumeon.png'); - width:24px; -} -.ts-player .ts-control .ts-volume-speaker-off { - background-image: url('img/volumeoff.png'); - width:24px; -} -.ts-player .ts-control .ts-volume-bar-container { - /*background: url('img/controlbg-inverted.png'); - background-position: -3px left; - background-repeat: repeat-x;*/ - border: 1px solid #a3a4a7; - height:10px; - width:42px; - margin-top:9px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - -} -.ts-player .ts-control .ts-volume-bar { /*width will be changed inside the code*/ - background-color: #ccc; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; -} -/*position is set to absolute inside javascript*/ -.ts-player .ts-control .ts-wait { - background-repeat: no-repeat; - background-image: url('img/wait.gif'); - text-align: right; - right:0; - height:28px; - line-height:28px; - top:0; - background-position: right center; - padding-right: 30px; - font-size: 80%; - color: #000; -} diff --git a/timeside/ui/skins/lab/img/controlbg-inverted.png b/timeside/ui/skins/lab/img/controlbg-inverted.png deleted file mode 100644 index 338a3e1099a8905165287c0bec27572a829704d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{I!3HE3#9loE5-1LGcVbv~PUa<$!zopr0BvG3umAu6 diff --git a/timeside/ui/skins/lab/img/controlbg.png b/timeside/ui/skins/lab/img/controlbg.png deleted file mode 100755 index edaf9fc9a90964d3dbbff9f90318c6206892d7a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{I!3HE3#9loE5-1LGcVbv~PUa<$!O>_%)r1c48n{Iv*t(u1=&kHeO=jaGx721v%1}C{tgt<@pN$v;kdrE zXCp6z0Z;RqnwkIqH|T{mx3fue9u#9<)oUQ|BL0AA_f> KpUXO@geCy4f-}|t diff --git a/timeside/ui/skins/lab/img/empty.png b/timeside/ui/skins/lab/img/empty.png deleted file mode 100644 index 120bea9c19c5c266c9999de51aeb3d1da9981824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^azHG@!3HGDe(| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sfZDtt(bL%S^cDI2-1)eUBAs)xy zPCLkZK!JyOz0mtN$Cs@+%2a4SMX)Di66+dkcdvQ(b{qJ)7#v&Rc`ZhX>45wn-{57Y z0W&=oEu9%L`-ZHJZqoKwtW}A})kEZ8T5Nw6-SIta`m3P7+E=e`4FB5c{@_iiR?_|R fseJQ_nLaSJ+n?C)^Z)B{pxq3fu6{1-oD!MPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipZ7 z4GjS83TbdRlf>IQ!ui>VM zid~2ct+;U^Nn>i<`G-;jbthG~T3t0EmkKuJp5vlPu#-EJ8gv#83>VIvIp6utcV^~} zl}aTgz%a(pXf%jbgWzF|0SE`!8?lN60a6iEl~@8X)IP&dfT~@Fj*^zk=UG{K;0!P| zb&|!a*ACdyG-ZBn)(Pm<@YLxuG+Qld)k@}ir_;esHc1j(@rG(B3ez*Qh$ywyO2)b( znq^bJhOUyTDp3@1c6x?ZtI4aEFETT>_xR#@HSA?N9>>hhpCd^U-oJb6Wg{Ly=_VM7 z2${1RP*lko!=;7G9G{qU`s{-#u6R9$Za~okGjEQuaAlE+$rDbWVSs=eP(=r3K9{F_ z;UXeJnr8dB3CQ6zw1t1VTJ3NC6Acg1G=m$~YE_;;tN*6o;2s~K_gL8WHyi6bdU&6` zy-t7K_Q|r@T^bL|2w-#b1NZJOv%C9qAi!Tdhx^~}-?mu3b%W;iww1BtrWqAbMftI_ z!_B4ZY<>NbeK%T&y)GR|!&HPjx0m?*>7%0pGSW@s1gt!H%*Og_=kpXr+0Nd?00KWh)5{$0HQL70(Y)*K0-AbW|YuPgg)R(W0_(;$tNVL(%?JY5_^JdWQD zv-UgeATsB{(#DKh{_Xob1yt-LPcb^g9GJAaKy9~I(4K{!I`8khrEzcjeEG%Mb9>HL zT{hvJ_%LJb#Zp<3nXUX$*$gM#E9|?JB0DsgCIw9LRCI6M$#HV_p@yaM^W!zT4t2=( zzyD!3_t^XGe;Ie*?QXPu6W`o&QHt+y!zP{H8()i#iqu=qPmH&iq95t3sQBgRj3X}D z5}Urf+gW>BGw#UIC7)P1b4`d3J7WKQd*Sx$;BK`oDty6iUL5NPr< zx*TNxZ2PpLwx!%z7K<|<$a61mi#Q$>?YpCGQ{U2kmLPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipZ7 z4HF?z=}c+>00G8HL_t(Y$K{s0OB`Vo#echwtoRtjNiPEOBuaQDcZ~A%a-=NTJvz8-k+vm@3mPTYNW#tORj)zggF5yl|@d z=DVD8&)hSfKp-HvP^M`TjYcsOAO_Xp<4|_5D~me zDKcSfY@Ei%CUnlGLXwzQlp+(#D=G*E2WfBbz{tx(=bZeAGYWBBMQ&-2zQiQ{U{oJ`!DM^XS$|?rl2YJ)ei_hoF=u$0)qS6~H-^k}x+iOZo z%lP#1!_!InfBlaAV&m&7sqS-Vn)J_iwzmj>`HXG07XSbN07*qoM6N<$f@WR%!2kdN diff --git a/timeside/ui/skins/lab/img/rewind.png b/timeside/ui/skins/lab/img/rewind.png deleted file mode 100755 index 40585462ce6803ad4ab347d7ae07d867ab362abc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 623 zcmV-#0+9WQP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipZ7 z4HXno058t~00HkwL_t(Y$K94sYZFlv#eef>rO7MU`XL%uW(p#Ly3}H-3tNn0L{N%? z-@{Fjw%CQZsFjMi5EX-Qt--ILZZ*pai7sp)_qu2^W+v}V646;Wa5rxb_sqHHT;6!q zYE{YMF~-nnGze95;lmgMkRM_H2~{K)A{9YZ2_+|m8Y|3;P<3CSW2D;%t3w zm1gt3vuUk%jjgRmPC@`*MX*(;(?LWM)$Mk1;m=hTICFO1`F^B_qKc^PY#3izxWMAl zB}Bp1FZR$i(*DfTNlW8To;uCN#U*^-M^zcs&q-)gBdLbvXpYNQt`dY{jCJ;lN9qJv z2nQ4%El1p3zD2>91n$ojiXvhsEJt%J-@Zf97%L_#rEU*J(NwcuZ;!Bc{RYKCap?Ux zBlXkKk89tF+ziVEktPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipZ7 z4Hg9uom~C^00J6GL_t(Y$Gw&@Xd*!rhQBOgCDuj)7B*r)K{S=UqzhI?3kfJ#Y8tT+ zTfxf4#)T!NO+vszY+_?)B`TyaAhKv{Wg+ZbbGzJ`^>j720|N`gypR9?->~oM@$pe$ z!*aXb^m;uULfFE??REp$2h^8CXqqh`p=k&qaA-Cu6ox_*;LXhqPN(zi;$L51-+@B> zR%l{rsZ_$}^PLS$CX=SXqZ!WUb4wt<-*4n~R))=Hlf`0jGVuNV9RRbMMuujV>hgsU zXlHcsp_&IX{PW`e`P0)A0E(hm0&0e(7J+(B$L?8DxNqt8^)()k2LPAL1wc3)24KBj zvs$fA0v^n8Utv5RCzs3pbyly}0gz>xPN(y;mJS93K0iMJ$mjC_wA*a}R;$%Fz{QrT zs*0+r0HjhW07j#cD)j zqK6L<3WW%TLfqco(r7f;Znwr+xm@Pq;o5Sw>NmqqzzpxQa%jNB_WHua{b_MkEq3E=!Wca=D~htumcXkLDT-2I+RY zNV>QG+N!EjC=_V5TI_Z^BuV1+^_5H}!(=kylo}^Ji+xLES!OsK;_-O+`1r6kV(3j{ zb!wZobj2g%=M|=PJAeXzL)n*=zv#1t!An=*5*tYXATM07*qoM6N<$f*JBE AtpET3 diff --git a/timeside/ui/skins/lab/img/volume.png b/timeside/ui/skins/lab/img/volume.png deleted file mode 100644 index d741e5549e61624d3edb91debc8d7370246eb3fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1860 zcmaJ?`8V5%7LRV$RPCykPCJoAd|OpZE#p;ci;za_qAC(8C5GCI8U)2Nrs0KFQA;ph z84`lpOUJHdiioAcj5X9)YHOMJ1KvCL-21u9`J8jl{rqrKuoz3Qn35O>1OlV1%y0rU z7I?YHIYDd|PlpOXC>Upn1XT?wFAIuuUT8}*(D8}AYAMSUbVLKKT!TR%ahVer0=;;t zC};|Yplr>BCr_(@&#PHig1!idT_`hChY0T4B;H2WSy6c7_-6!`(FEZL@3g!V_n1ts z0CL#y7d|QS8gr0$7H^$kC^fEdu9LMW<<7s|OfO*P04~#1V+l{J6hio@xjj6bWu!{U z*u0MU4!pQc$O-z9HNfXV_0p&fa&;nT|dI2Zt1}W?M&G= zn=)xvO$Jnr6@_@7u0BzYNWX~b$wZh7OMW*g*>2YyEPvgN%IK%_#s+hjR#!VY97UEN z2d%k2vO1MNF-`YJNFvJ+pv|Moe`dz z8nie>`8Yb(zPjVJIP|Eb%(j~oJAd$z5R}?|uXC_+ZR4=ukG4;f8{n$#T|)4((^PAW zcxauj6&igfGSa{!r_Dt&s`B`Xg{9?l37c)W%KV^IQNUk?ch#w$dq-L;s}G+&%l|nw zRjj$eGewoX_0jI-zhd*3Z4pmArBxc(3&8^~Z=8<1eOZ&g3(a^{U!R?E&(O)!8s=j) zYnh=McOm|Pw)O>)GrzC`e^vd`B(t`(yi7PE!jG~_@0M-XbqG!E5k*{GT{(4r3JZT- z`=c}8U?wSl#siBnNghS_rz|UlVSmEDYHO3cKR*8U^KLPdsjbOhCRXn8rVJdSH@@>~ zJx5H|W5^Xl-QVn8RcbwueorPBRaA&=DFEZ0`71uA;o#Kcd!H9Kd5FL zIfK7FW->S35sOf7YU7HVx*s)Cj9+2#b-p`ew7s#hu}Xx$wLiOi$N)s|kI+j16ds3W zLDm9N3f>bgvCWpc^m2VG}F1kz~7g=y-qr=K{M&DA;!*ZsG)Ocwf`T_kF4y!sfpEVE#>o0{%?GMDRkzRlZ#l_0qV4 zRxIyXW@f_rdH^xi7}Kx9kSWzAPmvr2$Q#>s@n zE)ndB8Pl?7hiqWcSuPUi-EA=f1pEI8R=I=U^?Tk@T_LJx|T-erS zO0VDw(lP&c8HVh5T?9}x>hJ5h+7CiOohVi3!eo3C&Mi8aZS!a&Zy0En1HeiVlC&?z=VwhJmfLy(t&uBEB=@RDO%ik&i3=G~HpAB=o>cL_h Z3+YC8JT>)a#tB{=2xX2jt3rCl{{tB>h%o>F diff --git a/timeside/ui/skins/lab/img/volumeoff.png b/timeside/ui/skins/lab/img/volumeoff.png deleted file mode 100644 index dc8cc21e70b09247546f1fb9f63884fc3085941e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 882 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 QFvS1;Z9lyEkN7qI3+epKtpET3 diff --git a/timeside/ui/skins/lab/img/wait3.gif b/timeside/ui/skins/lab/img/wait3.gif deleted file mode 100644 index bb2f003719d1fd4690a138d760fc6b37902d19ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2239 zcmciDeNfVQ9tUtz^WnNVTi3Hy8%f%_r2;)mL$g)HhbTj*XbpxC+qiOE-@_!%S^(~mF zFHWJ5@lgSAfBQ`!5XkpuFH}J$o|>7lql7@s-ht1-)AGpp3^;+5MF#o4b8z_`$Q85? z1abf&K!4o0a7!cTjzPr2#K7Z-&!icI=FiUXPz%>7`|fvppNz09{(JB9!IrH*sOI>0 zQ%@Ach7iVLR?z?0)G?JvZDf!Jru-WA_#7I``ZNTVe3{OLt)+-#bjE8;zkmI6y#io+ zePrv+y#MXZgd5x5eCmFCuJuU;X6@0N4waM4dw!LTC!a4^_AkmiaT3ZG2q9pxq)IBY z4d8zeuo~{}yX))n#aTyA`21e4l;P);u0tWY=v~WbUX*U!^eEA}l=slG@;c>cW7^KX z?e78RA7_4Iy1sNO{hZ_E>P#;yPb?~CIoq?j0ZhjVm{{T`t*!~-lq)K0=%vt>RxJdq z(;M22wrQ#l(jxIs5ln8K|N1Zv78AO|k)2BE+wN8rbFmg(6|8Y=+Z()`FvM9nHK1lI zzf0?Wdbo`^^`;TF+|Q%z^So`DUCu8EaA3F=v-}9bWtE$G0wJEBUI<6YYU<@V97=;y z6t6~Tgslf9jlr_&a|U*zJoGTM=SnXG+&^$_@VafU?gQT6f6T+rt^s$cM_jsEI-_oS z7F}yZE_sLGqS8s*#Bf!dAwgu`LmYSU-}}_Zc-ilhV?P`P0$XP5T*BDH+hTbR~BP zB;AU7=+N+AA>c1>-M(|zw%lr4z7*~rO`LXe8(U?7eMRSD=H4;;r``x3x^Sa1Wy)!o zlK=X7uxE4%Hpk85^PJwvOCOan6%3;FOK-+b%c+&CyI7Nz#m8x<&y06q0?prH=ghP72ql&b}{H@4`0#n!O8D)4r-UPUqRCyfyv&`5M%ty zzzYftKTMzJ?IBM}xa5#LepY@u|KoczM)31JveZX^e?ST-L6sgjPb?7dPDF^)S;DMp zDF@)o>yJd%#BwSdG%D%wW~NptGiY>Wrdq4s+!)u|eaXJ7u#-GsfpP3E=l9;!50%iM zqhsR`@J58M9@-A^7aJj>7rdMT#y5tM?DKe4JtWu~wZs{r1tmWa#=@2CZ^?pHm@zcB z#!I~wxMMExwh|2ATIZ&3G~Rjj@(eaHZ0fB~6MU9KFUHaL7qSwVa1IbFh~r?enFjzF zudyX_FeItubUAm+RBojQJh9RBL`HTJcuk4v<@>zaib!KA80W&H<_UYO3ybeeA`Do7K*^$C-iK z^f|p2>)f$@EBDUjdHf{4^0ya=pg3$8_Y@fe94KcXxiK6Pk3uCNB_ecf0AI$mqe)B3 znq>CMX0fUzNt<=CO^<1>GNozE*7~N(9&@&`@oJr}&%$IuH|78W9@%Kcgl)dY2LHEB zD8~uhk=CAt8NO9Zez)Zhik_WryVK8}x0~N`R1WFG;))@$iS%dl!Q|NXZg`VXzl@TUL( diff --git a/timeside/ui/skins/lab/style.css b/timeside/ui/skins/lab/style.css deleted file mode 100755 index 712aec2..0000000 --- a/timeside/ui/skins/lab/style.css +++ /dev/null @@ -1,145 +0,0 @@ -/* -* Style for the timeside player. The player div is supposed to be of class .ts-player. Change if needed -* For details, see http://code.google.com/p/timeside/wiki/UiGuide?ts=1308677096&updated=UiGuide#CSS_and_skins -*/ - -.ts-player { - padding: 0; - border: solid 1px #ADADAD; - margin-top: 2px; -} - - -.ts-player .ts-ruler{ - color: white; - background-color: #2E2E2E; - font-size: 10px; - line-height: 13px; -} -/*svg style, MUST BE A SINGLE SELECTOR. FOR INSTANCE, THIS DOES NOT WORK WHEN SVG IS NOT SUPPORTED: - ".ts-player .ts-ruler .ts-svg-ruler-upper-rect" */ -.ts-svg-ruler-upper-rect{ - fill: #595959; - stroke-width:0; - stroke: #595959; /*to be sure...*/ -} -/*svg style, MUST BE A SINGLE SELECTOR. FOR INSTANCE, THIS DOES NOT WORK WHEN SVG IS NOT SUPPORTED: - ".ts-player .ts-ruler .ts-svg-ruler-lines"*/ -.ts-svg-ruler-lines{ - stroke-width:1; - stroke: #ADADAD; -} - -/*wave:*/ -.ts-player .ts-wave { - height: 130px; -} - -/*.ts-player .ts-viewer .ts-marker {*/ -.ts-player .ts-ruler .ts-marker { - padding: 0 0.5em; - background: #e65911; - color: #FFF; - text-decoration: none; -} -/*svg style, MUST BE A SINGLE SELECTOR. FOR INSTANCE, THIS DOES NOT WORK WHEN SVG IS NOT SUPPORTED: - ".ts-player .ts-wave .ts-image-canvas .ts-svg-marker-line" */ -.ts-svg-marker-line { - fill: #e65911; - stroke-width:0; -} - -/*.ts-player .ts-viewer a.ts-pointer {*/ -.ts-player .ts-ruler a.ts-pointer { - color: #BB0000; - background-color: white; - padding: 0 0.5em; - border: solid 1px #BB0000; - - text-decoration: none; - -moz-border-radius: .3em; - -webkit-border-radius: .3em; - border-radius: .3em; - /*color: #3c4251; #6A0307 !important;*/ -} -/*svg style, MUST BE A SINGLE SELECTOR. FOR INSTANCE, THIS DOES NOT WORK WHEN SVG IS NOT SUPPORTED: - ".ts-player .ts-wave .ts-image-canvas .ts-svg-pointer-line" */ -.ts-svg-pointer-line { - fill: #BB0000; - stroke-width:0; -} - -.ts-player .ts-wave .ts-image { - background: #090e0d ; -} - -.ts-player .ts-control { - background: url('img/controlbg.png'); -} - - /** display (inline-block) and overflow of a is set inside javascript*/ -.ts-player .ts-control .ts-button { - background-repeat: no-repeat; - height:28px; - width:28px; -} -.ts-player .ts-control .ts-play { - background-image: url('img/play.png'); -} - -.ts-player .ts-control .ts-pause { - background-image: url('img/pause.png'); -} - -.ts-player .ts-control .ts-rewind { - background-image: url('img/rewind.png'); -} - -.ts-player .ts-control .ts-forward { - background-image: url('img/forward.png'); -} - -.ts-player .ts-control .ts-set-marker { - background-image: url('img/setmarker.png'); -} - -.ts-player .ts-control .ts-volume-speaker-on { - background-image: url('img/volumeon.png'); - width:24px; -} -.ts-player .ts-control .ts-volume-speaker-off { - background-image: url('img/volumeoff.png'); - width:24px; -} -.ts-player .ts-control .ts-volume-bar-container { - background: url('img/controlbg-inverted.png'); - background-position: -3px left; - background-repeat: repeat-x; - height:10px; - width:42px; - margin-top:9px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - -} -.ts-player .ts-control .ts-volume-bar { /*width will be changed inside the code*/ - background-color: #e4eaf1; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; -} -/*position is set to absolute inside javascript*/ -.ts-player .ts-control .ts-wait { - background-repeat: no-repeat; - background-image: url('img/wait3.gif'); - text-align: right; - right:0; - height:28px; - line-height:28px; - top:0; - background-position: right center; - padding-right: 60px; - font-size: 80%; - color:white; -} \ No newline at end of file diff --git a/timeside/ui/swf/soundmanager2.swf b/timeside/ui/swf/soundmanager2.swf deleted file mode 100755 index 6f9c0560193b5670ee0c2af7c28cf9cad13ef496..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2867 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 diff --git a/timeside/ui/swf/soundmanager2_flash9.swf b/timeside/ui/swf/soundmanager2_flash9.swf deleted file mode 100755 index bf986d6a01c31ef7c67863841b13a643373d67b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8606 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 diff --git a/timeside/ui/swf/soundmanager2_flash9_debug.swf b/timeside/ui/swf/soundmanager2_flash9_debug.swf deleted file mode 100755 index c84da7477904d557311637d1b047521b90ae2e29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16524 zcmV($K;yqdS5pcpcK`r*0j+&`d{b5W{ypd3f5~8AlyQx$e9Cp7)%a+;qY3 z{PF9DbI*IW_iXQZ&ysTAag`2xXU zaX8Ty@90W)#G+ne7zoC?lLwZUTU z?+hdt1iHE+9c=+(S9$XOiS}6ANoxW<;r)$BAkjX*(vC=Jk{!uNctK+*77Tm+k?_gh zIo?J)y@)NNP~?zZ&;?o53{dKdwpeFnS3DN#ZbO+2uo8*0lMsup?qH-N(H@R3=#HKg zjjf4_Shg?4X^V#g$=Ki+X+H{&1fr|E1FORemK-ipXWXKUfh6kF75CQ6_IYcns;gx& z$aj7vwQg2xTR!N(1YDncC&mt2+jH=dHT6A97d164X--xtslxT~ zbN=@0^FG{f`kRHH{r0(!Pg?BxK%K8F;(PY&InJ#@D4Z}Fdwu~d{GD^os?#eWBm?fI zSa&pZSRjfr$7@zKHqBNZ9zEd@MM0o4Jj|n1D7;2dZd8kg2hOitnFz-dl}&B2WU>-< zIVlP$#^Uh z3CHycQMg2&3^*cqVz@2olz#5T9c?70f%w`y;Uhy6Ii2A|0*#e$H=~e#A=Yl0TM`~F z`ZOiiM#5tQkw|RKs*^*p&Ok?Wl{Ji_t98pKrzzaljbg3Mlc^JH6UlIAu1K|5q;dD4 zHBp3Bfy7wv{@%8DERon>vh#+cfnX#Y(&DjL(jAEfLgD!Gs1b8_1>%9uFd8l466B#B ziKHVG4tB2|JFMZ*>ZLWcQ?1crj}!<&WldGp+{$2gMkee)!OoR1$qJ<5$fuR!=idKVbdE!p^oTk@9-#X5T{_E?W9CSMTKJ($w@BN z*z(m^bw|n1u?j`(a^f3^C!MRh0^Nyl-YN{lBV&mU8U(s<1fp)Te-VpxcZPFicqD?1 z^H*V@Q6WWR<*!;DMoV?Z;%lJ~@>U7;7#59#h#1H5*jnKdSu}PhV@G0)I+n!au{eXK z4^0^LKTRjzvPklP{mWJ-5Ad#Nn(2+kl6H%^g_aOP zWeqU zsE1HTXc0{zVYY^~I~wC1frw^6Ahblsy0Bvn397SQ$f(dH{*G`YFkvenhZ^2H)Q>NJ)ZKR8L#VZu%GNG@2XJ9nSKu}Hy?_@smNgJZEs z7~&PAZb4gjcIAb#26f@_<*U|^1{Vb>Z*|EIp4s5lNWe!ZwjF!i$a6_)m9`kYklT^) zcf=D(8WFjPKr|GLo!q>(D_n$rYLd>wq`uFK#E@5W9HTiLa>gOv$?$&jgYgCPg9|J{ zOe=J+#mH+(>{3YHG?P#BdBZ1nLFt4;-f5D-G;b{KotDjcS_Sc>@hm2vh&N%)65g(G zyt5-g^FhKJ4TDEA=EcGY`VOioB$73S!`}G;Z+kp!95^j&5!4yL+|d~hbp*spDAC>3 z6^kb;L$NjtWTQ^ATR@BRxcmPZ`osUSJFB!vWL6vC6S zN(1eki8R%c56L%ME2Sl5%JA|~;h_bk&dY5JbYt2Qd{}742%`yOdH8~}fY z39~i#C`_$wCmo6z;mCMwHI`zD(kdr39~ve%xHcJ1P*6DJ7IbqAdfFKYM^`7?b3)y5 zAw~T7a!+|{#i})!Q^Pd1p#9xYA<16^BHiJHL!=xtESnh^$_}A%oiR~H9z0a-h$eZk znMW7viNnIl_E=~HB|D5$q42SbZ!Hal@aGBEi`oNG2&uL3?Kn9c9}|en=_#>18fa@n zwL37Exge&ZNC~HbIXE10Vd9R8;hTq`!^26;WZ^(3k7E7UZ5ZMBp`tCcBxJ}b=Fm`1 zmooCIwa$ccoFBspAhTICR>Ly=J)`P2z0a}!2;cVd*FsPq-2#w(gI{TG5!3-)5P zQzK>`v{MMxCR&JLVaMudEFQMq5R2>t(}uWb%=FHn%^flHhQMW}SG4I-#KDEgO9V9u zo3pO&WVne`W4ybQk}WyPN>G$$KxrD|@xa>L@UJs;p=?g#EmUnWQQq!oW?|Iebw;~8 zgWSFTpbDOGnCxf9!MM>UXv#+>g8~Vb+8lj5SQ9W^qPy>L{PaxvqKsnKzY=z6z5P> zIzR0=nxw`p8<+yDwieza=#D`{ZSrv45{puqMBe#>;*Q%}Ts;lKUBL=G&BuPK@HRE{{~F;VkO{};nemH zn*I}7A{;)6R*`m8e@h@9g?Ki2Nz_1ijqa%2OGmKX#iE7$ta&Ho4Rwc!otzva9i1I= zJyNl6hRxm^y?A(Y?Vnvqk`_C4Ix@N|-6eZjn5HY^3dNQmA(}JKvPDDcVkdzVp5P*ySdWZB)2#JlF42Q>!CMp$i`@}5NP^Buyv2}Z zEDEumr$&h&vDbw|6>LgZ#v|6`mSK~V79^(}YPF(VROz;ioCYwPt&Y+tsU$^9a_9}y zX4)(Ddpwb|{D@Ucjz0Q`qg|Ap5UeqRk+u8~rJxd)R9L+frd5eI6vieWJGESBO6;Y@ zu4aUhBv`quon~p(9E*aQUjsQA+&?s4M<{B-(H4m%!m}zeX&bzUWBr}23PcRAoRS;7 zW8~P+Owyv;5|n3RLhOC0Q}Zk2 z=9!v1cG8f2kl5kK@O+%|#L?dJ#9}0Y%i17g#fEiXdV`GB7tXIRJ1rUHO*zU6c>@tN zduXj!RyX7o>&{GxsqA)54%&AZm!U1t;2lBD4@#8-X^(X^Mj|@tL)Z?n(iy4WDMF4s zQ@{~j^f0Ikscn!HyXgk6%LmcIKxy!L>_IBRy!*;@RMYgRwe_f1uE$20MP#ZRd4hq~ z!x9!doaxd%GBe2G-r0$|Y0)DCQ75UmKy;*TmLXac=OP%Y*73*)ds0$N^6VsE>L_t` zQd*T0gkqp$l!7SfU7X`#*60aD3c94Xb+T0~Y?4pQ-{;Nqb|#=NWb`7Oj^PX@D}vUI zuo33vtlXVV^3*X&i+OowGm->gp3NNS6#k;7qP{LrLFd<1b86;{UA1a;Y*jJ_F`=1{ z#>^_(JZiMvJK%pi5*~h7g0o2#)2miJyQV&W1`Q`ULDbKL*Su;C=abcJ7OdKNa;gIr&Hy5GxRdeyFtJY>$RoCD% zryigBIU16}SyMGfn_FEyTdS*{H&?5hQ(L9g)yn!33q4mOsT@Df)^ZpoOE z366bpO2@GYY{K*jWfRIL%$P89!mN_Il7mW)DY=uW`HZVME_ZHTenFw9h^gmrool-4 z&{e0d>bmCE9eKK%ud9W+>e00#T`kttQMz-qu9oQPSX~{b>*IBGqOMNT)qQkzimrNf zb?QW>tNZDyPgnQX)e2p$)YU3ot=84qx>~Cj&((|P>1u*|5}s0F&ZP*)e} z>SA48qN{#gU8<|gbalC|uF%y(boEeOJxo^**VQ9*^+;VkN>`88)h5?UrjKsX)nj$_ zI9)wn=fBi>tIki*)v&G_y1H6d+jX@=cb=#_Ptw(hu6F8bR99oV+NG<%*44P~O6qF2 zuJ-8a$-4R*UHz@D{$5v4MFmcWITL0h(_MdneId*rna(%BoCR|k+_QA`YUb)^%(VsP z8knsxYnkghSl2VeYSKsF2p$NU-QF8JRKa}CTrFn@u$7v?^g z`(Yk{>4(_@vlZq+n1^7lW3Imd*+^%L2BTvt!yuG2Z<_`E6n5YTjyGb?<3sx2sqzMoFC)5>q&$@2lG64Jp@1g66l@W z^%~;5NhNs~ZcXQJgYi2c|IKy%1K1xT=}KKaM@5xkE`nh$hMHZY>W-~2*TQU5rzi@? zuZ%FtD$ca#HNC&$T64?qde^SwEzK?K*#_ozpVG@%OUvb~Zv#`bE1ANy$Q`V&NzuMx zNE7^)_1?tb_dV-vg0+ED5GQWu^S-rQTlqA*kRwWysx@z8EnDEZ8Ewt96yv>3y4Kv> z(gOdMdl9e=t#&_)T}82k-hg@_Pq!QVEvjS&O&av3b@VWu*htR*v&~5B>1i#8rrqo7`ZNXW8UNn>^blH`(O5HhI2H z{=p_Mu*nN;@?x9ZY?GJRdBhHvI3dE-%Sm8pY1){<|@c05Ast)2S5Lylhg*jXcl?O3woVg1X zx5D%v*h0mTm&bCx2SF)a$H30bW$y9Pox9!&$omY$N<_^cyHE+jF36Lt3YRWamci{Q zSg7PHtmt@|u=oUNkDA)3sBHASMqD5m)7q#wSc%%GIN8`ajf&33oyHrL95((w)~LAH zgwx@2vx#rOmCGhQ3@eXKehyXv+h;w(3fYvZM#aOtvl^9RHr3atjAGN~HY%gpzIBbt z7*@J}qf)}AS2QYPSy^QxZnczGH!9=VjG9Je0-HIzQJKVM)ix@V*?zdBun!t?F~*W_ z|0xP%IW9F-wG`eQdS>FMs=1N1GK2ZKGSfVpwW?))mCZEIWr)HZs=M$y2jU!_s%n|_ zO4V+bqZ}S)-d;ziN|v)zGv}vLhVCoqZ_hCgO8r7k7_M4is14WBln}hbChp#fBPtNCCJgn z7^9?pta(hz80(v6j4NfMaZ|%QHdWR>-uz|C7++iqXKR?XI#)OqQK}Qd48IvpC{;?8 z)``YMW0Lqz_V1(3G*`7wp-}%6zi&=Ivh4Ryh2Ls0nzmw^(mSn_neA}w z>#NU-vtnP?yKg5qJHUjO2TIKoK`>)FIsIiwf6@u%&S<0vs&K}`h zo-(S0bB%DWNEy|_d9rXGk}_(9bFFY5nlfe!=Q`nZrVLd$PZ7?;QpOzN{EcuPo-%5M z^S8ozM9P>eoWB!JbZDJ${$4nbN*VKnvzK}HRg_fK_NwEQSvzM{?T7X}m9_vXB_OMpppeQD|=G^e7f4ww5+9H}m1sjBjwGj`2r z({{68DHkzwGfNqH+eO!10&;w@#+2PGz%FIGS&(0WZ<~50GcRT3Jv+@mB1VBP6j)?l zMpS8DV6k}xsENjso?=u(P~9F)QKmn_ySsOpSBgM?CeSYfP1fDrrkPhEbg6gr5vc#w ztPK47S*mr}ie*asQgaK1wJtZ78!G~bnAec2R0$kvZndbx%xj4%3mk54v%HQluajO! znl})Eiun@$qgdc*^G4||@Hat3Zz9Kzz!LLjB7$1LZ{ETNigQtnTNy^&QZYFGL`p#8 zn#+9v8t%_%xZP~6@@F*2I!519_+8Ar3mkH{8{>Lc?lSLYJ9>&;U~&)JG2s6NGP;*o zI2@|WeGphYBv_oHJcPtp;XK65zasT9n~O2mmoGCPVI)7KPWo8C?=-f(-#g$x79;j= ztZW%>XQ`UI@ITatPk>L$teq&%8H_yvG4S>tM;d8+Cm3VN^aL}XBpHHA@twttaqBT$ zpF&Q@ZzjEiTF#`w>N}g=JlNwL@+h8&3OvoAT#h%NflO{9G2{KdbD2~R&y$;#jc!D= z7Z83P6GHnUWq90*;}j~2`BJ7T=d*s2UH>l?|FIb5DWteSr0@`f0XPRKpjI^64tQQ9 zxxSp?bFtvV1(R10VKehn++ECb6pgU~8e_ZU82dYou}fI?ATwWOt*yRGZ9hu;8f!hl zIAL>f4hr%*JK=<~_7luES^2WbIjZ>j%=)}s7M;mt}wQIAt}tc2Z@ z(GTyUAIyKDFjvUJyvI`I?Z=q^rcTdsptqi<-ufWZTURmm0h-C%8|>s^R;o~+;j4+S z0|DzhomMY4DIYNNKlCpw+S_QOMCM1*$&F9~t^D7#E1bYg^l{o{Bxdy#p;Drkjn(AB zc$`_PBodtt^Aki%89BadWrG^+{l0CiA32-5MPsA4P>2YM7D2%x4k3Xi5=GRWS;d%m zh^ndwB@H189tOGaH9Fy-r0V^Jf%Z>?@Q{b8wT|hb;#FHar3X_ z*P=h1Cn+qVbSgZkL=`orbSYX)`L*JRDRITwthn5mw%;0ymj70?Jk8sGV#>EDmA7|g zrz_0LJI9E|E(x<4onr+#PJG9U?*#FkXnuzjXf$Z;?=6a(KUkD%{%BE}`IALC%sqnY zMqBoZ4({&M%~L^9kLQ?uflju{sDmz7iowh=rrnem$61TE!lDzCl3l-i~iTq{}*ykqgydI zi}c32;ybuv{!uzk*(_pQ#ywLI<0^Oxwx<}sA_2Z@6L+M0wMFBbmV&}ARTC&C?emNc2f|>*8Sf=bG7CJ)T))G`n*8Q*eq;VwQGc|9RGmIc-`^C?dA z7^3G=65;_vO$1%ym}x#Of^8M#GS0ws_lQtOF5~wo0?9}z>+`6vls=*IpW#wdWUr;3 z<3qM;x&jQHn4lqE8UB;QLm&WPKX}1u}SJEya zmOJ6H#Ik3&Snf*4-N1wvcopu5yQlb76y!A-<~Gh^gS50}zD}`(NNr@LOms?qwsiK~ z-Xm81Zz5jn*~~bbN-G7oXRH4l#=1Mln*WgOEpJ2^d(9RS`nM(XO{{o63h@rHpi$*E z&K2VZ;|arOE2*(}?XdF(hv}ZtNc%5@mnszVJ&V%CV)jGfqP+eKDtkl;!Tgv!sdf}b z!|4-vh~e}pg$x-^pJm0S;q-Yr@|P4KyD2lAzRHSB!|CgEqk!vpP+XKtbpJstfIGWxk$(e=O|n0a10`h_4ci;OWZ0U=Udz_P|K zDMGR2Lw%$|Undm$q>Pgy7o=SmGT-yGB&5maGRo6K!PZ!U2!D-z-4*2TGA?4pXQOsk zlB-Z;VW|k0ak0!Y~ zHbg-?jWMqSVJ-O9ca~sJW!@}PUn&cB3%UN+g54&P`u|7;yWK7rPZ#VC$vR!IKT*M6 zPG{dQ)}?nLiYVCKAO;ugewq5RjNo3*MomWj9+3WGP`HfCSm1JIJ}BAbn-9ytD>8|$ zl!+c0l;{c;z)tN^nW(^goC3!T>VN8t;)9Ue69}_(aMskni&lcU=93xG_Whl5Ea?|Y z_$iTDS>R%3KCk*-Wxm&}9fYl3pMglcG$QNQCF>Ld!7-n<8L+9MrONbP?!St0-8aUm;(o?-^$9BuZb&`#cUb?k?5a2R9a#5iBVqqENnnF!S#eYl81B zX1+?)#B}`E5Z`~SbEf$QdAkhkh2=b(n;wem;X@snm-gsK^~AI=O8QVjZHq|V&u;4} zUWj7+1D?bC_+8l%Z)N%ziDYWg$#07ylm)J4=6ixPgpMd4lg^orC#3e;BKC_bk<*vE zzM#LX*Eeh_ytVMI!up2$Jx_XG@YFXmAl*(*q)d;iQLVQlc}1YiT1FXYddYq9%22Za?kv^iv47+6Nd zR4Fn0S~b5?Q~vu%S$(Z;r;XxH^BZ-*xF34634QaeI#3pP0GpWXEC#H7-+&PsFv0_d zK?@g%?#uyWHAE4I4nGZxP97Ol0@=*qE1(4#N=Ggu0&hWb{y>}1Y)gnC5{8(iES$7FLtQhyjnCVX+CQu#Zi-<;<0Fm zeh~zxXz(Z5!hGvs^iD`8e*!;$G}9r$N~KW6(3yb(+=T*&0e2V9KAYHGnt8XD^8JAi z7*FAFi;jfuCBgP+PIu834GHcSC2rG@>SC_mj|@@PFdLv!@94z%TdUj;R+~8^>k`iI z*USfo)Il>Jq=IVVly53d`GgB=-=5+k)Z)>!lSGG>!jDOhb;VJHJ|P{a5Ch{G7QjsN zB#JC{)0%M#y!w5YNdYvUMqFY-8z}4*h!o3sxsB@X#s>Nsn;rK*%TVEGHK{s0KB%GR zWiT~xAu@jQWOt|Lsiff-)aZDx%^}bCc9Fo+*+Ik-*Ys(+5Lbu!s#PcRbuC4a{LfKM z-_Sh!q@TmHt z`U-4K3f=Qe;n4ptV1TzMFJgSJREju$+MNiYQ!b?6lP+?!zQ~Lh*>?X+RJ4m7kh)@z z+g*5%6QS=*smp=XUCZ_NkuMFD9H~~_Lu8P&AnDeigLG@qNhgRwy;CRId>=x&jWe>Y z~@#`{8^!_bYN8Kv)iY2R`B1UU)MNq+(*lm7B$x*RL4vqo> z?dIocwRP>{wO@k00cq`!7WNM0dB3z?k=90O?UELLloKTp*vK20J8*j4pII7&{X#GG=Th=<^16n6s zm+`f_LHJ(p@L+pB_!o{FsB!MMdORI*-R8d(F(LDqfD zNfvI+k@YysAqyAc$lA)>WUb4k?>#J!tVei0S-0~7vQ8;{-C@4&XkD4wJ`mJ`j-WHB z2Xlh%U~Vukm>(<%7Oq%X(7UqDW4=N4#&5Wr#V^2b!sU{`hrcBPf}X%Q^KC~8_Gip| z#}V`hwev2B?SV6x`A-l7r2qaUf-nl-69kUJ{|#bCVpjV1w?IEL--lPQFz|P5kU{yb zXXb~FQpL9wzx9#*S7v@h_T$X_uOsNnngHp*;bRKIBJdNkv8US&d!-)eW9Fx{h8TmN zh>Px4(bAu1^wtxceGcie^w#GN^Gmog{oK29h~D~&Br&76zJZH=P=d^%QRoLH&2s?u zUgo#dNQkK#bjZO*(;b%Y(tg-^d`=4OdxwYCfW#!C%6&WuuMprd_wCtZ{vK_~qQ(Bwd!$Iaj*UO6NRh z=10hkYWo9mdzufPbX3}Qnipj_<8p_2iEv5nb*a;XpG1YGPHQjP6<&cTVy9zXiCZRO zbK`|TU6pp6IBuqSwR0)%w!X#wjd688zm?yG@$?`575{PQxWbtO&NOi5fHRE}x|(nm z?H0E_6b#dW( z=Z^GDb%S$k3v%O1PcxkJoCw~>tv z>K#r9D+)sfGr3!WBTKvzdz;p}M? z-_i?DJI!a|%5G_HK1bEd=zY;ulN;-n(<{To|G!m6R$|0kC~9Gox)X4*JwO+zwK2SN@7TJD0M*^5^&fx`t;@j^jBFBx=zcyU`moW_Lr}U*&AK(=@G7DTm#smTSQO zEv=M4r{Odqo%l;D@s~*a24`P7&94U~{w9<7J4*Z=C7#G|>#+zq_vx9VqtkQ*Owu%W z-t(kOeh?C}3*~x?^B>S6=`p&Sz0H*$kl8z&{opizl&#VJJ$60F=?CT&2h{XaK+5tz{$(v8di7MRQ1s${Tl){V6sJ>q>w4QnYnyPo@TBW)G@#7&!byrr zw{pNLm9`mY=qcZOqRq_>G6`Mf+=xo?A8`hR+pa%hJnX?G*~tv|cE+KK=jgb%vq^95 zKC9HgaPlth2dsHY}&% z6rW?1$>Oj53>sqPXwHX6Z^CkUI6hVu_K89`S-5J4AGsgkL*9&KM_c^AJ&ziSn3cr> z@1(3p5}C}GrIwsXL;@gUSK370>TmU3zPv1S;7XVaLVV5IrJD0V0J^09|l2JWWDyDDavfg zP|d0=32X2YeoY$S1FzhDUVm7S zp&Dpyu~2x(lgzAq3Bs+e=KqFp8v-jPanmXUDoTT>?$4sFjT^ZM0f~YD`8XOVCIK3>>(|?odap7~M=xJCmlz%5 zEjDmbtZotb4#NS{fH;#caTlz30um~XCRQZco7kq2RWk5lRw^1T-SKeoqRfkLuN**A z9TD_Q#5<(!vbq8S!k`!XQ;UZAWb+bl#zRx54&joOn-$|1dyiq22XG3BqqkVDg|u6;{D3 zn!4KvD2GC2{nJ1))Yf>L@29qzG;-QS^q7BdfqsFtGi&c-Fq&2wmQV>)NS4UL4jTfi zku_W@Z6GH%jV|jo><}?6tr~;T`R@pbsq65L!ieONMw#&?N5!Z?e53QDH+xRiv}> zI>p2inrfj2h&TQ8%3WX`$S~kO0L;yL?w^J{nqVcEYC#|YLX%!VQ&NqHS!tITIo=rr z5GdLCfKDP%le`Cd0Z9~|DNs%d2)uS}M!z|Pq8fte;)1@C6Yt)2cBLrSNa!^C?Oo~t zVA_K!He~qcX23d1tBOTBdW#;8V}KGsOmTt+;2=;!WRs z2_YV702H0D5CFXJGaNHm2m)Qf`?G9;yHFsilWF@Q2x!?NJh+pl?VWKfdT`6)STsC7 z7NxaJlK{r@5}qKi_11JG+r4O3$O_PvfLtfnQd7qc(RXPanX;eD$7Y{}|MfF%GcxE* zUI5_CZ32wO0s;D&Ohd88Ozc9N6e8=f>mZda%?sH|oDgc@23RsC#^r#wjC6$TC79sR z;2jAl9D5VY$OYnMlUjuA_q!bjP?;=x`t=%j{vz*8D{)jrScJ3g25w(8qTn!i>wfF!hq`JDc z9-n%AYHDjGY#9Jbsu2P(4y}3)QFCe$yS56>+FJV5!#TGG0ds5VLy3Vcf)7wis^?LP zc|aPeo;Po{R$X6>?CNW)hoSMocV6vKNIu}90G_0#3TP!j8mY&pj=)d|?xY6XfGSc4 z2owsKTL))dHK@8d@T;4Lc=HG}1r^2zMXUj$2tFtsU{PjkwS=5fUtd)Pgp;be*@Z(E z6^`oa>YBMWsvq2Q=hQjGRObNbNlm>2?J#eijWGpxT~%#1O01*07VThT=s2q90%68N z-hrbA46EnPuA7&W*4+-Eq14vpWovMF0VD-q)D_=(b%106LJFW)YO3n0$BZa?2%9|{ z5G^(Jb8CkJr~DrXC{^|KYF+(Y58g!cl9H0~B^4!$9V^H3oL`i*2ndv8CLB9qftts- zQ%{4QFahOJtaBimjM4d6T^pzK2|Ays^GQ0Ntn+eRouTuYI-jNU{dDfr0mHy^bnem} z`|G??=T$nd)_IN2XX|{9&TDl(SLby)pQrOYo#*SkQ0E?<*Xz7U=ks-bpw1WQ{2<-2 zQ0I+0KUjAz()kjd`*prl=PPu6sLl`5`QbW00_Y*GW~Ms?u!$;wP53I;uYeU1(0NdI zhjhML=j}T0aMd!`NzAn$b48ge$@H9~bp9Ki_pyo0m5=zqF(KTNoL(4Um*fD`L_HUN z=fRv01AG&H0Wdx;gk9#Eg6~x@{V-c#06N0A!Cc35=k>5}U^*jE69Ag<0zhZL0+tEC z1B`txFLOf_WR}9hiT@5FiL3Gz7TE zG@V}o@+z2qn5{5`zCp+vgt~DH%xy4)%E1T$!}%AEA5FMYpa2dDutNYHnoZUr8}jq; z=eGWsnwQ7bv`cf?!T4MwygS2*5_l(YW~c63)r&RceCERkZ$&0STF9TF2lW1W!e1{ zuk5b`r?Kp$M_6wMTh{rwu=aZcma+_YCzNHlGl6ovM;@q620mQ=9zUCcm)BFKzNGoBY})zp=@0ZSp&t{N5&iu*n~7@+X_zW0So+ zQ@2xXvd<<@v&r=~d8SQnu*tJ*a-&V2ZIkENoy$O+ zHo4g*FR{r>ZSs#cd6`XKZj)EqlAMxlnNcV?$r4oUA~_2v?3vxLiQyr~%G~yGYu(xQ|cnyaK^5 zzff2OV+2}9VF>~i<{2xjqH)419xtp>6NEMTSYeHsD6Enx3zgXl8@m=RFder}+T+`# zJz=V}Cr+34q*D-`scf=)p;87sjN_&E6tA?sK=?r2rEPPJD88eDZSe$#>yX;Krvg7ava^K1KP*nNxui zz;^{v_9+1P2F}7TEW~?$#FFXh!?)&MBT0in8jRVw_+{})Dg6WQI|6I4eTqxEI>{ROd~Xl)_E)D zDS>(cXHlNQ|DSY#0JK1aa@3CyE$Yhr^U+qny(3ycLRBj4b@FmPQ8`h5ny+@RM0w=xgj>kPh4cpI@h*u0&!mikT`y&0mPOHvK(slPAq~VzWu6HmGu)17;!2rJr0KrK4VuHC3(FKUftl98aAaJi#vO} z+3(oW$S2qm!_xxN|N zXLyUAG5`*A7!}4iB>gNZWlZTKIR^j)hUG#nK#(v$p%K)>F)b=bD7;!Zl77o~YG}_m z0(&{N=Q&I{o$qFw7(1N<0HXCM1Moo3a=h$18qbSPd7)_IlCz5oDp)~l%4bWlyi=zIrYow+TjJrx*XTgHZ$b{ zWPS-_7jWP~Kp%L`i@&DYWX^2T0h`a1l7{- zyOJokag6N8OTocXke7pmzt@H%5bo{tT6vdw1>YgAa$bd4mY&@L^4Q`Ubon*N_G%_{ z#a0UU9|x6sEvVxqIK?(9?(ydJJXIbz*0TyJZjga=3+YBACMcppS)!YW0bKrHqDyY3 z6w?7IA=2L})6>18JCNvFnd6^ioIA7A-G|baBijAaa~}b>u$_9ko5u3?Zt;BP0ff4@ z2aYix<|+RPxD^8#F(2b8+-~*%k_R;Nah_^jWvnuOl`;Zi8hk=V1mFVt$faVXItg9$ zEV{^iE<0`z^TP8K$E{)hdx?hki-;rFQFWhi?PNsQ?g&T!{hj} zQDyKMkTsCau>+1a*`zO1%<1M%(In=pRt0{A6mQ7JdK2ZL=ba4elE7#H7o=K4XaLNX zD?&UFHs3-$jnOG1>^D%@w=FP;Y|x)~IA*Uu$*0!V^hI;hzxYyiQa`(%^xbNORV%q1 zrz|T`#rMT1DNx?$<_9S0KJxPKhdi}C(B^>#GCvX|01QwKAx$5PzVi@}$R~E)cFVeb zMh%#!f_WL3e<7ITA?O#}{1S29+e<@R@v`MBt4qG7*!k($--_7SjepAlNsx}+0XPED z)8-EpyMSW<61;yBu}@I;aB~lDokw!tPM?ky^LX#PR{&W+9fT7HAQnJ6B_dTHk=p|& z3e<)(;LxQ1nMA@LxCF?fkU>atk;l1MH=E~^mxtzu2)r(|o}FHZ=Syk|myfrLAwc&* zU4R=%`5u%KeyQrIgO`Vf+QoQ}TD#K+psUU5fHkpYCMqT-Dwe}1zPx7-dvwnpSb!No zo<&quAM(6HRqGeBBxi7lY1c0 zg~#_pTKHu-ZFGq(NEVU|Ny|S5WkKTvWuJsg^`hflmh%;={>8}TEo3rIiFxwWSl>oW6gRBaa~1uV4xE~hRLsUHvtn7*d;<5is;EA%M;UDK0