From 8e36b7596aa06ccd6d9db1f0405c097a0219818c Mon Sep 17 00:00:00 2001 From: putskoo Date: Mon, 9 Sep 2013 01:24:14 +0300 Subject: [PATCH] stub data added, zenpen source and basic initializatino added --- Gruntfile.js | 47 +- data.json | 1659 ++++++++++++++++++++ public/css/fonts/icomoon.dev.svg | 38 + public/css/fonts/icomoon.eot | Bin 0 -> 2544 bytes public/css/fonts/icomoon.svg | 38 + public/css/fonts/icomoon.ttf | Bin 0 -> 2380 bytes public/css/fonts/icomoon.woff | Bin 0 -> 2664 bytes public/fonts/icomoon.dev.svg | 38 + public/fonts/icomoon.eot | Bin 0 -> 2544 bytes public/fonts/icomoon.svg | 38 + public/fonts/icomoon.ttf | Bin 0 -> 2380 bytes public/fonts/icomoon.woff | Bin 0 -> 2664 bytes scripts/app.js | 23 +- scripts/controllers/calendar-controller.js | 86 +- scripts/controllers/details-controller.js | 6 +- scripts/controllers/edit-controller.js | 13 + scripts/services/data-provider.js | 51 +- server.js | 122 +- styles/fonts/icomoon.dev.svg | 38 + styles/fonts/icomoon.eot | Bin 0 -> 2544 bytes styles/fonts/icomoon.svg | 38 + styles/fonts/icomoon.ttf | Bin 0 -> 2380 bytes styles/fonts/icomoon.woff | Bin 0 -> 2664 bytes vendor/zenpen/css/fonts.css | 60 + vendor/zenpen/css/style.css | 496 ++++++ vendor/zenpen/js/editor.js | 346 ++++ vendor/zenpen/js/libs/Blob.js | 166 ++ vendor/zenpen/js/libs/FileSaver.min.js | 2 + vendor/zenpen/js/libs/fullScreen.js | 96 ++ vendor/zenpen/js/libs/head.min.js | 17 + vendor/zenpen/js/ui.js | 376 +++++ vendor/zenpen/js/utils.js | 29 + views/calendar-page.html | 10 +- views/details-page.html | 13 +- views/edit-page.html | 32 + views/index.html | 24 + 36 files changed, 3786 insertions(+), 116 deletions(-) create mode 100644 data.json create mode 100644 public/css/fonts/icomoon.dev.svg create mode 100644 public/css/fonts/icomoon.eot create mode 100644 public/css/fonts/icomoon.svg create mode 100644 public/css/fonts/icomoon.ttf create mode 100644 public/css/fonts/icomoon.woff create mode 100644 public/fonts/icomoon.dev.svg create mode 100644 public/fonts/icomoon.eot create mode 100644 public/fonts/icomoon.svg create mode 100644 public/fonts/icomoon.ttf create mode 100644 public/fonts/icomoon.woff create mode 100644 scripts/controllers/edit-controller.js create mode 100644 styles/fonts/icomoon.dev.svg create mode 100644 styles/fonts/icomoon.eot create mode 100644 styles/fonts/icomoon.svg create mode 100644 styles/fonts/icomoon.ttf create mode 100644 styles/fonts/icomoon.woff create mode 100644 vendor/zenpen/css/fonts.css create mode 100644 vendor/zenpen/css/style.css create mode 100644 vendor/zenpen/js/editor.js create mode 100644 vendor/zenpen/js/libs/Blob.js create mode 100644 vendor/zenpen/js/libs/FileSaver.min.js create mode 100644 vendor/zenpen/js/libs/fullScreen.js create mode 100644 vendor/zenpen/js/libs/head.min.js create mode 100644 vendor/zenpen/js/ui.js create mode 100644 vendor/zenpen/js/utils.js create mode 100644 views/edit-page.html diff --git a/Gruntfile.js b/Gruntfile.js index 81eee88..a2c53ef 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -56,15 +56,26 @@ module.exports = function(grunt) { concat: { development: { - src: [ - 'bower_components/jquery/jquery.js', - 'bower_components/angular/angular.js', - 'bower_components/angular-route/angular-route.js', - 'bower_components/angular-resource/angular-resource.js', - 'bower_components/angular-cookies/angular-cookies.js', - 'bower_components/angular-sanitize/angular-sanitize.js' - ], - dest: 'public/js/core.js' + files: { + 'public/js/core.js': [ + 'bower_components/jquery/jquery.js', + 'bower_components/angular/angular.js', + 'bower_components/angular-route/angular-route.js', + 'bower_components/angular-resource/angular-resource.js', + 'bower_components/angular-cookies/angular-cookies.js', + 'bower_components/angular-sanitize/angular-sanitize.js', + 'vendor/zenpen/js/libs/Blob.js', + 'vendor/zenpen/js/libs/FileSaver.js', + 'vendor/zenpen/js/libs/fullScreen.js', + 'vendor/zenpen/js/utils.js', + //'vendor/zenpen/js/ui.js', + 'vendor/zenpen/js/editor.js' + ], + 'public/css/vendor.css': [ + 'vendor/zenpen/css/fonts.css', + 'vendor/zenpen/css/style.css' + ] + } }, production: { @@ -73,10 +84,20 @@ module.exports = function(grunt) { copy: { development: { - expand: true, - cwd: './scripts/', - src: '{,**/}*.js', - dest: './public/js/' + files: [ + { + expand: true, + cwd: './scripts/', + src: '{,**/}*.js', + dest: './public/js/' + }, + { + expand: true, + cwd: './styles/fonts/', + src: '**', + dest: './public/css/fonts/' + } + ] }, build: { files: { diff --git a/data.json b/data.json new file mode 100644 index 0000000..cc2475d --- /dev/null +++ b/data.json @@ -0,0 +1,1659 @@ +{ + "talks": [ + { + "_id": "1", + "date": "2\/22\/2013", + "title": "CSS via JS", + "lector": ["siarhei_mikhailau"], + "location": "N58", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Autem, tempore, consequuntur suscipit harum omnis neque vitae id voluptatem assumenda quam eos saepe nulla aliquid voluptas ut modi in minima debitis!", + "level": "D1-D5", + "notes": "", + "attendees": [ + "andrey_demchenko", + "veranika_mishurina", + "mikita_khatsimtsou", + "maryna_belavusava", + "nadzeya_pratasava", + "varely_zhurovich" + ], + "tags": [ + "css", + "js", + "prefix", + "xbrowser" + ] + }, + + + + { + "_id": "2", + "date": "2\/27\/2013", + "title": "CSS via JS", + "lector": ["siarhei_mikhailau"], + "location": "K1+K10", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. At, eveniet harum libero dolor iure nulla voluptatibus aperiam aliquam? Voluptas, qui, voluptatem rerum excepturi similique dolorum consectetur cumque quisquam expedita voluptate.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "aliaksandr_arlou", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "dmitry_beynya", + "maria_putyrskaya", + "viktor_busko", + "uladzimir_hartsau", + "aliaksei_yanachkin", + "tatsiana_hlebik", + "alena_karaba", + "anton_prokofyev" + ], + "tags": [ + "css", + "js", + "prefix", + "xbrowser" + ] + }, + + + { + "_id": "3", + "date": "2\/27\/2013", + "title": "CSS via JS", + "lector": ["siarhei_mikhailau"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quibusdam, dolorem, quisquam, quo officiis voluptatem doloribus repudiandae reprehenderit dolor excepturi hic culpa quidem fugit nulla animi voluptas. Aspernatur perspiciatis pariatur voluptatibus.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "dzmitry_osipau", + "raman_vysotski", + "aliaksandr_kurash", + "ivan_straltsou", + "andrei_valuyev", + "nikolay_zhgirovsky", + "kirill_malets", + "siarhei_mikulich", + "anton_sharapa", + "aleh_nadolskiy", + "aliaksei_tryputsen", + "andrew_krook" + ], + "tags": [ + "css", + "js", + "prefix", + "xbrowser" + ] + }, + + + { + "_id": "4", + "date": "2\/25\/2013", + "title": "Tetris", + "lector": ["siarhei_mikhailau"], + "location": "N58", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eos, maiores facilis natus sapiente ex optio inventore ad quam veritatis atque cum quod laborum suscipit aut aperiam nihil itaque minus nam.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "andrey_demchenko", + "veranika_mishurina", + "mikita_khatsimtsou", + "maryna_belavusava", + "nadzeya_pratasava", + "varely_zhurovich" + ], + "tags": [ + "talk", + "algorithm", + "game" + ] + }, + + + + { + "_id": "7", + "date": "4\/12\/2013", + "title": "noJS framework or \":checked\"", + "lector": ["siarhei_mikhailau"], + "location": "N58", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis, illo, a molestias tenetur facere commodi cum voluptatem laborum beatae itaque soluta voluptatum molestiae deserunt quisquam laudantium nihil sapiente. Sit, facere.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "andrey_demchenko", + "mikita_khatsimtsou", + "maryna_belavusava", + "nadzeya_pratasava", + "varely_zhurovich" + ], + "tags": [ + "css", + "prototype" + ] + }, + + + { + "_id": "5", + "date": "3\/6\/2013", + "title": "Tetris", + "lector": ["siarhei_mikhailau"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Vitae quisquam nostrum aperiam. Ducimus, pariatur, at, quibusdam, reiciendis sint iure hic quisquam non id inventore laborum dolorem eaque ab repudiandae iste.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "dzmitry_osipau", + "aliaksandr_padabed", + "aliaksandr_kurash", + "ivan_straltsou", + "volha_bainova", + "nikolay_zhgirovsky", + "kirill_malets", + "siarhei_mikulich", + "anton_sharapa", + "aleh_nadolskiy", + "aliaksei_tryputsen", + "raman_vysotski", + "andrew_krook", + "kseniya_smirnova", + "andrei_valuyev", + "yulia_douha" + ], + "tags": [ + "talk", + "algorithm", + "game" + ] + }, + + + { + "_id": "6", + "date": "3\/5\/2013", + "title": "Tetris", + "lector": ["siarhei_mikhailau"], + "location": "K1+K10", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Autem, debitis, placeat, aut quibusdam at laboriosam ratione nulla nisi maxime iste enim deleniti ex officia sed qui? Praesentium sapiente voluptatum sint.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "aliaksandr_arlou", + "yauhen_karmyzau", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "maria_putyrskaya", + "viktor_busko", + "uladzimir_hartsau", + "aliaksei_yanachkin", + "tatsiana_hlebik", + "anton_prokofyev", + "ilya_kvachenko" + ], + "tags": [ + "talk", + "algorithm", + "game" + ] + }, + + + + { + "_id": "8", + "date": "4\/16\/2013", + "title": "Tetris", + "lector": ["siarhei_mikhailau"], + "location": "N186", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Placeat, qui, velit impedit libero non deserunt aliquid incidunt ipsam ducimus accusantium neque nihil voluptatum quis consequatur repellat deleniti similique inventore mollitia!", + "level": "D1-D5", + "notes": "", + "attendees": [ + "yauheni_pas", + "aliaksei_rubinau", + "tatsiana_petrushkevich", + "anton_raby", + "dzmitry_yurkavets" + ], + "tags": [ + "talk", + "algorithm", + "game" + ] + }, + + + { + "_id": "9", + "date": "3\/12\/2013", + "title": "Backbone", + "lector": ["aliaksandr_arlou"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia, necessitatibus, repellat, voluptate aliquid deserunt illum praesentium blanditiis eius sint ab placeat porro doloremque debitis impedit perspiciatis similique recusandae dolore! Sint.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "siarhei_mikhailau", + "raman_vysotski", + "aliaksandr_padabed", + "aliaksandr_kurash", + "ivan_straltsou", + "volha_bainova", + "andrei_valuyev", + "kseniya_smirnova", + "dzianis_ziankovich", + "anton_sharapa", + "aleh_nadolskiy", + "aliaksei_tryputsen", + "yury_tarasevich", + "andrew_krook", + "yulia_douha", + "yauhen_karmyzau", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "dzianis_kryvashei", + "viktor_busko", + "uladzimir_hartsau", + "aliaksei_yanachkin", + "alena_karaba", + "andrey_demchenko", + "mikita_khatsimtsou" + ], + "tags": [ + "backbone", + "mvc", + "js" + ] + + }, + + + { + "_id": "10", + "date": "3\/20\/2013", + "title": "NodeJS", + "lector": ["andrei_barysiuk"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam, officia similique in eaque accusamus voluptate quibusdam debitis possimus voluptatibus illum placeat quasi culpa cum numquam cumque modi ex. Inventore, itaque?", + "level": "D1-D5", + "notes": "", + "attendees": [ + "siarhei_mikhailau", + "dzmitry_osipau", + "stanislau_zubovich", + "aliaksandr_kurash", + "ivan_straltsou", + "volha_bainova", + "kseniya_smirnova", + "dzianis_ziankovich", + "siarhei_mikulich", + "anton_sharapa", + "aleh_nadolskiy", + "aliaksei_tryputsen", + "yury_tarasevich", + "andrew_krook", + "yulia_douha", + "yauhen_karmyzau", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "maria_putyrskaya", + "dzianis_kryvashei", + "viktor_busko", + "uladzimir_hartsau", + "aliaksei_yanachkin", + "alena_karaba", + "veranika_mishurina", + "mikita_khatsimtsou" + ], + "tags": [ + "nodejs", + "js", + "server", + "build", + "minify" + ] + }, + + + + { + "_id": "11", + "date": "3\/19\/2013", + "title": "Web Inspector", + "lector": ["siarhei_mikhailau"], + "location": "K1+K10", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Harum, sapiente, molestiae, minima, sunt ratione maiores quae aut nisi eaque adipisci eum dolorum totam ipsa esse alias incidunt id dicta quasi!", + "level": "D1-D5", + "notes": "", + "attendees": [ + "aliaksandr_arlou", + "yauhen_karmyzau", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "maria_putyrskaya", + "dzianis_kryvashei", + "viktor_busko", + "uladzimir_hartsau", + "aliaksei_yanachkin", + "alena_karaba", + "ilya_kvachenko" + ], + "tags": [ + "minify", + "js", + "dom", + "transform", + "algorithm", + "css", + "html" + ] + }, + + + { + "_id": "12", + "date": "3\/27\/2013", + "title": "Web Inspector", + "lector": ["siarhei_mikhailau"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci, cumque, voluptatum, placeat alias eos id nemo illum provident vero similique culpa molestias ipsa error ad saepe quo porro. Ab, ea.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "dzmitry_osipau", + "aliaksandr_padabed", + "aliaksandr_kurash", + "ivan_straltsou", + "volha_bainova", + "nikolay_zhgirovsky", + "kirill_malets", + "siarhei_mikulich", + "anton_sharapa", + "aleh_nadolskiy", + "aliaksei_tryputsen", + "yury_tarasevich", + "andrew_krook", + "stanislau_zubovich", + "andrei_valuyev", + "kseniya_smirnova", + "dzianis_ziankovich" + ], + "tags": [ + "minify", + "js", + "dom", + "transform", + "algorithm", + "css", + "html" + ] + }, + + { + "_id": "13", + "date": "4\/10\/2013", + "title": "Web Inspector", + "lector": ["siarhei_mikhailau"], + "location": "N186", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iusto, officia, nostrum porro possimus in itaque fuga incidunt tempore aspernatur et error reprehenderit vero perspiciatis a quod pariatur quo nobis veritatis.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "maksim_kovalev", + "siarhei_prudnikau", + "andrei_dzeuhuts", + "fyodor_yakimchouk", + "yauheni_pas", + "aliaksei_rubinau", + "tatsiana_petrushkevich", + "andrei_akula", + "anton_raby", + "dzmitry_yurkavets" + ], + "tags": [ + "minify", + "js", + "dom", + "transform", + "algorithm", + "css", + "html" + ] + }, + + { + "_id": "14", + "date": "4\/19\/2013", + "title": "Web Inspector", + "lector": ["siarhei_mikhailau"], + "location": "N58", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reiciendis, cumque, neque error nisi rerum cupiditate dolorum quaerat excepturi sapiente perspiciatis recusandae tempora voluptatem possimus mollitia accusamus consequuntur quas aut modi!", + "level": "D1-D5", + "notes": "", + "attendees": [ + "andrey_demchenko", + "veranika_mishurina", + "mikita_khatsimtsou", + "nadzeya_pratasava", + "iryna_dastanka" + ], + "tags": [ + "minify", + "js", + "dom", + "transform", + "algorithm", + "css", + "html" + ] + }, + + + { + "_id": "15", + "date": "3\/28\/2013", + "title": "CSS Flexbox", + "lector": ["maria_putyrskaya"], + "location": "K1+K10", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Provident architecto consectetur tempora perferendis explicabo assumenda molestiae mollitia voluptas. Molestiae, provident, similique dolorem autem consectetur ipsum doloribus hic vel consequuntur voluptates!", + "level": "D1-D5", + "notes": "", + "attendees": [ + "aliaksandr_arlou", + "yauhen_karmyzau", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "dmitry_beynya", + "dzianis_kryvashei", + "uladzimir_hartsau", + "siarhei_mikhailau" + ], + "tags": [ + "css", + "flex" + ] + }, + + + + { + "_id": "16", + "date": "4\/3\/2013", + "title": "Javascript Modularity", + "lector": ["andrei_barysiuk"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Expedita, fugiat temporibus cum illo inventore ex autem voluptas officia nulla sapiente assumenda quaerat ducimus ipsum sunt quis ut ea dignissimos aut.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "siarhei_mikhailau", + "dzianis_ziankovich", + "andrei_valuyev", + "aliaksei_tryputsen", + "dzmitry_osipau", + "anton_sharapa", + "dmitry_beynya", + "aleh_nadolskiy", + "aliaksandr_kurash", + "aliaksandr_padabed", + "yulia_douha", + "andrei_volkau1", + "nikolay_zhgirovsky", + "ivan_straltsou", + "kirill_malets", + "yury_tarasevich", + "stanislau_zubovich", + "anatoli_tsyporyn", + "dzianis_skliar", + "kseniya_smirnova", + "yauhen_tsikhan", + "aliaksandr_timbaliuc", + "aliaksandr_arlou", + "yauhen_karmyzau", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "dzianis_kryvashei", + "viktor_busko", + "maryia_sinkevich", + "mikita_khatsimtsou", + "pavel_valadzko", + "maksim_kovalev", + "igor_boreysha" + ], + "tags": [ + "amd", + "js", + "build", + "nodejs", + "requirejs", + "commonjs", + "lmd", + "module" + ] + }, + + + { + "_id": "17", + "date": "4\/24\/2013", + "title": "Chrome Extensions", + "lector": ["yauhen_karmyzau"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Numquam, non earum fugit facilis neque quasi natus error accusamus repellendus odio illum expedita consequuntur libero culpa at inventore voluptatibus placeat adipisci.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "kseniya_smirnova", + "aliaksandr_padabed", + "aleh_nadolskiy", + "stanislau_zubovich", + "aliaksei_patsiomkin", + "dzianis_ziankovich", + "yury_tarasevich", + "aliaksei_tryputsen", + "andrei_volkau1", + "dmitry_beynya", + "dmitry_scherbatykh", + "yauhen_tsikhan", + "olga_bedulina", + "kirill_malets", + "siarhei_mikulich", + "dzmitry_osipau", + "nikolay_zhgirovsky", + "volha_bainova", + "andrei_valuyev", + "anton_sharapa" + ], + "tags": [ + "chrome", + "extension", + "js" + ] + }, + + { + "_id": "18", + "date": "4\/4\/2013", + "title": "Chrome Extensions", + "lector": ["yauhen_karmyzau"], + "location": "K1+K10", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto, repellat natus dolor autem ullam consequuntur odit suscipit odio est ex! Quo, accusamus recusandae veritatis maxime numquam alias expedita at. Et.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "aliaksandr_arlou", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "dmitry_beynya", + "dzianis_kryvashei", + "uladzimir_hartsau", + "siarhei_mikhailau" + ], + "tags": [ + "chrome", + "extension", + "js" + ] + }, + + { + "_id": "19", + "date": "4\/26\/2013", + "title": "Chrome Extensions", + "lector": ["yauhen_karmyzau"], + "location": "N58", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab, praesentium, quas aliquam laudantium eum vero perferendis quam voluptatibus labore maxime neque totam nemo laborum accusantium sapiente asperiores error dolorum rerum?", + "level": "D1-D5", + "notes": "", + "attendees": [ + "andrey_demchenko", + "mikita_khatsimtsou", + "nadzeya_pratasava" + ], + "tags": [ + "chrome", + "extension", + "js" + ] + }, + + + { + "_id": "20", + "date": "4\/10\/2013", + "title": "Javascript Animation", + "lector": ["mikita_khatsimtsou"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate, nihil, aspernatur, veritatis eveniet deleniti vero dolores iste porro earum officiis quis numquam eligendi nemo libero voluptas dolor voluptates mollitia culpa.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "aliaksandr_kurash", + "aliaksandr_padabed", + "aliaksei_patsiomkin", + "aliaksei_tryputsen", + "andrei_volkau1", + "andrew_krook", + "maksim_kovalev", + "dmitry_scherbatykh", + "kseniya_smirnova", + "dzianis_skliar", + "dzmitry_osipau", + "ivan_straltsou", + "siarhei_mikulich", + "volha_bainova", + "yury_tarasevich", + "dmitry_beynya", + "aleh_nadolskiy", + "maxim_malets", + "dzianis_ziankovich", + "nikolay_zhgirovsky", + "stanislau_zubovich", + "olga_bedulina", + "aliaksandr_arlou", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "dzianis_kryvashei" + ], + "tags": [ + "js", + "timeout", + "interval", + "keyframe", + "animation" + ] + }, + + + { + "_id": "21", + "date": "4\/5\/2013", + "title": "Javascript Animation", + "lector": ["mikita_khatsimtsou"], + "location": "N58", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Saepe, consequatur, porro, autem nam culpa odit id iste expedita dolor incidunt hic repudiandae illo ipsam non est libero facere! Molestiae, praesentium!", + "level": "D1-D5", + "notes": "", + "attendees": [ + "andrey_demchenko", + "veranika_mishurina", + "maryna_belavusava", + "nadzeya_pratasava", + "varely_zhurovich", + "siarhei_mikhailau" + ], + "tags": [ + "js", + "timeout", + "interval", + "keyframe", + "animation" + ] + }, + + + + { + "_id": "22", + "date": "4\/11\/2013", + "title": "Sencha Intro", + "lector": ["uladzimir_hartsau"], + "location": "K1+K10", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis provident tempora ullam repellendus corrupti itaque corporis consectetur eius dignissimos sapiente. Corporis, recusandae illum molestias possimus pariatur eligendi magni architecto ipsum.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "aliaksandr_arlou", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "dmitry_beynya", + "dzianis_kryvashei", + "viktor_busko", + "aliaksei_yanachkin", + "anton_prokofyev", + "siarhei_mikhailau", + "dzianis_ziankovich" + ], + "tags": [ + "js", + "framework", + "mvc", + "todo" + ] + }, + + + + { + "_id": "23", + "date": "4\/17\/2013", + "title": "10 CSS Secrets", + "lector": ["siarhei_mikhailau"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iusto, corrupti, delectus distinctio dicta consectetur quod dolor soluta illo saepe obcaecati quo quas voluptate facere aliquam ea nulla aut omnis quisquam.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "dzianis_skliar", + "aliaksandr_kurash", + "siarhei_mikulich", + "kirill_malets", + "olga_bedulina", + "volha_bainova", + "dmitry_beynya", + "dmitry_scherbatykh", + "nikolay_zhgirovsky", + "anatoli_tsyporyn", + "aliaksei_tryputsen", + "aliaksei_patsiomkin", + "anton_sharapa", + "kseniya_smirnova", + "maria_prinus", + "yury_tarasevich", + "stanislau_zubovich", + "aleh_nadolskiy", + "aliaksandr_padabed", + "dzmitry_osipau", + "yulia_douha", + "andrei_valuyev", + "yauhen_tsikhan", + "andrew_krook", + "maxim_malets" + ], + "tags": [ + "css", + "leaverou", + "transform", + "transition", + "shadow" + ] + }, + + { + "_id": "24", + "date": "4\/18\/2013", + "title": "10 CSS Secrets", + "lector": ["siarhei_mikhailau"], + "location": "K1+K10", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus, aspernatur quis natus facilis ex corporis qui tempore sint obcaecati sed. Doloribus, temporibus assumenda ex animi porro at illo delectus tempora.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "aliaksandr_arlou", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "maria_putyrskaya", + "dzianis_kryvashei", + "viktor_busko", + "uladzimir_hartsau", + "aliaksei_yanachkin", + "anton_prokofyev" + ], + "tags": [ + "css", + "leaverou", + "transform", + "transition", + "shadow" + ] + }, + + + + + { + "_id": "25", + "date": "4\/23\/2013", + "title": "Widgets for Windows", + "lector": ["andrei_dzeuhuts"], + "location": "N186", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. At, velit, ratione, vel, ea debitis incidunt minus rem est nostrum aut impedit voluptates sed nesciunt aliquam assumenda placeat ducimus tenetur voluptatem.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "yauheni_pas", + "aliaksei_rubinau", + "fyodor_yakimchouk" + ], + "tags": [ + "css", + "html", + "js", + "widget", + "windows8", + "desktop" + ] + }, + + + + + + { + "_id": "26", + "date": "4\/25\/2013", + "title": "Knockout.js", + "lector": ["khrystsina_tsikhanovich", "nadzeya_shedava"], + "location": "K1+K10", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Assumenda, rerum, illo, repudiandae natus qui nostrum voluptates ex cupiditate eaque expedita ea ad accusamus rem ullam sequi. Commodi, sunt dolor recusandae!", + "level": "D1-D5", + "notes": "", + "attendees": [ + "aliaksandr_arlou", + "yauhen_karmyzau", + "maria_putyrskaya", + "dzianis_kryvashei", + "uladzimir_hartsau", + "aliaksei_yanachkin", + "anton_prokofyev", + "siarhei_mikhailau" + ], + "tags": [ + "js", + "knockout", + "mvvm", + "todo" + ] + }, + + + + { + "_id": "27", + "date": "4\/30\/2013", + "title": "Hackaton", + "lector": ["siarhei_mikhailau"], + "location": "K1+K10", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laudantium, sed, earum explicabo quam voluptas nobis vero maiores deserunt nemo suscipit reprehenderit distinctio! Porro, ut nobis sed voluptate doloremque ad excepturi.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "yauhen_karmyzau", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "maria_putyrskaya", + "viktor_busko", + "uladzimir_hartsau", + "aliaksei_yanachkin" + ], + "tags": [ + "js", + "css", + "hackaton", + "html", + "transform", + "transition" + ] + }, + + + { + "_id": "28", + "date": "5\/2\/2013", + "title": "Semantic", + "lector": ["siarhei_mikhailau", "aliaksei_patsiomkin"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reprehenderit, enim, repellat, exercitationem harum velit atque explicabo sit dolorum ipsa praesentium vel cupiditate. Nam, esse, perferendis nemo voluptatem reiciendis sit officia.", + "level": "D1-D5", + "notes": "", + "attendees": [ + "siarhei_mikulich", + "dzmitry_osipau", + "dmitry_beynya", + "dzianis_skliar", + "aleh_nadolskiy", + "nikolay_zhgirovsky", + "yauhen_tsikhan", + "dmitry_scherbatykh", + "aliaksei_tryputsen", + "volha_bainova", + "maxim_malets", + "andrei_volkau1", + "stanislau_zubovich", + "dzianis_ziankovich", + "yury_tarasevich", + "anton_sharapa", + "raman_vysotski", + "kanstantsin_babichau" + ], + "tags": [ + "talk", + "semantic", + "accessibility", + "recomendation" + ] + }, + + + { + "_id": "29", + "date": "5\/22\/2013", + "title": "MVC Introduction", + "lector": ["dzianis_ziankovich"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti, facilis, officiis voluptatibus velit doloremque est culpa similique veniam alias pariatur numquam beatae! Suscipit, necessitatibus id sit error nesciunt perferendis sunt!", + "level": "D1-D5", + "notes": "", + "attendees": [ + "yury_tarasevich", + "aliaksandr_kurash", + "kanstantsin_babichau", + "dzianis_skliar", + "yauhen_tsikhan", + "aliaksei_tryputsen", + "andrei_volkau1", + "andrew_krook", + "olga_bedulina", + "siarhei_mikhailau", + "volha_bainova" + ], + "tags": [ + "js", + "backend", + "mvc", + "php", + "oop" + ] + }, + + { + "_id": "30", + "date": "5\/23\/2013", + "title": "Dev Process", + "lector": ["siarhei_mikhailau"], + "location": "K1+K10", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti, facilis, officiis voluptatibus velit doloremque est culpa similique veniam alias pariatur numquam beatae! Suscipit, necessitatibus id sit error nesciunt perferendis sunt!", + "level": "D1-D5", + "notes": "", + "attendees": [ + "yauhen_karmyzau", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "maria_putyrskaya", + "dzianis_kryvashei", + "uladzimir_hartsau", + "anton_prokofyev", + "maryia_sinkevich" + ], + "tags": [ + "process", + "agile", + "waterfall", + "microteams", + "developement", + "team" + ] + }, + + + { + "_id": "31", + "date": "5\/29\/2013", + "title": "CoffeeScript - Easy Access to the Good Parts of JavaScript", + "lector": ["ivan_straltsou"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti, facilis, officiis voluptatibus velit doloremque est culpa similique veniam alias pariatur numquam beatae! Suscipit, necessitatibus id sit error nesciunt perferendis sunt!", + "level": "D1-D5", + "notes": "", + "attendees": [ + "siarhei_mikhailau", + "dzianis_skliar", + "aliaksandr_kurash", + "volha_bainova", + "nikolay_zhgirovsky", + "aliaksei_tryputsen", + "aliaksei_patsiomkin", + "anton_sharapa", + "maria_prinus", + "yury_tarasevich", + "dzmitry_osipau", + "yauhen_tsikhan", + "anton_prokofyev", + "kanstantsin_babichau", + "dzianis_ziankovich", + "andrei_volkau1", + "marina_kamayeva", + "igor_mishurin", + "khrystsina_tsikhanovich", + "nadzeya_shedava", + "viktor_busko" + ], + "tags": [ + "js", + "coffee" + ] + }, + + { + "_id": "32", + "date": "6\/20\/2013", + "title": "From Non-Intuitive JS Parts to JS OOP", + "lector": ["raman_vysotski"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti, facilis, officiis voluptatibus velit doloremque est culpa similique veniam alias pariatur numquam beatae! Suscipit, necessitatibus id sit error nesciunt perferendis sunt!", + "level": "D1-D5", + "notes": "", + "attendees": [ + "siarhei_mikhailau", + "dzianis_skliar", + "aliaksandr_kurash", + "ivan_straltsou", + "aliaksei_patsiomkin", + "anton_sharapa", + "olga_bedulina", + "dzianis_ziankovich", + "siarhei_fedarovich", + "yauhen_tsikhan", + "siarhei_vaitehovich", + "kseniya_smirnova", + "dzmitry_osipau", + "marina_kamayeva", + "andrei_valuyev", + "maxim_malets", + "aleh_nadolskiy", + "yauhen_karmyzau", + "uladzimir_hartsau" + ], + "tags": [ + "js", + "valilla", + "native", + "oop" + ] + }, + + { + "_id": "32", + "date": "6\/20\/2013", + "title": "MongoDB + NodeJS", + "lector": ["dzianis_kryvashei"], + "location": "K1+K10", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti, facilis, officiis voluptatibus velit doloremque est culpa similique veniam alias pariatur numquam beatae! Suscipit, necessitatibus id sit error nesciunt perferendis sunt!", + "level": "D1-D5", + "notes": "", + "attendees": [ + "siarhei_mikhailau", + "dzianis_ziankovich", + "aliaksandr_arlou", + "yauhen_karmyzau", + "khrystsina_tsikhanovich", + "uladzimir_hartsau", + "tatsiana_hlebik", + "alena_karaba", + "anton_prokofyev" + ], + "tags": [ + "js", + "nodejs", + "mongodb" + ] + }, + + + { + "_id": "33", + "date": "7\/24\/2013", + "title": "NodeJS, npm, express", + "lector": ["andrei_volkau1"], + "location": "K1\/3", + "description": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti, facilis, officiis voluptatibus velit doloremque est culpa similique veniam alias pariatur numquam beatae! Suscipit, necessitatibus id sit error nesciunt perferendis sunt!", + "level": "D1-D5", + "notes": "", + "attendees": [ + "siarhei_mikhailau", + "dzianis_skliar", + "aliaksandr_kurash", + "nikolay_zhgirovsky", + "aliaksei_tryputsen", + "aliaksei_patsiomkin", + "raman_vysotski", + "ilya_valasiuk", + "aliaksandr_padabed", + "dzmitry_osipau", + "olga_bedulina", + "dzianis_ziankovich", + "marina_kamayeva", + "siarhei_simanovich", + "siarhei_vaitehovich", + "aliaksandr_hudkou", + "veranika_baradzina", + "katsiaryna_utlik", + "siarhei_fedarovich", + "maxim_malets", + "tatsiana_hlebik" + ], + "tags": [ + "js", + "nodejs", + "backend", + "npm", + "express" + ] + } + ], + + "users": { + "siarhei_mikhailau": { + "full_name": "Siarhei Mikhailau", + "email": ["siarhei_mikhailau@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "andrey_demchenko": { + "full_name": "Andrey Demchenko", + "email": ["andrey_demchenko@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "veranika_mishurina": { + "full_name": "Veranika Mishurina", + "email": ["veranika_mishurina@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "mikita_khatsimtsou": { + "full_name": "Mikita Khatsimtsou", + "email": ["mikita_khatsimtsou@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "maryna_belavusava": { + "full_name": "Maryna Belavusava", + "email": ["maryna_belavusava@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "nadzeya_pratasava": { + "full_name": "Nadzeya Pratasava", + "email": ["nadzeya_pratasava@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "varely_zhurovich": { + "full_name": "Varely Zhurovich", + "email": ["varely_zhurovich@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "aliaksandr_arlou": { + "full_name": "Aliaksandr Arlou", + "email": ["aliaksandr_arlou@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "khrystsina_tsikhanovich": { + "full_name": "Khrystsina Tsikhanovich", + "email": ["khrystsina_tsikhanovich@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "nadzeya_shedava": { + "full_name": "Nadzeya Shedava", + "email": ["nadzeya_shedava@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "dmitry_beynya": { + "full_name": "Dmitry Beynya", + "email": ["dmitry_beynya@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "maria_putyrskaya": { + "full_name": "Maria Putyrskaya", + "email": ["maria_putyrskaya@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "viktor_busko": { + "full_name": "Viktor Busko", + "email": ["viktor_busko@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "uladzimir_hartsau": { + "full_name": "Uladzimir Hartsau", + "email": ["uladzimir_hartsau@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "aliaksei_yanachkin": { + "full_name": "Aliaksei Yanachkin", + "email": ["aliaksei_yanachkin@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "tatsiana_hlebik": { + "full_name": "Tatsiana Hlebik", + "email": ["tatsiana_hlebik@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "alena_karaba": { + "full_name": "Alena Karaba", + "email": ["alena_karaba@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "anton_prokofyev": { + "full_name": "Anton Prokofyev", + "email": ["anton_prokofyev@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "dzmitry_osipau": { + "full_name": "Dzmitry Osipau", + "email": ["dzmitry_osipau@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "raman_vysotski": { + "full_name": "Raman Vysotski", + "email": ["raman_vysotski@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "aliaksandr_kurash": { + "full_name": "Aliaksandr Kurash", + "email": ["aliaksandr_kurash@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "ivan_straltsou": { + "full_name": "Ivan Straltsou", + "email": ["ivan_straltsou@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "andrei_valuyev": { + "full_name": "Andrei Valuyev", + "email": ["andrei_valuyev@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "nikolay_zhgirovsky": { + "full_name": "Nikolay Zhgirovsky", + "email": ["nikolay_zhgirovsky@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "kirill_malets": { + "full_name": "Kirill Malets", + "email": ["kirill_malets@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "siarhei_mikulich": { + "full_name": "Siarhei Mikulich", + "email": ["siarhei_mikulich@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "anton_sharapa": { + "full_name": "Anton Sharapa", + "email": ["anton_sharapa@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "aleh_nadolskiy": { + "full_name": "Aleh Nadolskiy", + "email": ["aleh_nadolskiy@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "aliaksei_tryputsen": { + "full_name": "Aliaksei Tryputsen", + "email": ["aliaksei_tryputsen@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "andrew_krook": { + "full_name": "Andrew Krook", + "email": ["andrew_krook@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "aliaksandr_padabed": { + "full_name": "Aliaksandr Padabed", + "email": ["aliaksandr_padabed@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "volha_bainova": { + "full_name": "Volha Bainova", + "email": ["volha_bainova@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "kseniya_smirnova": { + "full_name": "Kseniya Smirnova", + "email": ["kseniya_smirnova@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "yulia_douha": { + "full_name": "Yulia Douha", + "email": ["yulia_douha@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "yauhen_karmyzau": { + "full_name": "Yauhen Karmyzau", + "email": ["yauhen_karmyzau@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "ilya_kvachenko": { + "full_name": "Ilya Kvachenko", + "email": ["ilya_kvachenko@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "yauheni_pas": { + "full_name": "Yauheni Pas", + "email": ["yauheni_pas@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "aliaksei_rubinau": { + "full_name": "Aliaksei Rubinau", + "email": ["aliaksei_rubinau@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "tatsiana_petrushkevich": { + "full_name": "Tatsiana Petrushkevich", + "email": ["tatsiana_petrushkevich@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "anton_raby": { + "full_name": "Anton Raby", + "email": ["anton_raby@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "dzmitry_yurkavets": { + "full_name": "Dzmitry Yurkavets", + "email": ["dzmitry_yurkavets@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "dzianis_ziankovich": { + "full_name": "Dzianis Ziankovich", + "email": ["dzianis_ziankovich@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "yury_tarasevich": { + "full_name": "Yury Tarasevich", + "email": ["yury_tarasevich@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "dzianis_kryvashei": { + "full_name": "Dzianis Kryvashei", + "email": ["dzianis_kryvashei@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "andrei_barysiuk": { + "full_name": "Andrei Barysiuk", + "email": ["andrei_barysiuk@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "stanislau_zubovich": { + "full_name": "Stanislau Zubovich", + "email": ["stanislau_zubovich@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "maksim_kovalev": { + "full_name": "Maksim Kovalev", + "email": ["maksim_kovalev@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "siarhei_prudnikau": { + "full_name": "Siarhei Prudnikau", + "email": ["siarhei_prudnikau@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "andrei_dzeuhuts": { + "full_name": "Andrei Dzeuhuts", + "email": ["andrei_dzeuhuts@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "fyodor_yakimchouk": { + "full_name": "Fyodor Yakimchouk", + "email": ["fyodor_yakimchouk@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "andrei_akula": { + "full_name": "Andrei Akula", + "email": ["andrei_akula@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "iryna_dastanka": { + "full_name": "Iryna Dastanka", + "email": ["iryna_dastanka@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "andrei_volkau1": { + "full_name": "Andrei Volkau", + "email": ["andrei_volkau1@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "anatoli_tsyporyn": { + "full_name": "Anatoli Tsyporyn", + "email": ["anatoli_tsyporyn@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "dzianis_skliar": { + "full_name": "Dzianis Skliar", + "email": ["dzianis_skliar@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "yauhen_tsikhan": { + "full_name": "Yauhen Tsikhan", + "email": ["yauhen_tsikhan@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "aliaksandr_timbaliuc": { + "full_name": "Aliaksandr Timbaliuc", + "email": ["aliaksandr_timbaliuc@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "maryia_sinkevich": { + "full_name": "Maryia Sinkevich", + "email": ["maryia_sinkevich@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "pavel_valadzko": { + "full_name": "Pavel Valadzko", + "email": ["pavel_valadzko@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "igor_boreysha": { + "full_name": "Igor Boreysha", + "email": ["igor_boreysha@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "aliaksei_patsiomkin": { + "full_name": "Aliaksei Patsiomkin", + "email": ["aliaksei_patsiomkin@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "dmitry_scherbatykh": { + "full_name": "Dmitry Scherbatykh", + "email": ["dmitry_scherbatykh@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "olga_bedulina": { + "full_name": "Olga Bedulina", + "email": ["olga_bedulina@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "maxim_malets": { + "full_name": "Maxim Malets", + "email": ["maxim_malets@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "maria_prinus": { + "full_name": "Maria Prinus", + "email": ["maria_prinus@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "kanstantsin_babichau": { + "full_name": "Kanstantsin Babichau", + "email": ["kanstantsin_babichau@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "marina_kamayeva": { + "full_name": "Marina Kamayeva", + "email": ["marina_kamayeva@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "igor_mishurin": { + "full_name": "Igor Mishurin", + "email": ["igor_mishurin@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "siarhei_fedarovich": { + "full_name": "Siarhei Fedarovich", + "email": ["siarhei_fedarovich@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "siarhei_vaitehovich": { + "full_name": "Siarhei Vaitehovich", + "email": ["siarhei_vaitehovich@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "andrei_volkau": { + "full_name": "Andrei Volkau", + "email": ["andrei_volkau@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "ilya_valasiuk": { + "full_name": "Ilya Valasiuk", + "email": ["ilya_valasiuk@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "siarhei_simanovich": { + "full_name": "Siarhei Simanovich", + "email": ["siarhei_simanovich@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "aliaksandr_hudkou": { + "full_name": "Aliaksandr Hudkou", + "email": ["aliaksandr_hudkou@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "veranika_baradzina": { + "full_name": "Veranika Baradzina", + "email": ["veranika_baradzina@epam.com"], + "photo_url": "photo-placeholder.png" + }, + + "katsiaryna_utlik": { + "full_name": "Katsiaryna Utlik", + "email": ["katsiaryna_utlik@epam.com"], + "photo_url": "photo-placeholder.png" + } + }, + + "tags": [ + "css", + "js", + "prefix", + "xbrowser", + "talk", + "algorithm", + "game", + "prototype", + "backbone", + "mvc", + "nodejs", + "server", + "build", + "minify", + "dom", + "transform", + "html", + "flex", + "amd", + "requirejs", + "commonjs", + "lmd", + "module", + "chrome", + "extension", + "timeout", + "interval", + "keyframe", + "animation", + "framework", + "todo", + "leaverou", + "transition", + "shadow", + "widget", + "windows8", + "desktop", + "knockout", + "mvvm", + "hackaton", + "semantic", + "accessibility", + "recomendation", + "backend", + "php", + "oop", + "process", + "agile", + "waterfall", + "microteams", + "developement", + "team", + "coffee", + "valilla", + "native", + "mongodb", + "npm", + "express" + ] +} \ No newline at end of file diff --git a/public/css/fonts/icomoon.dev.svg b/public/css/fonts/icomoon.dev.svg new file mode 100644 index 0000000..e7fef27 --- /dev/null +++ b/public/css/fonts/icomoon.dev.svg @@ -0,0 +1,38 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/css/fonts/icomoon.eot b/public/css/fonts/icomoon.eot new file mode 100644 index 0000000000000000000000000000000000000000..624dc6c9125d7cd2cfeed9287f0a6c2b84863123 GIT binary patch literal 2544 zcmd^B&2Jk;6o1cN@7hkfu@%QI#f_bq##PhA&iX4YZgFX2IHYabhT=$xQYTH*lq9zD zA%$D2AVj4easi==14tm{kV6j@hk{gBR7i*l2?+!eJw)PCI8>1;1c&1Ad+SZp^y4pJ zv@`Gbe(%lB%)XgbOrZF0)d77jm&4BUKSuis+3t#aGQx|no-1L3AH%OVs4vcB1zI?v__yzt# zA##a(@Qq_VdFmz=y38+p@=VO={QWoRT!4OdbgEch+x74#==V@hj~8dl8yk2Nxty>& z$0y&t@J{^O1d;ts)XK%N;`x6I^FP7{e@b5jVV~Ui9({e#U%5Cnx1i4h5no5Mf3h@M zv>#LOF1yTU=Tvc_Om9&S?A_4A)5WQ=zMmhi6KU|__sgZ(xl1Sh`5Qwo!@gjy4eL8| zKUf%U$o@rjTmer%WOx0!B{y#IZN3cMX@v=|!gG1!7VQ=PYL0K4Z;~#XrOssP=ymjx zA^~QT%ZZA@{1q>ggPa`U1JDm!@)rbX_Q|~<&K_y3(s!ZfJmuDCop^Dhf;n8KBa7yo z#G$qVfDc8h>B2ozKNYLQ!mL4S1-;ND;z3f(E#cf;^_sd)h#iWIEGVpaYQ93Eu*AIv ziDkXDO>Hsaum%4INT(cqOgC8JBwyn-S^Y+ZE4(P*#mg;R!Nysv=Hyf0L|HZ!XU#`1 z<6|{NwP+@)1+=J^N;GDgBAIBWfdi3LAj6gHP;4-}Iv5+uuH4J6WCvrzgAhZ!D0nDq znpdi;!o|cXJ1G0m8bcu$u7yU75}|g&>B}TKIl7w1H<2*!Nt=&3^KgFkd-& z8omkn+mdO+?^7E!zmZNZEiK(#TH5uX>*`2O(9I=&`$5;p)otH$2faislqGVsw6>+Z z$#kM6;Pt6{e6O-`h?DKy+LTGQ?q;8n%0wegJ`jgE(%R&OLn;ZU-JCE|{CRbu-s7p~ zzJ5=&qTkW++zAHz_X$9w>yJ=#aQL9!(_g(_@5$?WS&XK2--xb{=+(RWH672k`8|$x zCSeAcAvTa*G4UG0S%|$S%>YcQ%_F0&Y zU>`->S{qpPh1eg+w8gkB`5LDUXubyaYngOXYl~|Bny$9i>}?s%>|nq(8RgGxp+fVy zP{`&`BbvkJ@tpIXt8h^?;3Lr_*9zRwhbIhbALTC)X#3&%br$!KF#MPo(;E>>xinFZfO4+G6 z+&Qkeb= zNsonXzgcY8Rq*%amQ`F}WJlDn4S1)8?UcvuTjLe*pIF#| z+;GFfD)?WYPWKa|rKwU0dH<=Te|l_uezJ({pEpzfoGEAUTQG)QVwmYaOb3Ct{{YlD z10Eg7^Bs_J!~r)(zBE0TFU^dPg^kX5_+Z!?7sxO=x;u<`7o4`giyqJI1-~C>$7W_H zO4H%4P9*ae^?f$0n4x*1sRPCj72DX3yVt=gYwTo~Ha|U)kH_O8d$wekr5lz^STbqJ qlqJ*hR%AV!8AXZOPIFAr?c_!)d!&}}SS;UNDPhN&{}O*}%Krd8-Fy}R literal 0 HcmV?d00001 diff --git a/public/css/fonts/icomoon.svg b/public/css/fonts/icomoon.svg new file mode 100644 index 0000000..1a2cebb --- /dev/null +++ b/public/css/fonts/icomoon.svg @@ -0,0 +1,38 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/css/fonts/icomoon.ttf b/public/css/fonts/icomoon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dce882e73bdd85de09c778f02edb7af22a038b2e GIT binary patch literal 2380 zcmds3OK%%h6h6lu&)7~nu@%QI#f_bq+EvrU&iFBDnHHBehD9G~8;T<(N}beAQ{vdl zLkhc8L5NCSbOS;a3y?s{B8x6676qxUsE`m95)ud`x`@Q4u&63k2o}ZWyEEgKsO1lE z<$KR}zH`ofoqOk+n25H~DmiJSP#8USoI{X)5P?(gFA_prgA zau+~2=bGOlHURyl3zel6bs32GI-0$6)#;M+h=jhJVm{j|rIi}JLBp^QL66RtD&>(M zA3Y>e;KT3Ms*6h(kN@>2hQ12>3W>F$p1vP0PIef7P#f35(09g;-=E6nExyf{pu5Q- zSQNzYrRFW#E&LmKzHRnon(U^{WZLLeM2R9I+2rytI9V$IcwcCiF1Tmv$HFRdVb-v{f}_yH zu7pVXyZ{^rm zo};;A74My`>X*XRbTb=h9C)r{D^BbZ<|}TVf<2*NJd@Lc0l8BNYPrnX+S<*vwH*%z zuT13yy1B-0J{X+3vSlx~(F@c=29c|$H=gxpa_OFsKOpZ4yv*7G&h&9_m!9d}$pI~^ zCt_Uz5C=Hc+vSHtHUp=foYu1ZX=A0`=WFMYQD393-cj+p6Aq8=5de* zXybajub`?mVKl9Krc`xGZQNC_srYS~-;-SHX*1b9R<5%m#ei1I!|TRavdF$-a?Dsa z@g~w)Oui$UF_?_?Arq!Rk0s4phcA{mXHhzYbCihpcCZ|Xa4@9DlN`^y!Z{6Epo4>o zp35llgc7uLx!1DCb;S(O;F?MBCyq$5`)nlQaLF;n>aS5eSbGjrcB}p8Wq|d!d&E={o zUT;nIdgWSPlCBCTvnduO+)tEt`oR8%G0vpV#tz`!Hg@7hS+9z?(+X|ayo=iCu8n2z z_r+IM@_-R1!om*V?KXB&0bgH>m%x8yV;A0r8#b1~|4g$qO;xI(R%xDScDh=rRsl{? znPzC2=BPvqP|GvRb0vU+>9=Ic1$dNkN;De4Xi?gay0t%x)8NsMcfKDog*@PkQK-%@ z6{-s}<)}80itdlv;{s_~|4_e{8ido;q6KnpL_^l=X0cyNzz5oCK literal 0 HcmV?d00001 diff --git a/public/css/fonts/icomoon.woff b/public/css/fonts/icomoon.woff new file mode 100644 index 0000000000000000000000000000000000000000..a4a4ff92a74af440af090f0311f6cba1311e57a2 GIT binary patch literal 2664 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 literal 0 HcmV?d00001 diff --git a/public/fonts/icomoon.dev.svg b/public/fonts/icomoon.dev.svg new file mode 100644 index 0000000..e7fef27 --- /dev/null +++ b/public/fonts/icomoon.dev.svg @@ -0,0 +1,38 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/icomoon.eot b/public/fonts/icomoon.eot new file mode 100644 index 0000000000000000000000000000000000000000..624dc6c9125d7cd2cfeed9287f0a6c2b84863123 GIT binary patch literal 2544 zcmd^B&2Jk;6o1cN@7hkfu@%QI#f_bq##PhA&iX4YZgFX2IHYabhT=$xQYTH*lq9zD zA%$D2AVj4easi==14tm{kV6j@hk{gBR7i*l2?+!eJw)PCI8>1;1c&1Ad+SZp^y4pJ zv@`Gbe(%lB%)XgbOrZF0)d77jm&4BUKSuis+3t#aGQx|no-1L3AH%OVs4vcB1zI?v__yzt# zA##a(@Qq_VdFmz=y38+p@=VO={QWoRT!4OdbgEch+x74#==V@hj~8dl8yk2Nxty>& z$0y&t@J{^O1d;ts)XK%N;`x6I^FP7{e@b5jVV~Ui9({e#U%5Cnx1i4h5no5Mf3h@M zv>#LOF1yTU=Tvc_Om9&S?A_4A)5WQ=zMmhi6KU|__sgZ(xl1Sh`5Qwo!@gjy4eL8| zKUf%U$o@rjTmer%WOx0!B{y#IZN3cMX@v=|!gG1!7VQ=PYL0K4Z;~#XrOssP=ymjx zA^~QT%ZZA@{1q>ggPa`U1JDm!@)rbX_Q|~<&K_y3(s!ZfJmuDCop^Dhf;n8KBa7yo z#G$qVfDc8h>B2ozKNYLQ!mL4S1-;ND;z3f(E#cf;^_sd)h#iWIEGVpaYQ93Eu*AIv ziDkXDO>Hsaum%4INT(cqOgC8JBwyn-S^Y+ZE4(P*#mg;R!Nysv=Hyf0L|HZ!XU#`1 z<6|{NwP+@)1+=J^N;GDgBAIBWfdi3LAj6gHP;4-}Iv5+uuH4J6WCvrzgAhZ!D0nDq znpdi;!o|cXJ1G0m8bcu$u7yU75}|g&>B}TKIl7w1H<2*!Nt=&3^KgFkd-& z8omkn+mdO+?^7E!zmZNZEiK(#TH5uX>*`2O(9I=&`$5;p)otH$2faislqGVsw6>+Z z$#kM6;Pt6{e6O-`h?DKy+LTGQ?q;8n%0wegJ`jgE(%R&OLn;ZU-JCE|{CRbu-s7p~ zzJ5=&qTkW++zAHz_X$9w>yJ=#aQL9!(_g(_@5$?WS&XK2--xb{=+(RWH672k`8|$x zCSeAcAvTa*G4UG0S%|$S%>YcQ%_F0&Y zU>`->S{qpPh1eg+w8gkB`5LDUXubyaYngOXYl~|Bny$9i>}?s%>|nq(8RgGxp+fVy zP{`&`BbvkJ@tpIXt8h^?;3Lr_*9zRwhbIhbALTC)X#3&%br$!KF#MPo(;E>>xinFZfO4+G6 z+&Qkeb= zNsonXzgcY8Rq*%amQ`F}WJlDn4S1)8?UcvuTjLe*pIF#| z+;GFfD)?WYPWKa|rKwU0dH<=Te|l_uezJ({pEpzfoGEAUTQG)QVwmYaOb3Ct{{YlD z10Eg7^Bs_J!~r)(zBE0TFU^dPg^kX5_+Z!?7sxO=x;u<`7o4`giyqJI1-~C>$7W_H zO4H%4P9*ae^?f$0n4x*1sRPCj72DX3yVt=gYwTo~Ha|U)kH_O8d$wekr5lz^STbqJ qlqJ*hR%AV!8AXZOPIFAr?c_!)d!&}}SS;UNDPhN&{}O*}%Krd8-Fy}R literal 0 HcmV?d00001 diff --git a/public/fonts/icomoon.svg b/public/fonts/icomoon.svg new file mode 100644 index 0000000..1a2cebb --- /dev/null +++ b/public/fonts/icomoon.svg @@ -0,0 +1,38 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/icomoon.ttf b/public/fonts/icomoon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dce882e73bdd85de09c778f02edb7af22a038b2e GIT binary patch literal 2380 zcmds3OK%%h6h6lu&)7~nu@%QI#f_bq+EvrU&iFBDnHHBehD9G~8;T<(N}beAQ{vdl zLkhc8L5NCSbOS;a3y?s{B8x6676qxUsE`m95)ud`x`@Q4u&63k2o}ZWyEEgKsO1lE z<$KR}zH`ofoqOk+n25H~DmiJSP#8USoI{X)5P?(gFA_prgA zau+~2=bGOlHURyl3zel6bs32GI-0$6)#;M+h=jhJVm{j|rIi}JLBp^QL66RtD&>(M zA3Y>e;KT3Ms*6h(kN@>2hQ12>3W>F$p1vP0PIef7P#f35(09g;-=E6nExyf{pu5Q- zSQNzYrRFW#E&LmKzHRnon(U^{WZLLeM2R9I+2rytI9V$IcwcCiF1Tmv$HFRdVb-v{f}_yH zu7pVXyZ{^rm zo};;A74My`>X*XRbTb=h9C)r{D^BbZ<|}TVf<2*NJd@Lc0l8BNYPrnX+S<*vwH*%z zuT13yy1B-0J{X+3vSlx~(F@c=29c|$H=gxpa_OFsKOpZ4yv*7G&h&9_m!9d}$pI~^ zCt_Uz5C=Hc+vSHtHUp=foYu1ZX=A0`=WFMYQD393-cj+p6Aq8=5de* zXybajub`?mVKl9Krc`xGZQNC_srYS~-;-SHX*1b9R<5%m#ei1I!|TRavdF$-a?Dsa z@g~w)Oui$UF_?_?Arq!Rk0s4phcA{mXHhzYbCihpcCZ|Xa4@9DlN`^y!Z{6Epo4>o zp35llgc7uLx!1DCb;S(O;F?MBCyq$5`)nlQaLF;n>aS5eSbGjrcB}p8Wq|d!d&E={o zUT;nIdgWSPlCBCTvnduO+)tEt`oR8%G0vpV#tz`!Hg@7hS+9z?(+X|ayo=iCu8n2z z_r+IM@_-R1!om*V?KXB&0bgH>m%x8yV;A0r8#b1~|4g$qO;xI(R%xDScDh=rRsl{? znPzC2=BPvqP|GvRb0vU+>9=Ic1$dNkN;De4Xi?gay0t%x)8NsMcfKDog*@PkQK-%@ z6{-s}<)}80itdlv;{s_~|4_e{8ido;q6KnpL_^l=X0cyNzz5oCK literal 0 HcmV?d00001 diff --git a/public/fonts/icomoon.woff b/public/fonts/icomoon.woff new file mode 100644 index 0000000000000000000000000000000000000000..a4a4ff92a74af440af090f0311f6cba1311e57a2 GIT binary patch literal 2664 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 literal 0 HcmV?d00001 diff --git a/scripts/app.js b/scripts/app.js index 2b289b9..4c4cafd 100644 --- a/scripts/app.js +++ b/scripts/app.js @@ -21,23 +21,36 @@ controller: 'CalendarCtrl', templateUrl: 'views/calendar-page' }) - .when('/details/:techtalkId', { + .when('/details/:talkId', { controller: 'DetailsCtrl', templateUrl: 'views/details-page' - }); + }) + .when('/edit/:talkId', { + controller: 'EditCtrl', + templateUrl: 'views/edit-page' + }) + .otherwise({redirectTo: '/'}); }]) + .run(function() { + + }) /** * */ - .controller('AppCtrl', ['$rootScope', '$scope', 'authService', - function($rootScope, $scope, authService) { + .controller('AppCtrl', ['$rootScope', '$scope', 'authService', 'data', + function($rootScope, $scope, authService, dataProvider) { $rootScope.global = { isAuthN: authService.isAuthN(), - authService: authService + authService: authService, + users: {} }; $scope.auth = {}; + dataProvider.getUser().then(function(data) { + $rootScope.global.users = data; + }); + $scope.signin = function() { $scope.authInProgress = true; diff --git a/scripts/controllers/calendar-controller.js b/scripts/controllers/calendar-controller.js index 18932e5..7671b88 100644 --- a/scripts/controllers/calendar-controller.js +++ b/scripts/controllers/calendar-controller.js @@ -4,40 +4,74 @@ ng.module('tp') .controller('CalendarCtrl', ['$scope', 'helper', 'data', function($scope, helper, dataProvider) { var now = new Date(), + activeDate = new Date(), monthIndex = now.getMonth(), - year = now.getFullYear(), - monthName = helper.getMonthName(monthIndex), - daysNumber = helper.getDaysInMonth(monthIndex, year), - i = 1, + year, monthName, daysNumber, periodDescription; + + $scope.global.pageTitle = 'Calendar view'; + + $scope.prevMonth = function() { + activeDate.setMonth((monthIndex -= 1)); + _update(); + return monthIndex % 12; + }; + + $scope.nextMonth = function() { + activeDate.setMonth((monthIndex += 1)); + _update(); + return monthIndex % 12; + }; + + $scope.getUserDescription = function(id) { + var user; + dataProvider.getUser().then(function(data) { + user = data[id]; + }); + + return user; + }; + + _update(); + + function _update() { + monthIndex = activeDate.getMonth(); + year = activeDate.getFullYear(); + monthName = helper.getMonthName(monthIndex); + daysNumber = helper.getDaysInMonth(monthIndex, year); periodDescription = { month: monthName, year: year, dates: [] }; - $scope.global.pageTitle = 'Calendar view'; + _initPeriod(year, monthIndex); + } - dataProvider - .getSchedule() - .success(function(data) { - console.log(data); - while(i <= daysNumber) { - var techtalkData = data[i], - dayDescription = { - date: i - }; - - techtalkData && (dayDescription.data = techtalkData); - periodDescription.dates.push(dayDescription); - i += 1; - } - - //FETCH - $scope.schedule = periodDescription; - }) - .error(function() { - console.log('ERROR: ', arguments); - }); + function _initPeriod(year, month) { + + dataProvider + .getSchedule(year, month) + .success(function(data) { + var i = 1; + console.log(data); + while(i <= daysNumber) { + var techtalkData = data[i], + dayDescription = { + date: i + }; + + techtalkData && (dayDescription.data = techtalkData); + periodDescription.dates.push(dayDescription); + i += 1; + } + + //FETCH + $scope.schedule = periodDescription; + }) + .error(function() { + console.log('ERROR: ', arguments); + }); + } }]); diff --git a/scripts/controllers/details-controller.js b/scripts/controllers/details-controller.js index fc0a6a9..4b0b961 100644 --- a/scripts/controllers/details-controller.js +++ b/scripts/controllers/details-controller.js @@ -4,13 +4,13 @@ ng.module('tp') .controller('DetailsCtrl', ['$scope', '$routeParams', 'data', function($scope, $routeParams, dataProvider) { - var currentTalkId = $routeParams.techtalkId; + var currentTalkId = $routeParams.talkId; - $scope.global.pageTitle = 'details view'; + $scope.global.pageTitle = 'talk: ' + currentTalkId; if (ng.isDefined(currentTalkId)) { dataProvider - .getTechtalkData($routeParams.techtalkId) + .getTechtalkData(currentTalkId) .success(function(data) { $scope.details = data; }) diff --git a/scripts/controllers/edit-controller.js b/scripts/controllers/edit-controller.js new file mode 100644 index 0000000..5a662ef --- /dev/null +++ b/scripts/controllers/edit-controller.js @@ -0,0 +1,13 @@ +;(function(ng) { + 'use strict'; + + ng.module('tp') + .controller('EditCtrl', ['$scope', '$routeParams', 'data', + function($scope, $routeParams, dataProvider) { + var currentTalkId = $routeParams.talkId; + + console.log(currentTalkId); + editor.init(); + //ui.init(); + }]); +})(angular); \ No newline at end of file diff --git a/scripts/services/data-provider.js b/scripts/services/data-provider.js index 1f8e2f0..31ae7f0 100644 --- a/scripts/services/data-provider.js +++ b/scripts/services/data-provider.js @@ -3,23 +3,42 @@ ng.module('tp.services') .provider('data', function() { + - this.$get = ['$http', function($http) { - return { - getSchedule: function() { - return $http({ - method: 'GET', - url: 'test' - }); - }, - getTechtalkData: function(id) { - return $http({ - method: 'GET', - url: '/details/' + id - }); - } - }; -}]; + this.$get = ['$http', '$q', function($http, $q) { + var users; + + return { + getSchedule: function(year, month) { + return $http({ + method: 'GET', + url: 'talks/' + year + '/' + month + }); + }, + getTechtalkData: function(id) { + return $http({ + method: 'GET', + url: '/details/' + id + }); + }, + getUser: function() { + var defer = $q.defer(); + + if (!users) { + $http({ + method: 'GET', + url: '/user' + }) + .success(function(data) { + users = data; + defer.resolve(users); + }); + } + + return defer.promise; + } + }; + }]; }); })(angular); \ No newline at end of file diff --git a/server.js b/server.js index 413f2ab..82361c0 100644 --- a/server.js +++ b/server.js @@ -1,8 +1,70 @@ +'use strict'; + require('colors'); var express = require('express'), - app = express(); + app = express(), + fs = require('fs'), + data = JSON.parse(fs.readFileSync('data.json', { + encoding: 'utf-8' + })), + talks = data.talks, + users = data.users, + tags = data.tags; + +//helper +var getTalkById = (function() { + var memory = {}; + + return function(id) { + var memorized = memory[id], + talk; + + if (memorized) { + return memorized; + } + else { + talks.forEach(function(resource, i) { + if (resource._id === id) { + talk = resource; + memory[id] = resource; + return false; + } + }); + + return talk; + } + }; +})(); + +var getSchedule = (function() { + var memory = {}; + + return function(year, month) { + var dateStack = {}, + periodId = year + '/' + month, + memorized = memory[periodId]; + if (memorized) { + return memorized; + } + else { + talks.forEach(function(talk, i) { + var talkDate = new Date(talk.date), + date = talkDate.getDate(); + + if(talkDate.getFullYear() == year && talkDate.getMonth() == month) { + var current = dateStack[date] = dateStack[date] || []; + current.push(talk); + } + }); + + return (memory[periodId] = dateStack); + } + }; +})(); + +//config app .disable('x-powered-by') .engine('html', require('ejs').renderFile) @@ -29,55 +91,21 @@ app.get('/views/:templateName', function(req, res) { res.render(req.params.templateName); }); -app.get('/test', function(req, res) { - res.send({ - '3': [{ - id: '1', - title: 'CSS features', - location: 'k1-3 215', - author: { - id: 'tester', - firstName: 'Sergey', - lastName: 'Net ne on' - } - }], - '21': [{ - id: '2', - title: 'CSS55 features', - location: 'k1', - author: { - id: 'tester', - firstName: 'Sergey', - lastName: 'Net ne on' - } - }, { - id: '1', - title: 'JS', - location: 'n58', - author: { - id: 'tester', - firstName: 'Sergey', - lastName: 'Net ne on' - } - }] - }); +app.get('/talks/:year/:month', function(req, res) { + var year = req.params.year, + month = req.params.month; + + res.send(getSchedule(year, month) || talks); }); -app.get('/details/:techtalkId', function(req, res) { - var data = { - '1': { - title: 'CSS features', - content: 'html here' - }, - '2': { - title: 'CSS2 features', - content: 'html here' - } - }; +app.get('/details/:talkId', function(req, res) { + var id = req.params.talkId; - var id = req.params.techtalkId; + res.send(getTalkById(id) || {}); +}); - res.send(data[id] || {}); +app.get('/user', function(req, res) { + res.send(users); }); app.post('/auth', function(req, res) { @@ -100,4 +128,4 @@ app.post('/auth', function(req, res) { //server starts here app.listen(app.get('port')); -console.log(('start web-server on port ' + app.get('port')).green); +console.log(('start web-server on port ' + app.get('port')).green); \ No newline at end of file diff --git a/styles/fonts/icomoon.dev.svg b/styles/fonts/icomoon.dev.svg new file mode 100644 index 0000000..e7fef27 --- /dev/null +++ b/styles/fonts/icomoon.dev.svg @@ -0,0 +1,38 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/styles/fonts/icomoon.eot b/styles/fonts/icomoon.eot new file mode 100644 index 0000000000000000000000000000000000000000..624dc6c9125d7cd2cfeed9287f0a6c2b84863123 GIT binary patch literal 2544 zcmd^B&2Jk;6o1cN@7hkfu@%QI#f_bq##PhA&iX4YZgFX2IHYabhT=$xQYTH*lq9zD zA%$D2AVj4easi==14tm{kV6j@hk{gBR7i*l2?+!eJw)PCI8>1;1c&1Ad+SZp^y4pJ zv@`Gbe(%lB%)XgbOrZF0)d77jm&4BUKSuis+3t#aGQx|no-1L3AH%OVs4vcB1zI?v__yzt# zA##a(@Qq_VdFmz=y38+p@=VO={QWoRT!4OdbgEch+x74#==V@hj~8dl8yk2Nxty>& z$0y&t@J{^O1d;ts)XK%N;`x6I^FP7{e@b5jVV~Ui9({e#U%5Cnx1i4h5no5Mf3h@M zv>#LOF1yTU=Tvc_Om9&S?A_4A)5WQ=zMmhi6KU|__sgZ(xl1Sh`5Qwo!@gjy4eL8| zKUf%U$o@rjTmer%WOx0!B{y#IZN3cMX@v=|!gG1!7VQ=PYL0K4Z;~#XrOssP=ymjx zA^~QT%ZZA@{1q>ggPa`U1JDm!@)rbX_Q|~<&K_y3(s!ZfJmuDCop^Dhf;n8KBa7yo z#G$qVfDc8h>B2ozKNYLQ!mL4S1-;ND;z3f(E#cf;^_sd)h#iWIEGVpaYQ93Eu*AIv ziDkXDO>Hsaum%4INT(cqOgC8JBwyn-S^Y+ZE4(P*#mg;R!Nysv=Hyf0L|HZ!XU#`1 z<6|{NwP+@)1+=J^N;GDgBAIBWfdi3LAj6gHP;4-}Iv5+uuH4J6WCvrzgAhZ!D0nDq znpdi;!o|cXJ1G0m8bcu$u7yU75}|g&>B}TKIl7w1H<2*!Nt=&3^KgFkd-& z8omkn+mdO+?^7E!zmZNZEiK(#TH5uX>*`2O(9I=&`$5;p)otH$2faislqGVsw6>+Z z$#kM6;Pt6{e6O-`h?DKy+LTGQ?q;8n%0wegJ`jgE(%R&OLn;ZU-JCE|{CRbu-s7p~ zzJ5=&qTkW++zAHz_X$9w>yJ=#aQL9!(_g(_@5$?WS&XK2--xb{=+(RWH672k`8|$x zCSeAcAvTa*G4UG0S%|$S%>YcQ%_F0&Y zU>`->S{qpPh1eg+w8gkB`5LDUXubyaYngOXYl~|Bny$9i>}?s%>|nq(8RgGxp+fVy zP{`&`BbvkJ@tpIXt8h^?;3Lr_*9zRwhbIhbALTC)X#3&%br$!KF#MPo(;E>>xinFZfO4+G6 z+&Qkeb= zNsonXzgcY8Rq*%amQ`F}WJlDn4S1)8?UcvuTjLe*pIF#| z+;GFfD)?WYPWKa|rKwU0dH<=Te|l_uezJ({pEpzfoGEAUTQG)QVwmYaOb3Ct{{YlD z10Eg7^Bs_J!~r)(zBE0TFU^dPg^kX5_+Z!?7sxO=x;u<`7o4`giyqJI1-~C>$7W_H zO4H%4P9*ae^?f$0n4x*1sRPCj72DX3yVt=gYwTo~Ha|U)kH_O8d$wekr5lz^STbqJ qlqJ*hR%AV!8AXZOPIFAr?c_!)d!&}}SS;UNDPhN&{}O*}%Krd8-Fy}R literal 0 HcmV?d00001 diff --git a/styles/fonts/icomoon.svg b/styles/fonts/icomoon.svg new file mode 100644 index 0000000..1a2cebb --- /dev/null +++ b/styles/fonts/icomoon.svg @@ -0,0 +1,38 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/styles/fonts/icomoon.ttf b/styles/fonts/icomoon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dce882e73bdd85de09c778f02edb7af22a038b2e GIT binary patch literal 2380 zcmds3OK%%h6h6lu&)7~nu@%QI#f_bq+EvrU&iFBDnHHBehD9G~8;T<(N}beAQ{vdl zLkhc8L5NCSbOS;a3y?s{B8x6676qxUsE`m95)ud`x`@Q4u&63k2o}ZWyEEgKsO1lE z<$KR}zH`ofoqOk+n25H~DmiJSP#8USoI{X)5P?(gFA_prgA zau+~2=bGOlHURyl3zel6bs32GI-0$6)#;M+h=jhJVm{j|rIi}JLBp^QL66RtD&>(M zA3Y>e;KT3Ms*6h(kN@>2hQ12>3W>F$p1vP0PIef7P#f35(09g;-=E6nExyf{pu5Q- zSQNzYrRFW#E&LmKzHRnon(U^{WZLLeM2R9I+2rytI9V$IcwcCiF1Tmv$HFRdVb-v{f}_yH zu7pVXyZ{^rm zo};;A74My`>X*XRbTb=h9C)r{D^BbZ<|}TVf<2*NJd@Lc0l8BNYPrnX+S<*vwH*%z zuT13yy1B-0J{X+3vSlx~(F@c=29c|$H=gxpa_OFsKOpZ4yv*7G&h&9_m!9d}$pI~^ zCt_Uz5C=Hc+vSHtHUp=foYu1ZX=A0`=WFMYQD393-cj+p6Aq8=5de* zXybajub`?mVKl9Krc`xGZQNC_srYS~-;-SHX*1b9R<5%m#ei1I!|TRavdF$-a?Dsa z@g~w)Oui$UF_?_?Arq!Rk0s4phcA{mXHhzYbCihpcCZ|Xa4@9DlN`^y!Z{6Epo4>o zp35llgc7uLx!1DCb;S(O;F?MBCyq$5`)nlQaLF;n>aS5eSbGjrcB}p8Wq|d!d&E={o zUT;nIdgWSPlCBCTvnduO+)tEt`oR8%G0vpV#tz`!Hg@7hS+9z?(+X|ayo=iCu8n2z z_r+IM@_-R1!om*V?KXB&0bgH>m%x8yV;A0r8#b1~|4g$qO;xI(R%xDScDh=rRsl{? znPzC2=BPvqP|GvRb0vU+>9=Ic1$dNkN;De4Xi?gay0t%x)8NsMcfKDog*@PkQK-%@ z6{-s}<)}80itdlv;{s_~|4_e{8ido;q6KnpL_^l=X0cyNzz5oCK literal 0 HcmV?d00001 diff --git a/styles/fonts/icomoon.woff b/styles/fonts/icomoon.woff new file mode 100644 index 0000000000000000000000000000000000000000..a4a4ff92a74af440af090f0311f6cba1311e57a2 GIT binary patch literal 2664 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 literal 0 HcmV?d00001 diff --git a/vendor/zenpen/css/fonts.css b/vendor/zenpen/css/fonts.css new file mode 100644 index 0000000..bb96d1c --- /dev/null +++ b/vendor/zenpen/css/fonts.css @@ -0,0 +1,60 @@ +@font-face { + font-family: 'icomoon'; + src:url('fonts/icomoon.eot'); + src:url('fonts/icomoon.eot?#iefix') format('embedded-opentype'), + url('fonts/icomoon.woff') format('woff'), + url('fonts/icomoon.ttf') format('truetype'), + url('fonts/icomoon.svg#icomoon') format('svg'); + font-weight: normal; + font-style: normal; +} + +/* Use the following CSS code if you want to use data attributes for inserting your icons */ +[data-icon]:before { + font-family: 'icomoon'; + content: attr(data-icon); + speak: none; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; +} + +/* Use the following CSS code if you want to have a class per icon */ +/* +Instead of a list of all class selectors, +you can use the generic selector below, but it's slower: +[class*="icon-"] { +*/ +.icon-expand, .icon-target, .icon-contrast, .icon-floppy, .icon-contract, .icon-link, .icon-download-alt { + font-family: 'icomoon'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; +} +.icon-expand:before { + content: "\e000"; +} +.icon-target:before { + content: "\e001"; +} +.icon-contrast:before { + content: "\e002"; +} +.icon-floppy:before { + content: "\e003"; +} +.icon-contract:before { + content: "\e004"; +} +.icon-link:before { + content: "\e005"; +} +.icon-download-alt:before { + content: "\e006"; +} \ No newline at end of file diff --git a/vendor/zenpen/css/style.css b/vendor/zenpen/css/style.css new file mode 100644 index 0000000..57d9e10 --- /dev/null +++ b/vendor/zenpen/css/style.css @@ -0,0 +1,496 @@ +/*! + * ZenPen + * http://www.zenpen.io + * MIT licensed + * + * Copyright (C) Tim Holman, http://tholman.com + */ + + +/********************************************* + * BASE STYLES + *********************************************/ + +* { + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +*:focus { + outline: none; +} + +html { + overflow: hidden; +} + + +html, body { + font-family: 'Lora', serif; + padding: 0px; + margin: 0px; + height: 100%; +} + +body { + padding-bottom: 40px; + padding-right: 10px; + overflow-y: scroll; + padding-left: 10px; + padding-top: 20px; + min-width: 800px; + width: 100%; + + -webkit-transition: all 600ms; + -moz-transition: all 600ms; + -ms-transition: all 600ms; + -o-transition: all 600ms; + transition: all 600ms; +} + +section { + max-width: 600px; + height: 100%; + margin: auto; +} + +header { + font-weight: bold; + font-size: 38px; +} + +article { + padding-bottom: 50px; + line-height: 30px; + margin-top: 22px; + min-height: 90%; + font-size: 22px; + display: block; +} + +blockquote { + border-left: 4px solid deepskyblue; + margin-left: -19px; + padding-left: 15px; + margin-right: 0px; +} + +.no-overflow { + overflow: hidden; + display: block; + height: 100%; + width: 100%; +} + +/* Used by the ui bubble to stop wrapping */ +.lengthen { + display: block; + width: 300px; + height: 100%; +} + +.useicons { + -webkit-font-smoothing: antialiased; + font-size: 20px !important; + font-family: 'icomoon' !important; +} + +.yin { + background: #fdfdfd; + color: #111; +} + +.yang { + background-color: #111; + color: #fafafa; +} + +.ui { + position: fixed; + padding: 20px; + width: 65px; + bottom: 0px; + left: 0px; + top: 0px; +} + +.ui:hover button { + opacity: 0.4; +} + +.ui button:hover { + opacity: 1; +} + +.ui button, .text-options button { + + -webkit-transition: opacity 400ms; + -moz-transition: opacity 400ms; + -ms-transition: opacity 400ms; + -o-transition: opacity 400ms; + transition: opacity 400ms; + + font-family: inherit; + background: none; + cursor: pointer; + font-size: 25px; + color: inherit; + opacity: 0.1; + padding: 0px; + height: 32px; + width: 25px; + border: 0px; +} + +a { + text-decoration: none; + color: deepskyblue; +} + +a:hover { + text-decoration: underline; +} + +.overlay { + position: fixed; + display: none; + height: 100%; + width: 100%; + z-index: 3; + left: 0px; + top: 0px; +} + +.quote { + line-height: 60px !important; + font-size: 49px !important; +} + +/********************************************* + * MODAL + *********************************************/ + +.yang .modal { + background-color: rgba(255,255,255,0.9); + color: #111; +} + +.modal { + background-color: rgba(0,0,0,0.9); + margin-left: -200px; + position: absolute; + border-radius: 3px; + height: 101px; + padding: 15px; + display: none; + width: 400px; + bottom: 10px; + color: #fff; + left: 50%; +} + +.modal h1 { + text-align: center; + font-size: 20px; + padding: 0px; + margin: 0px; +} + +.modal div { + margin-bottom: 10px; + margin-top: 10px; +} + +.modal input[type="number"] { + font-size: 16px; + display: block; + margin: auto; + width: 150px; + padding: 5px; +} + +.description { + height: 225px; +} + +.saveoverlay { + margin-left: -215px; + margin-top: -100px; + height: 170px; + left: 50%; + top: 50%; +} + +.saveoverlay div { + text-align: center; + font-size: 11px; +} + +.saveselection { + margin-top: 17px; + text-align:center; +} + +.saveselection span { + + -webkit-transition: color 250ms, background 250ms; + -moz-transition: color 250ms, background 250ms; + -ms-transition: color 250ms, background 250ms; + -o-transition: color 250ms, background 250ms; + transition: color 250ms, background 250ms; + + cursor: pointer; + font-size: 15px; + margin: 5px; + padding: 5px; + border: 2px solid white; + border-radius: 3px; +} + +.saveselection span:hover { + background: rgba(255,255,255,0.8); + color: black; +} + +.savebutton { + + -webkit-transition: opacity 250ms; + -moz-transition: opacity 250ms; + -ms-transition: opacity 250ms; + -o-transition: opacity 250ms; + transition: opacity 250ms; + + font-size: 30px !important; + margin: 15px auto; + background: none; + cursor: pointer; + display: block; + border: none; + padding: 0px; + width: 80px; + color: #fff; + margin-top: -2px; +} + +.savebutton:hover { + opacity: 0.7; +} + +.activesave { + background: rgba(255,255,255,0.8); + color: black; +} + +.hiddentextbox { + opacity:0; + filter:alpha(opacity=0); + position:absolute; +} + +/********************************************* + * WORK COUNT + *********************************************/ + +.wordcount { + margin-left: -150px; + width: 300px; +} + +.word-counter { + box-shadow: inset 0px 0px 9px -2px rgba(0,0,0,0.9); + position: fixed; + height: 100%; + right: -6px; + width: 6px; + top: 0px; +} + +.word-counter.active { + right: 0px; +} + +.word-counter .progress { + -webkit-transition: all 400ms ease-in-out; + -moz-transition: all 400ms ease-in-out; + -ms-transition: all 400ms ease-in-out; + -o-transition: all 400ms ease-in-out; + transition: all 400ms ease-in-out; + + background-color: deepskyblue; + position: absolute; + bottom: 0px; + width: 100%; + height: 0%; +} + +.progress.complete{ + background-color: greenyellow; +} + +/********************************************* + * UI BUBBLE + *********************************************/ + +.text-options { + + -webkit-transition: opacity 250ms, margin 250ms; + -moz-transition: opacity 250ms, margin 250ms; + -ms-transition: opacity 250ms, margin 250ms; + -o-transition: opacity 250ms, margin 250ms; + transition: opacity 250ms, margin 250ms; + + position: absolute; + left: -999px; + top: -999px; + color: #fff; + height: 0px; + width: 0px; + z-index: 5; + margin-top: 5px; + opacity: 0; +} + +.text-options.fade { + opacity: 0; + margin-top: -5px; +} + +.text-options.active { + opacity: 1; + margin-top: 0px; +} + +.options { + background-color: rgba(0,0,0,0.9); + position: absolute; + border-radius: 5px; + margin-left: -63px; + margin-top: -46px; + z-index: 1000; + padding: 5px 4px 5px 5px; + width: 125px; + height: 40px; + + -webkit-transition: all 300ms ease-in-out; + -moz-transition: all 300ms ease-in-out; + -ms-transition: all 300ms ease-in-out; + -o-transition: all 300ms ease-in-out; + transition: all 300ms ease-in-out; +} + +.options.url-mode { + width: 275px; + margin-left: -137px; +} + +.options.url-mode .bold, .options.url-mode .italic, .options.url-mode .quote { + width: 0px; + overflow: hidden; + margin-right: 0px; + opacity: 0; +} + +.options .italic { + font-style: italic; +} + +.options button { + -webkit-transition: all 250ms ease-in-out; + -moz-transition: all 250ms ease-in-out; + -ms-transition: all 250ms ease-in-out; + -o-transition: all 250ms ease-in-out; + transition: all 250ms ease-in-out; + + float: left; + width: 28px; + opacity: 0.7; + height: 30px; + border-radius: 3px; + margin-right: 1px; + font-family: 'Lora', serif; +} + +.options.url-mode input{ + border-left: 2px solid transparent; + padding-right: 5px; + padding-left: 5px; + width: 236px; +} + +.options input { + -webkit-transition: all 300ms ease-in-out; + -moz-transition: all 300ms ease-in-out; + -ms-transition: all 300ms ease-in-out; + -o-transition: all 300ms ease-in-out; + transition: all 300ms ease-in-out; + + border-radius: 3px; + overflow: hidden; + outline: 0px; + height: 30px; + padding: 0px; + margin: 0px; + border: 0px; + float: left; + width: 0px; +} + +.options button.active { + background-color: rgba(255,255,255,0.4); + opacity: 1; +} + +.yang .options button.active { + background-color: rgba(0,0,0,0.3); +} + +.options button:hover { + opacity: 0.95; +} + +.options:before { + content: ""; + border-top: 5px solid rgba(0,0,0,0.9); + border-bottom: 5px solid transparent; + border-right: 5px solid transparent; + border-left: 5px solid transparent; + position: absolute; + margin-left: -5px; + bottom: -15px; + height: 5px; + width: 0px; + left: 50%; +} + +.yang .options { + background-color: rgba(255,255,255,0.9); + color: #000; +} + +.yang .options:before { + border-top: 5px solid rgba(255,255,255,0.9); +} + +.url { + -webkit-font-smoothing: antialiased; +} + +.top { + position: absolute; + top: 0px; +} + +.bottom { + position: absolute; + bottom: 0px; +} + +.about { + font-family: 'Lora', serif; + font-size: 28px !important +} + +.wrapper { + position: relative; + height: 100%; +} \ No newline at end of file diff --git a/vendor/zenpen/js/editor.js b/vendor/zenpen/js/editor.js new file mode 100644 index 0000000..f9254b8 --- /dev/null +++ b/vendor/zenpen/js/editor.js @@ -0,0 +1,346 @@ +var editor = (function() { + + // Editor elements + var headerField, contentField, cleanSlate, lastType, currentNodeList, savedSelection; + + // Editor Bubble elements + var textOptions, optionsBox, boldButton, italicButton, quoteButton, urlButton, urlInput; + + + function init() { + + lastRange = 0; + bindElements(); + + // Set cursor position + var range = document.createRange(); + var selection = window.getSelection(); + range.setStart(headerField, 1); + selection.removeAllRanges(); + selection.addRange(range); + + createEventBindings(); + + // Load state if storage is supported + if ( supportsHtmlStorage() ) { + loadState(); + } + } + + function createEventBindings( on ) { + + // Key up bindings + if ( supportsHtmlStorage() ) { + + document.onkeyup = function( event ) { + checkTextHighlighting( event ); + saveState(); + } + + } else { + document.onkeyup = checkTextHighlighting; + } + + // Mouse bindings + document.onmousedown = checkTextHighlighting; + document.onmouseup = function( event ) { + + setTimeout( function() { + checkTextHighlighting( event ); + }, 1); + }; + + // Window bindings + window.addEventListener( 'resize', function( event ) { + updateBubblePosition(); + }); + + // Scroll bindings. We limit the events, to free the ui + // thread and prevent stuttering. See: + // http://ejohn.org/blog/learning-from-twitter + var scrollEnabled = true; + document.body.addEventListener( 'scroll', function() { + + if ( !scrollEnabled ) { + return; + } + + scrollEnabled = true; + + updateBubblePosition(); + + return setTimeout((function() { + scrollEnabled = true; + }), 250); + }); + } + + function bindElements() { + + headerField = document.querySelector( '.header' ); + contentField = document.querySelector( '.content' ); + textOptions = document.querySelector( '.text-options' ); + + optionsBox = textOptions.querySelector( '.options' ); + + boldButton = textOptions.querySelector( '.bold' ); + boldButton.onclick = onBoldClick; + + italicButton = textOptions.querySelector( '.italic' ); + italicButton.onclick = onItalicClick; + + quoteButton = textOptions.querySelector( '.quote' ); + quoteButton.onclick = onQuoteClick; + + urlButton = textOptions.querySelector( '.url' ); + urlButton.onmousedown = onUrlClick; + + urlInput = textOptions.querySelector( '.url-input' ); + urlInput.onblur = onUrlInputBlur; + urlInput.onkeydown = onUrlInputKeyDown; + } + + function checkTextHighlighting( event ) { + + var selection = window.getSelection(); + + if ( (event.target.className === "url-input" || + event.target.classList.contains( "url" ) || + event.target.parentNode.classList.contains( "ui-inputs")) ) { + + currentNodeList = findNodes( selection.focusNode ); + updateBubbleStates(); + return; + } + + // Check selections exist + if ( selection.isCollapsed === true && lastType === false ) { + + onSelectorBlur(); + } + + // Text is selected + if ( selection.isCollapsed === false ) { + + currentNodeList = findNodes( selection.focusNode ); + + // Find if highlighting is in the editable area + if ( hasNode( currentNodeList, "ARTICLE") ) { + updateBubbleStates(); + updateBubblePosition(); + + // Show the ui bubble + textOptions.className = "text-options active"; + } + } + + lastType = selection.isCollapsed; + } + + function updateBubblePosition() { + var selection = window.getSelection(); + var range = selection.getRangeAt(0); + var boundary = range.getBoundingClientRect(); + + textOptions.style.top = boundary.top - 5 + window.pageYOffset + "px"; + textOptions.style.left = (boundary.left + boundary.right)/2 + "px"; + } + + function updateBubbleStates() { + + // It would be possible to use classList here, but I feel that the + // browser support isn't quite there, and this functionality doesn't + // warrent a shim. + + if ( hasNode( currentNodeList, 'B') ) { + boldButton.className = "bold active" + } else { + boldButton.className = "bold" + } + + if ( hasNode( currentNodeList, 'I') ) { + italicButton.className = "italic active" + } else { + italicButton.className = "italic" + } + + if ( hasNode( currentNodeList, 'BLOCKQUOTE') ) { + quoteButton.className = "quote active" + } else { + quoteButton.className = "quote" + } + + if ( hasNode( currentNodeList, 'A') ) { + urlButton.className = "url useicons active" + } else { + urlButton.className = "url useicons" + } + } + + function onSelectorBlur() { + + textOptions.className = "text-options fade"; + setTimeout( function() { + + if (textOptions.className == "text-options fade") { + + textOptions.className = "text-options"; + textOptions.style.top = '-999px'; + textOptions.style.left = '-999px'; + } + }, 260 ) + } + + function findNodes( element ) { + + var nodeNames = {}; + + while ( element.parentNode ) { + + nodeNames[element.nodeName] = true; + element = element.parentNode; + + if ( element.nodeName === 'A' ) { + nodeNames.url = element.href; + } + } + + return nodeNames; + } + + function hasNode( nodeList, name ) { + + return !!nodeList[ name ]; + } + + function saveState( event ) { + + localStorage[ 'header' ] = headerField.innerHTML; + localStorage[ 'content' ] = contentField.innerHTML; + } + + function loadState() { + + if ( localStorage[ 'header' ] ) { + headerField.innerHTML = localStorage[ 'header' ]; + } + + if ( localStorage[ 'content' ] ) { + contentField.innerHTML = localStorage[ 'content' ]; + } + } + + function onBoldClick() { + document.execCommand( 'bold', false ); + } + + function onItalicClick() { + document.execCommand( 'italic', false ); + } + + function onQuoteClick() { + + var nodeNames = findNodes( window.getSelection().focusNode ); + + if ( hasNode( nodeNames, 'BLOCKQUOTE' ) ) { + document.execCommand( 'formatBlock', false, 'p' ); + document.execCommand( 'outdent' ); + } else { + document.execCommand( 'formatBlock', false, 'blockquote' ); + } + } + + function onUrlClick() { + + if ( optionsBox.className == 'options' ) { + + optionsBox.className = 'options url-mode'; + + // Set timeout here to debounce the focus action + setTimeout( function() { + + var nodeNames = findNodes( window.getSelection().focusNode ); + + if ( hasNode( nodeNames , "A" ) ) { + urlInput.value = nodeNames.url; + } else { + // Symbolize text turning into a link, which is temporary, and will never be seen. + document.execCommand( 'createLink', false, '/' ); + } + + // Since typing in the input box kills the highlighted text we need + // to save this selection, to add the url link if it is provided. + lastSelection = window.getSelection().getRangeAt(0); + lastType = false; + + urlInput.focus(); + + }, 100); + + } else { + + optionsBox.className = 'options'; + } + } + + function onUrlInputKeyDown( event ) { + + if ( event.keyCode === 13 ) { + event.preventDefault(); + applyURL( urlInput.value ); + urlInput.blur(); + } + } + + function onUrlInputBlur( event ) { + + optionsBox.className = 'options'; + applyURL( urlInput.value ); + urlInput.value = ''; + + currentNodeList = findNodes( window.getSelection().focusNode ); + updateBubbleStates(); + } + + function applyURL( url ) { + + rehighlightLastSelection(); + + // Unlink any current links + document.execCommand( 'unlink', false ); + + if (url !== "") { + + // Insert HTTP if it doesn't exist. + if ( !url.match("^(http|https)://") ) { + + url = "http://" + url; + } + + document.execCommand( 'createLink', false, url ); + } + } + + function rehighlightLastSelection() { + + window.getSelection().addRange( lastSelection ); + } + + function getWordCount() { + + var text = get_text( contentField ); + + if ( text === "" ) { + return 0 + } else { + return text.split(/\s+/).length; + } + } + + return { + init: init, + saveState: saveState, + getWordCount: getWordCount + } + +})(); \ No newline at end of file diff --git a/vendor/zenpen/js/libs/Blob.js b/vendor/zenpen/js/libs/Blob.js new file mode 100644 index 0000000..8aa6731 --- /dev/null +++ b/vendor/zenpen/js/libs/Blob.js @@ -0,0 +1,166 @@ +/* Blob.js + * A Blob implementation. + * 2013-06-20 + * + * By Eli Grey, http://eligrey.com + * By Devin Samarin, https://github.com/eboyjr + * License: X11/MIT + * See LICENSE.md + */ + +/*global self, unescape */ +/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true, + plusplus: true */ + +/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */ + +if (typeof Blob !== "function" || typeof URL === "undefined") +if (typeof Blob === "function" && typeof webkitURL !== "undefined") self.URL = webkitURL; +else var Blob = (function (view) { + "use strict"; + + var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || view.MSBlobBuilder || (function(view) { + var + get_class = function(object) { + return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; + } + , FakeBlobBuilder = function BlobBuilder() { + this.data = []; + } + , FakeBlob = function Blob(data, type, encoding) { + this.data = data; + this.size = data.length; + this.type = type; + this.encoding = encoding; + } + , FBB_proto = FakeBlobBuilder.prototype + , FB_proto = FakeBlob.prototype + , FileReaderSync = view.FileReaderSync + , FileException = function(type) { + this.code = this[this.name = type]; + } + , file_ex_codes = ( + "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR " + + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR" + ).split(" ") + , file_ex_code = file_ex_codes.length + , real_URL = view.URL || view.webkitURL || view + , real_create_object_URL = real_URL.createObjectURL + , real_revoke_object_URL = real_URL.revokeObjectURL + , URL = real_URL + , btoa = view.btoa + , atob = view.atob + + , ArrayBuffer = view.ArrayBuffer + , Uint8Array = view.Uint8Array + ; + FakeBlob.fake = FB_proto.fake = true; + while (file_ex_code--) { + FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1; + } + if (!real_URL.createObjectURL) { + URL = view.URL = {}; + } + URL.createObjectURL = function(blob) { + var + type = blob.type + , data_URI_header + ; + if (type === null) { + type = "application/octet-stream"; + } + if (blob instanceof FakeBlob) { + data_URI_header = "data:" + type; + if (blob.encoding === "base64") { + return data_URI_header + ";base64," + blob.data; + } else if (blob.encoding === "URI") { + return data_URI_header + "," + decodeURIComponent(blob.data); + } if (btoa) { + return data_URI_header + ";base64," + btoa(blob.data); + } else { + return data_URI_header + "," + encodeURIComponent(blob.data); + } + } else if (real_create_object_URL) { + return real_create_object_URL.call(real_URL, blob); + } + }; + URL.revokeObjectURL = function(object_URL) { + if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) { + real_revoke_object_URL.call(real_URL, object_URL); + } + }; + FBB_proto.append = function(data/*, endings*/) { + var bb = this.data; + // decode data to a binary string + if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) { + var + str = "" + , buf = new Uint8Array(data) + , i = 0 + , buf_len = buf.length + ; + for (; i < buf_len; i++) { + str += String.fromCharCode(buf[i]); + } + bb.push(str); + } else if (get_class(data) === "Blob" || get_class(data) === "File") { + if (FileReaderSync) { + var fr = new FileReaderSync; + bb.push(fr.readAsBinaryString(data)); + } else { + // async FileReader won't work as BlobBuilder is sync + throw new FileException("NOT_READABLE_ERR"); + } + } else if (data instanceof FakeBlob) { + if (data.encoding === "base64" && atob) { + bb.push(atob(data.data)); + } else if (data.encoding === "URI") { + bb.push(decodeURIComponent(data.data)); + } else if (data.encoding === "raw") { + bb.push(data.data); + } + } else { + if (typeof data !== "string") { + data += ""; // convert unsupported types to strings + } + // decode UTF-16 to binary string + bb.push(unescape(encodeURIComponent(data))); + } + }; + FBB_proto.getBlob = function(type) { + if (!arguments.length) { + type = null; + } + return new FakeBlob(this.data.join(""), type, "raw"); + }; + FBB_proto.toString = function() { + return "[object BlobBuilder]"; + }; + FB_proto.slice = function(start, end, type) { + var args = arguments.length; + if (args < 3) { + type = null; + } + return new FakeBlob( + this.data.slice(start, args > 1 ? end : this.data.length) + , type + , this.encoding + ); + }; + FB_proto.toString = function() { + return "[object Blob]"; + }; + return FakeBlobBuilder; + }(view)); + + return function Blob(blobParts, options) { + var type = options ? (options.type || "") : ""; + var builder = new BlobBuilder(); + if (blobParts) { + for (var i = 0, len = blobParts.length; i < len; i++) { + builder.append(blobParts[i]); + } + } + return builder.getBlob(type); + }; +}(self)); diff --git a/vendor/zenpen/js/libs/FileSaver.min.js b/vendor/zenpen/js/libs/FileSaver.min.js new file mode 100644 index 0000000..f0cbf85 --- /dev/null +++ b/vendor/zenpen/js/libs/FileSaver.min.js @@ -0,0 +1,2 @@ +/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ +var saveAs=saveAs||(navigator.msSaveOrOpenBlob&&navigator.msSaveOrOpenBlob.bind(navigator))||(function(h){"use strict";var r=h.document,l=function(){return h.URL||h.webkitURL||h},e=h.URL||h.webkitURL||h,n=r.createElementNS("http://www.w3.org/1999/xhtml","a"),g=!h.externalHost&&"download" in n,j=function(t){var s=r.createEvent("MouseEvents");s.initMouseEvent("click",true,false,h,0,0,0,0,0,false,false,false,false,0,null);t.dispatchEvent(s)},o=h.webkitRequestFileSystem,p=h.requestFileSystem||o||h.mozRequestFileSystem,m=function(s){(h.setImmediate||h.setTimeout)(function(){throw s},0)},c="application/octet-stream",k=0,b=[],i=function(){var t=b.length;while(t--){var s=b[t];if(typeof s==="string"){e.revokeObjectURL(s)}else{s.remove()}}b.length=0},q=function(t,s,w){s=[].concat(s);var v=s.length;while(v--){var x=t["on"+s[v]];if(typeof x==="function"){try{x.call(t,w||t)}catch(u){m(u)}}}},f=function(t,u){var v=this,B=t.type,E=false,x,w,s=function(){var F=l().createObjectURL(t);b.push(F);return F},A=function(){q(v,"writestart progress write writeend".split(" "))},D=function(){if(E||!x){x=s(t)}if(w){w.location.href=x}else{window.open(x,"_blank")}v.readyState=v.DONE;A()},z=function(F){return function(){if(v.readyState!==v.DONE){return F.apply(this,arguments)}}},y={create:true,exclusive:false},C;v.readyState=v.INIT;if(!u){u="download"}if(g){x=s(t);n.href=x;n.download=u;j(n);v.readyState=v.DONE;A();return}if(h.chrome&&B&&B!==c){C=t.slice||t.webkitSlice;t=C.call(t,0,t.size,c);E=true}if(o&&u!=="download"){u+=".download"}if(B===c||o){w=h}if(!p){D();return}k+=t.size;p(h.TEMPORARY,k,z(function(F){F.root.getDirectory("saved",y,z(function(G){var H=function(){G.getFile(u,y,z(function(I){I.createWriter(z(function(J){J.onwriteend=function(K){w.location.href=I.toURL();b.push(I);v.readyState=v.DONE;q(v,"writeend",K)};J.onerror=function(){var K=J.error;if(K.code!==K.ABORT_ERR){D()}};"writestart progress write abort".split(" ").forEach(function(K){J["on"+K]=v["on"+K]});J.write(t);v.abort=function(){J.abort();v.readyState=v.DONE};v.readyState=v.WRITING}),D)}),D)};G.getFile(u,{create:false},z(function(I){I.remove();H()}),z(function(I){if(I.code===I.NOT_FOUND_ERR){H()}else{D()}}))}),D)}),D)},d=f.prototype,a=function(s,t){return new f(s,t)};d.abort=function(){var s=this;s.readyState=s.DONE;q(s,"abort")};d.readyState=d.INIT=0;d.WRITING=1;d.DONE=2;d.error=d.onwritestart=d.onprogress=d.onwrite=d.onabort=d.onerror=d.onwriteend=null;h.addEventListener("unload",i,false);return a}(self)); diff --git a/vendor/zenpen/js/libs/fullScreen.js b/vendor/zenpen/js/libs/fullScreen.js new file mode 100644 index 0000000..cce7469 --- /dev/null +++ b/vendor/zenpen/js/libs/fullScreen.js @@ -0,0 +1,96 @@ +(function ( doc ) { + // Use JavaScript script mode + "use strict"; + + /*global Element */ + + var pollute = true, + api, + vendor, + apis = { + // http://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html + w3: { + enabled: "fullscreenEnabled", + element: "fullscreenElement", + request: "requestFullscreen", + exit: "exitFullscreen", + events: { + change: "fullscreenchange", + error: "fullscreenerror" + } + }, + webkit: { + enabled: "webkitIsFullScreen", + element: "webkitCurrentFullScreenElement", + request: "webkitRequestFullScreen", + exit: "webkitCancelFullScreen", + events: { + change: "webkitfullscreenchange", + error: "webkitfullscreenerror" + } + }, + moz: { + enabled: "mozFullScreen", + element: "mozFullScreenElement", + request: "mozRequestFullScreen", + exit: "mozCancelFullScreen", + events: { + change: "mozfullscreenchange", + error: "mozfullscreenerror" + } + } + }, + w3 = apis.w3; + + // Loop through each vendor's specific API + for (vendor in apis) { + // Check if document has the "enabled" property + if (apis[vendor].enabled in doc) { + // It seems this browser support the fullscreen API + api = apis[vendor]; + break; + } + } + + function dispatch( type, target ) { + var event = doc.createEvent( "Event" ); + + event.initEvent( type, true, false ); + target.dispatchEvent( event ); + } // end of dispatch() + + function handleChange( e ) { + // Recopy the enabled and element values + doc[w3.enabled] = doc[api.enabled]; + doc[w3.element] = doc[api.element]; + + dispatch( w3.events.change, e.target ); + } // end of handleChange() + + function handleError( e ) { + dispatch( w3.events.error, e.target ); + } // end of handleError() + + // Pollute only if the API doesn't already exists + if (pollute && !(w3.enabled in doc) && api) { + // Add listeners for fullscreen events + doc.addEventListener( api.events.change, handleChange, false ); + doc.addEventListener( api.events.error, handleError, false ); + + // Copy the default value + doc[w3.enabled] = doc[api.enabled]; + doc[w3.element] = doc[api.element]; + + // Match the reference for exitFullscreen + doc[w3.exit] = doc[api.exit]; + + // Add the request method to the Element's prototype + Element.prototype[w3.request] = function () { + return this[api.request].apply( this, arguments ); + }; + } + + // Return the API found (or undefined if the Fullscreen API is unavailable) + return api; + +}( document )); \ No newline at end of file diff --git a/vendor/zenpen/js/libs/head.min.js b/vendor/zenpen/js/libs/head.min.js new file mode 100644 index 0000000..fa49b31 --- /dev/null +++ b/vendor/zenpen/js/libs/head.min.js @@ -0,0 +1,17 @@ +(function(a,w){function f(a){p[p.length]=a}function m(a){q.className=q.className.replace(RegExp("\\b"+a+"\\b"),"")}function k(a,d){for(var b=0,c=a.length;ba?(c.screensCss.gt&&f("gt-"+a),c.screensCss.gte&&f("gte-"+ +a)):bb);h.feature("landscape",dl?(c.browserCss.gt&&f("gt-"+i+l),c.browserCss.gte&&f("gte-"+i+l)):bb&&k("abbr article aside audio canvas details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "), +function(a){n.createElement(a)});k(t.pathname.split("/"),function(a,b){if(2b.documentMode))e.onload=e.onreadystatechange=e.onerror=null,c()};e.onerror=function(){e.onload=e.onreadystatechange=e.onerror=null;c()};e.async=!1;e.defer=!1;var d=b.head||b.getElementsByTagName("head")[0];d.insertBefore(e,d.lastChild)}function p(){b.body?u||(u=!0,m(h,function(a){r(a)})): +(a.clearTimeout(d.readyTimeout),d.readyTimeout=a.setTimeout(p,50))}function c(){b.addEventListener?(b.removeEventListener("DOMContentLoaded",c,!1),p()):"complete"===b.readyState&&(b.detachEvent("onreadystatechange",c),p())}var b=a.document,h=[],v=[],x={},i={},A="async"in b.createElement("script")||"MozAppearance"in b.documentElement.style||a.opera,l,u,B=a.head_conf&&a.head_conf.head||"head",d=a[B]=a[B]||function(){d.ready.apply(null,arguments)},C=1,D=3,y=4;d.load=A?function(){var a=arguments,b=a[a.length- +1],e={};s(b)||(b=null);m(a,function(c,d){c!==b&&(c=n(c),e[c.name]=c,t(c,b&&d===a.length-2?function(){g(e)&&r(b)}:null))});return d}:function(){var a=arguments,b=[].slice.call(a,1),c=b[0];if(!l)return v.push(function(){d.load.apply(null,a)}),d;c?(m(b,function(a){if(!s(a)){var b=n(a);b.state===w&&(b.state=C,b.onpreload=[],q({url:b.url,type:"cache"},function(){b.state=2;m(b.onpreload,function(a){a.call()})}))}}),t(n(a[0]),s(c)?c:function(){d.load.apply(null,b)})):t(n(a[0]));return d};d.js=d.load;d.test= +function(a,b,c,g){a="object"===typeof a?a:{test:a,success:b?k("Array",b)?b:[b]:!1,failure:c?k("Array",c)?c:[c]:!1,callback:g||f};(b=!!a.test)&&a.success?(a.success.push(a.callback),d.load.apply(null,a.success)):!b&&a.failure?(a.failure.push(a.callback),d.load.apply(null,a.failure)):g();return d};d.ready=function(a,c){if(a===b)return u?r(c):h.push(c),d;s(a)&&(c=a,a="ALL");if("string"!==typeof a||!s(c))return d;var e=i[a];if(e&&e.state===y||"ALL"===a&&g()&&u)return r(c),d;(e=x[a])?e.push(c):x[a]=[c]; +return d};d.ready(b,function(){g()&&m(x.ALL,function(a){r(a)});d.feature&&d.feature("domloaded",!0)});if("complete"===b.readyState)p();else if(b.addEventListener)b.addEventListener("DOMContentLoaded",c,!1),a.addEventListener("load",p,!1);else{b.attachEvent("onreadystatechange",c);a.attachEvent("onload",p);var z=!1;try{z=null==a.frameElement&&b.documentElement}catch(F){}z&&z.doScroll&&function E(){if(!u){try{z.doScroll("left")}catch(b){a.clearTimeout(d.readyTimeout);d.readyTimeout=a.setTimeout(E,50); +return}p()}}()}setTimeout(function(){l=!0;m(v,function(a){a()})},300)})(window); diff --git a/vendor/zenpen/js/ui.js b/vendor/zenpen/js/ui.js new file mode 100644 index 0000000..3144e1c --- /dev/null +++ b/vendor/zenpen/js/ui.js @@ -0,0 +1,376 @@ +var ui = (function() { + + // Base elements + var body, article, uiContainer, overlay, aboutButton, descriptionModal; + + // Buttons + var screenSizeElement, colorLayoutElement, targetElement, saveElement; + + // Work Counter + var wordCountValue, wordCountBox, wordCountElement, wordCounter, wordCounterProgress; + + //save support + var supportSave, saveFormat, textToWrite; + + var expandScreenIcon = ''; + var shrinkScreenIcon = ''; + + var darkLayout = false; + + function init() { + + supportsSave = !!new Blob()?true:false; + + bindElements(); + + wordCountActive = false; + + if ( supportsHtmlStorage() ) { + loadState(); + } + + console.log( "Checkin under the hood eh? We've probably got a lot in common. You should totally check out ZenPen on github! (https://github.com/tholman/zenpen)." ); + } + + function loadState() { + + // Activate word counter + if ( localStorage['wordCount'] && localStorage['wordCount'] !== "0") { + wordCountValue = parseInt(localStorage['wordCount']); + wordCountElement.value = localStorage['wordCount']; + wordCounter.className = "word-counter active"; + updateWordCount(); + } + + // Activate color switch + if ( localStorage['darkLayout'] === 'true' ) { + if ( darkLayout === false ) { + document.body.className = 'yang'; + } else { + document.body.className = 'yin'; + } + darkLayout = !darkLayout; + } + + } + + function saveState() { + + if ( supportsHtmlStorage() ) { + localStorage[ 'darkLayout' ] = darkLayout; + localStorage[ 'wordCount' ] = wordCountElement.value; + } + } + + function bindElements() { + + // Body element for light/dark styles + body = document.body; + + uiContainer = document.querySelector( '.ui' ); + + // UI element for color flip + colorLayoutElement = document.querySelector( '.color-flip' ); + colorLayoutElement.onclick = onColorLayoutClick; + + // UI element for full screen + screenSizeElement = document.querySelector( '.fullscreen' ); + screenSizeElement.onclick = onScreenSizeClick; + + targetElement = document.querySelector( '.target '); + targetElement.onclick = onTargetClick; + + document.addEventListener( "fullscreenchange", function () { + if ( document.fullscreenEnabled === false ) { + exitFullscreen(); + } + }, false); + + //init event listeners only if browser can save + if (supportsSave) { + + saveElement = document.querySelector( '.save' ); + saveElement.onclick = onSaveClick; + + var formatSelectors = document.querySelectorAll( '.saveselection span' ); + for( var i in formatSelectors ) { + formatSelectors[i].onclick = selectFormat; + } + + document.querySelector('.savebutton').onclick = saveText; + } else { + document.querySelector('.save.useicons').style.display = "none"; + } + + // Overlay when modals are active + overlay = document.querySelector( '.overlay' ); + overlay.onclick = onOverlayClick; + + article = document.querySelector( '.content' ); + article.onkeyup = onArticleKeyUp; + + wordCountBox = overlay.querySelector( '.wordcount' ); + wordCountElement = wordCountBox.querySelector( 'input' ); + wordCountElement.onchange = onWordCountChange; + wordCountElement.onkeyup = onWordCountKeyUp; + + descriptionModal = overlay.querySelector( '.description' ); + + saveModal = overlay.querySelector('.saveoverlay'); + + wordCounter = document.querySelector( '.word-counter' ); + wordCounterProgress = wordCounter.querySelector( '.progress' ); + + aboutButton = document.querySelector( '.about' ); + aboutButton.onclick = onAboutButtonClick; + + header = document.querySelector( '.header' ); + header.onkeypress = onHeaderKeyPress; + } + + function onScreenSizeClick( event ) { + + if ( !document.fullscreenElement ) { + enterFullscreen(); + } else { + exitFullscreen(); + } + } + + function enterFullscreen() { + document.body.requestFullscreen( Element.ALLOW_KEYBOARD_INPUT ); + screenSizeElement.innerHTML = shrinkScreenIcon; + } + + function exitFullscreen() { + document.exitFullscreen(); + screenSizeElement.innerHTML = expandScreenIcon; + } + + function onColorLayoutClick( event ) { + if ( darkLayout === false ) { + document.body.className = 'yang'; + } else { + document.body.className = 'yin'; + } + darkLayout = !darkLayout; + + saveState(); + } + + function onTargetClick( event ) { + overlay.style.display = "block"; + wordCountBox.style.display = "block"; + wordCountElement.focus(); + } + + function onAboutButtonClick( event ) { + overlay.style.display = "block"; + descriptionModal.style.display = "block"; + } + + function onSaveClick( event ) { + overlay.style.display = "block"; + saveModal.style.display = "block"; + } + function saveText( event ) { + + if (typeof saveFormat != 'undefined' && saveFormat != '') { + var blob = new Blob([textToWrite], {type: "text/plain;charset=utf-8"}); + saveAs(blob, 'ZenPen.txt'); + } else { + document.querySelector('.saveoverlay h1').style.color = '#FC1E1E'; + } + } + /* Allows the user to press enter to tab from the title */ + function onHeaderKeyPress( event ) { + + if ( event.keyCode === 13 ) { + event.preventDefault(); + article.focus(); + } + } + + /* Allows the user to press enter to tab from the word count modal */ + function onWordCountKeyUp( event ) { + + if ( event.keyCode === 13 ) { + event.preventDefault(); + + setWordCount( parseInt(this.value) ); + + removeOverlay(); + + article.focus(); + } + } + + function onWordCountChange( event ) { + + setWordCount( parseInt(this.value) ); + } + + function setWordCount( count ) { + + // Set wordcount ui to active + if ( count > 0) { + + wordCountValue = count; + wordCounter.className = "word-counter active"; + updateWordCount(); + + } else { + + wordCountValue = 0; + wordCounter.className = "word-counter"; + } + + saveState(); + } + + function onArticleKeyUp( event ) { + + if ( wordCountValue > 0 ) { + updateWordCount(); + } + } + + function updateWordCount() { + + var wordCount = editor.getWordCount(); + var percentageComplete = wordCount / wordCountValue; + wordCounterProgress.style.height = percentageComplete * 100 + '%'; + + if ( percentageComplete >= 1 ) { + wordCounterProgress.className = "progress complete"; + } else { + wordCounterProgress.className = "progress"; + } + } + + function selectFormat( e ) { + + if ( document.querySelectorAll('span.activesave').length > 0 ) { + document.querySelector('span.activesave').className = ''; + } + + document.querySelector('.saveoverlay h1').style.cssText = ''; + + var targ; + if (!e) var e = window.event; + if (e.target) targ = e.target; + else if (e.srcElement) targ = e.srcElement; + + // defeat Safari bug + if (targ.nodeType == 3) { + targ = targ.parentNode; + } + + targ.className ='activesave'; + + saveFormat = targ.getAttribute('data-format'); + + var header = document.querySelector('header.header'); + var headerText = header.innerHTML.replace(/(\r\n|\n|\r)/gm,"") + "\n"; + + var body = document.querySelector('article.content'); + var bodyText = body.innerHTML; + + textToWrite = formatText(saveFormat,headerText,bodyText); + + var textArea = document.querySelector('.hiddentextbox'); + textArea.value = textToWrite; + textArea.focus(); + textArea.select(); + + } + + function formatText( type, header, body ) { + + var text; + switch( type ) { + + case 'html': + header = "

" + header + "

"; + text = header + body; + text = text.replace(/\t/g, ''); + break; + + case 'markdown': + header = header.replace(/\t/g, ''); + header = header.replace(/\n$/, ''); + header = "#" + header + "#"; + + text = body.replace(/\t/g, ''); + + text = text.replace(/|<\/b>/g,"**") + .replace(/\r\n+|\r+|\n+|\t+/ig,"") + .replace(/|<\/i>/g,"_") + .replace(/
/g,"> ") + .replace(/<\/blockquote>/g,"") + .replace(/

|<\/p>/gi,"\n") + .replace(/
/g,"\n"); + + var links = text.match(/(.+)<\/a>/gi); + + for ( var i = 0; i 0) { + document.querySelector('span.activesave').className = ''; + } + + saveFormat=''; + } + + return { + init: init + } + +})(); \ No newline at end of file diff --git a/vendor/zenpen/js/utils.js b/vendor/zenpen/js/utils.js new file mode 100644 index 0000000..b65759c --- /dev/null +++ b/vendor/zenpen/js/utils.js @@ -0,0 +1,29 @@ +// Utility functions + +String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/g, ''); }; + +function supportsHtmlStorage() { + try { + return 'localStorage' in window && window['localStorage'] !== null; + } catch (e) { + return false; + } +} + +function get_text(el) { + ret = " "; + var length = el.childNodes.length; + for(var i = 0; i < length; i++) { + var node = el.childNodes[i]; + if(node.nodeType != 8) { + + if ( node.nodeType != 1 ) { + // Strip white space. + ret += node.nodeValue; + } else { + ret += get_text( node ); + } + } + } + return ret.trim(); +} \ No newline at end of file diff --git a/views/calendar-page.html b/views/calendar-page.html index 7e8f49c..886c51f 100644 --- a/views/calendar-page.html +++ b/views/calendar-page.html @@ -1,15 +1,19 @@

-

{{schedule.month}},

+

+ < + , + > +

  • diff --git a/views/details-page.html b/views/details-page.html index c373c7a..d7ffca2 100644 --- a/views/details-page.html +++ b/views/details-page.html @@ -1,3 +1,10 @@ -

    - -
    \ No newline at end of file +Edit +
    +

    +

    +

    +
    +
    + \ No newline at end of file diff --git a/views/edit-page.html b/views/edit-page.html new file mode 100644 index 0000000..c1ae820 --- /dev/null +++ b/views/edit-page.html @@ -0,0 +1,32 @@ +
    +
    + This is ZenPen +
    + +
    + +

    + A minimalist writing zone, where you can block out all distractions and get to what's important. The writing! +

    + +

    + To get started, all you need to do is delete this text (seriously, just highlight it and hit delete), and fill the page with your own fantastic words. +

    + +

    + You can use bold, italics, both and urls just by highlighting the text and selecting them from the tiny options box that appears above it. +

    + +
    + Quotes are easy to add too! +
    + +

    + For questions and open source info, Click that little question mark at the bottom left of the screen. +

    + +

    Happy Typing! ~ Tim Holman (@twholman)

    + +
    + +
    \ No newline at end of file diff --git a/views/index.html b/views/index.html index ed070cf..db70776 100644 --- a/views/index.html +++ b/views/index.html @@ -3,6 +3,7 @@ + TechTalk portal @@ -67,14 +68,37 @@
+
+
+ + + + + + + + + +
+
+ + + + +