Stream Journal

Hello there. It’s me, a man named Karen (I know).

Thanks for checking out my app. Here are my suggestions on how to use Stream Journal app properly.

I plan to add a backup/ restore functionality someday. Right now I can’t find time for it.   If you have any suggestions on how I can improve the app, write me an email at karen@karengrig.com or add a comment down below.

And while you are here, you can check out my other apps.

If you are interested in iOS development, coding in general, or just anything related to IT, check out this list of articles on my blog.

Also subscribe to my mailing list. Why?

  • You’ll get infrequent updates from my blog.
  • Free apps! When I release a new paid app, I usually make it free for some time before setting the price. I will notify you of every such release. So, over time you might get quite a few free apps from me.

Subscribe!

(function(global) { function serialize(form){if(!form||form.nodeName!=="FORM"){return }var i,j,q=[];for(i=form.elements.length-1;i>=0;i=i-1){if(form.elements[i].name===""){continue}switch(form.elements[i].nodeName){case"INPUT":switch(form.elements[i].type){case"text":case"hidden":case"password":case"button":case"reset":case"submit":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"checkbox":case"radio":if(form.elements[i].checked){q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value))}break;case"file":break}break;case"TEXTAREA":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"SELECT":switch(form.elements[i].type){case"select-one":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break;case"select-multiple":for(j=form.elements[i].options.length-1;j>=0;j=j-1){if(form.elements[i].options[j].selected){q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].options[j].value))}}break}break;case"BUTTON":switch(form.elements[i].type){case"reset":case"submit":case"button":q.push(form.elements[i].name+"="+encodeURIComponent(form.elements[i].value));break}break}}return q.join("&")}; function extend(destination, source) { for (var prop in source) { destination[prop] = source[prop]; } } if (!Mimi) var Mimi = {}; if (!Mimi.Signups) Mimi.Signups = {}; Mimi.Signups.EmbedValidation = function() { this.initialize(); var _this = this; if (document.addEventListener) { this.form.addEventListener('submit', function(e){ _this.onFormSubmit(e); }); } else { this.form.attachEvent('onsubmit', function(e){ _this.onFormSubmit(e); }); } }; extend(Mimi.Signups.EmbedValidation.prototype, { initialize: function() { this.form = document.getElementById('ema_signup_form'); this.submit = document.getElementById('webform_submit_button'); this.callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random()); this.validEmail = /.+@.+\..+/ }, onFormSubmit: function(e) { e.preventDefault(); this.validate(); if (this.isValid) { this.submitForm(); } else { this.revalidateOnChange(); } }, validate: function() { this.isValid = true; this.emailValidation(); this.fieldAndListValidation(); this.updateFormAfterValidation(); }, emailValidation: function() { var email = document.getElementById('signup_email'); if (this.validEmail.test(email.value)) { this.removeTextFieldError(email); } else { this.textFieldError(email); this.isValid = false; } }, fieldAndListValidation: function() { var fields = this.form.querySelectorAll('.mimi_field.required'); for (var i = 0; i = 0) { return 'checkboxes'; } else { return 'text_field'; } }, checkboxAndRadioValidation: function(field) { var inputs = field.getElementsByTagName('input'), selected = false; for (var i = 0; i < inputs.length; ++i) { var input = inputs[i]; if((input.type === 'checkbox' || input.type === 'radio') && input.checked) { selected = true; } } if (selected) { field.className = field.className.replace(/ invalid/g, ''); } else { if (field.className.indexOf('invalid') === -1) { field.className += ' invalid'; } this.isValid = false; } }, textAndDropdownValidation: function(field, type) { var inputs = field.getElementsByTagName('input'); for (var i = 0; i = 0) { if (type === 'text_field') { this.textValidation(input); } else { this.dropdownValidation(field, input); } } } this.htmlEmbedDropdownValidation(field); }, textValidation: function(input) { if (input.id === 'signup_email') return; if (input.value) { this.removeTextFieldError(input); } else { this.textFieldError(input); this.isValid = false; } }, dropdownValidation: function(field, input) { if (input.value) { field.className = field.className.replace(/ invalid/g, ''); } else { if (field.className.indexOf('invalid') === -1) field.className += ' invalid'; this.onSelectCallback(input); this.isValid = false; } }, htmlEmbedDropdownValidation: function(field) { var dropdowns = field.querySelectorAll('.mimi_html_dropdown'); var _this = this; for (var i = 0; i < dropdowns.length; ++i) { var dropdown = dropdowns[i]; if (dropdown.value) { field.className = field.className.replace(/ invalid/g, ''); } else { if (field.className.indexOf('invalid') === -1) field.className += ' invalid'; this.isValid = false; dropdown.onchange = (function(){ _this.validate(); }); } } }, textFieldError: function(input) { input.className = 'required invalid'; input.placeholder = input.getAttribute('data-required-field'); }, removeTextFieldError: function(input) { input.className = 'required'; input.placeholder = ''; }, onSelectCallback: function(input) { if (typeof Widget === 'undefined' || !Widget.BasicDropdown) return; var dropdownEl = input.parentNode, instances = Widget.BasicDropdown.instances, _this = this; for (var i = 0; i < instances.length; ++i) { var instance = instances[i]; if (instance.wrapperEl === dropdownEl) { instance.onSelect = function(){ _this.validate() }; } } }, updateFormAfterValidation: function() { this.form.className = this.setFormClassName(); this.submit.value = this.submitButtonText(); this.submit.disabled = !this.isValid; this.submit.className = this.isValid ? 'submit' : 'disabled'; }, setFormClassName: function() { var name = this.form.className; if (this.isValid) { return name.replace(/\s?mimi_invalid/, ''); } else { if (name.indexOf('mimi_invalid') === -1) { return name += ' mimi_invalid'; } else { return name; } } }, submitButtonText: function() { var invalidFields = document.querySelectorAll('.invalid'), text; if (this.isValid || !invalidFields) { text = this.submit.getAttribute('data-default-text'); } else { if (invalidFields.length || invalidFields[0].className.indexOf('checkgroup') === -1) { text = this.submit.getAttribute('data-invalid-text'); } else { text = this.submit.getAttribute('data-choose-list'); } } return text; }, submitForm: function() { this.formSubmitting(); var _this = this; window[this.callbackName] = function(response) { delete window[this.callbackName]; document.body.removeChild(script); _this.onSubmitCallback(response); }; var script = document.createElement('script'); script.src = this.formUrl('json'); document.body.appendChild(script); }, formUrl: function(format) { var action = this.form.action; if (format === 'json') action += '.json'; return action + '?callback=' + this.callbackName + '&' + serialize(this.form); }, formSubmitting: function() { this.form.className += ' mimi_submitting'; this.submit.value = this.submit.getAttribute('data-submitting-text'); this.submit.disabled = true; this.submit.className = 'disabled'; }, onSubmitCallback: function(response) { if (response.success) { this.onSubmitSuccess(response.result); } else { top.location.href = this.formUrl('html'); } }, onSubmitSuccess: function(result) { if (result.has_redirect) { top.location.href = result.redirect; } else if(result.single_opt_in || !result.confirmation_html) { this.disableForm(); this.updateSubmitButtonText(this.submit.getAttribute('data-thanks')); } else { this.showConfirmationText(result.confirmation_html); } }, showConfirmationText: function(html) { var fields = this.form.querySelectorAll('.mimi_field'); for (var i = 0; i < fields.length; ++i) { fields[i].style['display'] = 'none'; } (this.form.querySelectorAll('fieldset')[0] || this.form).innerHTML = html; }, disableForm: function() { var elements = this.form.elements; for (var i = 0; i < elements.length; ++i) { elements[i].disabled = true; } }, updateSubmitButtonText: function(text) { this.submit.value = text; }, revalidateOnChange: function() { var fields = this.form.querySelectorAll(".mimi_field.required"), _this = this; for (var i = 0; i < fields.length; ++i) { var inputs = fields[i].getElementsByTagName('input'); for (var j = 0; j < inputs.length; ++j) { if (this.fieldType(fields[i]) === 'text_field') { inputs[j].onkeyup = function() { var input = this; if (input.getAttribute('name') === 'signup[email]') { if (_this.validEmail.test(input.value)) _this.validate(); } else { if (input.value.length === 1) _this.validate(); } } } else { inputs[j].onchange = function(){ _this.validate() }; } } } } }); if (document.addEventListener) { document.addEventListener("DOMContentLoaded", function() { new Mimi.Signups.EmbedValidation(); }); } else { window.attachEvent('onload', function() { new Mimi.Signups.EmbedValidation(); }); } })(this);
Download main document
Floating links were modified