
Recherche avancée
Médias (1)
-
The pirate bay depuis la Belgique
1er avril 2013, par kent1
Mis à jour : Avril 2013
Langue : français
Type : Image
Autres articles (89)
-
Amélioration de la version de base
13 septembre 2013Jolie sélection multiple
Le plugin Chosen permet d’améliorer l’ergonomie des champs de sélection multiple. Voir les deux images suivantes pour comparer.
Il suffit pour cela d’activer le plugin Chosen (Configuration générale du site > Gestion des plugins), puis de configurer le plugin (Les squelettes > Chosen) en activant l’utilisation de Chosen dans le site public et en spécifiant les éléments de formulaires à améliorer, par exemple select[multiple] pour les listes à sélection multiple (...) -
Multilang : améliorer l’interface pour les blocs multilingues
18 février 2011, par kent1Multilang est un plugin supplémentaire qui n’est pas activé par défaut lors de l’initialisation de MediaSPIP.
Après son activation, une préconfiguration est mise en place automatiquement par MediaSPIP init permettant à la nouvelle fonctionnalité d’être automatiquement opérationnelle. Il n’est donc pas obligatoire de passer par une étape de configuration pour cela. -
ANNEXE : Les plugins utilisés spécifiquement pour la ferme
5 mars 2010, par kent1Le site central/maître de la ferme a besoin d’utiliser plusieurs plugins supplémentaires vis à vis des canaux pour son bon fonctionnement. le plugin Gestion de la mutualisation ; le plugin inscription3 pour gérer les inscriptions et les demandes de création d’instance de mutualisation dès l’inscription des utilisateurs ; le plugin verifier qui fournit une API de vérification des champs (utilisé par inscription3) ; le plugin champs extras v2 nécessité par inscription3 (...)
Sur d’autres sites (5753)
-
Revision 30228 : Amélioration du formulaire de config
26 juillet 2009, par kent1@… — LogAmélioration du formulaire de config
-
Matomo analytics for wordpress
15 octobre 2019, par Matomo Core Team — CommunitySelf-hosting web analytics got a whole lot easier ! Introducing Matomo for WordPress
Be the first to try it out ! Your feedback is much needed and appreciated
Get a fully functioning Matomo (which is comparable to Google Analytics) in seconds ! How ? With the new Matomo Analytics for WordPress plugin.
Web analytics in WordPress has never been easier to get, or more powerful. Matomo Analytics for WordPress is the one-stop problem solver. It’ll save you time, money and give you the insights to help your website or business succeed.
Best of all, we get to further the goal of decentralising the internet. Our hope is for Matomo Analytics for WordPress to spread far and wide. We’re so excited that more and more people can now get their hands on this powerful, free, open-source analytics platform, in a few clicks !
Download now and check it out !
What do you get ?
- No more signing up to third party analytics service (like Google)
- No more sending away your valuable data to a third party service (like Google)
- Easy setup – install with a few clicks, no tracking code installation or developer knowledge needed
- 100% accurate data – no data sampling and no data limits
- Full data ownership – all data is stored on your servers and no one else can see your data
- Privacy protection / GDPR compliance
- Ecommerce tracking out-of-the-box (Woocommerce, Easy Digital Downloads, and MemberPress) and we’re keen to add many more over time
- Powerful features – segmenting, comparing reports, different visualisations, real-time reports, visit logs and visitor profiles, Matomo Tag Manager, dashboards, data export, APIs, and many more
- Compared to other WordPress solutions we don’t charge you extra for basic features that should work out-of-the-box
- Just like Matomo On-Premise, Matomo Analytics for WordPress is free
We need your feedback !
We all know and love the versatility of WordPress – with over 55,000 plugins and all the different ways of hosting it. However, with this great versatility comes the potential for things to be missed, so we’re keen to hear your feedback.
- Is our plugin breaking anything on your WordPress, or, not compatible with something ? Please create an issue on our repository.
- Is something not working ? If so, what ? Please create an issue on our repository.
- How does running Matomo impact the performance of your WordPress server ? Also, if you have any other feedback for us – whether good or bad – please email us at wordpress@matomo.org. We’d love to hear what you think !
- Can you perform a security review of the plugin ? Security issues are best reported to security@matomo.org
- Do you have any questions ? Questions are best asked in our forum
Thank you ! We really appreciate your help on this ❤️
How do you get Matomo Analytics for WordPress ?
You can then upload it in your WordPress by going to “Plugins => Add New”. During the upload, if you get an error like “Are you sure you want to do this ?”, we recommend you upload the extracted zip file on to your server and into your ‘wp-content/plugins’ folder manually using ftp or ssh. Make sure the plugin name is ‘matomo’.
All you need is at least WordPress 4.8 and PHP 7.0 or later. MySQL 5.1+ is recommended.
The source code is available at : https://github.com/matomo-org/wp-matomo/.
In perfect harmony : Matomo and WordPress
The idea for this started two years ago when we realised the similarities between the Matomo and WordPress project.
Not only from a technological point of view – where both are based on PHP and MySQL and can be extended using plugins – but also from a philosophical, license and values point of view. We both believe in privacy, security, data ownership, openness, transparency, having things working out-of-the-box, simplicity etc.
WordPress is currently used on approximately 30% of all websites. Many of them use the self-hosted open-source WordPress version. Giving everyone in this market the opportunity to easily get a powerful web analytics platform for free, means a lot to us. We believe WordPress users get a real choice besides the standard solution of Google Analytics, and it furthers our effort and goal of decentralising the internet.
We’re hoping more people will be empowered to protect user privacy, have access to a great free and open-source tool, and keep control of data in their own hands.
We hope you feel the same. Help us spread the word to your friends and get them in on this awesome new project !
Share on facebookShare on twitterShare on linkedinFAQs
Isn’t there already a WP-Matomo plugin for WordPress available ?
Yes, the existing WP-Matomo (WP-Piwik) plugin is an awesome plugin to connect your existing Matomo On-Premise or Matomo Cloud account with WordPress. The difference is that this new plugin installs Matomo Analytics fully in your WordPress. So you get the convenience of having a powerful analytics platform within your WordPress.
We highly recommend you install this new plugin if you use WordPress and are not running Matomo yet.
If you are already using Matomo on our Cloud or On-Premise, we’d still highly recommend you use WP-Matomo (WP-Piwik). So that you get an easier way of inserting the tracking code into your WordPress site and get insights faster.
I have a high traffic website, will it be an issue ?
If you have a lot of traffic, we’d advise you to install Matomo On-Premise separately. There’s no specific traffic threshold we can give you on when it’s better to use Matomo On-Premise. It really depends on your server.
We reckon if you have more than 500,000 page views a month, you may want to think about using Matomo On-Premise with WP-Matomo instead, but this is just an estimate. In general, if the load on your server is already quite high, then it might be better to install Matomo on a separate server. See also recommended server sizing for running Matomo.
How do I report a bug or request a new feature in Matomo for WordPress ?
Please create an issue, on our repository whenever you find a bug or if you have any suggestion or ideas of improvement. We want to build an outstanding analytics experience for WordPress !
Have another question you’re dying to ask ? The Matomo for WordPress FAQ page might have the answer you need.
Matomo Analytics for WordPress newsletter
Get ahead of the crowd – signup to our exclusive Matomo for WordPress newsletter to get the latest updates on this exciting new project.
<script type="text/javascript"><br />
(function(global) {<br />
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("&")};<br />
<br />
<br />
function extend(destination, source) {<br />
for (var prop in source) {<br />
destination[prop] = source[prop];<br />
}<br />
}<br />
<br />
if (!Mimi) var Mimi = {};<br />
if (!Mimi.Signups) Mimi.Signups = {};<br />
<br />
Mimi.Signups.EmbedValidation = function() {<br />
this.initialize();<br />
<br />
var _this = this;<br />
if (document.addEventListener) {<br />
this.form.addEventListener('submit', function(e){<br />
_this.onFormSubmit(e);<br />
});<br />
} else {<br />
this.form.attachEvent('onsubmit', function(e){<br />
_this.onFormSubmit(e);<br />
});<br />
}<br />
};<br />
<br />
extend(Mimi.Signups.EmbedValidation.prototype, {<br />
initialize: function() {<br />
this.form = document.getElementById('ema_signup_form');<br />
this.submit = document.getElementById('webform_submit_button');<br />
this.callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());<br />
this.validEmail = /.+@.+\..+/<br />
},<br />
<br />
onFormSubmit: function(e) {<br />
e.preventDefault();<br />
<br />
this.validate();<br />
if (this.isValid) {<br />
this.submitForm();<br />
} else {<br />
this.revalidateOnChange();<br />
}<br />
},<br />
<br />
validate: function() {<br />
this.isValid = true;<br />
this.emailValidation();<br />
this.fieldAndListValidation();<br />
this.updateFormAfterValidation();<br />
},<br />
<br />
emailValidation: function() {<br />
var email = document.getElementById('signup_email');<br />
<br />
if (this.validEmail.test(email.value)) {<br />
this.removeTextFieldError(email);<br />
} else {<br />
this.textFieldError(email);<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
fieldAndListValidation: function() {<br />
var fields = this.form.querySelectorAll('.mimi_field.required');<br />
<br />
for (var i = 0; i < fields.length; ++i) {<br />
var field = fields[i],<br />
type = this.fieldType(field);<br />
if (type === 'checkboxes' || type === 'radio_buttons' || type === 'age_check') {<br />
this.checkboxAndRadioValidation(field);<br />
} else {<br />
this.textAndDropdownValidation(field, type);<br />
}<br />
}<br />
},<br />
<br />
fieldType: function(field) {<br />
var type = field.querySelectorAll('.field_type');<br />
<br />
if (type.length) {<br />
return type[0].getAttribute('data-field-type');<br />
} else if (field.className.indexOf('checkgroup') >= 0) {<br />
return 'checkboxes';<br />
} else {<br />
return 'text_field';<br />
}<br />
},<br />
<br />
checkboxAndRadioValidation: function(field) {<br />
var inputs = field.getElementsByTagName('input'),<br />
selected = false;<br />
<br />
for (var i = 0; i < inputs.length; ++i) {<br />
var input = inputs[i];<br />
if((input.type === 'checkbox' || input.type === 'radio') && input.checked) {<br />
selected = true;<br />
}<br />
}<br />
<br />
if (selected) {<br />
field.className = field.className.replace(/ invalid/g, '');<br />
} else {<br />
if (field.className.indexOf('invalid') === -1) {<br />
field.className += ' invalid';<br />
}<br />
<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
textAndDropdownValidation: function(field, type) {<br />
var inputs = field.getElementsByTagName('input');<br />
<br />
for (var i = 0; i < inputs.length; ++i) {<br />
var input = inputs[i];<br />
if (input.name.indexOf('signup') >= 0) {<br />
if (type === 'text_field') {<br />
this.textValidation(input);<br />
} else {<br />
this.dropdownValidation(field, input);<br />
}<br />
}<br />
}<br />
this.htmlEmbedDropdownValidation(field);<br />
},<br />
<br />
textValidation: function(input) {<br />
if (input.id === 'signup_email') return;<br />
<br />
if (input.value) {<br />
this.removeTextFieldError(input);<br />
} else {<br />
this.textFieldError(input);<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
dropdownValidation: function(field, input) {<br />
if (input.value) {<br />
field.className = field.className.replace(/ invalid/g, '');<br />
} else {<br />
if (field.className.indexOf('invalid') === -1) field.className += ' invalid';<br />
this.onSelectCallback(input);<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
htmlEmbedDropdownValidation: function(field) {<br />
var dropdowns = field.querySelectorAll('.mimi_html_dropdown');<br />
var _this = this;<br />
<br />
for (var i = 0; i < dropdowns.length; ++i) {<br />
var dropdown = dropdowns[i];<br />
<br />
if (dropdown.value) {<br />
field.className = field.className.replace(/ invalid/g, '');<br />
} else {<br />
if (field.className.indexOf('invalid') === -1) field.className += ' invalid';<br />
this.isValid = false;<br />
dropdown.onchange = (function(){ _this.validate(); });<br />
}<br />
}<br />
},<br />
<br />
textFieldError: function(input) {<br />
input.className = 'required invalid';<br />
input.placeholder = input.getAttribute('data-required-field');<br />
},<br />
<br />
removeTextFieldError: function(input) {<br />
input.className = 'required';<br />
input.placeholder = '';<br />
},<br />
<br />
onSelectCallback: function(input) {<br />
if (typeof Widget === 'undefined' || !Widget.BasicDropdown) return;<br />
<br />
var dropdownEl = input.parentNode,<br />
instances = Widget.BasicDropdown.instances,<br />
_this = this;<br />
<br />
for (var i = 0; i < instances.length; ++i) {<br />
var instance = instances[i];<br />
if (instance.wrapperEl === dropdownEl) {<br />
instance.onSelect = function(){ _this.validate() };<br />
}<br />
}<br />
},<br />
<br />
updateFormAfterValidation: function() {<br />
this.form.className = this.setFormClassName();<br />
this.submit.value = this.submitButtonText();<br />
this.submit.disabled = !this.isValid;<br />
this.submit.className = this.isValid ? 'submit' : 'disabled';<br />
},<br />
<br />
setFormClassName: function() {<br />
var name = this.form.className;<br />
<br />
if (this.isValid) {<br />
return name.replace(/\s?mimi_invalid/, '');<br />
} else {<br />
if (name.indexOf('mimi_invalid') === -1) {<br />
return name += ' mimi_invalid';<br />
} else {<br />
return name;<br />
}<br />
}<br />
},<br />
<br />
submitButtonText: function() {<br />
var invalidFields = document.querySelectorAll('.invalid'),<br />
text;<br />
<br />
if (this.isValid || !invalidFields) {<br />
text = this.submit.getAttribute('data-default-text');<br />
} else {<br />
if (invalidFields.length || invalidFields[0].className.indexOf('checkgroup') === -1) {<br />
text = this.submit.getAttribute('data-invalid-text');<br />
} else {<br />
text = this.submit.getAttribute('data-choose-list');<br />
}<br />
}<br />
return text;<br />
},<br />
<br />
submitForm: function() {<br />
this.formSubmitting();<br />
<br />
var _this = this;<br />
window[this.callbackName] = function(response) {<br />
delete window[this.callbackName];<br />
document.body.removeChild(script);<br />
_this.onSubmitCallback(response);<br />
};<br />
<br />
var script = document.createElement('script');<br />
script.src = this.formUrl('json');<br />
document.body.appendChild(script);<br />
},<br />
<br />
formUrl: function(format) {<br />
var action = this.form.action;<br />
if (format === 'json') action += '.json';<br />
return action + '?callback=' + this.callbackName + '&' + serialize(this.form);<br />
},<br />
<br />
formSubmitting: function() {<br />
this.form.className += ' mimi_submitting';<br />
this.submit.value = this.submit.getAttribute('data-submitting-text');<br />
this.submit.disabled = true;<br />
this.submit.className = 'disabled';<br />
},<br />
<br />
onSubmitCallback: function(response) {<br />
if (response.success) {<br />
this.onSubmitSuccess(response.result);<br />
} else {<br />
top.location.href = this.formUrl('html');<br />
}<br />
},<br />
<br />
onSubmitSuccess: function(result) {<br />
if (result.has_redirect) {<br />
top.location.href = result.redirect;<br />
} else if(result.single_opt_in || !result.confirmation_html) {<br />
this.disableForm();<br />
this.updateSubmitButtonText(this.submit.getAttribute('data-thanks'));<br />
} else {<br />
this.showConfirmationText(result.confirmation_html);<br />
}<br />
},<br />
<br />
showConfirmationText: function(html) {<br />
var fields = this.form.querySelectorAll('.mimi_field');<br />
<br />
for (var i = 0; i < fields.length; ++i) {<br />
fields[i].style['display'] = 'none';<br />
}<br />
<br />
(this.form.querySelectorAll('fieldset')[0] || this.form).innerHTML = html;<br />
},<br />
<br />
disableForm: function() {<br />
var elements = this.form.elements;<br />
for (var i = 0; i < elements.length; ++i) {<br />
elements[i].disabled = true;<br />
}<br />
},<br />
<br />
updateSubmitButtonText: function(text) {<br />
this.submit.value = text;<br />
},<br />
<br />
revalidateOnChange: function() {<br />
var fields = this.form.querySelectorAll(".mimi_field.required"),<br />
_this = this;<br />
<br />
var onTextFieldChange = function() {<br />
if (this.getAttribute('name') === 'signup[email]') {<br />
if (_this.validEmail.test(this.value)) _this.validate();<br />
} else {<br />
if (this.value.length === 1) _this.validate();<br />
}<br />
}<br />
<br />
for (var i = 0; i < fields.length; ++i) {<br />
var inputs = fields[i].getElementsByTagName('input');<br />
for (var j = 0; j < inputs.length; ++j) {<br />
if (this.fieldType(fields[i]) === 'text_field') {<br />
inputs[j].onkeyup = onTextFieldChange;<br />
inputs[j].onchange = onTextFieldChange; <br />
} else {<br />
inputs[j].onchange = function(){ _this.validate() };<br />
}<br />
}<br />
}<br />
}<br />
});<br />
<br />
if (document.addEventListener) {<br />
document.addEventListener("DOMContentLoaded", function() {<br />
new Mimi.Signups.EmbedValidation();<br />
});<br />
}<br />
else {<br />
window.attachEvent('onload', function() {<br />
new Mimi.Signups.EmbedValidation();<br />
});<br />
}<br />
})(this);<br />
</script> -
Matomo analytics for wordpress
15 octobre 2019, par Matomo Core Team — CommunitySelf-hosting web analytics got a whole lot easier ! Introducing Matomo for WordPress
Be the first to try it out ! Your feedback is much needed and appreciated
Get a fully functioning Matomo (which is comparable to Google Analytics) in seconds ! How ? With the new Matomo Analytics for WordPress plugin.
Web analytics in WordPress has never been easier to get, or more powerful. Matomo Analytics for WordPress is the one-stop problem solver. It’ll save you time, money and give you the insights to help your website or business succeed.
Best of all, we get to further the goal of decentralising the internet. Our hope is for Matomo Analytics for WordPress to spread far and wide. We’re so excited that more and more people can now get their hands on this powerful, free, open-source analytics platform, in a few clicks !
Download now and check it out !
What do you get ?
- No more signing up to third party analytics service (like Google)
- No more sending away your valuable data to a third party service (like Google)
- Easy setup – install with a few clicks, no tracking code installation or developer knowledge needed
- 100% accurate data – no data sampling and no data limits
- Full data ownership – all data is stored on your servers and no one else can see your data
- Privacy protection / GDPR compliance
- Ecommerce tracking out-of-the-box (Woocommerce, Easy Digital Downloads, and MemberPress) and we’re keen to add many more over time
- Powerful features – segmenting, comparing reports, different visualisations, real-time reports, visit logs and visitor profiles, Matomo Tag Manager, dashboards, data export, APIs, and many more
- Compared to other WordPress solutions we don’t charge you extra for basic features that should work out-of-the-box
- Just like Matomo On-Premise, Matomo Analytics for WordPress is free
We need your feedback !
We all know and love the versatility of WordPress – with over 55,000 plugins and all the different ways of hosting it. However, with this great versatility comes the potential for things to be missed, so we’re keen to hear your feedback.
- Is our plugin breaking anything on your WordPress, or, not compatible with something ? Please create an issue on our repository.
- Is something not working ? If so, what ? Please create an issue on our repository.
- How does running Matomo impact the performance of your WordPress server ? Also, if you have any other feedback for us – whether good or bad – please email us at wordpress@matomo.org. We’d love to hear what you think !
- Can you perform a security review of the plugin ? Security issues are best reported to security@matomo.org
- Do you have any questions ? Questions are best asked in our forum
Thank you ! We really appreciate your help on this ❤️
How do you get Matomo Analytics for WordPress ?
Log in to your WordPress and go to “Plugins => Add New”, search for “Matomo Analytics – Ethical Stats. Powerful Insights”, click on “Install” and then “Activate”.
All you need is at least WordPress 4.8 and PHP 7.0 or later. MySQL 5.1+ is recommended.
The source code is available at : https://github.com/matomo-org/wp-matomo/.
In perfect harmony : Matomo and WordPress
The idea for this started two years ago when we realised the similarities between the Matomo and WordPress project.
Not only from a technological point of view – where both are based on PHP and MySQL and can be extended using plugins – but also from a philosophical, license and values point of view. We both believe in privacy, security, data ownership, openness, transparency, having things working out-of-the-box, simplicity etc.
WordPress is currently used on approximately 30% of all websites. Many of them use the self-hosted open-source WordPress version. Giving everyone in this market the opportunity to easily get a powerful web analytics platform for free, means a lot to us. We believe WordPress users get a real choice besides the standard solution of Google Analytics, and it furthers our effort and goal of decentralising the internet.
We’re hoping more people will be empowered to protect user privacy, have access to a great free and open-source tool, and keep control of data in their own hands.
We hope you feel the same. Help us spread the word to your friends and get them in on this awesome new project !
Share on facebookShare on twitterShare on linkedinFAQs
Isn’t there already a WP-Matomo plugin for WordPress available ?
Yes, the existing WP-Matomo (WP-Piwik) plugin is an awesome plugin to connect your existing Matomo On-Premise or Matomo Cloud account with WordPress. The difference is that this new plugin installs Matomo Analytics fully in your WordPress. So you get the convenience of having a powerful analytics platform within your WordPress.
We highly recommend you install this new plugin if you use WordPress and are not running Matomo yet.
If you are already using Matomo on our Cloud or On-Premise, we’d still highly recommend you use WP-Matomo (WP-Piwik). So that you get an easier way of inserting the tracking code into your WordPress site and get insights faster.
I have a high traffic website, will it be an issue ?
If you have a lot of traffic, we’d advise you to install Matomo On-Premise separately. There’s no specific traffic threshold we can give you on when it’s better to use Matomo On-Premise. It really depends on your server.
We reckon if you have more than 500,000 page views a month, you may want to think about using Matomo On-Premise with WP-Matomo instead, but this is just an estimate. In general, if the load on your server is already quite high, then it might be better to install Matomo on a separate server. See also recommended server sizing for running Matomo.
How do I report a bug or request a new feature in Matomo for WordPress ?
Please create an issue, on our repository whenever you find a bug or if you have any suggestion or ideas of improvement. We want to build an outstanding analytics experience for WordPress !
Have another question you’re dying to ask ? The Matomo for WordPress FAQ page might have the answer you need.
Matomo Analytics for WordPress newsletter
Get ahead of the crowd – signup to our exclusive Matomo for WordPress newsletter to get the latest updates on this exciting new project.
<script type="text/javascript"><br />
(function(global) {<br />
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("&")};<br />
<br />
<br />
function extend(destination, source) {<br />
for (var prop in source) {<br />
destination[prop] = source[prop];<br />
}<br />
}<br />
<br />
if (!Mimi) var Mimi = {};<br />
if (!Mimi.Signups) Mimi.Signups = {};<br />
<br />
Mimi.Signups.EmbedValidation = function() {<br />
this.initialize();<br />
<br />
var _this = this;<br />
if (document.addEventListener) {<br />
this.form.addEventListener('submit', function(e){<br />
_this.onFormSubmit(e);<br />
});<br />
} else {<br />
this.form.attachEvent('onsubmit', function(e){<br />
_this.onFormSubmit(e);<br />
});<br />
}<br />
};<br />
<br />
extend(Mimi.Signups.EmbedValidation.prototype, {<br />
initialize: function() {<br />
this.form = document.getElementById('ema_signup_form');<br />
this.submit = document.getElementById('webform_submit_button');<br />
this.callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());<br />
this.validEmail = /.+@.+\..+/<br />
},<br />
<br />
onFormSubmit: function(e) {<br />
e.preventDefault();<br />
<br />
this.validate();<br />
if (this.isValid) {<br />
this.submitForm();<br />
} else {<br />
this.revalidateOnChange();<br />
}<br />
},<br />
<br />
validate: function() {<br />
this.isValid = true;<br />
this.emailValidation();<br />
this.fieldAndListValidation();<br />
this.updateFormAfterValidation();<br />
},<br />
<br />
emailValidation: function() {<br />
var email = document.getElementById('signup_email');<br />
<br />
if (this.validEmail.test(email.value)) {<br />
this.removeTextFieldError(email);<br />
} else {<br />
this.textFieldError(email);<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
fieldAndListValidation: function() {<br />
var fields = this.form.querySelectorAll('.mimi_field.required');<br />
<br />
for (var i = 0; i < fields.length; ++i) {<br />
var field = fields[i],<br />
type = this.fieldType(field);<br />
if (type === 'checkboxes' || type === 'radio_buttons' || type === 'age_check') {<br />
this.checkboxAndRadioValidation(field);<br />
} else {<br />
this.textAndDropdownValidation(field, type);<br />
}<br />
}<br />
},<br />
<br />
fieldType: function(field) {<br />
var type = field.querySelectorAll('.field_type');<br />
<br />
if (type.length) {<br />
return type[0].getAttribute('data-field-type');<br />
} else if (field.className.indexOf('checkgroup') >= 0) {<br />
return 'checkboxes';<br />
} else {<br />
return 'text_field';<br />
}<br />
},<br />
<br />
checkboxAndRadioValidation: function(field) {<br />
var inputs = field.getElementsByTagName('input'),<br />
selected = false;<br />
<br />
for (var i = 0; i < inputs.length; ++i) {<br />
var input = inputs[i];<br />
if((input.type === 'checkbox' || input.type === 'radio') && input.checked) {<br />
selected = true;<br />
}<br />
}<br />
<br />
if (selected) {<br />
field.className = field.className.replace(/ invalid/g, '');<br />
} else {<br />
if (field.className.indexOf('invalid') === -1) {<br />
field.className += ' invalid';<br />
}<br />
<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
textAndDropdownValidation: function(field, type) {<br />
var inputs = field.getElementsByTagName('input');<br />
<br />
for (var i = 0; i < inputs.length; ++i) {<br />
var input = inputs[i];<br />
if (input.name.indexOf('signup') >= 0) {<br />
if (type === 'text_field') {<br />
this.textValidation(input);<br />
} else {<br />
this.dropdownValidation(field, input);<br />
}<br />
}<br />
}<br />
this.htmlEmbedDropdownValidation(field);<br />
},<br />
<br />
textValidation: function(input) {<br />
if (input.id === 'signup_email') return;<br />
<br />
if (input.value) {<br />
this.removeTextFieldError(input);<br />
} else {<br />
this.textFieldError(input);<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
dropdownValidation: function(field, input) {<br />
if (input.value) {<br />
field.className = field.className.replace(/ invalid/g, '');<br />
} else {<br />
if (field.className.indexOf('invalid') === -1) field.className += ' invalid';<br />
this.onSelectCallback(input);<br />
this.isValid = false;<br />
}<br />
},<br />
<br />
htmlEmbedDropdownValidation: function(field) {<br />
var dropdowns = field.querySelectorAll('.mimi_html_dropdown');<br />
var _this = this;<br />
<br />
for (var i = 0; i < dropdowns.length; ++i) {<br />
var dropdown = dropdowns[i];<br />
<br />
if (dropdown.value) {<br />
field.className = field.className.replace(/ invalid/g, '');<br />
} else {<br />
if (field.className.indexOf('invalid') === -1) field.className += ' invalid';<br />
this.isValid = false;<br />
dropdown.onchange = (function(){ _this.validate(); });<br />
}<br />
}<br />
},<br />
<br />
textFieldError: function(input) {<br />
input.className = 'required invalid';<br />
input.placeholder = input.getAttribute('data-required-field');<br />
},<br />
<br />
removeTextFieldError: function(input) {<br />
input.className = 'required';<br />
input.placeholder = '';<br />
},<br />
<br />
onSelectCallback: function(input) {<br />
if (typeof Widget === 'undefined' || !Widget.BasicDropdown) return;<br />
<br />
var dropdownEl = input.parentNode,<br />
instances = Widget.BasicDropdown.instances,<br />
_this = this;<br />
<br />
for (var i = 0; i < instances.length; ++i) {<br />
var instance = instances[i];<br />
if (instance.wrapperEl === dropdownEl) {<br />
instance.onSelect = function(){ _this.validate() };<br />
}<br />
}<br />
},<br />
<br />
updateFormAfterValidation: function() {<br />
this.form.className = this.setFormClassName();<br />
this.submit.value = this.submitButtonText();<br />
this.submit.disabled = !this.isValid;<br />
this.submit.className = this.isValid ? 'submit' : 'disabled';<br />
},<br />
<br />
setFormClassName: function() {<br />
var name = this.form.className;<br />
<br />
if (this.isValid) {<br />
return name.replace(/\s?mimi_invalid/, '');<br />
} else {<br />
if (name.indexOf('mimi_invalid') === -1) {<br />
return name += ' mimi_invalid';<br />
} else {<br />
return name;<br />
}<br />
}<br />
},<br />
<br />
submitButtonText: function() {<br />
var invalidFields = document.querySelectorAll('.invalid'),<br />
text;<br />
<br />
if (this.isValid || !invalidFields) {<br />
text = this.submit.getAttribute('data-default-text');<br />
} else {<br />
if (invalidFields.length || invalidFields[0].className.indexOf('checkgroup') === -1) {<br />
text = this.submit.getAttribute('data-invalid-text');<br />
} else {<br />
text = this.submit.getAttribute('data-choose-list');<br />
}<br />
}<br />
return text;<br />
},<br />
<br />
submitForm: function() {<br />
this.formSubmitting();<br />
<br />
var _this = this;<br />
window[this.callbackName] = function(response) {<br />
delete window[this.callbackName];<br />
document.body.removeChild(script);<br />
_this.onSubmitCallback(response);<br />
};<br />
<br />
var script = document.createElement('script');<br />
script.src = this.formUrl('json');<br />
document.body.appendChild(script);<br />
},<br />
<br />
formUrl: function(format) {<br />
var action = this.form.action;<br />
if (format === 'json') action += '.json';<br />
return action + '?callback=' + this.callbackName + '&' + serialize(this.form);<br />
},<br />
<br />
formSubmitting: function() {<br />
this.form.className += ' mimi_submitting';<br />
this.submit.value = this.submit.getAttribute('data-submitting-text');<br />
this.submit.disabled = true;<br />
this.submit.className = 'disabled';<br />
},<br />
<br />
onSubmitCallback: function(response) {<br />
if (response.success) {<br />
this.onSubmitSuccess(response.result);<br />
} else {<br />
top.location.href = this.formUrl('html');<br />
}<br />
},<br />
<br />
onSubmitSuccess: function(result) {<br />
if (result.has_redirect) {<br />
top.location.href = result.redirect;<br />
} else if(result.single_opt_in || !result.confirmation_html) {<br />
this.disableForm();<br />
this.updateSubmitButtonText(this.submit.getAttribute('data-thanks'));<br />
} else {<br />
this.showConfirmationText(result.confirmation_html);<br />
}<br />
},<br />
<br />
showConfirmationText: function(html) {<br />
var fields = this.form.querySelectorAll('.mimi_field');<br />
<br />
for (var i = 0; i < fields.length; ++i) {<br />
fields[i].style['display'] = 'none';<br />
}<br />
<br />
(this.form.querySelectorAll('fieldset')[0] || this.form).innerHTML = html;<br />
},<br />
<br />
disableForm: function() {<br />
var elements = this.form.elements;<br />
for (var i = 0; i < elements.length; ++i) {<br />
elements[i].disabled = true;<br />
}<br />
},<br />
<br />
updateSubmitButtonText: function(text) {<br />
this.submit.value = text;<br />
},<br />
<br />
revalidateOnChange: function() {<br />
var fields = this.form.querySelectorAll(".mimi_field.required"),<br />
_this = this;<br />
<br />
var onTextFieldChange = function() {<br />
if (this.getAttribute('name') === 'signup[email]') {<br />
if (_this.validEmail.test(this.value)) _this.validate();<br />
} else {<br />
if (this.value.length === 1) _this.validate();<br />
}<br />
}<br />
<br />
for (var i = 0; i < fields.length; ++i) {<br />
var inputs = fields[i].getElementsByTagName('input');<br />
for (var j = 0; j < inputs.length; ++j) {<br />
if (this.fieldType(fields[i]) === 'text_field') {<br />
inputs[j].onkeyup = onTextFieldChange;<br />
inputs[j].onchange = onTextFieldChange; <br />
} else {<br />
inputs[j].onchange = function(){ _this.validate() };<br />
}<br />
}<br />
}<br />
}<br />
});<br />
<br />
if (document.addEventListener) {<br />
document.addEventListener("DOMContentLoaded", function() {<br />
new Mimi.Signups.EmbedValidation();<br />
});<br />
}<br />
else {<br />
window.attachEvent('onload', function() {<br />
new Mimi.Signups.EmbedValidation();<br />
});<br />
}<br />
})(this);<br />
</script>