diff options
| author | 2013-10-26 16:49:44 +0200 | |
|---|---|---|
| committer | 2013-10-26 16:49:44 +0200 | |
| commit | dd5273871a74d01d87fa1eaad7aa53bc1c148f85 (patch) | |
| tree | d59245952cc982ef8b09119e71739d3c0adc2c99 /public/scripts | |
| parent | 298b5ecf206ff0020d8fed29e9aba4d7b148b080 (diff) | |
| parent | 410f7631988e277d615c5acab44d3380f5f34b9b (diff) | |
Merge branch 'AvoidNonCacheableJavaScript' of https://github.com/Alkarex/FreshRSS into Alkarex-AvoidNonCacheableJavaScript
Conflicts:
app/views/javascript/main.phtml
Diffstat (limited to 'public/scripts')
| -rw-r--r-- | public/scripts/main.js | 422 |
1 files changed, 422 insertions, 0 deletions
diff --git a/public/scripts/main.js b/public/scripts/main.js new file mode 100644 index 000000000..72795be51 --- /dev/null +++ b/public/scripts/main.js @@ -0,0 +1,422 @@ +function is_reader_mode() { + var stream = $("#stream.reader"); + return stream.html() != null; +} + +function is_normal_mode() { + var stream = $("#stream.normal"); + return stream.html() != null; +} + +function is_global_mode() { + var stream = $("#stream.global"); + return stream.html() != null; +} + +function redirect (url, new_tab) { + if (url) { + if (new_tab) { + window.open (url); + } else { + location.href = url; + } + } +} + +function toggleContent (new_active, old_active) { + old_active.removeClass ("active"); + if (old_active[0] != new_active[0]) { + new_active.addClass ("active"); + } + + var box_to_move = "html,body"; + var relative_move = false; + if (is_global_mode()) { + box_to_move = "#panel"; + relative_move = true; + } + + var new_pos = new_active.position ().top, + old_scroll = $(box_to_move).scrollTop (), + new_scroll = old_scroll; + if (hide_posts) { + old_active.children (".flux_content").toggle (0); + + new_pos = new_active.position ().top; + old_scroll = $(box_to_move).scrollTop (); + + if (relative_move) { + new_pos += old_scroll; + } + + if (old_active[0] != new_active[0]) { + new_active.children (".flux_content").toggle (0, function () { + new_scroll = $(box_to_move).scrollTop (new_pos).scrollTop (); + }); + } + } else { + if (relative_move) { + new_pos += old_scroll; + } + + new_scroll = $(box_to_move).scrollTop (new_pos).scrollTop (); + } + + if ((new_scroll === old_scroll) && $.fn.lazyload) { + $(window).trigger ("scroll"); //When no scroll was done, generate fake scroll event for LazyLoad to load images + } + + if (auto_mark_article) { + mark_read(new_active, true); + } +} + +function mark_read (active, only_not_read) { + if (active[0] === undefined || ( + only_not_read === true && !active.hasClass("not_read"))) { + return false; + } + + url = active.find ("a.read").attr ("href"); + if (url === undefined) { + return false; + } + + $.ajax ({ + type: 'POST', + url: url, + data : { ajax: true } + }).done (function (data) { + res = jQuery.parseJSON(data); + + active.find ("a.read").attr ("href", res.url); + + if (active.hasClass ("not_read")) { + active.removeClass ("not_read"); + } else if (only_not_read !== true || active.hasClass("not_read")) { + active.addClass ("not_read"); + } + }); +} + +function mark_favorite (active) { + if (active[0] === undefined) { + return false; + } + + url = active.find ("a.bookmark").attr ("href"); + if (url === undefined) { + return false; + } + + $.ajax ({ + type: 'POST', + url: url, + data : { ajax: true } + }).done (function (data) { + res = jQuery.parseJSON(data); + + active.find ("a.bookmark").attr ("href", res.url); + if (active.hasClass ("favorite")) { + active.removeClass ("favorite"); + } else { + active.addClass ("favorite"); + } + }); +} + +function prev_entry() { + old_active = $(".flux.active"); + last_active = $(".flux:last"); + new_active = old_active.prevAll (".flux:first"); + + if (new_active.hasClass("flux")) { + toggleContent (new_active, old_active); + } else if (old_active[0] === undefined && + new_active[0] === undefined) { + toggleContent (last_active, old_active); + } +} + +function next_entry() { + old_active = $(".flux.active"); + first_active = $(".flux:first"); + last_active = $(".flux:last"); + new_active = old_active.nextAll (".flux:first"); + + if (new_active.hasClass("flux")) { + toggleContent (new_active, old_active); + } else if (old_active[0] === undefined && + new_active[0] === undefined) { + toggleContent (first_active, old_active); + } + + if ((!auto_load_more) && (last_active.attr("id") === new_active.attr("id"))) { + load_more_posts (); + } +} + +function init_img () { + var maxWidth = $(".flux_content .content").width() / 2; + $(".flux_content .content img").each (function () { + if ($(this).width () > maxWidth) { + $(this).addClass("big"); + } + }); +} + +function inMarkViewport(flux, box_to_follow, relative_follow) { + var top = flux.position().top; + if (relative_follow) { + top += box_to_follow.scrollTop(); + } + var height = flux.height(); + var begin = top + 3 * height / 4; + var bot = Math.min(begin + 75, top + height); + + var windowTop = box_to_follow.scrollTop(); + var windowBot = windowTop + box_to_follow.height() / 2; + + return (windowBot >= begin && bot >= windowBot); +} + +function init_posts () { + init_img (); + if (does_lazyload) { + if (is_global_mode()) { + $(".flux .content img").lazyload({ + container: $("#panel") + }); + } else { + $(".flux .content img").lazyload(); + } + } + + if (hide_posts) { + $(".flux:not(.active) .flux_content").hide (); + } + + var box_to_follow = $(window); + var relative_follow = false; + if (is_global_mode()) { + box_to_follow = $("#panel"); + relative_follow = true; + } + + if (auto_mark_scroll) { + box_to_follow.scroll(function() { + $('.flux.not_read:visible').each(function() { + if ($(this).children(".flux_content").is(':visible') && + inMarkViewport($(this), box_to_follow, relative_follow)) { + mark_read($(this), true); + } + }); + }); + } + + if (auto_load_more) { + box_to_follow.scroll(function() { + var load_more = $("#load_more"); + if (!load_more.is(':visible')) return; + var boxBot = box_to_follow.scrollTop() + box_to_follow.height(); + var load_more_top = load_more.position().top; + if (relative_follow) { + load_more_top += box_to_follow.scrollTop(); + } + if (boxBot >= load_more_top) { + load_more_posts (); + } + }); + } +} + +function init_column_categories () { + if (!is_normal_mode()) { + return; + } + + $(".category").addClass ("stick"); + $(".categories .category .btn:first-child").width ("160px"); + $(".category").append ("<a class=\"btn dropdown-toggle\" href=\"#\"><i class=\"icon i_down\"></i></a>"); + + $(".category + .feeds").not(".active").hide(); + $(".category.active a.dropdown-toggle i").toggleClass ("i_up"); + + $(".category a.dropdown-toggle").click (function () { + $(this).children ().toggleClass ("i_up"); + $(this).parent ().next (".feeds").slideToggle(); + return false; + }); +} + +function init_shortcuts () { + // Touches de manipulation + shortcut.add(shortcuts['mark_read'], function () { + // on marque comme lu ou non lu + active = $(".flux.active"); + mark_read (active, false); + }, { + 'disable_in_input':true + }); + shortcut.add("shift+"+shortcuts['mark_read'], function () { + // on marque tout comme lu + url = $(".nav_menu a.read_all").attr ("href"); + redirect (url, false); + }, { + 'disable_in_input':true + }); + shortcut.add(shortcuts['mark_favorite'], function () { + // on marque comme favori ou non favori + active = $(".flux.active"); + mark_favorite (active); + }, { + 'disable_in_input':true + }); + + // Touches de navigation + shortcut.add(shortcuts['prev_entry'], prev_entry, { + 'disable_in_input':true + }); + shortcut.add("shift+"+shortcuts['prev_entry'], function () { + old_active = $(".flux.active"); + first = $(".flux:first"); + + if (first.hasClass("flux")) { + toggleContent (first, old_active); + } + }, { + 'disable_in_input':true + }); + shortcut.add(shortcuts['next_entry'], next_entry, { + 'disable_in_input':true + }); + shortcut.add("shift+"+shortcuts['next_entry'], function () { + old_active = $(".flux.active"); + last = $(".flux:last"); + + if (last.hasClass("flux")) { + toggleContent (last, old_active); + } + }, { + 'disable_in_input':true + }); + shortcut.add(shortcuts['go_website'], function () { + url_website = $(".flux.active .link a").attr ("href"); + + if (auto_mark_site) { + $(".flux.active").each (function () { + mark_read($(this), true); + }); + } + + redirect (url_website, true); + }, { + 'disable_in_input':true + }); +} + +function init_stream_delegates(divStream) { + divStream.on('click', '.flux_header .item.title, .flux_header .item.date', function (e) { //flux_header_toggle + old_active = $(".flux.active"); + new_active = $(this).parent ().parent (); + if (e.target.tagName.toUpperCase() === 'A') { //Leave real links alone + if (auto_mark_article) { + mark_read(new_active, true); + } + return true; + } + toggleContent (new_active, old_active); + }); + + divStream.on('click', '.flux a.read', function () { + active = $(this).parents (".flux"); + mark_read (active, false); + + return false; + }); + + divStream.on('click', '.flux a.bookmark', function () { + active = $(this).parents (".flux"); + mark_favorite (active); + + return false; + }); + + divStream.on('click', '.flux .content a', function () { + $(this).attr ('target', '_blank'); + }); + + divStream.on('click', '.item.title>a',function (e) { + if (e.ctrlKey) return true; //Allow default control-click behaviour such as open in backround-tab + $(this).parent ().click (); //Will perform toggle flux_content + return false; + }); + + divStream.on('click', '.bigMarkAsRead', function() { + url = $(".nav_menu a.read_all").attr ("href"); + redirect (url, false); + return false; + }); + + if (auto_mark_site) { + divStream.on('click', '.flux .link a', function () { + mark_read($(this).parent().parent().parent(), true); + }); + } +} + +function init_nav_entries() { + $('.nav_entries a.previous_entry').click(function() { + prev_entry(); + return false; + }); + $('.nav_entries a.next_entry').click(function() { + next_entry(); + return false; + }); + $('.nav_entries a.up').click(function() { + var active_item = $(".flux.active"); + var windowTop = $(window).scrollTop(); + var item_top = active_item.position ().top; + + if (windowTop > item_top) { + $("html,body").scrollTop (item_top); + } else { + $("html,body").scrollTop (0); + } + return false; + }); +} + +function init_templates() { + $('#aside_flux').on('click', '.dropdown-toggle', function () { + if ($(this).nextAll('.dropdown-menu').length === 0) { + var feed_id = $(this).data('fid'), + feed_web = $(this).data('fweb'), + template = $('#feed_config_template').html().replace(/!!!!!!/g, feed_id).replace('http://example.net/', feed_web); + $(this).attr('href', '#dropdown-' + feed_id).prev('.dropdown-target').attr('id', 'dropdown-' + feed_id).parent().append(template); + } + }); +} + +function init_actualize() { + $("#actualize").click (function () { + $.getScript('./?c=javascript&a=actualize').done(function() { + updateFeeds (); + }); + return false; + }); +} + +$(function () { + if (is_reader_mode()) { + hide_posts = false; + } + init_posts (); + init_column_categories (); + init_shortcuts (); + init_stream_delegates($('#stream')); + init_nav_entries(); + init_templates(); + init_actualize(); +}); |
