From 9e80c715854bae0ca3504398c81d88b2fbf3ab6b Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Sat, 29 Dec 2012 16:53:34 +0100 Subject: [PATCH] lobby filter UI --- app/controllers/Lobby.scala | 2 +- app/controllers/Setup.scala | 18 +++++++--- app/lobby/HookRepo.scala | 2 +- app/lobby/MessageRepo.scala | 2 +- app/lobby/Preload.scala | 6 ++-- app/setup/FilterConfig.scala | 2 +- app/setup/UserConfigRepo.scala | 3 +- app/templating/AssetHelper.scala | 2 +- app/ui/LobbyMenu.scala | 10 +----- app/views/lobby/buttons.scala.html | 2 +- app/views/lobby/home.scala.html | 4 +++ app/views/setup/filter.scala.html | 18 +++++----- public/javascripts/big.js | 45 +++++++++++++++++++++++-- public/javascripts/deps.min.js | 28 ++-------------- public/stylesheets/opening.css | 54 +++++++++++++++++++++++++++++- 15 files changed, 134 insertions(+), 64 deletions(-) diff --git a/app/controllers/Lobby.scala b/app/controllers/Lobby.scala index 6f4f698e4f..d9305307c1 100644 --- a/app/controllers/Lobby.scala +++ b/app/controllers/Lobby.scala @@ -41,7 +41,7 @@ object Lobby extends LilaController with Results { filter = env.setup.filter ).map(_.fold(Redirect(_), { case (preload, posts, tours, featured) ⇒ status(html.lobby.home( - toJson(preload).pp, + toJson(preload), myHook, posts, tours, diff --git a/app/controllers/Setup.scala b/app/controllers/Setup.scala index 7e7aecc964..6b9f44f77b 100644 --- a/app/controllers/Setup.scala +++ b/app/controllers/Setup.scala @@ -52,12 +52,20 @@ object Setup extends LilaController with TheftPrevention with RoundEventPerforme } } - val filterForm = Open { implicit ctx ⇒ - IOk(forms.filterFilled map { html.setup.filter(_) }) + val filterForm = Auth { implicit ctx ⇒ + me ⇒ + IOk(forms.filterFilled map { html.setup.filter(_) }) } - val filter = process(forms.filter) { config ⇒ - implicit ctx ⇒ processor filter config inject routes.Lobby.home() + val filter = AuthBody { implicit ctx ⇒ + me ⇒ + implicit val req = ctx.body + IOResult { + forms.filter(ctx).bindFromRequest.fold( + f ⇒ putStrLn(f.errors.toString) inject BadRequest(), + config ⇒ processor filter config inject JsonOk(config.render) + ) + } } def join(id: String) = Open { implicit ctx ⇒ @@ -108,7 +116,7 @@ object Setup extends LilaController with TheftPrevention with RoundEventPerforme OpenBody { ctx ⇒ implicit val req = ctx.body IORedirect(form(ctx).bindFromRequest.fold( - f ⇒ putStrLn(f.errors.toString) map { _ ⇒ routes.Lobby.home }, + f ⇒ putStrLn(f.errors.toString) inject routes.Lobby.home, config ⇒ op(config)(ctx) )) } diff --git a/app/lobby/HookRepo.scala b/app/lobby/HookRepo.scala index 3c2ebb9ad2..da4e79c747 100644 --- a/app/lobby/HookRepo.scala +++ b/app/lobby/HookRepo.scala @@ -11,7 +11,7 @@ import scalaz.effects._ import org.joda.time.DateTime import org.scala_tools.time.Imports._ -class HookRepo(collection: MongoCollection) +final class HookRepo(collection: MongoCollection) extends SalatDAO[Hook, String](collection) { def hook(hookId: String): IO[Option[Hook]] = io { diff --git a/app/lobby/MessageRepo.scala b/app/lobby/MessageRepo.scala index 87a062d5fd..659cfed12c 100644 --- a/app/lobby/MessageRepo.scala +++ b/app/lobby/MessageRepo.scala @@ -6,7 +6,7 @@ import com.mongodb.casbah.MongoCollection import com.mongodb.casbah.query.Imports._ import scalaz.effects._ -final class MessageRepo(collection: MongoCollection, max: Int) +private[lobby] final class MessageRepo(collection: MongoCollection, max: Int) extends CappedRepo[Message](collection, max) { val all = io { diff --git a/app/lobby/Preload.scala b/app/lobby/Preload.scala index 5b7143d722..2a1be85a55 100644 --- a/app/lobby/Preload.scala +++ b/app/lobby/Preload.scala @@ -17,7 +17,7 @@ import akka.util.duration._ import akka.util.Timeout import scalaz.effects._ -final class Preload( +private[lobby] final class Preload( fisherman: Fisherman, history: History, hookRepo: HookRepo, @@ -54,10 +54,10 @@ final class Preload( ioToFuture(filter) map { case ((((((hooks, messages), entries), posts), tours), feat), filter) ⇒ (Right((Map( "version" -> history.version, - "pool" -> renderHooks(hooks, myHook), + "pool" -> renderHooks(hooks, myHook).pp, "chat" -> (messages.reverse map (_.render)), "timeline" -> (entries.reverse map (_.render)), - "filter" -> filter.toMap + "filter" -> filter.render ), posts, tours, feat))): Response } ) diff --git a/app/setup/FilterConfig.scala b/app/setup/FilterConfig.scala index 6b2aece897..985c9950f6 100644 --- a/app/setup/FilterConfig.scala +++ b/app/setup/FilterConfig.scala @@ -12,7 +12,7 @@ case class FilterConfig(variant: Option[Variant]) { def >> = Some((variant map (_.id))) - def toMap = Map("variant" -> variant.map(_.id)) + def render = Map("variant" -> variant.map(_.toString)) } object FilterConfig { diff --git a/app/setup/UserConfigRepo.scala b/app/setup/UserConfigRepo.scala index 4b5b37f6cd..5131d5fc4a 100644 --- a/app/setup/UserConfigRepo.scala +++ b/app/setup/UserConfigRepo.scala @@ -24,7 +24,8 @@ private[setup] final class UserConfigRepo(collection: MongoCollection) def filter(user: User): IO[FilterConfig] = io { for { obj ← collection.findOneByID(user.id, DBObject("filter" -> true)) - variant ← obj.getAs[Int]("v") + filter ← obj.getAs[DBObject]("filter") + variant ← filter.getAs[Int]("v") config ← RawFilterConfig(variant).decode } yield config } map (_ | FilterConfig.default) diff --git a/app/templating/AssetHelper.scala b/app/templating/AssetHelper.scala index e53b1dba0f..e4b26e3c84 100644 --- a/app/templating/AssetHelper.scala +++ b/app/templating/AssetHelper.scala @@ -7,7 +7,7 @@ import play.api.templates.Html trait AssetHelper { - val assetVersion = 23 + val assetVersion = 24 def cssTag(name: String) = css("stylesheets/" + name) diff --git a/app/ui/LobbyMenu.scala b/app/ui/LobbyMenu.scala index 2a13b9bf72..4c53fc8623 100644 --- a/app/ui/LobbyMenu.scala +++ b/app/ui/LobbyMenu.scala @@ -33,13 +33,5 @@ final class LobbyMenu(i18nKeys: I18nKeys) { i18nKeys.playWithTheMachine, i18nKeys.challengeTheArtificialIntelligence) - val filter = new Elem( - "filter", - routes.Setup.filterForm, - i18nKeys.filterGames, - i18nKeys.filterGames) - - val allAnon = List(hook, friend, ai) - - val allUser = allAnon :+ filter + val all = List(hook, friend, ai) } diff --git a/app/views/lobby/buttons.scala.html b/app/views/lobby/buttons.scala.html index 20c9fe6f19..9a023cc5a0 100644 --- a/app/views/lobby/buttons.scala.html +++ b/app/views/lobby/buttons.scala.html @@ -2,7 +2,7 @@
- @ctx.isAuth.fold(lobbyMenu.allUser, lobbyMenu.allAnon).map { b => + @lobbyMenu.all.map { b => @b.name() }
diff --git a/app/views/lobby/home.scala.html b/app/views/lobby/home.scala.html index ef6b2b96c6..c0a3b4a5ca 100644 --- a/app/views/lobby/home.scala.html +++ b/app/views/lobby/home.scala.html @@ -51,6 +51,10 @@ underchat = underchat.some) { @board.white() @widget.connection()
+ @if(ctx.isAuth) { + @trans.filterGames() +
+ }
-

@trans.filterGames()

-
- @helper.form(action = routes.Setup.filter, 'novalidate -> "novalidate") { -
- @base.select(form("variant"), translatedVariantChoices, "Any variant".some) -
- - } -
+@helper.form(action = routes.Setup.filter(), 'novalidate -> "novalidate") { +
+ @base.select(form("variant"), translatedVariantChoices, "Any variant".some)
+
+ Reset + +
+} diff --git a/public/javascripts/big.js b/public/javascripts/big.js index c9228609aa..1ab4deb715 100644 --- a/public/javascripts/big.js +++ b/public/javascripts/big.js @@ -1520,6 +1520,36 @@ $(function() { var myElo = isRegistered ? parseInt($userTag.data('elo')) : null; var hookOwnerId = $hooks.data('my-hook'); + $wrap.find('a.filter').click(function() { + $(this).toggleClass('active'); + if($(this).hasClass('active')) { + var $filter = $wrap.find('div.filter').fadeIn(200); + $.ajax({ + url: $(this).attr('href'), + success: function(html) { + $filter.html(html).find('select').change(_.throttle(function() { + var $form = $filter.find('form'); + $.ajax({ + url: $form.attr('action'), + data: $form.serialize(), + type: 'post', + success: function(filter) { + lichess_preload.filter = filter; + updateHookTable(); + } + }); + }, 500)); + $filter.find('a.reset').click(function() { + $filter.find('select').val('').change(); + }); + } + }); + } else { + var $filter = $wrap.find('div.filter').fadeOut(200); + } + return false; + }).click(); + if (chatExists) { var $form = $chat.find('form'); $chat.find('.lichess_messages').scrollable(); @@ -1645,8 +1675,7 @@ $(function() { } function addHooks(hooks) { var html = ""; - for (i in hooks) html += renderHook(hooks[i]); - $hooksTable.append(html); + for (i in hooks) html += $hooksTable.append(renderHook(hooks[i])); updateHookTable(); } function addHook(hook) { @@ -1654,6 +1683,14 @@ $(function() { updateHookTable(); } function updateHookTable() { + var filter = lichess_preload.filter; + $hooksTable.find('tr.hook').each(function() { + var hook = $(this).data('hook'); + var hide = (filter.variant != null && filter.variant != hook.variant); + hide = hide && (hook.action != 'cancel'); + if (hide) $(this).hide(); else $(this).show(); + }); + if (0 == $hooksTable.find('tr.hook').length) { $hooksTable.addClass('empty_table').html(''+$.trans("No game available right now, create one!")+''); } else { @@ -1708,8 +1745,10 @@ $(function() { var cancelParam = hookOwnerId ? "?cancel=" + hookOwnerId : "" html += ''; } + html += ''; } - return html; + html += ''; + return $(html).data('hook', hook); } function resizeLobby() { diff --git a/public/javascripts/deps.min.js b/public/javascripts/deps.min.js index 83aaf674c6..39b3c02aed 100644 --- a/public/javascripts/deps.min.js +++ b/public/javascripts/deps.min.js @@ -92,32 +92,8 @@ function handler(event) { })(jQuery); -// Underscore.js 1.3.3 -(function(){function r(a,c,d){if(a===c)return 0!==a||1/a==1/c;if(null==a||null==c)return a===c;a._chain&&(a=a._wrapped);c._chain&&(c=c._wrapped);if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return!1;switch(e){case "[object String]":return a==""+c;case "[object Number]":return a!=+a?c!=+c:0==a?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source== -c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if("object"!=typeof a||"object"!=typeof c)return!1;for(var f=d.length;f--;)if(d[f]==a)return!0;d.push(a);var f=0,g=!0;if("[object Array]"==e){if(f=a.length,g=f==c.length)for(;f--&&(g=f in a==f in c&&r(a[f],c[f],d)););}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return!1;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&r(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,h)&&!f--)break; -g=!f}}d.pop();return g}var s=this,I=s._,o={},k=Array.prototype,p=Object.prototype,i=k.slice,J=k.unshift,l=p.toString,K=p.hasOwnProperty,y=k.forEach,z=k.map,A=k.reduce,B=k.reduceRight,C=k.filter,D=k.every,E=k.some,q=k.indexOf,F=k.lastIndexOf,p=Array.isArray,L=Object.keys,t=Function.prototype.bind,b=function(a){return new m(a)};"undefined"!==typeof exports?("undefined"!==typeof module&&module.exports&&(exports=module.exports=b),exports._=b):s._=b;b.VERSION="1.3.3";var j=b.each=b.forEach=function(a, -c,d){if(a!=null)if(y&&a.forEach===y)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e2;a==null&&(a=[]);if(A&& -a.reduce===A){e&&(c=b.bind(c,e));return f?a.reduce(c,d):a.reduce(c)}j(a,function(a,b,i){if(f)d=c.call(e,d,a,b,i);else{d=a;f=true}});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(B&&a.reduceRight===B){e&&(c=b.bind(c,e));return f?a.reduceRight(c,d):a.reduceRight(c)}var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=function(a, -c,b){var e;G(a,function(a,g,h){if(c.call(b,a,g,h)){e=a;return true}});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(C&&a.filter===C)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(D&&a.every===D)return a.every(c,b);j(a,function(a,g,h){if(!(e=e&&c.call(b, -a,g,h)))return o});return!!e};var G=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(E&&a.some===E)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return o});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;if(q&&a.indexOf===q)return a.indexOf(c)!=-1;return b=G(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck= -function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a)&&a[0]===+a[0])return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a)&&a[0]===+a[0])return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;bd?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]}; -j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,c,d){d||(d=b.identity);for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1),true);return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a= -i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}};b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=L||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&& -c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.pick=function(a){var c={};j(b.flatten(i.call(arguments,1)),function(b){b in a&&(c[b]=a[b])});return c};b.defaults=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return r(a,b,[])};b.isEmpty= -function(a){if(a==null)return true;if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=p||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};b.isArguments=function(a){return l.call(a)=="[object Arguments]"};b.isArguments(arguments)||(b.isArguments=function(a){return!(!a||!b.has(a,"callee"))});b.isFunction=function(a){return l.call(a)=="[object Function]"}; -b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isFinite=function(a){return b.isNumber(a)&&isFinite(a)};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a, -b){return K.call(a,b)};b.noConflict=function(){s._=I;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.result=function(a,c){if(a==null)return null;var d=a[c];return b.isFunction(d)?d.call(a):d};b.mixin=function(a){j(b.functions(a),function(c){M(c,b[c]=a[c])})};var N=0;b.uniqueId= -function(a){var b=N++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var u=/.^/,n={"\\":"\\","'":"'",r:"\r",n:"\n",t:"\t",u2028:"\u2028",u2029:"\u2029"},v;for(v in n)n[n[v]]=v;var O=/\\|'|\r|\n|\t|\u2028|\u2029/g,P=/\\(\\|'|r|n|t|u2028|u2029)/g,w=function(a){return a.replace(P,function(a,b){return n[b]})};b.template=function(a,c,d){d=b.defaults(d||{},b.templateSettings);a="__p+='"+a.replace(O,function(a){return"\\"+n[a]}).replace(d.escape|| -u,function(a,b){return"'+\n_.escape("+w(b)+")+\n'"}).replace(d.interpolate||u,function(a,b){return"'+\n("+w(b)+")+\n'"}).replace(d.evaluate||u,function(a,b){return"';\n"+w(b)+"\n;__p+='"})+"';\n";d.variable||(a="with(obj||{}){\n"+a+"}\n");var a="var __p='';var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n"+a+"return __p;\n",e=new Function(d.variable||"obj","_",a);if(c)return e(c,b);c=function(a){return e.call(this,a,b)};c.source="function("+(d.variable||"obj")+"){\n"+a+"}";return c}; -b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var x=function(a,c){return c?b(a).chain():a},M=function(a,c){m.prototype[a]=function(){var a=i.call(arguments);J.call(a,this._wrapped);return x(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return x(d, -this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return x(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=true;return this};m.prototype.value=function(){return this._wrapped}}).call(this); +// Underscore.js 1.4.3 +(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,v=e.reduce,h=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,j=i.bind,w=function(n){return n instanceof w?n:this instanceof w?(this._wrapped=n,void 0):new w(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=w),exports._=w):n._=w,w.VERSION="1.4.3";var A=w.each=w.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(w.has(n,a)&&t.call(e,n[a],a,n)===r)return};w.map=w.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e[e.length]=t.call(r,n,u,i)}),e)};var O="Reduce of empty array with no initial value";w.reduce=w.foldl=w.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduce===v)return e&&(t=w.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},w.reduceRight=w.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduceRight===h)return e&&(t=w.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=w.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},w.find=w.detect=function(n,t,r){var e;return E(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},w.filter=w.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&(e[e.length]=n)}),e)},w.reject=function(n,t,r){return w.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},w.every=w.all=function(n,t,e){t||(t=w.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var E=w.some=w.any=function(n,t,e){t||(t=w.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};w.contains=w.include=function(n,t){return null==n?!1:y&&n.indexOf===y?-1!=n.indexOf(t):E(n,function(n){return n===t})},w.invoke=function(n,t){var r=o.call(arguments,2);return w.map(n,function(n){return(w.isFunction(t)?t:n[t]).apply(n,r)})},w.pluck=function(n,t){return w.map(n,function(n){return n[t]})},w.where=function(n,t){return w.isEmpty(t)?[]:w.filter(n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},w.max=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.max.apply(Math,n);if(!t&&w.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>=e.computed&&(e={value:n,computed:a})}),e.value},w.min=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.min.apply(Math,n);if(!t&&w.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;e.computed>a&&(e={value:n,computed:a})}),e.value},w.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=w.random(r++),e[r-1]=e[t],e[t]=n}),e};var F=function(n){return w.isFunction(n)?n:function(t){return t[n]}};w.sortBy=function(n,t,r){var e=F(t);return w.pluck(w.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||void 0===r)return 1;if(e>r||void 0===e)return-1}return n.indexi;){var o=i+a>>>1;u>r.call(e,n[o])?i=o+1:a=o}return i},w.toArray=function(n){return n?w.isArray(n)?o.call(n):n.length===+n.length?w.map(n,w.identity):w.values(n):[]},w.size=function(n){return null==n?0:n.length===+n.length?n.length:w.keys(n).length},w.first=w.head=w.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},w.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},w.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},w.rest=w.tail=w.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},w.compact=function(n){return w.filter(n,w.identity)};var R=function(n,t,r){return A(n,function(n){w.isArray(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r};w.flatten=function(n,t){return R(n,t,[])},w.without=function(n){return w.difference(n,o.call(arguments,1))},w.uniq=w.unique=function(n,t,r,e){w.isFunction(t)&&(e=r,r=t,t=!1);var u=r?w.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:w.contains(a,r))||(a.push(r),i.push(n[e]))}),i},w.union=function(){return w.uniq(c.apply(e,arguments))},w.intersection=function(n){var t=o.call(arguments,1);return w.filter(w.uniq(n),function(n){return w.every(t,function(t){return w.indexOf(t,n)>=0})})},w.difference=function(n){var t=c.apply(e,o.call(arguments,1));return w.filter(n,function(n){return!w.contains(t,n)})},w.zip=function(){for(var n=o.call(arguments),t=w.max(w.pluck(n,"length")),r=Array(t),e=0;t>e;e++)r[e]=w.pluck(n,""+e);return r},w.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},w.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=w.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},w.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},w.range=function(n,t,r){1>=arguments.length&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=Array(e);e>u;)i[u++]=n,n+=r;return i};var I=function(){};w.bind=function(n,t){var r,e;if(n.bind===j&&j)return j.apply(n,o.call(arguments,1));if(!w.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));I.prototype=n.prototype;var u=new I;I.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},w.bindAll=function(n){var t=o.call(arguments,1);return 0==t.length&&(t=w.functions(n)),A(t,function(t){n[t]=w.bind(n[t],n)}),n},w.memoize=function(n,t){var r={};return t||(t=w.identity),function(){var e=t.apply(this,arguments);return w.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},w.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},w.defer=function(n){return w.delay.apply(w,[n,1].concat(o.call(arguments,1)))},w.throttle=function(n,t){var r,e,u,i,a=0,o=function(){a=new Date,u=null,i=n.apply(r,e)};return function(){var c=new Date,l=t-(c-a);return r=this,e=arguments,0>=l?(clearTimeout(u),u=null,a=c,i=n.apply(r,e)):u||(u=setTimeout(o,l)),i}},w.debounce=function(n,t,r){var e,u;return function(){var i=this,a=arguments,o=function(){e=null,r||(u=n.apply(i,a))},c=r&&!e;return clearTimeout(e),e=setTimeout(o,t),c&&(u=n.apply(i,a)),u}},w.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},w.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},w.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},w.after=function(n,t){return 0>=n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},w.keys=_||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)w.has(n,r)&&(t[t.length]=r);return t},w.values=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push(n[r]);return t},w.pairs=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push([r,n[r]]);return t},w.invert=function(n){var t={};for(var r in n)w.has(n,r)&&(t[n[r]]=r);return t},w.functions=w.methods=function(n){var t=[];for(var r in n)w.isFunction(n[r])&&t.push(r);return t.sort()},w.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},w.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},w.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)w.contains(r,u)||(t[u]=n[u]);return t},w.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)null==n[r]&&(n[r]=t[r])}),n},w.clone=function(n){return w.isObject(n)?w.isArray(n)?n.slice():w.extend({},n):n},w.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof w&&(n=n._wrapped),t instanceof w&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==t+"";case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;r.push(n),e.push(t);var a=0,o=!0;if("[object Array]"==u){if(a=n.length,o=a==t.length)for(;a--&&(o=S(n[a],t[a],r,e)););}else{var c=n.constructor,f=t.constructor;if(c!==f&&!(w.isFunction(c)&&c instanceof c&&w.isFunction(f)&&f instanceof f))return!1;for(var s in n)if(w.has(n,s)&&(a++,!(o=w.has(t,s)&&S(n[s],t[s],r,e))))break;if(o){for(s in t)if(w.has(t,s)&&!a--)break;o=!a}}return r.pop(),e.pop(),o};w.isEqual=function(n,t){return S(n,t,[],[])},w.isEmpty=function(n){if(null==n)return!0;if(w.isArray(n)||w.isString(n))return 0===n.length;for(var t in n)if(w.has(n,t))return!1;return!0},w.isElement=function(n){return!(!n||1!==n.nodeType)},w.isArray=x||function(n){return"[object Array]"==l.call(n)},w.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){w["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),w.isArguments(arguments)||(w.isArguments=function(n){return!(!n||!w.has(n,"callee"))}),w.isFunction=function(n){return"function"==typeof n},w.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},w.isNaN=function(n){return w.isNumber(n)&&n!=+n},w.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},w.isNull=function(n){return null===n},w.isUndefined=function(n){return void 0===n},w.has=function(n,t){return f.call(n,t)},w.noConflict=function(){return n._=t,this},w.identity=function(n){return n},w.times=function(n,t,r){for(var e=Array(n),u=0;n>u;u++)e[u]=t.call(r,u);return e},w.random=function(n,t){return null==t&&(t=n,n=0),n+(0|Math.random()*(t-n+1))};var T={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};T.unescape=w.invert(T.escape);var M={escape:RegExp("["+w.keys(T.escape).join("")+"]","g"),unescape:RegExp("("+w.keys(T.unescape).join("|")+")","g")};w.each(["escape","unescape"],function(n){w[n]=function(t){return null==t?"":(""+t).replace(M[n],function(t){return T[n][t]})}}),w.result=function(n,t){if(null==n)return null;var r=n[t];return w.isFunction(r)?r.call(n):r},w.mixin=function(n){A(w.functions(n),function(t){var r=w[t]=n[t];w.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(w,n))}})};var N=0;w.uniqueId=function(n){var t=""+ ++N;return n?n+t:t},w.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;w.template=function(n,t,r){r=w.defaults({},r,w.templateSettings);var e=RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(D,function(n){return"\\"+B[n]}),r&&(i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(i+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),a&&(i+="';\n"+a+"\n__p+='"),u=o+t.length,t}),i+="';\n",r.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var a=Function(r.variable||"obj","_",i)}catch(o){throw o.source=i,o}if(t)return a(t,w);var c=function(n){return a.call(this,n,w)};return c.source="function("+(r.variable||"obj")+"){\n"+i+"}",c},w.chain=function(n){return w(n).chain()};var z=function(n){return this._chain?w(n).chain():n};w.mixin(w),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];w.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];w.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),w.extend(w.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this); /*! * jQuery Cookie Plugin v1.2 diff --git a/public/stylesheets/opening.css b/public/stylesheets/opening.css index 9e5c8a7e23..ac8161bd90 100644 --- a/public/stylesheets/opening.css +++ b/public/stylesheets/opening.css @@ -77,7 +77,7 @@ div.hooks_wrap { top: 51px; left: 52px; padding: 12px; - border-radius: 3px; + border-radius: 3px 0 3px 3px; box-shadow: 0 0 20px #444; background: rgba(245,245,245,0.8); background: -moz-linear-gradient(top, rgba(212,212,212,0.9) 0%, rgba(240,240,240,0.5) 100%); @@ -85,6 +85,7 @@ div.hooks_wrap { background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(212,212,212,0.9)), to(rgba(240,240,240,0.5))); background: -ms-linear-gradient(top, rgba(212,212,212,0.9) 0%,rgba(240,240,240,0.5) 100%); background: -o-linear-gradient(top, rgba(212,212,212,0.9) 0%,rgba(240,240,240,0.5) 100%); + background: linear-gradient(top, rgba(212,212,212,0.9) 0%,rgba(240,240,240,0.5) 100%); } div.hooks_wrap.large { height: 512px; @@ -94,6 +95,57 @@ div.hooks_wrap.large { div.hooks_wrap.hidden { display: none; } +div.hooks_wrap a.filter { + position: absolute; + top: -21px; + right: -1px; + height: 20px; + line-height: 20px; + padding: 0 2px 0 10px; + background: rgba(212,212,212,0.9); + background: -moz-linear-gradient(top,rgba(212,212,212,1) 0%, rgba(212,212,212,0.9) 100%); + border: 1px solid #444; + border-bottom: 0; + display: block; + border-radius: 3px 3px 0 0; + color: #333; + text-decoration: none; +} +div.hooks_wrap a.filter:hover, +div.hooks_wrap a.filter.active { + background: #fff; +} +div.hooks_wrap a.filter span { + background-position: right -192px; + padding-left: 0; + padding-right: 20px; +} +div.hooks_wrap div.filter { + position: absolute; + display: none; + top: 0px; + right: 0px; + min-height: 181px; + width: 244px; + padding: 12px; + border: 1px solid #444; + border-width: 0 0 1px 1px; + background: #fff; +} +div.hooks_wrap div.filter select { + width: 100%; + margin-bottom: 12px; + text-transform: capitalize; + padding: 6px; +} +div.hooks_wrap div.filter .actions { + text-align: right; +} +div.hooks_wrap div.filter .actions button { + padding: 6px; + margin-left: 12px; +} + div.hooks { border: 1px solid #bababa; border-top: 0