Created
March 26, 2015 09:34
-
-
Save victorpavlenko/6d5390c3e9f54d0db64c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$(function(){ | |
var ProfileEdit = (function(){ | |
var ProfileEdit = function($element) { | |
if (typeof($element) === 'string') { | |
this.$element = $($element); | |
} else if ($element) { | |
this.$element = $element; | |
} | |
if (!this.$element) { | |
console.error("No element selected" + (typeof($element) === 'string') ? ' by "' + $element + '"' : ''); | |
return false; | |
} | |
this.$edit = $('.btn-edit-data', this.$element); | |
if(this.$element.is('#city')) { | |
this.$element.hide(); | |
} | |
this.$template = HandlebarsService.getJQueryFromNode('#handlebars-profile-edit-' + (this.$element.data('profile-edit-type'))); | |
if (!this.$template.length) { | |
this.$template = $('#handlebars-profile-edit-input'); | |
} | |
this.$template.appendTo($('.row', this.$element)); | |
this.$editBlockUserData = $('.edit-block-user-data', this.$element); | |
this.$buttonSave = $('button', this.$template).eq(0); | |
this.$buttonCancel = $('button', this.$template).eq(1); | |
this.$errorList = $('.error-list input', this.$element); | |
this.valid = false; | |
this.openEditBlockFlag = false; | |
this.init(); | |
}; | |
$.extend(ProfileEdit.prototype, { | |
init: function() { | |
this.initElements(); | |
this.popListeners(); | |
this.initListeners(); | |
this.pushListeners(); | |
}, | |
initElements: function() {}, | |
initListeners: function() { | |
if (!!this.$edit.length) { | |
this.$edit.on('click.profile-edit', this.onEditClickDefault.bind(this)); | |
} | |
if (!!this.$buttonSave.length) { | |
this.$buttonSave.on('click.profile-edit', this.onButtonSaveClickDefault.bind(this)); | |
} | |
if (!!this.$buttonCancel.length) { | |
this.$buttonCancel.on('click.profile-edit', this.onButtonCancelClickDefault.bind(this)); | |
} | |
$(document).on('open-edit-block.profile-edit', this.onOpenEditBlockDefault.bind(this)); | |
}, | |
popListeners: function() {}, | |
pushListeners: function() {}, | |
validate: function() { | |
return this.valid = true; | |
}, | |
getValidateFoo: function(foo) { | |
var validateFoo = function(){return false;}; | |
var fooName = ''; | |
foo = foo || ''; | |
foo = foo.toString(); | |
if (!!foo.length) { | |
fooName = 'validate' + foo.charAt(0).toUpperCase() + foo.substr(1); | |
} else { | |
console.error('Foo name is empty'); | |
return validateFoo; | |
} | |
if (this[fooName]) { | |
if (typeof(this[fooName]) === 'function') { | |
return this[fooName]; | |
} else { | |
console.error('"' + foo + '" not a function'); | |
} | |
} else { | |
console.error('Validate foo with name "' + foo + '" not found'); | |
return validateFoo; | |
} | |
return validateFoo; | |
}, | |
// validateField: function($field) { | |
// var $errorList = $('.error-list input', $field.parent()); | |
// $errorList.each(function(index, value) { | |
// var $err = $(value); | |
// if ($err.data('regexp')) { | |
// this.valid = $field.text().match(new RegExp($err.data('regexp'))) === null ? true : false; | |
// } else if ($err.data('foo')) { | |
// this.valid = this.getValidateFoo($err.data('foo'))($field); | |
// } | |
// if (!this.valid) { | |
// this.enableErrorLabel($f, ); | |
// } | |
// return !this.valid; | |
// }.bind(this)); | |
// }, | |
validateIsEmpty: function($field) { | |
return !!$field.length && (!!$field.val().length || !!$field.text().lengt) ? true : false; | |
}, | |
validateByRegExp: function($field, regexp) { | |
var str = ''; | |
$field = $field || null; | |
regexp = regexp || ''; | |
regexp = regexp.toString(); | |
if ($field === null || !$field.length) { | |
console.error('Bad $field'); | |
return false; | |
} | |
return ($field.text() || $field.val()).match(new RegExp(regexp)) === null ? true : false; | |
}, | |
onEditClickDefault: function(e) { | |
this.openEditBlock(e); | |
}, | |
onButtonSaveClickDefault: function(e) { | |
if (this.valid) { | |
this.closeEditDefault(e); | |
} | |
e.preventDefault(); | |
}, | |
onButtonCancelClickDefault: function(e) { | |
this.closeEditDefault(e); | |
e.preventDefault(); | |
}, | |
closeEditDefault: function(e) { | |
this.$element.removeClass('open-edit-block'); | |
}, | |
onOpenEditBlockDefault: function(e) { | |
if (this.openEditBlockFlag === true) { | |
this.openEditBlockFlag = false; | |
} else { | |
this.closeEditDefault(e); | |
e.preventDefault(); | |
} | |
}, | |
openEditBlock: function(e) { | |
this.$element.addClass('open-edit-block'); | |
e.preventDefault(); | |
this.openEditBlockFlag = true; | |
$(document).trigger('open-edit-block.profile-edit'); | |
}, | |
enableErrorLabel: function($field, message) { | |
var $errorLabel = $field.next(); | |
$errorLabel.text(message); | |
$field.parent().addClass('input-text-holder-error'); | |
}, | |
disableErrorLabel: function($field) { | |
$field.parent().removeClass('input-text-holder-error'); | |
$field.next().text(''); | |
} | |
}); | |
return ProfileEdit; | |
})(); | |
var ProfileCustomSelectEdit = (function(){ | |
var ProfileCustomSelectEdit = function() { | |
ProfileCustomSelectEdit.parent.constructor.apply(this, arguments); | |
}; | |
__extend(ProfileCustomSelectEdit, ProfileEdit); | |
$.extend(ProfileCustomSelectEdit.prototype, { | |
initElements: function() { | |
this.$input = $('.user-data-item', this.$element); | |
this.$customSelect = $('.custom-select-block', this.$element); | |
this.$customSelectLabel = $('.profile-edit-custom-select', this.$customSelect); | |
this.$customSelectLabel.dropdown(); | |
this.$customSelect.customSelect(); | |
this.onLoadDocument(); | |
}, | |
popListeners: function() { | |
this.$buttonSave.on('click', this.onButtonSaveClick.bind(this)); | |
this.$edit .on('click', this.onEditClick.bind(this) ); | |
}, | |
onLoadDocument: function(e){ | |
if(this.$element.is('#country')){ | |
if(this.$input[0].innerText != ""){ | |
var val = this.$input[0].innerText, | |
cityList = this.$element.find('.option-list a'), | |
result; | |
this.valid = true; | |
for ( counter = 0, _len = cityList.length; counter < _len; counter += 1 ) { | |
if ( val === $(cityList[counter]).text()) { | |
result = $(cityList[counter]).data('id'); | |
break; | |
} | |
} | |
var output = []; | |
$.ajax({ | |
url: '/sodabox_resources/php/clubFiltersData.php?dataType=city&parentId=' + result, | |
success: function(fromServer) { | |
for( var city in fromServer) { | |
output+= '<li><a href="#" data-value="' + fromServer[city] + '">' + fromServer[city] + '</a></li>'; | |
} | |
$('#city').show().find('.option-list').html(output); | |
} | |
}); | |
} | |
} | |
}, | |
onButtonSaveClick: function(e) { | |
var val = this.$customSelectLabel.text(), | |
dataVal = this.$customSelectLabel.data('value'), | |
cityList = this.$element.find('.option-list a'), | |
cityName = $('#city').find('.user-data-item').text(), | |
countryName = this.$input.text(), | |
output = [], | |
data = {}, | |
result; | |
console.log(cityName); | |
this.valid = true; | |
this.$input.text(val); | |
for ( counter = 0, _len = cityList.length; counter < _len; counter += 1 ) { | |
if (val === $(cityList[counter]).text()) { | |
result = $(cityList[counter]).data('id'); | |
break; | |
} | |
} | |
data[this.$customSelect.data('name') || 'SELECT'] = dataVal; | |
if(this.$element.is('#country')) { | |
if(val == countryName){ | |
$('#city').find('.user-data-item').text(cityName); | |
data['PERSONAL_CITY'] = cityName; | |
return false; | |
} | |
$.ajax({ | |
url: '/sodabox_resources/php/clubFiltersData.php?dataType=city&parentId=' + result, | |
success: function(fromServer) { | |
if(fromServer.empty){ | |
$('#city').slideUp().find('.option-list').html(output); | |
$(document).trigger('save-data.profile-controller'); | |
return false; | |
}else{ | |
for( var city in fromServer) { | |
output+= '<li><a href="#" data-value="' + fromServer[city] + '">' + fromServer[city] + '</a></li>'; | |
} | |
$('#city').find('.user-data-item').text(''); | |
data['PERSONAL_CITY'] = 'Все города'; | |
$('#city').slideDown(600).find('.option-list').html(output); | |
$(document).trigger('save-data.profile-controller', data); | |
} | |
} | |
}); | |
} | |
$(document).trigger('save-data.profile-controller', data); | |
}, | |
onEditClick : function(e) { | |
this.$customSelectLabel.text(this.$input.text()); | |
} | |
}); | |
return ProfileCustomSelectEdit; | |
})(); | |
var ProfileAddressEdit = (function() { | |
var ProfileAddressEdit = function() { | |
ProfileAddressEdit.parent.constructor.apply(this, arguments); | |
}; | |
__extend(ProfileAddressEdit, ProfileEdit); | |
$.extend(ProfileAddressEdit.prototype, { | |
initElements: function() { | |
this.$editAddress = $('.btn-edit-address', this.$element); | |
this.labels = { | |
$city: $('.user-city', this.$element), | |
$street: $('.user-street', this.$element), | |
$house: $('.user-house', this.$element), | |
$building: $('.user-building', this.$element), | |
$entrance: $('.user-entrance', this.$element), | |
$level: $('.user-level', this.$element), | |
$flat: $('.user-flat', this.$element) | |
}; | |
this.inputs = { | |
$city: $('.input-text-city', this.$template), | |
$street: $('.input-text-street', this.$template), | |
$house: $('.input-text-house', this.$template), | |
$building: $('.input-text-building', this.$template), | |
$entrance: $('.input-text-entrance', this.$template), | |
$level: $('.input-text-level'), | |
$flat: $('.input-text-flat', this.$template) | |
}; | |
this.$errorList = $('.error-list input', this.$element); | |
}, | |
popListeners: function() { | |
this.$editAddress.on('click.profile-address-edit', this.onEditAddressClick.bind(this)); | |
this.$buttonSave.on('click.profile-address-edit', this.onButtonSaveClick.bind(this)); | |
}, | |
pushListeners: function() { | |
this.$buttonCancel.on('click.profile-address-edit', this.onButtonCancelClick.bind(this)); | |
}, | |
onEditAddressClick: function(e) { | |
for (var id in this.labels) { | |
this.disableErrorLabel(this.inputs[id]); | |
this.inputs[id].val(this.labels[id].text()); | |
} | |
this.openEditBlock(e); | |
}, | |
onButtonSaveClick: function(e) { | |
if (this.validate()) { | |
for (var id in this.inputs) { | |
this.labels[id].text(this.inputs[id].val()); | |
} | |
} | |
}, | |
onButtonCancelClick: function(e) { | |
$(document).trigger('remove.profile-address-edit', [this.$element]); | |
}, | |
validate: function() { | |
this.valid = true; | |
this.$errorList.each(function(index, value) { | |
var $err = $(value); | |
var $input = this.inputs['$' + $err.data('target')]; | |
if ($err.data('regexp')) { | |
this.valid = this.validateByRegExp($input, $err.data('regexp')); | |
} else if ($err.data('foo')) { | |
this.valid = this.getValidateFoo($err.data('foo'))($input); | |
} | |
if(!this.valid) { | |
this.enableErrorLabel($input, $err.data('message')); | |
} | |
return this.valid; | |
}.bind(this)); | |
return this.valid; | |
} | |
}); | |
return ProfileAddressEdit; | |
})(); | |
var ProfileInputEdit = (function() { | |
var ProfileInputEdit = function() { | |
ProfileInputEdit.parent.constructor.apply(this, arguments) | |
}; | |
__extend(ProfileInputEdit, ProfileEdit); | |
$.extend(ProfileInputEdit.prototype, { | |
initElements: function(e) { | |
this.$input = $('.user-data-item', this.$element); | |
this.$inputEdit = $('.input-text', this.$element); | |
this.$inputEdit.attr('placeholder', this.$input.data('placeholder') || ''); | |
}, | |
popListeners: function() { | |
this.$buttonSave.on('click.profile-input-edit', this.onButtonSaveClick.bind(this)); | |
this.$buttonCancel.on('click.profile-input-edit', this.onButtonCancelClick.bind(this)); | |
this.$edit.on('click.profile-input-edit', this.onEditClick.bind(this)); | |
this.$inputEdit.on('keydown.profile-input-edit', this.onInputEditKeyDown.bind(this)); | |
}, | |
onButtonSaveClick: function(e) { | |
var data = {}; | |
if (this.validate()) { | |
this.$input.text(this.$inputEdit.val()); | |
data[this.$input.data('name') || 'name'] = this.$input.text(); | |
$(document).trigger('save-data.profile-controller', [data]); | |
} | |
}, | |
onButtonCancelClick: function(e) { | |
// this.disableErrorLabel(this.$inputEdit); | |
}, | |
onEditClick: function(e) { | |
this.disableErrorLabel(this.$inputEdit); | |
this.$inputEdit.val(this.$input.text()); | |
}, | |
onInputEditKeyDown: function(e) { | |
this.disableErrorLabel(this.$inputEdit); | |
}, | |
validate: function() { | |
this.valid = true; | |
this.$errorList.each(function(index, value) { | |
var $err = $(value); | |
if ($err.data('regexp')) { | |
this.valid = this.validateByRegExp(this.$inputEdit, $err.data('regexp')); | |
} else if ($err.data('foo')) { | |
this.valid = this.getValidateFoo($err.data('foo'))(this.$inputEdit); | |
} | |
if (!this.valid) { | |
this.enableErrorLabel(this.$inputEdit, $err.data('message')); | |
} | |
return this.valid; | |
}.bind(this)); | |
return this.valid; | |
} | |
}); | |
return ProfileInputEdit; | |
})(); | |
var ProfilePasswordEdit = (function() { | |
var ProfilePasswordEdit = function() { | |
ProfilePasswordEdit.parent.constructor.apply(this, arguments); | |
}; | |
__extend(ProfilePasswordEdit, ProfileEdit); | |
$.extend(ProfilePasswordEdit.prototype, { | |
initElements: function() { | |
this.$editPassword = $('.show-edit-password', this.$element); | |
}, | |
popListeners: function() { | |
this.$editPassword.on('click', this.onEditPasswordClick.bind(this)); | |
}, | |
onEditPasswordClick: function(e) { | |
this.openEditBlock(e); | |
} | |
}); | |
return ProfilePasswordEdit; | |
})(); | |
var ProfileLoginEdit = (function() { | |
var ProfileLoginEdit = function() { | |
ProfileLoginEdit.parent.constructor.apply(this, arguments); | |
}; | |
__extend(ProfileLoginEdit, ProfileEdit); | |
return ProfileLoginEdit; | |
})(); | |
var ProfileAbout = (function(){ | |
var ProfileAbout = function() { | |
this.$element = $('#about-me-tab .user-profile-data-box'); | |
this.$aboutText = $('.user-profile-data-box-text p', this.$element); | |
this.$aboutTextarea = $('.user-profile-data-box-textarea', this.$element); | |
this.$edit = $('.btn-edit-data', this.$element); | |
this.$buttonSave = $('.edit-block-button-holder button', this.$element).eq(0); | |
this.$buttonCancel = $('.edit-block-button-holder button', this.$element).eq(1); | |
this.init(); | |
}; | |
$.extend(ProfileAbout.prototype, { | |
init: function() { | |
this.initListeners(); | |
}, | |
initListeners: function() { | |
this.$edit.on('click', this.onEditClick.bind(this)); | |
this.$buttonSave.on('click', this.onButtonSaveClick.bind(this)); | |
this.$buttonCancel.on('click', this.onButtonCancelClick.bind(this)) | |
}, | |
onEditClick: function(e) { | |
this.$aboutTextarea.val(this.$aboutText.text()); | |
this.$element.addClass('open-edit-block'); | |
}, | |
onButtonSaveClick: function(e) { | |
var data = {}; | |
this.$aboutText.text(this.$aboutTextarea.val()); | |
this.$element.removeClass('open-edit-block'); | |
data[this.$aboutText.data('name')] = this.$aboutText.text(); | |
$(document).trigger('save-data.profile-controller', [data]); | |
e.preventDefault(); | |
}, | |
onButtonCancelClick: function(e) { | |
this.$element.removeClass('open-edit-block'); | |
e.preventDefault(); | |
} | |
}); | |
return new ProfileAbout(); | |
})(); | |
var ProfileController = (function() { | |
var ProfileController = function() { | |
if ($('body').attr('id') === 'profile-page') { | |
this.$profile = $('.main'); | |
this.$addressLabel = $('.add-new-address-label', this.$profile); | |
this.$addressAddBox = $('.add-address-box-holder', this.$profile); | |
this.$addressAdd = $('.add-new-address', this.$profile); | |
this.addressCounter = $('.edit-address-box-holder', this.$profile).length; | |
this.$contactForm = $('.user-profile-data-box-contacts form', this.$profile); | |
if (__GLOBALS['profile-default-tab-id']) { | |
$('.user-profile-tab-content').addClass('hide'); | |
$('#' + __GLOBALS['profile-default-tab-id']).removeClass('hide'); | |
$('#' + __GLOBALS['profile-default-tab-id'] + '-link').trigger('click'); | |
} | |
this.$menu = $('.tabset', this.$profile); | |
this.bitrixFields = {}; | |
$('.bitrix-hidden-fields input').each(function(index, value){ | |
var $hidden = $(value); | |
this.bitrixFields[$hidden.attr('name')] = $hidden.attr('value'); | |
}.bind(this)); | |
this.$recordsWrapper = $('.threecolumns', this.$profile); | |
this.recordsInit = false; | |
this.profileBlockUsername = { | |
$name: $('.profile-block-name', this.$profile), | |
$lastname: $('.profile-block-lastname', this.$profile) | |
}; | |
this.init(); | |
} else { | |
return false; | |
} | |
}; | |
$.extend(ProfileController.prototype, { | |
init: function() { | |
this.initListeners(); | |
this.initEditFields(); | |
this.initAddress(); | |
this.initPosts(); | |
}, | |
initListeners: function() { | |
this.$addressAdd.on('click.profile-controller' , this.onAddressAddClick.bind(this)); | |
this.$menu .on('click.profile-controller' , this.onMenuClick .bind(this)); | |
$(document) .on('save-data.profile-controller', this.onSaveData .bind(this)); | |
}, | |
initEditFields: function() { | |
$('.wrap', this.$profile).each(function(index, value) { | |
var $wrap = $(value); | |
switch($wrap.data('profile-edit-type')) { | |
case 'input': | |
new ProfileInputEdit($wrap); | |
break; | |
case 'password': | |
new ProfilePasswordEdit($wrap); | |
break; | |
case 'custom-select': | |
new ProfileCustomSelectEdit($wrap); | |
break; | |
case 'custom-select-country': | |
new ProfileCustomSelectEdit($wrap); | |
break; | |
case 'custom-select-city': | |
new ProfileCustomSelectEdit($wrap); | |
break; | |
case 'address': | |
new ProfileAddressEdit($wrap); | |
break; | |
} | |
}); | |
}, | |
initAddressListeners: function() { | |
$(document).trigger('remove.profile-address-edit', [this.$element]); | |
$(document).on('remove.profile-address-edit', this.onAddressRemove.bind(this)); | |
}, | |
initAddress: function() { | |
if (this.addressCounter === 0) { | |
this.enableAddressLabel(); | |
} | |
this.initAddressListeners(); | |
}, | |
initPosts: function() { | |
var mobile = 0; | |
var $container = $('#postsList').masonry({ | |
columnWidth: 304, | |
gutter: 16, | |
itemSelector: '.box' | |
}); | |
var page = 0; | |
var loading = false; | |
var allDone = false; | |
}, | |
enableAddressLabel: function() { | |
this.$addressLabel.text(this.$addressLabel.data('text')).removeClass('hide'); | |
}, | |
disableAddressLabel: function() { | |
this.$addressLabel.text(' ').addClass('hide'); | |
}, | |
onAddressAddClick: function(e) { | |
e.preventDefault(); | |
this.insertAddressNode(); | |
}, | |
onAddressRemove: function(e, $address) { | |
var counter = 1; | |
this.addressCounter--; | |
$address.remove(); | |
// $('.address-label', this.$profile).text('Адрес ' + counter++ + ':');g | |
$('.address-label', this.$profile).each(function(index, value) { | |
var $label = $(value); | |
$label.text('Адрес ' + counter++ + ':'); | |
}); | |
if (this.addressCounter === 0) { | |
this.enableAddressLabel(); | |
} | |
}, | |
onMenuClick: function(e) { | |
var $target = $(e.target); | |
if ($target.hasClass('btn-my-records')) { | |
this.recordsInit = true; | |
$(document).trigger('do-load.profile-page'); | |
} | |
}, | |
onSaveData: function(e, data, successCallback, errorCallback) { | |
var name = data['NAME'] || ''; | |
var lastname = data['LAST_NAME'] || ''; | |
if (!!name.length) { | |
this.profileBlockUsername.$name.text(name); | |
} | |
if (!!lastname.length) { | |
this.profileBlockUsername.$lastname.text(lastname); | |
} | |
this.ajax(data || {}, successCallback, errorCallback); | |
}, | |
ajax: function(data, successCallback, errorCallback) { | |
$.ajax({ | |
url: __GLOBALS['profile-post-url'] || '', | |
type: 'post', | |
data: $.extend(data || {}, this.bitrixFields), | |
success: (successCallback || function(){}).bind(this), | |
error: (errorCallback || function(){}).bind(this) | |
}); | |
}, | |
getAddressNode: function() { | |
return HandlebarsService.getJQueryFromNode('#handlebars-profile-edit-address-wrap', {addressCounter: ++this.addressCounter}); | |
}, | |
insertAddressNode: function($address) { | |
$address = $address || this.getAddressNode(); | |
$(document).trigger('open-edit-block.profile-edit'); | |
this.disableAddressLabel(); | |
$address.addClass('open-edit-block').insertBefore(this.$addressAddBox); | |
new ProfileAddressEdit($address); | |
} | |
}); | |
return new ProfileController(); | |
})(); | |
var ProfileEmailEdit = (function() { | |
var ProfileEmailEdit = function() { | |
ProfileEmailEdit.parent.constructor.apply(this, arguments); | |
}; | |
__extend(ProfileEmailEdit, ProfileEdit); | |
return ProfileEmailEdit; | |
})(); | |
var ProfilePhoneEdit = (function() { | |
var ProfilePhoneEdit = function() { | |
ProfilePhoneEdit.parent.constructor.apply(this, arguments); | |
}; | |
__extend(ProfilePhoneEdit, ProfileEdit); | |
return ProfilePhoneEdit; | |
})(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment