176 lines
		
	
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* eslint-env browser */
 | 
						|
/* eslint prefer-arrow-callback: 0, object-shorthand: 0, new-cap: 0, no-invalid-this: 0, no-var: 0*/
 | 
						|
 | 
						|
if (typeof window.mailtrain !== 'object') {
 | 
						|
    window.mailtrain = {};
 | 
						|
    (function(mt) {
 | 
						|
        'use strict';
 | 
						|
 | 
						|
        if (document.documentMode <= 9 || typeof XMLHttpRequest === 'undefined') {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        var cookie = {
 | 
						|
            create: function(name, value, days) {
 | 
						|
                var date = new Date();
 | 
						|
                date.setTime(date.getTime() + ((days || 365) * 24 * 60 * 60 * 1000));
 | 
						|
                var expires = '; expires=' + date.toGMTString();
 | 
						|
                document.cookie = name + '=' + value + expires + '; path=/';
 | 
						|
            },
 | 
						|
            read: function(name) {
 | 
						|
                var a = document.cookie.match('(^|;)\\s*' + name + '\\s*=\\s*([^;]+)');
 | 
						|
                return a ? a.pop() : null;
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        var forEach = function(array, callback, scope) {
 | 
						|
            for (var i = 0; i < array.length; i++) {
 | 
						|
                callback.call(scope, i, array[i]);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        var loadScript = function(exists, url, callback) {
 | 
						|
            if (eval(exists)) {
 | 
						|
                return callback(true);
 | 
						|
            }
 | 
						|
            var scriptTag = document.createElement('script');
 | 
						|
            scriptTag.setAttribute('type', 'text/javascript');
 | 
						|
            scriptTag.setAttribute('src', url);
 | 
						|
            if (typeof callback !== 'undefined') {
 | 
						|
                if (scriptTag.readyState) {
 | 
						|
                    scriptTag.onreadystatechange = function() {
 | 
						|
                        (this.readyState === 'complete' || this.readyState === 'loaded') && callback();
 | 
						|
                    };
 | 
						|
                } else {
 | 
						|
                    scriptTag.onload = callback;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            (document.getElementsByTagName('head')[0] || document.documentElement).appendChild(scriptTag);
 | 
						|
        };
 | 
						|
 | 
						|
        var serialize = function(form) {
 | 
						|
            var field, s = [];
 | 
						|
            if (typeof form === 'object' && form.nodeName === 'FORM') {
 | 
						|
                var len = form.elements.length;
 | 
						|
                for (var i = 0; i < len; i++) {
 | 
						|
                    field = form.elements[i];
 | 
						|
                    if (field.name && !field.disabled && field.type !== 'file' && field.type !== 'reset' && field.type !== 'submit' && field.type !== 'button') {
 | 
						|
                        if (field.type === 'select-multiple') {
 | 
						|
                            for (var j = form.elements[i].options.length - 1; j >= 0; j--) {
 | 
						|
                                if (field.options[j].selected) {
 | 
						|
                                    s[s.length] = encodeURIComponent(field.name) + '=' + encodeURIComponent(field.options[j].value);
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                        } else if ((field.type !== 'checkbox' && field.type !== 'radio') || field.checked) {
 | 
						|
                            s[s.length] = encodeURIComponent(field.name) + '=' + encodeURIComponent(field.value);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            return s.join('&').replace(/%20/g, '+');
 | 
						|
        };
 | 
						|
 | 
						|
        var getXHR = function(method, url, successHandler, errorHandler) {
 | 
						|
            var xhr = new XMLHttpRequest();
 | 
						|
            xhr.open(method, url, true);
 | 
						|
            xhr.onreadystatechange = function() {
 | 
						|
                if (xhr.readyState === 4) {
 | 
						|
                    var data;
 | 
						|
                    try {
 | 
						|
                        data = JSON.parse(xhr.responseText);
 | 
						|
                    } catch(err) {
 | 
						|
                        data = { error: err.message || err };
 | 
						|
                    }
 | 
						|
                    xhr.status === 200 && !data.error
 | 
						|
                        ? successHandler && successHandler(data)
 | 
						|
                        : errorHandler && errorHandler(data);
 | 
						|
                }
 | 
						|
            };
 | 
						|
            return xhr;
 | 
						|
        };
 | 
						|
 | 
						|
        var getJSON = function(url, successHandler, errorHandler) {
 | 
						|
            var xhr = getXHR('get', url, successHandler, errorHandler);
 | 
						|
            xhr.send();
 | 
						|
        };
 | 
						|
 | 
						|
        var sendForm = function(form, successHandler, errorHandler) {
 | 
						|
            var url = form.getAttribute('action');
 | 
						|
            var xhr = getXHR('post', url, successHandler, errorHandler);
 | 
						|
            xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
 | 
						|
            xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
 | 
						|
            xhr.send(serialize(form));
 | 
						|
        };
 | 
						|
 | 
						|
        var renderWidget = function(container, data) {
 | 
						|
            container.innerHTML = data.html;
 | 
						|
 | 
						|
            var form = container.querySelector('.form');
 | 
						|
            var statusContainer = container.querySelector('.status');
 | 
						|
 | 
						|
            var setStatus = function(templateName, message) {
 | 
						|
                var html = container.querySelector('div[data-status-template="' + templateName + '"]').outerHTML;
 | 
						|
                html = message ? html.replace('{message}', message) : html;
 | 
						|
                statusContainer.innerHTML = html;
 | 
						|
            };
 | 
						|
 | 
						|
            if (cookie.read('has-subscribed-to-' + data.cid)) {
 | 
						|
                setStatus('already-subscribed');
 | 
						|
                form.style.display = 'none';
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            container.querySelector('.sub-time').value = new Date().getTime();
 | 
						|
 | 
						|
            if (window.moment && window.moment.tz) {
 | 
						|
                container.querySelector('.tz-detect').value = window.moment.tz.guess() || '';
 | 
						|
            }
 | 
						|
 | 
						|
            var isSending = false;
 | 
						|
 | 
						|
            form.addEventListener('submit', function(event) {
 | 
						|
                event.preventDefault();
 | 
						|
 | 
						|
                if (isSending) {
 | 
						|
                    return;
 | 
						|
                }
 | 
						|
 | 
						|
                isSending = true;
 | 
						|
                setStatus('spinner');
 | 
						|
 | 
						|
                sendForm(form, function(j) {
 | 
						|
                    isSending = false;
 | 
						|
                    setStatus('confirm-notice');
 | 
						|
                    form.style.display = 'none';
 | 
						|
                    container.scrollIntoView();
 | 
						|
                    cookie.create('has-subscribed-to-' + data.cid, 1);
 | 
						|
                }, function(j) {
 | 
						|
                    isSending = false;
 | 
						|
                    setStatus('error', j.error);
 | 
						|
                });
 | 
						|
            });
 | 
						|
        };
 | 
						|
 | 
						|
        forEach(document.body.querySelectorAll('div[data-mailtrain-subscription-widget]'), function(i, container) {
 | 
						|
            var url = container.getAttribute('data-url');
 | 
						|
            getJSON(url, function(j) {
 | 
						|
                renderWidget(container, j.data);
 | 
						|
            }, function(j) {
 | 
						|
                console.log(j);
 | 
						|
            });
 | 
						|
        });
 | 
						|
 | 
						|
        document.addEventListener('DOMContentLoaded', function() {
 | 
						|
            loadScript('window.moment', 'https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.min.js', function(existed) {
 | 
						|
                loadScript('window.moment.tz', 'https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.3/moment-timezone-with-data.min.js', function(existed) {
 | 
						|
                    if (window.moment && window.moment.tz) {
 | 
						|
                        forEach(document.body.querySelectorAll('div[data-mailtrain-subscription-widget] .tz-detect'), function(i, el) {
 | 
						|
                            el.value = window.moment.tz.guess() || '';
 | 
						|
                        });
 | 
						|
                    }
 | 
						|
                });
 | 
						|
            });
 | 
						|
        });
 | 
						|
 | 
						|
    })(window.mailtrain);
 | 
						|
}
 |