From 6d3f725a582c4e168022c7931b27e2f254e5ba0f Mon Sep 17 00:00:00 2001 From: "Nicolas A. Tonne" Date: Mon, 1 Sep 2014 14:04:00 +0200 Subject: [PATCH] ALL THE NEW CODES --- change.php | 123 +++ channel.php | 3 + delete.php | 20 - favicon.ico | Bin 0 -> 34494 bytes index.php | 171 +--- iscroll.js | 2006 ++++++++++++++++++++++++++++++++++++++++ list.js | 111 +++ lists/index.php | 0 nochan.php | 40 + save.php | 23 - save.sublime-workspace | 154 --- search.js | 95 ++ static/Logo.png | Bin 0 -> 37206 bytes static/favicon.png | Bin 0 -> 1684 bytes static/skip.png | Bin 0 -> 1483 bytes style.css | 71 +- timedifference.php | 13 + videos.json | 1 - videos.php | 8 + visualize.js | 5 + youtube.js | 280 ++++++ 21 files changed, 2784 insertions(+), 340 deletions(-) create mode 100644 change.php create mode 100644 channel.php delete mode 100644 delete.php create mode 100644 favicon.ico create mode 100644 iscroll.js create mode 100644 list.js create mode 100644 lists/index.php create mode 100644 nochan.php delete mode 100644 save.php delete mode 100644 save.sublime-workspace create mode 100644 search.js create mode 100644 static/Logo.png create mode 100644 static/favicon.png create mode 100644 static/skip.png create mode 100644 timedifference.php delete mode 100644 videos.json create mode 100644 videos.php create mode 100644 visualize.js create mode 100644 youtube.js diff --git a/change.php b/change.php new file mode 100644 index 00000000..9ea81167 --- /dev/null +++ b/change.php @@ -0,0 +1,123 @@ += 0){ + + //print_r($i); + // echo "IIII: ",$i; + unset($data[3][$i]); + unset($data[0][$i]); + unset($data[2][$i]); + $underVote = array_search($votes-1, $data[2]); + if($underVote == 0)$underVote=1; + else if($underVote == false)$underVote=count($data[2]); + array_splice($data[3], $underVote, 0, array($name)); + array_splice($data[2], $underVote, 0, array($votes)); + array_splice($data[0], $underVote, 0, array($id)); + file_put_contents($list, json_encode($data)); + echo "Vote registrated. I hope"; + } +} +else if(isset($_GET['skip'])){ //skip song request + $viewers=$data[4][0]; + $skips=count($data[5]); + if(!in_array($guid, $data[5])){ + array_push($data[5], $guid); + $skips+=1; + $data[5][0]=$skips; + if($skips>=$viewers/2){ + nextSong(); + echo("skipped!"); + } + file_put_contents($list, json_encode($data)); + } + echo($skips."/".$viewers); + +} +else{ print($file); } + +function nextSong(){ + global $data; + array_push($data[0], $data[0][0]); + array_shift($data[0]); + + array_push($data[2], 0); //reset votes + array_shift($data[2]); + + array_push($data[3], $data[3][0]); + array_shift($data[3]); + + array_shift($data[4]); + array_push($data[4], 1); + + $data[5]=array(); + $data[1][0] = time(); +} +?> \ No newline at end of file diff --git a/channel.php b/channel.php new file mode 100644 index 00000000..64afe2d7 --- /dev/null +++ b/channel.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/delete.php b/delete.php deleted file mode 100644 index 1423bdce..00000000 --- a/delete.php +++ /dev/null @@ -1,20 +0,0 @@ - \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d09876d5fa2612be161a338e32a14eb41935c0f GIT binary patch literal 34494 zcmdU236vDY8Sa%RxiP*ZlH?`K9S9R6@ zfB#?i)vIY`+L2mos|GiwB}Qo46iw3_8?*k~;+nPwVX>IuKU&kO=W1HtzFGfeAJeqQ zmTTJ42xt1aA3^$WYFYw3z*6f3F+9=Jt*fhBi07+8cYyu?{{x^0 z@%%@)Tj5>@S_T^5(9jSA&az@-jY3{kRaI~3dph*^0rYwf^Z`f@N=W|_Xfx=nrlzJo zQD7@159r(^EE?WMngb3+t1fGykI zbf=t#y8in7%7;uFtSIl&r&M31PpP@GpmcogDX#f%=&u9&<@uCU;8`Og9R0THf=Dc>Tc*?UlKL|)|VR_8$YLN1H@l#*H6WNVroJu*MmD% z^oO1t)3P58m3Nb?uQ1Dis0Zocq4%qgO4Q5x}RWkJe z`tRi2+|34f-{PmA%KM?Ii8=LPOya_lDFeX2z(aqo!$g9WV*oiWTv5JDA5`m;PBtPpEf z7z?kn)B}u*(j_x4;u5j=VSF@J=2_HkwjMlU+F*9+jEh!F{h{;qQR{8xXYUV6VSZq( z19*PcinkEYx&1-U&kvyUyIeElxET66&h4YL1M9)Uibu_QP$Kh#lVOLEQR?Z%YiMc` z#zp@!ZBPRBUKusdSw4*YW4SQ_28tU+W`5`{ndLz*e!3Y*?RC7(*|>@ieC?)`@efi zf7*O#>P%aIQ1p6m0Q&#BC-Ps)wAO=_V%@ZO^#HoR2ppRvmY#5XvK~PHr=ar{J)yT% z=CIUcTRkY+{=q$1_n2qJ(o@fE)$7f+uvp_FAA{_tG1Ik1Y2hNY(1`h$Xuig zk-4zc*U4?GzQ)vlW%+KLtH^JDfVOTY>${WwC%K>b#-!$^PO)6vBALfP~h92 zgHi7N7Q&qo|8bb{I?u_Dbkf-#2Hh6~)t~KDv8X-%qrmz@_Z#hcdiak(e6Ecu%i%n} zSX5uvsEms`7;Rpl`x6)&_eDCcj|7rcg7FWsUH8aq*H=sj8@yeDI;rLf>wLSbf(kES zgR$W8?uXF^z`aaCMc*jU{mc)W4S;v8uVMirfZu4?AyB`_GEgBz^w!ig zpK@ETpOILlcf@bT`R*A$ab4Rbj^P&tP)#{1_znQ=re3OaN^-6_E?8dvyyzp`(vC=- zZN^<$zDMt$9;7VC;Q1!%>qKRRLPRvq3n-tFw4VRrSg6_K-1@|tZ<+ctF3*j)*~%gO zN$8#op;DM6WvCBxK(9OC$iaMO&E*!I_IsWSA79gHiF-gFQhRz1FDF^Rz_$4kr!#$F z6bq83fB*hpg!~&J-*w*1`!Q=``-EOR56JewNe_mdSj&3^+4B*LE1p1H-*L|Gk*+QX z=0e29U4dHI;a1RlPP%cQ@3h1M-Q~_wjy-6D(TRmR=M+x75XSlGpHS8Vo#`)x-gcgx zJHZCu2EIUTq>G+*{SP4C^%$4pW_Zc}%7C@mum$f520l;EvIN?Wv>UKqb1L*cs^qnH z0odH!{4wY;0Q&GQ)hf8(2k~C_FG0UT*llos2)7gNS5dZy@NAk3yGVm|U4Oj~{^zXD4GMd(leu{&G*P7O%>xby}6VXJ(F8UEML$^%VJLw{UaI|bPaDG4QZ!z3{ zf(;l!8h?GH+azcmC+4nS2n!2bfuos zm3EMJk#-X1W{zaj8+L_#GYo*eyXf{loDVWzWIoA!V*-(nkSOw1=Cgi?ULFE&1a*MS z??jA(C*mLPU2sm#F$!oR%KA4^);Gh=z}*IV40Ip-Ti|{d?ljcLNhm46Rlb?1465<8Q_g8?K<>ZY5VwYv>zmRbg z$6g_zc1r?Y{PDXIVy&a8cBno)c~;~!I5k?YOJ~Qxko7)jC-UNyZh#a6CQqK+3%GfX zIcKfzG>jn&vG&{%->f&LkIN~Cko|99nC7>(?xYgZorLtPS2;X~C)@Rvu@{66D`LC! zuUFn12~DcGRBuQ(<;bFJ+7Hz3gwZVw@#~q+j-7ta-8-r_WA3wGUt0c*-kO|_@&Ac= zlUNf-=h{lj2bR}Rmd3i_wT2sY^$D5Q$>qG|!t$rY{H;BHgQMM?(&ZVp8`#(-yMDib zZ6suDfWD%xy350QQq5|yFR`M0C%#cJyIa1yr**cmLVV7Jx1e1*+G=m>v(dgQwUG_! z{`$ z>>_bX7iDLjVtP}*`gEf{uI3_rRqREyNxLzZUud@BL3ssGy=>s$g|cq0$pH)3(Ur%K61#MpQzP|dvFAlym>$1guTM9a zc_iaR>>dQ(^NiK|I5j3Oetvj>dxx>El)!T&cT{=K^1||`p~F7C2>lxSgJGa?e!8l^uSa{d zM&K_-zXrQ62d!1d=U>Je(gXCbR&6=luhlw!&nc?1bsMnX93_78;x~9MD1TDag_%{i z6|!IBT=1T#@n`$BHAcU-2kXv@3evBk?7RT%1^H%L|McILw>2Krsp<;Tiz48Hj!`!()$Sl>nPya)Jy76Bhu zTr5X3t8N$NDC&L<*dGS=P~Q{^qBGBnE-C-J=og~w*MNUB#?7Y#OI~9ie_iVJ@il7& z{)qdvCBR<|`3L+l`1f62JlL;&t?JIm`Zd`8eT<=p0RQLl%=KZ{G91;r=Gsx{*S3qg zkZ->R%+GSI0dy4bT?KO8D~<|3+fSCGRk4>aU(2sw1O8j&dM}>GgCZG&`svE{XkO(# zA`im$Yry(n&|J=6IRAyr&%pnfpX{jKbFFiEY-i|x4On;Jyh)tcNee=eo+Y;5mr)vdxOw`fRLW@!qTZw=H4+ zlae#V_ltOjDGHiYeW^aU_B2oYuq*E(Zt~mz=Dr}}6>^Wr6Q{-2Iq`sh2ip3S)!uH; ztlNmc(~VcL!+~WV%66+8UZ-&O%}B>{8aZ|-wjUU{))waM-w{a1`n*F0Gw*tg$9Ycf z&$z`OlehruT#J?G!;rlfyvA`a%gM$nVbGxxeE7{$_d1O{nqZtU{%#O_s&T>lDA;By~_(QFS804tzd?Ji`z**Mv|T` z;{^P58u5ke!9T-z7Cc>sU%0?+*GK9p^_F&!b}{XgG3+MoDD8@f!p{039Jb5;Kc5(6 zwt~!aS_}yP6a5~_3fEjY>^NA{*+fd#dinM$9zR%KpNI>U%u_Q$D7TENxpFv_+4Yj zKLT-;+7|BR@_bK3`S1qH!N-vogB7rv`X0`Q^=4R*^wzkLJpq0t+gsD|K6OO(;TmAL z)5=@rIl_E+0P+Hz&5`&JZG%ri z+QEnGFDBn}tF~f)>4lvBW^nCj(e`l9!5SCox##i?FgMSHItua##2oSy;KBbx`%m&_ zpXYQIl=rl8`$)>?cyblT)gG(^zrx(Q0XPF8mH5zsbydM!ZkEjO{rXE9)z6 zb!Bi*49f>xO29e<@7VR}!s-esgXIQLS?6KW+R8v zn`>?4%l4IJN`>S-80h2qeHOewMPlZ>QFXq~?+D6taA$kqHrJ_}a1N3D?RQ)(e5^ck zo?)+?eE`GWIdRBmYJ9!E4BvvNbGgUiC5!vVQV+e-GYlQ@Gad$)E3eKEdA3`lSQ^ogl~Y zjXf>fQI0hR1iQEK2Kc;b=jG<-*k~orl)JsRhXeb22vg?Iddj_b?qAz^Ir+(7)jl%) zK-{+rQ157;$7Nbow=I6HQoRFq?uDML%GVn2B76spXS1zg_Gj=H|C7=luHxsulV81) z^%rv1b>oS=bNcl7_sy_57>n{exm_Rd zPTTpp___9Xnbc(p{?`i6gi3y+66fnxPB(~<{yktca`9LB+F z3}lYOJ_?V*4|=QznRYUsH~J-YNoVJClM^4dJOl+-dO9 z!yQANiXJ{~lW%@pk50ryjn1_Dp`JQKC?eUNlJH8_Q74n_enK#?nwM|Sb zf55U`^6+yJcb80Ob&-x|Uj$B$1)QD{rcw_tK|Jdj2Yv@}omG~6KGY9;?if*Lu(#dG S{cm9r`8L;;?-`eAnD+l&v`N?i literal 0 HcmV?d00001 diff --git a/index.php b/index.php index b92346e5..50661cb6 100644 --- a/index.php +++ b/index.php @@ -1,136 +1,47 @@ - - - - Zöff - - - - - -
-
-
Zöff
- Zöff -
- -
-
- - -
- You need Flash player 8+ and JavaScript enabled to view this video. -
- - -
- -
- - + + + + + + + + \ No newline at end of file diff --git a/iscroll.js b/iscroll.js new file mode 100644 index 00000000..32b1ad5b --- /dev/null +++ b/iscroll.js @@ -0,0 +1,2006 @@ +/*! iScroll v5.1.2 ~ (c) 2008-2014 Matteo Spinelli ~ http://cubiq.org/license */ +(function (window, document, Math) { +var rAF = window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function (callback) { window.setTimeout(callback, 1000 / 60); }; + +var utils = (function () { + var me = {}; + + var _elementStyle = document.createElement('div').style; + var _vendor = (function () { + var vendors = ['t', 'webkitT', 'MozT', 'msT', 'OT'], + transform, + i = 0, + l = vendors.length; + + for ( ; i < l; i++ ) { + transform = vendors[i] + 'ransform'; + if ( transform in _elementStyle ) return vendors[i].substr(0, vendors[i].length-1); + } + + return false; + })(); + + function _prefixStyle (style) { + if ( _vendor === false ) return false; + if ( _vendor === '' ) return style; + return _vendor + style.charAt(0).toUpperCase() + style.substr(1); + } + + me.getTime = Date.now || function getTime () { return new Date().getTime(); }; + + me.extend = function (target, obj) { + for ( var i in obj ) { + target[i] = obj[i]; + } + }; + + me.addEvent = function (el, type, fn, capture) { + el.addEventListener(type, fn, !!capture); + }; + + me.removeEvent = function (el, type, fn, capture) { + el.removeEventListener(type, fn, !!capture); + }; + + me.prefixPointerEvent = function (pointerEvent) { + return window.MSPointerEvent ? + 'MSPointer' + pointerEvent.charAt(9).toUpperCase() + pointerEvent.substr(10): + pointerEvent; + }; + + me.momentum = function (current, start, time, lowerMargin, wrapperSize, deceleration) { + var distance = current - start, + speed = Math.abs(distance) / time, + destination, + duration; + + deceleration = deceleration === undefined ? 0.0006 : deceleration; + + destination = current + ( speed * speed ) / ( 2 * deceleration ) * ( distance < 0 ? -1 : 1 ); + duration = speed / deceleration; + + if ( destination < lowerMargin ) { + destination = wrapperSize ? lowerMargin - ( wrapperSize / 2.5 * ( speed / 8 ) ) : lowerMargin; + distance = Math.abs(destination - current); + duration = distance / speed; + } else if ( destination > 0 ) { + destination = wrapperSize ? wrapperSize / 2.5 * ( speed / 8 ) : 0; + distance = Math.abs(current) + destination; + duration = distance / speed; + } + + return { + destination: Math.round(destination), + duration: duration + }; + }; + + var _transform = _prefixStyle('transform'); + + me.extend(me, { + hasTransform: _transform !== false, + hasPerspective: _prefixStyle('perspective') in _elementStyle, + hasTouch: 'ontouchstart' in window, + hasPointer: window.PointerEvent || window.MSPointerEvent, // IE10 is prefixed + hasTransition: _prefixStyle('transition') in _elementStyle + }); + + // This should find all Android browsers lower than build 535.19 (both stock browser and webview) + me.isBadAndroid = /Android /.test(window.navigator.appVersion) && !(/Chrome\/\d/.test(window.navigator.appVersion)); + + me.extend(me.style = {}, { + transform: _transform, + transitionTimingFunction: _prefixStyle('transitionTimingFunction'), + transitionDuration: _prefixStyle('transitionDuration'), + transitionDelay: _prefixStyle('transitionDelay'), + transformOrigin: _prefixStyle('transformOrigin') + }); + + me.hasClass = function (e, c) { + var re = new RegExp("(^|\\s)" + c + "(\\s|$)"); + return re.test(e.className); + }; + + me.addClass = function (e, c) { + if ( me.hasClass(e, c) ) { + return; + } + + var newclass = e.className.split(' '); + newclass.push(c); + e.className = newclass.join(' '); + }; + + me.removeClass = function (e, c) { + if ( !me.hasClass(e, c) ) { + return; + } + + var re = new RegExp("(^|\\s)" + c + "(\\s|$)", 'g'); + e.className = e.className.replace(re, ' '); + }; + + me.offset = function (el) { + var left = -el.offsetLeft, + top = -el.offsetTop; + + // jshint -W084 + while (el = el.offsetParent) { + left -= el.offsetLeft; + top -= el.offsetTop; + } + // jshint +W084 + + return { + left: left, + top: top + }; + }; + + me.preventDefaultException = function (el, exceptions) { + for ( var i in exceptions ) { + if ( exceptions[i].test(el[i]) ) { + return true; + } + } + + return false; + }; + + me.extend(me.eventType = {}, { + touchstart: 1, + touchmove: 1, + touchend: 1, + + mousedown: 2, + mousemove: 2, + mouseup: 2, + + pointerdown: 3, + pointermove: 3, + pointerup: 3, + + MSPointerDown: 3, + MSPointerMove: 3, + MSPointerUp: 3 + }); + + me.extend(me.ease = {}, { + quadratic: { + style: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)', + fn: function (k) { + return k * ( 2 - k ); + } + }, + circular: { + style: 'cubic-bezier(0.1, 0.57, 0.1, 1)', // Not properly "circular" but this looks better, it should be (0.075, 0.82, 0.165, 1) + fn: function (k) { + return Math.sqrt( 1 - ( --k * k ) ); + } + }, + back: { + style: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)', + fn: function (k) { + var b = 4; + return ( k = k - 1 ) * k * ( ( b + 1 ) * k + b ) + 1; + } + }, + bounce: { + style: '', + fn: function (k) { + if ( ( k /= 1 ) < ( 1 / 2.75 ) ) { + return 7.5625 * k * k; + } else if ( k < ( 2 / 2.75 ) ) { + return 7.5625 * ( k -= ( 1.5 / 2.75 ) ) * k + 0.75; + } else if ( k < ( 2.5 / 2.75 ) ) { + return 7.5625 * ( k -= ( 2.25 / 2.75 ) ) * k + 0.9375; + } else { + return 7.5625 * ( k -= ( 2.625 / 2.75 ) ) * k + 0.984375; + } + } + }, + elastic: { + style: '', + fn: function (k) { + var f = 0.22, + e = 0.4; + + if ( k === 0 ) { return 0; } + if ( k == 1 ) { return 1; } + + return ( e * Math.pow( 2, - 10 * k ) * Math.sin( ( k - f / 4 ) * ( 2 * Math.PI ) / f ) + 1 ); + } + } + }); + + me.tap = function (e, eventName) { + var ev = document.createEvent('Event'); + ev.initEvent(eventName, true, true); + ev.pageX = e.pageX; + ev.pageY = e.pageY; + e.target.dispatchEvent(ev); + }; + + me.click = function (e) { + var target = e.target, + ev; + + if ( !(/(SELECT|INPUT|TEXTAREA)/i).test(target.tagName) ) { + ev = document.createEvent('MouseEvents'); + ev.initMouseEvent('click', true, true, e.view, 1, + target.screenX, target.screenY, target.clientX, target.clientY, + e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, + 0, null); + + ev._constructed = true; + target.dispatchEvent(ev); + } + }; + + return me; +})(); + +function IScroll (el, options) { + this.wrapper = typeof el == 'string' ? document.querySelector(el) : el; + this.scroller = this.wrapper.children[0]; + this.scrollerStyle = this.scroller.style; // cache style for better performance + + this.options = { + + resizeScrollbars: true, + + mouseWheelSpeed: 20, + + snapThreshold: 0.334, + +// INSERT POINT: OPTIONS + + startX: 0, + startY: 0, + scrollY: true, + directionLockThreshold: 5, + momentum: true, + + bounce: true, + bounceTime: 600, + bounceEasing: '', + + preventDefault: true, + preventDefaultException: { tagName: /^(INPUT|TEXTAREA|BUTTON|SELECT)$/ }, + + HWCompositing: true, + useTransition: true, + useTransform: true + }; + + for ( var i in options ) { + this.options[i] = options[i]; + } + + // Normalize options + this.translateZ = this.options.HWCompositing && utils.hasPerspective ? ' translateZ(0)' : ''; + + this.options.useTransition = utils.hasTransition && this.options.useTransition; + this.options.useTransform = utils.hasTransform && this.options.useTransform; + + this.options.eventPassthrough = this.options.eventPassthrough === true ? 'vertical' : this.options.eventPassthrough; + this.options.preventDefault = !this.options.eventPassthrough && this.options.preventDefault; + + // If you want eventPassthrough I have to lock one of the axes + this.options.scrollY = this.options.eventPassthrough == 'vertical' ? false : this.options.scrollY; + this.options.scrollX = this.options.eventPassthrough == 'horizontal' ? false : this.options.scrollX; + + // With eventPassthrough we also need lockDirection mechanism + this.options.freeScroll = this.options.freeScroll && !this.options.eventPassthrough; + this.options.directionLockThreshold = this.options.eventPassthrough ? 0 : this.options.directionLockThreshold; + + this.options.bounceEasing = typeof this.options.bounceEasing == 'string' ? utils.ease[this.options.bounceEasing] || utils.ease.circular : this.options.bounceEasing; + + this.options.resizePolling = this.options.resizePolling === undefined ? 60 : this.options.resizePolling; + + if ( this.options.tap === true ) { + this.options.tap = 'tap'; + } + + if ( this.options.shrinkScrollbars == 'scale' ) { + this.options.useTransition = false; + } + + this.options.invertWheelDirection = this.options.invertWheelDirection ? -1 : 1; + +// INSERT POINT: NORMALIZATION + + // Some defaults + this.x = 0; + this.y = 0; + this.directionX = 0; + this.directionY = 0; + this._events = {}; + +// INSERT POINT: DEFAULTS + + this._init(); + this.refresh(); + + this.scrollTo(this.options.startX, this.options.startY); + this.enable(); +} + +IScroll.prototype = { + version: '5.1.2', + + _init: function () { + this._initEvents(); + + if ( this.options.scrollbars || this.options.indicators ) { + this._initIndicators(); + } + + if ( this.options.mouseWheel ) { + this._initWheel(); + } + + if ( this.options.snap ) { + this._initSnap(); + } + + if ( this.options.keyBindings ) { + this._initKeys(); + } + +// INSERT POINT: _init + + }, + + destroy: function () { + this._initEvents(true); + + this._execEvent('destroy'); + }, + + _transitionEnd: function (e) { + if ( e.target != this.scroller || !this.isInTransition ) { + return; + } + + this._transitionTime(); + if ( !this.resetPosition(this.options.bounceTime) ) { + this.isInTransition = false; + this._execEvent('scrollEnd'); + } + }, + + _start: function (e) { + // React to left mouse button only + if ( utils.eventType[e.type] != 1 ) { + if ( e.button !== 0 ) { + return; + } + } + + if ( !this.enabled || (this.initiated && utils.eventType[e.type] !== this.initiated) ) { + return; + } + + if ( this.options.preventDefault && !utils.isBadAndroid && !utils.preventDefaultException(e.target, this.options.preventDefaultException) ) { + e.preventDefault(); + } + + var point = e.touches ? e.touches[0] : e, + pos; + + this.initiated = utils.eventType[e.type]; + this.moved = false; + this.distX = 0; + this.distY = 0; + this.directionX = 0; + this.directionY = 0; + this.directionLocked = 0; + + this._transitionTime(); + + this.startTime = utils.getTime(); + + if ( this.options.useTransition && this.isInTransition ) { + this.isInTransition = false; + pos = this.getComputedPosition(); + this._translate(Math.round(pos.x), Math.round(pos.y)); + this._execEvent('scrollEnd'); + } else if ( !this.options.useTransition && this.isAnimating ) { + this.isAnimating = false; + this._execEvent('scrollEnd'); + } + + this.startX = this.x; + this.startY = this.y; + this.absStartX = this.x; + this.absStartY = this.y; + this.pointX = point.pageX; + this.pointY = point.pageY; + + this._execEvent('beforeScrollStart'); + }, + + _move: function (e) { + if ( !this.enabled || utils.eventType[e.type] !== this.initiated ) { + return; + } + + if ( this.options.preventDefault ) { // increases performance on Android? TODO: check! + e.preventDefault(); + } + + var point = e.touches ? e.touches[0] : e, + deltaX = point.pageX - this.pointX, + deltaY = point.pageY - this.pointY, + timestamp = utils.getTime(), + newX, newY, + absDistX, absDistY; + + this.pointX = point.pageX; + this.pointY = point.pageY; + + this.distX += deltaX; + this.distY += deltaY; + absDistX = Math.abs(this.distX); + absDistY = Math.abs(this.distY); + + // We need to move at least 10 pixels for the scrolling to initiate + if ( timestamp - this.endTime > 300 && (absDistX < 10 && absDistY < 10) ) { + return; + } + + // If you are scrolling in one direction lock the other + if ( !this.directionLocked && !this.options.freeScroll ) { + if ( absDistX > absDistY + this.options.directionLockThreshold ) { + this.directionLocked = 'h'; // lock horizontally + } else if ( absDistY >= absDistX + this.options.directionLockThreshold ) { + this.directionLocked = 'v'; // lock vertically + } else { + this.directionLocked = 'n'; // no lock + } + } + + if ( this.directionLocked == 'h' ) { + if ( this.options.eventPassthrough == 'vertical' ) { + e.preventDefault(); + } else if ( this.options.eventPassthrough == 'horizontal' ) { + this.initiated = false; + return; + } + + deltaY = 0; + } else if ( this.directionLocked == 'v' ) { + if ( this.options.eventPassthrough == 'horizontal' ) { + e.preventDefault(); + } else if ( this.options.eventPassthrough == 'vertical' ) { + this.initiated = false; + return; + } + + deltaX = 0; + } + + deltaX = this.hasHorizontalScroll ? deltaX : 0; + deltaY = this.hasVerticalScroll ? deltaY : 0; + + newX = this.x + deltaX; + newY = this.y + deltaY; + + // Slow down if outside of the boundaries + if ( newX > 0 || newX < this.maxScrollX ) { + newX = this.options.bounce ? this.x + deltaX / 3 : newX > 0 ? 0 : this.maxScrollX; + } + if ( newY > 0 || newY < this.maxScrollY ) { + newY = this.options.bounce ? this.y + deltaY / 3 : newY > 0 ? 0 : this.maxScrollY; + } + + this.directionX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0; + this.directionY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0; + + if ( !this.moved ) { + this._execEvent('scrollStart'); + } + + this.moved = true; + + this._translate(newX, newY); + +/* REPLACE START: _move */ + + if ( timestamp - this.startTime > 300 ) { + this.startTime = timestamp; + this.startX = this.x; + this.startY = this.y; + } + +/* REPLACE END: _move */ + + }, + + _end: function (e) { + if ( !this.enabled || utils.eventType[e.type] !== this.initiated ) { + return; + } + + if ( this.options.preventDefault && !utils.preventDefaultException(e.target, this.options.preventDefaultException) ) { + e.preventDefault(); + } + + var point = e.changedTouches ? e.changedTouches[0] : e, + momentumX, + momentumY, + duration = utils.getTime() - this.startTime, + newX = Math.round(this.x), + newY = Math.round(this.y), + distanceX = Math.abs(newX - this.startX), + distanceY = Math.abs(newY - this.startY), + time = 0, + easing = ''; + + this.isInTransition = 0; + this.initiated = 0; + this.endTime = utils.getTime(); + + // reset if we are outside of the boundaries + if ( this.resetPosition(this.options.bounceTime) ) { + return; + } + + this.scrollTo(newX, newY); // ensures that the last position is rounded + + // we scrolled less than 10 pixels + if ( !this.moved ) { + if ( this.options.tap ) { + utils.tap(e, this.options.tap); + } + + if ( this.options.click ) { + utils.click(e); + } + + this._execEvent('scrollCancel'); + return; + } + + if ( this._events.flick && duration < 200 && distanceX < 100 && distanceY < 100 ) { + this._execEvent('flick'); + return; + } + + // start momentum animation if needed + if ( this.options.momentum && duration < 300 ) { + momentumX = this.hasHorizontalScroll ? utils.momentum(this.x, this.startX, duration, this.maxScrollX, this.options.bounce ? this.wrapperWidth : 0, this.options.deceleration) : { destination: newX, duration: 0 }; + momentumY = this.hasVerticalScroll ? utils.momentum(this.y, this.startY, duration, this.maxScrollY, this.options.bounce ? this.wrapperHeight : 0, this.options.deceleration) : { destination: newY, duration: 0 }; + newX = momentumX.destination; + newY = momentumY.destination; + time = Math.max(momentumX.duration, momentumY.duration); + this.isInTransition = 1; + } + + + if ( this.options.snap ) { + var snap = this._nearestSnap(newX, newY); + this.currentPage = snap; + time = this.options.snapSpeed || Math.max( + Math.max( + Math.min(Math.abs(newX - snap.x), 1000), + Math.min(Math.abs(newY - snap.y), 1000) + ), 300); + newX = snap.x; + newY = snap.y; + + this.directionX = 0; + this.directionY = 0; + easing = this.options.bounceEasing; + } + +// INSERT POINT: _end + + if ( newX != this.x || newY != this.y ) { + // change easing function when scroller goes out of the boundaries + if ( newX > 0 || newX < this.maxScrollX || newY > 0 || newY < this.maxScrollY ) { + easing = utils.ease.quadratic; + } + + this.scrollTo(newX, newY, time, easing); + return; + } + + this._execEvent('scrollEnd'); + }, + + _resize: function () { + var that = this; + + clearTimeout(this.resizeTimeout); + + this.resizeTimeout = setTimeout(function () { + that.refresh(); + }, this.options.resizePolling); + }, + + resetPosition: function (time) { + var x = this.x, + y = this.y; + + time = time || 0; + + if ( !this.hasHorizontalScroll || this.x > 0 ) { + x = 0; + } else if ( this.x < this.maxScrollX ) { + x = this.maxScrollX; + } + + if ( !this.hasVerticalScroll || this.y > 0 ) { + y = 0; + } else if ( this.y < this.maxScrollY ) { + y = this.maxScrollY; + } + + if ( x == this.x && y == this.y ) { + return false; + } + + this.scrollTo(x, y, time, this.options.bounceEasing); + + return true; + }, + + disable: function () { + this.enabled = false; + }, + + enable: function () { + this.enabled = true; + }, + + refresh: function () { + var rf = this.wrapper.offsetHeight; // Force reflow + + this.wrapperWidth = this.wrapper.clientWidth; + this.wrapperHeight = this.wrapper.clientHeight; + +/* REPLACE START: refresh */ + + this.scrollerWidth = this.scroller.offsetWidth; + this.scrollerHeight = this.scroller.offsetHeight; + + this.maxScrollX = this.wrapperWidth - this.scrollerWidth; + this.maxScrollY = this.wrapperHeight - this.scrollerHeight; + +/* REPLACE END: refresh */ + + this.hasHorizontalScroll = this.options.scrollX && this.maxScrollX < 0; + this.hasVerticalScroll = this.options.scrollY && this.maxScrollY < 0; + + if ( !this.hasHorizontalScroll ) { + this.maxScrollX = 0; + this.scrollerWidth = this.wrapperWidth; + } + + if ( !this.hasVerticalScroll ) { + this.maxScrollY = 0; + this.scrollerHeight = this.wrapperHeight; + } + + this.endTime = 0; + this.directionX = 0; + this.directionY = 0; + + this.wrapperOffset = utils.offset(this.wrapper); + + this._execEvent('refresh'); + + this.resetPosition(); + +// INSERT POINT: _refresh + + }, + + on: function (type, fn) { + if ( !this._events[type] ) { + this._events[type] = []; + } + + this._events[type].push(fn); + }, + + off: function (type, fn) { + if ( !this._events[type] ) { + return; + } + + var index = this._events[type].indexOf(fn); + + if ( index > -1 ) { + this._events[type].splice(index, 1); + } + }, + + _execEvent: function (type) { + if ( !this._events[type] ) { + return; + } + + var i = 0, + l = this._events[type].length; + + if ( !l ) { + return; + } + + for ( ; i < l; i++ ) { + this._events[type][i].apply(this, [].slice.call(arguments, 1)); + } + }, + + scrollBy: function (x, y, time, easing) { + x = this.x + x; + y = this.y + y; + time = time || 0; + + this.scrollTo(x, y, time, easing); + }, + + scrollTo: function (x, y, time, easing) { + easing = easing || utils.ease.circular; + + this.isInTransition = this.options.useTransition && time > 0; + + if ( !time || (this.options.useTransition && easing.style) ) { + this._transitionTimingFunction(easing.style); + this._transitionTime(time); + this._translate(x, y); + } else { + this._animate(x, y, time, easing.fn); + } + }, + + scrollToElement: function (el, time, offsetX, offsetY, easing) { + el = el.nodeType ? el : this.scroller.querySelector(el); + + if ( !el ) { + return; + } + + var pos = utils.offset(el); + + pos.left -= this.wrapperOffset.left; + pos.top -= this.wrapperOffset.top; + + // if offsetX/Y are true we center the element to the screen + if ( offsetX === true ) { + offsetX = Math.round(el.offsetWidth / 2 - this.wrapper.offsetWidth / 2); + } + if ( offsetY === true ) { + offsetY = Math.round(el.offsetHeight / 2 - this.wrapper.offsetHeight / 2); + } + + pos.left -= offsetX || 0; + pos.top -= offsetY || 0; + + pos.left = pos.left > 0 ? 0 : pos.left < this.maxScrollX ? this.maxScrollX : pos.left; + pos.top = pos.top > 0 ? 0 : pos.top < this.maxScrollY ? this.maxScrollY : pos.top; + + time = time === undefined || time === null || time === 'auto' ? Math.max(Math.abs(this.x-pos.left), Math.abs(this.y-pos.top)) : time; + + this.scrollTo(pos.left, pos.top, time, easing); + }, + + _transitionTime: function (time) { + time = time || 0; + + this.scrollerStyle[utils.style.transitionDuration] = time + 'ms'; + + if ( !time && utils.isBadAndroid ) { + this.scrollerStyle[utils.style.transitionDuration] = '0.001s'; + } + + + if ( this.indicators ) { + for ( var i = this.indicators.length; i--; ) { + this.indicators[i].transitionTime(time); + } + } + + +// INSERT POINT: _transitionTime + + }, + + _transitionTimingFunction: function (easing) { + this.scrollerStyle[utils.style.transitionTimingFunction] = easing; + + + if ( this.indicators ) { + for ( var i = this.indicators.length; i--; ) { + this.indicators[i].transitionTimingFunction(easing); + } + } + + +// INSERT POINT: _transitionTimingFunction + + }, + + _translate: function (x, y) { + if ( this.options.useTransform ) { + +/* REPLACE START: _translate */ + + this.scrollerStyle[utils.style.transform] = 'translate(' + x + 'px,' + y + 'px)' + this.translateZ; + +/* REPLACE END: _translate */ + + } else { + x = Math.round(x); + y = Math.round(y); + this.scrollerStyle.left = x + 'px'; + this.scrollerStyle.top = y + 'px'; + } + + this.x = x; + this.y = y; + + + if ( this.indicators ) { + for ( var i = this.indicators.length; i--; ) { + this.indicators[i].updatePosition(); + } + } + + +// INSERT POINT: _translate + + }, + + _initEvents: function (remove) { + var eventType = remove ? utils.removeEvent : utils.addEvent, + target = this.options.bindToWrapper ? this.wrapper : window; + + eventType(window, 'orientationchange', this); + eventType(window, 'resize', this); + + if ( this.options.click ) { + eventType(this.wrapper, 'click', this, true); + } + + if ( !this.options.disableMouse ) { + eventType(this.wrapper, 'mousedown', this); + eventType(target, 'mousemove', this); + eventType(target, 'mousecancel', this); + eventType(target, 'mouseup', this); + } + + if ( utils.hasPointer && !this.options.disablePointer ) { + eventType(this.wrapper, utils.prefixPointerEvent('pointerdown'), this); + eventType(target, utils.prefixPointerEvent('pointermove'), this); + eventType(target, utils.prefixPointerEvent('pointercancel'), this); + eventType(target, utils.prefixPointerEvent('pointerup'), this); + } + + if ( utils.hasTouch && !this.options.disableTouch ) { + eventType(this.wrapper, 'touchstart', this); + eventType(target, 'touchmove', this); + eventType(target, 'touchcancel', this); + eventType(target, 'touchend', this); + } + + eventType(this.scroller, 'transitionend', this); + eventType(this.scroller, 'webkitTransitionEnd', this); + eventType(this.scroller, 'oTransitionEnd', this); + eventType(this.scroller, 'MSTransitionEnd', this); + }, + + getComputedPosition: function () { + var matrix = window.getComputedStyle(this.scroller, null), + x, y; + + if ( this.options.useTransform ) { + matrix = matrix[utils.style.transform].split(')')[0].split(', '); + x = +(matrix[12] || matrix[4]); + y = +(matrix[13] || matrix[5]); + } else { + x = +matrix.left.replace(/[^-\d.]/g, ''); + y = +matrix.top.replace(/[^-\d.]/g, ''); + } + + return { x: x, y: y }; + }, + + _initIndicators: function () { + var interactive = this.options.interactiveScrollbars, + customStyle = typeof this.options.scrollbars != 'string', + indicators = [], + indicator; + + var that = this; + + this.indicators = []; + + if ( this.options.scrollbars ) { + // Vertical scrollbar + if ( this.options.scrollY ) { + indicator = { + el: createDefaultScrollbar('v', interactive, this.options.scrollbars), + interactive: interactive, + defaultScrollbars: true, + customStyle: customStyle, + resize: this.options.resizeScrollbars, + shrink: this.options.shrinkScrollbars, + fade: this.options.fadeScrollbars, + listenX: false + }; + + this.wrapper.appendChild(indicator.el); + indicators.push(indicator); + } + + // Horizontal scrollbar + if ( this.options.scrollX ) { + indicator = { + el: createDefaultScrollbar('h', interactive, this.options.scrollbars), + interactive: interactive, + defaultScrollbars: true, + customStyle: customStyle, + resize: this.options.resizeScrollbars, + shrink: this.options.shrinkScrollbars, + fade: this.options.fadeScrollbars, + listenY: false + }; + + this.wrapper.appendChild(indicator.el); + indicators.push(indicator); + } + } + + if ( this.options.indicators ) { + // TODO: check concat compatibility + indicators = indicators.concat(this.options.indicators); + } + + for ( var i = indicators.length; i--; ) { + this.indicators.push( new Indicator(this, indicators[i]) ); + } + + // TODO: check if we can use array.map (wide compatibility and performance issues) + function _indicatorsMap (fn) { + for ( var i = that.indicators.length; i--; ) { + fn.call(that.indicators[i]); + } + } + + if ( this.options.fadeScrollbars ) { + this.on('scrollEnd', function () { + _indicatorsMap(function () { + this.fade(); + }); + }); + + this.on('scrollCancel', function () { + _indicatorsMap(function () { + this.fade(); + }); + }); + + this.on('scrollStart', function () { + _indicatorsMap(function () { + this.fade(1); + }); + }); + + this.on('beforeScrollStart', function () { + _indicatorsMap(function () { + this.fade(1, true); + }); + }); + } + + + this.on('refresh', function () { + _indicatorsMap(function () { + this.refresh(); + }); + }); + + this.on('destroy', function () { + _indicatorsMap(function () { + this.destroy(); + }); + + delete this.indicators; + }); + }, + + _initWheel: function () { + utils.addEvent(this.wrapper, 'wheel', this); + utils.addEvent(this.wrapper, 'mousewheel', this); + utils.addEvent(this.wrapper, 'DOMMouseScroll', this); + + this.on('destroy', function () { + utils.removeEvent(this.wrapper, 'wheel', this); + utils.removeEvent(this.wrapper, 'mousewheel', this); + utils.removeEvent(this.wrapper, 'DOMMouseScroll', this); + }); + }, + + _wheel: function (e) { + if ( !this.enabled ) { + return; + } + + e.preventDefault(); + e.stopPropagation(); + + var wheelDeltaX, wheelDeltaY, + newX, newY, + that = this; + + if ( this.wheelTimeout === undefined ) { + that._execEvent('scrollStart'); + } + + // Execute the scrollEnd event after 400ms the wheel stopped scrolling + clearTimeout(this.wheelTimeout); + this.wheelTimeout = setTimeout(function () { + that._execEvent('scrollEnd'); + that.wheelTimeout = undefined; + }, 400); + + if ( 'deltaX' in e ) { + wheelDeltaX = -e.deltaX; + wheelDeltaY = -e.deltaY; + } else if ( 'wheelDeltaX' in e ) { + wheelDeltaX = e.wheelDeltaX / 120 * this.options.mouseWheelSpeed; + wheelDeltaY = e.wheelDeltaY / 120 * this.options.mouseWheelSpeed; + } else if ( 'wheelDelta' in e ) { + wheelDeltaX = wheelDeltaY = e.wheelDelta / 120 * this.options.mouseWheelSpeed; + } else if ( 'detail' in e ) { + wheelDeltaX = wheelDeltaY = -e.detail / 3 * this.options.mouseWheelSpeed; + } else { + return; + } + + wheelDeltaX *= this.options.invertWheelDirection; + wheelDeltaY *= this.options.invertWheelDirection; + + if ( !this.hasVerticalScroll ) { + wheelDeltaX = wheelDeltaY; + wheelDeltaY = 0; + } + + if ( this.options.snap ) { + newX = this.currentPage.pageX; + newY = this.currentPage.pageY; + + if ( wheelDeltaX > 0 ) { + newX--; + } else if ( wheelDeltaX < 0 ) { + newX++; + } + + if ( wheelDeltaY > 0 ) { + newY--; + } else if ( wheelDeltaY < 0 ) { + newY++; + } + + this.goToPage(newX, newY); + + return; + } + + newX = this.x + Math.round(this.hasHorizontalScroll ? wheelDeltaX : 0); + newY = this.y + Math.round(this.hasVerticalScroll ? wheelDeltaY : 0); + + if ( newX > 0 ) { + newX = 0; + } else if ( newX < this.maxScrollX ) { + newX = this.maxScrollX; + } + + if ( newY > 0 ) { + newY = 0; + } else if ( newY < this.maxScrollY ) { + newY = this.maxScrollY; + } + + this.scrollTo(newX, newY, 0); + +// INSERT POINT: _wheel + }, + + _initSnap: function () { + this.currentPage = {}; + + if ( typeof this.options.snap == 'string' ) { + this.options.snap = this.scroller.querySelectorAll(this.options.snap); + } + + this.on('refresh', function () { + var i = 0, l, + m = 0, n, + cx, cy, + x = 0, y, + stepX = this.options.snapStepX || this.wrapperWidth, + stepY = this.options.snapStepY || this.wrapperHeight, + el; + + this.pages = []; + + if ( !this.wrapperWidth || !this.wrapperHeight || !this.scrollerWidth || !this.scrollerHeight ) { + return; + } + + if ( this.options.snap === true ) { + cx = Math.round( stepX / 2 ); + cy = Math.round( stepY / 2 ); + + while ( x > -this.scrollerWidth ) { + this.pages[i] = []; + l = 0; + y = 0; + + while ( y > -this.scrollerHeight ) { + this.pages[i][l] = { + x: Math.max(x, this.maxScrollX), + y: Math.max(y, this.maxScrollY), + width: stepX, + height: stepY, + cx: x - cx, + cy: y - cy + }; + + y -= stepY; + l++; + } + + x -= stepX; + i++; + } + } else { + el = this.options.snap; + l = el.length; + n = -1; + + for ( ; i < l; i++ ) { + if ( i === 0 || el[i].offsetLeft <= el[i-1].offsetLeft ) { + m = 0; + n++; + } + + if ( !this.pages[m] ) { + this.pages[m] = []; + } + + x = Math.max(-el[i].offsetLeft, this.maxScrollX); + y = Math.max(-el[i].offsetTop, this.maxScrollY); + cx = x - Math.round(el[i].offsetWidth / 2); + cy = y - Math.round(el[i].offsetHeight / 2); + + this.pages[m][n] = { + x: x, + y: y, + width: el[i].offsetWidth, + height: el[i].offsetHeight, + cx: cx, + cy: cy + }; + + if ( x > this.maxScrollX ) { + m++; + } + } + } + + this.goToPage(this.currentPage.pageX || 0, this.currentPage.pageY || 0, 0); + + // Update snap threshold if needed + if ( this.options.snapThreshold % 1 === 0 ) { + this.snapThresholdX = this.options.snapThreshold; + this.snapThresholdY = this.options.snapThreshold; + } else { + this.snapThresholdX = Math.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].width * this.options.snapThreshold); + this.snapThresholdY = Math.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].height * this.options.snapThreshold); + } + }); + + this.on('flick', function () { + var time = this.options.snapSpeed || Math.max( + Math.max( + Math.min(Math.abs(this.x - this.startX), 1000), + Math.min(Math.abs(this.y - this.startY), 1000) + ), 300); + + this.goToPage( + this.currentPage.pageX + this.directionX, + this.currentPage.pageY + this.directionY, + time + ); + }); + }, + + _nearestSnap: function (x, y) { + if ( !this.pages.length ) { + return { x: 0, y: 0, pageX: 0, pageY: 0 }; + } + + var i = 0, + l = this.pages.length, + m = 0; + + // Check if we exceeded the snap threshold + if ( Math.abs(x - this.absStartX) < this.snapThresholdX && + Math.abs(y - this.absStartY) < this.snapThresholdY ) { + return this.currentPage; + } + + if ( x > 0 ) { + x = 0; + } else if ( x < this.maxScrollX ) { + x = this.maxScrollX; + } + + if ( y > 0 ) { + y = 0; + } else if ( y < this.maxScrollY ) { + y = this.maxScrollY; + } + + for ( ; i < l; i++ ) { + if ( x >= this.pages[i][0].cx ) { + x = this.pages[i][0].x; + break; + } + } + + l = this.pages[i].length; + + for ( ; m < l; m++ ) { + if ( y >= this.pages[0][m].cy ) { + y = this.pages[0][m].y; + break; + } + } + + if ( i == this.currentPage.pageX ) { + i += this.directionX; + + if ( i < 0 ) { + i = 0; + } else if ( i >= this.pages.length ) { + i = this.pages.length - 1; + } + + x = this.pages[i][0].x; + } + + if ( m == this.currentPage.pageY ) { + m += this.directionY; + + if ( m < 0 ) { + m = 0; + } else if ( m >= this.pages[0].length ) { + m = this.pages[0].length - 1; + } + + y = this.pages[0][m].y; + } + + return { + x: x, + y: y, + pageX: i, + pageY: m + }; + }, + + goToPage: function (x, y, time, easing) { + easing = easing || this.options.bounceEasing; + + if ( x >= this.pages.length ) { + x = this.pages.length - 1; + } else if ( x < 0 ) { + x = 0; + } + + if ( y >= this.pages[x].length ) { + y = this.pages[x].length - 1; + } else if ( y < 0 ) { + y = 0; + } + + var posX = this.pages[x][y].x, + posY = this.pages[x][y].y; + + time = time === undefined ? this.options.snapSpeed || Math.max( + Math.max( + Math.min(Math.abs(posX - this.x), 1000), + Math.min(Math.abs(posY - this.y), 1000) + ), 300) : time; + + this.currentPage = { + x: posX, + y: posY, + pageX: x, + pageY: y + }; + + this.scrollTo(posX, posY, time, easing); + }, + + next: function (time, easing) { + var x = this.currentPage.pageX, + y = this.currentPage.pageY; + + x++; + + if ( x >= this.pages.length && this.hasVerticalScroll ) { + x = 0; + y++; + } + + this.goToPage(x, y, time, easing); + }, + + prev: function (time, easing) { + var x = this.currentPage.pageX, + y = this.currentPage.pageY; + + x--; + + if ( x < 0 && this.hasVerticalScroll ) { + x = 0; + y--; + } + + this.goToPage(x, y, time, easing); + }, + + _initKeys: function (e) { + // default key bindings + var keys = { + pageUp: 33, + pageDown: 34, + end: 35, + home: 36, + left: 37, + up: 38, + right: 39, + down: 40 + }; + var i; + + // if you give me characters I give you keycode + if ( typeof this.options.keyBindings == 'object' ) { + for ( i in this.options.keyBindings ) { + if ( typeof this.options.keyBindings[i] == 'string' ) { + this.options.keyBindings[i] = this.options.keyBindings[i].toUpperCase().charCodeAt(0); + } + } + } else { + this.options.keyBindings = {}; + } + + for ( i in keys ) { + this.options.keyBindings[i] = this.options.keyBindings[i] || keys[i]; + } + + utils.addEvent(window, 'keydown', this); + + this.on('destroy', function () { + utils.removeEvent(window, 'keydown', this); + }); + }, + + _key: function (e) { + if ( !this.enabled ) { + return; + } + + var snap = this.options.snap, // we are using this alot, better to cache it + newX = snap ? this.currentPage.pageX : this.x, + newY = snap ? this.currentPage.pageY : this.y, + now = utils.getTime(), + prevTime = this.keyTime || 0, + acceleration = 0.250, + pos; + + if ( this.options.useTransition && this.isInTransition ) { + pos = this.getComputedPosition(); + + this._translate(Math.round(pos.x), Math.round(pos.y)); + this.isInTransition = false; + } + + this.keyAcceleration = now - prevTime < 200 ? Math.min(this.keyAcceleration + acceleration, 50) : 0; + + switch ( e.keyCode ) { + case this.options.keyBindings.pageUp: + if ( this.hasHorizontalScroll && !this.hasVerticalScroll ) { + newX += snap ? 1 : this.wrapperWidth; + } else { + newY += snap ? 1 : this.wrapperHeight; + } + break; + case this.options.keyBindings.pageDown: + if ( this.hasHorizontalScroll && !this.hasVerticalScroll ) { + newX -= snap ? 1 : this.wrapperWidth; + } else { + newY -= snap ? 1 : this.wrapperHeight; + } + break; + case this.options.keyBindings.end: + newX = snap ? this.pages.length-1 : this.maxScrollX; + newY = snap ? this.pages[0].length-1 : this.maxScrollY; + break; + case this.options.keyBindings.home: + newX = 0; + newY = 0; + break; + case this.options.keyBindings.left: + newX += snap ? -1 : 5 + this.keyAcceleration>>0; + break; + case this.options.keyBindings.up: + newY += snap ? 1 : 5 + this.keyAcceleration>>0; + break; + case this.options.keyBindings.right: + newX -= snap ? -1 : 5 + this.keyAcceleration>>0; + break; + case this.options.keyBindings.down: + newY -= snap ? 1 : 5 + this.keyAcceleration>>0; + break; + default: + return; + } + + if ( snap ) { + this.goToPage(newX, newY); + return; + } + + if ( newX > 0 ) { + newX = 0; + this.keyAcceleration = 0; + } else if ( newX < this.maxScrollX ) { + newX = this.maxScrollX; + this.keyAcceleration = 0; + } + + if ( newY > 0 ) { + newY = 0; + this.keyAcceleration = 0; + } else if ( newY < this.maxScrollY ) { + newY = this.maxScrollY; + this.keyAcceleration = 0; + } + + this.scrollTo(newX, newY, 0); + + this.keyTime = now; + }, + + _animate: function (destX, destY, duration, easingFn) { + var that = this, + startX = this.x, + startY = this.y, + startTime = utils.getTime(), + destTime = startTime + duration; + + function step () { + var now = utils.getTime(), + newX, newY, + easing; + + if ( now >= destTime ) { + that.isAnimating = false; + that._translate(destX, destY); + + if ( !that.resetPosition(that.options.bounceTime) ) { + that._execEvent('scrollEnd'); + } + + return; + } + + now = ( now - startTime ) / duration; + easing = easingFn(now); + newX = ( destX - startX ) * easing + startX; + newY = ( destY - startY ) * easing + startY; + that._translate(newX, newY); + + if ( that.isAnimating ) { + rAF(step); + } + } + + this.isAnimating = true; + step(); + }, + handleEvent: function (e) { + switch ( e.type ) { + case 'touchstart': + case 'pointerdown': + case 'MSPointerDown': + case 'mousedown': + this._start(e); + break; + case 'touchmove': + case 'pointermove': + case 'MSPointerMove': + case 'mousemove': + this._move(e); + break; + case 'touchend': + case 'pointerup': + case 'MSPointerUp': + case 'mouseup': + case 'touchcancel': + case 'pointercancel': + case 'MSPointerCancel': + case 'mousecancel': + this._end(e); + break; + case 'orientationchange': + case 'resize': + this._resize(); + break; + case 'transitionend': + case 'webkitTransitionEnd': + case 'oTransitionEnd': + case 'MSTransitionEnd': + this._transitionEnd(e); + break; + case 'wheel': + case 'DOMMouseScroll': + case 'mousewheel': + this._wheel(e); + break; + case 'keydown': + this._key(e); + break; + case 'click': + if ( !e._constructed ) { + e.preventDefault(); + e.stopPropagation(); + } + break; + } + } +}; +function createDefaultScrollbar (direction, interactive, type) { + var scrollbar = document.createElement('div'), + indicator = document.createElement('div'); + + if ( type === true ) { + scrollbar.style.cssText = 'position:absolute;z-index:9999'; + indicator.style.cssText = '-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.9);border-radius:3px'; + } + + indicator.className = 'iScrollIndicator'; + + if ( direction == 'h' ) { + if ( type === true ) { + scrollbar.style.cssText += ';height:7px;left:2px;right:2px;bottom:0'; + indicator.style.height = '100%'; + } + scrollbar.className = 'iScrollHorizontalScrollbar'; + } else { + if ( type === true ) { + scrollbar.style.cssText += ';width:7px;bottom:2px;top:2px;right:1px'; + indicator.style.width = '100%'; + } + scrollbar.className = 'iScrollVerticalScrollbar'; + } + + scrollbar.style.cssText += ';overflow:hidden'; + + if ( !interactive ) { + scrollbar.style.pointerEvents = 'none'; + } + + scrollbar.appendChild(indicator); + + return scrollbar; +} + +function Indicator (scroller, options) { + this.wrapper = typeof options.el == 'string' ? document.querySelector(options.el) : options.el; + this.wrapperStyle = this.wrapper.style; + this.indicator = this.wrapper.children[0]; + this.indicatorStyle = this.indicator.style; + this.scroller = scroller; + + this.options = { + listenX: true, + listenY: true, + interactive: false, + resize: true, + defaultScrollbars: false, + shrink: false, + fade: false, + speedRatioX: 0, + speedRatioY: 0 + }; + + for ( var i in options ) { + this.options[i] = options[i]; + } + + this.sizeRatioX = 1; + this.sizeRatioY = 1; + this.maxPosX = 0; + this.maxPosY = 0; + + if ( this.options.interactive ) { + if ( !this.options.disableTouch ) { + utils.addEvent(this.indicator, 'touchstart', this); + utils.addEvent(window, 'touchend', this); + } + if ( !this.options.disablePointer ) { + utils.addEvent(this.indicator, utils.prefixPointerEvent('pointerdown'), this); + utils.addEvent(window, utils.prefixPointerEvent('pointerup'), this); + } + if ( !this.options.disableMouse ) { + utils.addEvent(this.indicator, 'mousedown', this); + utils.addEvent(window, 'mouseup', this); + } + } + + if ( this.options.fade ) { + this.wrapperStyle[utils.style.transform] = this.scroller.translateZ; + this.wrapperStyle[utils.style.transitionDuration] = utils.isBadAndroid ? '0.001s' : '0ms'; + this.wrapperStyle.opacity = '0'; + } +} + +Indicator.prototype = { + handleEvent: function (e) { + switch ( e.type ) { + case 'touchstart': + case 'pointerdown': + case 'MSPointerDown': + case 'mousedown': + this._start(e); + break; + case 'touchmove': + case 'pointermove': + case 'MSPointerMove': + case 'mousemove': + this._move(e); + break; + case 'touchend': + case 'pointerup': + case 'MSPointerUp': + case 'mouseup': + case 'touchcancel': + case 'pointercancel': + case 'MSPointerCancel': + case 'mousecancel': + this._end(e); + break; + } + }, + + destroy: function () { + if ( this.options.interactive ) { + utils.removeEvent(this.indicator, 'touchstart', this); + utils.removeEvent(this.indicator, utils.prefixPointerEvent('pointerdown'), this); + utils.removeEvent(this.indicator, 'mousedown', this); + + utils.removeEvent(window, 'touchmove', this); + utils.removeEvent(window, utils.prefixPointerEvent('pointermove'), this); + utils.removeEvent(window, 'mousemove', this); + + utils.removeEvent(window, 'touchend', this); + utils.removeEvent(window, utils.prefixPointerEvent('pointerup'), this); + utils.removeEvent(window, 'mouseup', this); + } + + if ( this.options.defaultScrollbars ) { + this.wrapper.parentNode.removeChild(this.wrapper); + } + }, + + _start: function (e) { + var point = e.touches ? e.touches[0] : e; + + e.preventDefault(); + e.stopPropagation(); + + this.transitionTime(); + + this.initiated = true; + this.moved = false; + this.lastPointX = point.pageX; + this.lastPointY = point.pageY; + + this.startTime = utils.getTime(); + + if ( !this.options.disableTouch ) { + utils.addEvent(window, 'touchmove', this); + } + if ( !this.options.disablePointer ) { + utils.addEvent(window, utils.prefixPointerEvent('pointermove'), this); + } + if ( !this.options.disableMouse ) { + utils.addEvent(window, 'mousemove', this); + } + + this.scroller._execEvent('beforeScrollStart'); + }, + + _move: function (e) { + var point = e.touches ? e.touches[0] : e, + deltaX, deltaY, + newX, newY, + timestamp = utils.getTime(); + + if ( !this.moved ) { + this.scroller._execEvent('scrollStart'); + } + + this.moved = true; + + deltaX = point.pageX - this.lastPointX; + this.lastPointX = point.pageX; + + deltaY = point.pageY - this.lastPointY; + this.lastPointY = point.pageY; + + newX = this.x + deltaX; + newY = this.y + deltaY; + + this._pos(newX, newY); + +// INSERT POINT: indicator._move + + e.preventDefault(); + e.stopPropagation(); + }, + + _end: function (e) { + if ( !this.initiated ) { + return; + } + + this.initiated = false; + + e.preventDefault(); + e.stopPropagation(); + + utils.removeEvent(window, 'touchmove', this); + utils.removeEvent(window, utils.prefixPointerEvent('pointermove'), this); + utils.removeEvent(window, 'mousemove', this); + + if ( this.scroller.options.snap ) { + var snap = this.scroller._nearestSnap(this.scroller.x, this.scroller.y); + + var time = this.options.snapSpeed || Math.max( + Math.max( + Math.min(Math.abs(this.scroller.x - snap.x), 1000), + Math.min(Math.abs(this.scroller.y - snap.y), 1000) + ), 300); + + if ( this.scroller.x != snap.x || this.scroller.y != snap.y ) { + this.scroller.directionX = 0; + this.scroller.directionY = 0; + this.scroller.currentPage = snap; + this.scroller.scrollTo(snap.x, snap.y, time, this.scroller.options.bounceEasing); + } + } + + if ( this.moved ) { + this.scroller._execEvent('scrollEnd'); + } + }, + + transitionTime: function (time) { + time = time || 0; + this.indicatorStyle[utils.style.transitionDuration] = time + 'ms'; + + if ( !time && utils.isBadAndroid ) { + this.indicatorStyle[utils.style.transitionDuration] = '0.001s'; + } + }, + + transitionTimingFunction: function (easing) { + this.indicatorStyle[utils.style.transitionTimingFunction] = easing; + }, + + refresh: function () { + this.transitionTime(); + + if ( this.options.listenX && !this.options.listenY ) { + this.indicatorStyle.display = this.scroller.hasHorizontalScroll ? 'block' : 'none'; + } else if ( this.options.listenY && !this.options.listenX ) { + this.indicatorStyle.display = this.scroller.hasVerticalScroll ? 'block' : 'none'; + } else { + this.indicatorStyle.display = this.scroller.hasHorizontalScroll || this.scroller.hasVerticalScroll ? 'block' : 'none'; + } + + if ( this.scroller.hasHorizontalScroll && this.scroller.hasVerticalScroll ) { + utils.addClass(this.wrapper, 'iScrollBothScrollbars'); + utils.removeClass(this.wrapper, 'iScrollLoneScrollbar'); + + if ( this.options.defaultScrollbars && this.options.customStyle ) { + if ( this.options.listenX ) { + this.wrapper.style.right = '8px'; + } else { + this.wrapper.style.bottom = '8px'; + } + } + } else { + utils.removeClass(this.wrapper, 'iScrollBothScrollbars'); + utils.addClass(this.wrapper, 'iScrollLoneScrollbar'); + + if ( this.options.defaultScrollbars && this.options.customStyle ) { + if ( this.options.listenX ) { + this.wrapper.style.right = '2px'; + } else { + this.wrapper.style.bottom = '2px'; + } + } + } + + var r = this.wrapper.offsetHeight; // force refresh + + if ( this.options.listenX ) { + this.wrapperWidth = this.wrapper.clientWidth; + if ( this.options.resize ) { + this.indicatorWidth = Math.max(Math.round(this.wrapperWidth * this.wrapperWidth / (this.scroller.scrollerWidth || this.wrapperWidth || 1)), 8); + this.indicatorStyle.width = this.indicatorWidth + 'px'; + } else { + this.indicatorWidth = this.indicator.clientWidth; + } + + this.maxPosX = this.wrapperWidth - this.indicatorWidth; + + if ( this.options.shrink == 'clip' ) { + this.minBoundaryX = -this.indicatorWidth + 8; + this.maxBoundaryX = this.wrapperWidth - 8; + } else { + this.minBoundaryX = 0; + this.maxBoundaryX = this.maxPosX; + } + + this.sizeRatioX = this.options.speedRatioX || (this.scroller.maxScrollX && (this.maxPosX / this.scroller.maxScrollX)); + } + + if ( this.options.listenY ) { + this.wrapperHeight = this.wrapper.clientHeight; + if ( this.options.resize ) { + this.indicatorHeight = Math.max(Math.round(this.wrapperHeight * this.wrapperHeight / (this.scroller.scrollerHeight || this.wrapperHeight || 1)), 8); + this.indicatorStyle.height = this.indicatorHeight + 'px'; + } else { + this.indicatorHeight = this.indicator.clientHeight; + } + + this.maxPosY = this.wrapperHeight - this.indicatorHeight; + + if ( this.options.shrink == 'clip' ) { + this.minBoundaryY = -this.indicatorHeight + 8; + this.maxBoundaryY = this.wrapperHeight - 8; + } else { + this.minBoundaryY = 0; + this.maxBoundaryY = this.maxPosY; + } + + this.maxPosY = this.wrapperHeight - this.indicatorHeight; + this.sizeRatioY = this.options.speedRatioY || (this.scroller.maxScrollY && (this.maxPosY / this.scroller.maxScrollY)); + } + + this.updatePosition(); + }, + + updatePosition: function () { + var x = this.options.listenX && Math.round(this.sizeRatioX * this.scroller.x) || 0, + y = this.options.listenY && Math.round(this.sizeRatioY * this.scroller.y) || 0; + + if ( !this.options.ignoreBoundaries ) { + if ( x < this.minBoundaryX ) { + if ( this.options.shrink == 'scale' ) { + this.width = Math.max(this.indicatorWidth + x, 8); + this.indicatorStyle.width = this.width + 'px'; + } + x = this.minBoundaryX; + } else if ( x > this.maxBoundaryX ) { + if ( this.options.shrink == 'scale' ) { + this.width = Math.max(this.indicatorWidth - (x - this.maxPosX), 8); + this.indicatorStyle.width = this.width + 'px'; + x = this.maxPosX + this.indicatorWidth - this.width; + } else { + x = this.maxBoundaryX; + } + } else if ( this.options.shrink == 'scale' && this.width != this.indicatorWidth ) { + this.width = this.indicatorWidth; + this.indicatorStyle.width = this.width + 'px'; + } + + if ( y < this.minBoundaryY ) { + if ( this.options.shrink == 'scale' ) { + this.height = Math.max(this.indicatorHeight + y * 3, 8); + this.indicatorStyle.height = this.height + 'px'; + } + y = this.minBoundaryY; + } else if ( y > this.maxBoundaryY ) { + if ( this.options.shrink == 'scale' ) { + this.height = Math.max(this.indicatorHeight - (y - this.maxPosY) * 3, 8); + this.indicatorStyle.height = this.height + 'px'; + y = this.maxPosY + this.indicatorHeight - this.height; + } else { + y = this.maxBoundaryY; + } + } else if ( this.options.shrink == 'scale' && this.height != this.indicatorHeight ) { + this.height = this.indicatorHeight; + this.indicatorStyle.height = this.height + 'px'; + } + } + + this.x = x; + this.y = y; + + if ( this.scroller.options.useTransform ) { + this.indicatorStyle[utils.style.transform] = 'translate(' + x + 'px,' + y + 'px)' + this.scroller.translateZ; + } else { + this.indicatorStyle.left = x + 'px'; + this.indicatorStyle.top = y + 'px'; + } + }, + + _pos: function (x, y) { + if ( x < 0 ) { + x = 0; + } else if ( x > this.maxPosX ) { + x = this.maxPosX; + } + + if ( y < 0 ) { + y = 0; + } else if ( y > this.maxPosY ) { + y = this.maxPosY; + } + + x = this.options.listenX ? Math.round(x / this.sizeRatioX) : this.scroller.x; + y = this.options.listenY ? Math.round(y / this.sizeRatioY) : this.scroller.y; + + this.scroller.scrollTo(x, y); + }, + + fade: function (val, hold) { + if ( hold && !this.visible ) { + return; + } + + clearTimeout(this.fadeTimeout); + this.fadeTimeout = null; + + var time = val ? 250 : 500, + delay = val ? 0 : 300; + + val = val ? '1' : '0'; + + this.wrapperStyle[utils.style.transitionDuration] = time + 'ms'; + + this.fadeTimeout = setTimeout((function (val) { + this.wrapperStyle.opacity = val; + this.visible = +val; + }).bind(this, val), delay); + } +}; + +IScroll.utils = utils; + +if ( typeof module != 'undefined' && module.exports ) { + module.exports = IScroll; +} else { + window.IScroll = IScroll; +} + +})(window, document, Math); \ No newline at end of file diff --git a/list.js b/list.js new file mode 100644 index 00000000..45cd1d46 --- /dev/null +++ b/list.js @@ -0,0 +1,111 @@ +var list; +var toSend = ""; +var sendURL; +var myScroll; +var scroller = false; +var showToggle =true; +var chan = $("#chan").html(); + +function updateList() +{ + console.log("updating list"); + list = $.ajax({ type: "GET", + url: "change.php", + async: false + }).responseText; + list = $.parseJSON(list); + list[0].shift(); + list[3].shift(); + list[2].shift(); + + setTimeout(function() + { + + $("#wrapper").empty(); + + $.each(list[0], function(j, listeID){ + + var video_title=list[3][j].replace(/\\\'/, "'"); + var video_id = list[0][j]; + var video_thumb = "http://i.ytimg.com/vi/"+video_id+"/default.jpg"; + var odd = ""; if(j%2==0)odd=" oddlist"; + var finalhtml="
"+ + ""+ + "
"+video_title+"
"+ + "
"+list[2][j]+"+-
"+ + "
"; + $("#wrapper").append(finalhtml); + }); + if($("#playlist").height() > $("#player").height()) + { + if(!window.mobilecheck()){ $("#playlist").css({height: $("#player").height() - $("#buttons").height()-4});} + if(scroller == false) + { + myScroll = new IScroll('#playlist', { + mouseWheel: true, + scrollbars: false, + scrollY: true, + interactiveScrollbars: false + }); + scroller = true; + }else + { + myScroll.refresh(); + } + + } + if(window.mobilecheck()) + { + document.getElementById("player").style.display="none"; + ytplayer.pauseVideo(); + } + }, 2500); +} + +function vote(id, vote){ + console.log($.ajax({ + type: "GET", + url: "change.php", + async: false, + data: "vote="+vote+"&id="+id, + success: function() { + console.log("voted "+vote+" on "+id); + if(vote=="pos"){ $("#playlist").addClass("success");} + else{ $("#playlist").addClass("error");} + }, + }).responseText); + setTimeout(function(){ + $("#playlist").removeClass("success"); + $("#playlist").removeClass("error"); + },1500); +} + +function skip(){ + console.log($.ajax({ + type: "GET", + url: "change.php", + async: false, + data: "skip", + success: function() { + console.log("voted to skip song"); + $("#buttons").addClass("success"); + }, + }).responseText); + setTimeout(function(){ + $("#playlist").removeClass("success"); + },1500); +} + +function show(){ + if(showToggle){ + showToggle=false; + $("#toptitle").empty(); + $("#chan").addClass("bigChan"); + $("#chan").html("zoff.no/"+chan); + }else{ + showToggle=true; + $("#toptitle").html("Zöff"); + $("#chan").removeClass("bigChan"); + $("#chan").html(chan); + } +} \ No newline at end of file diff --git a/lists/index.php b/lists/index.php new file mode 100644 index 00000000..e69de29b diff --git a/nochan.php b/nochan.php new file mode 100644 index 00000000..b5ae2219 --- /dev/null +++ b/nochan.php @@ -0,0 +1,40 @@ + +Zöff +
+ +
+ +
Channels:
+ ".$channel.""; + } + ?> +
+ + + + \ No newline at end of file diff --git a/save.php b/save.php deleted file mode 100644 index 8fef94e1..00000000 --- a/save.php +++ /dev/null @@ -1,23 +0,0 @@ - \ No newline at end of file diff --git a/save.sublime-workspace b/save.sublime-workspace deleted file mode 100644 index de2d181b..00000000 --- a/save.sublime-workspace +++ /dev/null @@ -1,154 +0,0 @@ -{ - "auto_complete": - { - "selected_items": - [ - ] - }, - "buffers": - [ - ], - "build_system": "", - "command_palette": - { - "height": 0.0, - "selected_items": - [ - ], - "width": 0.0 - }, - "console": - { - "height": 0.0, - "history": - [ - ] - }, - "distraction_free": - { - "menu_visible": true, - "show_minimap": false, - "show_open_files": false, - "show_tabs": false, - "side_bar_visible": false, - "status_bar_visible": false - }, - "file_history": - [ - ], - "find": - { - "height": 0.0 - }, - "find_in_files": - { - "height": 0.0, - "where_history": - [ - ] - }, - "find_state": - { - "case_sensitive": false, - "find_history": - [ - ], - "highlight": true, - "in_selection": false, - "preserve_case": false, - "regex": false, - "replace_history": - [ - ], - "reverse": false, - "show_context": true, - "use_buffer2": true, - "whole_word": false, - "wrap": true - }, - "groups": - [ - { - "sheets": - [ - ] - } - ], - "incremental_find": - { - "height": 0.0 - }, - "input": - { - "height": 0.0 - }, - "layout": - { - "cells": - [ - [ - 0, - 0, - 1, - 1 - ] - ], - "cols": - [ - 0.0, - 1.0 - ], - "rows": - [ - 0.0, - 1.0 - ] - }, - "menu_visible": true, - "output.find_results": - { - "height": 0.0 - }, - "project": "save.sublime-project", - "replace": - { - "height": 0.0 - }, - "save_all_on_build": true, - "select_file": - { - "height": 0.0, - "selected_items": - [ - ], - "width": 0.0 - }, - "select_project": - { - "height": 0.0, - "selected_items": - [ - ], - "width": 0.0 - }, - "select_symbol": - { - "height": 0.0, - "selected_items": - [ - ], - "width": 0.0 - }, - "settings": - { - }, - "show_minimap": true, - "show_open_files": false, - "show_tabs": true, - "side_bar_visible": true, - "side_bar_width": 150.0, - "status_bar_visible": true, - "template_settings": - { - } -} diff --git a/search.js b/search.js new file mode 100644 index 00000000..d07bfdae --- /dev/null +++ b/search.js @@ -0,0 +1,95 @@ +$(document).ready(function() + { + + $("#search").focus(); + + $('#base').bind("keyup keypress", function(e) { + var code = e.keyCode || e.which; + if (code == 13) { + e.preventDefault(); + return false; + } + }); + var old_input=""; + $(".search_input").focus(); + setTimeout(function(){ + $(".search_input").keyup(function() + { + var search_input = $(this).val(); + if(search_input != old_input){ + old_input=search_input; + $("#results").html(''); + if(search_input != ""){ + var keyword= encodeURIComponent(search_input); + + var yt_url='http://gdata.youtube.com/feeds/api/videos?q='+keyword+'&format=5&max-results=25&v=2&alt=jsonc'; + + + $.ajax({ + type: "GET", + url: yt_url, + dataType:"jsonp", + success: function(response) + { + if(response.data.items) + { + $.each(response.data.items, function(i,data) + { + if(data.duration > 720){return;} + var video_title=encodeURIComponent(data.title).replace(/'/g, "\\\'"); + var views=data.viewCount; + var video_thumb = "http://i.ytimg.com/vi/"+data.id+"/default.jpg"; + var length = Math.floor(data.duration/60)+":"+(data.duration-Math.floor(data.duration / 60)*60); + var finalhtml="
"+ + ""+ + "
"+data.title+""+ + ""+data.uploader+" • "+views+" views • "+length+"
"; + + $("#results").append(finalhtml); + + }); + + + } + else + { + $("#video").html("
No Video
"); + } + } + + }); + } + } + }); + }, 300); + }); + + function submit(id,title){ + console.log($.ajax({ + type: "GET", + url: "change.php", + async: false, + data: "v="+id+"&n="+title, + success: function() { + console.log("added "+id); + document.getElementById("search").value = ""; + $("#search").addClass("success"); + $("#results").html(''); + }, + error: function(){ + console.log("error in adding"); + document.getElementById("search").value = ""; + $("#search").addClass("error"); + $("#results").html(''); + } + }).responseText); + + $("#search").focus(); + + setTimeout(function(){ + $("#search").removeClass("success"); + $("#search").removeClass("error"); + },1500); + } + + // if(reply=="added"){$("#search").removeClass('success'); $("#search").addClass('success');} diff --git a/static/Logo.png b/static/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c9659e0bec61e458a39f4f1792c3aaf4e2ba834a GIT binary patch literal 37206 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 dtsO6W1g~~hMGjBx+NrORqJH$+{{yDG5^?|l literal 0 HcmV?d00001 diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..21441bba2807cc50da0855429ef425f589edcf30 GIT binary patch literal 1684 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 lF$l+4K* diff --git a/videos.json b/videos.json deleted file mode 100644 index 2040e3d4..00000000 --- a/videos.json +++ /dev/null @@ -1 +0,0 @@ -["E37prdzWME4", "vYkwNZJJc4s", "Oi2jIyeTI3g"] \ No newline at end of file diff --git a/videos.php b/videos.php new file mode 100644 index 00000000..f1dda2cf --- /dev/null +++ b/videos.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/visualize.js b/visualize.js new file mode 100644 index 00000000..a8172e1c --- /dev/null +++ b/visualize.js @@ -0,0 +1,5 @@ +/*$(document).ready(function() +{ + context = new AudioContext(); + src = context.createMediaElementSource($('#player video')); +}*/ \ No newline at end of file diff --git a/youtube.js b/youtube.js new file mode 100644 index 00000000..b330aaef --- /dev/null +++ b/youtube.js @@ -0,0 +1,280 @@ +/* +This is the youtube player sync and control file. + +Fetcher sangen som spilles fra JSON filen + +*/ + +var timeDifference; +var wasPaused; +var beginning; +var diffVideo; +var serverTime; +var url; +var response; +var url +var tag +var firstScriptTag; +var ytplayer; +var syncInterval; +var title; +var interval; +var viewers; +var changed = false; + +$(document).ready(function() +{ + window.mobilecheck = function() { + var check = false; + (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera); + return check; } + + updateList(); + timeDifference; + wasPaused = false; + beginning = true; + diffVideo = false; + interval = false; + response = $.ajax({ type: "GET", + url: "change.php", + async: false + }).responseText; + + url = $.parseJSON(response); + + $.ajax({ + type: 'get', + url: 'timedifference.php', + data: "abcde", + async: false, + success: function(data) { + timeDifference = $.parseJSON(data); + } + }); + console.log("timediff:"+timeDifference[0]); + + response = url[0][0]; + + tag = document.createElement('script'); + tag.src = "https://www.youtube.com/iframe_api"; + firstScriptTag = document.getElementsByTagName('script')[0]; + firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); + syncInterval = setInterval(getTime, 5000); + listInterval = setInterval(updateList, 10000); + if(window.mobilecheck()){document.getElementById("search").blur();} +}); + +function onYouTubeIframeAPIReady() { + ytplayer = new YT.Player('player', { + height: window.height*0.75, + width: window.width*0.6, + videoId: response, + playerVars: { controls: "1" , iv_load_policy: "3", theme:"light", rel:"0", color:"white" }, + events: { + 'onReady': onPlayerReady, + 'onStateChange': onPlayerStateChange, + 'onError': errorHandler + } + }); +} + +/** + +Legger sangen inn i
en, via swfobject + + +var params = { allowScriptAccess: "always"}; +var atts = { id: "myytplayer" }; +swfobject.embedSWF("http://www.youtube.com/v/"+response+"?enablejsapi=1&playerapiid=ytplayer&version=3&controls=1&iv_load_policy=3", + "ytapiplayer", "825", "462", "8", null, null, params, atts); + + +eventlistener for når playeren endres +*/ +function onPlayerStateChange(newState) { + console.log("new state: "+newState.data); + console.log("beginning: "+beginning); + //ytplayer.seekTo(15); + if((newState.data == 0 && checkEnd()) || (newState.data == 1 && checkEnd())) + { + console.log("nummer 1"); + startNextSong(); + ytplayer.pauseVideo(); + }else if(newState.data == 1 && (wasPaused && !beginning)) + { + console.log("unpaused"); + beginning = false; + wasPaused = false; + getTime(); + }else if(newState.data == 2) + { + clearInterval(syncInterval); + interval = true; + wasPaused = true; + beginning = false; + } +} + +function checkEnd() +{ + console.log("sjekker om brukeren spolte"); + $.ajax({ + type: 'get', + url: 'timedifference.php', + data: "abcde", + async: false, + success: function(data) { + timeDifference = $.parseJSON(data); + } + }); + if(parseInt(timeDifference[0]) > ytplayer.getDuration()) + { + return true; + } + return false; +} + +function startNextSong() +{ + clearInterval(syncInterval); + //console.log(getTime()); + if(checkEnd() && !changed) + { + setTimeout(function(){ + response = $.ajax({ + type: "POST", + url: "change.php", + async: false, + data: "thisUrl="+response+"&act=save", + + success: function() { + console.log("saved song-switch - "+response); + } + }).responseText; + + console.log("next video: "+response); + getTitle(response); + ytplayer.loadVideoById(response); + beginning = true; + syncInterval = setInterval(getTime, 5000); + },2500); + updateList(); + changed = true + setTimeout(function() { + changed = false; + }, 2500); + } +} + +function getTime() +{ + if(!wasPaused) + { + console.log("sjekker om brukeren spolte"); + + $.ajax({ + type: 'get', + url: 'timedifference.php', + data: "abcde", + async: false, + success: function(data) { + timeDifference = $.parseJSON(data); + } + }); + console.log("current song: "+response); + console.log("song in database: "+timeDifference[1]); + if(parseInt(timeDifference[2]) + 1> ytplayer.getCurrentTime() + parseInt(timeDifference[3]) && ytplayer.getPlayerState() == 0) + { + return true; + }else if(ytplayer.getCurrentTime() + parseInt(timeDifference[3]) > parseInt(timeDifference[2]) + 5 || (ytplayer.getCurrentTime() + parseInt(timeDifference[3]) < parseInt(timeDifference[2]) - 5 && ytplayer.getPlayerState() != 0 && ytplayer.getPlayerState() != 3)) + { + if(parseInt(timeDifference[0]) > ytplayer.getDuration()) + { + console.log("burde ikke søke, men hoppe til neste sang"); + } + ytplayer.seekTo(timeDifference[0]); + ytplayer.pauseVideo(); + ytplayer.playVideo(); + getTitle(); + return false; + } + //if(interval){syncInterval = setInterval(getTime, 5000);interval = false;} + + if(response != timeDifference[1]) + { + clearInterval(syncInterval); + console.log("forskjellige videoer!!"); + ytplayer.pauseVideo(); + ytplayer.loadVideoById(timeDifference[1]); + setTimeout(function(){ + //console.log(response); + diffVideo = true; + beginning = true; + $.ajax({ + type: "POST", + url: "change.php", + async: false, + data: "thisUrl=123abcprompeprompe&act=save", + success: function(data) + { + response = timeDifference[1]; + getTitle(); + } + }); + syncInterval = setInterval(getTime, 5000); + },2500); + } + } +} + +function getTitle() +{ + $.ajax({ type: "GET", + url: "timedifference.php", + async: false, + success: function(data) { + viewers = $.parseJSON(data); + var outPutWord = viewers[5] > 1 ? "viewers" : "viewer"; + var title= viewers[4].replace(/\\\'/, "'"); + document.title = viewers[4] + " • Zöff"; + document.getElementsByName('v')[0].placeholder = viewers[4] + " • " + viewers[5] + " " + outPutWord; + } + }); + +} + +function errorHandler(newState) +{ + setTimeout(function(){ + response = $.ajax({ + type: "POST", + url: "change.php", + async: false, + data: "thisUrl="+response+"&act=delete", + + success: function() { + console.log("error! deleted video"); + } + }).responseText; + ytplayer.loadVideoById(response); + },2500); +/* + setTimeout(function(){ + response = $.ajax({ type: "GET", + url: "change.php", + async: false + }).responseText; + var url = $.parseJSON(response); + response = url[0][0]; + + ytplayer.loadVideoById(response); + },2500);*/ +} +function onPlayerReady(event) { + //ytplayer = document.getElementById("myytplayer"); + // ytplayer.addEventListener("onStateChange", "onytplayerStateChange"); + //ytplayer.addEventListener("onError", "errorHandler"); + getTime(); + ytplayer.playVideo(); + getTitle(); + } \ No newline at end of file