Compare commits

...

47 Commits

Author SHA1 Message Date
Ruud
d4ed4791bf Merge branch 'develop' into redesign 2015-02-22 18:30:47 +01:00
Ruud
045c8f4dc8 Trailer 2014-12-28 11:29:41 +01:00
Ruud
02e25a9e25 Releases 2014-12-28 00:53:37 +01:00
Ruud
819f619297 Search 2014-12-27 21:10:33 +01:00
Ruud
c303789817 Merge branch 'develop' into redesign 2014-12-27 14:02:15 +01:00
Ruud
1a2d79f719 Merge branch 'develop' into redesign 2014-12-21 14:49:25 +01:00
Ruud
ac382d5131 Search and login 2014-12-20 10:49:01 +01:00
Ruud
abc9e78027 Merge branch 'develop' into redesign 2014-12-19 14:16:36 +01:00
Ruud
c94d79cc6c Popups over pages 2014-12-19 14:14:20 +01:00
Ruud
9883a7a85a Merge branch 'develop' into redesign 2014-12-19 09:11:54 +01:00
Ruud
f4a486c47b Menu 2014-12-18 13:31:12 +01:00
Ruud
80cf144e8b Don't load async 2014-12-18 09:58:52 +01:00
Ruud
cf5a774313 Don't destroy events 2014-12-18 09:56:10 +01:00
Ruud
b9b77042dc Remove Async 2014-12-18 09:55:58 +01:00
Ruud
9e96aa14b7 Update Mootools 2014-12-18 09:55:48 +01:00
Ruud
6a0220b496 Filters 2014-12-17 22:00:43 +01:00
Ruud
02ff0acc64 Update page actions 2014-12-17 17:29:54 +01:00
Ruud
ae6affdb52 Movie details page 2014-12-17 17:10:40 +01:00
Ruud
a08df704be Update fonts 2014-12-17 17:10:25 +01:00
Ruud
af9a47d528 Add dev packages 2014-12-17 14:20:13 +01:00
Ruud
0155c8de2d Movie lists 2014-12-16 23:55:26 +01:00
Ruud
5bfdb121df Merge branch 'develop' into redesign 2014-12-14 13:05:47 +01:00
Ruud
b8b6024592 Styling 2014-12-14 12:04:26 +01:00
Ruud
d77cfb3e69 Start CP via grunt 2014-12-05 22:30:19 +01:00
Ruud
858d8b4291 Ignore vendor scripts 2014-12-05 15:14:36 +01:00
Ruud
3852fc720d Remove scss lib 2014-12-05 15:13:40 +01:00
Ruud
5145618c39 Damn semicolons 2014-12-05 14:44:12 +01:00
Ruud
d6cfcae45b Move to vendor folder 2014-12-05 11:29:25 +01:00
Ruud
5609536f46 Cleanup 2014-12-05 11:19:00 +01:00
Ruud
f992c00eb7 Remove unused 2014-12-04 23:31:45 +01:00
Ruud
87086a0336 Rename to scss 2014-12-04 23:22:14 +01:00
Ruud
62cb57f217 Concat 2014-12-03 23:30:14 +01:00
Ruud
2a0e46fe00 Dev tools 2014-12-03 23:19:22 +01:00
Ruud
1f7555e8fd Merge branch 'develop' into redesign
Conflicts:
	couchpotato/templates/login.html
2014-12-03 20:46:11 +01:00
Ruud
4291e2233d Releader class 2014-07-13 12:23:27 +02:00
Ruud
6ccbad031f Use own style reloader 2014-07-13 12:23:14 +02:00
Ruud
d1dfed2833 Merge branch 'refs/heads/develop' into redesign 2014-07-12 20:39:26 +02:00
Ruud
3986de4ebc Merge branch 'refs/heads/develop' into redesign 2014-07-06 22:38:51 +02:00
Ruud
d80fe99609 Load subpages 2014-05-13 22:37:00 +02:00
Ruud
43b6e3ac07 Use proper extend 2014-05-11 20:46:00 +02:00
Ruud
58acd53a9a Merge branch 'refs/heads/develop' into redesign
Conflicts:
	couchpotato/static/scripts/couchpotato.js
2014-05-11 20:25:15 +02:00
Ruud
05a97a19ab Mixins 2014-05-05 20:41:29 +02:00
Ruud
db23f5cdef Update 2014-05-05 20:40:55 +02:00
Ruud
85163443e3 Re-use original paths 2014-04-09 19:54:01 +02:00
Ruud
6ea49405f4 Make clientside ordered 2014-04-09 19:29:30 +02:00
Ruud
4776cef473 Reinit css 2014-04-09 16:08:10 +02:00
Ruud
e8fe9da602 Livereload css 2014-04-09 16:07:59 +02:00
97 changed files with 6745 additions and 6347 deletions

2
.gitignore vendored
View File

@@ -3,3 +3,5 @@
/_source/ /_source/
.project .project
.pydevproject .pydevproject
node_modules
.tmp

121
Gruntfile.js Normal file
View File

@@ -0,0 +1,121 @@
'use strict';
module.exports = function(grunt){
require('time-grunt')(grunt);
// Configurable paths
var config = {
tmp: '.tmp',
base: 'couchpotato',
css_dest: 'couchpotato/static/style/combined.min.css'
};
grunt.initConfig({
// Project settings
config: config,
// Make sure code styles are up to par and there are no obvious mistakes
jshint: {
options: {
reporter: require('jshint-stylish'),
unused: false,
camelcase: false,
devel: true
},
all: [
'<%= config.base %>/{,**/}*.js',
'!<%= config.base %>/static/scripts/vendor/{,**/}*.js'
]
},
// Compiles Sass to CSS and generates necessary files if requested
sass: {
options: {
compass: true,
update: true
},
server: {
files: [{
expand: true,
cwd: '<%= config.base %>/',
src: ['**/*.scss'],
dest: '<%= config.tmp %>/styles/',
ext: '.css'
}]
}
},
// Add vendor prefixed styles
autoprefixer: {
options: {
browsers: ['> 1%', 'Android >= 2.1', 'Chrome >= 21', 'Explorer >= 7', 'Firefox >= 17', 'Opera >= 12.1', 'Safari >= 6.0']
},
dist: {
files: [{
expand: true,
cwd: '<%= config.tmp %>/styles/',
src: '{,**/}*.css',
dest: '<%= config.tmp %>/styles/'
}]
}
},
cssmin: {
dist: {
files: {
'<%= config.css_dest %>': ['<%= config.tmp %>/styles/**/*.css']
}
}
},
shell: {
runCouchPotato: {
command: 'python CouchPotato.py'
}
},
// COOL TASKS ==============================================================
watch: {
scss: {
files: ['<%= config.base %>/**/*.{scss,sass}'],
tasks: ['sass:server', 'autoprefixer', 'cssmin']
},
js: {
files: [
'<%= config.base %>/**/*.js'
],
tasks: ['jshint']
},
livereload: {
options: {
livereload: 35729
},
files: [
'<%= config.css_dest %>'
]
}
},
concurrent: {
options: {
logConcurrentOutput: true
},
tasks: ['shell:runCouchPotato', 'sass:server', 'autoprefixer', 'cssmin', 'watch']
}
});
grunt.loadNpmTasks('grunt-contrib-jshint');
//grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-sass');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-autoprefixer');
grunt.loadNpmTasks('grunt-concurrent');
grunt.loadNpmTasks('grunt-shell');
grunt.registerTask('default', ['concurrent']);
};

45
config.rb Normal file
View File

@@ -0,0 +1,45 @@
# First, require any additional compass plugins installed on your system.
# require 'zen-grids'
require 'susy'
# require 'breakpoint'
# Toggle this between :development and :production when deploying the CSS to the
# live server. Development mode will retain comments and spacing from the
# original Sass source and adds line numbering comments for easier debugging.
environment = :development
# environment = :development
# In development, we can turn on the FireSass-compatible debug_info.
firesass = false
# firesass = true
# Location of the your project's resources.
# Set this to the root of your project. All resource locations above are
# considered to be relative to this path.
http_path = "/"
# To use relative paths to assets in your compiled CSS files, set this to true.
# relative_assets = true
##
## You probably don't need to edit anything below this.
##
sass_dir = "./"
css_dir = "./static/style_compiled"
# You can select your preferred output style here (can be overridden via the command line):
# output_style = :expanded or :nested or :compact or :compressed
output_style = (environment == :development) ? :expanded : :compressed
# To disable debugging comments that display the original location of your selectors. Uncomment:
# line_comments = false
# Pass options to sass. For development, we turn on the FireSass-compatible
# debug_info if the firesass config variable above is true.
sass_options = (environment == :development && firesass == true) ? {:debug_info => true} : {}

View File

@@ -1,6 +1,5 @@
import os import os
import re import re
import traceback
from couchpotato.core.event import addEvent from couchpotato.core.event import addEvent
from couchpotato.core.helpers.encoding import ss from couchpotato.core.helpers.encoding import ss
@@ -8,8 +7,6 @@ from couchpotato.core.helpers.variable import tryInt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.base import Plugin
from couchpotato.environment import Env from couchpotato.environment import Env
from minify.cssmin import cssmin
from minify.jsmin import jsmin
from tornado.web import StaticFileHandler from tornado.web import StaticFileHandler
@@ -22,30 +19,26 @@ class ClientScript(Plugin):
core_static = { core_static = {
'style': [ 'style': [
'style/main.css', 'style/combined.min.css',
'style/uniform.generic.css',
'style/uniform.css',
'style/settings.css',
], ],
'script': [ 'script': [
'scripts/library/mootools.js', 'scripts/vendor/mootools.js',
'scripts/library/mootools_more.js', 'scripts/vendor/mootools_more.js',
'scripts/vendor/form_replacement/form_check.js',
'scripts/vendor/form_replacement/form_radio.js',
'scripts/vendor/form_replacement/form_dropdown.js',
'scripts/vendor/form_replacement/form_selectoption.js',
'scripts/vendor/Array.stableSort.js',
'scripts/vendor/history.js',
'scripts/library/uniform.js', 'scripts/library/uniform.js',
'scripts/library/form_replacement/form_check.js',
'scripts/library/form_replacement/form_radio.js',
'scripts/library/form_replacement/form_dropdown.js',
'scripts/library/form_replacement/form_selectoption.js',
'scripts/library/question.js', 'scripts/library/question.js',
'scripts/library/scrollspy.js', 'scripts/library/scrollspy.js',
'scripts/library/spin.js',
'scripts/library/Array.stableSort.js',
'scripts/library/async.js',
'scripts/couchpotato.js', 'scripts/couchpotato.js',
'scripts/api.js', 'scripts/api.js',
'scripts/library/history.js',
'scripts/page.js', 'scripts/page.js',
'scripts/block.js', 'scripts/block.js',
'scripts/block/navigation.js', 'scripts/block/navigation.js',
'scripts/block/header.js',
'scripts/block/footer.js', 'scripts/block/footer.js',
'scripts/block/menu.js', 'scripts/block/menu.js',
'scripts/page/home.js', 'scripts/page/home.js',
@@ -54,8 +47,9 @@ class ClientScript(Plugin):
], ],
} }
urls = {'style': {}, 'script': {}} watches = {}
minified = {'style': {}, 'script': {}}
original_paths = {'style': {}, 'script': {}}
paths = {'style': {}, 'script': {}} paths = {'style': {}, 'script': {}}
comment = { comment = {
'style': '/*** %s:%d ***/\n', 'style': '/*** %s:%d ***/\n',
@@ -74,8 +68,7 @@ class ClientScript(Plugin):
addEvent('clientscript.get_styles', self.getStyles) addEvent('clientscript.get_styles', self.getStyles)
addEvent('clientscript.get_scripts', self.getScripts) addEvent('clientscript.get_scripts', self.getScripts)
if not Env.get('dev'): addEvent('app.load', self.compile)
addEvent('app.load', self.minify)
self.addCore() self.addCore()
@@ -91,7 +84,7 @@ class ClientScript(Plugin):
else: else:
self.registerStyle(core_url, file_path, position = 'front') self.registerStyle(core_url, file_path, position = 'front')
def minify(self): def compile(self):
# Create cache dir # Create cache dir
cache = Env.get('cache_dir') cache = Env.get('cache_dir')
@@ -102,47 +95,43 @@ class ClientScript(Plugin):
for file_type in ['style', 'script']: for file_type in ['style', 'script']:
ext = 'js' if file_type is 'script' else 'css' ext = 'js' if file_type is 'script' else 'css'
positions = self.paths.get(file_type, {}) positions = self.original_paths.get(file_type, {})
for position in positions: for position in positions:
files = positions.get(position) files = positions.get(position)
self._minify(file_type, files, position, position + '.' + ext) self._compile(file_type, files, position, position + '.' + ext)
def _minify(self, file_type, files, position, out): def _compile(self, file_type, paths, position, out):
cache = Env.get('cache_dir') cache = Env.get('cache_dir')
out_name = out out_name = out
out = os.path.join(cache, 'minified', out_name) minified_dir = os.path.join(cache, 'minified')
data_combined = ''
new_paths = []
for x in paths:
file_path, url_path = x
raw = []
for file_path in files:
f = open(file_path, 'r').read() f = open(file_path, 'r').read()
if file_type == 'script': if not Env.get('dev'):
data = jsmin(f) data = f
else:
data = self.prefix(f)
data = cssmin(data)
data = data.replace('../images/', '../static/images/')
data = data.replace('../fonts/', '../static/fonts/')
data = data.replace('../../static/', '../static/') # Replace inside plugins
raw.append({'file': file_path, 'date': int(os.path.getmtime(file_path)), 'data': data}) data_combined += self.comment.get(file_type) % (ss(file_path), int(os.path.getmtime(file_path)))
data_combined += data + '\n\n'
else:
new_paths.append(x)
# Combine all files together with some comments # Combine all files together with some comments
data = '' if not Env.get('dev'):
for r in raw:
data += self.comment.get(file_type) % (ss(r.get('file')), r.get('date'))
data += r.get('data') + '\n\n'
self.createFile(out, data.strip()) out_path = os.path.join(minified_dir, out_name)
self.createFile(out_path, data_combined.strip())
if not self.minified.get(file_type): minified_url = 'minified/%s?%s' % (out_name, tryInt(os.path.getmtime(out)))
self.minified[file_type] = {} new_paths.append((out_path, {'url': minified_url}))
if not self.minified[file_type].get(position):
self.minified[file_type][position] = []
minified_url = 'minified/%s?%s' % (out_name, tryInt(os.path.getmtime(out))) self.paths[file_type][position] = new_paths
self.minified[file_type][position].append(minified_url)
def getStyles(self, *args, **kwargs): def getStyles(self, *args, **kwargs):
return self.get('style', *args, **kwargs) return self.get('style', *args, **kwargs)
@@ -150,22 +139,12 @@ class ClientScript(Plugin):
def getScripts(self, *args, **kwargs): def getScripts(self, *args, **kwargs):
return self.get('script', *args, **kwargs) return self.get('script', *args, **kwargs)
def get(self, type, as_html = False, location = 'head'): def get(self, type, location = 'head'):
if type in self.paths and location in self.paths[type]:
paths = self.paths[type][location]
return [x[1] for x in paths]
data = '' if as_html else [] return []
try:
try:
if not Env.get('dev'):
return self.minified[type][location]
except:
pass
return self.urls[type][location]
except:
log.error('Error getting minified %s, %s: %s', (type, location, traceback.format_exc()))
return data
def registerStyle(self, api_path, file_path, position = 'head'): def registerStyle(self, api_path, file_path, position = 'head'):
self.register(api_path, file_path, 'style', position) self.register(api_path, file_path, 'style', position)
@@ -177,36 +156,10 @@ class ClientScript(Plugin):
api_path = '%s?%s' % (api_path, tryInt(os.path.getmtime(file_path))) api_path = '%s?%s' % (api_path, tryInt(os.path.getmtime(file_path)))
if not self.urls[type].get(location): if not self.original_paths[type].get(location):
self.urls[type][location] = [] self.original_paths[type][location] = []
self.urls[type][location].append(api_path) self.original_paths[type][location].append((file_path, api_path))
if not self.paths[type].get(location): if not self.paths[type].get(location):
self.paths[type][location] = [] self.paths[type][location] = []
self.paths[type][location].append(file_path) self.paths[type][location].append((file_path, api_path))
prefix_properties = ['border-radius', 'transform', 'transition', 'box-shadow']
prefix_tags = ['ms', 'moz', 'webkit']
def prefix(self, data):
trimmed_data = re.sub('(\t|\n|\r)+', '', data)
new_data = ''
colon_split = trimmed_data.split(';')
for splt in colon_split:
curl_split = splt.strip().split('{')
for curly in curl_split:
curly = curly.strip()
for prop in self.prefix_properties:
if curly[:len(prop) + 1] == prop + ':':
for tag in self.prefix_tags:
new_data += ' -%s-%s; ' % (tag, curly)
new_data += curly + (' { ' if len(curl_split) > 1 else ' ')
new_data += '; '
new_data = new_data.replace('{ ;', '; ').replace('} ;', '} ')
return new_data

View File

@@ -16,8 +16,8 @@ var DownloadersBase = new Class({
var setting_page = App.getPage('Settings'); var setting_page = App.getPage('Settings');
setting_page.addEvent('create', function(){ setting_page.addEvent('create', function(){
Object.each(setting_page.tabs.downloaders.groups, self.addTestButton.bind(self)) Object.each(setting_page.tabs.downloaders.groups, self.addTestButton.bind(self));
}) });
}, },
@@ -44,19 +44,19 @@ var DownloadersBase = new Class({
if(json.success){ if(json.success){
message = new Element('span.success', { message = new Element('span.success', {
'text': 'Connection successful' 'text': 'Connection successful'
}).inject(button, 'after') }).inject(button, 'after');
} }
else { else {
var msg_text = 'Connection failed. Check logs for details.'; var msg_text = 'Connection failed. Check logs for details.';
if(json.hasOwnProperty('msg')) msg_text = json.msg; if(json.hasOwnProperty('msg')) msg_text = json.msg;
message = new Element('span.failed', { message = new Element('span.failed', {
'text': msg_text 'text': msg_text
}).inject(button, 'after') }).inject(button, 'after');
} }
(function(){ (function(){
message.destroy(); message.destroy();
}).delay(3000) }).delay(3000);
} }
}); });
} }

View File

@@ -27,7 +27,7 @@ var UpdaterBase = new Class({
App.trigger('message', ['No updates available']); App.trigger('message', ['No updates available']);
} }
} }
}) });
}, },
@@ -50,8 +50,8 @@ var UpdaterBase = new Class({
self.message.destroy(); self.message.destroy();
} }
} }
}) });
}, (timeout || 0)) }, (timeout || 0));
}, },
@@ -84,7 +84,7 @@ var UpdaterBase = new Class({
'click': self.doUpdate.bind(self) 'click': self.doUpdate.bind(self)
} }
}) })
).inject(document.body) ).inject(document.body);
}, },
doUpdate: function(){ doUpdate: function(){
@@ -96,7 +96,7 @@ var UpdaterBase = new Class({
if(json.success) if(json.success)
self.updating(); self.updating();
else else
App.unBlockPage() App.unBlockPage();
} }
}); });
}, },

View File

@@ -17,7 +17,7 @@ var PutIODownloader = new Class({
var putio_set = 0; var putio_set = 0;
fieldset.getElements('input[type=text]').each(function(el){ fieldset.getElements('input[type=text]').each(function(el){
putio_set += +(el.get('value') != ''); putio_set += +(el.get('value') !== '');
}); });
new Element('.ctrlHolder').adopt( new Element('.ctrlHolder').adopt(
@@ -57,7 +57,7 @@ var PutIODownloader = new Class({
} }
}) })
).inject(fieldset.getElement('.test_button'), 'before'); ).inject(fieldset.getElement('.test_button'), 'before');
}) });
} }

View File

@@ -1,277 +0,0 @@
.search_form {
display: inline-block;
vertical-align: middle;
position: absolute;
right: 105px;
top: 0;
text-align: right;
height: 100%;
transition: all .4s cubic-bezier(0.9,0,0.1,1);
z-index: 20;
border: 0 solid transparent;
border-bottom-width: 4px;
}
.search_form:hover {
border-color: #047792;
}
@media all and (max-width: 480px) {
.search_form {
right: 44px;
}
}
.search_form.focused,
.search_form.shown {
border-color: #04bce6;
}
.search_form .input {
height: 100%;
overflow: hidden;
width: 45px;
transition: all .4s cubic-bezier(0.9,0,0.1,1);
}
.search_form.focused .input,
.search_form.shown .input {
width: 380px;
background: #4e5969;
}
.search_form .input input {
border-radius: 0;
display: block;
border: 0;
background: none;
color: #FFF;
font-size: 25px;
height: 100%;
width: 100%;
opacity: 0;
padding: 0 40px 0 10px;
transition: all .4s ease-in-out .2s;
}
.search_form.focused .input input,
.search_form.shown .input input {
opacity: 1;
}
.search_form input::-ms-clear {
width : 0;
height: 0;
}
@media all and (max-width: 480px) {
.search_form .input input {
font-size: 15px;
}
.search_form.focused .input,
.search_form.shown .input {
width: 277px;
}
}
.search_form .input a {
position: absolute;
top: 0;
right: 0;
width: 44px;
height: 100%;
cursor: pointer;
vertical-align: middle;
text-align: center;
line-height: 66px;
font-size: 15px;
color: #FFF;
}
.search_form .input a:after {
content: "\e03e";
}
.search_form.shown.filled .input a:after {
content: "\e04e";
}
@media all and (max-width: 480px) {
.search_form .input a {
line-height: 44px;
}
}
.search_form .results_container {
text-align: left;
position: absolute;
background: #5c697b;
margin: 4px 0 0;
width: 470px;
min-height: 50px;
box-shadow: 0 20px 20px -10px rgba(0,0,0,0.55);
display: none;
}
@media all and (max-width: 480px) {
.search_form .results_container {
width: 320px;
}
}
.search_form.focused.filled .results_container,
.search_form.shown.filled .results_container {
display: block;
}
.search_form .results {
max-height: 570px;
overflow-x: hidden;
}
.media_result {
overflow: hidden;
height: 50px;
position: relative;
}
.media_result .options {
position: absolute;
height: 100%;
top: 0;
left: 30px;
right: 0;
padding: 13px;
border: 1px solid transparent;
border-width: 1px 0;
border-radius: 0;
box-shadow: inset 0 1px 8px rgba(0,0,0,0.25);
}
.media_result .options > .in_library_wanted {
margin-top: -7px;
}
.media_result .options > div {
border: 0;
}
.media_result .options .thumbnail {
vertical-align: middle;
}
.media_result .options select {
vertical-align: middle;
display: inline-block;
margin-right: 10px;
}
.media_result .options select[name=title] { width: 170px; }
.media_result .options select[name=profile] { width: 90px; }
.media_result .options select[name=category] { width: 80px; }
@media all and (max-width: 480px) {
.media_result .options select[name=title] { width: 90px; }
.media_result .options select[name=profile] { width: 50px; }
.media_result .options select[name=category] { width: 50px; }
}
.media_result .options .button {
vertical-align: middle;
display: inline-block;
}
.media_result .options .message {
height: 100%;
font-size: 20px;
color: #fff;
line-height: 20px;
}
.media_result .data {
position: absolute;
height: 100%;
top: 0;
left: 30px;
right: 0;
background: #5c697b;
cursor: pointer;
border-top: 1px solid rgba(255,255,255, 0.08);
transition: all .4s cubic-bezier(0.9,0,0.1,1);
}
.media_result .data.open {
left: 100% !important;
}
.media_result:last-child .data { border-bottom: 0; }
.media_result .in_wanted, .media_result .in_library {
position: absolute;
bottom: 2px;
left: 14px;
font-size: 11px;
}
.media_result .thumbnail {
width: 34px;
min-height: 100%;
display: block;
margin: 0;
vertical-align: top;
}
.media_result .info {
position: absolute;
top: 20%;
left: 15px;
right: 7px;
vertical-align: middle;
}
.media_result .info h2 {
margin: 0;
font-weight: normal;
font-size: 20px;
padding: 0;
}
.search_form .info h2 {
position: absolute;
width: 100%;
}
.media_result .info h2 .title {
display: block;
margin: 0;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.search_form .info h2 .title {
position: absolute;
width: 88%;
}
.media_result .info h2 .year {
padding: 0 5px;
text-align: center;
position: absolute;
width: 12%;
right: 0;
}
@media all and (max-width: 480px) {
.search_form .info h2 .year {
font-size: 12px;
margin-top: 7px;
}
}
.search_form .mask,
.media_result .mask {
position: absolute;
height: 100%;
width: 100%;
left: 0;
top: 0;
}

View File

@@ -1,4 +1,4 @@
Block.Search = new Class({ var BlockSearch = new Class({
Extends: BlockBase, Extends: BlockBase,
@@ -9,45 +9,46 @@ Block.Search = new Class({
var focus_timer = 0; var focus_timer = 0;
self.el = new Element('div.search_form').adopt( self.el = new Element('div.search_form').adopt(
new Element('div.input').adopt( new Element('a.icon-search', {
self.input = new Element('input', { 'events': {
'placeholder': 'Search & add a new media', 'click': self.clear.bind(self),
'touchend': self.clear.bind(self)
}
}),
new Element('div.wrapper').adopt(
self.result_container = new Element('div.results_container', {
'tween': {
'duration': 200
},
'events': { 'events': {
'input': self.keyup.bind(self), 'mousewheel': function(e){
'paste': self.keyup.bind(self), (e).stopPropagation();
'change': self.keyup.bind(self),
'keyup': self.keyup.bind(self),
'focus': function(){
if(focus_timer) clearTimeout(focus_timer);
self.el.addClass('focused');
if(this.get('value'))
self.hideResults(false)
},
'blur': function(){
focus_timer = (function(){
self.el.removeClass('focused')
}).delay(100);
} }
} }
}), }).grab(
new Element('a.icon2', { self.results = new Element('div.results')
'events': { ),
'click': self.clear.bind(self), new Element('div.input').grab(
'touchend': self.clear.bind(self) self.input = new Element('input', {
} 'placeholder': 'Search & add a new media',
}) 'events': {
), 'input': self.keyup.bind(self),
self.result_container = new Element('div.results_container', { 'paste': self.keyup.bind(self),
'tween': { 'change': self.keyup.bind(self),
'duration': 200 'keyup': self.keyup.bind(self),
}, 'focus': function(){
'events': { if(focus_timer) clearTimeout(focus_timer);
'mousewheel': function(e){ if(this.get('value'))
(e).stopPropagation(); self.hideResults(false);
} },
} 'blur': function(){
}).adopt( focus_timer = (function(){
self.results = new Element('div.results') self.el.removeClass('focused');
}).delay(100);
}
}
})
)
) )
); );
@@ -67,11 +68,12 @@ Block.Search = new Class({
self.last_q = ''; self.last_q = '';
self.input.set('value', ''); self.input.set('value', '');
self.el.addClass('focused');
self.input.focus(); self.input.focus();
self.media = {}; self.media = {};
self.results.empty(); self.results.empty();
self.el.removeClass('filled') self.el.removeClass('filled');
} }
}, },
@@ -105,7 +107,7 @@ Block.Search = new Class({
self.api_request.cancel(); self.api_request.cancel();
if(self.autocomplete_timer) clearTimeout(self.autocomplete_timer); if(self.autocomplete_timer) clearTimeout(self.autocomplete_timer);
self.autocomplete_timer = self.autocomplete.delay(300, self) self.autocomplete_timer = self.autocomplete.delay(300, self);
} }
}, },
@@ -115,10 +117,10 @@ Block.Search = new Class({
if(!self.q()){ if(!self.q()){
self.hideResults(true); self.hideResults(true);
return return;
} }
self.list() self.list();
}, },
list: function(){ list: function(){
@@ -139,7 +141,7 @@ Block.Search = new Class({
'q': q 'q': q
}, },
'onComplete': self.fill.bind(self, q) 'onComplete': self.fill.bind(self, q)
}) });
} }
else else
self.fill(q, cache); self.fill(q, cache);
@@ -158,30 +160,25 @@ Block.Search = new Class({
Object.each(json, function(media){ Object.each(json, function(media){
if(typeOf(media) == 'array'){ if(typeOf(media) == 'array'){
Object.each(media, function(m){ Object.each(media, function(me){
var m = new Block.Search[m.type.capitalize() + 'Item'](m); var m = new window['BlockSearch' + me.type.capitalize() + 'Item'](me);
$(m).inject(self.results); $(m).inject(self.results);
self.media[m.imdb || 'r-'+Math.floor(Math.random()*10000)] = m; self.media[m.imdb || 'r-'+Math.floor(Math.random()*10000)] = m;
if(q == m.imdb) if(q == m.imdb)
m.showOptions() m.showOptions();
}); });
} }
}); });
// Calculate result heights self.mask.fade('out');
var w = window.getSize(),
rc = self.result_container.getCoordinates();
self.results.setStyle('max-height', (w.y - rc.top - 50) + 'px');
self.mask.fade('out')
}, },
loading: function(bool){ loading: function(bool){
this.el[bool ? 'addClass' : 'removeClass']('loading') this.el[bool ? 'addClass' : 'removeClass']('loading');
}, },
q: function(){ q: function(){

View File

@@ -0,0 +1,242 @@
@import "couchpotato/static/style/mixins";
.search_form {
display: inline-block;
z-index: 200;
width: 44px;
position: relative;
.icon-search {
position: absolute;
z-index: 2;
top: 50%;
left: 0;
height: 100%;
cursor: pointer;
text-align: center;
color: #FFF;
font-size: 20px;
@include translateY(-50%);
}
.wrapper {
position: absolute;
left: 44px;
bottom: 0;
background: $primary_color;
border-radius: $border_radius 0 0 $border_radius;
display: none;
box-shadow: 0 0 15px 2px rgba(0,0,0,.15);
&:before {
@include transform(rotate(45deg));
content: '';
display: block;
position: absolute;
height: 10px;
width: 10px;
background: $primary_color;
left: -6px;
bottom: 16px;
z-index: 1;
}
}
.input {
background: $background_color;
border-radius: $border_radius 0 0 $border_radius;
position: relative;
left: 4px;
height: 44px;
overflow: hidden;
width: 100%;
input {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
z-index: 1;
&::-ms-clear {
width : 0;
height: 0;
}
}
}
&.focused,
&.shown {
border-color: #04bce6;
.wrapper {
display: block;
width: 380px;
}
.input {
input {
opacity: 1;
}
}
}
.results_container {
min-height: 50px;
text-align: left;
position: relative;
left: 4px;
display: none;
background: $background_color;
border-radius: $border_radius 0 0 0;
overflow: hidden;
.results {
max-height: 280px;
overflow-x: hidden;
.media_result {
overflow: hidden;
height: 50px;
position: relative;
.options {
position: absolute;
height: 100%;
top: 0;
left: 30px;
right: 0;
padding: 10px;
background: rgba(0,0,0,.3);
> .in_library_wanted {
margin-top: -7px;
}
> div {
border: 0;
@include flexbox();
}
.thumbnail {
vertical-align: middle;
}
select {
vertical-align: middle;
display: inline-block;
margin-right: 10px;
min-width: 70px;
@include flex(1 auto);
}
.button {
@include flex(1 auto);
vertical-align: middle;
display: inline-block;
}
.message {
height: 100%;
font-size: 20px;
color: #fff;
line-height: 20px;
}
}
.thumbnail {
width: 30px;
min-height: 100%;
display: block;
margin: 0;
vertical-align: top;
}
.data {
position: absolute;
height: 100%;
top: 0;
left: 30px;
right: 0;
cursor: pointer;
border-top: 1px solid rgba(255,255,255, 0.08);
transition: all .4s cubic-bezier(0.9,0,0.1,1);
@include translateX(0%);
background: $background_color;
&.open {
@include translateX(100%);
}
.in_wanted,
.in_library {
position: absolute;
bottom: 2px;
left: 14px;
font-size: 11px;
}
.info {
position: absolute;
top: 20%;
left: 15px;
right: 7px;
vertical-align: middle;
h2 {
margin: 0;
font-weight: 300;
font-size: 1.25em;
padding: 0;
position: absolute;
width: 100%;
@include flexbox();
.title {
display: inline-block;
margin: 0;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
@include flex(1 auto);
}
.year {
opacity: .4;
padding: 0 5px;
width: auto;
display: none;
}
}
}
}
&:hover .info h2 .year {
display: inline-block;
}
&:last-child .data {
border-bottom: 0;
}
}
}
}
&.focused.filled,
&.shown.filled {
.results_container {
display: block;
}
.input {
border-radius: 0 0 0 $border_radius;
}
}
}

View File

@@ -0,0 +1,52 @@
var MovieDetails = new Class({
Extends: BlockBase,
sections: null,
initialize: function(parent, options){
var self = this;
self.sections = {};
self.el = new Element('div',{
'class': 'page active movie_details level_' + (options.level || 0)
}).adopt(
self.overlay = new Element('div.overlay', {
'events': {
'click': self.close.bind(self)
}
}).grab(
new Element('a.close.icon-left-arrow')
),
self.content = new Element('div.content').grab(
new Element('h1', {
'text': parent.getTitle() + (parent.get('year') ? ' (' + parent.get('year') + ')' : '')
})
)
);
self.addSection('description', new Element('div', {
'text': parent.get('plot')
}));
},
addSection: function(name, section_el){
var self = this;
name = name.toLowerCase();
self.content.grab(
self.sections[name] = new Element('div', {
'class': 'section section_' + name
}).grab(section_el)
);
},
close: function(){
var self = this;
self.el.dispose();
}
});

View File

@@ -45,15 +45,16 @@ var MovieList = new Class({
}) : null }) : null
); );
if($(window).getSize().x <= 480 && !self.options.force_view) self.changeView(self.getSavedView() || self.options.view || 'thumb');
self.changeView('list');
else // Create the alphabet nav
self.changeView(self.getSavedView() || self.options.view || 'details'); if(self.options.navigation)
self.createNavigation();
self.getMovies(); self.getMovies();
App.on('movie.added', self.movieAdded.bind(self)); App.on('movie.added', self.movieAdded.bind(self));
App.on('movie.deleted', self.movieDeleted.bind(self)) App.on('movie.deleted', self.movieDeleted.bind(self));
}, },
movieDeleted: function(notification){ movieDeleted: function(notification){
@@ -67,7 +68,7 @@ var MovieList = new Class({
self.setCounter(self.counter_count-1); self.setCounter(self.counter_count-1);
self.total_movies--; self.total_movies--;
} }
}) });
} }
self.checkIfEmpty(); self.checkIfEmpty();
@@ -89,15 +90,11 @@ var MovieList = new Class({
create: function(){ create: function(){
var self = this; var self = this;
// Create the alphabet nav
if(self.options.navigation)
self.createNavigation();
if(self.options.load_more) if(self.options.load_more)
self.scrollspy = new ScrollSpy({ self.scrollspy = new ScrollSpy({
min: function(){ min: function(){
var c = self.load_more.getCoordinates(); var c = self.load_more.getCoordinates();
return c.top - window.document.getSize().y - 300 return c.top - window.document.getSize().y - 300;
}, },
onEnter: self.loadMore.bind(self) onEnter: self.loadMore.bind(self)
}); });
@@ -138,7 +135,7 @@ var MovieList = new Class({
self.empty_message = null; self.empty_message = null;
} }
if(self.total_movies && count == 0 && !self.empty_message){ if(self.total_movies && count === 0 && !self.empty_message){
var message = (self.filter.search ? 'for "'+self.filter.search+'"' : '') + var message = (self.filter.search ? 'for "'+self.filter.search+'"' : '') +
(self.filter.starts_with ? ' in <strong>'+self.filter.starts_with+'</strong>' : ''); (self.filter.starts_with ? ' in <strong>'+self.filter.starts_with+'</strong>' : '');
@@ -230,30 +227,33 @@ var MovieList = new Class({
), ),
new Element('div.menus').adopt( new Element('div.menus').adopt(
self.navigation_counter = new Element('span.counter[title=Total]'), self.navigation_counter = new Element('span.counter[title=Total]'),
self.filter_menu = new Block.Menu(self, { self.filter_menu = new BlockMenu(self, {
'class': 'filter' 'class': 'filter',
'button_class': 'icon-filter'
}), }),
self.navigation_actions = new Element('ul.actions', { self.navigation_actions = new Element('div.actions', {
'events': { 'events': {
'click:relay(li)': function(e, el){ 'click': function(e, el){
(e).stop();
var new_view = self.current_view == 'list' ? 'thumb' : 'list';
var a = 'active'; var a = 'active';
self.navigation_actions.getElements('.'+a).removeClass(a); self.navigation_actions.getElements('.'+a).removeClass(a);
self.changeView(el.get('data-view')); self.changeView(new_view);
this.addClass(a);
self.navigation_actions.getElement('[data-view='+new_view+']')
.addClass(a);
el.inject(el.getParent(), 'top');
el.getSiblings().hide();
setTimeout(function(){
el.getSiblings().setStyle('display', null);
}, 100)
} }
} }
}), }),
self.navigation_menu = new Block.Menu(self, { self.navigation_menu = new BlockMenu(self, {
'class': 'extra' 'class': 'extra',
'button_class': 'icon-dots'
}) })
) )
).inject(self.el, 'top'); );
// Mass edit // Mass edit
self.mass_edit_select_class = new Form.Check(self.mass_edit_select); self.mass_edit_select_class = new Form.Check(self.mass_edit_select);
@@ -261,7 +261,7 @@ var MovieList = new Class({
new Element('option', { new Element('option', {
'value': profile.get('_id'), 'value': profile.get('_id'),
'text': profile.get('label') 'text': profile.get('label')
}).inject(self.mass_edit_quality) }).inject(self.mass_edit_quality);
}); });
self.filter_menu.addLink( self.filter_menu.addLink(
@@ -273,7 +273,7 @@ var MovieList = new Class({
'change': self.search.bind(self) 'change': self.search.bind(self)
} }
}) })
).addClass('search'); ).addClass('search icon-search');
var available_chars; var available_chars;
self.filter_menu.addEvent('open', function(){ self.filter_menu.addEvent('open', function(){
@@ -289,8 +289,8 @@ var MovieList = new Class({
available_chars = json.chars; available_chars = json.chars;
available_chars.each(function(c){ available_chars.each(function(c){
self.letters[c.capitalize()].addClass('available') self.letters[c.capitalize()].addClass('available');
}) });
} }
}); });
@@ -301,23 +301,23 @@ var MovieList = new Class({
'events': { 'events': {
'click:relay(li.available)': function(e, el){ 'click:relay(li.available)': function(e, el){
self.activateLetter(el.get('data-letter')); self.activateLetter(el.get('data-letter'));
self.getMovies(true) self.getMovies(true);
} }
} }
}) })
); );
// Actions // Actions
['mass_edit', 'details', 'list'].each(function(view){ ['thumb', 'list'].each(function(view){
var current = self.current_view == view; var current = self.current_view == view;
new Element('li', { new Element('a', {
'class': 'icon2 ' + view + (current ? ' active ' : ''), 'class': 'icon-' + view + (current ? ' active ' : ''),
'data-view': view 'data-view': view
}).inject(self.navigation_actions, current ? 'top' : 'bottom'); }).inject(self.navigation_actions, current ? 'top' : 'bottom');
}); });
// All // All
self.letters['all'] = new Element('li.letter_all.available.active', { self.letters.all = new Element('li.letter_all.available.active', {
'text': 'ALL' 'text': 'ALL'
}).inject(self.navigation_alpha); }).inject(self.navigation_alpha);
@@ -346,7 +346,7 @@ var MovieList = new Class({
var selected = 0, var selected = 0,
movies = self.movies.length; movies = self.movies.length;
self.movies.each(function(movie){ self.movies.each(function(movie){
selected += movie.isSelected() ? 1 : 0 selected += movie.isSelected() ? 1 : 0;
}); });
var indeterminate = selected > 0 && selected < movies, var indeterminate = selected > 0 && selected < movies,
@@ -441,10 +441,10 @@ var MovieList = new Class({
var ids = []; var ids = [];
self.movies.each(function(movie){ self.movies.each(function(movie){
if (movie.isSelected()) if (movie.isSelected())
ids.include(movie.get('_id')) ids.include(movie.get('_id'));
}); });
return ids return ids;
}, },
massEditToggleAll: function(){ massEditToggleAll: function(){
@@ -453,10 +453,10 @@ var MovieList = new Class({
var select = self.mass_edit_select.get('checked'); var select = self.mass_edit_select.get('checked');
self.movies.each(function(movie){ self.movies.each(function(movie){
movie.select(select) movie.select(select);
}); });
self.calculateSelected() self.calculateSelected();
}, },
reset: function(){ reset: function(){
@@ -493,12 +493,12 @@ var MovieList = new Class({
.addClass(new_view+'_list'); .addClass(new_view+'_list');
self.current_view = new_view; self.current_view = new_view;
Cookie.write(self.options.identifier+'_view2', new_view, {duration: 1000}); Cookie.write(self.options.identifier+'_view3', new_view, {duration: 1000});
}, },
getSavedView: function(){ getSavedView: function(){
var self = this; var self = this;
return Cookie.read(self.options.identifier+'_view2'); return Cookie.read(self.options.identifier+'_view3');
}, },
search: function(){ search: function(){
@@ -537,7 +537,7 @@ var MovieList = new Class({
self.load_more.set('text', 'loading...'); self.load_more.set('text', 'loading...');
} }
if(self.movies.length == 0 && self.options.loader){ if(self.movies.length === 0 && self.options.loader){
self.loader_first = new Element('div.loading').adopt( self.loader_first = new Element('div.loading').adopt(
new Element('div.message', {'text': self.options.title ? 'Loading \'' + self.options.title + '\'' : 'Loading...'}) new Element('div.message', {'text': self.options.title ? 'Loading \'' + self.options.title + '\'' : 'Loading...'})
@@ -590,7 +590,7 @@ var MovieList = new Class({
loadMore: function(){ loadMore: function(){
var self = this; var self = this;
if(self.offset >= self.options.limit) if(self.offset >= self.options.limit)
self.getMovies() self.getMovies();
}, },
store: function(movies){ store: function(movies){
@@ -603,7 +603,7 @@ var MovieList = new Class({
checkIfEmpty: function(){ checkIfEmpty: function(){
var self = this; var self = this;
var is_empty = self.movies.length == 0 && (self.total_movies == 0 || self.total_movies === undefined); var is_empty = self.movies.length === 0 && (self.total_movies === 0 || self.total_movies === undefined);
if(self.title) if(self.title)
self.title[is_empty ? 'hide' : 'show'](); self.title[is_empty ? 'hide' : 'show']();

View File

@@ -1,4 +1,4 @@
Page.Manage = new Class({ var MoviesManage = new Class({
Extends: PageBase, Extends: PageBase,
@@ -126,12 +126,12 @@ Page.Manage = new Class({
(folder_progress.eta > 0 ? ', ' + new Date ().increment('second', folder_progress.eta).timeDiffInWords().replace('from now', 'to go') : '') (folder_progress.eta > 0 ? ', ' + new Date ().increment('second', folder_progress.eta).timeDiffInWords().replace('from now', 'to go') : '')
}), }),
new Element('span.percentage', {'text': folder_progress.total ? Math.round(((folder_progress.total-folder_progress.to_go)/folder_progress.total)*100) + '%' : '0%'}) new Element('span.percentage', {'text': folder_progress.total ? Math.round(((folder_progress.total-folder_progress.to_go)/folder_progress.total)*100) + '%' : '0%'})
).inject(self.progress_container) ).inject(self.progress_container);
}); });
} }
} }
}) });
}, 1000); }, 1000);
}, },
@@ -141,10 +141,10 @@ Page.Manage = new Class({
for (folder in progress_object) { for (folder in progress_object) {
if (progress_object.hasOwnProperty(folder)) { if (progress_object.hasOwnProperty(folder)) {
temp_array.push(folder) temp_array.push(folder);
} }
} }
return temp_array.stableSort() return temp_array.stableSort();
} }
}); });

View File

@@ -2,7 +2,10 @@ var MovieAction = new Class({
Implements: [Options], Implements: [Options],
class_name: 'action icon2', class_name: 'action',
label: 'UNKNOWN',
button: null,
details: null,
initialize: function(movie, options){ initialize: function(movie, options){
var self = this; var self = this;
@@ -11,20 +14,33 @@ var MovieAction = new Class({
self.movie = movie; self.movie = movie;
self.create(); self.create();
if(self.el)
self.el.addClass(self.class_name) if(self.button)
self.button.addClass(self.class_name);
}, },
create: function(){}, create: function(){},
getButton: function(){
return this.button || null;
},
getDetails: function(){
return this.details || null;
},
getLabel: function(){
return this.label;
},
disable: function(){ disable: function(){
if(this.el) if(this.el)
this.el.addClass('disable') this.el.addClass('disable');
}, },
enable: function(){ enable: function(){
if(this.el) if(this.el)
this.el.removeClass('disable') this.el.removeClass('disable');
}, },
getTitle: function(){ getTitle: function(){
@@ -37,7 +53,7 @@ var MovieAction = new Class({
try { try {
return self.movie.original_title ? self.movie.original_title : self.movie.titles[0]; return self.movie.original_title ? self.movie.original_title : self.movie.titles[0];
} }
catch(e){ catch(e2){
return 'Unknown'; return 'Unknown';
} }
} }
@@ -46,10 +62,10 @@ var MovieAction = new Class({
get: function(key){ get: function(key){
var self = this; var self = this;
try { try {
return self.movie.get(key) return self.movie.get(key);
} }
catch(e){ catch(e){
return self.movie[key] return self.movie[key];
} }
}, },
@@ -63,7 +79,7 @@ var MovieAction = new Class({
}, },
toElement: function(){ toElement: function(){
return this.el || null return this.el || null;
} }
}); });
@@ -80,7 +96,8 @@ MA.IMDB = new Class({
self.id = self.movie.getIdentifier ? self.movie.getIdentifier() : self.get('imdb'); self.id = self.movie.getIdentifier ? self.movie.getIdentifier() : self.get('imdb');
self.el = new Element('a.imdb', { self.button = new Element('a.imdb', {
'text': 'IMDB',
'title': 'Go to the IMDB page of ' + self.getTitle(), 'title': 'Go to the IMDB page of ' + self.getTitle(),
'href': 'http://www.imdb.com/title/'+self.id+'/', 'href': 'http://www.imdb.com/title/'+self.id+'/',
'target': '_blank' 'target': '_blank'
@@ -94,22 +111,11 @@ MA.IMDB = new Class({
MA.Release = new Class({ MA.Release = new Class({
Extends: MovieAction, Extends: MovieAction,
label: 'Releases',
create: function(){ create: function(){
var self = this; var self = this;
self.el = new Element('a.releases.download', {
'title': 'Show the releases that are available for ' + self.getTitle(),
'events': {
'click': self.show.bind(self)
}
});
if(!self.movie.data.releases || self.movie.data.releases.length == 0)
self.el.hide();
else
self.showHelper();
App.on('movie.searcher.ended', function(notification){ App.on('movie.searcher.ended', function(notification){
if(self.movie.data._id != notification.data._id) return; if(self.movie.data._id != notification.data._id) return;
@@ -118,7 +124,7 @@ MA.Release = new Class({
// Releases are currently displayed // Releases are currently displayed
if(self.options_container.isDisplayed()){ if(self.options_container.isDisplayed()){
self.options_container.destroy(); self.options_container.destroy();
self.createReleases(); self.getDetails();
} }
else { else {
self.options_container.destroy(); self.options_container.destroy();
@@ -129,16 +135,7 @@ MA.Release = new Class({
}, },
show: function(e){ getDetails: function(refresh){
var self = this;
if(e)
(e).preventDefault();
self.createReleases();
},
createReleases: function(refresh){
var self = this; var self = this;
if(!self.options_container || refresh){ if(!self.options_container || refresh){
@@ -162,14 +159,14 @@ MA.Release = new Class({
var quality = Quality.getQuality(release.quality) || {}, var quality = Quality.getQuality(release.quality) || {},
info = release.info || {}, info = release.info || {},
provider = self.get(release, 'provider') + (info['provider_extra'] ? self.get(release, 'provider_extra') : ''); provider = self.get(release, 'provider') + (info.provider_extra ? self.get(release, 'provider_extra') : '');
var release_name = self.get(release, 'name'); var release_name = self.get(release, 'name');
if(release.files && release.files.length > 0){ if(release.files && release.files.length > 0){
try { try {
var movie_file = release.files.filter(function(file){ var movie_file = release.files.filter(function(file){
var type = File.Type.get(file.type_id); var type = File.Type.get(file.type_id);
return type && type.identifier == 'movie' return type && type.identifier == 'movie';
}).pick(); }).pick();
release_name = movie_file.path.split(Api.getOption('path_sep')).getLast(); release_name = movie_file.path.split(Api.getOption('path_sep')).getLast();
} }
@@ -177,19 +174,19 @@ MA.Release = new Class({
} }
// Create release // Create release
release['el'] = new Element('div', { release.el = new Element('div', {
'class': 'item '+release.status, 'class': 'item '+release.status,
'id': 'release_'+release._id 'id': 'release_'+release._id
}).adopt( }).adopt(
new Element('span.name', {'text': release_name, 'title': release_name}), new Element('span.name', {'text': release_name, 'title': release_name}),
new Element('span.status', {'text': release.status, 'class': 'release_status '+release.status}), new Element('span.status', {'text': release.status, 'class': 'status '+release.status}),
new Element('span.quality', {'text': quality.label + (release.is_3d ? ' 3D' : '') || 'n/a'}), new Element('span.quality', {'text': quality.label + (release.is_3d ? ' 3D' : '') || 'n/a'}),
new Element('span.size', {'text': info['size'] ? Math.floor(self.get(release, 'size')) : 'n/a'}), new Element('span.size', {'text': info.size ? Math.floor(self.get(release, 'size')) : 'n/a'}),
new Element('span.age', {'text': self.get(release, 'age')}), new Element('span.age', {'text': self.get(release, 'age')}),
new Element('span.score', {'text': self.get(release, 'score')}), new Element('span.score', {'text': self.get(release, 'score')}),
new Element('span.provider', { 'text': provider, 'title': provider }), new Element('span.provider', { 'text': provider, 'title': provider }),
info['detail_url'] ? new Element('a.info.icon2', { info.detail_url ? new Element('a.info.icon2', {
'href': info['detail_url'], 'href': info.detail_url,
'target': '_blank' 'target': '_blank'
}) : new Element('a'), }) : new Element('a'),
new Element('a.download.icon2', { new Element('a.download.icon2', {
@@ -283,7 +280,7 @@ MA.Release = new Class({
new Element('span.or', { new Element('span.or', {
'text': 'or pick one below' 'text': 'or pick one below'
})] : null })] : null
) );
} }
self.last_release = null; self.last_release = null;
@@ -291,9 +288,7 @@ MA.Release = new Class({
} }
// Show it return self.options_container;
self.options_container.inject(self.movie, 'top');
self.movie.slide('in', self.options_container);
}, },
@@ -342,13 +337,13 @@ MA.Release = new Class({
'click': self.markMovieDone.bind(self) 'click': self.markMovieDone.bind(self)
} }
}) })
) );
} }
}, },
get: function(release, type){ get: function(release, type){
return (release.info && release.info[type] !== undefined) ? release.info[type] : 'n/a' return (release.info && release.info[type] !== undefined) ? release.info[type] : 'n/a';
}, },
download: function(release){ download: function(release){
@@ -386,7 +381,7 @@ MA.Release = new Class({
'data': { 'data': {
'id': release._id 'id': release._id
} }
}) });
}, },
@@ -403,7 +398,7 @@ MA.Release = new Class({
movie.set('tween', { movie.set('tween', {
'duration': 300, 'duration': 300,
'onComplete': function(){ 'onComplete': function(){
self.movie.destroy() self.movie.destroy();
} }
}); });
movie.tween('height', 0); movie.tween('height', 0);
@@ -429,49 +424,35 @@ MA.Trailer = new Class({
Extends: MovieAction, Extends: MovieAction,
id: null, id: null,
label: 'Trailer',
create: function(){ getDetails: function(){
var self = this; var self = this;
self.el = new Element('a.trailer', { if(!self.player_container){
'title': 'Watch the trailer of ' + self.getTitle(), var id = 'trailer-'+randomString();
'events': { self.player_container = new Element('div.icon-play[id='+id+']', {
'click': self.watch.bind(self) 'events': {
} 'click': function(e){
}); self.watch(id);
}
}
});
self.container = new Element('div.trailer_container')
.grab(self.player_container);
}
return self.player_container;
}, },
watch: function(offset){ watch: function(){
var self = this; var self = this;
var data_url = 'https://gdata.youtube.com/feeds/videos?vq="{title}" {year} trailer&max-results=1&alt=json-in-script&orderby=relevance&sortorder=descending&format=5&fmt=18'; var data_url = 'https://gdata.youtube.com/feeds/videos?vq="{title}" {year} trailer&max-results=1&alt=json-in-script&orderby=relevance&sortorder=descending&format=5&fmt=18',
var url = data_url.substitute({ url = data_url.substitute({
'title': encodeURI(self.getTitle()), 'title': encodeURI(self.getTitle()),
'year': self.get('year'), 'year': self.get('year')
'offset': offset || 1 });
}),
size = $(self.movie).getSize(),
height = self.options.height || (size.x/16)*9,
id = 'trailer-'+randomString();
self.player_container = new Element('div[id='+id+']');
self.container = new Element('div.hide.trailer_container')
.adopt(self.player_container)
.inject($(self.movie), 'top');
self.container.setStyle('height', 0);
self.container.removeClass('hide');
self.close_button = new Element('a.hide.hide_trailer', {
'text': 'Hide trailer',
'events': {
'click': self.stop.bind(self)
}
}).inject(self.movie);
self.container.setStyle('height', height);
$(self.movie).setStyle('height', height);
new Request.JSONP({ new Request.JSONP({
'url': url, 'url': url,
@@ -491,8 +472,6 @@ MA.Trailer = new Class({
} }
}); });
self.close_button.removeClass('hide');
var quality_set = false; var quality_set = false;
var change_quality = function(state){ var change_quality = function(state){
if(!quality_set && (state.data == 1 || state.data || 2)){ if(!quality_set && (state.data == 1 || state.data || 2)){
@@ -508,7 +487,9 @@ MA.Trailer = new Class({
self.player.addEventListener('onStateChange', change_quality); self.player.addEventListener('onStateChange', change_quality);
} }
}).send() }).send();
return self.container;
}, },
@@ -523,7 +504,7 @@ MA.Trailer = new Class({
setTimeout(function(){ setTimeout(function(){
self.container.destroy(); self.container.destroy();
self.close_button.destroy(); self.close_button.destroy();
}, 1800) }, 1800);
} }
@@ -536,7 +517,8 @@ MA.Edit = new Class({
create: function(){ create: function(){
var self = this; var self = this;
self.el = new Element('a.edit', { self.button = new Element('a.edit', {
'text': 'Edit',
'title': 'Change movie information, like title and quality.', 'title': 'Change movie information, like title and quality.',
'events': { 'events': {
'click': self.editMovie.bind(self) 'click': self.editMovie.bind(self)
@@ -585,7 +567,7 @@ MA.Edit = new Class({
// Fill categories // Fill categories
var categories = CategoryList.getAll(); var categories = CategoryList.getAll();
if(categories.length == 0) if(categories.length === 0)
self.category_select.hide(); self.category_select.hide();
else { else {
self.category_select.show(); self.category_select.show();
@@ -659,7 +641,8 @@ MA.Refresh = new Class({
create: function(){ create: function(){
var self = this; var self = this;
self.el = new Element('a.refresh', { self.button = new Element('a.refresh', {
'text': 'Refresh',
'title': 'Refresh the movie info and do a forced search', 'title': 'Refresh the movie info and do a forced search',
'events': { 'events': {
'click': self.doRefresh.bind(self) 'click': self.doRefresh.bind(self)
@@ -670,7 +653,7 @@ MA.Refresh = new Class({
doRefresh: function(e){ doRefresh: function(e){
var self = this; var self = this;
(e).preventDefault(); (e).stop();
Api.request('media.refresh', { Api.request('media.refresh', {
'data': { 'data': {
@@ -686,11 +669,12 @@ MA.Readd = new Class({
Extends: MovieAction, Extends: MovieAction,
create: function(){ create: function(){
var self = this; var self = this,
movie_done = self.movie.data.status == 'done',
snatched;
var movie_done = self.movie.data.status == 'done';
if(self.movie.data.releases && !movie_done) if(self.movie.data.releases && !movie_done)
var snatched = self.movie.data.releases.filter(function(release){ snatched = self.movie.data.releases.filter(function(release){
return release.status && (release.status == 'snatched' || release.status == 'seeding' || release.status == 'downloaded' || release.status == 'done'); return release.status && (release.status == 'snatched' || release.status == 'seeding' || release.status == 'downloaded' || release.status == 'done');
}).length; }).length;
@@ -792,7 +776,7 @@ MA.Delete = new Class({
movie.set('tween', { movie.set('tween', {
'duration': 300, 'duration': 300,
'onComplete': function(){ 'onComplete': function(){
self.movie.destroy() self.movie.destroy();
} }
}); });
movie.tween('height', 0); movie.tween('height', 0);
@@ -847,7 +831,7 @@ MA.Files = new Class({
new Element('div.file.item').adopt( new Element('div.file.item').adopt(
new Element('span.name', {'text': file}), new Element('span.name', {'text': file}),
new Element('span.type', {'text': type}) new Element('span.type', {'text': type})
).inject(rel) ).inject(rel);
}); });
}); });
}); });

File diff suppressed because it is too large Load Diff

View File

@@ -2,22 +2,51 @@ var Movie = new Class({
Extends: BlockBase, Extends: BlockBase,
action: {}, actions: [],
details: null,
initialize: function(list, options, data){ initialize: function(list, options, data){
var self = this; var self = this;
self.data = data; self.data = data;
self.view = options.view || 'details';
self.list = list; self.list = list;
self.el = new Element('div.movie'); self.el = new Element('a.movie', {
'events': {
'click': function(e){
(e).stop();
self.openDetails();
}
}
});
self.profile = Quality.getProfile(data.profile_id) || {}; self.profile = Quality.getProfile(data.profile_id) || {};
self.category = CategoryList.getCategory(data.category_id) || {}; self.category = CategoryList.getCategory(data.category_id) || {};
self.parent(self, options); self.parent(self, options);
self.addEvents(); self.addEvents();
if(data.identifiers.imdb == 'tt1228705')
self.openDetails();
},
openDetails: function(){
var self = this;
if(!self.details){
self.details = new MovieDetails(self, {
'level': 3
});
// Add action items
self.actions.each(function(action, nr){
var details = action.getDetails();
if(details)
self.details.addSection(action.getLabel(), details);
});
}
App.getPageContainer().grab(self.details);
}, },
addEvents: function(){ addEvents: function(){
@@ -30,7 +59,6 @@ var Movie = new Class({
if(self.data._id != notification.data._id) return; if(self.data._id != notification.data._id) return;
self.busy(false); self.busy(false);
self.removeView();
self.update.delay(2000, self, notification); self.update.delay(2000, self, notification);
}; };
App.on('movie.update', self.global_events['movie.update']); App.on('movie.update', self.global_events['movie.update']);
@@ -47,7 +75,7 @@ var Movie = new Class({
// Remove spinner // Remove spinner
self.global_events['movie.searcher.ended'] = function(notification){ self.global_events['movie.searcher.ended'] = function(notification){
if(notification.data && self.data._id == notification.data._id) if(notification.data && self.data._id == notification.data._id)
self.busy(false) self.busy(false);
}; };
App.on('movie.searcher.ended', self.global_events['movie.searcher.ended']); App.on('movie.searcher.ended', self.global_events['movie.searcher.ended']);
@@ -62,7 +90,7 @@ var Movie = new Class({
var updated = false; var updated = false;
self.data.releases.each(function(release){ self.data.releases.each(function(release){
if(release._id == data._id){ if(release._id == data._id){
release['status'] = data.status; release.status = data.status;
updated = true; updated = true;
} }
}); });
@@ -102,12 +130,12 @@ var Movie = new Class({
if(self.mask) if(self.mask)
self.mask.destroy(); self.mask.destroy();
if(self.spinner) if(self.spinner)
self.spinner.el.destroy(); self.spinner.destroy();
self.spinner = null; self.spinner = null;
self.mask = null; self.mask = null;
}, timeout || 400); }, timeout || 400);
} }
}, timeout || 1000) }, timeout || 1000);
} }
else if(!self.spinner) { else if(!self.spinner) {
self.createMask(); self.createMask();
@@ -130,7 +158,6 @@ var Movie = new Class({
self.data = notification.data; self.data = notification.data;
self.el.empty(); self.el.empty();
self.removeView();
self.profile = Quality.getProfile(self.data.profile_id) || {}; self.profile = Quality.getProfile(self.data.profile_id) || {};
self.category = CategoryList.getCategory(self.data.category_id) || {}; self.category = CategoryList.getCategory(self.data.category_id) || {};
@@ -150,7 +177,7 @@ var Movie = new Class({
if(self.data.info.release_date) if(self.data.info.release_date)
[self.data.info.release_date.dvd, self.data.info.release_date.theater].each(function(timestamp){ [self.data.info.release_date.dvd, self.data.info.release_date.theater].each(function(timestamp){
if (timestamp > 0 && (eta == null || Math.abs(timestamp - now) < Math.abs(eta - now))) if (timestamp > 0 && (eta === null || Math.abs(timestamp - now) < Math.abs(eta - now)))
eta = timestamp; eta = timestamp;
}); });
@@ -163,7 +190,7 @@ var Movie = new Class({
self.select_checkbox = new Element('input[type=checkbox].inlay', { self.select_checkbox = new Element('input[type=checkbox].inlay', {
'events': { 'events': {
'change': function(){ 'change': function(){
self.fireEvent('select') self.fireEvent('select');
} }
} }
}), }),
@@ -181,9 +208,6 @@ var Movie = new Class({
'text': self.data.info.year || 'n/a' 'text': self.data.info.year || 'n/a'
}) })
), ),
self.description = new Element('div.description.tiny_scroll', {
'text': self.data.info.plot
}),
self.eta = eta_date && (now+8035200 > eta) ? new Element('div.eta', { self.eta = eta_date && (now+8035200 > eta) ? new Element('div.eta', {
'text': eta_date, 'text': eta_date,
'title': 'ETA' 'title': 'ETA'
@@ -193,19 +217,24 @@ var Movie = new Class({
'click': function(e){ 'click': function(e){
var releases = self.el.getElement('.actions .releases'); var releases = self.el.getElement('.actions .releases');
if(releases.isVisible()) if(releases.isVisible())
releases.fireEvent('click', [e]) releases.fireEvent('click', [e]);
} }
} }
}) })
), ),
self.actions = new Element('div.actions') self.actions_el = new Element('div.actions', {
'events': {
'click': function(e){
(e).stopPropagation();
}
}
})
) )
); );
if(!self.thumbnail) if(!self.thumbnail)
self.el.addClass('no_thumbnail'); self.el.addClass('no_thumbnail');
//self.changeView(self.view);
self.select_checkbox_class = new Form.Check(self.select_checkbox); self.select_checkbox_class = new Form.Check(self.select_checkbox);
// Add profile // Add profile
@@ -213,9 +242,9 @@ var Movie = new Class({
self.profile.getTypes().each(function(type){ self.profile.getTypes().each(function(type){
var q = self.addQuality(type.get('quality'), type.get('3d')); var q = self.addQuality(type.get('quality'), type.get('3d'));
if((type.finish == true || type.get('finish')) && !q.hasClass('finish')){ if((type.finish === true || type.get('finish')) && !q.hasClass('finish')){
q.addClass('finish'); q.addClass('finish');
q.set('title', q.get('title') + ' Will finish searching for this movie if this quality is found.') q.set('title', q.get('title') + ' Will finish searching for this movie if this quality is found.');
} }
}); });
@@ -223,17 +252,20 @@ var Movie = new Class({
// Add releases // Add releases
self.updateReleases(); self.updateReleases();
Object.each(self.options.actions, function(action, key){ self.options.actions.each(function(action){
self.action[key.toLowerCase()] = action = new self.options.actions[key](self); var action = new action(self),
if(action.el) button = action.getButton();
self.actions.adopt(action) if(button)
self.actions_el.grab(button);
self.actions.push(action);
}); });
}, },
updateReleases: function(){ updateReleases: function(){
var self = this; var self = this;
if(!self.data.releases || self.data.releases.length == 0) return; if(!self.data.releases || self.data.releases.length === 0) return;
self.data.releases.each(function(release){ self.data.releases.each(function(release){
@@ -245,7 +277,7 @@ var Movie = new Class({
if (q && !q.hasClass(status)){ if (q && !q.hasClass(status)){
q.addClass(status); q.addClass(status);
q.set('title', (q.get('title') ? q.get('title') : '') + ' status: '+ status) q.set('title', (q.get('title') ? q.get('title') : '') + ' status: '+ status);
} }
}); });
@@ -271,7 +303,7 @@ var Movie = new Class({
else if(self.data.info.titles.length > 0) else if(self.data.info.titles.length > 0)
return self.getUnprefixedTitle(self.data.info.titles[0]); return self.getUnprefixedTitle(self.data.info.titles[0]);
return 'Unknown movie' return 'Unknown movie';
}, },
getUnprefixedTitle: function(t){ getUnprefixedTitle: function(t){
@@ -284,49 +316,6 @@ var Movie = new Class({
return t; return t;
}, },
slide: function(direction, el){
var self = this;
if(direction == 'in'){
self.temp_view = self.view;
self.changeView('details');
self.el.addEvent('outerClick', function(){
self.removeView();
self.slide('out')
});
el.show();
self.data_container.addClass('hide_right');
}
else {
self.el.removeEvents('outerClick');
setTimeout(function(){
if(self.el)
self.el.getElements('> :not(.data):not(.poster):not(.movie_container)').hide();
}, 600);
self.data_container.removeClass('hide_right');
}
},
changeView: function(new_view){
var self = this;
if(self.el)
self.el
.removeClass(self.view+'_view')
.addClass(new_view+'_view');
self.view = new_view;
},
removeView: function(){
var self = this;
self.el.removeClass(self.view+'_view')
},
getIdentifier: function(){ getIdentifier: function(){
var self = this; var self = this;
@@ -339,12 +328,12 @@ var Movie = new Class({
}, },
get: function(attr){ get: function(attr){
return this.data[attr] || this.data.info[attr] return this.data[attr] || this.data.info[attr];
}, },
select: function(bool){ select: function(bool){
var self = this; var self = this;
self.select_checkbox_class[bool ? 'check' : 'uncheck']() self.select_checkbox_class[bool ? 'check' : 'uncheck']();
}, },
isSelected: function(){ isSelected: function(){

View File

@@ -0,0 +1,367 @@
@import "couchpotato/static/style/mixins";
.page.movies {
z-index: 21; // Sets navigation above
bottom: auto;
}
.page.movies_wanted, .page.movies_manage {
top: $header_height;
padding: 0;
}
.list_list {
font-weight: 300;
.poster {
display: none;
}
.movie {
display: block;
border-top: 1px solid $theme_off;
position: relative;
cursor: pointer;
&:last-child {
border-bottom: none;
}
&:hover {
background: rgba(0,0,0,.1);
}
.data {
padding: $padding/2 $padding;
.info {
@include flexbox();
flex-flow: row nowrap;
.title {
@include flex(1 auto);
.year {
display: inline-block;
margin-left: 10px;
opacity: .5;
}
}
.quality span {
float: left;
color: #FFF;
font-size: .7em;
padding: 2px 4px;
background: rgba(0,0,0,.2);
border-radius: 1px;
margin: 2px 0 0 2px;
}
}
}
}
}
.thumb_list {
font-size: 12px;
padding: 0 $padding;
.movie {
@include span(6);
float: left;
margin-bottom: $padding;
position: relative;
&:nth-child(4n+4){
@include span(last);
}
&:nth-child(4n+5){
clear: both;
}
.poster {
border-radius: $border_radius;
overflow: hidden;
width: 100%;
float: left;
}
.data {
clear: both;
.info {
height: 44px;
.title {
@include flexbox();
padding: 3px 0;
span {
@include flex(1 auto);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.year {
display: inline-block;
margin-left: 5px;
opacity: .5;
}
}
.quality {
white-space: nowrap;
overflow: hidden;
span {
color: #FFF;
font-size: .8em;
padding: 2px 4px;
background: rgba(0,0,0,.2);
border-radius: 1px;
margin-right: 2px;
}
}
}
}
.actions {
position: absolute;
top: $padding / 2;
right: $padding / 2;
display: none;
a {
display: block;
background: $background_color;
padding: $padding / 3;
width: auto;
margin-bottom: 1px;
clear: both;
float: right;
}
}
&:hover .actions {
display: block;
}
.mask {
bottom: 44px;
border-radius: $border_radius;
}
}
}
.check {
position: absolute;
top: 0;
left: $padding;
display: none;
}
.eta {
display: none;
}
.page.movie_details {
$gab-width: $header_width/3;
.overlay {
position: fixed;
top: 0;
bottom: 0;
right: 0;
left: $header_width;
background: rgba(0,0,0,.6);
border-radius: 3px 0 0 3px;
.close {
display: inline-block;
text-align: center;
font-size: 60px;
line-height: $header_height;
color: #FFF;
width: $gab-width;
cursor: pointer;
height: 100%;
}
}
.content {
position: fixed;
top: 0;
bottom: 0;
right: 0;
left: $header_width + $gab-width;
background: $background_color;
z-index: 200;
border-radius: 3px 0 0 3px;
h1 {
margin: 0;
padding: 0 $padding;
font-size: 24px;
line-height: $header_height;
color: rgba(0,0,0,.5);
font-weight: 300;
}
.section {
padding: $padding $padding;
border-top: 1px solid rgba(0,0,0,.1);
}
}
.releases {
.buttons {
margin-bottom: $padding/2;
}
.item span {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
text-align: center;
}
.item .name {
@include flex(1 auto);
text-align: left;
}
.status { min-width: 70px; max-width: 70px; }
.quality { min-width: 60px; max-width: 60px; }
.size { min-width: 40px; max-width: 40px; }
.age { min-width: 40px; max-width: 40px; }
.score { min-width: 45px; max-width: 45px; }
.provider { min-width: 110px; max-width: 110px; }
}
}
.alph_nav {
.mass_edit_form {
display: none;
}
.menus {
margin-right: $padding;
.button {
padding: 0 $padding/2;
line-height: $header_height;
color: rgba(0, 0, 0, 0.5);
}
.counter, .more_menu, .actions {
float: left;
}
.counter {
line-height: $header_height;
}
.actions {
a {
display: none;
}
.active {
display: inline-block;
}
}
.filter {
.wrapper {
width: 320px;
}
.button {
margin-top: -2px;
}
.search {
position: relative;
&:before {
position: absolute;
height: 100%;
line-height: 38px;
padding-left: $padding/2;
font-size: 16px;
opacity: .5;
}
input {
width: 100%;
padding: $padding/2 $padding/2 $padding/2 $padding*1.5;
background: $background_color;
border: none;
border-bottom: 1px solid $theme_off;
}
}
.numbers {
padding: $padding/2;
li {
float: left;
width: 10%;
height: 30px;
line-height: 30px;
text-align: center;
color: rgba(0,0,0,.2);
cursor: default;
&.active {
background: $theme_off;
}
&.available {
color: rgba(0,0,0,1);
cursor: pointer;
&:hover {
background: $theme_off;
}
}
}
}
}
.more_menu {
&.show .button {
color: rgba(0, 0, 0, 1);
}
.wrapper {
top: $header_height - 10px;
padding-top: 4px;
border-radius: $border_radius $border_radius 0 0;
&:before {
top: 0;
left: auto;
right: 22px;
}
ul {
border-radius: $border_radius $border_radius 0 0;
}
}
}
}
}

View File

@@ -0,0 +1,49 @@
Page.Movies = new Class({
Extends: PageBase,
name: 'movies',
sub_pages: ['Wanted', 'Manage'],
default_page: 'Wanted',
current_page: null,
initialize: function(parent, options){
var self = this;
self.parent(parent, options);
self.navigation = new BlockNavigation();
$(self.navigation).inject(self.el, 'top');
},
defaultAction: function(action, params){
var self = this;
if(self.current_page){
self.current_page.hide();
if(self.current_page.list && self.current_page.list.navigation)
self.current_page.list.navigation.dispose();
}
var route = new Route();
route.parse(action);
var page_name = route.getPage() != 'index' ? route.getPage().capitalize() : self.default_page;
var page = self.sub_pages.filter(function(page){
return page.name == page_name;
}).pick()['class'];
page.open(route.getAction() || 'index', params);
page.show();
if(page.list && page.list.navigation)
page.list.navigation.inject(self.navigation);
self.current_page = page;
self.navigation.activate(page_name.toLowerCase());
}
});

View File

@@ -1,4 +1,4 @@
Block.Search.MovieItem = new Class({ var BlockSearchMovieItem = new Class({
Implements: [Options, Events], Implements: [Options, Events],
@@ -31,9 +31,11 @@ Block.Search.MovieItem = new Class({
} }
}).adopt( }).adopt(
self.info_container = new Element('div.info').adopt( self.info_container = new Element('div.info').adopt(
new Element('h2').adopt( new Element('h2', {
'title': self.getTitle()
}).adopt(
self.title = new Element('span.title', { self.title = new Element('span.title', {
'text': info.titles && info.titles.length > 0 ? info.titles[0] : 'Unknown' 'text': self.getTitle()
}), }),
self.year = info.year ? new Element('span.year', { self.year = info.year ? new Element('span.year', {
'text': info.year 'text': info.year
@@ -48,7 +50,7 @@ Block.Search.MovieItem = new Class({
self.alternativeTitle({ self.alternativeTitle({
'title': title 'title': title
}); });
}) });
}, },
alternativeTitle: function(alternative){ alternativeTitle: function(alternative){
@@ -68,7 +70,7 @@ Block.Search.MovieItem = new Class({
}, },
get: function(key){ get: function(key){
return this.info[key] return this.info[key];
}, },
showOptions: function(){ showOptions: function(){
@@ -77,7 +79,7 @@ Block.Search.MovieItem = new Class({
self.createOptions(); self.createOptions();
self.data_container.addClass('open'); self.data_container.addClass('open');
self.el.addEvent('outerClick', self.closeOptions.bind(self)) self.el.addEvent('outerClick', self.closeOptions.bind(self));
}, },
@@ -85,7 +87,7 @@ Block.Search.MovieItem = new Class({
var self = this; var self = this;
self.data_container.removeClass('open'); self.data_container.removeClass('open');
self.el.removeEvents('outerClick') self.el.removeEvents('outerClick');
}, },
add: function(e){ add: function(e){
@@ -132,10 +134,11 @@ Block.Search.MovieItem = new Class({
if(!self.options_el.hasClass('set')){ if(!self.options_el.hasClass('set')){
var in_library;
if(info.in_library){ if(info.in_library){
var in_library = []; in_library = [];
(info.in_library.releases || []).each(function(release){ (info.in_library.releases || []).each(function(release){
in_library.include(release.quality) in_library.include(release.quality);
}); });
} }
@@ -171,14 +174,14 @@ Block.Search.MovieItem = new Class({
Array.each(self.alternative_titles, function(alt){ Array.each(self.alternative_titles, function(alt){
new Element('option', { new Element('option', {
'text': alt.title 'text': alt.title
}).inject(self.title_select) }).inject(self.title_select);
}); });
// Fill categories // Fill categories
var categories = CategoryList.getAll(); var categories = CategoryList.getAll();
if(categories.length == 0) if(categories.length === 0)
self.category_select.hide(); self.category_select.hide();
else { else {
self.category_select.show(); self.category_select.show();
@@ -199,12 +202,12 @@ Block.Search.MovieItem = new Class({
new Element('option', { new Element('option', {
'value': profile.get('_id'), 'value': profile.get('_id'),
'text': profile.get('label') 'text': profile.get('label')
}).inject(self.profile_select) }).inject(self.profile_select);
}); });
self.options_el.addClass('set'); self.options_el.addClass('set');
if(categories.length == 0 && self.title_select.getElements('option').length == 1 && profiles.length == 1 && if(categories.length === 0 && self.title_select.getElements('option').length == 1 && profiles.length == 1 &&
!(self.info.in_wanted && self.info.in_wanted.profile_id || in_library)) !(self.info.in_wanted && self.info.in_wanted.profile_id || in_library))
self.add(); self.add();
@@ -218,12 +221,12 @@ Block.Search.MovieItem = new Class({
self.mask = new Element('div.mask').inject(self.el).fade('hide'); self.mask = new Element('div.mask').inject(self.el).fade('hide');
createSpinner(self.mask); createSpinner(self.mask);
self.mask.fade('in') self.mask.fade('in');
}, },
toElement: function(){ toElement: function(){
return this.el return this.el;
} }
}); });

View File

@@ -1,4 +1,4 @@
Page.Wanted = new Class({ var MoviesWanted = new Class({
Extends: PageBase, Extends: PageBase,
@@ -10,7 +10,7 @@ Page.Wanted = new Class({
indexAction: function(){ indexAction: function(){
var self = this; var self = this;
if(!self.wanted){ if(!self.list){
self.manual_search = new Element('a', { self.manual_search = new Element('a', {
'title': 'Force a search for the full wanted list', 'title': 'Force a search for the full wanted list',
@@ -20,7 +20,6 @@ Page.Wanted = new Class({
} }
}); });
self.scan_folder = new Element('a', { self.scan_folder = new Element('a', {
'title': 'Scan a folder and rename all movies in it', 'title': 'Scan a folder and rename all movies in it',
'text': 'Manual folder scan', 'text': 'Manual folder scan',
@@ -30,7 +29,7 @@ Page.Wanted = new Class({
}); });
// Wanted movies // Wanted movies
self.wanted = new MovieList({ self.list = new MovieList({
'identifier': 'wanted', 'identifier': 'wanted',
'status': 'active', 'status': 'active',
'actions': [MA.IMDB, MA.Trailer, MA.Release, MA.Edit, MA.Refresh, MA.Readd, MA.Delete], 'actions': [MA.IMDB, MA.Trailer, MA.Release, MA.Edit, MA.Refresh, MA.Readd, MA.Delete],
@@ -38,7 +37,7 @@ Page.Wanted = new Class({
'menu': [self.manual_search, self.scan_folder], 'menu': [self.manual_search, self.scan_folder],
'on_empty_element': App.createUserscriptButtons().addClass('empty_wanted') 'on_empty_element': App.createUserscriptButtons().addClass('empty_wanted')
}); });
$(self.wanted).inject(self.el); $(self.list).inject(self.el);
// Check if search is in progress // Check if search is in progress
self.startProgressInterval.delay(4000, self); self.startProgressInterval.delay(4000, self);
@@ -91,7 +90,7 @@ Page.Wanted = new Class({
}; };
if(!self.folder_browser){ if(!self.folder_browser){
self.folder_browser = new Option['Directory']("Scan", "folder", "", options); self.folder_browser = new Option.Directory("Scan", "folder", "", options);
self.folder_browser.save = function() { self.folder_browser.save = function() {
var folder = self.folder_browser.getValue(); var folder = self.folder_browser.getValue();

View File

@@ -59,7 +59,7 @@ var Charts = new Class({
self.el_refreshing_text.hide(); self.el_refreshing_text.hide();
self.el_refresh_link.show(); self.el_refresh_link.show();
if(!json || json.count == 0){ if(!json || json.count === 0){
self.el_no_charts_enabled.show(); self.el_no_charts_enabled.show();
self.el_refresh_link.show(); self.el_refresh_link.show();
self.el_refreshing_text.hide(); self.el_refreshing_text.hide();
@@ -84,17 +84,16 @@ var Charts = new Class({
Object.each(chart.list, function(movie){ Object.each(chart.list, function(movie){
var m = new Block.Search.MovieItem(movie, { var m = new BlockSearchMovieItem(movie, {
'onAdded': function(){ 'onAdded': function(){
self.afterAdded(m, movie) self.afterAdded(m, movie);
} }
}); });
var in_database_class = (chart.hide_wanted && movie.in_wanted) ? 'hidden' : (movie.in_wanted ? 'chart_in_wanted' : ((chart.hide_library && movie.in_library) ? 'hidden': (movie.in_library ? 'chart_in_library' : ''))), var in_database_class = (chart.hide_wanted && movie.in_wanted) ? 'hidden' : (movie.in_wanted ? 'chart_in_wanted' : ((chart.hide_library && movie.in_library) ? 'hidden': (movie.in_library ? 'chart_in_library' : ''))),
in_database_title = movie.in_wanted ? 'Movie in wanted list' : (movie.in_library ? 'Movie in library' : ''); in_database_title = movie.in_wanted ? 'Movie in wanted list' : (movie.in_library ? 'Movie in library' : '');
m.el m.el.addClass(in_database_class)
.addClass(in_database_class)
.grab( .grab(
new Element('div.chart_number', { new Element('div.chart_number', {
'text': it++, 'text': it++,
@@ -136,7 +135,7 @@ var Charts = new Class({
'text': plot, 'text': plot,
'events': { 'events': {
'click': function(){ 'click': function(){
this.toggleClass('full') this.toggleClass('full');
} }
} }
}) : null }) : null

View File

@@ -60,16 +60,16 @@ var SuggestList = new Class({
var self = this; var self = this;
if(!json || json.count == 0){ if(!json || json.count === 0){
self.el.hide(); self.el.hide();
} }
else { else {
Object.each(json.suggestions, function(movie){ Object.each(json.suggestions, function(movie){
var m = new Block.Search.MovieItem(movie, { var m = new BlockSearchMovieItem(movie, {
'onAdded': function(){ 'onAdded': function(){
self.afterAdded(m, movie) self.afterAdded(m, movie);
} }
}); });
m.data_container.grab( m.data_container.grab(
@@ -114,7 +114,7 @@ var SuggestList = new Class({
'text': plot, 'text': plot,
'events': { 'events': {
'click': function(){ 'click': function(){
this.toggleClass('full') this.toggleClass('full');
} }
} }
}) : null }) : null

View File

@@ -20,8 +20,8 @@ var NotificationBase = new Class({
self.notifications = []; self.notifications = [];
App.addEvent('load', function(){ App.addEvent('load', function(){
App.block.notification = new Block.Menu(self, { App.block.notification = new BlockMenu(self, {
'button_class': 'icon2.eye-open', 'button_class': 'icon-notifications',
'class': 'notification_menu', 'class': 'notification_menu',
'onOpen': self.markAsRead.bind(self) 'onOpen': self.markAsRead.bind(self)
}); });
@@ -32,7 +32,7 @@ var NotificationBase = new Class({
window.addEvent('load', function(){ window.addEvent('load', function(){
self.startInterval.delay($(window).getSize().x <= 480 ? 2000 : 100, self); self.startInterval.delay($(window).getSize().x <= 480 ? 2000 : 100, self);
}) });
}, },
@@ -46,16 +46,15 @@ var NotificationBase = new Class({
new Element('span.'+(result.read ? 'read' : '' )).adopt( new Element('span.'+(result.read ? 'read' : '' )).adopt(
new Element('span.message', {'html': result.message}), new Element('span.message', {'html': result.message}),
new Element('span.added', {'text': added.timeDiffInWords(), 'title': added}) new Element('span.added', {'text': added.timeDiffInWords(), 'title': added})
) ), 'top');
, 'top');
self.notifications.include(result); self.notifications.include(result);
if((result.important !== undefined || result.sticky !== undefined) && !result.read){ if((result.important !== undefined || result.sticky !== undefined) && !result.read){
var sticky = true; var sticky = true;
App.trigger('message', [result.message, sticky, result]) App.trigger('message', [result.message, sticky, result]);
} }
else if(!result.read){ else if(!result.read){
self.setBadge(self.notifications.filter(function(n){ return !n.read}).length) self.setBadge(self.notifications.filter(function(n){ return !n.read; }).length);
} }
}, },
@@ -63,7 +62,7 @@ var NotificationBase = new Class({
setBadge: function(value){ setBadge: function(value){
var self = this; var self = this;
self.badge.set('text', value); self.badge.set('text', value);
self.badge[value ? 'show' : 'hide']() self.badge[value ? 'show' : 'hide']();
}, },
markAsRead: function(force_ids){ markAsRead: function(force_ids){
@@ -72,13 +71,13 @@ var NotificationBase = new Class({
if(!force_ids) { if(!force_ids) {
var rn = self.notifications.filter(function(n){ var rn = self.notifications.filter(function(n){
return !n.read && n.important === undefined return !n.read && n.important === undefined;
}); });
var ids = []; ids = [];
rn.each(function(n){ rn.each(function(n){
ids.include(n._id) ids.include(n._id);
}) });
} }
if(ids.length > 0) if(ids.length > 0)
@@ -87,9 +86,9 @@ var NotificationBase = new Class({
'ids': ids.join(',') 'ids': ids.join(',')
}, },
'onSuccess': function(){ 'onSuccess': function(){
self.setBadge('') self.setBadge('');
} }
}) });
}, },
@@ -104,7 +103,7 @@ var NotificationBase = new Class({
self.request = Api.request('notification.listener', { self.request = Api.request('notification.listener', {
'data': {'init':true}, 'data': {'init':true},
'onSuccess': function(json){ 'onSuccess': function(json){
self.processData(json, true) self.processData(json, true);
} }
}).send(); }).send();
@@ -112,7 +111,7 @@ var NotificationBase = new Class({
if(self.request && self.request.isRunning()){ if(self.request && self.request.isRunning()){
self.request.cancel(); self.request.cancel();
self.startPoll() self.startPoll();
} }
}, 120000); }, 120000);
@@ -130,15 +129,15 @@ var NotificationBase = new Class({
self.request = Api.request('nonblock/notification.listener', { self.request = Api.request('nonblock/notification.listener', {
'onSuccess': function(json){ 'onSuccess': function(json){
self.processData(json, false) self.processData(json, false);
}, },
'data': { 'data': {
'last_id': self.last_id 'last_id': self.last_id
}, },
'onFailure': function(){ 'onFailure': function(){
self.startPoll.delay(2000, self) self.startPoll.delay(2000, self);
} }
}).send() }).send();
}, },
@@ -160,7 +159,7 @@ var NotificationBase = new Class({
}); });
if(json.result.length > 0) if(json.result.length > 0)
self.last_id = json.result.getLast().message_id self.last_id = json.result.getLast().message_id;
} }
// Restart poll // Restart poll
@@ -175,11 +174,11 @@ var NotificationBase = new Class({
var new_message = new Element('div', { var new_message = new Element('div', {
'class': 'message' + (sticky ? ' sticky' : ''), 'class': 'message' + (sticky ? ' sticky' : ''),
'html': message 'html': '<div class="inner">' + message + '</div>'
}).inject(self.message_container, 'top'); }).inject(self.message_container, 'top');
setTimeout(function(){ setTimeout(function(){
new_message.addClass('show') new_message.addClass('show');
}, 10); }, 10);
var hide_message = function(){ var hide_message = function(){
@@ -211,8 +210,8 @@ var NotificationBase = new Class({
var setting_page = App.getPage('Settings'); var setting_page = App.getPage('Settings');
setting_page.addEvent('create', function(){ setting_page.addEvent('create', function(){
Object.each(setting_page.tabs.notifications.groups, self.addTestButton.bind(self)) Object.each(setting_page.tabs.notifications.groups, self.addTestButton.bind(self));
}) });
}, },
@@ -235,20 +234,21 @@ var NotificationBase = new Class({
button.set('text', button_name); button.set('text', button_name);
var message;
if(json.success){ if(json.success){
var message = new Element('span.success', { message = new Element('span.success', {
'text': 'Notification successful' 'text': 'Notification successful'
}).inject(button, 'after') }).inject(button, 'after');
} }
else { else {
var message = new Element('span.failed', { message = new Element('span.failed', {
'text': 'Notification failed. Check logs for details.' 'text': 'Notification failed. Check logs for details.'
}).inject(button, 'after') }).inject(button, 'after');
} }
(function(){ (function(){
message.destroy(); message.destroy();
}).delay(3000) }).delay(3000);
} }
}); });
} }

View File

@@ -16,7 +16,7 @@ var TwitterNotification = new Class({
var twitter_set = 0; var twitter_set = 0;
fieldset.getElements('input[type=text]').each(function(el){ fieldset.getElements('input[type=text]').each(function(el){
twitter_set += +(el.get('value') != ''); twitter_set += +(el.get('value') !== '');
}); });
@@ -57,7 +57,7 @@ var TwitterNotification = new Class({
} }
}) })
).inject(fieldset.getElement('.test_button'), 'before'); ).inject(fieldset.getElement('.test_button'), 'before');
}) });
} }

View File

@@ -52,7 +52,7 @@ var CategoryListBase = new Class({
}); });
}) });
}, },
@@ -71,7 +71,7 @@ var CategoryListBase = new Class({
'events': { 'events': {
'click': function(){ 'click': function(){
var category = self.createCategory(); var category = self.createCategory();
$(category).inject(self.category_container) $(category).inject(self.category_container);
} }
} }
}) })
@@ -79,15 +79,15 @@ var CategoryListBase = new Class({
// Add categories, that aren't part of the core (for editing) // Add categories, that aren't part of the core (for editing)
Array.each(self.categories, function(category){ Array.each(self.categories, function(category){
$(category).inject(self.category_container) $(category).inject(self.category_container);
}); });
}, },
getCategory: function(id){ getCategory: function(id){
return this.categories.filter(function(category){ return this.categories.filter(function(category){
return category.data._id == id return category.data._id == id;
}).pick() }).pick();
}, },
getAll: function(){ getAll: function(){
@@ -97,7 +97,7 @@ var CategoryListBase = new Class({
createCategory: function(data){ createCategory: function(data){
var self = this; var self = this;
var data = data || {'id': randomString()}; data = data || {'id': randomString()};
var category = new Category(data); var category = new Category(data);
self.categories.include(category); self.categories.include(category);
@@ -225,7 +225,7 @@ var Category = new Class({
) )
); );
self.makeSortable() self.makeSortable();
}, },
@@ -248,7 +248,7 @@ var Category = new Class({
} }
}); });
}).delay(delay || 0, self) }).delay(delay || 0, self);
}, },
@@ -262,13 +262,13 @@ var Category = new Class({
'preferred' : self.el.getElement('.category_preferred input').get('value'), 'preferred' : self.el.getElement('.category_preferred input').get('value'),
'ignored' : self.el.getElement('.category_ignored input').get('value'), 'ignored' : self.el.getElement('.category_ignored input').get('value'),
'destination': self.data.destination 'destination': self.data.destination
} };
}, },
del: function(){ del: function(){
var self = this; var self = this;
if(self.data.label == undefined){ if(self.data.label === undefined){
self.el.destroy(); self.el.destroy();
return; return;
} }
@@ -318,11 +318,11 @@ var Category = new Class({
}, },
get: function(attr){ get: function(attr){
return this.data[attr] return this.data[attr];
}, },
toElement: function(){ toElement: function(){
return this.el return this.el;
} }
}); });

View File

@@ -8,20 +8,19 @@ Page.Log = new Class({
has_tab: false, has_tab: false,
log_items: [], log_items: [],
report_text: '\ report_text: '### Steps to reproduce:\n'+
### Steps to reproduce:\n\ '1. ..\n'+
1. ..\n\ '2. ..\n'+
2. ..\n\ '\n'+
\n\ '### Information:\n'+
### Information:\n\ 'Movie(s) I have this with: ...\n'+
Movie(s) I have this with: ...\n\ 'Quality of the movie being searched: ...\n'+
Quality of the movie being searched: ...\n\ 'Providers I use: ...\n'+
Providers I use: ...\n\ 'Version of CouchPotato: {version}\n'+
Version of CouchPotato: {version}\n\ 'Running on: ...\n'+
Running on: ...\n\ '\n'+
\n\ '### Logs:\n'+
### Logs:\n\ '```\n{issue}```',
```\n{issue}```',
indexAction: function () { indexAction: function () {
var self = this; var self = this;
@@ -133,7 +132,7 @@ Running on: ...\n\
new Element('span.message', { new Element('span.message', {
'text': log.message 'text': log.message
}) })
)) ));
}); });
return elements; return elements;

View File

@@ -81,7 +81,7 @@ var Profile = new Class({
'quality': quality, 'quality': quality,
'finish': data.finish[nr] || false, 'finish': data.finish[nr] || false,
'3d': data['3d'] ? data['3d'][nr] || false : false '3d': data['3d'] ? data['3d'][nr] || false : false
}) });
}); });
} }
@@ -123,7 +123,7 @@ var Profile = new Class({
} }
}); });
}).delay(delay, self) }).delay(delay, self);
}, },
@@ -148,7 +148,7 @@ var Profile = new Class({
}); });
}); });
return data return data;
}, },
addType: function(data){ addType: function(data){
@@ -177,7 +177,7 @@ var Profile = new Class({
var self = this; var self = this;
return self.types.filter(function(type){ return self.types.filter(function(type){
return type.get('quality') return type.get('quality');
}); });
}, },
@@ -231,15 +231,15 @@ var Profile = new Class({
}, },
get: function(attr){ get: function(attr){
return this.data[attr] return this.data[attr];
}, },
isCore: function(){ isCore: function(){
return this.data.core return this.data.core;
}, },
toElement: function(){ toElement: function(){
return this.el return this.el;
} }
}); });
@@ -342,7 +342,7 @@ Profile.Type = new Class({
'text': q.label, 'text': q.label,
'value': q.identifier, 'value': q.identifier,
'data-allow_3d': q.allow_3d 'data-allow_3d': q.allow_3d
}).inject(self.qualities) }).inject(self.qualities);
}); });
self.qualities.set('value', self.data.quality); self.qualities.set('value', self.data.quality);
@@ -358,7 +358,7 @@ Profile.Type = new Class({
'quality': self.qualities.get('value'), 'quality': self.qualities.get('value'),
'finish': +self.finish.checked, 'finish': +self.finish.checked,
'3d': +self['3d'].checked '3d': +self['3d'].checked
} };
}, },
get: function(key){ get: function(key){

View File

@@ -12,20 +12,20 @@ var QualityBase = new Class({
self.profiles = []; self.profiles = [];
Array.each(data.profiles, self.createProfilesClass.bind(self)); Array.each(data.profiles, self.createProfilesClass.bind(self));
App.addEvent('loadSettings', self.addSettings.bind(self)) App.addEvent('loadSettings', self.addSettings.bind(self));
}, },
getProfile: function(id){ getProfile: function(id){
return this.profiles.filter(function(profile){ return this.profiles.filter(function(profile){
return profile.data._id == id return profile.data._id == id;
}).pick() }).pick();
}, },
// Hide items when getting profiles // Hide items when getting profiles
getActiveProfiles: function(){ getActiveProfiles: function(){
return Array.filter(this.profiles, function(profile){ return Array.filter(this.profiles, function(profile){
return !profile.data.hide return !profile.data.hide;
}); });
}, },
@@ -37,7 +37,7 @@ var QualityBase = new Class({
} }
catch(e){} catch(e){}
return {} return {};
}, },
addSettings: function(){ addSettings: function(){
@@ -58,7 +58,7 @@ var QualityBase = new Class({
self.createProfileOrdering(); self.createProfileOrdering();
self.createSizes(); self.createSizes();
}) });
}, },
@@ -68,7 +68,7 @@ var QualityBase = new Class({
createProfiles: function(){ createProfiles: function(){
var self = this; var self = this;
var non_core_profiles = Array.filter(self.profiles, function(profile){ return !profile.isCore() }); var non_core_profiles = Array.filter(self.profiles, function(profile){ return !profile.isCore(); });
var count = non_core_profiles.length; var count = non_core_profiles.length;
self.settings.createGroup({ self.settings.createGroup({
@@ -81,7 +81,7 @@ var QualityBase = new Class({
'events': { 'events': {
'click': function(){ 'click': function(){
var profile = self.createProfilesClass(); var profile = self.createProfilesClass();
$(profile).inject(self.profile_container) $(profile).inject(self.profile_container);
} }
} }
}) })
@@ -89,7 +89,7 @@ var QualityBase = new Class({
// Add profiles, that aren't part of the core (for editing) // Add profiles, that aren't part of the core (for editing)
Array.each(non_core_profiles, function(profile){ Array.each(non_core_profiles, function(profile){
$(profile).inject(self.profile_container) $(profile).inject(self.profile_container);
}); });
}, },
@@ -97,7 +97,7 @@ var QualityBase = new Class({
createProfilesClass: function(data){ createProfilesClass: function(data){
var self = this; var self = this;
var data = data || {'id': randomString()}; data = data || {'id': randomString()};
var profile = new Profile(data); var profile = new Profile(data);
self.profiles.include(profile); self.profiles.include(profile);
@@ -190,7 +190,6 @@ var QualityBase = new Class({
'name': 'sizes' 'name': 'sizes'
}).inject(self.content); }).inject(self.content);
new Element('div.item.head.ctrlHolder').adopt( new Element('div.item.head.ctrlHolder').adopt(
new Element('span.label', {'text': 'Quality'}), new Element('span.label', {'text': 'Quality'}),
new Element('span.min', {'text': 'Min'}), new Element('span.min', {'text': 'Min'}),
@@ -204,7 +203,7 @@ var QualityBase = new Class({
'value': quality.size_min, 'value': quality.size_min,
'events': { 'events': {
'keyup': function(e){ 'keyup': function(e){
self.changeSize(quality.identifier, 'size_min', e.target.get('value')) self.changeSize(quality.identifier, 'size_min', e.target.get('value'));
} }
} }
}), }),
@@ -212,11 +211,11 @@ var QualityBase = new Class({
'value': quality.size_max, 'value': quality.size_max,
'events': { 'events': {
'keyup': function(e){ 'keyup': function(e){
self.changeSize(quality.identifier, 'size_max', e.target.get('value')) self.changeSize(quality.identifier, 'size_max', e.target.get('value'));
} }
} }
}) })
).inject(group) ).inject(group);
}); });
}, },
@@ -235,7 +234,7 @@ var QualityBase = new Class({
'value': value 'value': value
} }
}); });
}).delay(300) }).delay(300);
} }

View File

@@ -35,7 +35,7 @@ Page.Userscript = new Class({
if(json.error) if(json.error)
self.frame.set('html', json.error); self.frame.set('html', json.error);
else { else {
var item = new Block.Search.MovieItem(json.movie); var item = new BlockSearchMovieItem(json.movie);
self.frame.adopt(item); self.frame.adopt(item);
item.showOptions(); item.showOptions();
} }
@@ -54,7 +54,7 @@ var UserscriptSettingTab = new Class({
initialize: function(){ initialize: function(){
var self = this; var self = this;
App.addEvent('loadSettings', self.addSettings.bind(self)) App.addEvent('loadSettings', self.addSettings.bind(self));
}, },
@@ -88,7 +88,7 @@ var UserscriptSettingTab = new Class({
'events': { 'events': {
'click': function(e){ 'click': function(e){
(e).stop(); (e).stop();
alert('Drag it to your bookmark ;)') alert('Drag it to your bookmark ;)');
} }
} }
}), }),

View File

@@ -41,7 +41,7 @@ Page.Wizard = new Class({
'content': function(){ 'content': function(){
return App.createUserscriptButtons().setStyles({ return App.createUserscriptButtons().setStyles({
'background-image': "url('https://couchpota.to/media/images/userscript.gif')" 'background-image': "url('https://couchpota.to/media/images/userscript.gif')"
}) });
} }
}, },
'finish': { 'finish': {
@@ -103,7 +103,7 @@ Page.Wizard = new Class({
(function(){ (function(){
var sc = self.el.getElement('.wgroup_'+action); var sc = self.el.getElement('.wgroup_'+action);
self.scroll.start(0, sc.getCoordinates().top-80); self.scroll.start(0, sc.getCoordinates().top-80);
}).delay(1) }).delay(1);
}, },
orderGroups: function(){ orderGroups: function(){
@@ -114,8 +114,9 @@ Page.Wizard = new Class({
self.groups.each(function(group){ self.groups.each(function(group){
var group_container;
if(self.headers[group]){ if(self.headers[group]){
var group_container = new Element('.wgroup_'+group, { group_container = new Element('.wgroup_'+group, {
'styles': { 'styles': {
'opacity': 0.2 'opacity': 0.2
}, },
@@ -127,7 +128,7 @@ Page.Wizard = new Class({
if(self.headers[group].include){ if(self.headers[group].include){
self.headers[group].include.each(function(inc){ self.headers[group].include.each(function(inc){
group_container.addClass('wgroup_'+inc); group_container.addClass('wgroup_'+inc);
}) });
} }
var content = self.headers[group].content; var content = self.headers[group].content;
@@ -148,7 +149,7 @@ Page.Wizard = new Class({
tab_navigation = []; tab_navigation = [];
self.headers[group].include.each(function(inc){ self.headers[group].include.each(function(inc){
tab_navigation.include(tabs.getElement('.t_'+inc)); tab_navigation.include(tabs.getElement('.t_'+inc));
}) });
} }
if(tab_navigation && group_container){ if(tab_navigation && group_container){
@@ -165,7 +166,7 @@ Page.Wizard = new Class({
'href': App.createUrl('wizard/'+group), 'href': App.createUrl('wizard/'+group),
'text': (self.headers[group].label || group).capitalize() 'text': (self.headers[group].label || group).capitalize()
}) })
).inject(tabs) ).inject(tabs);
} }
else else
@@ -190,7 +191,7 @@ Page.Wizard = new Class({
} }
if(self.headers[group] && self.headers[group].event) if(self.headers[group] && self.headers[group].event)
self.headers[group].event.call() self.headers[group].event.call();
}); });
// Remove toggle // Remove toggle
@@ -220,22 +221,22 @@ Page.Wizard = new Class({
g.tween('opacity', 1); g.tween('opacity', 1);
}; };
if(nr == 0) if(nr === 0)
func(); func();
new ScrollSpy( { new ScrollSpy( {
min: function(){ min: function(){
var c = g.getCoordinates(); var c = g.getCoordinates();
var top = c.top-(window.getSize().y/2); var top = c.top-(window.getSize().y/2);
return top > minimum ? minimum : top return top > minimum ? minimum : top;
}, },
max: function(){ max: function(){
var c = g.getCoordinates(); var c = g.getCoordinates();
return c.top+(c.height/2) return c.top+(c.height/2);
}, },
onEnter: func, onEnter: func,
onLeave: function(){ onLeave: function(){
g.tween('opacity', 0.2) g.tween('opacity', 0.2);
} }
}); });
}); });

View File

@@ -333,7 +333,7 @@ def runCouchPotato(options, base_path, args, data_dir = None, log_dir = None, En
while try_restart: while try_restart:
try: try:
server.listen(config['port'], config['host']) server.listen(config['port'], config['host'])
try: server.listen(config['port'], config['host6']) try: server.listen(config['port'], config['host6'])
except: log.info2('Tried to bind to IPV6 but failed') except: log.info2('Tried to bind to IPV6 but failed')

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 213 KiB

View File

@@ -3,242 +3,36 @@
<svg xmlns="http://www.w3.org/2000/svg"> <svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata> <metadata></metadata>
<defs> <defs>
<font id="lobster_1.4regular" horiz-adv-x="1034" > <font id="lobster_14regular" horiz-adv-x="2048" >
<font-face units-per-em="2048" ascent="1638" descent="-410" /> <font-face units-per-em="2048" ascent="1638" descent="-410" />
<missing-glyph horiz-adv-x="444" /> <missing-glyph horiz-adv-x="444" />
<glyph unicode="&#xfb01;" horiz-adv-x="1093" d="M-424 -283q0 53 21 96.5t51.5 72t82 55t93.5 41.5t106 34l228 1078q93 440 479 440q367 0 367 -236q0 -86 -46 -125.5t-116 -39.5q-52 0 -87.5 25t-35.5 85q0 37 19.5 68.5t49.5 31.5q15 0 17 -2q-1 39 -32 60.5t-81 21.5q-168 0 -217 -231l-35 -168h164l-16 -82h-164 l-234 -1106q-21 -101 -62 -173t-93 -108t-101.5 -51.5t-103.5 -15.5q-114 0 -184 62t-70 167zM-311 -248q0 -32 17.5 -52t34 -25t32.5 -5q35 0 68 39.5t50 120.5l25 119q-102 -32 -164.5 -83.5t-62.5 -113.5zM530 233q0 51 17 134l139 657h295l-147 -696q-9 -40 -9 -66 q0 -42 20 -59t64 -17q59 0 110 51.5t75 129.5h86q-33 -95 -79 -167t-90.5 -111t-95.5 -63t-88.5 -31t-76.5 -7q-98 0 -159 61t-61 184z" /> <glyph />
<glyph unicode="&#xfb02;" horiz-adv-x="1122" d="M-428 -291q0 55 19.5 99t48 73t79 55.5t94.5 42.5t113 37l246 1170q18 84 50 148t69 101t83 60.5t86.5 31t84.5 7.5q86 0 185.5 -22t170.5 -47.5t186 -71.5l-225 -1065q-8 -36 -8 -66q0 -42 20 -59t64 -17q59 0 109.5 51.5t74.5 129.5h86q-33 -95 -79 -167t-90.5 -111 t-95.5 -63t-88.5 -31t-76.5 -7q-98 0 -158.5 61t-60.5 184q0 56 16 134l213 1005q-35 15 -87.5 24t-79.5 9q-43 0 -82 -35t-58 -127l-45 -219h191l-17 -82h-190l-234 -1106q-18 -84 -49.5 -148t-68.5 -101.5t-83 -60.5t-86 -30.5t-85 -7.5q-97 0 -169.5 62t-72.5 159z M-315 -262q0 -23 25 -45.5t57 -22.5q36 0 69.5 38.5t50.5 121.5l25 119q-109 -36 -168 -85t-59 -126z" /> <glyph />
<glyph unicode="&#xfb03;" horiz-adv-x="1564" d="M-428 -291q0 55 19.5 99t48 73t79 55.5t94.5 42.5t113 37l246 1170q18 84 50 148t68.5 101.5t82.5 60.5t86.5 30.5t85.5 7.5q170 0 252 -107q119 107 309 107q367 0 367 -236q0 -86 -46 -125.5t-116 -39.5q-52 0 -87.5 25t-35.5 85q0 37 19.5 68.5t49.5 31.5q15 0 17 -2 q-1 39 -32 60.5t-81 21.5q-168 0 -217 -231l-35 -168h543l-147 -696q-9 -40 -9 -66q0 -42 20 -59t64 -17q59 0 110 51.5t75 129.5h86q-33 -95 -79 -167t-90.5 -111t-95.5 -63t-88.5 -31t-76.5 -7q-98 0 -159 61t-61 184q0 51 17 134l121 575h-246l-234 -1106 q-21 -101 -62 -173t-93 -108t-101.5 -51.5t-103.5 -15.5q-75 0 -133.5 29t-89.5 80q-99 -109 -262 -109q-97 0 -169.5 62t-72.5 159zM-303 -262q0 -23 25 -45.5t57 -22.5q36 0 70 38.5t51 121.5l24 119q-109 -36 -168 -85t-59 -126zM145 -293q5 -36 29 -50.5t47 -14.5 q45 0 81.5 45.5t57.5 142.5l48 223l-183 -37l-39 -180q-13 -65 -41 -129zM238 74l180 30l176 838h-172zM438 1024h174l15 70q32 153 102 256q-31 34 -82 34q-78 0 -119.5 -56t-56.5 -136z" /> <glyph unicode="&#xd;" />
<glyph unicode="&#xfb04;" horiz-adv-x="1597" d="M-428 -291q0 55 19.5 99t48 73t79 55.5t94.5 42.5t113 37l246 1170q18 84 50 148t68.5 101.5t82.5 60.5t86.5 30.5t85.5 7.5q152 0 235 -86q94 86 240 86q86 0 186 -22t171 -47.5t186 -71.5l-226 -1065q-8 -36 -8 -66q0 -42 20 -59t64 -17q59 0 109.5 51.5t74.5 129.5h86 q-33 -95 -79 -167t-90.5 -111t-95.5 -63t-88.5 -31t-76.5 -7q-98 0 -158.5 61t-60.5 184q0 51 17 134l213 1005q-35 15 -88 24t-80 9q-43 0 -82 -35t-58 -127l-45 -219h191l-17 -82h-190l-236 -1106q-21 -101 -62 -173t-93 -108t-101.5 -51.5t-103.5 -15.5q-76 0 -134 29 t-89 82q-98 -111 -262 -111q-97 0 -169.5 62t-72.5 159zM-303 -262q0 -23 25 -45.5t57 -22.5q36 0 70 38.5t51 121.5l24 119q-109 -36 -168 -85t-59 -126zM145 -291q4 -37 28.5 -52t47.5 -15q45 0 81.5 45.5t57.5 142.5l48 223l-183 -37l-39 -180q-13 -63 -41 -127zM238 74 l180 30l178 838h-174zM438 1024h174l35 162q19 99 66 178q-27 20 -66 20q-78 0 -119.5 -56t-56.5 -136z" />
<glyph horiz-adv-x="2048" />
<glyph horiz-adv-x="2048" />
<glyph unicode="&#xd;" horiz-adv-x="2048" />
<glyph unicode=" " horiz-adv-x="444" /> <glyph unicode=" " horiz-adv-x="444" />
<glyph unicode="&#x09;" horiz-adv-x="444" /> <glyph unicode="&#x09;" horiz-adv-x="444" />
<glyph unicode="&#xa0;" horiz-adv-x="444" /> <glyph unicode="&#xa0;" horiz-adv-x="444" />
<glyph unicode="!" horiz-adv-x="526" d="M70 164q0 67 47.5 114.5t115.5 47.5q67 0 114.5 -47t47.5 -115t-47.5 -116t-114.5 -48t-115 48t-48 116zM201 473l145 961h295l-266 -961h-174z" />
<glyph unicode="&#x22;" horiz-adv-x="860" d="M127 1149l125 387h215l-186 -387h-154zM449 1149l124 387h215l-186 -387h-153z" />
<glyph unicode="#" horiz-adv-x="1349" d="M92 227l43 209h213l43 232h-209l43 209h203l107 593h180l-133 -593h215l106 593h180l-133 -593h213l-41 -209h-217l-51 -232h219l-41 -209h-225l-62 -282h-116l51 282h-242l-61 -282h-117l51 282h-219zM485 436h232l43 232h-223z" />
<glyph unicode="$" horiz-adv-x="825" d="M49 455q0 78 43 127t105 49q41 0 64.5 -15t23.5 -36q-82 -14 -82 -152q0 -42 25 -75.5t61 -49.5l73 402q-16 14 -49 39.5t-51.5 41t-44 41t-39 46.5t-23.5 50.5t-10 61.5q0 109 98 186t218 82l39 217h118l-51 -223q178 -28 178 -170q0 -71 -26.5 -113t-71.5 -42 q-42 0 -80 47q49 28 49 106q0 26 -16.5 51.5t-48.5 38.5l-74 -329l46.5 -31t43.5 -31t46 -38t36.5 -41t33 -50t18 -55.5t8.5 -67.5q0 -142 -102 -221t-267 -82l-59 -274h-56l49 276q-103 8 -164 64t-61 170zM340 1024q0 -68 57 -125l49 277q-55 -11 -80.5 -55t-25.5 -97z M358 295q69 8 102.5 59.5t33.5 124.5q0 82 -60 156z" />
<glyph unicode="%" horiz-adv-x="1318" d="M219 999q0 187 91 313t241 126q87 0 127.5 -58.5t40.5 -173.5q0 -68 -20.5 -142.5t-57 -142t-96 -111.5t-129.5 -44q-113 0 -155 57t-42 176zM248 0l790 1536h148l-791 -1536h-147zM367 975q0 -133 55 -133q53 0 93 56t60.5 145t20.5 194q0 62 -10.5 95.5t-40.5 33.5 q-50 0 -106.5 -83.5t-67.5 -219.5q-4 -50 -4 -88zM727 233q0 187 91 313t241 126q90 0 139 -60t49 -172q0 -55 -10.5 -112.5t-35 -117t-60.5 -106t-92.5 -75.5t-124.5 -29q-113 0 -155 57t-42 176zM864 209q0 -133 56 -133q53 0 91.5 52.5t57 137.5t18.5 191q0 139 -57 139 q-49 0 -100 -81t-62 -218q-4 -50 -4 -88z" />
<glyph unicode="&#x26;" horiz-adv-x="1396" d="M23 401q0 102 39.5 193.5t125.5 163.5t205 96q-101 55 -152 137t-51 174q0 71 31 137t87 118.5t144 84t193 31.5q74 0 139.5 -15.5t120 -46.5t86 -85.5t31.5 -126.5q0 -87 -34.5 -138t-108.5 -51q-71 0 -117 53q35 10 62.5 67t27.5 101q0 15 -1 29t-9 38.5t-21 41.5 t-40 30t-64 13q-110 0 -180 -73.5t-70 -178.5q0 -96 66.5 -186.5t203.5 -151.5q-183 -75 -269.5 -185.5t-86.5 -226.5q0 -112 71 -192t169 -80q57 0 109.5 19t104 60.5t92.5 120t64 185.5q-18 1 -47.5 4.5t-53 5.5t-44.5 2q-134 0 -193 -92l-14 2q32 130 136.5 209.5 t258.5 79.5q29 0 80 -5t76 -5q61 0 115 22.5t79 65.5h13q0 -88 -93.5 -176t-218.5 -109q-25 -91 -56.5 -167t-63 -131.5t-71 -99.5t-73.5 -72t-78 -48.5t-76.5 -31t-77.5 -16t-73 -6.5t-70 -1q-103 0 -185 34.5t-133 93t-78 131.5t-27 154z" />
<glyph unicode="'" horiz-adv-x="548" d="M209 1149l125 387h215l-187 -387h-153z" />
<glyph unicode="(" horiz-adv-x="894" d="M283 205q0 200 48 406.5t133 386.5t211.5 323.5t274.5 214.5l27 -82q-148 -74 -275 -284t-198.5 -483t-71.5 -537q0 -381 150 -603l-68 -59q-116 128 -173.5 314t-57.5 403z" />
<glyph unicode=")" horiz-adv-x="845" d="M-59 -430q148 74 274.5 283t198 482t71.5 539q0 382 -149 603l67 59q116 -128 174 -314t58 -403q0 -270 -81 -538t-235.5 -483t-351.5 -310z" />
<glyph unicode="*" horiz-adv-x="1054" d="M176 1026l223 129l-223 129l62 107l219 -127v276h131v-276l219 127l61 -107l-223 -129l223 -129l-61 -106l-219 127v-277h-131v277l-219 -127z" />
<glyph unicode="+" horiz-adv-x="1054" d="M109 420l49 229h262l55 250h232l-56 -250h260l-47 -229h-262l-55 -252h-232l56 252h-262z" />
<glyph unicode="," horiz-adv-x="442" d="M49 154q0 68 47.5 115.5t114.5 47.5q66 0 102.5 -43t36.5 -112q0 -97 -72.5 -216.5t-193.5 -203.5q-18 13 -18 35q0 25 16.5 50t36.5 42.5t36.5 43t16.5 50.5q0 23 -27 41q-96 63 -96 150z" />
<glyph unicode="-" horiz-adv-x="593" d="M39 455l37 161h409l-34 -161h-412z" />
<glyph unicode="." horiz-adv-x="538" d="M63 154q0 68 47.5 115.5t114.5 47.5q68 0 116 -48t48 -115t-48 -114.5t-116 -47.5q-67 0 -114.5 47t-47.5 115z" />
<glyph unicode="/" horiz-adv-x="636" d="M23 -512l434 2048h147l-434 -2048h-147z" />
<glyph unicode="0" horiz-adv-x="1118" d="M61 520q0 167 31.5 320t92.5 279.5t146 219.5t198.5 145t242.5 52q188 0 276.5 -135.5t88.5 -399.5q0 -103 -19.5 -217t-56 -228.5t-93.5 -217.5t-127 -182.5t-162.5 -126.5t-193.5 -47q-104 0 -179 24t-122.5 66.5t-75 112t-37.5 148t-10 187.5zM375 463 q0 -309 121 -309q84 0 156 86t118 226t72 313.5t26 353.5q0 70 -4 118.5t-15 92t-33.5 65t-57.5 21.5q-47 0 -105.5 -56t-114 -152t-98.5 -244t-55 -312q-10 -138 -10 -203z" />
<glyph unicode="1" horiz-adv-x="649" d="M43 0l270 1278h-194l24 94q112 0 233.5 31t287.5 129l-326 -1532h-295z" />
<glyph unicode="2" horiz-adv-x="1007" d="M-23 61q0 91 37 178t96.5 160.5t131.5 147.5t144 151.5t131.5 159t96.5 184.5t37 213q0 72 -39 120t-86 48q-96 0 -131 -41t-35 -125q0 -43 19.5 -85.5t58.5 -53.5q-78 -69 -155 -69q-65 0 -106.5 48.5t-41.5 135.5q0 43 14 84.5t46 81.5t79.5 69.5t120.5 47.5t162 18 q389 0 389 -330q0 -94 -31 -180.5t-84 -157t-118 -134.5t-138 -123t-138.5 -112t-126 -113t-93.5 -114h10q56 0 183 -18.5t208 -18.5q30 0 54 2t47 11t36 13.5t35.5 23t30 24t35.5 33t37 35.5q2 -33 2 -90q0 -81 -10 -134t-36 -94.5t-74.5 -60.5t-123.5 -19q-113 0 -259 37 t-249 37q-21 0 -51 -10.5t-63.5 -26.5t-46.5 -20q-5 29 -5 67z" />
<glyph unicode="3" horiz-adv-x="1052" d="M12 338q0 132 64.5 212.5t183.5 80.5q138 0 160 -105q-180 -14 -180 -221q0 -106 43 -144t112 -38q127 0 206 103t79 243q0 126 -68.5 232.5t-203.5 154.5q83 23 151.5 68.5t110.5 101.5t65 115t23 114q0 74 -40.5 121t-115.5 47q-73 0 -117.5 -43.5t-44.5 -115.5 q0 -48 19.5 -91.5t58.5 -54.5q-75 -69 -156 -69q-64 0 -105.5 46.5t-41.5 127.5q0 138 121.5 224.5t302.5 86.5t281 -86t100 -213q0 -106 -72.5 -209.5t-208.5 -171.5q129 -42 193.5 -132.5t64.5 -205.5q0 -74 -26 -149.5t-77 -143t-119.5 -120t-160.5 -83t-194 -30.5 q-45 0 -89 5.5t-105 27t-105.5 56.5t-76.5 102.5t-32 156.5z" />
<glyph unicode="4" horiz-adv-x="974" d="M16 563q22 67 77 184.5t101 214.5t83.5 222.5t37.5 228.5q0 66 -14 123q95 0 161 -51.5t66 -143.5q0 -90 -33.5 -181.5t-75 -154t-101.5 -149t-89 -141.5h320l166 780l303 41l-176 -821h131l-41 -152h-123l-119 -563h-295l121 563h-500z" />
<glyph unicode="5" horiz-adv-x="1058" d="M31 285q0 77 24 135.5t63.5 91t84.5 48t94 15.5q125 0 145 -104q-84 -9 -134 -59t-50 -138q0 -42 15 -72.5t41 -46t53.5 -22t58.5 -6.5q81 0 142 58t89.5 142t28.5 177q0 145 -60 221t-165 76q-122 0 -305 -115l168 817q38 -4 100 -12t97.5 -12t83 -7.5t87.5 -3.5 q164 0 332 66q4 -46 4 -68q0 -107 -56 -172t-179 -65q-64 0 -195.5 24.5t-146.5 26.5l-82 -371q134 64 256 64q90 0 160.5 -34t113 -93t64.5 -134.5t22 -162.5q0 -110 -35 -207.5t-104.5 -177.5t-186.5 -127t-268 -47q-360 0 -360 295z" />
<glyph unicode="6" horiz-adv-x="1017" d="M33 395q0 49 2 76q12 187 47.5 347.5t96.5 293.5t144.5 226.5t196 145.5t246.5 52q109 0 172 -51.5t63 -118.5q0 -55 -46.5 -94t-135.5 -43q33 29 33 74q0 43 -29.5 76.5t-72.5 33.5q-11 0 -24.5 -2t-39 -12t-50.5 -26t-57.5 -48.5t-61.5 -76.5t-60.5 -112.5t-57 -152 t-48 -201t-36.5 -254.5q-10 -102 -10 -155q0 -74 11 -120t35.5 -68t50.5 -28.5t67 -6.5q65 0 130.5 61.5t108 163t42.5 207.5q0 49 -8 90t-34 74.5t-67 33.5q-104 0 -180 -155q-41 58 -41 118q0 88 85 146.5t204 58.5q70 0 125 -30t87 -79.5t48 -108t16 -120.5 q0 -130 -45.5 -246.5t-121 -197.5t-176.5 -128.5t-210 -47.5q-96 0 -167.5 22t-115 57.5t-70.5 89.5t-36.5 110t-9.5 126z" />
<glyph unicode="7" horiz-adv-x="950" d="M68 256q0 70 19 146t47.5 145t80.5 154.5t98.5 152.5t122.5 162t132 161t145 169q-89 12 -174 12q-292 0 -424 -146q-17 73 -17 119q0 103 66 154t213 51h672q-124 -185 -352 -545.5t-265 -447.5q-65 -147 -65 -264q0 -62 22.5 -108t77.5 -91q-30 -80 -188 -80 q-103 0 -157 55t-54 201z" />
<glyph unicode="8" horiz-adv-x="1021" d="M-16 401q0 149 95 276t273 177q-88 51 -131 123.5t-43 155.5q0 74 34 146t92.5 128.5t145.5 91.5t185 35q185 0 286 -85t101 -212q0 -107 -75 -211.5t-212 -171.5q125 -38 186.5 -123.5t61.5 -195.5q0 -94 -43 -190.5t-116 -175.5t-181 -129t-227 -50q-102 0 -185.5 34.5 t-136.5 92t-81.5 131t-28.5 153.5zM281 334q0 -88 37.5 -142.5t107.5 -54.5q101 0 168.5 103.5t67.5 240.5q0 87 -32.5 167t-97.5 136q-81 -54 -139.5 -134t-85 -160.5t-26.5 -155.5zM446 1167q0 -70 27.5 -134.5t81.5 -108.5q97 64 152 168.5t55 199.5q0 64 -26 104t-74 40 q-97 0 -156.5 -80.5t-59.5 -188.5z" />
<glyph unicode="9" horiz-adv-x="1001" d="M59 184q0 69 38.5 110.5t138.5 41.5q-29 -29 -29 -70q0 -44 31.5 -79t76.5 -35q20 0 38.5 2.5t59 19t74.5 46.5t77 93t75 149.5t59.5 224.5t40.5 310q4 78 4 107q0 93 -12 153.5t-37.5 91t-55.5 41.5t-75 11q-65 0 -125.5 -66.5t-97.5 -170t-37 -208.5q0 -36 5 -70 t17 -67.5t36 -53.5t57 -20q61 0 103.5 27.5t68.5 95.5q43 -52 43 -102q0 -77 -80.5 -132.5t-194.5 -55.5q-73 0 -130.5 32.5t-91 85.5t-50 114.5t-16.5 125.5q0 167 70 305t191.5 216.5t268.5 78.5q92 0 162.5 -26t114 -68.5t70.5 -106t37.5 -131t10.5 -149.5 q0 -308 -82.5 -548.5t-241 -378.5t-370.5 -138q-111 0 -176.5 59t-65.5 135z" />
<glyph unicode=":" horiz-adv-x="546" d="M84 276q0 68 47.5 116t114.5 48q68 0 116 -48t48 -116q0 -67 -48 -114t-116 -47t-115 47t-47 114zM186 768q0 68 47.5 116t114.5 48q68 0 116 -48t48 -116q0 -67 -48 -114.5t-116 -47.5t-115 47t-47 115z" />
<glyph unicode=";" horiz-adv-x="565" d="M94 186q0 68 47.5 116t114.5 48q66 0 102.5 -43t36.5 -112q0 -97 -72.5 -216.5t-193.5 -203.5q-18 13 -18 35q0 25 16.5 50t36.5 42.5t36.5 43t16.5 50.5q0 23 -27 41q-96 63 -96 149zM193 678q0 68 47 116t114 48q68 0 116 -48t48 -116q0 -67 -48 -114.5t-116 -47.5 q-67 0 -114 47t-47 115z" />
<glyph unicode="&#x3c;" horiz-adv-x="735" d="M41 487l18 84l629 308l-20 -113l-494 -246l397 -196l-24 -117z" />
<glyph unicode="=" horiz-adv-x="1054" d="M66 207l49 229h753l-47 -229h-755zM156 647l49 230h753l-47 -230h-755z" />
<glyph unicode="&#x3e;" horiz-adv-x="704" d="M31 207l28 117l492 196l-397 246l18 113l504 -308l-23 -110z" />
<glyph unicode="?" horiz-adv-x="903" d="M98 164q0 67 48 114.5t116 47.5t115 -47t47 -115t-47.5 -116t-114.5 -48q-68 0 -116 48t-48 116zM113 1104q0 55 24.5 110.5t73.5 106t135.5 82t196.5 31.5q102 0 169 -18.5t100.5 -55t45.5 -77t12 -97.5q0 -81 -21.5 -147.5t-58.5 -113.5t-82 -88t-94 -79t-93.5 -77 t-83 -92t-58.5 -114h-135q0 58 20.5 113t53.5 99.5t72.5 88.5t79 88.5t72.5 91t53.5 105t20.5 121.5q0 71 -32 106t-80 35q-62 0 -113 -48.5t-51 -121.5q0 -42 19.5 -83t58.5 -52q-26 -42 -66 -64t-84 -22q-64 0 -109.5 45t-45.5 127z" />
<glyph unicode="@" horiz-adv-x="1150" d="M-16 336q0 219 94.5 404.5t255 293t348.5 107.5q44 0 82.5 -6t85 -26.5t79 -53.5t55 -94t22.5 -142q0 -130 -50.5 -256t-132 -205t-166.5 -79q-64 0 -90 47q-58 -80 -121 -80q-131 0 -131 141q0 56 19 137t51.5 163.5t86.5 140t114 57.5q49 0 78 -37l8 33l112 -13 l-92 -393q-8 -32 -8 -47q0 -39 27 -39q39 0 77 92t59 198t21 169q0 162 -180 162q-87 0 -165 -39t-134 -104.5t-97.5 -151t-62 -179.5t-20.5 -188q0 -129 52.5 -185.5t197.5 -56.5q111 0 182.5 33t124.5 103q47 -20 47 -92q0 -99 -113 -163.5t-301 -64.5q-100 0 -173.5 21 t-129.5 67.5t-84 128t-28 197.5zM449 434q0 -63 36 -63q24 0 68 28q0 22 6 43l88 340q-14 17 -37 17q-42 0 -75 -44.5t-50.5 -107.5t-26.5 -119.5t-9 -93.5z" />
<glyph unicode="A" horiz-adv-x="1368" d="M18 686q0 105 119 178.5t299 73.5q42 0 107 -6q80 127 165.5 233.5t177 191t187 132t182.5 47.5q91 0 162 -29l-321 -1507h-295l157 743q-137 62 -274 74q-116 -252 -191 -514.5t-75 -421.5q0 -72 28 -114q-31 0 -50.5 0.5t-51.5 5t-53 12.5t-45.5 24t-39 38.5 t-24.5 57.5t-10 79q0 137 83.5 367t217.5 466q-204 -13 -240 -106q8 0 17.5 -21.5t9.5 -42.5q0 -36 -33 -58t-82 -22q-55 0 -91 30.5t-36 88.5zM727 905q148 -29 250 -71l119 557q-171 -92 -369 -486z" />
<glyph unicode="B" horiz-adv-x="1300" d="M12 993q0 104 62.5 204t164 174t238.5 119.5t279 45.5q109 0 194.5 -27t137 -73.5t78 -103.5t26.5 -122q0 -93 -54 -181t-151 -144q123 -25 182.5 -115t59.5 -215q0 -64 -13.5 -137.5t-47 -155t-82.5 -146.5t-128.5 -108t-177.5 -43q-37 0 -69.5 6.5t-64 22t-50 47.5 t-18.5 76q0 51 26 119q71 -74 137 -74q53 0 94.5 35t64 91.5t33.5 117.5t11 124q0 261 -194 261q-30 0 -95 -7l-168 -784h-294l278 1303l303 40l-96 -454h12q79 0 148 51t108 127.5t39 153.5q0 96 -66.5 158.5t-203.5 62.5q-73 0 -145 -19t-138.5 -59.5t-117.5 -98 t-81 -140.5t-30 -181q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-219 0 -219 188z" />
<glyph unicode="C" horiz-adv-x="1017" d="M39 471q0 83 11 176t37 197.5t64 202t96.5 187t129.5 156.5t168.5 106.5t208.5 39.5q75 0 135.5 -15t107.5 -47t73 -85.5t26 -126.5q0 -87 -35 -138t-109 -51q-70 0 -116 53q37 19 65.5 75t28.5 114q0 55 -30 90t-95 35q-108 0 -208.5 -152t-159 -374t-58.5 -431 q0 -59 6.5 -105.5t23.5 -87.5t44.5 -68t70.5 -42.5t101 -15.5q119 0 223.5 54.5t175.5 150.5l47 -21q-39 -98 -110 -174.5t-154 -119.5t-164.5 -65t-155.5 -22q-232 0 -340 116.5t-108 387.5z" /> <glyph unicode="C" horiz-adv-x="1017" d="M39 471q0 83 11 176t37 197.5t64 202t96.5 187t129.5 156.5t168.5 106.5t208.5 39.5q75 0 135.5 -15t107.5 -47t73 -85.5t26 -126.5q0 -87 -35 -138t-109 -51q-70 0 -116 53q37 19 65.5 75t28.5 114q0 55 -30 90t-95 35q-108 0 -208.5 -152t-159 -374t-58.5 -431 q0 -59 6.5 -105.5t23.5 -87.5t44.5 -68t70.5 -42.5t101 -15.5q119 0 223.5 54.5t175.5 150.5l47 -21q-39 -98 -110 -174.5t-154 -119.5t-164.5 -65t-155.5 -22q-232 0 -340 116.5t-108 387.5z" />
<glyph unicode="D" horiz-adv-x="1357" d="M12 995q0 104 61 203t163 173t244 119.5t294 45.5q144 0 252 -47.5t171 -131t93.5 -186.5t30.5 -225q0 -174 -46.5 -350.5t-123 -313.5t-182 -223t-215.5 -86q-124 0 -250 109l-17 -82h-294l278 1303l303 40l-246 -1148q55 -41 117 -41q71 0 134.5 54t109.5 144.5 t80.5 206.5t51.5 243.5t17 252.5q0 201 -79 294t-220 93q-234 0 -385 -135t-151 -363q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-219 0 -219 190z" />
<glyph unicode="E" horiz-adv-x="940" d="M14 324q0 110 44.5 219.5t133 196.5t201.5 114q-125 89 -125 246q0 106 56.5 206.5t161.5 167t231 66.5q127 0 210 -67.5t83 -188.5q0 -91 -44.5 -152t-107.5 -61q-55 0 -96 55q37 12 63.5 68t26.5 111q0 58 -33 86t-80 28q-88 0 -148.5 -88.5t-60.5 -200.5 q0 -96 51.5 -171t155.5 -103q-79 -18 -149 -70.5t-116.5 -122t-73.5 -147.5t-27 -149q0 -93 47.5 -150t146.5 -57q102 0 214.5 57t164.5 152l47 -21q-78 -177 -245 -281t-355 -104q-95 0 -169 29t-118.5 79.5t-67 114.5t-22.5 138z" />
<glyph unicode="F" horiz-adv-x="940" d="M18 1004q0 84 23.5 160t77 144.5t133 118.5t199 79.5t266.5 29.5q35 0 152.5 -12.5t187.5 -12.5q105 0 184 25q-5 -14 -13.5 -45t-14.5 -50t-20 -46.5t-31 -45t-47 -34.5t-68 -25q-104 0 -287 39l-86 -407h299l-33 -152h-299l-166 -770h-295l295 1368q-63 -2 -109 -23 t-82.5 -67.5t-55.5 -130t-19 -203.5q0 -46 6.5 -76t14.5 -44.5t8 -18.5q-110 0 -165 46t-55 153z" />
<glyph unicode="G" horiz-adv-x="1183" d="M39 748q0 118 31 232t93 214.5t147.5 176.5t203 120.5t250.5 44.5q74 0 140 -15.5t121 -46.5t87.5 -85.5t32.5 -126.5q0 -87 -35 -138t-109 -51q-95 0 -141 53q35 10 62.5 67t27.5 101q0 14 -2 28.5t-10.5 37t-22.5 39t-41.5 29t-64.5 12.5q-109 0 -216 -108.5 t-173 -274.5t-66 -326q0 -148 59 -243t179 -95q117 0 174 76l88 389l264 -2l-168 -770q-27 -125 -64 -213t-97 -158t-150 -104.5t-213 -34.5q-137 0 -211 83.5t-74 199.5q0 112 67.5 196t182.5 84q31 0 53 -1.5t52.5 -9t49 -21.5t32.5 -40.5t14 -64.5q0 -36 -12 -82 q-37 31 -64 42t-59 11q-67 0 -105.5 -46.5t-38.5 -108.5q0 -58 34 -99t95 -41q37 0 64.5 10t54 36.5t48 77.5t38.5 128l82 367q-54 -28 -113.5 -46.5t-90.5 -23t-46 -4.5q-121 0 -209 41.5t-137 116t-71.5 165t-22.5 202.5z" />
<glyph unicode="H" horiz-adv-x="1361" d="M25 1004q0 132 107.5 256.5t274.5 200t336 75.5q28 0 82 -4l-131 -610h301l131 610h295l-325 -1532h-295l164 770h-301l-164 -770h-295l297 1393q-137 -58 -212 -173t-75 -276q0 -46 6.5 -76t14.5 -44.5t8 -18.5q-110 0 -164.5 46t-54.5 153z" />
<glyph unicode="I" horiz-adv-x="768" d="M12 1004q0 132 108 256.5t275 200t336 75.5q28 0 82 -4l-326 -1532h-294l296 1391q-136 -57 -211 -171t-75 -276q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153z" />
<glyph unicode="J" horiz-adv-x="1097" d="M35 -135q0 111 67 192.5t183 81.5q31 0 53 -1.5t52 -9t49 -21.5t32.5 -40.5t13.5 -64.5q0 -36 -12 -82q-37 31 -64 42t-59 11q-67 0 -105 -45t-38 -106q0 -72 43 -108t96 -36q50 0 82 18.5t61 74.5t52 159l321 1463q-136 -57 -212.5 -172.5t-76.5 -276.5q0 -46 6.5 -76 t14.5 -44.5t8 -18.5q-110 0 -164.5 46t-54.5 153q0 132 108 256.5t275 200t336 75.5h82l-307 -1454q-26 -123 -65.5 -212t-102 -157.5t-155.5 -102.5t-216 -34q-143 0 -223 79.5t-80 209.5z" />
<glyph unicode="K" horiz-adv-x="1230" d="M12 1004q0 132 108 256.5t275 200t336 75.5q28 0 82 -4l-133 -627q60 81 174.5 234.5t202.5 270.5t88 116h215l-569 -656q14 0 37 1t34 1q140 0 197 -58t57 -161q0 -89 -50 -273.5t-50 -244.5q0 -46 22 -84t58 -51q-120 -35 -203 -35q-160 0 -160 137q0 65 54.5 261.5 t54.5 277.5q0 139 -123 139q-18 0 -68 -8l-164 -772h-294l296 1393q-137 -58 -211.5 -173t-74.5 -276q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153z" />
<glyph unicode="L" horiz-adv-x="776" d="M12 983q0 99 64.5 197.5t166 171.5t232 118.5t256.5 45.5q15 0 82 -5l-315 -1470q57 -13 127 -45.5t134 -68.5t132.5 -70.5t145 -57t149.5 -22.5q94 0 172 33q-15 -148 -72.5 -235t-140.5 -87q-80 0 -170.5 48t-175.5 116t-172.5 136.5t-191.5 116.5t-204 48 q-31 0 -47 -2l305 1419q-136 -57 -211 -171t-75 -275q0 -46 6.5 -76t14 -45t7.5 -19q-110 0 -164.5 46t-54.5 153z" />
<glyph unicode="M" horiz-adv-x="1611" d="M137 0l520 1407q-155 -52 -240 -170.5t-85 -290.5q0 -48 6.5 -78.5t14 -44.5t7.5 -18q-219 0 -219 186q0 128 97.5 255.5t250 208.5t304.5 81q76 0 155 -29l-47 -1079l451 1079h295l-215 -1507h-295l131 920l-385 -920h-281l41 924l-342 -924h-164z" />
<glyph unicode="N" horiz-adv-x="1368" d="M12 1004q0 70 26 144.5t77.5 143.5t120 123.5t161.5 87.5t195 33q131 0 190 -29l162 -1085l223 1110h295l-325 -1532h-248l-174 1071l-228 -1071h-294l294 1391q-135 -56 -209.5 -171t-74.5 -276q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153z" />
<glyph unicode="O" horiz-adv-x="1361" d="M33 977q0 141 115 270.5t307 209t403 79.5q131 0 226.5 -38.5t151 -110t81.5 -164.5t26 -211q0 -87 -13.5 -181t-42.5 -194.5t-71.5 -193.5t-105 -176.5t-137.5 -145t-174.5 -97.5t-210.5 -36q-171 0 -269 98.5t-98 312.5q0 85 16 186.5t45.5 210t78 209t107.5 180 t139 127.5t169 48q55 0 107 -17q-89 -54 -174 -223.5t-135 -370.5t-50 -358q0 -110 29.5 -173.5t89.5 -63.5q100 0 201 145t164 362.5t63 421.5q0 95 -11 157.5t-39.5 110.5t-80 69.5t-131.5 21.5q-118 0 -224.5 -37t-188 -103.5t-129.5 -167t-48 -219.5q0 -48 11 -79 l10 -31q-207 0 -207 172z" />
<glyph unicode="P" horiz-adv-x="1173" d="M12 1004q0 132 108 256.5t275 200t336 75.5q122 0 216.5 -33t151.5 -90t86 -128t29 -152q0 -99 -41.5 -196t-115 -176t-187.5 -128t-247 -49h-11l-125 -584h-294l278 1303l303 40l-145 -684q75 6 143 55t114 121t73.5 159t27.5 169q0 123 -63 201t-191 78 q-249 0 -389.5 -132.5t-140.5 -365.5q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153z" /> <glyph unicode="P" horiz-adv-x="1173" d="M12 1004q0 132 108 256.5t275 200t336 75.5q122 0 216.5 -33t151.5 -90t86 -128t29 -152q0 -99 -41.5 -196t-115 -176t-187.5 -128t-247 -49h-11l-125 -584h-294l278 1303l303 40l-145 -684q75 6 143 55t114 121t73.5 159t27.5 169q0 123 -63 201t-191 78 q-249 0 -389.5 -132.5t-140.5 -365.5q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153z" />
<glyph unicode="Q" horiz-adv-x="1361" d="M33 977q0 141 115 270.5t307 209t403 79.5q131 0 226.5 -38.5t151 -110t81.5 -164.5t26 -211q0 -153 -39.5 -317.5t-131 -328.5t-220.5 -260q37 -52 65.5 -83t79 -56.5t111.5 -25.5q13 0 45 4q-37 -100 -88 -138t-123 -38q-52 0 -93 15t-66.5 36t-47.5 57.5t-32.5 65 t-24.5 73.5q-89 -28 -190 -28q-171 0 -269 98.5t-98 312.5q0 85 16 186.5t45.5 210t78 209t107.5 180t139 127.5t169 48q55 0 107 -17q-89 -54 -174 -223.5t-135 -370.5t-50 -358q0 -61 4 -88q78 19 127 19q91 0 164 -56q106 134 179 366.5t73 450.5q0 95 -11 157.5 t-39.5 110.5t-80 69.5t-131.5 21.5q-118 0 -224.5 -37t-188 -103.5t-129.5 -167t-48 -219.5q0 -48 11 -79l10 -31q-207 0 -207 172zM545 238q29 -84 98 -84q44 0 78 22q-43 70 -117 70q-28 0 -59 -8z" />
<glyph unicode="R" horiz-adv-x="1230" d="M12 1004q0 132 108 256.5t275 200t336 75.5q117 0 208.5 -27.5t146 -74t82.5 -104t28 -122.5q0 -96 -59 -192.5t-162 -157.5q141 -40 141 -205q0 -89 -50 -273.5t-50 -244.5q0 -46 22 -84t58 -51q-120 -35 -203 -35q-160 0 -160 137q0 65 54.5 261.5t54.5 277.5 q0 139 -123 139q-14 0 -68 -8l-164 -772h-294l278 1303l303 40l-100 -473h16q81 0 149.5 57t105 138.5t36.5 161.5q0 94 -56 154.5t-169 60.5q-251 0 -402 -133.5t-151 -364.5q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153z" />
<glyph unicode="S" horiz-adv-x="1167" d="M55 309q0 80 26.5 145.5t70.5 106t96.5 62.5t107.5 22q30 0 58.5 -6.5t56.5 -21t46 -42t20 -65.5q-44 0 -85 -10.5t-76.5 -32.5t-57 -60.5t-21.5 -89.5q0 -82 52 -139t145 -57q105 0 171 73t66 199q0 96 -43.5 184t-105 155.5t-123 132.5t-105 143t-43.5 161 q0 158 136.5 262.5t336.5 104.5q37 0 72 -3.5t84.5 -18.5t85.5 -40t62 -72.5t26 -111.5q0 -90 -46 -148.5t-122 -58.5q-57 0 -94 43q41 24 66.5 74.5t25.5 102.5q0 60 -36 98.5t-115 38.5q-87 0 -138 -48.5t-51 -138.5q0 -61 25.5 -114.5t66 -96t89.5 -84.5t98.5 -90 t90 -102t66 -130.5t25.5 -166.5q0 -125 -48 -224.5t-129 -161t-183 -94t-216 -32.5q-90 0 -166.5 20.5t-137.5 61.5t-95.5 110t-34.5 160z" />
<glyph unicode="T" horiz-adv-x="985" d="M12 1001q0 106 39 198.5t119.5 169t219 121t321.5 44.5q130 0 279.5 -23.5t244.5 -23.5q135 0 238 43q-6 -260 -256 -260q-118 0 -318 45l-283 -1315h-294l290 1356h-24q-69 0 -124 -11t-105 -40t-83.5 -74.5t-53 -118.5t-19.5 -170q0 -46 6.5 -76t14 -44.5t7.5 -18.5 q-110 0 -164.5 45.5t-54.5 152.5z" />
<glyph unicode="U" horiz-adv-x="1466" d="M0 993q0 85 42 167t116.5 149t171 118.5t212 80t232.5 28.5q44 0 98 -10q-32 -120 -74.5 -275t-64 -236t-49 -184t-40.5 -158.5t-26 -118.5t-17.5 -104.5t-4.5 -78.5q0 -185 141 -185q50 0 80.5 6t66.5 30t62.5 69.5t57.5 125t62 197t67 285.5l137 633h289l-136 -639 q-30 -145 -56.5 -247.5t-61 -204t-72 -168t-88.5 -125.5t-113 -92t-141 -51.5t-178 -18.5q-213 0 -304.5 81.5t-91.5 243.5q0 59 7 123.5t29.5 167.5t33.5 151t50 202t48 192l68 270q-170 -45 -266.5 -167t-96.5 -304q0 -48 6.5 -78.5t14.5 -44.5t8 -18q-219 0 -219 188z " />
<glyph unicode="V" horiz-adv-x="1259" d="M12 1004q0 132 108 256.5t275 200t336 75.5q28 0 82 -4l18 -1260l431 1254h143l-569 -1526h-312v1399q-321 -101 -321 -455q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153z" />
<glyph unicode="W" horiz-adv-x="1970" d="M12 1004q0 132 108 256.5t275 200t336 75.5q28 0 82 -4l18 -1260l431 1254h268v-1254l440 1254h144l-570 -1526h-303v1042l-405 -1042h-301v1399q-165 -52 -248.5 -168t-83.5 -287q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153z" />
<glyph unicode="X" horiz-adv-x="1269" d="M12 1004q0 132 108 256.5t275 200t336 75.5q28 0 82 -4l88 -426l238 420h143l-344 -596l192 -930h-325l-109 512l-297 -512h-125l385 680l-151 719q-144 -53 -224.5 -170.5t-80.5 -284.5q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153z" />
<glyph unicode="Y" horiz-adv-x="1269" d="M12 1004q0 132 108 256.5t275 200t336 75.5q28 0 82 -4l178 -733l303 727h136l-398 -895l-135 -631h-328l136 631l-197 768q-144 -53 -224.5 -170.5t-80.5 -284.5q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153z" />
<glyph unicode="Z" horiz-adv-x="1110" d="M23 0l716 1425q-18 0 -82 2.5t-102 2.5q-188 0 -188 -46q13 0 23.5 -16t10.5 -49q0 -61 -37 -89t-83 -28q-54 0 -79.5 36t-25.5 85q0 83 68 148t184 65h702l-706 -1403q25 0 93 -2t104 -2q180 0 213 45q-13 0 -25 15.5t-12 48.5q0 59 37.5 88.5t85.5 29.5 q53 0 78.5 -34.5t25.5 -83.5q0 -86 -73.5 -162t-188.5 -76h-739z" />
<glyph unicode="[" horiz-adv-x="819" d="M-49 -512l434 2048h395l-26 -127h-248l-381 -1794h248l-27 -127h-395z" />
<glyph unicode="\" horiz-adv-x="741" d="M86 1536h147l435 -2048h-148z" />
<glyph unicode="]" horiz-adv-x="819" d="M-49 -512l26 127h248l381 1794h-248l27 127h395l-434 -2048h-395z" />
<glyph unicode="^" horiz-adv-x="862" d="M102 1149l435 387h43l122 -387h-65l-123 164l-321 -164h-91z" />
<glyph unicode="_" horiz-adv-x="909" d="M74 0l37 162h716l-34 -162h-719z" />
<glyph unicode="`" horiz-adv-x="411" d="M49 1536h215l60 -387h-154z" />
<glyph unicode="a" horiz-adv-x="1077" d="M-27 317q0 71 14.5 149.5t42.5 159t73.5 153.5t101.5 130t132.5 91t162.5 34q84 0 125 -28.5t41 -75.5v-15l22 109h295l-147 -696q-9 -40 -9 -66q0 -88 84 -88q56 0 98 54t68 139h86q-133 -379 -411 -379q-87 0 -139.5 48.5t-61.5 139.5q-126 -188 -305 -188 q-43 0 -82 10.5t-74 35t-61 62t-41 94t-15 127.5zM276 346q0 -56 10 -91.5t28.5 -48.5t31.5 -16.5t33 -3.5q49 0 101 49t69 132l98 462q0 26 -20 52t-64 26q-62 0 -118 -60t-91.5 -148.5t-56.5 -183t-21 -169.5z" /> <glyph unicode="a" horiz-adv-x="1077" d="M-27 317q0 71 14.5 149.5t42.5 159t73.5 153.5t101.5 130t132.5 91t162.5 34q84 0 125 -28.5t41 -75.5v-15l22 109h295l-147 -696q-9 -40 -9 -66q0 -88 84 -88q56 0 98 54t68 139h86q-133 -379 -411 -379q-87 0 -139.5 48.5t-61.5 139.5q-126 -188 -305 -188 q-43 0 -82 10.5t-74 35t-61 62t-41 94t-15 127.5zM276 346q0 -56 10 -91.5t28.5 -48.5t31.5 -16.5t33 -3.5q49 0 101 49t69 132l98 462q0 26 -20 52t-64 26q-62 0 -118 -60t-91.5 -148.5t-56.5 -183t-21 -169.5z" />
<glyph unicode="b" horiz-adv-x="909" d="M-14 250q0 57 14 117l219 1026l303 41l-98 -461q94 57 168 57q242 0 242 -350q0 -54 -8 -114t-27.5 -128t-48.5 -131t-74.5 -122t-102 -102t-134 -69t-167.5 -26q-139 0 -212.5 68.5t-73.5 193.5zM279 281q0 -95 108 -95q63 0 120 81t88.5 196.5t31.5 224.5 q0 81 -28.5 139t-80.5 58q-29 0 -67.5 -9.5t-53.5 -27.5l-112 -520q-6 -24 -6 -47z" />
<glyph unicode="c" horiz-adv-x="786" d="M-27 313q0 54 8.5 115.5t28.5 133t49 138.5t74 130t99.5 109.5t130 74.5t161.5 28q125 0 176.5 -53t51.5 -135q0 -72 -31 -110.5t-78 -38.5q-35 0 -72 24q25 70 25 121q0 84 -57 84q-61 0 -124 -103.5t-101 -244t-38 -254.5q0 -100 35 -136t113 -36q77 0 144.5 29.5 t113 69.5t104.5 108h70q-236 -379 -563 -379q-151 0 -235.5 79t-84.5 246z" /> <glyph unicode="c" horiz-adv-x="786" d="M-27 313q0 54 8.5 115.5t28.5 133t49 138.5t74 130t99.5 109.5t130 74.5t161.5 28q125 0 176.5 -53t51.5 -135q0 -72 -31 -110.5t-78 -38.5q-35 0 -72 24q25 70 25 121q0 84 -57 84q-61 0 -124 -103.5t-101 -244t-38 -254.5q0 -100 35 -136t113 -36q77 0 144.5 29.5 t113 69.5t104.5 108h70q-236 -379 -563 -379q-151 0 -235.5 79t-84.5 246z" />
<glyph unicode="d" horiz-adv-x="1075" d="M-27 317q0 71 14.5 149.5t42.5 159t73.5 153.5t101.5 130t132.5 91t162.5 34q84 0 125 -28.5t41 -75.5v-8l100 471l303 41l-235 -1106q-9 -40 -9 -66q0 -42 20 -59t64 -17q57 0 99 49.5t67 131.5h86q-33 -96 -77.5 -166t-85.5 -107.5t-89.5 -60t-83.5 -28t-75 -5.5 q-84 0 -136.5 45.5t-64.5 130.5q-122 -188 -303 -188q-43 0 -82 10.5t-74 35t-61 62t-41 94t-15 127.5zM276 346q0 -56 10 -91.5t28.5 -48.5t31.5 -16.5t33 -3.5q48 0 98.5 45.5t69.5 124.5v11l100 469q-4 26 -24 48.5t-60 22.5q-62 0 -118 -60t-91.5 -148.5t-56.5 -183 t-21 -169.5z" /> <glyph unicode="h" horiz-adv-x="1034" d="M-78 0l297 1393l303 41l-110 -516q100 114 239 114q104 0 166 -56.5t62 -174.5q0 -89 -49.5 -283.5t-49.5 -245.5q0 -86 82 -86q61 0 96.5 43t75.5 138h86q-33 -97 -73.5 -168t-78.5 -110.5t-81.5 -63t-76.5 -30.5t-71 -7q-124 0 -182.5 66.5t-58.5 164.5q0 71 46 264 t46 258q0 105 -76 105q-53 0 -98.5 -63t-57.5 -117l-141 -666h-295z" />
<glyph unicode="e" horiz-adv-x="786" d="M-27 313q0 53 8.5 114.5t28 133t48.5 138.5t74 130t100.5 110t131 75t162.5 28q226 0 226 -196q0 -115 -66.5 -212.5t-174 -155t-230.5 -64.5q-5 -72 -5 -82q0 -100 35 -136t113 -36q77 0 144.5 29.5t113 69.5t104.5 108h70q-236 -379 -563 -379q-151 0 -235.5 79 t-84.5 246zM297 512q119 8 208 109.5t89 228.5q0 84 -51 84q-50 0 -100.5 -64t-87.5 -158.5t-58 -199.5z" />
<glyph unicode="f" horiz-adv-x="546" d="M-426 -291q0 55 19 99t47.5 73t78.5 55.5t94 42.5t113 37l248 1170q18 84 50 148t68.5 101.5t82.5 60.5t86.5 30.5t85.5 7.5q97 0 169 -62t72 -159q0 -47 -6 -84h-96q4 40 4 55q0 34 -22.5 52t-55.5 18q-43 0 -83 -38t-60 -130l-35 -162h150l-15 -82h-151l-236 -1106 q-72 -348 -366 -348q-97 0 -169.5 62t-72.5 159zM-313 -262q0 -23 25 -45.5t57 -22.5q80 0 116 160l27 119q-108 -36 -166.5 -85t-58.5 -126z" />
<glyph unicode="g" horiz-adv-x="1038" d="M-27 317q0 71 14.5 149.5t42.5 159t73.5 153.5t101.5 130t132.5 91t162.5 34q84 0 125 -28.5t41 -75.5v-12l22 106h295l-203 -950q98 35 157.5 99.5t100.5 193.5h86q-23 -78 -56.5 -140t-68.5 -101.5t-78.5 -69t-79.5 -45t-79 -27.5l-31 -148q-72 -348 -369 -348 q-99 0 -164 51.5t-65 147.5q0 203 334 305l25 108q-105 -112 -246 -112q-43 0 -82 10.5t-74 35t-61 62t-41 94t-15 127.5zM246 -285q0 -24 19 -45.5t50 -21.5q34 0 67 47.5t52 134.5l12 59q-200 -75 -200 -174zM276 346q0 -56 10 -91.5t28.5 -48.5t31.5 -16.5t33 -3.5 q45 0 94.5 43.5t69.5 116.5l104 485q-2 26 -21.5 51t-62.5 25q-62 0 -118 -60t-91.5 -148.5t-56.5 -183t-21 -169.5z" />
<glyph unicode="h" d="M-78 0l297 1393l303 41l-110 -516q100 114 239 114q104 0 166 -56.5t62 -174.5q0 -89 -49.5 -283.5t-49.5 -245.5q0 -86 82 -86q61 0 96.5 43t75.5 138h86q-33 -97 -73.5 -168t-78.5 -110.5t-81.5 -63t-76.5 -30.5t-71 -7q-124 0 -182.5 66.5t-58.5 164.5q0 71 46 264 t46 258q0 105 -76 105q-53 0 -98.5 -63t-57.5 -117l-141 -666h-295z" />
<glyph unicode="i" horiz-adv-x="546" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-8 -36 -8 -66q0 -42 19.5 -59t63.5 -17q59 0 110 51.5t75 129.5h86q-33 -95 -79 -167t-90.5 -111t-95.5 -63t-88.5 -31t-76.5 -7q-98 0 -158.5 61t-60.5 184zM180 1296q0 68 47.5 116t114.5 48q68 0 116 -48t48 -116 q0 -67 -48 -114t-116 -47t-115 47t-47 114z" />
<glyph unicode="j" horiz-adv-x="491" d="M-414 -313q0 204 336 305l219 1032h295l-203 -950q98 35 158 100t101 193h86q-29 -96 -71.5 -167.5t-94 -113.5t-97 -64.5t-100.5 -37.5l-31 -148q-72 -348 -368 -348q-99 0 -164.5 52t-65.5 147zM-301 -285q0 -24 19.5 -45.5t50.5 -21.5q34 0 66.5 47.5t51.5 134.5 l13 59q-201 -75 -201 -174zM164 1298q0 68 47.5 116t114.5 48t115 -48t48 -116q0 -67 -47.5 -114t-115.5 -47t-115 47t-47 114z" />
<glyph unicode="k" horiz-adv-x="1060" d="M-78 0l297 1393l303 41l-153 -721l395 311h203l-410 -285q52 9 68 9q109 0 167 -68t58 -172q0 -42 -8 -78l-23 -102q-10 -50 -10 -66q0 -76 80 -76q61 0 96.5 43t75.5 138h86q-33 -98 -75.5 -171t-80.5 -111.5t-82 -61.5t-74.5 -29t-64.5 -6q-126 0 -192 60t-66 173 q0 49 12 107l17 80q8 36 8 75q0 99 -74 99q-59 0 -151 -76l-107 -506h-295z" />
<glyph unicode="l" horiz-adv-x="546" d="M-16 233q0 56 16 134l219 1026l303 41l-235 -1106q-8 -36 -8 -66q0 -42 19.5 -59t63.5 -17q59 0 110 51.5t75 129.5h86q-33 -95 -79 -167t-90.5 -111t-95.5 -63t-88.5 -31t-76.5 -7q-98 0 -158.5 61t-60.5 184z" />
<glyph unicode="m" horiz-adv-x="1540" d="M-78 0l217 1024h295l-22 -106q102 116 250 116q178 0 210 -176q112 174 285 174q104 0 165.5 -56.5t61.5 -174.5q0 -89 -49 -283.5t-49 -245.5q0 -86 82 -86q61 0 96.5 43t75.5 138h86q-33 -97 -73.5 -168t-78.5 -110.5t-81.5 -63t-76.5 -30.5t-71 -7q-124 0 -182.5 66.5 t-58.5 164.5q0 71 46 264t46 258q0 105 -74 105q-52 0 -93.5 -53t-66.5 -136l-139 -657h-295l150 707q6 24 6 51q0 38 -15.5 64t-46.5 26q-56 0 -98 -53.5t-68 -137.5l-139 -657h-295z" />
<glyph unicode="n" d="M-78 0l217 1024h295l-22 -106q100 114 239 114q104 0 166 -56.5t62 -174.5q0 -89 -49.5 -283.5t-49.5 -245.5q0 -86 82 -86q61 0 96.5 43t75.5 138h86q-33 -97 -73.5 -168t-78.5 -110.5t-81.5 -63t-76.5 -30.5t-71 -7q-124 0 -182.5 66.5t-58.5 164.5q0 71 46 264t46 258 q0 105 -74 105q-52 0 -93.5 -53t-66.5 -136l-139 -657h-295z" />
<glyph unicode="o" horiz-adv-x="899" d="M-29 315q0 53 8.5 114.5t29 132.5t50 138.5t75.5 130t102 109t132.5 74.5t163.5 28q263 0 263 -327q8 -4 22 -4q66 0 155 36.5t161 86.5l18 -56q-58 -62 -153.5 -106.5t-209.5 -63.5q-24 -280 -160.5 -448t-328.5 -168q-152 0 -240 78t-88 245zM276 342 q0 -99 22.5 -132.5t82.5 -33.5q75 0 143.5 122.5t93.5 303.5q-55 13 -55 86q0 83 64 111q-3 65 -20.5 92t-57.5 27q-68 0 -133.5 -103t-102.5 -236.5t-37 -236.5z" /> <glyph unicode="o" horiz-adv-x="899" d="M-29 315q0 53 8.5 114.5t29 132.5t50 138.5t75.5 130t102 109t132.5 74.5t163.5 28q263 0 263 -327q8 -4 22 -4q66 0 155 36.5t161 86.5l18 -56q-58 -62 -153.5 -106.5t-209.5 -63.5q-24 -280 -160.5 -448t-328.5 -168q-152 0 -240 78t-88 245zM276 342 q0 -99 22.5 -132.5t82.5 -33.5q75 0 143.5 122.5t93.5 303.5q-55 13 -55 86q0 83 64 111q-3 65 -20.5 92t-57.5 27q-68 0 -133.5 -103t-102.5 -236.5t-37 -236.5z" />
<glyph unicode="p" horiz-adv-x="958" d="M-186 -512l342 1612h295l-33 -154q102 88 239 88q114 0 182 -75.5t68 -247.5q0 -74 -10 -150t-32 -159.5t-61.5 -156t-93 -131t-132.5 -92.5t-175 -34q-131 0 -174 73l-106 -499zM262 213q16 -47 78 -47q61 0 112 39t82.5 99t53 136t30.5 145.5t9 131.5q0 170 -103 170 q-35 0 -74 -26.5t-67 -74.5z" />
<glyph unicode="q" horiz-adv-x="995" d="M-27 317q0 71 14.5 149.5t42.5 159t73.5 153.5t101.5 130t132.5 91t162.5 34q84 0 125 -29t41 -79l20 98h295l-311 -1462l-310 -74l129 612q-105 -112 -243 -112q-43 0 -82 10.5t-74 35t-61 62t-41 94t-15 127.5zM276 346q0 -56 10 -91.5t28.5 -48.5t31.5 -16.5t33 -3.5 q43 0 90 39t70 107l108 506q-4 25 -24.5 47t-59.5 22q-62 0 -118 -60t-91.5 -148.5t-56.5 -183t-21 -169.5z" />
<glyph unicode="r" horiz-adv-x="770" d="M-78 0l217 1024h295l-26 -127q49 42 76.5 62.5t76 42.5t94.5 22q66 0 104 -45.5t37 -108.5q0 -59 -38.5 -104t-108.5 -45q-32 0 -50.5 14t-24 33.5t-9 39.5t-11 34t-24.5 14q-42 0 -73 -18t-76 -60l-164 -778h-295z" />
<glyph unicode="s" horiz-adv-x="782" d="M-66 250q0 66 32 117t77 73q138 244 252 607l303 40q11 -224 22.5 -387.5t17 -233.5t5.5 -124q0 -45 -8 -78q87 52 147 103h86q-127 -147 -313 -256q-60 -63 -147.5 -93t-174.5 -30q-75 0 -134.5 23t-94 61.5t-52.5 83.5t-18 94zM43 293q0 -73 29.5 -108t95.5 -35 q76 0 127 45.5t51 144.5q0 51 -14.5 186t-24.5 299q-51 -165 -166 -387q47 -21 47 -71q0 -39 -26 -70t-64 -31q-42 0 -55 27z" />
<glyph unicode="t" horiz-adv-x="546" d="M-16 233q0 56 16 134l123 575h-68l17 82h67l62 283l303 41l-70 -324h123l-16 -82h-123l-131 -614q-8 -36 -8 -66q0 -42 19.5 -59t63.5 -17q59 0 110 51.5t75 129.5h86q-33 -95 -79 -167t-90.5 -111t-95.5 -63t-88.5 -31t-76.5 -7q-98 0 -158.5 61t-60.5 184z" /> <glyph unicode="t" horiz-adv-x="546" d="M-16 233q0 56 16 134l123 575h-68l17 82h67l62 283l303 41l-70 -324h123l-16 -82h-123l-131 -614q-8 -36 -8 -66q0 -42 19.5 -59t63.5 -17q59 0 110 51.5t75 129.5h86q-33 -95 -79 -167t-90.5 -111t-95.5 -63t-88.5 -31t-76.5 -7q-98 0 -158.5 61t-60.5 184z" />
<glyph unicode="u" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-6 -30 -6 -58q0 -84 61 -84q109 0 164 181l139 657h295l-147 -696q-9 -40 -9 -66q0 -42 20 -59t64 -17q57 0 99 49.5t67 131.5h86q-133 -379 -411 -379q-88 0 -141 49.5t-62 144.5q-118 -194 -303 -194q-98 0 -158.5 61 t-60.5 184z" /> <glyph unicode="u" horiz-adv-x="1034" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-6 -30 -6 -58q0 -84 61 -84q109 0 164 181l139 657h295l-147 -696q-9 -40 -9 -66q0 -42 20 -59t64 -17q57 0 99 49.5t67 131.5h86q-133 -379 -411 -379q-88 0 -141 49.5t-62 144.5q-118 -194 -303 -194q-98 0 -158.5 61 t-60.5 184z" />
<glyph unicode="v" horiz-adv-x="847" d="M-18 229q0 50 10 99l147 696h295l-147 -696q-11 -53 -11 -74q0 -68 70 -68q58 0 114 49.5t98 127t75 169.5t50 181t17 157q-4 -9 -26 -14.5t-39 -5.5q-34 0 -54 33t-20 71q0 50 32.5 80.5t94.5 30.5q68 0 98.5 -50.5t30.5 -127.5q0 -85 -14.5 -180.5t-43.5 -198 t-77.5 -194.5t-111 -165.5t-149.5 -117t-188 -43.5q-119 0 -185 61t-66 180z" /> <glyph unicode="&#x2000;" horiz-adv-x="768" />
<glyph unicode="w" horiz-adv-x="1353" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-6 -24 -6 -52q0 -90 61 -90q109 0 164 181l139 657h295l-147 -696q-11 -53 -11 -74q0 -68 70 -68q58 0 114 49.5t98 127t75 169.5t50 181t17 157q-4 -9 -26 -14.5t-39 -5.5q-34 0 -54 33t-20 71q0 50 32.5 80.5t94.5 30.5 q68 0 98.5 -50.5t30.5 -127.5q0 -85 -14.5 -180.5t-43.5 -198t-77.5 -194.5t-111 -165.5t-149.5 -117t-188 -43.5t-163.5 43.5t-81.5 128.5q-117 -172 -291 -172q-98 0 -158.5 61t-60.5 184z" /> <glyph unicode="&#x2001;" horiz-adv-x="1536" />
<glyph unicode="x" horiz-adv-x="1069" d="M0 367q20 98 48 186.5t70.5 178.5t94 155t121.5 106t149 41q58 0 101.5 -22.5t67 -61t36 -76.5t17.5 -83l18 -156q173 194 178 295q-24 -4 -35 -4q-96 0 -96 114q0 50 39.5 75.5t99.5 25.5q53 0 84 -57t31 -130q0 -89 -60.5 -177.5t-224.5 -268.5l19 -143 q12 -98 42 -138.5t85 -40.5q59 0 109.5 51.5t74.5 129.5h86q-32 -91 -75 -160.5t-85.5 -110t-91 -66t-87.5 -34t-79 -8.5q-192 0 -250 356l-282 -344h-148l414 467l-33 229q-14 99 -31.5 134.5t-46.5 35.5q-66 0 -144.5 -131t-129.5 -368h-86z" /> <glyph unicode="&#x2002;" horiz-adv-x="768" />
<glyph unicode="y" horiz-adv-x="995" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-6 -24 -6 -52q0 -90 61 -90q54 0 94.5 45.5t65.5 122.5l143 670h295l-203 -950q98 35 157.5 99.5t100.5 193.5h86q-23 -78 -56.5 -140t-68.5 -101.5t-78.5 -69t-79.5 -45t-79 -27.5l-31 -148q-72 -348 -369 -348 q-99 0 -164 51.5t-65 147.5q0 203 334 305l25 110q-102 -114 -246 -114q-98 0 -158.5 61t-60.5 184zM203 -285q0 -24 19 -45.5t50 -21.5q34 0 67 47.5t52 134.5l12 59q-200 -75 -200 -174z" /> <glyph unicode="&#x2003;" horiz-adv-x="1536" />
<glyph unicode="z" horiz-adv-x="876" d="M0 0l522 913h-114q-56 0 -84.5 -6t-28.5 -26q0 -3 5.5 -5t11 -10.5t5.5 -29.5q0 -53 -33 -81t-77 -28q-38 0 -66 24t-28 66q0 71 68 139t169 68h527l-502 -866q7 0 65 -6.5t90 -6.5q90 0 97 41q-39 3 -39 43q0 32 30.5 60t83.5 28q44 0 67.5 -27.5t23.5 -70.5 q0 -79 -70 -149t-180 -70h-543z" /> <glyph unicode="&#x2004;" horiz-adv-x="512" />
<glyph unicode="{" horiz-adv-x="720" d="M61 -287q0 65 30.5 150t69 157t81 167t59.5 171q6 24 6 45q0 64 -84 64q-25 0 -65 -6l24 117q44 -7 64 -7q38 0 64.5 15.5t40.5 36.5t21.5 55t9 59.5t1.5 61.5q0 58 -7 166t-7 159q0 50 10 103t35 109t61 100t93.5 72t127.5 28h88l-18 -102q-72 0 -113.5 -10t-72.5 -44 q-52 -58 -72.5 -125t-22.5 -157l13 -350q-6 -164 -82 -228q24 -27 24 -74q0 -60 -38 -157t-83.5 -184t-83.5 -188.5t-38 -170.5q0 -164 174 -164l-19 -92h-18q-105 0 -151 14t-83 72q-39 58 -39 137z" /> <glyph unicode="&#x2005;" horiz-adv-x="384" />
<glyph unicode="|" horiz-adv-x="1089" d="M449 -512v2050h190v-2050h-190z" /> <glyph unicode="&#x2006;" horiz-adv-x="256" />
<glyph unicode="}" horiz-adv-x="720" d="M61 -510l19 102q72 0 113.5 10t72.5 44q52 58 72 124.5t22 157.5l-12 351q5 163 82 227q-24 27 -24 74q0 60 38 157t83.5 184t83.5 188.5t38 170.5q0 164 -174 164l19 92h18q105 0 150.5 -14t82.5 -72q39 -58 39 -137q0 -65 -30.5 -150t-69 -157t-80.5 -167t-59 -171 q-6 -24 -6 -45q0 -64 84 -64q25 0 65 6l-24 -116q-38 6 -64 6q-38 0 -64.5 -15.5t-40.5 -36.5t-21.5 -55t-9 -59.5t-1.5 -61.5q0 -58 7 -166t7 -159q0 -50 -10 -103t-35 -109t-61 -100t-93.5 -72t-127.5 -28h-89z" /> <glyph unicode="&#x2007;" horiz-adv-x="256" />
<glyph unicode="~" horiz-adv-x="882" d="M100 1192q49 98 137 149.5t205 51.5q79 0 180.5 -34t157.5 -34q85 0 129 47l13 -2q-18 -75 -117.5 -140t-212.5 -65q-70 0 -180 38t-164 38q-79 0 -135 -53z" /> <glyph unicode="&#x2008;" horiz-adv-x="192" />
<glyph unicode="&#xa1;" horiz-adv-x="448" d="M-125 -508l266 961h174l-145 -961h-295zM121 762q0 68 47.5 116t114.5 48t115 -48t48 -116q0 -67 -47.5 -114.5t-115.5 -47.5q-67 0 -114.5 47t-47.5 115z" /> <glyph unicode="&#x2009;" horiz-adv-x="307" />
<glyph unicode="&#xa2;" horiz-adv-x="825" d="M63 647q0 141 48 262.5t146.5 206.5t231.5 103l46 251h118l-55 -249q81 -5 132.5 -38.5t51.5 -101.5q0 -33 -10 -67h-117q11 42 11 57q0 70 -76 70h-10l-156 -703q10 -2 31 -2q40 0 76 10.5t72.5 34t59 41.5t62.5 53q-45 -267 -332 -278l-78 -352h-55l64 354 q-112 16 -186.5 107t-74.5 241zM279 653q0 -55 18.5 -105t56.5 -79l113 625q-82 -64 -135 -190t-53 -251z" /> <glyph unicode="&#x200a;" horiz-adv-x="85" />
<glyph unicode="&#xa3;" horiz-adv-x="952" d="M51 686q67 136 215 182l148 605l307 63l-164 -678q8 -2 32.5 -10.5t35.5 -11.5t31.5 -8t38 -7t36.5 -2q85 0 129 47l12 -2q-18 -75 -117 -140t-212 -65h-33l-115 -473q32 4 101.5 6.5t111.5 7.5t115.5 36t150.5 88q-15 -148 -72 -236t-140 -88h-605l176 733q-5 0 -16.5 1 t-17.5 1q-80 0 -136 -53z" /> <glyph unicode="&#x202f;" horiz-adv-x="307" />
<glyph unicode="&#xa4;" horiz-adv-x="1024" d="M139 1008l78 73l115 -114q83 61 186 61q101 0 182 -59l115 114l74 -73l-113 -113q62 -84 62 -188q0 -103 -62 -187l113 -112l-74 -74l-113 113q-83 -60 -184 -60q-104 0 -188 62l-115 -115l-74 74l115 114q-59 81 -59 183q0 103 59 184zM313 709q0 -85 60 -145t145 -60 t145 60t60 145t-60 144.5t-145 59.5t-145 -59.5t-60 -144.5z" /> <glyph unicode="&#x205f;" horiz-adv-x="384" />
<glyph unicode="&#xa5;" horiz-adv-x="970" d="M39 291l29 102h196l29 133h-203l29 103h196l-229 907h336l180 -739l307 739h135l-401 -907h268l-28 -103h-262l-29 -133h268l-29 -102h-262l-61 -291h-328l62 291h-203z" /> <glyph unicode="&#x25fc;" horiz-adv-x="1140" d="M0 0v1140h1140v-1140h-1140z" />
<glyph unicode="&#xa6;" horiz-adv-x="1089" d="M449 455h190v-967h-190v967zM449 616v922h190v-922h-190z" />
<glyph unicode="&#xa7;" horiz-adv-x="1110" d="M16 158q0 111 56.5 181.5t140.5 70.5q38 0 72 -18.5t49.5 -35.5t40.5 -49q-91 -7 -128.5 -42.5t-37.5 -112.5q0 -81 39.5 -120.5t128.5 -39.5q78 0 121 48.5t43 149.5q0 68 -20.5 125.5t-53 99t-71.5 78.5t-78.5 71t-72 69.5t-53 82t-20.5 99.5q0 95 59 170t154 111 q-10 45 -10 86q0 88 38.5 157.5t101.5 111.5t138.5 63.5t155.5 21.5q29 0 57.5 -2.5t68.5 -14.5t69 -31.5t50 -57.5t21 -89q0 -72 -36.5 -118.5t-98.5 -46.5q-46 0 -76 32q33 20 53.5 60.5t20.5 81.5q0 46 -29 78t-86 32q-82 0 -137 -65.5t-55 -153.5q0 -51 22.5 -96 t58 -79.5t79 -68t86.5 -71t78.5 -79t58 -99.5t22.5 -127q0 -79 -27 -150.5t-82 -124t-128 -67.5q0 -182 -118 -286t-327 -104q-43 0 -82 4.5t-88.5 21.5t-84.5 44.5t-59 78.5t-24 120zM389 924q0 -47 34.5 -94t87 -92t107 -94.5t102.5 -119.5t66 -149q39 48 39 129 q0 67 -29 123.5t-76.5 100.5t-98.5 82t-106 87t-87 98q-39 -20 -39 -71z" />
<glyph unicode="&#xa8;" horiz-adv-x="802" d="M115 1298q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88zM483 1298q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88z" />
<glyph unicode="&#xa9;" horiz-adv-x="1202" d="M104 678q0 144 67.5 265t181.5 190t247 69t247 -68.5t181.5 -189t67.5 -264.5t-67.5 -265t-181.5 -190t-247 -69t-247 69t-181.5 189.5t-67.5 263.5zM199 678q0 -183 119 -309.5t286 -126.5q166 0 285 126.5t119 309.5t-119 309.5t-285 126.5q-167 0 -286 -126.5 t-119 -309.5zM311 688q0 129 88.5 216t214.5 87q95 -4 164.5 -58t89.5 -136l-96 -37q-7 26 -14 41.5t-23.5 38t-46 34t-70.5 11.5q-82 0 -138 -48.5t-56 -138.5q0 -92 56 -155.5t138 -63.5q48 0 89.5 24.5t64.5 67.5l90 -59q-43 -65 -110 -102t-142 -37q-124 0 -211.5 93.5 t-87.5 221.5z" />
<glyph unicode="&#xaa;" horiz-adv-x="706" d="M88 1096q0 60 9 116.5t32 112t57.5 96.5t89 66.5t123.5 25.5q40 0 80 -28l6 31h170l-86 -377q-6 -36 -6 -37q0 -41 43 -41q21 0 31 4q-15 -45 -38.5 -69t-41 -28.5t-43.5 -4.5q-99 0 -119 81q-72 -88 -162 -88q-77 0 -111 41t-34 99zM248 1126q0 -77 69 -77q35 0 74 53 l76 330q-23 20 -59 20q-42 0 -80 -50.5t-59 -125.5t-21 -150z" />
<glyph unicode="&#xab;" horiz-adv-x="1206" d="M41 487l18 84l629 308l-20 -113l-494 -246l397 -196l-24 -117zM471 487l18 84l629 308l-20 -113l-494 -246l397 -196l-24 -117z" />
<glyph unicode="&#xac;" horiz-adv-x="909" d="M39 455l37 161h741l-104 -512h-232l72 351h-514z" />
<glyph unicode="&#xad;" horiz-adv-x="593" d="M39 455l37 161h409l-34 -161h-412z" />
<glyph unicode="&#xae;" horiz-adv-x="1132" d="M70 684q0 108 39.5 205.5t106.5 167t158 110.5t191 41q133 0 247 -68.5t181.5 -189t67.5 -264.5t-67.5 -265t-181.5 -190t-247 -69q-100 0 -191 41t-158 110.5t-106.5 166.5t-39.5 204zM164 684q0 -183 119 -309.5t286 -126.5q166 0 285 126.5t119 309.5t-119 309.5 t-285 126.5q-167 0 -286 -126.5t-119 -309.5zM360 393l2 596h193q110 0 178 -45.5t68 -126.5q0 -57 -33.5 -100t-87.5 -58l133 -256l-96 -14l-127 256h-135v-252h-95zM455 723h106q36 0 65.5 6t55 27.5t25.5 56.5q0 49 -44.5 70.5t-105.5 21.5h-102v-182z" />
<glyph unicode="&#xb0;" horiz-adv-x="643" d="M76 999q0 187 91 313t241 126q87 0 127 -58.5t40 -173.5q0 -68 -20.5 -142.5t-57 -142t-96 -111.5t-129.5 -44q-113 0 -154.5 57t-41.5 176zM223 975q0 -133 56 -133q53 0 93 56t60.5 145t20.5 194q0 129 -52 129q-50 0 -106.5 -83.5t-67.5 -219.5q-4 -50 -4 -88z" />
<glyph unicode="&#xb1;" horiz-adv-x="1091" d="M63 139l37 162h752l-35 -162h-754zM170 633l49 229h262l56 250h231l-55 -250h260l-47 -229h-262l-56 -252h-231l55 252h-262z" />
<glyph unicode="&#xb2;" horiz-adv-x="614" d="M6 739q0 66 40.5 130t97.5 118t114.5 110.5t98 131t40.5 155.5q0 38 -22 64.5t-49 26.5q-56 0 -76.5 -22t-20.5 -67q0 -24 11 -47t34 -28q-45 -39 -92 -39q-37 0 -60.5 26t-23.5 74q0 65 61 113.5t185 48.5q225 0 225 -176q0 -70 -34 -132.5t-88 -111t-110 -90 t-111 -87.5t-81 -85h9q38 0 114 -10.5t117 -10.5q16 0 29.5 1.5t26 6t20 7.5t20 12.5t17.5 13.5t20 18t21 19q0 -37 -0.5 -57t-3.5 -47t-8.5 -40.5t-15.5 -29.5t-25 -23.5t-37 -12.5t-52 -5q-65 0 -149 20.5t-144 20.5q-13 0 -30.5 -6t-37 -15.5t-26.5 -11.5q-4 24 -4 37z " />
<glyph unicode="&#xb3;" horiz-adv-x="647" d="M27 879q0 79 36.5 123.5t104.5 44.5q82 0 96 -56q-34 -3 -56.5 -15.5t-32 -33t-12.5 -39t-3 -43.5q0 -52 26.5 -71t77.5 -19q63 0 104.5 58.5t41.5 134.5q0 68 -38.5 124.5t-115.5 81.5q96 23 149.5 88.5t53.5 131.5q0 38 -20 62t-56 24q-107 0 -107 -89q0 -24 11.5 -47 t34.5 -28q-45 -39 -93 -39q-37 0 -60.5 26t-23.5 74q0 64 66 113t190 49q98 0 153.5 -47t55.5 -115q0 -59 -40.5 -113.5t-120.5 -91.5q147 -44 147 -180q0 -105 -89.5 -196t-215.5 -91q-44 0 -83 6t-83.5 23t-71 55.5t-26.5 94.5z" />
<glyph unicode="&#xb4;" horiz-adv-x="647" d="M246 1149l186 387h215l-248 -387h-153z" />
<glyph unicode="&#xb5;" d="M-150 -340l289 1364h295l-147 -696q-6 -24 -6 -52q0 -39 14.5 -64.5t46.5 -25.5q109 0 164 181l139 657h295l-147 -696q-9 -40 -9 -66q0 -42 20 -59t64 -17q57 0 99 49.5t67 131.5h86q-33 -96 -77.5 -166t-85.5 -107.5t-89.5 -60t-83.5 -28t-75 -5.5q-86 0 -139 47.5 t-62 136.5q-113 -180 -293 -184l-55 -266z" />
<glyph unicode="&#xb6;" horiz-adv-x="1110" d="M147 1006q0 77 20.5 152.5t63 143.5t102 119.5t144 82t182.5 30.5q80 0 146 -18.5t119.5 -57t83.5 -105.5t30 -157q0 -62 -16 -147l-260 -1215h-193l166 778q-33 -11 -88 -22l-158 -756h-192l158 756q-148 29 -228 146t-80 270zM670 694h12q41 0 72 8l98 465 q12 59 12 101q0 85 -47 129z" />
<glyph unicode="&#xb7;" horiz-adv-x="888" d="M246 547q0 82 57 140t139 58t140.5 -58t58.5 -140t-58.5 -139.5t-140.5 -57.5t-139 57.5t-57 139.5z" />
<glyph unicode="&#xb8;" horiz-adv-x="464" d="M0 -389q35 65 82 65q45 0 85.5 -27.5t65.5 -27.5q26 0 44 26.5t18 59.5q0 31 -20 52.5t-60 21.5q-48 0 -106 -25l108 303l72 -47l-60 -147q66 16 109 16q63 0 95 -27t32 -75q0 -104 -74.5 -164.5t-171.5 -60.5q-70 0 -117.5 14t-101.5 43z" />
<glyph unicode="&#xb9;" horiz-adv-x="444" d="M45 707l158 690h-113l14 51q148 0 302 86l-189 -827h-172z" />
<glyph unicode="&#xba;" horiz-adv-x="673" d="M86 1137q0 98 25.5 174t69.5 122t99 69.5t117 23.5q45 0 79 -14t34 -35q0 -37 -53 -54q-16 39 -54 39q-41 0 -73.5 -36t-50 -89t-26.5 -103t-9 -87q0 -47 22 -65.5t62 -18.5q50 0 80 65.5t41 155.5q-31 8 -31 45q0 30 25.5 57t54.5 27q22 0 30.5 -8t8.5 -31q14 8 23.5 17 t22.5 25t21 24l12 -23q-27 -87 -79 -117q-4 -82 -30.5 -150t-65 -109.5t-82.5 -64t-87 -22.5q-96 0 -141 43t-45 140z" />
<glyph unicode="&#xbb;" horiz-adv-x="1200" d="M31 207l28 117l492 196l-397 246l18 113l504 -308l-23 -110zM485 207l29 117l492 196l-398 246l19 113l503 -308l-22 -110z" />
<glyph unicode="&#xbc;" horiz-adv-x="1411" d="M143 461l158 690h-113l15 51q147 0 301 86l-189 -827h-172zM285 -338l540 1874h148l-541 -1874h-147zM766 307q14 41 60 129t79 172t33 156q0 36 -8 67q56 0 94.5 -27t38.5 -77q0 -49 -20 -99t-44 -84t-58.5 -81t-51.5 -76h184l96 422l177 22l-103 -444h78l-25 -80h-71 l-70 -305h-170l70 305h-289z" />
<glyph unicode="&#xbd;" horiz-adv-x="1382" d="M143 461l158 690h-113l15 51q147 0 301 86l-189 -827h-172zM274 -338l541 1874h148l-541 -1874h-148zM750 43q0 49 21.5 96t56 86.5t76.5 79.5t83.5 82t76 86t56 99.5t21.5 115.5q0 38 -22 64t-50 26q-56 0 -76 -21.5t-20 -66.5q0 -24 11.5 -47.5t33.5 -28.5 q-45 -39 -92 -39q-37 0 -60.5 26.5t-23.5 74.5q0 66 60.5 114t184.5 48q226 0 226 -176q0 -70 -34 -132.5t-88 -111t-110 -90t-111 -87.5t-81 -85h8q37 0 114 -10.5t117 -10.5q16 0 29.5 1.5t26 6t20 7.5t20 12.5t17.5 13.5t20 18t21 19q0 -52 -1.5 -77.5t-8.5 -57.5 t-21.5 -46t-41.5 -24t-68 -10q-65 0 -149 20.5t-144 20.5q-13 0 -30.5 -6t-37 -15.5t-26.5 -11.5q-4 24 -4 37z" />
<glyph unicode="&#xbe;" horiz-adv-x="1677" d="M125 633q0 79 36.5 123.5t104.5 44.5q82 0 96 -56q-34 -3 -56.5 -15.5t-32 -33t-12.5 -39t-3 -43.5q0 -52 26.5 -71t77.5 -19q63 0 104.5 58.5t41.5 134.5q0 68 -38.5 125t-115.5 82q96 23 149.5 88.5t53.5 130.5q0 38 -20 62t-56 24q-106 0 -106 -88q0 -24 11.5 -47.5 t33.5 -28.5q-45 -39 -92 -39q-37 0 -60.5 26t-23.5 74q0 64 66 113t190 49q98 0 153.5 -47t55.5 -115q0 -58 -41 -112.5t-121 -91.5q75 -22 111 -70t36 -111q0 -105 -89.5 -195.5t-215.5 -90.5q-264 0 -264 178zM522 -338l541 1874h147l-540 -1874h-148zM1010 307 q14 41 60 129t79 172t33 156q0 36 -8 67q56 0 94.5 -27t38.5 -77q0 -49 -20 -99t-44 -84t-58.5 -81t-51.5 -76h184l96 422l176 22l-102 -444h78l-25 -80h-72l-69 -305h-170l69 305h-288z" />
<glyph unicode="&#xbf;" horiz-adv-x="899" d="M25 -262q0 78 20 142.5t55 112t77.5 88.5t91.5 80.5t93.5 79.5t87 95t68.5 117h135q0 -58 -20.5 -113t-53.5 -99.5t-72.5 -88.5t-79 -88.5t-72.5 -91t-53.5 -105t-20.5 -121.5q0 -71 32 -106t80 -35q62 0 113 48.5t51 121.5q0 42 -19.5 83t-58.5 52q26 42 66 64t84 22 q64 0 109.5 -45t45.5 -127q0 -55 -24.5 -110.5t-73.5 -106t-135.5 -82t-196.5 -31.5q-329 0 -329 244zM473 762q0 69 47.5 117.5t114.5 48.5q68 0 116 -48.5t48 -117.5q0 -67 -48 -114.5t-116 -47.5q-67 0 -114.5 47t-47.5 115z" />
<glyph unicode="&#xc0;" horiz-adv-x="1368" d="M18 686q0 105 119 178.5t299 73.5q42 0 107 -6q80 127 165.5 233.5t177 191t187 132t182.5 47.5q91 0 162 -29l-321 -1507h-295l157 743q-137 62 -274 74q-116 -252 -191 -514.5t-75 -421.5q0 -72 28 -114q-31 0 -50.5 0.5t-51.5 5t-53 12.5t-45.5 24t-39 38.5 t-24.5 57.5t-10 79q0 137 83.5 367t217.5 466q-204 -13 -240 -106q8 0 17.5 -21.5t9.5 -42.5q0 -36 -33 -58t-82 -22q-55 0 -91 30.5t-36 88.5zM727 905q148 -29 250 -71l119 557q-171 -92 -369 -486zM895 2048h215l59 -387h-153z" />
<glyph unicode="&#xc1;" horiz-adv-x="1368" d="M18 686q0 105 119 178.5t299 73.5q42 0 107 -6q80 127 165.5 233.5t177 191t187 132t182.5 47.5q91 0 162 -29l-321 -1507h-295l157 743q-137 62 -274 74q-116 -252 -191 -514.5t-75 -421.5q0 -72 28 -114q-31 0 -50.5 0.5t-51.5 5t-53 12.5t-45.5 24t-39 38.5 t-24.5 57.5t-10 79q0 137 83.5 367t217.5 466q-204 -13 -240 -106q8 0 17.5 -21.5t9.5 -42.5q0 -36 -33 -58t-82 -22q-55 0 -91 30.5t-36 88.5zM727 905q148 -29 250 -71l119 557q-171 -92 -369 -486zM995 1661l187 387h215l-248 -387h-154z" />
<glyph unicode="&#xc2;" horiz-adv-x="1368" d="M18 686q0 105 119 178.5t299 73.5q42 0 107 -6q80 127 165.5 233.5t177 191t187 132t182.5 47.5q91 0 162 -29l-321 -1507h-295l157 743q-137 62 -274 74q-116 -252 -191 -514.5t-75 -421.5q0 -72 28 -114q-31 0 -50.5 0.5t-51.5 5t-53 12.5t-45.5 24t-39 38.5 t-24.5 57.5t-10 79q0 137 83.5 367t217.5 466q-204 -13 -240 -106q8 0 17.5 -21.5t9.5 -42.5q0 -36 -33 -58t-82 -22q-55 0 -91 30.5t-36 88.5zM727 905q148 -29 250 -71l119 557q-171 -92 -369 -486zM834 1661l434 387h43l123 -387h-66l-123 164l-321 -164h-90z" />
<glyph unicode="&#xc3;" horiz-adv-x="1368" d="M18 686q0 105 119 178.5t299 73.5q42 0 107 -6q80 127 165.5 233.5t177 191t187 132t182.5 47.5q91 0 162 -29l-321 -1507h-295l157 743q-137 62 -274 74q-116 -252 -191 -514.5t-75 -421.5q0 -72 28 -114q-31 0 -50.5 0.5t-51.5 5t-53 12.5t-45.5 24t-39 38.5 t-24.5 57.5t-10 79q0 137 83.5 367t217.5 466q-204 -13 -240 -106q8 0 17.5 -21.5t9.5 -42.5q0 -36 -33 -58t-82 -22q-55 0 -91 30.5t-36 88.5zM727 905q148 -29 250 -71l119 557q-171 -92 -369 -486zM838 1704q49 98 137 149.5t205 51.5q79 0 180.5 -34t157.5 -34 q85 0 129 47l12 -2q-18 -75 -117.5 -140t-212.5 -65q-70 0 -180 38t-164 38q-79 0 -135 -53z" />
<glyph unicode="&#xc4;" horiz-adv-x="1368" d="M18 686q0 105 119 178.5t299 73.5q42 0 107 -6q80 127 165.5 233.5t177 191t187 132t182.5 47.5q91 0 162 -29l-321 -1507h-295l157 743q-137 62 -274 74q-116 -252 -191 -514.5t-75 -421.5q0 -72 28 -114q-31 0 -50.5 0.5t-51.5 5t-53 12.5t-45.5 24t-39 38.5 t-24.5 57.5t-10 79q0 137 83.5 367t217.5 466q-204 -13 -240 -106q8 0 17.5 -21.5t9.5 -42.5q0 -36 -33 -58t-82 -22q-55 0 -91 30.5t-36 88.5zM727 905q148 -29 250 -71l119 557q-171 -92 -369 -486zM881 1810q0 51 36.5 88t88.5 37q51 0 87.5 -37t36.5 -88 q0 -52 -36.5 -88t-87.5 -36q-53 0 -89 36t-36 88zM1249 1810q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88z" />
<glyph unicode="&#xc5;" horiz-adv-x="1368" d="M18 686q0 105 119 178.5t299 73.5q42 0 107 -6q80 127 165.5 233.5t177 191t187 132t182.5 47.5q91 0 162 -29l-321 -1507h-295l157 743q-137 62 -274 74q-116 -252 -191 -514.5t-75 -421.5q0 -72 28 -114q-31 0 -50.5 0.5t-51.5 5t-53 12.5t-45.5 24t-39 38.5 t-24.5 57.5t-10 79q0 137 83.5 367t217.5 466q-204 -13 -240 -106q8 0 17.5 -21.5t9.5 -42.5q0 -36 -33 -58t-82 -22q-55 0 -91 30.5t-36 88.5zM727 905q148 -29 250 -71l119 557q-171 -92 -369 -486zM993 1786q0 29 10.5 60.5t30 60t54.5 47t79 18.5q72 0 110 -44t38 -113 q0 -74 -44.5 -123.5t-133.5 -49.5q-64 0 -104 42t-40 102zM1075 1790q0 -76 70 -76q46 0 70 25t24 69q0 20 -1.5 32.5t-7.5 29.5t-21 26t-38 9q-49 0 -72.5 -35t-23.5 -80z" />
<glyph unicode="&#xc6;" horiz-adv-x="1564" d="M18 696q0 61 55.5 116t148 87.5t196.5 32.5q54 0 121 -6q81 129 166 236.5t177 193.5t187.5 134t183.5 48q53 0 173.5 -20.5t195.5 -20.5q119 0 240 39q-3 -9 -10.5 -34.5t-12 -38.5t-15 -36.5t-20 -36.5t-26 -30.5t-35 -26.5t-44.5 -15.5t-57 -6.5q-21 0 -40.5 1.5 t-41.5 6.5t-34.5 7.5t-37.5 11.5t-31 11t-36 14t-32 13l-111 -518h317l-41 -151h-309l-104 -490h458l-43 -217h-755l157 743q-151 66 -276 74q-116 -249 -190 -511.5t-74 -422.5q0 -36 4 -59t9 -30.5t9.5 -13.5t5.5 -11q-118 7 -163 24q-98 36 -109 165q-2 19 -2 40 q0 131 83.5 359t217.5 460q-100 -7 -160 -30.5t-80 -75.5q8 0 17.5 -21.5t9.5 -42.5q0 -35 -31.5 -57.5t-93.5 -22.5q-49 0 -83 32.5t-34 96.5zM723 903q146 -27 254 -69l119 557q-176 -96 -373 -488z" />
<glyph unicode="&#xc7;" horiz-adv-x="1017" d="M39 471q0 83 11 176t37 197.5t64 202t96.5 187t129.5 156.5t168.5 106.5t208.5 39.5q75 0 135.5 -15t107.5 -47t73 -85.5t26 -126.5q0 -87 -35 -138t-109 -51q-70 0 -116 53q37 19 65.5 75t28.5 114q0 55 -30 90t-95 35q-108 0 -208.5 -152t-159 -374t-58.5 -431 q0 -59 6.5 -105.5t23.5 -87.5t44.5 -68t70.5 -42.5t101 -15.5q119 0 223.5 54.5t175.5 150.5l47 -21q-35 -88 -96.5 -159t-134 -115t-146 -69.5t-145.5 -33.5l-43 -106q66 16 108 16q63 0 95 -27t32 -75q0 -104 -74 -164.5t-171 -60.5q-71 0 -118.5 14.5t-101.5 42.5 q35 65 82 65q45 0 86 -27.5t66 -27.5q26 0 43.5 26.5t17.5 59.5q0 31 -19.5 52.5t-59.5 21.5q-50 0 -107 -25l76 211q-218 6 -320 123t-102 381z" />
<glyph unicode="&#xc8;" horiz-adv-x="940" d="M14 324q0 110 44.5 219.5t133 196.5t201.5 114q-125 89 -125 246q0 106 56.5 206.5t161.5 167t231 66.5q127 0 210 -67.5t83 -188.5q0 -91 -44.5 -152t-107.5 -61q-55 0 -96 55q37 12 63.5 68t26.5 111q0 58 -33 86t-80 28q-88 0 -148.5 -88.5t-60.5 -200.5 q0 -96 51.5 -171t155.5 -103q-79 -18 -149 -70.5t-116.5 -122t-73.5 -147.5t-27 -149q0 -93 47.5 -150t146.5 -57q102 0 214.5 57t164.5 152l47 -21q-78 -177 -245 -281t-355 -104q-95 0 -169 29t-118.5 79.5t-67 114.5t-22.5 138zM516 2048h215l60 -387h-154z" />
<glyph unicode="&#xc9;" horiz-adv-x="940" d="M14 324q0 110 44.5 219.5t133 196.5t201.5 114q-125 89 -125 246q0 106 56.5 206.5t161.5 167t231 66.5q127 0 210 -67.5t83 -188.5q0 -91 -44.5 -152t-107.5 -61q-55 0 -96 55q37 12 63.5 68t26.5 111q0 58 -33 86t-80 28q-88 0 -148.5 -88.5t-60.5 -200.5 q0 -96 51.5 -171t155.5 -103q-79 -18 -149 -70.5t-116.5 -122t-73.5 -147.5t-27 -149q0 -93 47.5 -150t146.5 -57q102 0 214.5 57t164.5 152l47 -21q-78 -177 -245 -281t-355 -104q-95 0 -169 29t-118.5 79.5t-67 114.5t-22.5 138zM676 1661l186 387h215l-248 -387h-153z " />
<glyph unicode="&#xca;" horiz-adv-x="940" d="M14 324q0 110 44.5 219.5t133 196.5t201.5 114q-125 89 -125 246q0 106 56.5 206.5t161.5 167t231 66.5q127 0 210 -67.5t83 -188.5q0 -91 -44.5 -152t-107.5 -61q-55 0 -96 55q37 12 63.5 68t26.5 111q0 58 -33 86t-80 28q-88 0 -148.5 -88.5t-60.5 -200.5 q0 -96 51.5 -171t155.5 -103q-79 -18 -149 -70.5t-116.5 -122t-73.5 -147.5t-27 -149q0 -93 47.5 -150t146.5 -57q102 0 214.5 57t164.5 152l47 -21q-78 -177 -245 -281t-355 -104q-95 0 -169 29t-118.5 79.5t-67 114.5t-22.5 138zM414 1661l434 387h43l123 -387h-66 l-123 164l-321 -164h-90z" />
<glyph unicode="&#xcb;" horiz-adv-x="940" d="M14 324q0 110 44.5 219.5t133 196.5t201.5 114q-125 89 -125 246q0 106 56.5 206.5t161.5 167t231 66.5q127 0 210 -67.5t83 -188.5q0 -91 -44.5 -152t-107.5 -61q-55 0 -96 55q37 12 63.5 68t26.5 111q0 58 -33 86t-80 28q-88 0 -148.5 -88.5t-60.5 -200.5 q0 -96 51.5 -171t155.5 -103q-79 -18 -149 -70.5t-116.5 -122t-73.5 -147.5t-27 -149q0 -93 47.5 -150t146.5 -57q102 0 214.5 57t164.5 152l47 -21q-78 -177 -245 -281t-355 -104q-95 0 -169 29t-118.5 79.5t-67 114.5t-22.5 138zM487 1810q0 51 36.5 88t88.5 37 q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88zM856 1810q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88z" />
<glyph unicode="&#xcc;" horiz-adv-x="768" d="M12 1004q0 132 108 256.5t275 200t336 75.5q28 0 82 -4l-326 -1532h-294l296 1391q-136 -57 -211 -171t-75 -276q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153zM350 2048h215l60 -387h-154z" />
<glyph unicode="&#xcd;" horiz-adv-x="768" d="M12 1004q0 132 108 256.5t275 200t336 75.5q28 0 82 -4l-326 -1532h-294l296 1391q-136 -57 -211 -171t-75 -276q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153zM551 1661l186 387h215l-247 -387h-154z" />
<glyph unicode="&#xce;" horiz-adv-x="768" d="M12 1004q0 132 108 256.5t275 200t336 75.5q28 0 82 -4l-326 -1532h-294l296 1391q-136 -57 -211 -171t-75 -276q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153zM309 1661l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
<glyph unicode="&#xcf;" horiz-adv-x="768" d="M12 1004q0 132 108 256.5t275 200t336 75.5q28 0 82 -4l-326 -1532h-294l296 1391q-136 -57 -211 -171t-75 -276q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153zM342 1810q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36 t-36 88zM711 1810q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88z" />
<glyph unicode="&#xd0;" horiz-adv-x="1357" d="M12 1004q0 132 108 256.5t275 200t336 75.5q138 0 243 -30.5t169.5 -80.5t105.5 -123t56.5 -150t15.5 -169q0 -260 -78 -493.5t-209.5 -375t-279.5 -141.5q-124 0 -250 109l-17 -82h-294l151 707h-80l41 151h72l94 445l303 40l-104 -485h161l-40 -151h-154l-109 -512 q55 -41 117 -41q88 0 164 83t125 213t76.5 285t27.5 305q0 82 -6.5 141t-24.5 110.5t-49.5 83t-81.5 49.5t-120 18q-251 0 -402 -133.5t-151 -364.5q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153z" />
<glyph unicode="&#xd1;" horiz-adv-x="1404" d="M12 1004q0 70 26 144.5t77.5 143.5t120 123.5t161.5 87.5t195 33q131 0 190 -29l162 -1085l223 1110h295l-325 -1532h-248l-174 1071l-228 -1071h-294l294 1391q-135 -56 -209.5 -171t-74.5 -276q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153zM631 1704 q49 98 137 149.5t205 51.5q79 0 180.5 -34t157.5 -34q85 0 129 47l12 -2q-18 -75 -117.5 -140t-212.5 -65q-70 0 -180 38t-164 38q-79 0 -135 -53z" />
<glyph unicode="&#xd2;" horiz-adv-x="1347" d="M33 977q0 141 115 270.5t307 209t403 79.5q131 0 226.5 -38.5t151 -110t81.5 -164.5t26 -211q0 -87 -13.5 -181t-42.5 -194.5t-71.5 -193.5t-105 -176.5t-137.5 -145t-174.5 -97.5t-210.5 -36q-171 0 -269 98.5t-98 312.5q0 85 16 186.5t45.5 210t78 209t107.5 180 t139 127.5t169 48q55 0 107 -17q-89 -54 -174 -223.5t-135 -370.5t-50 -358q0 -110 29.5 -173.5t89.5 -63.5q100 0 201 145t164 362.5t63 421.5q0 95 -11 157.5t-39.5 110.5t-80 69.5t-131.5 21.5q-118 0 -224.5 -37t-188 -103.5t-129.5 -167t-48 -219.5q0 -48 11 -79 l10 -31q-207 0 -207 172zM598 2048h215l59 -387h-153z" />
<glyph unicode="&#xd3;" horiz-adv-x="1347" d="M33 977q0 141 115 270.5t307 209t403 79.5q131 0 226.5 -38.5t151 -110t81.5 -164.5t26 -211q0 -87 -13.5 -181t-42.5 -194.5t-71.5 -193.5t-105 -176.5t-137.5 -145t-174.5 -97.5t-210.5 -36q-171 0 -269 98.5t-98 312.5q0 85 16 186.5t45.5 210t78 209t107.5 180 t139 127.5t169 48q55 0 107 -17q-89 -54 -174 -223.5t-135 -370.5t-50 -358q0 -110 29.5 -173.5t89.5 -63.5q100 0 201 145t164 362.5t63 421.5q0 95 -11 157.5t-39.5 110.5t-80 69.5t-131.5 21.5q-118 0 -224.5 -37t-188 -103.5t-129.5 -167t-48 -219.5q0 -48 11 -79 l10 -31q-207 0 -207 172zM813 1661l186 387h215l-247 -387h-154z" />
<glyph unicode="&#xd4;" horiz-adv-x="1347" d="M33 977q0 141 115 270.5t307 209t403 79.5q131 0 226.5 -38.5t151 -110t81.5 -164.5t26 -211q0 -87 -13.5 -181t-42.5 -194.5t-71.5 -193.5t-105 -176.5t-137.5 -145t-174.5 -97.5t-210.5 -36q-171 0 -269 98.5t-98 312.5q0 85 16 186.5t45.5 210t78 209t107.5 180 t139 127.5t169 48q55 0 107 -17q-89 -54 -174 -223.5t-135 -370.5t-50 -358q0 -110 29.5 -173.5t89.5 -63.5q100 0 201 145t164 362.5t63 421.5q0 95 -11 157.5t-39.5 110.5t-80 69.5t-131.5 21.5q-118 0 -224.5 -37t-188 -103.5t-129.5 -167t-48 -219.5q0 -48 11 -79 l10 -31q-207 0 -207 172zM557 1661l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
<glyph unicode="&#xd5;" horiz-adv-x="1347" d="M33 977q0 141 115 270.5t307 209t403 79.5q131 0 226.5 -38.5t151 -110t81.5 -164.5t26 -211q0 -87 -13.5 -181t-42.5 -194.5t-71.5 -193.5t-105 -176.5t-137.5 -145t-174.5 -97.5t-210.5 -36q-171 0 -269 98.5t-98 312.5q0 85 16 186.5t45.5 210t78 209t107.5 180 t139 127.5t169 48q55 0 107 -17q-89 -54 -174 -223.5t-135 -370.5t-50 -358q0 -110 29.5 -173.5t89.5 -63.5q100 0 201 145t164 362.5t63 421.5q0 95 -11 157.5t-39.5 110.5t-80 69.5t-131.5 21.5q-118 0 -224.5 -37t-188 -103.5t-129.5 -167t-48 -219.5q0 -48 11 -79 l10 -31q-207 0 -207 172zM561 1704q49 98 137 149.5t205 51.5q79 0 180.5 -34t157.5 -34q85 0 129 47l12 -2q-18 -75 -117 -140t-212 -65q-70 0 -180 38t-164 38q-80 0 -136 -53z" />
<glyph unicode="&#xd6;" horiz-adv-x="1347" d="M33 977q0 141 115 270.5t307 209t403 79.5q131 0 226.5 -38.5t151 -110t81.5 -164.5t26 -211q0 -87 -13.5 -181t-42.5 -194.5t-71.5 -193.5t-105 -176.5t-137.5 -145t-174.5 -97.5t-210.5 -36q-171 0 -269 98.5t-98 312.5q0 85 16 186.5t45.5 210t78 209t107.5 180 t139 127.5t169 48q55 0 107 -17q-89 -54 -174 -223.5t-135 -370.5t-50 -358q0 -110 29.5 -173.5t89.5 -63.5q100 0 201 145t164 362.5t63 421.5q0 95 -11 157.5t-39.5 110.5t-80 69.5t-131.5 21.5q-118 0 -224.5 -37t-188 -103.5t-129.5 -167t-48 -219.5q0 -48 11 -79 l10 -31q-207 0 -207 172zM590 1810q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88zM958 1810q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88z" />
<glyph unicode="&#xd7;" horiz-adv-x="1054" d="M201 338l194 194l-194 195l133 131l192 -194l197 196l131 -133l-195 -195l195 -194l-131 -133l-197 194l-192 -192z" />
<glyph unicode="&#xd8;" horiz-adv-x="1347" d="M31 913q0 99 66.5 195.5t175 168.5t255.5 116.5t299 44.5q34 0 50 -2l22 100h107l-25 -115q313 -72 313 -475q0 -106 -21.5 -221.5t-70 -236.5t-118 -220.5t-174.5 -173.5t-230 -96l-31 -143h-106l28 133q-169 0 -263.5 92.5t-94.5 294.5q0 79 15.5 174t44.5 196 t75.5 195.5t103.5 169t134 119.5t162 45q49 0 92 -14l18 83q-40 7 -78 7q-153 0 -281.5 -59t-208 -173t-79.5 -262q0 -32 5 -54.5t10 -33t5 -14.5q-98 0 -149 37t-51 122zM506 367q0 -207 98 -224l234 1106q-83 -56 -161.5 -213t-124.5 -341t-46 -328zM719 180 q81 59 153.5 194.5t116 308t43.5 331.5q0 108 -17 177t-61 107z" />
<glyph unicode="&#xd9;" horiz-adv-x="1472" d="M0 993q0 85 42 167t116.5 149t171 118.5t212 80t232.5 28.5q44 0 98 -10q-32 -120 -74.5 -275t-64 -236t-49 -184t-40.5 -158.5t-26 -118.5t-17.5 -104.5t-4.5 -78.5q0 -185 141 -185q50 0 80.5 6t66.5 30t62.5 69.5t57.5 125t62 197t67 285.5l137 633h289l-136 -639 q-30 -145 -56.5 -247.5t-61 -204t-72 -168t-88.5 -125.5t-113 -92t-141 -51.5t-178 -18.5q-213 0 -304.5 81.5t-91.5 243.5q0 59 7 123.5t29.5 167.5t33.5 151t50 202t48 192l68 270q-170 -45 -266.5 -167t-96.5 -304q0 -48 6.5 -78.5t14.5 -44.5t8 -18q-219 0 -219 188z M840 2048h215l59 -387h-153z" />
<glyph unicode="&#xda;" horiz-adv-x="1472" d="M0 993q0 85 42 167t116.5 149t171 118.5t212 80t232.5 28.5q44 0 98 -10q-32 -120 -74.5 -275t-64 -236t-49 -184t-40.5 -158.5t-26 -118.5t-17.5 -104.5t-4.5 -78.5q0 -185 141 -185q50 0 80.5 6t66.5 30t62.5 69.5t57.5 125t62 197t67 285.5l137 633h289l-136 -639 q-30 -145 -56.5 -247.5t-61 -204t-72 -168t-88.5 -125.5t-113 -92t-141 -51.5t-178 -18.5q-213 0 -304.5 81.5t-91.5 243.5q0 59 7 123.5t29.5 167.5t33.5 151t50 202t48 192l68 270q-170 -45 -266.5 -167t-96.5 -304q0 -48 6.5 -78.5t14.5 -44.5t8 -18q-219 0 -219 188z M924 1661l186 387h215l-248 -387h-153z" />
<glyph unicode="&#xdb;" horiz-adv-x="1472" d="M0 993q0 85 42 167t116.5 149t171 118.5t212 80t232.5 28.5q44 0 98 -10q-32 -120 -74.5 -275t-64 -236t-49 -184t-40.5 -158.5t-26 -118.5t-17.5 -104.5t-4.5 -78.5q0 -185 141 -185q50 0 80.5 6t66.5 30t62.5 69.5t57.5 125t62 197t67 285.5l137 633h289l-136 -639 q-30 -145 -56.5 -247.5t-61 -204t-72 -168t-88.5 -125.5t-113 -92t-141 -51.5t-178 -18.5q-213 0 -304.5 81.5t-91.5 243.5q0 59 7 123.5t29.5 167.5t33.5 151t50 202t48 192l68 270q-170 -45 -266.5 -167t-96.5 -304q0 -48 6.5 -78.5t14.5 -44.5t8 -18q-219 0 -219 188z M743 1661l435 387h43l122 -387h-65l-123 164l-321 -164h-91z" />
<glyph unicode="&#xdc;" horiz-adv-x="1472" d="M0 993q0 85 42 167t116.5 149t171 118.5t212 80t232.5 28.5q44 0 98 -10q-32 -120 -74.5 -275t-64 -236t-49 -184t-40.5 -158.5t-26 -118.5t-17.5 -104.5t-4.5 -78.5q0 -185 141 -185q50 0 80.5 6t66.5 30t62.5 69.5t57.5 125t62 197t67 285.5l137 633h289l-136 -639 q-30 -145 -56.5 -247.5t-61 -204t-72 -168t-88.5 -125.5t-113 -92t-141 -51.5t-178 -18.5q-213 0 -304.5 81.5t-91.5 243.5q0 59 7 123.5t29.5 167.5t33.5 151t50 202t48 192l68 270q-170 -45 -266.5 -167t-96.5 -304q0 -48 6.5 -78.5t14.5 -44.5t8 -18q-219 0 -219 188z M764 1810q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88zM1133 1810q0 51 36 88t88 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -88.5 36t-35.5 88z" />
<glyph unicode="&#xdd;" horiz-adv-x="1269" d="M12 1004q0 132 108 256.5t275 200t336 75.5q28 0 82 -4l178 -733l303 727h136l-398 -895l-135 -631h-328l136 631l-197 768q-144 -53 -224.5 -170.5t-80.5 -284.5q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153zM928 1661l186 387h215l-248 -387h-153z " />
<glyph unicode="&#xde;" horiz-adv-x="1193" d="M12 778q0 146 129.5 281t319.5 203l51 233l303 41l-49 -225q113 -5 200.5 -40t140.5 -91.5t80 -125.5t27 -147q0 -99 -41.5 -196t-115 -176t-187.5 -128t-247 -49h-60l-76 -358h-294l245 1151q-115 -60 -175 -170t-60 -262q0 -46 6.5 -76t14 -44.5t7.5 -18.5 q-110 0 -164.5 45.5t-54.5 152.5zM580 434h28q104 0 193 79.5t137.5 195t48.5 229.5q0 77 -23.5 137t-78.5 99.5t-137 42.5z" />
<glyph unicode="&#xdf;" horiz-adv-x="921" d="M-174 -512l340 1597q18 84 50 148.5t68.5 101.5t82.5 60t86.5 31t85.5 8q135 0 207.5 -75.5t72.5 -184.5q0 -92 -49.5 -175.5t-138.5 -124.5q103 -35 150.5 -112.5t47.5 -177.5q0 -120 -26.5 -220.5t-68 -166t-94 -111.5t-103.5 -66t-97 -20q-21 0 -67 4l26 121 q60 0 106 51t70.5 131.5t36 161.5t11.5 158q0 70 -34 113.5t-114 64.5l37 119q73 30 121.5 87t48.5 140q0 58 -18.5 80t-59.5 22q-43 0 -83 -38t-60 -130l-326 -1523z" />
<glyph unicode="&#xe0;" horiz-adv-x="1077" d="M-27 317q0 71 14.5 149.5t42.5 159t73.5 153.5t101.5 130t132.5 91t162.5 34q84 0 125 -28.5t41 -75.5v-15l22 109h295l-147 -696q-9 -40 -9 -66q0 -88 84 -88q56 0 98 54t68 139h86q-133 -379 -411 -379q-87 0 -139.5 48.5t-61.5 139.5q-126 -188 -305 -188 q-43 0 -82 10.5t-74 35t-61 62t-41 94t-15 127.5zM276 346q0 -56 10 -91.5t28.5 -48.5t31.5 -16.5t33 -3.5q49 0 101 49t69 132l98 462q0 26 -20 52t-64 26q-62 0 -118 -60t-91.5 -148.5t-56.5 -183t-21 -169.5zM442 1536h215l60 -387h-154z" />
<glyph unicode="&#xe1;" horiz-adv-x="1077" d="M-27 317q0 71 14.5 149.5t42.5 159t73.5 153.5t101.5 130t132.5 91t162.5 34q84 0 125 -28.5t41 -75.5v-15l22 109h295l-147 -696q-9 -40 -9 -66q0 -88 84 -88q56 0 98 54t68 139h86q-133 -379 -411 -379q-87 0 -139.5 48.5t-61.5 139.5q-126 -188 -305 -188 q-43 0 -82 10.5t-74 35t-61 62t-41 94t-15 127.5zM276 346q0 -56 10 -91.5t28.5 -48.5t31.5 -16.5t33 -3.5q49 0 101 49t69 132l98 462q0 26 -20 52t-64 26q-62 0 -118 -60t-91.5 -148.5t-56.5 -183t-21 -169.5zM502 1149l186 387h215l-248 -387h-153z" />
<glyph unicode="&#xe2;" horiz-adv-x="1077" d="M-27 317q0 71 14.5 149.5t42.5 159t73.5 153.5t101.5 130t132.5 91t162.5 34q84 0 125 -28.5t41 -75.5v-15l22 109h295l-147 -696q-9 -40 -9 -66q0 -88 84 -88q56 0 98 54t68 139h86q-133 -379 -411 -379q-87 0 -139.5 48.5t-61.5 139.5q-126 -188 -305 -188 q-43 0 -82 10.5t-74 35t-61 62t-41 94t-15 127.5zM276 346q0 -56 10 -91.5t28.5 -48.5t31.5 -16.5t33 -3.5q49 0 101 49t69 132l98 462q0 26 -20 52t-64 26q-62 0 -118 -60t-91.5 -148.5t-56.5 -183t-21 -169.5zM299 1149l434 387h43l123 -387h-65l-123 164l-322 -164h-90z " />
<glyph unicode="&#xe3;" horiz-adv-x="1077" d="M-27 317q0 71 14.5 149.5t42.5 159t73.5 153.5t101.5 130t132.5 91t162.5 34q84 0 125 -28.5t41 -75.5v-15l22 109h295l-147 -696q-9 -40 -9 -66q0 -88 84 -88q56 0 98 54t68 139h86q-133 -379 -411 -379q-87 0 -139.5 48.5t-61.5 139.5q-126 -188 -305 -188 q-43 0 -82 10.5t-74 35t-61 62t-41 94t-15 127.5zM209 1192q49 98 137 149.5t205 51.5q79 0 180.5 -34t157.5 -34q85 0 129 47l12 -2q-18 -75 -117.5 -140t-212.5 -65q-70 0 -180 38t-164 38q-79 0 -135 -53zM276 346q0 -56 10 -91.5t28.5 -48.5t31.5 -16.5t33 -3.5 q49 0 101 49t69 132l98 462q0 26 -20 52t-64 26q-62 0 -118 -60t-91.5 -148.5t-56.5 -183t-21 -169.5z" />
<glyph unicode="&#xe4;" horiz-adv-x="1077" d="M-27 317q0 71 14.5 149.5t42.5 159t73.5 153.5t101.5 130t132.5 91t162.5 34q84 0 125 -28.5t41 -75.5v-15l22 109h295l-147 -696q-9 -40 -9 -66q0 -88 84 -88q56 0 98 54t68 139h86q-133 -379 -411 -379q-87 0 -139.5 48.5t-61.5 139.5q-126 -188 -305 -188 q-43 0 -82 10.5t-74 35t-61 62t-41 94t-15 127.5zM276 346q0 -56 10 -91.5t28.5 -48.5t31.5 -16.5t33 -3.5q49 0 101 49t69 132l98 462q0 26 -20 52t-64 26q-62 0 -118 -60t-91.5 -148.5t-56.5 -183t-21 -169.5zM369 1298q0 51 36.5 88t88.5 37q51 0 87.5 -37t36.5 -88 q0 -52 -36.5 -88t-87.5 -36q-53 0 -89 36t-36 88zM737 1298q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88z" />
<glyph unicode="&#xe5;" horiz-adv-x="1077" d="M-27 317q0 71 14.5 149.5t42.5 159t73.5 153.5t101.5 130t132.5 91t162.5 34q84 0 125 -28.5t41 -75.5v-15l22 109h295l-147 -696q-9 -40 -9 -66q0 -88 84 -88q56 0 98 54t68 139h86q-133 -379 -411 -379q-87 0 -139.5 48.5t-61.5 139.5q-126 -188 -305 -188 q-43 0 -82 10.5t-74 35t-61 62t-41 94t-15 127.5zM276 346q0 -56 10 -91.5t28.5 -48.5t31.5 -16.5t33 -3.5q49 0 101 49t69 132l98 462q0 26 -20 52t-64 26q-62 0 -118 -60t-91.5 -148.5t-56.5 -183t-21 -169.5zM479 1274q0 29 10.5 60.5t30 60t54.5 47t79 18.5 q72 0 110 -44t38 -113q0 -74 -44.5 -123.5t-133.5 -49.5q-64 0 -104 42t-40 102zM561 1278q0 -76 70 -76q46 0 70 25t24 69q0 20 -1.5 32.5t-7.5 29.5t-21 26t-38 9q-49 0 -72.5 -35t-23.5 -80z" />
<glyph unicode="&#xe6;" horiz-adv-x="1331" d="M-16 254q0 93 34 160t97 105.5t142.5 56.5t180.5 18q57 0 107 -8q43 91 43 180q0 65 -31.5 105t-93.5 40q-84 0 -140 -24.5t-108 -71.5l-57 59q55 56 104 90.5t98 48.5t82.5 17.5t87.5 3.5q166 0 267 -82q121 90 276 90q66 0 111.5 -15.5t69 -45t33 -63.5t9.5 -78 q0 -110 -66.5 -206.5t-174.5 -154.5t-230 -65q-4 -46 -4 -66q0 -108 31 -148t92 -40q71 0 125.5 13t102 45.5t77 61.5t82.5 87h70q-48 -77 -99 -137.5t-120.5 -117.5t-157.5 -88.5t-188 -31.5q-246 0 -301 192q-49 -93 -114 -144.5t-177 -51.5q-49 0 -91.5 11.5t-82.5 39.5 t-63 83t-23 132zM272 289q0 -33 10.5 -55.5t28 -31.5t30.5 -12.5t26 -3.5q55 0 94.5 61.5t68.5 219.5q-12 2 -34 2q-100 0 -162 -49.5t-62 -130.5zM840 512q119 7 209 108.5t90 223.5q0 90 -49 90q-50 0 -101.5 -65.5t-88.5 -159.5t-60 -197z" />
<glyph unicode="&#xe7;" horiz-adv-x="786" d="M-27 313q0 54 8.5 115.5t28.5 133t49 138.5t74 130t99.5 109.5t130 74.5t161.5 28q125 0 176.5 -53t51.5 -135q0 -72 -31 -110.5t-78 -38.5q-35 0 -72 24q25 70 25 121q0 84 -57 84q-61 0 -124 -103.5t-101 -244t-38 -254.5q0 -100 35 -136t113 -36q77 0 144.5 29.5 t113 69.5t104.5 108h70q-181 -289 -410 -357l-57 -145q66 16 109 16q63 0 95 -27t32 -75q0 -104 -74.5 -164.5t-171.5 -60.5q-70 0 -117.5 14t-101.5 43q35 65 82 65q45 0 85.5 -27.5t65.5 -27.5q26 0 44 26.5t18 59.5q0 31 -20 52.5t-60 21.5q-49 0 -107 -25l84 236 q-20 -4 -59 -4q-151 0 -235.5 79t-84.5 246z" />
<glyph unicode="&#xe8;" horiz-adv-x="786" d="M-27 313q0 53 8.5 114.5t28 133t48.5 138.5t74 130t100.5 110t131 75t162.5 28q226 0 226 -196q0 -115 -66.5 -212.5t-174 -155t-230.5 -64.5q-5 -72 -5 -82q0 -100 35 -136t113 -36q77 0 144.5 29.5t113 69.5t104.5 108h70q-236 -379 -563 -379q-151 0 -235.5 79 t-84.5 246zM297 512q119 8 208 109.5t89 228.5q0 84 -51 84q-50 0 -100.5 -64t-87.5 -158.5t-58 -199.5zM354 1536h215l60 -387h-154z" />
<glyph unicode="&#xe9;" horiz-adv-x="786" d="M-27 313q0 53 8.5 114.5t28 133t48.5 138.5t74 130t100.5 110t131 75t162.5 28q226 0 226 -196q0 -115 -66.5 -212.5t-174 -155t-230.5 -64.5q-5 -72 -5 -82q0 -100 35 -136t113 -36q77 0 144.5 29.5t113 69.5t104.5 108h70q-236 -379 -563 -379q-151 0 -235.5 79 t-84.5 246zM297 512q119 8 208 109.5t89 228.5q0 84 -51 84q-50 0 -100.5 -64t-87.5 -158.5t-58 -199.5zM397 1149l187 387h215l-248 -387h-154z" />
<glyph unicode="&#xea;" horiz-adv-x="786" d="M-27 313q0 53 8.5 114.5t28 133t48.5 138.5t74 130t100.5 110t131 75t162.5 28q226 0 226 -196q0 -115 -66.5 -212.5t-174 -155t-230.5 -64.5q-5 -72 -5 -82q0 -100 35 -136t113 -36q77 0 144.5 29.5t113 69.5t104.5 108h70q-236 -379 -563 -379q-151 0 -235.5 79 t-84.5 246zM215 1149l434 387h43l123 -387h-65l-123 164l-322 -164h-90zM297 512q119 8 208 109.5t89 228.5q0 84 -51 84q-50 0 -100.5 -64t-87.5 -158.5t-58 -199.5z" />
<glyph unicode="&#xeb;" horiz-adv-x="786" d="M-27 313q0 53 8.5 114.5t28 133t48.5 138.5t74 130t100.5 110t131 75t162.5 28q226 0 226 -196q0 -115 -66.5 -212.5t-174 -155t-230.5 -64.5q-5 -72 -5 -82q0 -100 35 -136t113 -36q77 0 144.5 29.5t113 69.5t104.5 108h70q-236 -379 -563 -379q-151 0 -235.5 79 t-84.5 246zM244 1298q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88zM297 512q119 8 208 109.5t89 228.5q0 84 -51 84q-50 0 -100.5 -64t-87.5 -158.5t-58 -199.5zM612 1298q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88 t-88 -36q-53 0 -89 36t-36 88z" />
<glyph unicode="&#xec;" horiz-adv-x="546" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-8 -36 -8 -66q0 -42 19.5 -59t63.5 -17q59 0 110 51.5t75 129.5h86q-33 -95 -79 -167t-90.5 -111t-95.5 -63t-88.5 -31t-76.5 -7q-98 0 -158.5 61t-60.5 184zM135 1536h215l60 -387h-154z" />
<glyph unicode="&#xed;" horiz-adv-x="546" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-8 -36 -8 -66q0 -42 19.5 -59t63.5 -17q59 0 110 51.5t75 129.5h86q-33 -95 -79 -167t-90.5 -111t-95.5 -63t-88.5 -31t-76.5 -7q-98 0 -158.5 61t-60.5 184zM248 1149l186 387h215l-248 -387h-153z" />
<glyph unicode="&#xee;" horiz-adv-x="546" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-8 -36 -8 -66q0 -42 19.5 -59t63.5 -17q59 0 110 51.5t75 129.5h86q-33 -95 -79 -167t-90.5 -111t-95.5 -63t-88.5 -31t-76.5 -7q-98 0 -158.5 61t-60.5 184zM12 1149l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
<glyph unicode="&#xef;" horiz-adv-x="546" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-8 -36 -8 -66q0 -42 19.5 -59t63.5 -17q59 0 110 51.5t75 129.5h86q-33 -95 -79 -167t-90.5 -111t-95.5 -63t-88.5 -31t-76.5 -7q-98 0 -158.5 61t-60.5 184zM35 1298q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88 q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88zM403 1298q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88z" />
<glyph unicode="&#xf0;" horiz-adv-x="1101" d="M-2 317q0 71 14.5 149.5t42.5 159t73 153.5t101 130t132.5 91t162.5 34q84 0 125 -28.5t41 -75.5v-12l17 75q19 91 22 156h-158l17 82h141q-12 104 -86 203h92q79 -44 133 -90t86 -113h129l-16 -82h-86q12 -50 12 -109q0 -77 -22 -190l-111 -522q-8 -36 -8 -66 q0 -42 20 -59t64 -17q57 0 99 49.5t67 131.5h86q-33 -96 -77.5 -166t-85.5 -107.5t-90 -60t-84 -28t-75 -5.5q-84 0 -136.5 45.5t-64.5 132.5q-123 -190 -305 -190q-55 0 -101.5 17.5t-86 55t-62 103t-22.5 153.5zM301 346q0 -45 7.5 -77t17 -47.5t26 -24t26.5 -10t25 -1.5 q49 0 101 49t69 132l99 462q0 26 -19.5 52t-64.5 26q-62 0 -118 -60t-91.5 -148.5t-56.5 -183t-21 -169.5z" />
<glyph unicode="&#xf1;" d="M-78 0l217 1024h295l-22 -106q100 114 239 114q104 0 166 -56.5t62 -174.5q0 -89 -49.5 -283.5t-49.5 -245.5q0 -86 82 -86q61 0 96.5 43t75.5 138h86q-33 -97 -73.5 -168t-78.5 -110.5t-81.5 -63t-76.5 -30.5t-71 -7q-124 0 -182.5 66.5t-58.5 164.5q0 71 46 264t46 258 q0 105 -74 105q-52 0 -93.5 -53t-66.5 -136l-139 -657h-295zM180 1192q49 98 137 149.5t205 51.5q79 0 180.5 -34t157.5 -34q85 0 129 47l12 -2q-18 -75 -117 -140t-212 -65q-70 0 -180 38t-164 38q-79 0 -135 -53z" />
<glyph unicode="&#xf2;" horiz-adv-x="886" d="M-41 315q0 53 8.5 114.5t29 132.5t50 138.5t75.5 130t102 109t132.5 74.5t163.5 28q262 0 262 -327q8 -4 23 -4q66 0 154.5 36.5t160.5 86.5l19 -56q-58 -62 -153.5 -106.5t-209.5 -63.5q-24 -280 -160.5 -448t-328.5 -168q-152 0 -240 78t-88 245zM264 342 q0 -99 22.5 -132.5t82.5 -33.5q75 0 143.5 122.5t93.5 303.5q-55 13 -55 86q0 84 63 111q-3 65 -20.5 92t-56.5 27q-68 0 -133.5 -103t-102.5 -236.5t-37 -236.5zM367 1536h215l59 -387h-154z" />
<glyph unicode="&#xf3;" horiz-adv-x="886" d="M-41 315q0 53 8.5 114.5t29 132.5t50 138.5t75.5 130t102 109t132.5 74.5t163.5 28q262 0 262 -327q8 -4 23 -4q66 0 154.5 36.5t160.5 86.5l19 -56q-58 -62 -153.5 -106.5t-209.5 -63.5q-24 -280 -160.5 -448t-328.5 -168q-152 0 -240 78t-88 245zM264 342 q0 -99 22.5 -132.5t82.5 -33.5q75 0 143.5 122.5t93.5 303.5q-55 13 -55 86q0 84 63 111q-3 65 -20.5 92t-56.5 27q-68 0 -133.5 -103t-102.5 -236.5t-37 -236.5zM449 1149l186 387h215l-248 -387h-153z" />
<glyph unicode="&#xf4;" horiz-adv-x="886" d="M-41 315q0 53 8.5 114.5t29 132.5t50 138.5t75.5 130t102 109t132.5 74.5t163.5 28q262 0 262 -327q8 -4 23 -4q66 0 154.5 36.5t160.5 86.5l19 -56q-58 -62 -153.5 -106.5t-209.5 -63.5q-24 -280 -160.5 -448t-328.5 -168q-152 0 -240 78t-88 245zM195 1149l434 387h43 l123 -387h-66l-123 164l-321 -164h-90zM264 342q0 -99 22.5 -132.5t82.5 -33.5q75 0 143.5 122.5t93.5 303.5q-55 13 -55 86q0 84 63 111q-3 65 -20.5 92t-56.5 27q-68 0 -133.5 -103t-102.5 -236.5t-37 -236.5z" />
<glyph unicode="&#xf5;" horiz-adv-x="886" d="M-41 315q0 53 8.5 114.5t29 132.5t50 138.5t75.5 130t102 109t132.5 74.5t163.5 28q262 0 262 -327q8 -4 23 -4q66 0 154.5 36.5t160.5 86.5l19 -56q-58 -62 -153.5 -106.5t-209.5 -63.5q-24 -280 -160.5 -448t-328.5 -168q-152 0 -240 78t-88 245zM82 1192 q49 98 137 149.5t205 51.5q79 0 180.5 -34t157.5 -34q85 0 129 47l12 -2q-18 -75 -117.5 -140t-212.5 -65q-70 0 -180 38t-164 38q-79 0 -135 -53zM264 342q0 -99 22.5 -132.5t82.5 -33.5q75 0 143.5 122.5t93.5 303.5q-55 13 -55 86q0 84 63 111q-3 65 -20.5 92t-56.5 27 q-68 0 -133.5 -103t-102.5 -236.5t-37 -236.5z" />
<glyph unicode="&#xf6;" horiz-adv-x="886" d="M-41 315q0 53 8.5 114.5t29 132.5t50 138.5t75.5 130t102 109t132.5 74.5t163.5 28q262 0 262 -327q8 -4 23 -4q66 0 154.5 36.5t160.5 86.5l19 -56q-58 -62 -153.5 -106.5t-209.5 -63.5q-24 -280 -160.5 -448t-328.5 -168q-152 0 -240 78t-88 245zM215 1298 q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88zM264 342q0 -99 22.5 -132.5t82.5 -33.5q75 0 143.5 122.5t93.5 303.5q-55 13 -55 86q0 84 63 111q-3 65 -20.5 92t-56.5 27q-68 0 -133.5 -103t-102.5 -236.5t-37 -236.5zM584 1298 q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88z" />
<glyph unicode="&#xf7;" horiz-adv-x="966" d="M104 422l37 162h717l-35 -162h-719zM301 164q0 68 47.5 116t114.5 48t115.5 -48t48.5 -116q0 -67 -48 -114.5t-116 -47.5q-67 0 -114.5 47t-47.5 115zM424 850q0 68 47.5 116t114.5 48q68 0 116 -48t48 -116q0 -67 -48 -114.5t-116 -47.5t-115 47t-47 115z" />
<glyph unicode="&#xf8;" horiz-adv-x="876" d="M-29 315q0 52 8 112t27 130t47.5 136t72 128.5t97 109.5t127.5 76.5t158 32.5l41 199h106l-43 -209q170 -46 176 -299q70 3 156.5 41.5t147.5 81.5h65q-46 -66 -151 -131.5t-222 -95.5q-17 -251 -123.5 -417t-267.5 -206l-45 -215h-106l43 203q-145 3 -229.5 81 t-84.5 242zM276 342q0 -99 22.5 -132.5t82.5 -33.5q75 0 142.5 124.5t90.5 307.5q-57 15 -57 94q0 41 17.5 69.5t46.5 39.5q-4 58 -22.5 82.5t-55.5 24.5q-68 0 -132 -103t-99.5 -236t-35.5 -237z" />
<glyph unicode="&#xf9;" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-6 -30 -6 -58q0 -84 61 -84q109 0 164 181l139 657h295l-147 -696q-9 -40 -9 -66q0 -42 20 -59t64 -17q57 0 99 49.5t67 131.5h86q-133 -379 -411 -379q-88 0 -141 49.5t-62 144.5q-118 -194 -303 -194q-98 0 -158.5 61 t-60.5 184zM379 1536h215l59 -387h-153z" />
<glyph unicode="&#xfa;" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-6 -30 -6 -58q0 -84 61 -84q109 0 164 181l139 657h295l-147 -696q-9 -40 -9 -66q0 -42 20 -59t64 -17q57 0 99 49.5t67 131.5h86q-133 -379 -411 -379q-88 0 -141 49.5t-62 144.5q-118 -194 -303 -194q-98 0 -158.5 61 t-60.5 184zM489 1149l187 387h215l-248 -387h-154z" />
<glyph unicode="&#xfb;" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-6 -30 -6 -58q0 -84 61 -84q109 0 164 181l139 657h295l-147 -696q-9 -40 -9 -66q0 -42 20 -59t64 -17q57 0 99 49.5t67 131.5h86q-133 -379 -411 -379q-88 0 -141 49.5t-62 144.5q-118 -194 -303 -194q-98 0 -158.5 61 t-60.5 184zM258 1149l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
<glyph unicode="&#xfc;" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-6 -30 -6 -58q0 -84 61 -84q109 0 164 181l139 657h295l-147 -696q-9 -40 -9 -66q0 -42 20 -59t64 -17q57 0 99 49.5t67 131.5h86q-133 -379 -411 -379q-88 0 -141 49.5t-62 144.5q-118 -194 -303 -194q-98 0 -158.5 61 t-60.5 184zM279 1298q0 51 36 88t88 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -88.5 36t-35.5 88zM647 1298q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88z" />
<glyph unicode="&#xfd;" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-6 -24 -6 -52q0 -90 61 -90q54 0 94.5 45.5t65.5 122.5l143 670h295l-203 -950q98 35 157.5 99.5t100.5 193.5h86q-23 -78 -56.5 -140t-68.5 -101.5t-78.5 -69t-79.5 -45t-79 -27.5l-31 -148q-72 -348 -369 -348 q-99 0 -164 51.5t-65 147.5q0 203 334 305l25 110q-102 -114 -246 -114q-98 0 -158.5 61t-60.5 184zM203 -285q0 -24 19 -45.5t50 -21.5q34 0 67 47.5t52 134.5l12 59q-200 -75 -200 -174zM487 1149l187 387h215l-248 -387h-154z" />
<glyph unicode="&#xfe;" horiz-adv-x="968" d="M-188 -512l319 1505q25 116 25 191q0 132 -88 250h92q47 -26 79 -47.5t68.5 -56.5t58.5 -73t37 -94t15 -123q0 -51 -8 -100q105 94 247 94q114 0 182 -75.5t68 -247.5q0 -74 -10 -150t-32 -159.5t-61.5 -156t-93 -131t-132.5 -92.5t-175 -34q-138 0 -176 75l-106 -501z M260 217q16 -51 80 -51q61 0 112 39t82.5 99t53 136t30.5 145.5t9 131.5q0 170 -103 170q-36 0 -76.5 -28.5t-66.5 -78.5z" />
<glyph unicode="&#xff;" d="M-16 233q0 56 16 134l139 657h295l-147 -696q-6 -24 -6 -52q0 -90 61 -90q54 0 94.5 45.5t65.5 122.5l143 670h295l-203 -950q98 35 157.5 99.5t100.5 193.5h86q-23 -78 -56.5 -140t-68.5 -101.5t-78.5 -69t-79.5 -45t-79 -27.5l-31 -148q-72 -348 -369 -348 q-99 0 -164 51.5t-65 147.5q0 203 334 305l25 110q-102 -114 -246 -114q-98 0 -158.5 61t-60.5 184zM203 -285q0 -24 19 -45.5t50 -21.5q34 0 67 47.5t52 134.5l12 59q-200 -75 -200 -174zM252 1298q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36 q-53 0 -89 36t-36 88zM621 1298q0 51 36 88t88 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -88.5 36t-35.5 88z" />
<glyph unicode="&#x152;" horiz-adv-x="1732" d="M33 977q0 141 115 270.5t307 209t403 79.5q130 0 225 -39q109 39 265 39q35 0 152.5 -12.5t187.5 -12.5q105 0 184 25q-5 -14 -13.5 -45t-14.5 -50t-20.5 -46.5t-31.5 -45t-47 -34.5t-68 -25q-90 0 -232.5 34.5t-193.5 39.5q92 -131 92 -352q0 -66 -10 -154h273l-41 -151 h-260q-70 -301 -234 -490h498l-43 -217h-793q-86 -12 -145 -12q-171 0 -269 98.5t-98 312.5q0 85 16 186.5t45.5 210t78 209t107.5 180t139 127.5t169 48q55 0 107 -17q-89 -54 -174 -223.5t-135 -370.5t-50 -358q0 -110 29.5 -173.5t89.5 -63.5q100 0 201 145t164 362.5 t63 421.5q0 95 -11 157.5t-39.5 110.5t-80 69.5t-131.5 21.5q-118 0 -224.5 -37t-188 -103.5t-129.5 -167t-48 -219.5q0 -48 11 -79l10 -31q-207 0 -207 172z" />
<glyph unicode="&#x153;" horiz-adv-x="1357" d="M-14 324q0 183 44 324t119.5 226t170.5 127.5t204 42.5q182 0 230 -174q128 172 327 172q127 0 194.5 -53.5t67.5 -159.5q0 -89 -44 -166t-114.5 -127.5t-148.5 -82t-155 -41.5q-7 -58 -7 -88q0 -93 49 -135t119 -42q79 0 185.5 80.5t158.5 190.5h93 q-37 -66 -79.5 -124.5t-98.5 -113.5t-116 -94t-133.5 -62.5t-150.5 -23.5q-101 0 -171.5 48.5t-104.5 129.5q-66 -93 -151.5 -141.5t-174.5 -48.5q-166 0 -239.5 77.5t-73.5 258.5zM258 342q0 -87 35.5 -121.5t101.5 -34.5q45 0 83 33.5t64.5 90.5t44 125.5t27.5 146.5 q-42 0 -64 26.5t-22 65.5q0 46 25 87t65 56q-9 107 -86 107q-68 0 -123.5 -67t-86.5 -164t-47.5 -190t-16.5 -161zM897 510q90 1 165.5 48t116.5 117.5t42 143.5q0 27 -4.5 50t-22 44t-45.5 21q-54 0 -106.5 -68t-87.5 -159.5t-58 -196.5z" />
<glyph unicode="&#x178;" horiz-adv-x="1269" d="M12 1004q0 132 108 256.5t275 200t336 75.5q28 0 82 -4l178 -733l303 727h136l-398 -895l-135 -631h-328l136 631l-197 768q-144 -53 -224.5 -170.5t-80.5 -284.5q0 -46 6.5 -76t14 -44.5t7.5 -18.5q-110 0 -164.5 46t-54.5 153zM776 1810q0 51 36.5 88t88.5 37 q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88zM1145 1810q0 51 36.5 88t88.5 37q51 0 88 -37t37 -88q0 -52 -37 -88t-88 -36q-53 0 -89 36t-36 88z" />
<glyph unicode="&#x2c6;" horiz-adv-x="600" d="M0 1149l434 387h43l123 -387h-65l-123 164l-322 -164h-90z" />
<glyph unicode="&#x2dc;" horiz-adv-x="825" d="M78 1192q49 98 137 149.5t205 51.5q79 0 180.5 -34t157.5 -34q85 0 129 47l12 -2q-18 -75 -117.5 -140t-212.5 -65q-70 0 -180 38t-164 38q-79 0 -135 -53z" />
<glyph unicode="&#x2000;" horiz-adv-x="1024" />
<glyph unicode="&#x2001;" horiz-adv-x="2048" />
<glyph unicode="&#x2002;" horiz-adv-x="1024" />
<glyph unicode="&#x2003;" horiz-adv-x="2048" />
<glyph unicode="&#x2004;" horiz-adv-x="682" />
<glyph unicode="&#x2005;" horiz-adv-x="512" />
<glyph unicode="&#x2006;" horiz-adv-x="341" />
<glyph unicode="&#x2007;" horiz-adv-x="341" />
<glyph unicode="&#x2008;" horiz-adv-x="256" />
<glyph unicode="&#x2009;" horiz-adv-x="409" />
<glyph unicode="&#x200a;" horiz-adv-x="113" />
<glyph unicode="&#x2010;" horiz-adv-x="593" d="M39 455l37 161h409l-34 -161h-412z" />
<glyph unicode="&#x2011;" horiz-adv-x="593" d="M39 455l37 161h409l-34 -161h-412z" />
<glyph unicode="&#x2012;" horiz-adv-x="593" d="M39 455l37 161h409l-34 -161h-412z" />
<glyph unicode="&#x2013;" horiz-adv-x="720" d="M39 455l37 161h532l-35 -161h-534z" />
<glyph unicode="&#x2014;" horiz-adv-x="909" d="M39 455l37 161h717l-35 -161h-719z" />
<glyph unicode="&#x2018;" horiz-adv-x="624" d="M172 1397q0 60 34.5 97.5t96.5 37.5q63 0 106.5 -42t43.5 -101q0 -74 -91 -129q-24 -15 -24 -35l100 -144q0 -18 -18 -28q-115 73 -181.5 168t-66.5 176z" />
<glyph unicode="&#x2019;" horiz-adv-x="624" d="M172 1389q0 59 43.5 101t106.5 42q62 0 96.5 -37.5t34.5 -97.5q0 -81 -66.5 -176t-181.5 -168q-19 11 -19 28l101 144q0 19 -25 35q-90 55 -90 129z" />
<glyph unicode="&#x201a;" horiz-adv-x="579" d="M156 156q0 59 43 101t106 42q62 0 96.5 -37.5t34.5 -97.5q0 -81 -66.5 -176t-181.5 -168q-18 10 -18 28l100 144q0 20 -24 35q-90 55 -90 129z" />
<glyph unicode="&#x201c;" horiz-adv-x="1042" d="M156 1397q0 60 34.5 97.5t96.5 37.5q63 0 106 -42t43 -101q0 -74 -90 -129q-24 -15 -24 -35l100 -144q0 -17 -19 -28q-114 73 -180.5 167.5t-66.5 176.5zM606 1397q0 60 34.5 97.5t96.5 37.5q63 0 106.5 -42t43.5 -101q0 -74 -90 -129q-25 -16 -25 -35l100 -144 q0 -18 -18 -28q-115 73 -181.5 168t-66.5 176z" />
<glyph unicode="&#x201d;" horiz-adv-x="1042" d="M156 1389q0 59 43 101t106 42q62 0 96.5 -37.5t34.5 -97.5q0 -81 -66.5 -176t-181.5 -168q-18 10 -18 28l100 144q0 20 -24 35q-90 55 -90 129zM606 1389q0 59 43.5 101t106.5 42q62 0 96.5 -37.5t34.5 -97.5q0 -81 -66.5 -176t-181.5 -168q-18 10 -18 28l100 144 q0 19 -25 35q-90 55 -90 129z" />
<glyph unicode="&#x201e;" horiz-adv-x="1042" d="M156 156q0 59 43 101t106 42q62 0 96.5 -37.5t34.5 -97.5q0 -81 -66.5 -176t-181.5 -168q-18 10 -18 28l100 144q0 20 -24 35q-90 55 -90 129zM606 156q0 59 43.5 101t106.5 42q62 0 96.5 -37.5t34.5 -97.5q0 -81 -66.5 -176t-181.5 -168q-18 10 -18 28l100 144 q0 19 -25 35q-90 55 -90 129z" />
<glyph unicode="&#x2022;" horiz-adv-x="888" d="M246 547q0 82 57 140t139 58t140.5 -58t58.5 -140t-58.5 -139.5t-140.5 -57.5t-139 57.5t-57 139.5z" />
<glyph unicode="&#x2026;" horiz-adv-x="1437" d="M63 154q0 68 47.5 115.5t114.5 47.5q68 0 116 -48t48 -115t-48 -114.5t-116 -47.5q-67 0 -114.5 47t-47.5 115zM545 154q0 68 47.5 115.5t114.5 47.5t115 -47.5t48 -115.5q0 -67 -47.5 -114.5t-115.5 -47.5q-67 0 -114.5 47t-47.5 115zM1047 154q0 68 47 115.5t114 47.5 q68 0 116 -48t48 -115t-48 -114.5t-116 -47.5q-67 0 -114 47t-47 115z" />
<glyph unicode="&#x202f;" horiz-adv-x="409" />
<glyph unicode="&#x2039;" horiz-adv-x="735" d="M41 487l18 84l629 349l-20 -113l-494 -287l397 -237l-24 -117z" />
<glyph unicode="&#x203a;" horiz-adv-x="704" d="M31 166l28 117l492 237l-397 287l18 113l504 -349l-23 -110z" />
<glyph unicode="&#x205f;" horiz-adv-x="512" />
<glyph unicode="&#x20ac;" horiz-adv-x="1173" d="M-6 582l29 102h151q4 43 16 133h-145l29 103h137q24 103 59.5 190.5t90.5 167.5t124.5 136t165 89t207.5 33q59 0 110.5 -9t97 -30t78 -52.5t51.5 -78t19 -104.5q0 -87 -34.5 -138t-108.5 -51q-71 0 -117 53q35 10 62.5 67t27.5 101q0 14 -2 28.5t-10.5 37t-22.5 39 t-41.5 29t-64.5 12.5q-83 0 -158 -75t-126 -189t-84 -256h413l-28 -103h-406q-12 -66 -18 -133h401l-29 -102h-379v-27q0 -84 7 -143t24.5 -107t48.5 -76t78 -42.5t113 -14.5q119 0 186.5 17.5t128.5 64.5l4 -59q-88 -116 -198.5 -161.5t-264.5 -45.5q-67 0 -127 13.5 t-120.5 50t-103.5 93t-70 150.5t-27 215v72h-174z" />
<glyph unicode="&#x2122;" horiz-adv-x="776" d="M-47 1188q0 68 51.5 114t157.5 46q8 0 63.5 -5.5t89.5 -5.5q51 0 76 11q-13 -80 -51 -80q-19 0 -63.5 8t-57.5 10l-86 -399h-88l88 407q-58 -2 -90.5 -30t-32.5 -95q0 -17 8 -41q-65 0 -65 60zM305 887l139 430l84 12v-346l136 356h96l-78 -452h-88l55 319l-129 -319h-84 v268l-82 -268h-49z" />
<glyph unicode="&#xe000;" horiz-adv-x="1136" d="M0 0v1137h1137v-1137h-1137z" />
</font> </font>
</defs></svg> </defs></svg>

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,76 @@
{
"name": "icons",
"css_prefix_text": "icon-",
"css_use_suffix": false,
"hinting": true,
"units_per_em": 1000,
"ascent": 850,
"glyphs": [
{
"uid": "48cc210e59ff4bc56b6c8fba6eb384b8",
"css": "emo-coffee",
"code": 59401,
"src": "fontelico"
},
{
"uid": "078fec38562c3f83a1201a908040c141",
"css": "emo-sunglasses",
"code": 59402,
"src": "fontelico"
},
{
"uid": "04688d76a33ce7a7950e40fae79c08ac",
"css": "emo-cry",
"code": 59400,
"src": "fontelico"
},
{
"uid": "9dd9e835aebe1060ba7190ad2b2ed951",
"css": "search",
"code": 59394,
"src": "fontawesome"
},
{
"uid": "b1887b423d2fd15c345e090320c91ca0",
"css": "thumbs",
"code": 59397,
"src": "fontawesome"
},
{
"uid": "f805bb95d40c7ef2bc51b3d50d4f2e5c",
"css": "list",
"code": 59398,
"src": "fontawesome"
},
{
"uid": "e99461abfef3923546da8d745372c995",
"css": "settings",
"code": 59393,
"src": "fontawesome"
},
{
"uid": "4109c474ff99cad28fd5a2c38af2ec6f",
"css": "filter",
"code": 59396,
"src": "fontawesome"
},
{
"uid": "c311c48d79488965b0fab7f9cd12b6b5",
"css": "left-arrow",
"code": 59392,
"src": "entypo"
},
{
"uid": "d10920db2e79c997c5e783279291970c",
"css": "dots",
"code": 59395,
"src": "entypo"
},
{
"uid": "51fb22f9ff9d7f60c95ef31e4c59502d",
"css": "notifications",
"code": 59399,
"src": "mfglabs"
}
]
}

Binary file not shown.

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Copyright (C) 2014 by original authors @ fontello.com</metadata>
<defs>
<font id="icons" horiz-adv-x="1000" >
<font-face font-family="icons" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
<missing-glyph horiz-adv-x="1000" />
<glyph glyph-name="left-arrow" unicode="&#xe800;" d="m242 626q14 16 39 16t41-16q38-36 0-80l-186-196 186-194q38-44 0-80-16-16-40-16t-40 16l-226 236q-16 16-16 38 0 24 16 40 206 214 226 236z" horiz-adv-x="341" />
<glyph glyph-name="settings" unicode="&#xe801;" d="m571 350q0 59-41 101t-101 42-101-42-42-101 42-101 101-42 101 42 41 101z m286 61v-124q0-7-4-13t-11-7l-104-16q-10-30-21-51 19-27 59-77 6-6 6-13t-5-13q-15-21-55-61t-53-39q-7 0-14 5l-77 60q-25-13-51-21-9-76-16-104-4-16-20-16h-124q-8 0-14 5t-6 12l-16 103q-27 9-50 21l-79-60q-6-5-14-5-8 0-14 6-70 64-92 94-4 5-4 13 0 6 5 12 8 12 28 37t30 40q-15 28-23 55l-102 15q-7 1-11 7t-5 13v124q0 7 5 13t10 7l104 16q8 25 22 51-23 32-60 77-6 7-6 14 0 5 5 12 15 20 55 60t53 40q7 0 15-5l77-60q24 13 50 21 9 76 17 104 3 15 20 15h124q7 0 13-4t7-12l15-103q28-9 50-21l80 60q5 5 13 5 7 0 14-5 72-67 92-95 4-5 4-13 0-6-4-12-9-12-29-38t-30-39q14-28 23-55l102-15q7-1 12-7t4-13z" horiz-adv-x="857.1" />
<glyph glyph-name="search" unicode="&#xe802;" d="m643 386q0 103-74 176t-176 74-177-74-73-176 73-177 177-73 176 73 74 177z m286-465q0-29-22-50t-50-21q-30 0-50 21l-191 191q-100-69-223-69-80 0-153 31t-125 84-84 125-31 153 31 152 84 126 125 84 153 31 152-31 126-84 84-126 31-152q0-123-69-223l191-191q21-21 21-51z" horiz-adv-x="928.6" />
<glyph glyph-name="dots" unicode="&#xe803;" d="m110 460q46 0 78-32t32-78q0-44-32-77t-78-33-78 33-32 77q0 46 32 78t78 32z m350 0q46 0 78-32t32-78q0-44-33-77t-77-33-77 33-33 77q0 46 32 78t78 32z m350 0q46 0 78-32t32-78q0-44-32-77t-78-33-78 33-32 77q0 46 32 78t78 32z" horiz-adv-x="920" />
<glyph glyph-name="filter" unicode="&#xe804;" d="m783 685q9-23-8-39l-275-275v-414q0-23-22-33-7-3-14-3-15 0-25 11l-143 143q-10 10-10 25v271l-275 275q-18 16-8 39 9 22 33 22h714q23 0 33-22z" horiz-adv-x="785.7" />
<glyph glyph-name="thumbs" unicode="&#xe805;" d="m286 154v-108q0-22-16-37t-38-16h-178q-23 0-38 16t-16 37v108q0 22 16 38t38 15h178q22 0 38-15t16-38z m0 285v-107q0-22-16-38t-38-15h-178q-23 0-38 15t-16 38v107q0 23 16 38t38 16h178q22 0 38-16t16-38z m357-285v-108q0-22-16-37t-38-16h-178q-23 0-38 16t-16 37v108q0 22 16 38t38 15h178q23 0 38-15t16-38z m-357 571v-107q0-22-16-38t-38-16h-178q-23 0-38 16t-16 38v107q0 22 16 38t38 16h178q22 0 38-16t16-38z m357-286v-107q0-22-16-38t-38-15h-178q-23 0-38 15t-16 38v107q0 23 16 38t38 16h178q23 0 38-16t16-38z m357-285v-108q0-22-16-37t-38-16h-178q-22 0-38 16t-16 37v108q0 22 16 38t38 15h178q23 0 38-15t16-38z m-357 571v-107q0-22-16-38t-38-16h-178q-23 0-38 16t-16 38v107q0 22 16 38t38 16h178q23 0 38-16t16-38z m357-286v-107q0-22-16-38t-38-15h-178q-22 0-38 15t-16 38v107q0 23 16 38t38 16h178q23 0 38-16t16-38z m0 286v-107q0-22-16-38t-38-16h-178q-22 0-38 16t-16 38v107q0 22 16 38t38 16h178q23 0 38-16t16-38z" horiz-adv-x="1000" />
<glyph glyph-name="list" unicode="&#xe806;" d="m286 154v-108q0-22-16-37t-38-16h-178q-23 0-38 16t-16 37v108q0 22 16 38t38 15h178q22 0 38-15t16-38z m0 285v-107q0-22-16-38t-38-15h-178q-23 0-38 15t-16 38v107q0 23 16 38t38 16h178q22 0 38-16t16-38z m714-285v-108q0-22-16-37t-38-16h-535q-23 0-38 16t-16 37v108q0 22 16 38t38 15h535q23 0 38-15t16-38z m-714 571v-107q0-22-16-38t-38-16h-178q-23 0-38 16t-16 38v107q0 22 16 38t38 16h178q22 0 38-16t16-38z m714-286v-107q0-22-16-38t-38-15h-535q-23 0-38 15t-16 38v107q0 23 16 38t38 16h535q23 0 38-16t16-38z m0 286v-107q0-22-16-38t-38-16h-535q-23 0-38 16t-16 38v107q0 22 16 38t38 16h535q23 0 38-16t16-38z" horiz-adv-x="1000" />
<glyph glyph-name="notifications" unicode="&#xe807;" d="m0 404q0 67 27 130t75 114 114 89 145 59 166 21 166-21 146-59 113-89 76-114 26-130q0-84-42-160t-112-131-168-88-205-33q-105 0-201 31l-121-85q-67-42-94-24t-12 100l25 125q-60 55-92 122t-32 143z" horiz-adv-x="1054.7" />
<glyph glyph-name="emo-cry" unicode="&#xe808;" d="m278 787c-7 0-15-2-23-5l-128-62-80-38c-2-1-4-2-6-3-1-5-1-11-1-16l0 0 0-1 0 0c0-69 40-162 122-163l0 0 0 0 0 0c34 1 65 19 87 50 26 35 37 82 34 128l18 8c27 13 38 45 25 71-9 19-28 31-48 31z m212 0c-20 0-39-11-48-30-13-27-1-59 25-71l18-9c-3-46 9-93 34-128 22-31 53-49 87-49l0 0 1 0 0 0c82 0 121 93 122 162l0 0 0 1 0 0c0 5-1 11-1 16-2 1-5 2-7 3l-80 38-128 62c-7 3-15 5-23 5z m279-302c-7 0-15-5-21-16-42-72-96-259 27-259 123 1 73 182 16 261-6 8-14 13-22 14z m-512-138c-57 0-112-9-166-26-10-4-20-7-30-11-11-5-21-9-30-13l0 0-1-1 0 0c-26-12-37-44-25-70 13-26 44-38 70-25l0-1c9 5 17 8 24 11 9 3 17 6 25 9 43 14 88 21 133 21 51 0 101-9 148-27 19-7 37-15 55-24 91-49 163-130 200-232 10-27 40-41 68-31 27 10 42 40 32 68-46 126-137 227-250 288-22 12-45 22-69 31-57 21-120 33-184 33z" horiz-adv-x="851" />
<glyph glyph-name="emo-coffee" unicode="&#xe809;" d="m1234 850c-17 0-34-8-44-23-54-80-24-144 4-204 13-29 26-56 5-72-23-17-28-51-10-74 17-23 51-28 74-10 89 67 60 131 27 201-15 33-32 70-12 99 16 25 10 57-14 74-9 6-20 9-30 9z m-1021-121c-81 0-157-39-203-105-18-25-12-59 14-77 24-17 59-11 76 14 45 63 132 76 193 32l0 0c3-2 7-6 11-9l1-1 1-1c3-3 7-7 10-10l1-2 0 0 0 0 1-1 1 0c20-23 55-25 78-4 22 20 24 55 4 77-46 55-116 87-188 87z m499 0c-80 0-156-39-202-105-18-25-12-59 13-77 25-17 59-11 77 14 44 63 131 76 192 32l0 0c4-2 8-6 12-9l0-1 1-1c4-3 7-7 11-10l1-2 0 0 0 0 1-1 0 0c20-23 55-25 78-4 23 20 25 55 4 77-46 55-116 87-188 87z m206-346c-24 0-44-19-44-43l1-4-1-275 0 0 0 0 0 0c0-58 24-111 62-149l0 0 0 0 0 0c38-38 91-62 148-62l0 0 226 0c1 0 3 0 5 0 13 1 27 2 39 5 15 4 29 8 42 14 55 26 97 74 114 133l31 0 0 0c37 0 70 15 94 39 23 23 38 56 38 92l0 0 0 0 0 119 0 0c0 36-15 69-39 93l0 0c-23 23-56 38-92 38l0 0 0 0-624 0z m604-100c11 0 21-5 28-12l1 0 0 0c7-8 12-18 12-29l0 0 0-110 0 0c0-11-5-21-12-29-8-7-18-12-29-12l0 0-62 0 0 0c-21 0-39-16-40-37-4-41-31-76-67-93-7-3-15-6-22-8-7-1-14-2-21-2l-3 0-209 0 0-1c-30 1-59 13-79 34l-1 0c-21 21-34 50-34 81l0 0 0 0 0 0 1 218 537 0 0 0z m-82-55l0-96 32 0c22 0 39 17 39 38l0 20c0 21-17 38-39 38l-32 0z m-1131-12c-30 0-55-25-55-55s25-55 55-55l297 0c30 0 54 25 54 55s-24 55-54 55l-297 0z" horiz-adv-x="1673" />
<glyph glyph-name="emo-sunglasses" unicode="&#xe80a;" d="m495 745c-154 0-309 0-463 0-18 0-32-15-32-33 3-153 129-306 278-309 84-2 164 36 218 95 55-59 135-97 219-95 149 3 272 156 275 309 0 18-14 33-32 33-155 0-309 0-463 0z m319-510c-18 0-35-9-45-25l0 0c0-1-1-2-1-3-7-12-15-23-24-34-10-12-19-23-29-32-54-51-126-80-203-80l0 0 0 0c-21 0-43 2-64 7-3 0-6 1-10 2-17 5-34 11-51 19-26 12-58 1-70-26-13-27-1-58 25-71 22-10 45-18 69-24 5-1 9-2 14-4 29-6 58-9 87-9l0 0 0 0c104 0 201 39 275 108 15 14 28 29 40 43 11 15 22 31 32 48 0 0 1 1 1 1 15 25 7 58-18 73-9 5-18 7-28 7z" horiz-adv-x="990" />
</font>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Binary file not shown.

View File

@@ -14,16 +14,16 @@ var ApiClass = new Class({
'callbackKey': 'callback_func', 'callbackKey': 'callback_func',
'method': 'get', 'method': 'get',
'url': self.createUrl(type, {'t': randomString()}) 'url': self.createUrl(type, {'t': randomString()})
}, options)).send() }, options)).send();
}, },
createUrl: function(action, params){ createUrl: function(action, params){
return this.options.url + (action || 'default') + '/' + (params ? '?'+Object.toQueryString(params) : '') return this.options.url + (action || 'default') + '/' + (params ? '?'+Object.toQueryString(params) : '');
}, },
getOption: function(name){ getOption: function(name){
return this.options[name] return this.options[name];
} }
}); });
window.Api = new ApiClass(); window.Api = new ApiClass();

View File

@@ -19,7 +19,7 @@ var BlockBase = new Class({
}, },
getParent: function(){ getParent: function(){
return this.page return this.page;
}, },
hide: function(){ hide: function(){
@@ -31,9 +31,7 @@ var BlockBase = new Class({
}, },
toElement: function(){ toElement: function(){
return this.el return this.el;
} }
}); });
var Block = BlockBase;

View File

@@ -1,4 +1,4 @@
Block.Footer = new Class({ var BlockFooter = new Class({
Extends: BlockBase, Extends: BlockBase,
@@ -8,4 +8,4 @@ Block.Footer = new Class({
self.el = new Element('div.footer'); self.el = new Element('div.footer');
} }
}); });

View File

@@ -0,0 +1,66 @@
var BlockHeader = new Class({
Extends: BlockNavigation,
create: function(){
var self = this;
self.parent();
self.el.adopt(
self.foldout = new Element('a.foldout.icon2.menu', {
'events': {
'click': self.toggleMenu.bind(self)
}
}).grab(new Element('span.overlay')),
self.logo = new Element('a.logo', {
'html': '<span>Couch</span><span>Potato</span>',
'href': App.createUrl('')
}),
self.nav
);
new ScrollSpy({
min: 400,
onLeave: function(){
self.backtotop.fade('out');
},
onEnter: function(){
self.backtotop.fade('in');
}
});
self.nav.addEvents({
'click:relay(a)': function(){
if($(document.body).getParent().hasClass('menu_shown'))
self.toggleMenu();
}
});
},
toggleMenu: function(){
var self = this,
body = $(document.body),
html = body.getParent();
// Copy over settings menu
if(!self.added){
new Element('li.separator').inject(self.nav);
body.getElements('.header .more_menu.menu li a, .header .more_menu.menu li span.separator').each(function(el, nr){
if(nr <= 2) return;
if(el.get('tag') == 'a')
self.nav.grab(new Element('li').grab(el.clone().cloneEvents(el)));
else
self.nav.grab(new Element('li.separator'));
});
self.added = true;
}
html.toggleClass('menu_shown');
}
});

View File

@@ -1,4 +1,4 @@
Block.Menu = new Class({ var BlockMenu = new Class({
Extends: BlockBase, Extends: BlockBase,
@@ -15,7 +15,8 @@ Block.Menu = new Class({
self.wrapper = new Element('div.wrapper').adopt( self.wrapper = new Element('div.wrapper').adopt(
self.more_option_ul = new Element('ul') self.more_option_ul = new Element('ul')
), ),
self.button = new Element('a.button' + (self.options.button_class ? '.' + self.options.button_class : ''), { self.button = new Element('a' + (self.options.button_class ? '.' + self.options.button_class : ''), {
'text': self.options.button_text || '',
'events': { 'events': {
'click': function(){ 'click': function(){
self.el.toggleClass('show'); self.el.toggleClass('show');
@@ -25,16 +26,15 @@ Block.Menu = new Class({
self.el.addEvent('outerClick', self.removeOuterClick.bind(self)); self.el.addEvent('outerClick', self.removeOuterClick.bind(self));
this.addEvent('outerClick', function(e){ this.addEvent('outerClick', function(e){
if(e.target.get('tag') != 'input') if(e.target.get('tag') != 'input')
self.removeOuterClick() self.removeOuterClick();
}) });
} }
else else
self.removeOuterClick() self.removeOuterClick();
} }
} }
}) })
) );
}, },
@@ -52,4 +52,4 @@ Block.Menu = new Class({
return new Element('li').adopt(tab).inject(self.more_option_ul, position || 'bottom'); return new Element('li').adopt(tab).inject(self.more_option_ul, position || 'bottom');
} }
}); });

View File

@@ -1,51 +1,14 @@
Block.Navigation = new Class({ var BlockNavigation = new Class({
Extends: BlockBase, Extends: BlockBase,
create: function(){ create: function(){
var self = this; var self = this;
self.el = new Element('div.navigation').adopt( self.el = new Element('div.navigation').grab(
self.foldout = new Element('a.foldout.icon2.menu', { self.nav = new Element('ul')
'events': {
'click': self.toggleMenu.bind(self)
}
}).grab(new Element('span.overlay')),
self.logo = new Element('a.logo', {
'text': 'CouchPotato',
'href': App.createUrl('')
}),
self.nav = new Element('ul'),
self.backtotop = new Element('a.backtotop', {
'text': 'back to top',
'events': {
'click': function(){
window.scroll(0,0)
}
},
'tween': {
'duration': 100
}
})
); );
new ScrollSpy({
min: 400,
onLeave: function(){
self.backtotop.fade('out')
},
onEnter: function(){
self.backtotop.fade('in')
}
});
self.nav.addEvents({
'click:relay(a)': function(){
if($(document.body).getParent().hasClass('menu_shown'))
self.toggleMenu();
}
})
}, },
addTab: function(name, tab){ addTab: function(name, tab){
@@ -53,31 +16,7 @@ Block.Navigation = new Class({
return new Element('li.tab_'+(name || 'unknown')).grab( return new Element('li.tab_'+(name || 'unknown')).grab(
new Element('a', tab) new Element('a', tab)
).inject(self.nav) ).inject(self.nav);
},
toggleMenu: function(){
var self = this,
body = $(document.body),
html = body.getParent();
// Copy over settings menu
if(!self.added){
new Element('li.separator').inject(self.nav);
body.getElements('.header .more_menu.menu li a, .header .more_menu.menu li span.separator').each(function(el, nr){
if(nr <= 2) return;
if(el.get('tag') == 'a')
self.nav.grab(new Element('li').grab(el.clone().cloneEvents(el)));
else
self.nav.grab(new Element('li.separator'));
});
self.added = true;
}
html.toggleClass('menu_shown');
}, },
@@ -89,4 +28,4 @@ Block.Navigation = new Class({
} }
}); });

View File

@@ -23,8 +23,6 @@
self.c = $(document.body); self.c = $(document.body);
self.route = new Route(self.defaults);
self.createLayout(); self.createLayout();
self.createPages(); self.createPages();
@@ -49,7 +47,7 @@
return this.options[name]; return this.options[name];
} }
catch(e){ catch(e){
return null return null;
} }
}, },
@@ -69,24 +67,24 @@
}, },
isMac: function(){ isMac: function(){
return Browser.platform == 'mac' return Browser.platform == 'mac';
}, },
createLayout: function(){ createLayout: function(){
var self = this; var self = this;
self.block.header = new Block(); self.block.header = new BlockBase();
self.c.adopt( self.c.adopt(
$(self.block.header).addClass('header').adopt( $(self.block.header).addClass('header').adopt(
new Element('div').adopt( self.block.navigation = new BlockHeader(self, {}),
self.block.navigation = new Block.Navigation(self, {}), self.block.search = new BlockSearch(self, {}),
self.block.search = new Block.Search(self, {}), self.block.more = new BlockMenu(self, {'button_class': 'icon-settings'})
self.block.more = new Block.Menu(self, {'button_class': 'icon2.cog'})
)
), ),
self.content = new Element('div.content'), self.content = new Element('div.content').adopt(
self.block.footer = new Block.Footer(self, {}) self.pages_container = new Element('div.pages'),
self.block.footer = new BlockFooter(self, {})
)
); );
var setting_links = [ var setting_links = [
@@ -125,19 +123,19 @@
]; ];
setting_links.each(function(a){ setting_links.each(function(a){
self.block.more.addLink(a) self.block.more.addLink(a);
}); });
new ScrollSpy({ new ScrollSpy({
min: 10, min: 10,
onLeave: function(){ onLeave: function(){
$(self.block.header).removeClass('with_shadow') $(self.block.header).removeClass('with_shadow');
}, },
onEnter: function(){ onEnter: function(){
$(self.block.header).addClass('with_shadow') $(self.block.header).addClass('with_shadow');
} }
}) });
}, },
createPages: function(){ createPages: function(){
@@ -145,7 +143,9 @@
var pages = []; var pages = [];
Object.each(Page, function(page_class, class_name){ Object.each(Page, function(page_class, class_name){
var pg = new Page[class_name](self, {}); var pg = new Page[class_name](self, {
'level': 1
});
self.pages[class_name] = pg; self.pages[class_name] = pg;
pages.include({ pages.include({
@@ -158,28 +158,29 @@
pages.stableSort(self.sortPageByOrder).each(function(page){ pages.stableSort(self.sortPageByOrder).each(function(page){
page['class'].load(); page['class'].load();
self.fireEvent('load'+page.name); self.fireEvent('load'+page.name);
$(page['class']).inject(self.content); $(page['class']).inject(self.getPageContainer());
}); });
delete pages;
self.fireEvent('load'); self.fireEvent('load');
}, },
sortPageByOrder: function(a, b){ sortPageByOrder: function(a, b){
return (a.order || 100) - (b.order || 100) return (a.order || 100) - (b.order || 100);
}, },
openPage: function(url) { openPage: function(url) {
var self = this; var self = this,
route = new Route(self.defaults);
self.route.parse(); route.parse(rep(History.getPath()));
var page_name = self.route.getPage().capitalize();
var action = self.route.getAction(); var page_name = route.getPage().capitalize(),
var params = self.route.getParams(); action = route.getAction(),
params = route.getParams(),
current_url = route.getCurrentUrl(),
page;
var current_url = self.route.getCurrentUrl();
if(current_url == self.current_url) if(current_url == self.current_url)
return; return;
@@ -187,12 +188,12 @@
self.current_page.hide(); self.current_page.hide();
try { try {
var page = self.pages[page_name] || self.pages.Home; page = self.pages[page_name] || self.pages.Home;
page.open(action, params, current_url); page.open(action, params, current_url);
page.show(); page.show();
} }
catch(e){ catch(e){
console.error("Can't open page:" + url, e) console.error("Can't open page:" + url, e);
} }
self.current_page = page; self.current_page = page;
@@ -201,11 +202,15 @@
}, },
getBlock: function(block_name){ getBlock: function(block_name){
return this.block[block_name] return this.block[block_name];
}, },
getPage: function(name){ getPage: function(name){
return this.pages[name] return this.pages[name];
},
getPageContainer: function(){
return this.pages_container;
}, },
shutdown: function(){ shutdown: function(){
@@ -281,7 +286,7 @@
var onFailure = function(){ var onFailure = function(){
self.checkAvailable.delay(1000, self, [delay, onAvailable]); self.checkAvailable.delay(1000, self, [delay, onAvailable]);
self.fireEvent('unload'); self.fireEvent('unload');
} };
var request = Api.request('app.available', { var request = Api.request('app.available', {
'timeout': 2000, 'timeout': 2000,
@@ -298,7 +303,7 @@
} }
}); });
}).delay(delay || 0) }).delay(delay || 0);
}, },
blockPage: function(message, title){ blockPage: function(message, title){
@@ -322,12 +327,12 @@
var self = this; var self = this;
if(self.mask) if(self.mask)
self.mask.get('tween').start('opacity', 0).chain(function(){ self.mask.get('tween').start('opacity', 0).chain(function(){
this.element.destroy() this.element.destroy();
}); });
}, },
createUrl: function(action, params){ createUrl: function(action, params){
return this.options.base_url + (action ? action+'/' : '') + (params ? '?'+Object.toQueryString(params) : '') return this.options.base_url + (action ? action+'/' : '') + (params ? '?'+Object.toQueryString(params) : '');
}, },
openDerefered: function(e, el){ openDerefered: function(e, el){
@@ -364,7 +369,7 @@
'events': { 'events': {
'click': function(e){ 'click': function(e){
(e).stop(); (e).stop();
alert('Drag it to your bookmark ;)') alert('Drag it to your bookmark ;)');
} }
} }
}), }),
@@ -399,22 +404,14 @@
} }
// Create parallel callback // Create parallel callback
var callbacks = [];
self.global_events[name].each(function(handle){ self.global_events[name].each(function(handle){
callbacks.push(function(callback){ setTimeout(function(){
var results = handle.apply(handle, args || []); var results = handle.apply(handle, args || []);
callback(null, results || null);
});
}); if(on_complete)
on_complete(results);
// Fire events }, 0);
async.parallel(callbacks, function(err, results){
if(err) p(err);
if(on_complete)
on_complete(results);
}); });
}, },
@@ -440,77 +437,72 @@ window.App = new CouchPotato();
var Route = new Class({ var Route = new Class({
defaults: {}, defaults: null,
page: '', page: '',
action: 'index', action: 'index',
params: {}, params: {},
initialize: function(defaults){ initialize: function(defaults){
var self = this; var self = this;
self.defaults = defaults self.defaults = defaults || {};
}, },
parse: function(){ parse: function(path){
var self = this; var self = this;
var rep = function (pa) {
return pa.replace(Api.getOption('url'), '/').replace(App.getOption('base_url'), '/')
};
var path = rep(History.getPath());
if(path == '/' && location.hash){ if(path == '/' && location.hash){
path = rep(location.hash.replace('#', '/')) path = rep(location.hash.replace('#', '/'));
} }
self.current = path.replace(/^\/+|\/+$/g, ''); self.current = path.replace(/^\/+|\/+$/g, '');
var url = self.current.split('/'); var url = self.current.split('/');
self.page = (url.length > 0) ? url.shift() : self.defaults.page; self.page = (url.length > 0) ? url.shift() : self.defaults.page;
self.action = (url.length > 0) ? url.shift() : self.defaults.action; self.action = (url.length > 0) ? url.join('/') : self.defaults.action;
self.params = Object.merge({}, self.defaults.params); self.params = Object.merge({}, self.defaults.params);
if(url.length > 1){ if(url.length > 1){
var key; var key;
url.each(function(el, nr){ url.each(function(el, nr){
if(nr%2 == 0) if(nr%2 === 0)
key = el; key = el;
else if(key) { else if(key) {
self.params[key] = el; self.params[key] = el;
key = null key = null;
} }
}) });
} }
else if(url.length == 1){ else if(url.length == 1){
self.params[url] = true; self.params[url] = true;
} }
return self return self;
}, },
getPage: function(){ getPage: function(){
return this.page return this.page;
}, },
getAction: function(){ getAction: function(){
return this.action return this.action;
}, },
getParams: function(){ getParams: function(){
return this.params return this.params;
}, },
getCurrentUrl: function(){ getCurrentUrl: function(){
return this.current return this.current;
}, },
get: function(param){ get: function(param){
return this.params[param] return this.params[param];
} }
}); });
var p = function(){ var p = function(){
if(typeof(console) !== 'undefined' && console != null) if(typeof(console) !== 'undefined' && console !== null)
console.log(arguments) console.log(arguments);
}; };
@@ -553,14 +545,14 @@ var p = function(){
function randomString(length, extra) { function randomString(length, extra) {
var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz" + (extra ? '-._!@#$%^&*()+=' : ''); var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz" + (extra ? '-._!@#$%^&*()+=' : ''),
var stringLength = length || 8; string_length = length || 8,
var randomString = ''; random_string = '';
for (var i = 0; i < stringLength; i++) { for (var i = 0; i < string_length; i++) {
var rnum = Math.floor(Math.random() * chars.length); var rnum = Math.floor(Math.random() * chars.length);
randomString += chars.charAt(rnum); random_string += chars.charAt(rnum);
} }
return randomString; return random_string;
} }
(function(){ (function(){
@@ -576,7 +568,7 @@ function randomString(length, extra) {
var valueOf = function(object, path) { var valueOf = function(object, path) {
var ptr = object; var ptr = object;
path.each(function(key) { ptr = ptr[key] }); path.each(function(key) { ptr = ptr[key]; });
return ptr; return ptr;
}; };
@@ -606,22 +598,12 @@ function randomString(length, extra) {
})(); })();
var createSpinner = function(target, options){ var createSpinner = function(container){
var opts = Object.merge({ var spinner = new Element('div.spinner');
lines: 12, container.grab(spinner);
length: 5, return spinner;
width: 4, };
radius: 9,
color: '#fff', var rep = function (pa) {
speed: 1.9, return pa.replace(Api.getOption('url'), '/').replace(App.getOption('base_url'), '/');
trail: 53,
shadow: false,
hwaccel: true,
className: 'spinner',
zIndex: 2e9,
top: 'auto',
left: 'auto'
}, options);
return new Spinner(opts).spin(target);
}; };

View File

@@ -1,955 +0,0 @@
/*global setImmediate: false, setTimeout: false, console: false */
(function () {
var async = {};
// global on the server, window in the browser
var root, previous_async;
root = this;
if (root != null) {
previous_async = root.async;
}
async.noConflict = function () {
root.async = previous_async;
return async;
};
function only_once(fn) {
var called = false;
return function() {
if (called) throw new Error("Callback was already called.");
called = true;
fn.apply(root, arguments);
}
}
//// cross-browser compatiblity functions ////
var _each = function (arr, iterator) {
if (arr.forEach) {
return arr.forEach(iterator);
}
for (var i = 0; i < arr.length; i += 1) {
iterator(arr[i], i, arr);
}
};
var _map = function (arr, iterator) {
if (arr.map) {
return arr.map(iterator);
}
var results = [];
_each(arr, function (x, i, a) {
results.push(iterator(x, i, a));
});
return results;
};
var _reduce = function (arr, iterator, memo) {
if (arr.reduce) {
return arr.reduce(iterator, memo);
}
_each(arr, function (x, i, a) {
memo = iterator(memo, x, i, a);
});
return memo;
};
var _keys = function (obj) {
if (Object.keys) {
return Object.keys(obj);
}
var keys = [];
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
keys.push(k);
}
}
return keys;
};
//// exported async module functions ////
//// nextTick implementation with browser-compatible fallback ////
if (typeof process === 'undefined' || !(process.nextTick)) {
if (typeof setImmediate === 'function') {
async.nextTick = function (fn) {
// not a direct alias for IE10 compatibility
setImmediate(fn);
};
async.setImmediate = async.nextTick;
}
else {
async.nextTick = function (fn) {
setTimeout(fn, 0);
};
async.setImmediate = async.nextTick;
}
}
else {
async.nextTick = process.nextTick;
if (typeof setImmediate !== 'undefined') {
async.setImmediate = setImmediate;
}
else {
async.setImmediate = async.nextTick;
}
}
async.each = function (arr, iterator, callback) {
callback = callback || function () {};
if (!arr.length) {
return callback();
}
var completed = 0;
_each(arr, function (x) {
iterator(x, only_once(function (err) {
if (err) {
callback(err);
callback = function () {};
}
else {
completed += 1;
if (completed >= arr.length) {
callback(null);
}
}
}));
});
};
async.forEach = async.each;
async.eachSeries = function (arr, iterator, callback) {
callback = callback || function () {};
if (!arr.length) {
return callback();
}
var completed = 0;
var iterate = function () {
iterator(arr[completed], function (err) {
if (err) {
callback(err);
callback = function () {};
}
else {
completed += 1;
if (completed >= arr.length) {
callback(null);
}
else {
iterate();
}
}
});
};
iterate();
};
async.forEachSeries = async.eachSeries;
async.eachLimit = function (arr, limit, iterator, callback) {
var fn = _eachLimit(limit);
fn.apply(null, [arr, iterator, callback]);
};
async.forEachLimit = async.eachLimit;
var _eachLimit = function (limit) {
return function (arr, iterator, callback) {
callback = callback || function () {};
if (!arr.length || limit <= 0) {
return callback();
}
var completed = 0;
var started = 0;
var running = 0;
(function replenish () {
if (completed >= arr.length) {
return callback();
}
while (running < limit && started < arr.length) {
started += 1;
running += 1;
iterator(arr[started - 1], function (err) {
if (err) {
callback(err);
callback = function () {};
}
else {
completed += 1;
running -= 1;
if (completed >= arr.length) {
callback();
}
else {
replenish();
}
}
});
}
})();
};
};
var doParallel = function (fn) {
return function () {
var args = Array.prototype.slice.call(arguments);
return fn.apply(null, [async.each].concat(args));
};
};
var doParallelLimit = function(limit, fn) {
return function () {
var args = Array.prototype.slice.call(arguments);
return fn.apply(null, [_eachLimit(limit)].concat(args));
};
};
var doSeries = function (fn) {
return function () {
var args = Array.prototype.slice.call(arguments);
return fn.apply(null, [async.eachSeries].concat(args));
};
};
var _asyncMap = function (eachfn, arr, iterator, callback) {
var results = [];
arr = _map(arr, function (x, i) {
return {index: i, value: x};
});
eachfn(arr, function (x, callback) {
iterator(x.value, function (err, v) {
results[x.index] = v;
callback(err);
});
}, function (err) {
callback(err, results);
});
};
async.map = doParallel(_asyncMap);
async.mapSeries = doSeries(_asyncMap);
async.mapLimit = function (arr, limit, iterator, callback) {
return _mapLimit(limit)(arr, iterator, callback);
};
var _mapLimit = function(limit) {
return doParallelLimit(limit, _asyncMap);
};
// reduce only has a series version, as doing reduce in parallel won't
// work in many situations.
async.reduce = function (arr, memo, iterator, callback) {
async.eachSeries(arr, function (x, callback) {
iterator(memo, x, function (err, v) {
memo = v;
callback(err);
});
}, function (err) {
callback(err, memo);
});
};
// inject alias
async.inject = async.reduce;
// foldl alias
async.foldl = async.reduce;
async.reduceRight = function (arr, memo, iterator, callback) {
var reversed = _map(arr, function (x) {
return x;
}).reverse();
async.reduce(reversed, memo, iterator, callback);
};
// foldr alias
async.foldr = async.reduceRight;
var _filter = function (eachfn, arr, iterator, callback) {
var results = [];
arr = _map(arr, function (x, i) {
return {index: i, value: x};
});
eachfn(arr, function (x, callback) {
iterator(x.value, function (v) {
if (v) {
results.push(x);
}
callback();
});
}, function (err) {
callback(_map(results.sort(function (a, b) {
return a.index - b.index;
}), function (x) {
return x.value;
}));
});
};
async.filter = doParallel(_filter);
async.filterSeries = doSeries(_filter);
// select alias
async.select = async.filter;
async.selectSeries = async.filterSeries;
var _reject = function (eachfn, arr, iterator, callback) {
var results = [];
arr = _map(arr, function (x, i) {
return {index: i, value: x};
});
eachfn(arr, function (x, callback) {
iterator(x.value, function (v) {
if (!v) {
results.push(x);
}
callback();
});
}, function (err) {
callback(_map(results.sort(function (a, b) {
return a.index - b.index;
}), function (x) {
return x.value;
}));
});
};
async.reject = doParallel(_reject);
async.rejectSeries = doSeries(_reject);
var _detect = function (eachfn, arr, iterator, main_callback) {
eachfn(arr, function (x, callback) {
iterator(x, function (result) {
if (result) {
main_callback(x);
main_callback = function () {};
}
else {
callback();
}
});
}, function (err) {
main_callback();
});
};
async.detect = doParallel(_detect);
async.detectSeries = doSeries(_detect);
async.some = function (arr, iterator, main_callback) {
async.each(arr, function (x, callback) {
iterator(x, function (v) {
if (v) {
main_callback(true);
main_callback = function () {};
}
callback();
});
}, function (err) {
main_callback(false);
});
};
// any alias
async.any = async.some;
async.every = function (arr, iterator, main_callback) {
async.each(arr, function (x, callback) {
iterator(x, function (v) {
if (!v) {
main_callback(false);
main_callback = function () {};
}
callback();
});
}, function (err) {
main_callback(true);
});
};
// all alias
async.all = async.every;
async.sortBy = function (arr, iterator, callback) {
async.map(arr, function (x, callback) {
iterator(x, function (err, criteria) {
if (err) {
callback(err);
}
else {
callback(null, {value: x, criteria: criteria});
}
});
}, function (err, results) {
if (err) {
return callback(err);
}
else {
var fn = function (left, right) {
var a = left.criteria, b = right.criteria;
return a < b ? -1 : a > b ? 1 : 0;
};
callback(null, _map(results.sort(fn), function (x) {
return x.value;
}));
}
});
};
async.auto = function (tasks, callback) {
callback = callback || function () {};
var keys = _keys(tasks);
if (!keys.length) {
return callback(null);
}
var results = {};
var listeners = [];
var addListener = function (fn) {
listeners.unshift(fn);
};
var removeListener = function (fn) {
for (var i = 0; i < listeners.length; i += 1) {
if (listeners[i] === fn) {
listeners.splice(i, 1);
return;
}
}
};
var taskComplete = function () {
_each(listeners.slice(0), function (fn) {
fn();
});
};
addListener(function () {
if (_keys(results).length === keys.length) {
callback(null, results);
callback = function () {};
}
});
_each(keys, function (k) {
var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k];
var taskCallback = function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
if (err) {
var safeResults = {};
_each(_keys(results), function(rkey) {
safeResults[rkey] = results[rkey];
});
safeResults[k] = args;
callback(err, safeResults);
// stop subsequent errors hitting callback multiple times
callback = function () {};
}
else {
results[k] = args;
async.setImmediate(taskComplete);
}
};
var requires = task.slice(0, Math.abs(task.length - 1)) || [];
var ready = function () {
return _reduce(requires, function (a, x) {
return (a && results.hasOwnProperty(x));
}, true) && !results.hasOwnProperty(k);
};
if (ready()) {
task[task.length - 1](taskCallback, results);
}
else {
var listener = function () {
if (ready()) {
removeListener(listener);
task[task.length - 1](taskCallback, results);
}
};
addListener(listener);
}
});
};
async.waterfall = function (tasks, callback) {
callback = callback || function () {};
if (tasks.constructor !== Array) {
var err = new Error('First argument to waterfall must be an array of functions');
return callback(err);
}
if (!tasks.length) {
return callback();
}
var wrapIterator = function (iterator) {
return function (err) {
if (err) {
callback.apply(null, arguments);
callback = function () {};
}
else {
var args = Array.prototype.slice.call(arguments, 1);
var next = iterator.next();
if (next) {
args.push(wrapIterator(next));
}
else {
args.push(callback);
}
async.setImmediate(function () {
iterator.apply(null, args);
});
}
};
};
wrapIterator(async.iterator(tasks))();
};
var _parallel = function(eachfn, tasks, callback) {
callback = callback || function () {};
if (tasks.constructor === Array) {
eachfn.map(tasks, function (fn, callback) {
if (fn) {
fn(function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
callback.call(null, err, args);
});
}
}, callback);
}
else {
var results = {};
eachfn.each(_keys(tasks), function (k, callback) {
tasks[k](function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
results[k] = args;
callback(err);
});
}, function (err) {
callback(err, results);
});
}
};
async.parallel = function (tasks, callback) {
_parallel({ map: async.map, each: async.each }, tasks, callback);
};
async.parallelLimit = function(tasks, limit, callback) {
_parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback);
};
async.series = function (tasks, callback) {
callback = callback || function () {};
if (tasks.constructor === Array) {
async.mapSeries(tasks, function (fn, callback) {
if (fn) {
fn(function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
callback.call(null, err, args);
});
}
}, callback);
}
else {
var results = {};
async.eachSeries(_keys(tasks), function (k, callback) {
tasks[k](function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (args.length <= 1) {
args = args[0];
}
results[k] = args;
callback(err);
});
}, function (err) {
callback(err, results);
});
}
};
async.iterator = function (tasks) {
var makeCallback = function (index) {
var fn = function () {
if (tasks.length) {
tasks[index].apply(null, arguments);
}
return fn.next();
};
fn.next = function () {
return (index < tasks.length - 1) ? makeCallback(index + 1): null;
};
return fn;
};
return makeCallback(0);
};
async.apply = function (fn) {
var args = Array.prototype.slice.call(arguments, 1);
return function () {
return fn.apply(
null, args.concat(Array.prototype.slice.call(arguments))
);
};
};
var _concat = function (eachfn, arr, fn, callback) {
var r = [];
eachfn(arr, function (x, cb) {
fn(x, function (err, y) {
r = r.concat(y || []);
cb(err);
});
}, function (err) {
callback(err, r);
});
};
async.concat = doParallel(_concat);
async.concatSeries = doSeries(_concat);
async.whilst = function (test, iterator, callback) {
if (test()) {
iterator(function (err) {
if (err) {
return callback(err);
}
async.whilst(test, iterator, callback);
});
}
else {
callback();
}
};
async.doWhilst = function (iterator, test, callback) {
iterator(function (err) {
if (err) {
return callback(err);
}
if (test()) {
async.doWhilst(iterator, test, callback);
}
else {
callback();
}
});
};
async.until = function (test, iterator, callback) {
if (!test()) {
iterator(function (err) {
if (err) {
return callback(err);
}
async.until(test, iterator, callback);
});
}
else {
callback();
}
};
async.doUntil = function (iterator, test, callback) {
iterator(function (err) {
if (err) {
return callback(err);
}
if (!test()) {
async.doUntil(iterator, test, callback);
}
else {
callback();
}
});
};
async.queue = function (worker, concurrency) {
if (concurrency === undefined) {
concurrency = 1;
}
function _insert(q, data, pos, callback) {
if(data.constructor !== Array) {
data = [data];
}
_each(data, function(task) {
var item = {
data: task,
callback: typeof callback === 'function' ? callback : null
};
if (pos) {
q.tasks.unshift(item);
} else {
q.tasks.push(item);
}
if (q.saturated && q.tasks.length === concurrency) {
q.saturated();
}
async.setImmediate(q.process);
});
}
var workers = 0;
var q = {
tasks: [],
concurrency: concurrency,
saturated: null,
empty: null,
drain: null,
push: function (data, callback) {
_insert(q, data, false, callback);
},
unshift: function (data, callback) {
_insert(q, data, true, callback);
},
process: function () {
if (workers < q.concurrency && q.tasks.length) {
var task = q.tasks.shift();
if (q.empty && q.tasks.length === 0) {
q.empty();
}
workers += 1;
var next = function () {
workers -= 1;
if (task.callback) {
task.callback.apply(task, arguments);
}
if (q.drain && q.tasks.length + workers === 0) {
q.drain();
}
q.process();
};
var cb = only_once(next);
worker(task.data, cb);
}
},
length: function () {
return q.tasks.length;
},
running: function () {
return workers;
}
};
return q;
};
async.cargo = function (worker, payload) {
var working = false,
tasks = [];
var cargo = {
tasks: tasks,
payload: payload,
saturated: null,
empty: null,
drain: null,
push: function (data, callback) {
if(data.constructor !== Array) {
data = [data];
}
_each(data, function(task) {
tasks.push({
data: task,
callback: typeof callback === 'function' ? callback : null
});
if (cargo.saturated && tasks.length === payload) {
cargo.saturated();
}
});
async.setImmediate(cargo.process);
},
process: function process() {
if (working) return;
if (tasks.length === 0) {
if(cargo.drain) cargo.drain();
return;
}
var ts = typeof payload === 'number'
? tasks.splice(0, payload)
: tasks.splice(0);
var ds = _map(ts, function (task) {
return task.data;
});
if(cargo.empty) cargo.empty();
working = true;
worker(ds, function () {
working = false;
var args = arguments;
_each(ts, function (data) {
if (data.callback) {
data.callback.apply(null, args);
}
});
process();
});
},
length: function () {
return tasks.length;
},
running: function () {
return working;
}
};
return cargo;
};
var _console_fn = function (name) {
return function (fn) {
var args = Array.prototype.slice.call(arguments, 1);
fn.apply(null, args.concat([function (err) {
var args = Array.prototype.slice.call(arguments, 1);
if (typeof console !== 'undefined') {
if (err) {
if (console.error) {
console.error(err);
}
}
else if (console[name]) {
_each(args, function (x) {
console[name](x);
});
}
}
}]));
};
};
async.log = _console_fn('log');
async.dir = _console_fn('dir');
/*async.info = _console_fn('info');
async.warn = _console_fn('warn');
async.error = _console_fn('error');*/
async.memoize = function (fn, hasher) {
var memo = {};
var queues = {};
hasher = hasher || function (x) {
return x;
};
var memoized = function () {
var args = Array.prototype.slice.call(arguments);
var callback = args.pop();
var key = hasher.apply(null, args);
if (key in memo) {
callback.apply(null, memo[key]);
}
else if (key in queues) {
queues[key].push(callback);
}
else {
queues[key] = [callback];
fn.apply(null, args.concat([function () {
memo[key] = arguments;
var q = queues[key];
delete queues[key];
for (var i = 0, l = q.length; i < l; i++) {
q[i].apply(null, arguments);
}
}]));
}
};
memoized.memo = memo;
memoized.unmemoized = fn;
return memoized;
};
async.unmemoize = function (fn) {
return function () {
return (fn.unmemoized || fn).apply(null, arguments);
};
};
async.times = function (count, iterator, callback) {
var counter = [];
for (var i = 0; i < count; i++) {
counter.push(i);
}
return async.map(counter, iterator, callback);
};
async.timesSeries = function (count, iterator, callback) {
var counter = [];
for (var i = 0; i < count; i++) {
counter.push(i);
}
return async.mapSeries(counter, iterator, callback);
};
async.compose = function (/* functions... */) {
var fns = Array.prototype.reverse.call(arguments);
return function () {
var that = this;
var args = Array.prototype.slice.call(arguments);
var callback = args.pop();
async.reduce(fns, args, function (newargs, fn, cb) {
fn.apply(that, newargs.concat([function () {
var err = arguments[0];
var nextargs = Array.prototype.slice.call(arguments, 1);
cb(err, nextargs);
}]))
},
function (err, results) {
callback.apply(that, [err].concat(results));
});
};
};
var _applyEach = function (eachfn, fns /*args...*/) {
var go = function () {
var that = this;
var args = Array.prototype.slice.call(arguments);
var callback = args.pop();
return eachfn(fns, function (fn, cb) {
fn.apply(that, args.concat([cb]));
},
callback);
};
if (arguments.length > 2) {
var args = Array.prototype.slice.call(arguments, 2);
return go.apply(this, args);
}
else {
return go;
}
};
async.applyEach = doParallel(_applyEach);
async.applyEachSeries = doSeries(_applyEach);
async.forever = function (fn, callback) {
function next(err) {
if (err) {
if (callback) {
return callback(err);
}
throw err;
}
fn(next);
}
next();
};
// AMD / RequireJS
if (typeof define !== 'undefined' && define.amd) {
define([], function () {
return async;
});
}
// Node.js
else if (typeof module !== 'undefined' && module.exports) {
module.exports = async;
}
// included directly via <script> tag
else {
root.async = async;
}
}());

View File

@@ -1,141 +0,0 @@
/*
---
name: Fx.Tween.CSS3.Replacement
script: Fx.Tween.CSS3.Replacement.js
license: MIT-style license.
description: Same behavior like Fx.Tween but tries to use native CSS3 transition if possible (Overwrites Fx.Tween).
copyright: Copyright (c) 2010, Dipl.-Ing. (FH) André Fiedler <kontakt at visualdrugs dot net>, based on code by eskimoblood (mootools users group)
authors: [André Fiedler, eskimoblood]
requires: [Core/Class.Extras, Core/Element.Event, Core/Element.Style, Core/Fx.Tween]
provides: [Fx.Tween]
...
*/
Element.NativeEvents.transitionend = 2;
Element.NativeEvents.webkitTransitionEnd = 2;
Element.NativeEvents.oTransitionEnd = 2;
Element.NativeEvents.msTransitionEnd = 2;
Element.Events.transitionend = {
base: Browser.safari || Browser.chrome ? 'webkitTransitionEnd' : (Browser.opera ? 'oTransitionEnd' : (Browser.ie && Browser.version > 8 ? 'msTransitionEnd' : 'transitionend'))
};
Event.implement({
getPropertyName: function(){
return this.event.propertyName;
},
getElapsedTime: function(nativeTime){
return nativeTime ? this.event.elapsedTime : (this.event.elapsedTime * 1000).toInt();
}
});
Element.implement({
supportStyle: function(style){
var value = this.style[style];
return !!(value || value === '');
},
supportVendorStyle: function(style){
var prefixedStyle = null;
return this.supportStyle(style) ? style : ['webkit', 'Moz', 'o', 'ms'].some(function(prefix){
prefixedStyle = prefix + style.capitalize();
return this.supportStyle(prefixedStyle);
}, this) ? prefixedStyle : null;
}
});
Fx.TweenCSS2 = Fx.Tween;
Fx.Tween = new Class({
Extends: Fx.TweenCSS2,
transitionTimings: {
'linear' : '0,0,1,1',
'expo:in' : '0.71,0.01,0.83,0',
'expo:out' : '0.14,1,0.32,0.99',
'expo:in:out' : '0.85,0,0.15,1',
'circ:in' : '0.34,0,0.96,0.23',
'circ:out' : '0,0.5,0.37,0.98',
'circ:in:out' : '0.88,0.1,0.12,0.9',
'sine:in' : '0.22,0.04,0.36,0',
'sine:out' : '0.04,0,0.5,1',
'sine:in:out' : '0.37,0.01,0.63,1',
'quad:in' : '0.14,0.01,0.49,0',
'quad:out' : '0.01,0,0.43,1',
'quad:in:out' : '0.47,0.04,0.53,0.96',
'cubic:in' : '0.35,0,0.65,0',
'cubic:out' : '0.09,0.25,0.24,1',
'cubic:in:out' : '0.66,0,0.34,1',
'quart:in' : '0.69,0,0.76,0.17',
'quart:out' : '0.26,0.96,0.44,1',
'quart:in:out' : '0.76,0,0.24,1',
'quint:in' : '0.64,0,0.78,0',
'quint:out' : '0.22,1,0.35,1',
'quint:in:out' : '0.9,0,0.1,1'
},
initialize: function(element, options){
options.transition = options.transition || 'sine:in:out';
this.parent(element, options);
if (typeof this.options.transition != 'string') alert('Only short notated transitions (like \'sine:in\') are supported by Fx.Tween.CSS3');
this.options.transition = this.options.transition.toLowerCase();
this.transition = this.element.supportVendorStyle('transition');
this.css3Supported = !!this.transition && !!this.transitionTimings[this.options.transition];
},
check: function(){
if (!this.boundComplete) return true;
return this.parent();
},
start: function(property, from, to){
if (this.css3Supported){
if (!this.check(property, from, to)) return this;
var args = Array.flatten(arguments);
this.property = this.options.property || args.shift();
var parsed = this.prepare(this.element, this.property, args);
this.from = parsed.from;
this.to = parsed.to;
this.boundComplete = function(event){
if (event.getPropertyName() == this.property /* && event.getElapsedTime() == this.options.duration */ ){
this.element.removeEvent('transitionend', this.boundComplete);
this.boundComplete = null;
this.fireEvent('complete', this);
}
}.bind(this);
this.element.addEvent('transitionend', this.boundComplete);
var trans = function(){
this.element.setStyle(this.transition, this.property + ' ' + this.options.duration + 'ms cubic-bezier(' + this.transitionTimings[this.options.transition] + ')');
this.element.setStyle(this.property, this.to[0].value + this.options.unit);
}.bind(this);
if (args[1]){
this.element.setStyle(this.transition, 'none');
this.element.setStyle(this.property, this.from[0].value + this.options.unit);
trans.delay(0.1);
} else
trans();
this.fireEvent('start', this);
return this;
}
return this.parent(property, from, to);
},
cancel: function(){
if (this.css3Supported){
this.element.setStyle(this.transition, 'none');
this.element.removeEvent('transitionend', this.boundComplete);
this.boundComplete = null;
}
this.parent();
return this;
}
});

View File

@@ -10,7 +10,7 @@ var Question = new Class( {
self.createQuestion(); self.createQuestion();
self.answers.each(function(answer) { self.answers.each(function(answer) {
self.createAnswer(answer); self.createAnswer(answer);
}) });
}, },
@@ -24,7 +24,7 @@ var Question = new Class( {
new Element('div.hint', { new Element('div.hint', {
'html': this.hint 'html': this.hint
}) })
).fade('hide').inject(document.body).fade('in') ).fade('hide').inject(document.body).fade('in');
}, },
@@ -32,7 +32,7 @@ var Question = new Class( {
var self = this; var self = this;
var answer = new Element('a', Object.merge(options, { var answer = new Element('a', Object.merge(options, {
'class' : 'answer button '+(options['class'] || '')+(options['cancel'] ? ' cancel' : '') 'class' : 'answer button '+(options['class'] || '')+(options.cancel ? ' cancel' : '')
})).inject(this.container); })).inject(this.container);
if (options.cancel) { if (options.cancel) {
@@ -55,7 +55,7 @@ var Question = new Class( {
close : function() { close : function() {
var self = this; var self = this;
self.container.fade('out'); self.container.fade('out');
(function(){self.container.destroy()}).delay(1000); (function(){self.container.destroy();}).delay(1000);
}, },
toElement : function() { toElement : function() {

View File

@@ -50,7 +50,7 @@ var ScrollSpy = new Class({
min = typeOf(self.options.min) == 'function' ? self.options.min() : self.options.min, min = typeOf(self.options.min) == 'function' ? self.options.min() : self.options.min,
max = typeOf(self.options.max) == 'function' ? self.options.max() : self.options.max; max = typeOf(self.options.max) == 'function' ? self.options.max() : self.options.max;
if(xy >= min && (max == 0 || xy <= max)) { if(xy >= min && (max === 0 || xy <= max)) {
/* trigger enter event if necessary */ /* trigger enter event if necessary */
if(!self.inside) { if(!self.inside) {
/* record as inside */ /* record as inside */
@@ -90,4 +90,4 @@ var ScrollSpy = new Class({
addListener: function() { addListener: function() {
this.start(); this.start();
} }
}); });

View File

@@ -1,301 +0,0 @@
//fgnass.github.com/spin.js#v1.2.4
(function(window, document, undefined) {
/**
* Copyright (c) 2011 Felix Gnass [fgnass at neteye dot de]
* Licensed under the MIT license
*/
var prefixes = ['webkit', 'Moz', 'ms', 'O']; /* Vendor prefixes */
var animations = {}; /* Animation rules keyed by their name */
var useCssAnimations;
/**
* Utility function to create elements. If no tag name is given,
* a DIV is created. Optionally properties can be passed.
*/
function createEl(tag, prop) {
var el = document.createElement(tag || 'div');
var n;
for(n in prop) {
el[n] = prop[n];
}
return el;
}
/**
* Appends children and returns the parent.
*/
function ins(parent /* child1, child2, ...*/) {
for (var i=1, n=arguments.length; i<n; i++) {
parent.appendChild(arguments[i]);
}
return parent;
}
/**
* Insert a new stylesheet to hold the @keyframe or VML rules.
*/
var sheet = function() {
var el = createEl('style');
ins(document.getElementsByTagName('head')[0], el);
return el.sheet || el.styleSheet;
}();
/**
* Creates an opacity keyframe animation rule and returns its name.
* Since most mobile Webkits have timing issues with animation-delay,
* we create separate rules for each line/segment.
*/
function addAnimation(alpha, trail, i, lines) {
var name = ['opacity', trail, ~~(alpha*100), i, lines].join('-');
var start = 0.01 + i/lines*100;
var z = Math.max(1-(1-alpha)/trail*(100-start) , alpha);
var prefix = useCssAnimations.substring(0, useCssAnimations.indexOf('Animation')).toLowerCase();
var pre = prefix && '-'+prefix+'-' || '';
if (!animations[name]) {
sheet.insertRule(
'@' + pre + 'keyframes ' + name + '{' +
'0%{opacity:'+z+'}' +
start + '%{opacity:'+ alpha + '}' +
(start+0.01) + '%{opacity:1}' +
(start+trail)%100 + '%{opacity:'+ alpha + '}' +
'100%{opacity:'+ z + '}' +
'}', 0);
animations[name] = 1;
}
return name;
}
/**
* Tries various vendor prefixes and returns the first supported property.
**/
function vendor(el, prop) {
var s = el.style;
var pp;
var i;
if(s[prop] !== undefined) return prop;
prop = prop.charAt(0).toUpperCase() + prop.slice(1);
for(i=0; i<prefixes.length; i++) {
pp = prefixes[i]+prop;
if(s[pp] !== undefined) return pp;
}
}
/**
* Sets multiple style properties at once.
*/
function css(el, prop) {
for (var n in prop) {
el.style[vendor(el, n)||n] = prop[n];
}
return el;
}
/**
* Fills in default values.
*/
function merge(obj) {
for (var i=1; i < arguments.length; i++) {
var def = arguments[i];
for (var n in def) {
if (obj[n] === undefined) obj[n] = def[n];
}
}
return obj;
}
/**
* Returns the absolute page-offset of the given element.
*/
function pos(el) {
var o = {x:el.offsetLeft, y:el.offsetTop};
while((el = el.offsetParent)) {
o.x+=el.offsetLeft;
o.y+=el.offsetTop;
}
return o;
}
var defaults = {
lines: 12, // The number of lines to draw
length: 7, // The length of each line
width: 5, // The line thickness
radius: 10, // The radius of the inner circle
color: '#000', // #rgb or #rrggbb
speed: 1, // Rounds per second
trail: 100, // Afterglow percentage
opacity: 1/4, // Opacity of the lines
fps: 20, // Frames per second when using setTimeout()
zIndex: 2e9, // Use a high z-index by default
className: 'spinner', // CSS class to assign to the element
top: 'auto', // center vertically
left: 'auto' // center horizontally
};
/** The constructor */
var Spinner = function Spinner(o) {
if (!this.spin) return new Spinner(o);
this.opts = merge(o || {}, Spinner.defaults, defaults);
};
Spinner.defaults = {};
Spinner.prototype = {
spin: function(target) {
this.stop();
var self = this;
var o = self.opts;
var el = self.el = css(createEl(0, {className: o.className}), {position: 'relative', zIndex: o.zIndex});
var mid = o.radius+o.length+o.width;
var ep; // element position
var tp; // target position
if (target) {
target.insertBefore(el, target.firstChild||null);
tp = pos(target);
ep = pos(el);
css(el, {
left: (o.left == 'auto' ? tp.x-ep.x + (target.offsetWidth >> 1) : o.left+mid) + 'px',
top: (o.top == 'auto' ? tp.y-ep.y + (target.offsetHeight >> 1) : o.top+mid) + 'px'
});
}
el.setAttribute('aria-role', 'progressbar');
self.lines(el, self.opts);
if (!useCssAnimations) {
// No CSS animation support, use setTimeout() instead
var i = 0;
var fps = o.fps;
var f = fps/o.speed;
var ostep = (1-o.opacity)/(f*o.trail / 100);
var astep = f/o.lines;
!function anim() {
i++;
for (var s=o.lines; s; s--) {
var alpha = Math.max(1-(i+s*astep)%f * ostep, o.opacity);
self.opacity(el, o.lines-s, alpha, o);
}
self.timeout = self.el && setTimeout(anim, ~~(1000/fps));
}();
}
return self;
},
stop: function() {
var el = this.el;
if (el) {
clearTimeout(this.timeout);
if (el.parentNode) el.parentNode.removeChild(el);
this.el = undefined;
}
return this;
},
lines: function(el, o) {
var i = 0;
var seg;
function fill(color, shadow) {
return css(createEl(), {
position: 'absolute',
width: (o.length+o.width) + 'px',
height: o.width + 'px',
background: color,
boxShadow: shadow,
transformOrigin: 'left',
transform: 'rotate(' + ~~(360/o.lines*i) + 'deg) translate(' + o.radius+'px' +',0)',
borderRadius: (o.width>>1) + 'px'
});
}
for (; i < o.lines; i++) {
seg = css(createEl(), {
position: 'absolute',
top: 1+~(o.width/2) + 'px',
transform: o.hwaccel ? 'translate3d(0,0,0)' : '',
opacity: o.opacity,
animation: useCssAnimations && addAnimation(o.opacity, o.trail, i, o.lines) + ' ' + 1/o.speed + 's linear infinite'
});
if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'}));
ins(el, ins(seg, fill(o.color, '0 0 1px rgba(0,0,0,.1)')));
}
return el;
},
opacity: function(el, i, val) {
if (i < el.childNodes.length) el.childNodes[i].style.opacity = val;
}
};
/////////////////////////////////////////////////////////////////////////
// VML rendering for IE
/////////////////////////////////////////////////////////////////////////
/**
* Check and init VML support
*/
!function() {
var s = css(createEl('group'), {behavior: 'url(#default#VML)'});
var i;
if (!vendor(s, 'transform') && s.adj) {
// VML support detected. Insert CSS rules ...
for (i=4; i--;) sheet.addRule(['group', 'roundrect', 'fill', 'stroke'][i], 'behavior:url(#default#VML)');
Spinner.prototype.lines = function(el, o) {
var r = o.length+o.width;
var s = 2*r;
function grp() {
return css(createEl('group', {coordsize: s +' '+s, coordorigin: -r +' '+-r}), {width: s, height: s});
}
var margin = -(o.width+o.length)*2+'px';
var g = css(grp(), {position: 'absolute', top: margin, left: margin});
var i;
function seg(i, dx, filter) {
ins(g,
ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}),
ins(css(createEl('roundrect', {arcsize: 1}), {
width: r,
height: o.width,
left: o.radius,
top: -o.width>>1,
filter: filter
}),
createEl('fill', {color: o.color, opacity: o.opacity}),
createEl('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change
)
)
);
}
if (o.shadow) {
for (i = 1; i <= o.lines; i++) {
seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)');
}
}
for (i = 1; i <= o.lines; i++) seg(i);
return ins(el, g);
};
Spinner.prototype.opacity = function(el, i, val, o) {
var c = el.firstChild;
o = o.shadow && o.lines || 0;
if (c && i+o < c.childNodes.length) {
c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild;
if (c) c.opacity = val;
}
};
}
else {
useCssAnimations = vendor(s, 'animation');
}
}();
window.Spinner = Spinner;
})(window, document);

View File

@@ -10,13 +10,19 @@ var PageBase = new Class({
has_tab: true, has_tab: true,
name: '', name: '',
initialize: function(options) { parent_page: null,
sub_pages: null,
initialize: function(parent_page, options) {
var self = this; var self = this;
self.parent_page = parent_page;
self.setOptions(options); self.setOptions(options);
// Create main page container // Create main page container
self.el = new Element('div.page.'+self.name); self.el = new Element('div', {
'class': 'page ' + self.getPageClass() + (' level_' + (options.level || 0))
});
}, },
load: function(){ load: function(){
@@ -24,14 +30,54 @@ var PageBase = new Class({
// Create tab for page // Create tab for page
if(self.has_tab){ if(self.has_tab){
var nav = App.getBlock('navigation'); var nav;
if(self.parent_page && self.parent_page.navigation){
nav = self.parent_page.navigation;
}
else {
nav = App.getBlock('navigation');
}
self.tab = nav.addTab(self.name, { self.tab = nav.addTab(self.name, {
'href': App.createUrl(self.name), 'href': App.createUrl(self.getPageUrl()),
'title': self.title, 'title': self.title,
'text': self.name.capitalize() 'text': self.name.capitalize()
}); });
} }
if(self.sub_pages){
self.loadSubPages();
}
},
loadSubPages: function(){
var self = this;
var sub_pages = self.sub_pages;
self.sub_pages = [];
sub_pages.each(function(class_name){
var pg = new window[self.name.capitalize()+class_name](self, {
'level': 2
});
self.sub_pages[class_name] = pg;
self.sub_pages.include({
'order': pg.order,
'name': class_name,
'class': pg
});
});
self.sub_pages.stableSort(self.sortPageByOrder).each(function(page){
page['class'].load();
self.fireEvent('load'+page.name);
$(page['class']).inject(App.getPageContainer());
});
}, },
open: function(action, params){ open: function(action, params){
@@ -39,7 +85,13 @@ var PageBase = new Class({
//p('Opening: ' +self.getName() + ', ' + action + ', ' + Object.toQueryString(params)); //p('Opening: ' +self.getName() + ', ' + action + ', ' + Object.toQueryString(params));
try { try {
var elements = self[action+'Action'](params); var elements;
if(!self[action+'Action']){
elements = self.defaultAction(action, params);
}
else {
elements = self[action+'Action'](params);
}
if(elements !== undefined){ if(elements !== undefined){
self.el.empty(); self.el.empty();
self.el.adopt(elements); self.el.adopt(elements);
@@ -59,12 +111,22 @@ var PageBase = new Class({
History.push(url); History.push(url);
}, },
getPageUrl: function(){
var self = this;
return (self.parent_page && self.parent_page.getPageUrl ? self.parent_page.getPageUrl() + '/' : '') + self.name;
},
getPageClass: function(){
var self = this;
return (self.parent_page && self.parent_page.getPageClass ? self.parent_page.getPageClass() + '_' : '') + self.name;
},
errorAction: function(e){ errorAction: function(e){
p('Error, action not found', e); p('Error, action not found', e);
}, },
getName: function(){ getName: function(){
return this.name return this.name;
}, },
show: function(){ show: function(){
@@ -76,7 +138,7 @@ var PageBase = new Class({
}, },
toElement: function(){ toElement: function(){
return this.el return this.el;
} }
}); });

View File

@@ -6,7 +6,7 @@ var AboutSettingTab = new Class({
initialize: function(){ initialize: function(){
var self = this; var self = this;
App.addEvent('loadSettings', self.addSettings.bind(self)) App.addEvent('loadSettings', self.addSettings.bind(self));
}, },
@@ -48,13 +48,13 @@ var AboutSettingTab = new Class({
'text': 'Getting version...', 'text': 'Getting version...',
'events': { 'events': {
'click': App.checkForUpdate.bind(App, function(json){ 'click': App.checkForUpdate.bind(App, function(json){
self.fillVersion(json.info) self.fillVersion(json.info);
}), }),
'mouseenter': function(){ 'mouseenter': function(){
this.set('text', 'Check for updates') this.set('text', 'Check for updates');
}, },
'mouseleave': function(){ 'mouseleave': function(){
self.fillVersion(Updater.getInfo()) self.fillVersion(Updater.getInfo());
} }
} }
}), }),

View File

@@ -27,8 +27,8 @@ Page.Settings = new Class({
}, },
openTab: function(action){ openTab: function(action){
var self = this, var self = this;
action = (action == 'index' ? 'about' : action) || self.action; action = (action == 'index' ? 'about' : action) || self.action;
if(self.current) if(self.current)
self.toggleTab(self.current, true); self.toggleTab(self.current, true);
@@ -72,7 +72,7 @@ Page.Settings = new Class({
t.content.fireEvent('activate'); t.content.fireEvent('activate');
} }
return t return t;
}, },
getData: function(onComplete){ getData: function(onComplete){
@@ -99,7 +99,7 @@ Page.Settings = new Class({
return self.data.values[section][name]; return self.data.values[section][name];
} }
catch(e){ catch(e){
return '' return '';
} }
}, },
@@ -113,7 +113,7 @@ Page.Settings = new Class({
}, },
sortByOrder: function(a, b){ sortByOrder: function(a, b){
return (a.order || 100) - (b.order || 100) return (a.order || 100) - (b.order || 100);
}, },
create: function(json){ create: function(json){
@@ -146,7 +146,7 @@ Page.Settings = new Class({
// Add content to tabs // Add content to tabs
var options = []; var options = [];
Object.each(json.options, function(section, section_name){ Object.each(json.options, function(section, section_name){
section['section_name'] = section_name; section.section_name = section_name;
options.include(section); options.include(section);
}); });
@@ -169,7 +169,7 @@ Page.Settings = new Class({
if(group.subtab){ if(group.subtab){
if(!self.tabs[group.tab].subtabs[group.subtab]) if(!self.tabs[group.tab].subtabs[group.subtab])
self.createSubTab(group.subtab, group, self.tabs[group.tab], group.tab); self.createSubTab(group.subtab, group, self.tabs[group.tab], group.tab);
content_container = self.tabs[group.tab].subtabs[group.subtab].content content_container = self.tabs[group.tab].subtabs[group.subtab].content;
} }
if(group.list && !self.lists[group.list]){ if(group.list && !self.lists[group.list]){
@@ -240,7 +240,7 @@ Page.Settings = new Class({
'groups': {} 'groups': {}
}); });
return self.tabs[tab_name] return self.tabs[tab_name];
}, },
@@ -272,23 +272,24 @@ Page.Settings = new Class({
'groups': {} 'groups': {}
}); });
return parent_tab.subtabs[tab_name] return parent_tab.subtabs[tab_name];
}, },
createGroup: function(group){ createGroup: function(group){
var hint;
if((typeOf(group.description) == 'array')){ if((typeOf(group.description) == 'array')){
var hint = new Element('span.hint.more_hint', { hint = new Element('span.hint.more_hint', {
'html': group.description[0] 'html': group.description[0]
}); });
createTooltip(group.description[1]).inject(hint, 'top'); createTooltip(group.description[1]).inject(hint, 'top');
} }
else { else {
var hint = new Element('span.hint', { hint = new Element('span.hint', {
'html': group.description || '' 'html': group.description || ''
}) });
} }
var icon; var icon;
@@ -300,7 +301,7 @@ Page.Settings = new Class({
var label = new Element('span.group_label', { var label = new Element('span.group_label', {
'text': group.label || (group.name).capitalize() 'text': group.label || (group.name).capitalize()
}) });
return new Element('fieldset', { return new Element('fieldset', {
'class': (group.advanced ? 'inlineLabels advanced' : 'inlineLabels') + ' group_' + (group.name || '') + ' subtab_' + (group.subtab || '') 'class': (group.advanced ? 'inlineLabels advanced' : 'inlineLabels') + ' group_' + (group.name || '') + ' subtab_' + (group.subtab || '')
@@ -315,7 +316,7 @@ Page.Settings = new Class({
new Element('h3', { new Element('h3', {
'text': 'Enable another' 'text': 'Enable another'
}) })
).inject(content_container) ).inject(content_container);
} }
}); });
@@ -347,7 +348,7 @@ var OptionBase = new Class({
'keyup': self.changed.bind(self) 'keyup': self.changed.bind(self)
}); });
self.addEvent('injected', self.afterInject.bind(self)) self.addEvent('injected', self.afterInject.bind(self));
}, },
@@ -356,7 +357,7 @@ var OptionBase = new Class({
*/ */
createBase: function(){ createBase: function(){
var self = this; var self = this;
self.el = new Element('div.ctrlHolder.' + self.section + '_' + self.name) self.el = new Element('div.ctrlHolder.' + self.section + '_' + self.name);
}, },
create: function(){ create: function(){
@@ -366,18 +367,17 @@ var OptionBase = new Class({
var self = this; var self = this;
return new Element('label', { return new Element('label', {
'text': (self.options.label || self.options.name.replace('_', ' ')).capitalize() 'text': (self.options.label || self.options.name.replace('_', ' ')).capitalize()
}) });
}, },
setAdvanced: function(){ setAdvanced: function(){
this.el.addClass(this.options.advanced ? 'advanced' : '') this.el.addClass(this.options.advanced ? 'advanced' : '');
}, },
createHint: function(){ createHint: function(){
var self = this; var self = this;
if(self.options.description){ if(self.options.description){
if((typeOf(self.options.description) == 'array')){ if((typeOf(self.options.description) == 'array')){
var hint = new Element('p.formHint.more_hint', { var hint = new Element('p.formHint.more_hint', {
'html': self.options.description[0] 'html': self.options.description[0]
@@ -388,7 +388,7 @@ var OptionBase = new Class({
else { else {
new Element('p.formHint', { new Element('p.formHint', {
'html': self.options.description || '' 'html': self.options.description || ''
}).inject(self.el) }).inject(self.el);
} }
} }
}, },
@@ -405,7 +405,7 @@ var OptionBase = new Class({
if(self.changed_timer) clearTimeout(self.changed_timer); if(self.changed_timer) clearTimeout(self.changed_timer);
self.changed_timer = self.save.delay(300, self); self.changed_timer = self.save.delay(300, self);
} }
self.fireEvent('change') self.fireEvent('change');
} }
}, },
@@ -490,7 +490,7 @@ Option.String = new Class({
}, },
getPlaceholder: function(){ getPlaceholder: function(){
return this.options.placeholder return this.options.placeholder;
} }
}); });
@@ -511,7 +511,7 @@ Option.Dropdown = new Class({
new Element('option', { new Element('option', {
'text': value[0], 'text': value[0],
'value': value[1] 'value': value[1]
}).inject(self.input) }).inject(self.input);
}); });
self.input.set('value', self.getSettingValue()); self.input.set('value', self.getSettingValue());
@@ -573,7 +573,7 @@ Option.Password = new Class({
self.input.addEvent('focus', function(){ self.input.addEvent('focus', function(){
self.input.set('value', ''); self.input.set('value', '');
self.input.set('type', 'password'); self.input.set('type', 'password');
}) });
} }
}); });
@@ -621,7 +621,7 @@ Option.Enabler = new Class({
self.parentFieldset = self.el.getParent('fieldset').addClass('enabler'); self.parentFieldset = self.el.getParent('fieldset').addClass('enabler');
self.parentList = self.parentFieldset.getParent('.option_list'); self.parentList = self.parentFieldset.getParent('.option_list');
self.el.inject(self.parentFieldset, 'top'); self.el.inject(self.parentFieldset, 'top');
self.checkState() self.checkState();
} }
}); });
@@ -676,12 +676,13 @@ Option.Directory = new Class({
var self = this, var self = this,
value = self.getValue(), value = self.getValue(),
path_sep = Api.getOption('path_sep'), path_sep = Api.getOption('path_sep'),
active_selector = 'li:not(.blur):not(.empty)'; active_selector = 'li:not(.blur):not(.empty)',
first;
if(e.key == 'enter' || e.key == 'tab'){ if(e.key == 'enter' || e.key == 'tab'){
(e).stop(); (e).stop();
var first = self.dir_list.getElement(active_selector); first = self.dir_list.getElement(active_selector);
if(first){ if(first){
self.selectDirectory(first.get('data-value')); self.selectDirectory(first.get('data-value'));
} }
@@ -691,20 +692,20 @@ Option.Directory = new Class({
// New folder // New folder
if(value.substr(-1) == path_sep){ if(value.substr(-1) == path_sep){
if(self.current_dir != value) if(self.current_dir != value)
self.selectDirectory(value) self.selectDirectory(value);
} }
else { else {
var pd = self.getParentDir(value); var pd = self.getParentDir(value);
if(self.current_dir != pd) if(self.current_dir != pd)
self.getDirs(pd); self.getDirs(pd);
var folder_filter = value.split(path_sep).getLast() var folder_filter = value.split(path_sep).getLast();
self.dir_list.getElements('li').each(function(li){ self.dir_list.getElements('li').each(function(li){
var valid = li.get('text').substr(0, folder_filter.length).toLowerCase() != folder_filter.toLowerCase() var valid = li.get('text').substr(0, folder_filter.length).toLowerCase() != folder_filter.toLowerCase();
li[valid ? 'addClass' : 'removeClass']('blur') li[valid ? 'addClass' : 'removeClass']('blur');
}); });
var first = self.dir_list.getElement(active_selector); first = self.dir_list.getElement(active_selector);
if(first){ if(first){
if(!self.dir_list_scroll) if(!self.dir_list_scroll)
self.dir_list_scroll = new Fx.Scroll(self.dir_list, { self.dir_list_scroll = new Fx.Scroll(self.dir_list, {
@@ -722,13 +723,13 @@ Option.Directory = new Class({
self.input.set('value', dir); self.input.set('value', dir);
self.getDirs() self.getDirs();
}, },
previousDirectory: function(){ previousDirectory: function(){
var self = this; var self = this;
self.selectDirectory(self.getParentDir()) self.selectDirectory(self.getParentDir());
}, },
caretAtEnd: function(){ caretAtEnd: function(){
@@ -751,7 +752,7 @@ Option.Directory = new Class({
// Move caret to back of the input // Move caret to back of the input
if(!self.browser || self.browser && !self.browser.isVisible()) if(!self.browser || self.browser && !self.browser.isVisible())
self.caretAtEnd() self.caretAtEnd();
if(!self.browser){ if(!self.browser){
self.browser = new Element('div.directory_list').adopt( self.browser = new Element('div.directory_list').adopt(
@@ -769,7 +770,7 @@ Option.Directory = new Class({
self.show_hidden = new Element('input[type=checkbox].inlay', { self.show_hidden = new Element('input[type=checkbox].inlay', {
'events': { 'events': {
'change': function(){ 'change': function(){
self.getDirs() self.getDirs();
} }
} }
}) })
@@ -779,7 +780,7 @@ Option.Directory = new Class({
'events': { 'events': {
'click:relay(li:not(.empty))': function(e, el){ 'click:relay(li:not(.empty))': function(e, el){
(e).preventDefault(); (e).preventDefault();
self.selectDirectory(el.get('data-value')) self.selectDirectory(el.get('data-value'));
}, },
'mousewheel': function(e){ 'mousewheel': function(e){
(e).stopPropagation(); (e).stopPropagation();
@@ -809,7 +810,7 @@ Option.Directory = new Class({
'text': 'Save', 'text': 'Save',
'events': { 'events': {
'click': function(e){ 'click': function(e){
self.hideBrowser(e, true) self.hideBrowser(e, true);
} }
} }
}) })
@@ -823,7 +824,7 @@ Option.Directory = new Class({
self.getDirs(); self.getDirs();
self.browser.show(); self.browser.show();
self.el.addEvent('outerClick', self.hideBrowser.bind(self)) self.el.addEvent('outerClick', self.hideBrowser.bind(self));
}, },
hideBrowser: function(e, save){ hideBrowser: function(e, save){
@@ -836,7 +837,7 @@ Option.Directory = new Class({
self.input.set('value', self.initial_directory); self.input.set('value', self.initial_directory);
self.browser.hide(); self.browser.hide();
self.el.removeEvents('outerClick') self.el.removeEvents('outerClick');
}, },
@@ -848,7 +849,7 @@ Option.Directory = new Class({
var previous_dir = json.parent; var previous_dir = json.parent;
if(v == '') if(v === '')
self.input.set('value', json.home); self.input.set('value', json.home);
if(previous_dir.length >= 1 && !json.is_root){ if(previous_dir.length >= 1 && !json.is_root){
@@ -861,10 +862,10 @@ Option.Directory = new Class({
self.back_button.set('data-value', previous_dir); self.back_button.set('data-value', previous_dir);
self.back_button.set('html', '&laquo; ' + prev_dirname); self.back_button.set('html', '&laquo; ' + prev_dirname);
self.back_button.show() self.back_button.show();
} }
else { else {
self.back_button.hide() self.back_button.hide();
} }
if(self.use_cache) if(self.use_cache)
@@ -879,12 +880,12 @@ Option.Directory = new Class({
new Element('li', { new Element('li', {
'data-value': dir, 'data-value': dir,
'text': self.getCurrentDirname(dir) 'text': self.getCurrentDirname(dir)
}).inject(self.dir_list) }).inject(self.dir_list);
}); });
else else
new Element('li.empty', { new Element('li.empty', {
'text': 'Selected folder is empty' 'text': 'Selected folder is empty'
}).inject(self.dir_list) }).inject(self.dir_list);
//fix for webkit type browsers to refresh the dom for the file browser //fix for webkit type browsers to refresh the dom for the file browser
//http://stackoverflow.com/questions/3485365/how-can-i-force-webkit-to-redraw-repaint-to-propagate-style-changes //http://stackoverflow.com/questions/3485365/how-can-i-force-webkit-to-redraw-repaint-to-propagate-style-changes
@@ -897,7 +898,7 @@ Option.Directory = new Class({
c = dir || self.getValue(); c = dir || self.getValue();
if(self.cached[c] && self.use_cache){ if(self.cached[c] && self.use_cache){
self.fillBrowser() self.fillBrowser();
} }
else { else {
Api.request('directory.list', { Api.request('directory.list', {
@@ -909,7 +910,7 @@ Option.Directory = new Class({
self.current_dir = c; self.current_dir = c;
self.fillBrowser(json); self.fillBrowser(json);
} }
}) });
} }
}, },
@@ -922,16 +923,16 @@ Option.Directory = new Class({
var v = dir || self.getValue(); var v = dir || self.getValue();
var sep = Api.getOption('path_sep'); var sep = Api.getOption('path_sep');
var dirs = v.split(sep); var dirs = v.split(sep);
if(dirs.pop() == '') if(dirs.pop() === '')
dirs.pop(); dirs.pop();
return dirs.join(sep) + sep return dirs.join(sep) + sep;
}, },
getCurrentDirname: function(dir){ getCurrentDirname: function(dir){
var dir_split = dir.split(Api.getOption('path_sep')); var dir_split = dir.split(Api.getOption('path_sep'));
return dir_split[dir_split.length-2] || Api.getOption('path_sep') return dir_split[dir_split.length-2] || Api.getOption('path_sep');
}, },
getValue: function(){ getValue: function(){
@@ -976,7 +977,7 @@ Option.Directories = new Class({
var parent = self.el.getParent('fieldset'); var parent = self.el.getParent('fieldset');
var dirs = parent.getElements('.multi_directory'); var dirs = parent.getElements('.multi_directory');
if(dirs.length == 0) if(dirs.length === 0)
$(dir).inject(parent); $(dir).inject(parent);
else else
$(dir).inject(dirs.getLast(), 'after'); $(dir).inject(dirs.getLast(), 'after');
@@ -1080,7 +1081,7 @@ Option.Choice = new Class({
self.el.addEvent('outerClick', function(){ self.el.addEvent('outerClick', function(){
self.reset(); self.reset();
self.el.removeEvents('outerClick'); self.el.removeEvents('outerClick');
}) });
} }
} }
}).inject(self.input, 'after'); }).inject(self.input, 'after');
@@ -1105,7 +1106,7 @@ Option.Choice = new Class({
}); });
}); });
if(mtches.length == 0 && value != '') if(mtches.length === 0 && value !== '')
mtches.include(value); mtches.include(value);
mtches.each(self.addTag.bind(self)); mtches.each(self.addTag.bind(self));
@@ -1141,10 +1142,10 @@ Option.Choice = new Class({
self.addLastTag(); self.addLastTag();
}, },
'onGoLeft': function(){ 'onGoLeft': function(){
self.goLeft(this) self.goLeft(this);
}, },
'onGoRight': function(){ 'onGoRight': function(){
self.goRight(this) self.goRight(this);
} }
}); });
$(tag).inject(self.tag_input); $(tag).inject(self.tag_input);
@@ -1412,7 +1413,7 @@ Option.Combined = new Class({
}); });
self.inputs[name].getParent('.ctrlHolder').setStyle('display', 'none'); self.inputs[name].getParent('.ctrlHolder').setStyle('display', 'none');
self.inputs[name].addEvent('change', self.addEmpty.bind(self)) self.inputs[name].addEvent('change', self.addEmpty.bind(self));
}); });
@@ -1427,7 +1428,7 @@ Option.Combined = new Class({
'class': name, 'class': name,
'text': self.labels[name], 'text': self.labels[name],
'title': self.descriptions[name] 'title': self.descriptions[name]
}).inject(head) }).inject(head);
}); });
@@ -1450,8 +1451,8 @@ Option.Combined = new Class({
var empty_count = 0; var empty_count = 0;
self.options.combine.each(function(name){ self.options.combine.each(function(name){
var input = ctrl_holder.getElement('input.' + name); var input = ctrl_holder.getElement('input.' + name);
if(input.get('value') == '' || input.get('type') == 'checkbox') if(input.get('value') === '' || input.get('type') == 'checkbox')
empty_count++ empty_count++;
}); });
has_empty += (empty_count == self.options.combine.length) ? 1 : 0; has_empty += (empty_count == self.options.combine.length) ? 1 : 0;
ctrl_holder[(empty_count == self.options.combine.length) ? 'addClass' : 'removeClass']('is_empty'); ctrl_holder[(empty_count == self.options.combine.length) ? 'addClass' : 'removeClass']('is_empty');
@@ -1516,10 +1517,9 @@ Option.Combined = new Class({
}, },
saveCombined: function(){ saveCombined: function(){
var self = this; var self = this,
temp = {};
var temp = {};
self.items.each(function(item, nr){ self.items.each(function(item, nr){
self.options.combine.each(function(name){ self.options.combine.each(function(name){
var input = item.getElement('input.'+name); var input = item.getElement('input.'+name);
@@ -1528,7 +1528,7 @@ Option.Combined = new Class({
if(!temp[name]) temp[name] = []; if(!temp[name]) temp[name] = [];
temp[name][nr] = input.get('type') == 'checkbox' ? +input.get('checked') : input.get('value').trim(); temp[name][nr] = input.get('type') == 'checkbox' ? +input.get('checked') : input.get('value').trim();
}) });
}); });
self.options.combine.each(function(name){ self.options.combine.each(function(name){
@@ -1536,7 +1536,7 @@ Option.Combined = new Class({
self.inputs[name].fireEvent('change'); self.inputs[name].fireEvent('change');
}); });
self.addEmpty() self.addEmpty();
}, },
@@ -1559,10 +1559,10 @@ var createTooltip = function(description){
var tip = new Element('div.tooltip', { var tip = new Element('div.tooltip', {
'events': { 'events': {
'mouseenter': function(){ 'mouseenter': function(){
tip.addClass('shown') tip.addClass('shown');
}, },
'mouseleave': function(){ 'mouseleave': function(){
tip.removeClass('shown') tip.removeClass('shown');
} }
} }
}).adopt( }).adopt(

View File

@@ -1,162 +0,0 @@
html {
line-height: 1.5;
font-family: "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif;
font-size: 14px;
}
* {
margin: 0;
padding: 0;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
h1, h2, h3, h4, h5 {
clear: both;
font-size: 14px;
}
h1 {
font-size: 25px;
padding: 20px 40px;
}
h2 {
font-size: 20px;
}
pre {
background: #eee;
font-family: monospace;
margin: 0;
padding: 10px;
width: 100%;
display: block;
font-size: 12px;
}
.api, .missing {
overflow: hidden;
border-bottom: 1px solid #eee;
padding: 40px;
}
.api:hover {
color: #000;
}
.api .description {
color: #333;
padding: 0 0 5px;
}
.api .params {
background: #fafafa;
width: 100%;
}
.api h3 {
clear: both;
float: left;
width: 100px;
}
.api .params {
float: left;
width: 700px;
}
.api .params td, .api .params th {
padding: 3px 5px;
border-bottom: 1px solid #eee;
}
.api .params tr:last-child td, .api .params tr:last-child th {
border: 0;
}
.api .params .param {
vertical-align: top;
}
.api .params .param th {
text-align: left;
width: 100px;
}
.api .param .type {
font-style: italic;
margin-right: 10px;
width: 100px;
color: #666;
}
.api .return {
float: left;
width: 700px;
}
.database {
padding: 20px;
margin: 0;
}
.database * {
margin: 0;
padding: 0;
}
.database .nav {
}
.database .nav li {
display: inline-block;
}
.database .nav li a {
padding: 5px;
}
.database table {
font-size: 11px;
}
.database table th {
text-align: left;
}
.database table tr:hover {
position: relative;
z-index: 20;
}
.database table td {
vertical-align: top;
position: relative;
}
.database table .id {
width: 100px;
}
.database table ._rev {
width: 60px;
}
.database table ._t {
width: 60px;
}
.database table .form {
width: 600px;
}
.database table form {
width: 600px;
}
.database textarea {
font-size: 12px;
width: 100%;
height: 200px;
}
.database input[type=submit] {
display: block;
}

View File

@@ -0,0 +1,154 @@
@import "mixins";
.api_docs {
h1 {
font-size: 25px;
padding: 20px 40px;
}
pre {
background: #eee;
font-family: monospace;
margin: 0;
padding: 10px;
width: 100%;
display: block;
font-size: 12px;
}
body {
display: block;
overflow: auto;
background-color: #FFF;
}
.api, .missing {
overflow: hidden;
border-bottom: 1px solid #eee;
padding: 40px;
}
.api {
&:hover {
color: #000;
}
.description {
color: #333;
padding: 0 0 5px;
}
.params {
background: #fafafa;
width: 100%;
h3 {
clear: both;
float: left;
width: 100px;
}
td, th {
padding: 3px 5px;
border-bottom: 1px solid #eee;
}
tr:last-child td, tr:last-child th {
border: 0;
}
.param {
vertical-align: top;
th {
text-align: left;
width: 100px;
}
.type {
font-style: italic;
margin-right: 10px;
width: 100px;
color: #666;
}
}
.return {
float: left;
width: 700px;
}
}
}
.database {
padding: 20px;
margin: 0;
* {
margin: 0;
padding: 0;
}
.nav {
li {
display: inline-block;
a {
padding: 5px;
}
}
}
}
.database table {
font-size: 11px;
th {
text-align: left;
}
tr:hover {
position: relative;
z-index: 20;
}
td {
vertical-align: top;
position: relative;
}
.id {
width: 100px;
}
._rev {
width: 60px;
}
._t {
width: 60px;
}
.form {
width: 600px;
}
form {
width: 600px;
}
textarea {
font-size: 12px;
width: 100%;
height: 200px;
}
input[type=submit] {
display: block;
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,100 @@
/* Fonts */
@font-face {
font-family: 'icons';
src: url('../fonts/icons.eot?74719534');
src: url('../fonts/icons.eot?74719534#iefix') format('embedded-opentype'),
url('../fonts/icons.woff?74719534') format('woff'),
url('../fonts/icons.ttf?74719534') format('truetype'),
url('../fonts/icons.svg?74719534#icons') format('svg');
font-weight: normal;
font-style: normal;
}
[class^="icon-"]:before, [class*=" icon-"]:before {
font-family: "icons";
font-style: normal;
font-weight: normal;
speak: none;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-left-arrow:before { content: '\e800'; }
.icon-settings:before { content: '\e801'; }
.icon-search:before { content: '\e802'; }
.icon-dots:before { content: '\e803'; }
.icon-filter:before { content: '\e804'; }
.icon-thumb:before { content: '\e805'; }
.icon-list:before { content: '\e806'; }
.icon-notifications:before { content: '\e807'; }
.icon-emo-cry:before { content: '\e808'; }
.icon-emo-coffee:before { content: '\e809'; }
.icon-emo-sunglasses:before { content: '\e80a'; }
@font-face {
font-family: 'OpenSans';
src: url('../fonts/OpenSans-Light-webfont.eot');
src: url('../fonts/OpenSans-Light-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/OpenSans-Light-webfont.woff') format('woff'),
url('../fonts/OpenSans-Light-webfont.ttf') format('truetype'),
url('../fonts/OpenSans-Light-webfont.svg#OpenSansRegular') format('svg');
font-weight: 200;
font-style: normal;
}
@font-face {
font-family: 'OpenSans';
src: url('../fonts/OpenSans-Regular-webfont.eot');
src: url('../fonts/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/OpenSans-Regular-webfont.woff') format('woff'),
url('../fonts/OpenSans-Regular-webfont.ttf') format('truetype'),
url('../fonts/OpenSans-Regular-webfont.svg#OpenSansRegular') format('svg');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'OpenSans';
src: url('../fonts/OpenSans-Italic-webfont.eot');
src: url('../fonts/OpenSans-Italic-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/OpenSans-Italic-webfont.woff') format('woff'),
url('../fonts/OpenSans-Italic-webfont.ttf') format('truetype'),
url('../fonts/OpenSans-Italic-webfont.svg#OpenSansItalic') format('svg');
font-weight: normal;
font-style: italic;
}
@font-face {
font-family: 'OpenSans';
src: url('../fonts/OpenSans-Bold-webfont.eot');
src: url('../fonts/OpenSans-Bold-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/OpenSans-Bold-webfont.woff') format('woff'),
url('../fonts/OpenSans-Bold-webfont.ttf') format('truetype'),
url('../fonts/OpenSans-Bold-webfont.svg#OpenSansBold') format('svg');
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'OpenSans';
src: url('../fonts/OpenSans-BoldItalic-webfont.eot');
src: url('../fonts/OpenSans-BoldItalic-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/OpenSans-BoldItalic-webfont.woff') format('woff'),
url('../fonts/OpenSans-BoldItalic-webfont.ttf') format('truetype'),
url('../fonts/OpenSans-BoldItalic-webfont.svg#OpenSansBoldItalic') format('svg');
font-weight: bold;
font-style: italic;
}
@font-face {
font-family: 'Lobster';
src: url('../fonts/Lobster-webfont.eot');
src: url('../fonts/Lobster-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/Lobster-webfont.woff2') format('woff2'),
url('../fonts/Lobster-webfont.woff') format('woff'),
url('../fonts/Lobster-webfont.ttf') format('truetype'),
url('../fonts/Lobster-webfont.svg#lobster_14regular') format('svg');
font-weight: normal;
font-style: normal;
}

View File

@@ -0,0 +1,59 @@
@import "mixins";
/*** Login ***/
.page.login {
display: block;
background: $primary_color;
h1 {
padding: 0 0 10px;
font-size: 60px;
font-family: Lobster;
font-weight: normal;
color: #FFF;
text-align: center;
}
form {
padding: 0;
height: 300px;
width: 400px;
position: fixed;
left: 50%;
top: 50%;
margin: -200px 0 0 -200px;
}
.ctrlHolder {
padding: 0;
margin: 0 0 20px;
&:hover {
background: none;
}
}
input[type=text],
input[type=password] {
width: 100% !important;
font-size: 25px;
padding: 14px !important;
}
.remember_me {
font-size: 15px;
float: left;
width: 150px;
padding: 20px 0;
.check {
margin: 5px 5px 0 0;
}
}
.button {
font-size: 25px;
padding: 20px;
float: right;
}
}

View File

@@ -0,0 +1,504 @@
@import "fonts";
@import "mixins";
* {
margin: 0;
padding: 0;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
body, html {
font-size: 14px;
line-height: 1.5;
font-family: OpenSans, "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif;
font-weight: 300;
height: 100%;
margin: 0;
padding: 0;
background: $menu_color;
overflow: hidden;
}
body {
@include flexbox();
flex-flow: row nowrap;
}
a {
text-decoration: none;
}
input, textarea, select {
font-size: 1em;
font-weight: 300;
padding: $padding/6 $padding/4;
background: $background_color;
border: 1px solid #f2f2f2;
}
.button {
color: $primary_color;
font-weight: 300;
padding: $padding/4;
cursor: pointer;
border: 1px solid $primary_color;
border-radius: $border_radius;
margin: 0 $padding/4;
&:hover {
background: $primary_color;
color: $background_color;
}
}
/* Header */
.header {
width: $header_width;
min-width: $header_width;
position: relative;
a {
color: #FFF;
letter-spacing: 1px;
}
.navigation {
.logo {
background: $primary_color;
display: block;
text-align: center;
position: relative;
font-family: Lobster, serif;
color: #FFF;
font-size: 38px;
line-height: $header_height;
height: $header_height;
span {
position: absolute;
display: block;
height: 100%;
left: 50%;
@include transition(all 200ms $cubic);
@include translateX(-50%);
&:nth-child(even){
@include translateX(45%);
opacity: 0;
}
}
&:hover {
span{
@include translateX(-153%);
opacity: 0;
&:nth-child(even){
@include translateX(-50%);
opacity: 1;
}
}
}
}
ul {
padding: 0;
margin: 0;
li a {
padding: $padding/2 $padding;
display: block;
}
}
}
.menu, .search_form, .notification_menu {
position: absolute;
z-index: 200;
bottom: $padding / 3;
width: 44px;
height: 44px;
> a {
display: inline-block;
height: 100%;
width: 100%;
text-align: center;
line-height: 44px;
}
}
.notification_menu {
left: 50%;
@include translateX(-50%);
.button:before {
font-size: 20px;
top: -2px;
}
.wrapper {
width: 320px;
}
ul {
min-height: 60px;
max-height: 300px;
overflow: auto;
&:empty:after {
content: 'No notifications (yet)';
width: 100%;
position: absolute;
line-height: 60px;
font-size: 15px;
font-style: italic;
opacity: .4;
left: $padding * 2;
}
&:empty:before {
content: '\e808';
font-family: "icons";
height: 100%;
line-height: 60px;
margin-left: $padding;
text-align: center;
opacity: .4;
}
}
}
.menu {
left: $padding / 3;
.button:before {
font-size: 20px;
top: -2px;
}
}
.search_form {
right: $padding / 3;
}
.more_menu {
.wrapper {
bottom: 0;
left: 44px;
right: auto;
padding-left: 4px;
}
}
}
/* Content */
.content {
@include flex(1 auto);
background: $background_color;
border-radius: $border_radius 0 0 $border_radius;
overflow: hidden;
h1, h2, h3 {
padding: 0;
margin: 0;
}
.pages {
height: 100%;
width: 100%;
overflow: hidden;
position: relative;
}
.footer {
position: fixed;
bottom: 0;
height: $padding;
width: 100%;
}
}
/* Page */
.page {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
display: none;
padding: $padding 0;
overflow: auto;
&.active {
display: block;
}
.navigation {
@include flexbox();
position: fixed;
top: 0;
height: $header_height;
left: $header_width;
right: 0;
background: $background_color;
border-radius: $border_radius 0 0 0;
z-index: 100;
ul {
@include flex(1 auto);
list-style: none;
li {
display: inline-block;
a {
font-size: 24px;
line-height: $header_height;
padding: $padding;
color: rgba(0,0,0,.5);
}
}
.active a {
color: #000;
}
}
}
}
/* Page levels */
@for $i from 1 through 4 {
.level_#{$i} {
z-index: #{$i * 10};
}
}
/* Menu basis */
.more_menu {
position: relative;
line-height: 1em;
.button {
font-size: 24px;
cursor: pointer;
display: inline-block;
&:before {
position: relative;
}
}
.wrapper {
display: none;
position: absolute;
right: 0;
background: $primary_color;
z-index: 5000;
box-shadow: 0 0 15px 2px rgba(0,0,0,.15);
border-radius: $border_radius 0 0 $border_radius;
&:before {
@include transform(rotate(45deg) translateY(-60%));
content: '';
display: block;
position: absolute;
background: $primary_color;
height: 10px;
width: 10px;
left: -9px;
bottom: 11px;
z-index: 1;
opacity: 0;
border-radius: 2px;
// border: 8px solid $primary_color;
// border-color: transparent $primary_color transparent transparent;
}
ul {
@include transform(translateZ(0));
background: $background_color;
position: relative;
z-index: 2;
overflow: hidden;
border-radius: $border_radius 0 0 $border_radius;
}
ul li {
display: block;
line-height: 1em;
a {
display: block;
color: $text_color;
padding: $padding/4 $padding/2;
font-size: 1em;
line-height: 22px;
white-space: nowrap;
}
&:first-child a {
padding-top: $padding/2;
}
&:last-child a {
padding-bottom: $padding/2;
}
}
}
&.show {
.wrapper {
display: block;
&:before {
opacity: 1;
}
}
}
}
/* Messages */
.messages {
position: fixed;
right: 0;
bottom: 0;
width: 320px;
z-index: 20;
overflow: hidden;
font-size: 14px;
font-weight: bold;
padding: 5px;
.message {
overflow: hidden;
transition: all .6s cubic-bezier(0.9,0,0.1,1);
width: 100%;
position: relative;
max-height: 0;
font-size: 1.1em;
font-weight: normal;
transform: scale(0);
background: $primary_color;
margin-bottom: 4px;
border-radius: $border_radius;
box-shadow: 0 0 15px 2px rgba(0,0,0,.15);
.inner {
padding: 15px 30px 15px 20px;
background: $background_color;
margin-bottom: 4px;
border-radius: $border_radius;
}
&.sticky {
background-color: $primary_color;
}
&.show {
max-height: 100px;
transform: scale(1);
}
&.hide {
max-height: 0;
padding: 0 20px;
margin: 0;
transform: scale(0);
}
}
.close {
position: absolute;
padding: 10px 8px;
top: 0;
right: 0;
color: #FFF;
}
}
/* Mask */
.mask{
background: rgba(0,0,0, .8);
z-index: 100;
text-align: center;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
$spinner_size: 22px;
.spinner {
position: absolute;
top: 50%;
left: 50%;
width: $spinner_size;
height: $spinner_size;
display: block;
background: white;
margin-top: -($spinner_size/2);
margin-left: -($spinner_size/2);
outline: 1px solid transparent;
@include animation(rotating 2.5s $cubic infinite normal);
}
}
@keyframes rotating {
0% {
@include transform(rotate(0deg) scale(1.6));
border-radius: 1px;
}
48% {
@include transform(rotate(360deg) scale(1));
border-radius: 50%;
}
52% {}
100% {
@include transform(rotate(720deg) scale(1.6));
border-radius: 1px;
}
}
.table {
.head {
font-weight: bold;
}
.item {
@include flexbox();
border-bottom: 1px solid rgba(0,0,0,.2);
&:last-child {
border-bottom: none;
}
span {
padding: 1px 2px;
&:first-child {
padding-left: 0;
}
&:last-child {
padding-right: 0;
}
}
}
}

View File

@@ -0,0 +1,83 @@
$primary_color: #ac0000;
$secondary_color: #00d2c2;
$background_color: #FFF;
$menu_color: #111;
$theme_off: #eaeaea;
$text_color: #000;
$header_height: 80px;
$header_width: 132px;
$padding: 20px;
$border_radius: 3px;
$cubic: cubic-bezier(0.9,0,0.1,1);
@import "susy";
@import "compass/css3/transition";
@import "compass/css3/transform";
@import "compass/css3/animation";
$susy: (
columns: 24,
gutters: 70px/70px
);
$mq-phone: 320px !default;
$mq-phablet: 480px !default;
$mq-tablet: 768px !default;
$mq-desktop: 1024px !default;
$mq-desktop-plus: 1382px !default;
@mixin media-phone {
@media (max-width : $mq-phone) {
@content;
}
}
@mixin media-phablet {
@media (max-width : $mq-phablet) {
@content;
}
}
@mixin media-tablet {
@media (max-width : $mq-tablet) {
@content;
}
}
@mixin media-desktop {
@media (max-width : $mq-desktop) {
@content;
}
}
@mixin media-desktop-plus {
@media (max-width : $mq-desktop-plus) {
@content;
}
}
@mixin flexbox() {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
}
@mixin flex($values) {
-webkit-box-flex: $values;
-moz-box-flex: $values;
-webkit-flex: $values;
-ms-flex: $values;
flex: $values;
}
@mixin order($val) {
-webkit-box-ordinal-group: $val;
-moz-box-ordinal-group: $val;
-ms-flex-order: $val;
-webkit-order: $val;
order: $val;
}

View File

@@ -262,7 +262,6 @@
padding: 5px 3px; padding: 5px 3px;
margin: 0; margin: 0;
width: 30%; width: 30%;
border-radius: 3px;
} }
.page .input.xsmall { width: 5% } .page .input.xsmall { width: 5% }
.page .input.small { width: 10% } .page .input.small { width: 10% }

View File

@@ -1,8 +1,8 @@
{% autoescape None %} {% autoescape None %}
<!doctype html> <!doctype html>
<html> <html class="api_docs">
<head> <head>
<link rel="stylesheet" href="{{ Env.get('static_path') }}style/api.css" type="text/css"> <link rel="stylesheet" href="{{ Env.get('static_path') }}style/combined.min.css" type="text/css">
<title>API documentation</title> <title>API documentation</title>
</head> </head>
<body> <body>

View File

@@ -2,37 +2,41 @@
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<meta name="mobile-web-app-capable" content="yes"> <meta name="mobile-web-app-capable" content="yes">
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
{% for url in fireEvent('clientscript.get_styles', as_html = True, location = 'front', single = True) %} {% for url in fireEvent('clientscript.get_styles', location = 'front', single = True) %}
<link rel="stylesheet" href="{{ Env.get('web_base') }}{{ url }}" type="text/css">{% end %} <link data-url="{{ url }}" rel="stylesheet" href="{{ Env.get('web_base') }}{{ url }}" type="text/css">{% end %}
{% for url in fireEvent('clientscript.get_scripts', as_html = True, location = 'front', single = True) %} {% for url in fireEvent('clientscript.get_scripts', location = 'front', single = True) %}
<script type="text/javascript" src="{{ Env.get('web_base') }}{{ url }}"></script>{% end %} <script type="text/javascript" src="{{ Env.get('web_base') }}{{ url }}"></script>{% end %}
{% for url in fireEvent('clientscript.get_scripts', as_html = True, location = 'head', single = True) %} {% for url in fireEvent('clientscript.get_scripts', location = 'head', single = True) %}
<script type="text/javascript" src="{{ Env.get('web_base') }}{{ url }}"></script>{% end %} <script type="text/javascript" src="{{ Env.get('web_base') }}{{ url }}"></script>{% end %}
{% for url in fireEvent('clientscript.get_styles', as_html = True, location = 'head', single = True) %} {% for url in fireEvent('clientscript.get_styles', location = 'head', single = True) %}
<link rel="stylesheet" href="{{ Env.get('web_base') }}{{ url }}" type="text/css">{% end %} <link data-url="{{ url }}" rel="stylesheet" href="{{ Env.get('web_base') }}{{ url }}" type="text/css">{% end %}
<link href="{{ Env.get('static_path') }}images/favicon.ico" rel="icon" type="image/x-icon" /> <link href="{{ Env.get('static_path') }}images/favicon.ico" rel="icon" type="image/x-icon" />
<link rel="apple-touch-icon" href="{{ Env.get('static_path') }}images/homescreen.png" /> <link rel="apple-touch-icon" href="{{ Env.get('static_path') }}images/homescreen.png" />
<script type="text/javascript" src="https://www.youtube.com/player_api" defer="defer"></script> {% if Env.get('dev') %}
<script src="//localhost:35729/livereload.js?snipver=1"></script>
{% end %}
<script type="text/javascript" src="//www.youtube.com/player_api" defer="defer"></script>
<script type="text/javascript"> <script type="text/javascript">
window.addEvent('load', function(){ window.addEvent('load', function(){
if(window.getSize().x <= 480) if(window.getSize().x <= 480)
setTimeout(function(){ setTimeout(function(){
window.scrollTo(0, 1); window.scrollTo(0, 1);
window.scrollTo(0, 0); window.scrollTo(0, 0);
}, 100); }, 100);
}); });
window.addEvent('domready', function() { window.addEvent('domready', function() {

View File

@@ -8,15 +8,21 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="robots" content="noindex, nofollow" /> <meta name="robots" content="noindex, nofollow" />
{% for url in fireEvent('clientscript.get_styles', as_html = True, location = 'front', single = True) %} {% for url in fireEvent('clientscript.get_styles', location = 'front', single = True) %}
<link rel="stylesheet" href="{{ Env.get('web_base') }}{{ url }}" type="text/css">{% end %} <link data-url="{{ url }}" rel="stylesheet" href="{{ Env.get('web_base') }}{{ url }}" type="text/css">{% end %}
{% for url in fireEvent('clientscript.get_scripts', location = 'front', single = True) %}
{% for url in fireEvent('clientscript.get_scripts', as_html = True, location = 'front', single = True) %}
<script type="text/javascript" src="{{ Env.get('web_base') }}{{ url }}"></script>{% end %} <script type="text/javascript" src="{{ Env.get('web_base') }}{{ url }}"></script>{% end %}
{% for url in fireEvent('clientscript.get_styles', location = 'head', single = True) %}
<link data-url="{{ url }}" rel="stylesheet" href="{{ Env.get('web_base') }}{{ url }}" type="text/css">{% end %}
<link href="{{ Env.get('static_path') }}images/favicon.ico" rel="icon" type="image/x-icon" /> <link href="{{ Env.get('static_path') }}images/favicon.ico" rel="icon" type="image/x-icon" />
<link rel="apple-touch-icon" href="{{ Env.get('static_path') }}images/homescreen.png" /> <link rel="apple-touch-icon" href="{{ Env.get('static_path') }}images/homescreen.png" />
{% if Env.get('dev') %}
<script src="//localhost:35729/livereload.js?snipver=1"></script>
{% end %}
<script type="text/javascript"> <script type="text/javascript">
window.addEvent('domready', function(){ window.addEvent('domready', function(){

25
package.json Normal file
View File

@@ -0,0 +1,25 @@
{
"name": "couchpotato_develop",
"repository": {
"type": "git",
"url": ""
},
"scripts": {
"start": "grunt"
},
"dependencies": {
},
"devDependencies": {
"grunt": "~0.4.5",
"grunt-autoprefixer": "^2.0.0",
"grunt-concurrent": "~1.0.0",
"grunt-contrib-cssmin": "~0.10.0",
"grunt-contrib-jshint": "~0.10.0",
"grunt-contrib-sass": "^0.8.1",
"grunt-contrib-uglify": "~0.6.0",
"grunt-contrib-watch": "~0.6.1",
"jshint-stylish": "^1.0.0",
"time-grunt": "^1.0.0",
"grunt-shell": "^1.1.1"
}
}