PageSourceSearch

https://ncascades.org/++theme++ncascades/scripts/application.js?v=4

js ncascades.org collected 2026-09-24 09:11:52 UTC 8,930 bytes, 196 lines download raw bytes

1$(function () {
2    require(['jquery', 'mockup-patterns-select2'], function ($) {
3        var decode_json = function (str) {
4            return $('<div />').html(str).text();
5        };
6
7        var $blog_nav = $('li.portaltab-blog');
8        var blog_url = $blog_nav.find('> a').attr('href').replace(/\/?$/, '/');
9
10        $.ajax({
11            url: blog_url + 'wp-json/wp/v2/categories?_jsonp=?',
12            cache: true,
13            dataType: 'jsonp',
14            jsonpCallback : '_render_blog_submenu'
15        }).done(
16            function (data) {
17                var $nav_link, $submenu, category, i;
18                if (data.length) {
19                    $submenu = $('<ul class=submenu></ul>').appendTo($blog_nav);
20                }
21                for (i = 0; i < data.length; i++) {
22                    category = data[i];
23                    $nav_link = $('<a></a>').attr('href', category.link)
24                                            .attr('title', decode_json(category.description))
25                                            .html(decode_json(category.name));
26                    $('<li></li>').append($nav_link).appendTo($submenu);
27                }
28            }
29        );
30
31        // Enable blog specific category and tag selection
32        var setup_blog_portlet_form = function () {
33            var auto_reset = true;
34            var $category_input = $('input#form-widgets-blog_category');
35            var $tag_input = $('input#form-widgets-blog_tag');
36            var $blog_url_input = $('input#form-widgets-blog_url');
37            var blog_cat = $category_input.val();
38            var blog_tag = $tag_input.val();
39            var blog_url = $blog_url_input.val();
40            var update_select = function (blog_url) {
41                var api_url = blog_url.replace(/\/?$/, '/') + 'wp-json/wp/v2/categories';
42                // We can't use select2 AJAX unless API has CORS Access-Control-Allow-Origin
43                $.ajax({
44                    url: api_url + '?_jsonp=?',
45                    cache: true,
46                    dataType: 'jsonp',
47                    jsonpCallback : '_render_blog_category_filter'
48                }).done(
49                    function (data) {
50                        var results = [{ id: '', text: 'All Categories' }];
51                        var i;
52                        for (i = 0; i < data.length; i++){
53                            results.push({id: data[i].id, text: data[i].name});
54                        }
55                        $category_input.select2({
56                            data: results,
57                            placeholder: 'Select an optional category'
58                        })
59                    }
60                );
61            };
62            var update_tags = function(blog_url) {
63                var api_url = blog_url.replace(/\/?$/, '/');
64                api_url += 'wp-json/wp/v2/tags?_jsonp=?&search=';
65                $tag_input.select2({
66                    minimumInputLength: 3,
67                    ajax: {
68                        cache: true,
69                        dataType: 'jsonp',
70                        crossDomain: true,
71                        jsonpCallback: '_render_blog_tag_filter',
72                        quietMillis: 1000,
73                        url: function (params) {
74                            return api_url + params;
75                        },
76                        results: function (data) {
77                            data.unshift({ id: '', name: 'All Tags'});
78                            return {
79                                results: data.map(el => ({id: el.id, text: el.name}) )
80                            }
81                        },
82                    },
83                    initSelection: function(el, callback) {
84                        var initid = $(el).val();
85                        if (initid !== '') {
86                            var api_tag_url = blog_url.replace(/\/?$/, '/');
87                            api_tag_url += 'wp-json/wp/v2/tags/' + initid + '?_jsonp=?';
88                            $.ajax(
89                                api_tag_url,
90                                {
91                                    cache: true,
92                                    dataType: 'jsonp',
93                                    jsonpCallback: '_render_tag_name'
94                                }
95                            ).done( data => callback({id: data.id, text: data.name}) );
96                        }
97                    },
98                    placeholder: 'Select an optional tag'
99               });
100
101            };
102            if (blog_url) {
103                update_select(blog_url);
104                update_tags(blog_url);
105            } else {
106                $category_input.select2({placeholder: 'Select an optional category', data: [{id: blog_cat, text: blog_cat}]});
107                $tag_input.select2({placeholder: 'Select an optional tag', data: [{id: blog_tag, text: blog_tag}]});
108            }
109
110            $('input#form-widgets-blog_url').on('blur', function () {
111                var blog_url = $('input#form-widgets-blog_url').val();
112                if (blog_url) {
113                    update_select(blog_url);
114                    update_tags(blog_url);
115                }
116            });
117            $category_input.on('change', function () {
118                if (auto_reset) {
119                    auto_reset = false;
120                    $tag_input.val(null).trigger('change');
121                } else {
122                    auto_reset = true;
123                }
124            });
125            $tag_input.on('change', function () {
126                if (auto_reset) {
127                    auto_reset = false;
128                    $category_input.val(null).trigger('change');
129                } else {
130                    auto_reset = true;
131                }
132            });
133        };
134        setup_blog_portlet_form();
135        $('body').on('shown.plone-modal.patterns', setup_blog_portlet_form);
136        var insert_post_image = function ($container, post) {
137            var image_url;
138            var caption;
139            var embedded = post._embedded['wp:featuredmedia'];
140            if (embedded && embedded.length) {
141                image_url = embedded[0].media_details.sizes.thumbnail.source_url;
142                caption = embedded[0].caption.rendered;
143            }
144            if (!image_url) {
145                image_url = 'https://ncascades.org/++theme++ncascades/images/icons/chattermarks.svg';
146            }
147            if (!caption) {
148                caption = post.title.rendered;
149            }
150            $container.append($('<img />').attr('src', image_url)
151                                        .attr('alt', decode_json(caption)));
152        }
153        // Render blog portlet
154        $('.wp-blog-portlet').each(function (i, e) {
155            var $portlet = $(e);
156            var blog_url = $portlet.find('a.wp-blog-link').attr('href');
157            if (!blog_url) {
158                return;
159            }
160            var $holder = $portlet.find('.articles');
161            var count = $holder.data('count');
162            var category = $holder.data('category');
163            var tag = $holder.data('tag');
164            var images = $holder.data('images');
165            var api_url = blog_url.replace(/\/?$/, '/') + 'wp-json/wp/v2/posts';
166            api_url = api_url + '?per_page=' + count;
167            if (category) {
168                api_url = api_url + '&categories=' + category;
169            } else if (tag) {
170                api_url = api_url + '&tags=' + tag;
171            }
172            $.ajax({url: api_url + '&_embed=1&_jsonp=?',
173                cache: true,
174                dataType: 'jsonp',
175                jsonpCallback : '_fetch_blog_posts'
176            }).done(function (data) {
177                for (var i=0; i < data.length; i++) {
178                    var post = data[i];
179                    var date = new Date(post.date);
180                    var $elem = $('<article></article>').appendTo($holder);
181                    if (images) {
182                        var $image_holder = $('<a></a>').attr('href', post.link).appendTo(
183                            $('<div class="blog-post-image"></div>').appendTo($elem));
184                        insert_post_image($image_holder, post);
185                    }
186                    var $article_holder = $('<div class="article-body"></div>').appendTo($elem);
187                    var $title_link = $('<a></a>').attr('href', post.link)
188                                                .attr('title', decode_json(post.excerpt.rendered))
189                                                .text(decode_json(post.title.rendered));
190                    $article_holder.append($('<h3></h3>').append($title_link));
191                    $article_holder.append($('<div class="date"></div>').text(date.toLocaleDateString('en-US', {month: 'short', day: 'numeric', year: 'numeric'})));
192                }
193            })
194        });
195    });
196});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.