moschino-ccss16
Version:
Moschino's Capsule Collection Spring Summer 2016 package
877 lines (663 loc) • 24.7 kB
JavaScript
/*
* name: FASTREG plug-in (for jQuery)
* versione: 1.0
* owner: ART area - TECH team
*date: 23/06/2015
*/
(function( $ ) {
"use strict";
$.fn.fastreg = function( options ) {
var defaults = {
hostlocation: "secure.social.yoox.it",
checkRequiredField: true,
classFieldWrap: "fieldWrap",
templateId: 0,
trakingPartner: "",
siteCode: "",
localizedSitecode: true,
inputsName: {
mail: "mail",
phone: "phone",
name: "name",
surname: "surname",
country: "sitecode",
gender: "gender",
privacy: "privacy",
submit: "submit"
},
dataRequest: {
SiteCode: "",
Email: "",
Enable: true,
Gender: "F",
formType: "fastreg",
privacy: "checked",
Tp: "",
templateId: 0
},
enableFastReg: true,
enableSMSSender: false,
enableEmailSender: false,
promocodeDataRequest: {
mail: "",
phoneNumber: "",
sitecode: "",
idtemplate: "",
tp: ""
},
emailDataRequest: {
email: "",
userdata: "{}",
sitecode: "",
idtemplate: ""
},
submitter: $(),
onAfterGetCountries: function() {},
onAfterSetCountries: function() {},
onAfterSetRequiredField: function() {},
onBeforeSubmit: function() {},
onSuccessSubmit: function() {},
onExistsEmail: function() {},
onUnknownResponse: function() {},
onInvalidData: function() {},
onPromocodeSuccess: function() {},
onPromocodeError: function() {},
onEmailError: function() {},
};
var settings = $.extend( true, {}, defaults, options );
var $obj = $( this );
var counter = 0;
var fastreg = {
version: "1.0",
countries: [],
init: function() {
this.setAllBinds();
this.getDependencing();
},
setAllBinds: function() {
var _this = this;
this.setBind( "JSLINQ:EVENT", function() {
counter ++;
if( counter == 2 ) {
_this.triggerEvent( "RUNPLUGIN" + ":EVENT" );
}
});
this.setBind( "XHR:EVENT", function() {
counter ++;
if( counter == 2 ) {
_this.triggerEvent( "RUNPLUGIN" + ":EVENT" );
}
});
this.setBind( "RUNPLUGIN:EVENT", function() {
_this.checkSettings();
});
this.setBind( "CHECKSETTINGS:EVENT", function() {
if( settings.enableFastReg ) {
_this.presetDataRequest();
_this.getCountries();
} else {
_this.triggerEvent( "SETCHANGEINPUT:EVENT" );
}
if( settings.enableSMSSender ) {
_this.presetPromocodeDataRequest();
}
if( settings.enableEmailSender ) {
_this.presetEmailRequest();
}
});
this.setBind( "GETCOUNTRIES:EVENT", function() {
if( typeof settings.onAfterGetCountries == "function" ) {
settings.onAfterGetCountries.call( _this );
}
_this.setCountries();
});
this.setBind( "SETCOUNTRIES:EVENT, SETCHANGEINPUT:EVENT", function() {
if( settings.enableFastReg && typeof settings.onAfterSetCountries == "function" ) {
settings.onAfterSetCountries.call( _this );
}
if( typeof settings.onAfterSetRequiredField == "function" ) {
settings.onAfterSetRequiredField.call( _this );
}
_this.setRequiredField();
_this.onChangeEmailText();
_this.onChangeSelect();
_this.onChangeCheck();
_this.onChangePhoneText();
_this.onChangeNameText();
_this.setSubmit();
});
this.setBind( "BEFORESUBMIT:EVENT", function() {
if( typeof settings.onBeforeSubmit == "function" ) {
settings.onBeforeSubmit.call( _this );
}
});
this.setBind( "EMAILNOTEXISTS:EVENT", function() {
if( typeof settings.onSuccessSubmit == "function" ) {
settings.onSuccessSubmit.call( _this );
}
_this.setCookie( "fastregRegistered", settings.dataRequest.templateId, 365 );
window._gaq.push(['_trackEvent', 'TemplatesFastReg', 'template:' + settings.dataRequest.templateId, "success"]);
window._gaq.push(['_trackEvent', 'TemplatesFastRegData', 'template:' + JSON.stringify( _this.dataToSend ), "success"]);
});
this.setBind( "EMAILEXISTS:EVENT", function() {
if( typeof settings.onExistsEmail == "function" ) {
settings.onExistsEmail.call( _this );
}
_this.setCookie( "fastregRegistered", settings.dataRequest.templateId, 365 );
window._gaq.push(['_trackEvent', 'TemplatesFastReg', 'template:' + settings.dataRequest.templateId, "duplicate"]);
window._gaq.push(['_trackEvent', 'TemplatesFastRegData', 'template:' + JSON.stringify( _this.dataToSend ).replace( _this.dataToSend.Email, _this.strTohex( _this.dataToSend.Email )), "duplicate"]);
});
this.setBind( "UNKNOWNERROR:EVENT", function() {
if( typeof settings.onUnknownResponse == "function" ) {
settings.onUnknownResponse.call( _this );
}
});
this.setBind( "INVALIDDATA:EVENT", function() {
if( typeof settings.onInvalidData == "function" ) {
settings.onInvalidData.call( _this );
}
window._gaq.push(['_trackEvent', 'TemplatesFastRegFail', 'template:' + JSON.stringify( _this.dataToSend )]);
});
this.setBind( "PROMOCODE:EVENT", function() {
if( typeof settings.onPromocodeSuccess == "function" ) {
settings.onPromocodeSuccess.call( _this );
}
});
this.setBind( "PROMOCODEERROR:EVENT", function() {
if( typeof settings.onPromocodeError == "function" ) {
settings.onPromocodeError.call( _this );
}
});
this.setBind( "EMAIL:EVENT", function() {
if( typeof settings.onEmailSuccess == "function" ) {
settings.onEmailSuccess.call( _this );
}
});
this.setBind( "EMAILERROR:EVENT", function() {
if( typeof settings.onEmailError == "function" ) {
settings.onEmailError.call( _this );
}
});
this.setBind( "DONE:EVENT", function() {
settings.submitter.removeClass("sending");
if( typeof window.console.log == "function" ) {
$.each(_this.response, function(k, respObj) {
console.log( "RESPONSE MESSAGE:\n" + (respObj.d ? respObj.d.replace(/(\r\n|\n|\r)/gm, "") : "NULL") );
});
console.log( );
}
});
},
getDependencing: function() {
$.support.cors = true;
if( typeof XDomainRequest != "undefined" && !window.XMLHttpRequest.supportsXDR ) {
this.loadScript( "XHR", "//yooxsocial-prod-01.s3.amazonaws.com/static/freeHTML/js/lib/xhr-xdr-adapter.js" );
} else {
this.triggerEvent( "XHR" + ":EVENT" );
}
if( typeof window.JSLINQ == "undefined" ) {
this.loadScript( "JSLINQ", "//social.yoox.it/js/src/lib/JSLINQ.js" );
} else {
this.triggerEvent( "JSLINQ" + ":EVENT" );
}
},
checkSettings: function() {
var isDone = true;
if( settings.siteCode == "" || !isNaN( settings.siteCode ) ) {
isDone = false;
alert( "Error settings! [SiteCode option]" );
}
if( settings.templateId == 0 || isNaN( settings.templateId ) ) {
isDone = false;
alert( "Error settings! [templateId option]" );
}
if( !settings.enableFastReg && !settings.enableSMSSender && !settings.enableEmailSender ) {
isDone = false;
alert( "One of these must be enabled:\nenableFastReg, enableSMSSender or enableEmailSender" );
}
if( isDone ) {
this.triggerEvent( "CHECKSETTINGS" + ":EVENT" );
}
},
presetDataRequest: function() {
settings.dataRequest.templateId = settings.templateId;
settings.dataRequest.tp = settings.trakingPartner;
},
presetPromocodeDataRequest: function() {
settings.promocodeDataRequest.idtemplate = settings.templateId;
settings.promocodeDataRequest.tp = settings.trakingPartner;
settings.promocodeDataRequest.sitecode = settings.localizedSitecode ? settings.siteCode + "_" + TEMPLATEINFO.iso : settings.siteCode;
},
presetEmailRequest: function() {
settings.emailDataRequest.idtemplate = settings.templateId;
settings.emailDataRequest.sitecode = settings.siteCode + "_" + TEMPLATEINFO.iso;
},
getCountries: function() {
var _this = this;
$.ajax("//" + settings.hostlocation + "/api/YooxProxy.aspx", {
data: {
'op': 'getSiteCountry',
'site': settings.siteCode,
'socialSandBox': '658as4tr54215'
},
type: 'GET',
dataType: 'json'
}).done(function ( data ) {
data.Countries = JSLINQ( data.Countries )
.OrderBy(function( x ) {
return x.Name;
})
.ToArray();
_this.countries = data.Countries;
_this.triggerEvent( "GETCOUNTRIES:EVENT" );
}).fail(function( jqXHR, textStatus, errorThrown ) {
if( typeof window.console.log == "function" ) {
console.log( "GETCOUNTRIES ERROR!" + "\n" + errorThrown );
}
})
},
setCountries: function() {
var _this = this;
$obj.each(function( key, form ) {
var $select = $( form ).find( "select[name='" + settings.inputsName.country + "']" );
var $default = $select.find( "option" ).eq( 0 );
var $span = $select.siblings( "span" ).eq( 0 );
$span.text( $default.text() );
$.each(_this.countries, function( i, itemObj ) {
$select.append($('<option>', {
value: settings.siteCode + "_" + itemObj.Code,
text : itemObj.Name
}));
});
_this.triggerEvent( "SETCOUNTRIES:EVENT" );
});
},
onChangePhoneText: function() {
var _this = this;
$obj.each(function( key, form ) {
var $input = $( form ).find( "input[name='" + settings.inputsName.phone + "']" );
if( _this.isRequiredField( $input ) ) {
$input.keyup(function( h ) {
_this.isValidPhone( $( this ) );
});
$input.on("blur", function() {
_this.isValidPhone( $( this ) );
});
}
$input.on("focus", function() {
$( this ).addClass( "focus" );
});
$input.on("blur", function() {
$( this ).removeClass( "focus" );
});
});
},
onChangeNameText: function() {
var _this = this;
$obj.each(function( key, form ) {
var $input = $( form ).find( "input[name='" + settings.inputsName.name + "'],[name='" + settings.inputsName.surname + "']" );
$input.each(function(k, v) {
if( _this.isRequiredField( $( this ) ) ) {
$( this ).keyup(function( h ) {
_this.isValidName( $( this ) );
});
$( this ).on("blur", function() {
_this.isValidName( $( this ) );
});
}
$( this ).on("focus", function() {
$( this ).addClass( "focus" );
});
$( this ).on("blur", function() {
$( this ).removeClass( "focus" );
});
});
});
},
onChangeEmailText: function() {
var _this = this;
$obj.each(function( key, form ) {
var $input = $( form ).find( "input[name='" + settings.inputsName.mail + "']" );
if( _this.isRequiredField( $input ) ) {
$input.keyup(function( h ) {
_this.isValidEmail( $( this ) );
});
$input.on("blur", function() {
_this.isValidEmail( $( this ) );
});
}
$input.on("focus", function() {
$( this ).addClass( "focus" );
});
$input.on("blur", function() {
$( this ).removeClass( "focus" );
});
});
},
onChangeSelect: function() {
var _this = this;
$obj.each(function( key, form ) {
var $select = $( form ).find( "select[name='" + settings.inputsName.country + "']" );
var $span = $select.siblings( "span" ).eq( 0 );
$select.change(function( h ) {
$span.text( $select.find( "option:checked" ).text() );
if( _this.isRequiredField( $select ) ) {
_this.isValidCountry( $( this ) );
}
});
$select.on("focus", function() {
$span.addClass( "focus" );
});
$select.on("blur", function() {
$span.removeClass( "focus" );
if( _this.isRequiredField( $select ) ) {
_this.isValidCountry( $( this ) );
}
});
});
},
onChangeCheck: function() {
var _this = this;
$obj.each(function( key, form ) {
var $inputs = $( this ).find( "input[type='radio'], input[type='checkbox']" );
$inputs.each(function( k, v ) {
var $span = $( this ).siblings( "span" ).eq( 0 );
if( $( this ).is( ':checked' ) ) {
$span.addClass( "selected" );
}
$( this ).change(function( h ) {
if( $( this ).is( ':checked' ) ) {
if( $( this ).attr( "type" ) == "radio" ) {
$( form ).find( "." + settings.classFieldWrap + " input[type='radio']" ).siblings( "span" ).removeClass( "selected" );
}
$span.addClass( "selected" );
} else {
$span.removeClass( "selected" );
}
if( _this.isRequiredField( $( this ) ) && $( this ).attr( "type" ) == "checkbox" ) {
_this.isCheckedPrivacy( $( this ) );
}
});
$( this ).on("focus", function() {
$span.addClass( "focus" );
});
$( this ).on("blur", function() {
$span.removeClass( "focus" );
if( _this.isRequiredField( $( this ) ) && $( this ).attr( "type" ) == "checkbox" ) {
_this.isCheckedPrivacy( $( this ) );
}
});
});
});
},
setSubmit: function() {
var _this = this;
$obj.each(function( key, form ) {
var $submit = $( form ).find( "input[name='" + settings.inputsName.submit + "']" );
$submit.click(function( e ) {
e.preventDefault();
if( _this.checkDataRequest( $( form ) ) ) {
_this.triggerEvent( "BEFORESUBMIT:EVENT" );
settings.submitter = $submit.addClass("sending");
if( settings.enableFastReg ) {
_this.dataToSend = _this.getDataToSend( $( form ) );
$.ajax("//" + settings.hostlocation + "/api/yooxproxy.aspx?op=fastRegistration&siteCode=" + _this.dataToSend.SiteCode, {
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify( _this.dataToSend ),
type: 'POST',
processData: false,
success: function( jqXHR ) {
_this.triggerEvent( "EMAILNOTEXISTS:EVENT" );
},
error: function( jqXHR, textStatus, errorThrown ) {
if( jqXHR.responseText.indexOf("(409)") >= 0 ) {
_this.triggerEvent( "EMAILEXISTS:EVENT" );
} else {
_this.triggerEvent( "UNKNOWNERROR:EVENT" );
}
}
}).always(function( jqXHR, textStatus, errorThrown ) {
_this.response = { registration: jqXHR };
_this.triggerEvent( "DONE:EVENT" );
});
}
if( settings.enableSMSSender ) {
_this.promocodeToSend = _this.getPromocodeToSend( $( form ) );
$.extend( _this.promocodeToSend, { mail: $( form ).find( "input[name='" + settings.inputsName.mail + "']" ).val() } );
$.ajax('//ylanding-prod-1-eu-west-1.elasticbeanstalk.com/tools.asmx/sendTemplateSms', {
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify( _this.promocodeToSend ),
type: 'POST',
success: function( jqXHR ) {
_this.triggerEvent( "PROMOCODE:EVENT" );
},
error: function( jqXHR, textStatus, errorThrown ) {
_this.triggerEvent( "PROMOCODEERROR:EVENT" );
}
}).always(function( jqXHR, textStatus, errorThrown ) {
_this.response = { promocode: jqXHR };
_this.triggerEvent( "DONE:EVENT" );
});
}
if( settings.enableEmailSender ) {
_this.emailToSend = _this.getEmailToSend( $( form ) );
$.extend( _this.emailToSend, { email: $( form ).find( "input[name='" + settings.inputsName.mail + "']" ).val() } );
$.ajax('//ylanding-prod-1-eu-west-1.elasticbeanstalk.com/tools.asmx/sendTemplateMail', {
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify( _this.emailToSend ),
type: 'POST',
success: function( jqXHR ) {
_this.triggerEvent( "EMAIL:EVENT" );
},
error: function( jqXHR, textStatus, errorThrown ) {
_this.triggerEvent( "EMAILERROR:EVENT" );
}
}).always(function( jqXHR, textStatus, errorThrown ) {
_this.response = { promocode: jqXHR };
_this.triggerEvent( "DONE:EVENT" );
});
}
} else {
_this.triggerEvent( "INVALIDDATA:EVENT" );
}
})
});
},
checkDataRequest: function( $form ) {
var isValid = true;
var $field = null;
if( settings.enableFastReg ) {
$field = $form.find( "input[name='" + settings.inputsName.mail + "']" );
if( this.isRequiredField( $field ) && !this.isValidEmail( $field ) ) {
isValid = false;
}
$field = $form.find( "select[name='" + settings.inputsName.country + "']" );
if( this.isRequiredField( $field ) && !this.isValidCountry( $field ) ) {
isValid = false;
}
}
if( settings.enableSMSSender ) {
$field = $form.find( "input[name='" + settings.inputsName.phone + "']" );
if( this.isRequiredField( $field ) && !this.isValidPhone( $field ) ) {
isValid = false;
}
}
if( settings.enableEmailSender ) {
$field = $form.find( "input[name='" + settings.inputsName.name + "']" );
if( this.isRequiredField( $field ) && !this.isValidName( $field ) ) {
isValid = false;
}
$field = $form.find( "input[name='" + settings.inputsName.surname + "']" );
if( this.isRequiredField( $field ) && !this.isValidName( $field ) ) {
isValid = false;
}
}
$field = $form.find( "input[name='" + settings.inputsName.privacy + "']" );
if( $field.length ) {
if( this.isRequiredField( $field ) && !this.isCheckedPrivacy( $field ) ) {
isValid = false;
}
}
return isValid;
},
setRequiredField: function() {
$obj.each(function( key, form ) {
var $field = $( form ).find( "input[name='" + settings.inputsName.mail + "']" );
if( typeof $field.attr( "required" ) == "undefined" ) {
$field.attr( "required", "required" );
}
$field = $( form ).find( "select[name='" + settings.inputsName.country + "']" );
if( typeof $field.attr( "required" ) == "undefined" ) {
$field.attr( "required", "required" );
}
$field = $( form ).find( "input[name='" + settings.inputsName.privacy + "']" );
if( typeof $field.attr( "required" ) == "undefined" ) {
$field.attr( "required", "required" );
}
$field = $( form ).find( "input[name='" + settings.inputsName.phone + "']" );
if( typeof $field.attr( "required" ) == "undefined" ) {
$field.attr( "required", "required" );
}
});
},
isRequiredField: function( $field ) {
if( settings.checkRequiredField && typeof $field.attr( "required" ) != "undefined" ) {
return true;
}
return false;
},
isValidPhone: function( $field ) {
var filterPhone = /^(\+|00)?([0-9])+(\s)?(([0-9])+\s?){5,}/g;
if( filterPhone.test( $field.val() ) === false || typeof $field.val() === 'undefined' ) {
$field.addClass( "error" );
return false;
}
$field.removeClass( "error" );
return true;
},
isValidName: function( $field ) {
var filterName = /[a-zA-Z\s.]/g;
if( filterName.test( $field.val() ) === false || typeof $field.val() === 'undefined' ) {
$field.addClass( "error" );
return false;
}
$field.removeClass( "error" );
return true;
},
isValidEmail: function( $field ) {
var filterEmail = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if( filterEmail.test( $field.val() ) === false || typeof $field.val() === 'undefined' ) {
$field.addClass( "error" );
return false;
}
$field.removeClass( "error" );
return true;
},
isValidCountry: function( $field ) {
var $span = $field.siblings( "span" ).eq( 0 );
if( $field.val() == "" ) {
$field.add( $span ).addClass( "error" );
return false;
}
$field.add( $span ).removeClass( "error" );
return true;
},
isCheckedPrivacy: function( $field ) {
var $span = $field.siblings( "span" ).eq( 0 );
if( !$field.prop( "checked" ) ) {
$field.add( $span ).addClass( "error" );
return false;
}
$field.add( $span ).removeClass( "error" );
return true;
},
getDataToSend: function( $form ) {
var dataRequest = {};
var $field = $form.find( "input[name='" + settings.inputsName.mail + "']" );
if( $field.length ) {
dataRequest.Email = $field.val();
}
$field = $form.find( "select[name='" + settings.inputsName.country + "']" ).find( "option:checked" );
if( $field.length ) {
dataRequest.SiteCode = $field.val();
}
$field = $form.find( "input[name='" + settings.inputsName.gender + "']:checked" );
if( $field.length ) {
dataRequest.Gender = $field.val();
}
$field = $form.find( "input[name='" + settings.inputsName.privacy + "']" );
if( $field.length ) {
dataRequest.privacy = $field.is(':checked') ? "checked" : "";
}
dataRequest.Enable = true;
return $.extend( true, {}, settings.dataRequest, dataRequest );
},
getPromocodeToSend: function( $form ) {
var promocodeDataRequest = {};
var $field = $form.find( "input[name='" + settings.inputsName.phone + "']" );
if( $field.length ) {
promocodeDataRequest.phoneNumber = $field.val().replace(/[\s\+]/g, "");
}
return $.extend( true, {}, settings.promocodeDataRequest, promocodeDataRequest );
},
getEmailToSend: function( $form ) {
var emailDataRequest = {};
emailDataRequest.userdata = {};
var $field = $form.find( "input[name='" + settings.inputsName.name + "']" );
if( $field.length ) {
emailDataRequest.userdata.name = $field.val();
}
var $field = $form.find( "input[name='" + settings.inputsName.surname + "']" );
if( $field.length ) {
emailDataRequest.userdata.surname = $field.val();
}
emailDataRequest.userdata = JSON.stringify( emailDataRequest.userdata );
return $.extend( true, {}, settings.emailDataRequest, emailDataRequest );
},
strTohex: function( str ) {
var hex = '';
for( var i = 0; i < str.length; i++ ) {
hex += str.charCodeAt( i ).toString( 16 );
}
return hex;
},
setCookie: function( cname, cvalue, exdays ) {
var d = new Date();
d.setTime( d.getTime() + (exdays*24*60*60*1000) );
var expires = "expires=" + d.toUTCString();
document.cookie = cname + "=" + cvalue + "; " + expires + "; path=/";
},
loadScript: function( nameScript, src ) {
var _this = this;
var t = window.document.createElement('script');
t.async = true;
t.type = 'text/javascript';
t.src = src;
var s = window.document.getElementsByTagName('script')[0];
s.parentNode.insertBefore( t, s );
t.onload = function() {
_this.triggerEvent( nameScript + ":EVENT" );
};
},
setBind: function( bindName, callback ) {
$.each(bindName.replace(/\s/g, '').split(','), function(k, tokenEvent) {
window.document.addEventListener(tokenEvent, function( e ) {
if( typeof callback == "function" ) {
callback.call( this );
}
}, false);
});
},
triggerEvent: function( eventName ) {
var e = window.document.createEvent("Event");
e.initEvent( eventName, true, true);
window.document.dispatchEvent( e );
}
};
fastreg.init();
return $obj;
};
})( jQuery );