Skip to content

Instantly share code, notes, and snippets.

@edtoken
Created May 22, 2014 10:17
Show Gist options
  • Select an option

  • Save edtoken/c8ad1d3d4ce125b0966c to your computer and use it in GitHub Desktop.

Select an option

Save edtoken/c8ad1d3d4ce125b0966c to your computer and use it in GitHub Desktop.
/**
* либа, базовый набор.
* Принимает входящие параметры.
*/
// Backbone.Model.prototype.attributes.action = 'asdasd';
var Glib = function(tmp){
var Lib = this;
this.data = _.extend({
url:'/',
base_action:'cg_ajax',
}, tmp);
/**
* Геолокация. Устанавливаем координаты.
* возвращает по установленным координатам id региона.
* ID должны (и в ответе будут) соответствовать тем,
* что приходят в конфиге (см. запрос /config)
* @type {[type]}
*/
this.Geolocation = Backbone.Model.extend({
urlRoot:Lib.data.url + 'geolocation',
defaults:{
action:Lib.data.base_action,
// cityID:0,
latitude:0,
longitude:0,
},
});
/**
* CONFIG
* Модели связанные с конфигом
*/
/**
* Модель одного банка
*/
this.BankModel = Backbone.Model.extend({
defaults:{
action:Lib.data.base_action,
},
initialize:function(){
/**
* Проверяю существования банка в конфиге,
* обновляю данные
*/
if(Lib.data.config && Lib.data.config.banks){
var d = Lib.data.config.banks.findWhere(this.toJSON());
if(d){
this.set(d.toJSON());
}
}
}
});
/**
* Модель загрузки банков.
* Используется для /banks
* так же надо создать модель отдельного банка
* и использовать её в data.banks и тут
*/
this.BanksModel = Backbone.Model.extend({
urlRoot:Lib.data.url + 'banks',
defaults:{
action:Lib.data.base_action,
},
parse:function(data){
if(data.results){
data.results = new Lib.BanksCollection(data.results);
}
return data;
}
});
/**
* Коллеция банков
*/
this.BanksCollection = Backbone.Collection.extend({
model:Lib.BankModel,
});
/**
* Коллекция городоа
*/
this.CitiesCollection = Backbone.Collection.extend();
/**
* Коллеция документов
*/
this.DocumentsCollection = Backbone.Collection.extend();
/**
* Config
* Обновляется сразу при загрузке страницы, содержит инфу по банкам и пр.
*
* получение необходимой информации для работы приложения (конфиг):
* Справочник городов (cities)
* Справочник банков (banks)
* Cправочник документов (documents)
*
*/
this.Config = Backbone.Model.extend({
urlRoot:Lib.data.url+'config',
defaults:{
action:Lib.data.base_action,
cities:[],
banks:[],
documents:[],
},
parse:function(data){
/**
* добавить парсинг возвращаемых параметров
* банков и т.д.
*/
if(data.banks){
data.banks = new Lib.BanksCollection(data.banks);
}
if(data.cities){
data.cities = new Lib.CitiesCollection(data.cities);
}
if(data.documents){
data.documents = new Lib.DocumentsCollection(data.documents);
}
return data;
},
});
this.Offers = Backbone.Model.extend({
urlRoot:Lib.data.url+'offers',
defaults:{
action:Lib.data.base_action,
},
});
/* *
* Описание: возвращает список кредитных продуктов
* offer_amount required размер кредита
* offer_term required срок кредита, мес
* offer_type required тик предита
* 1 - автокредит
* 2 - ипотека
* 3 - потребительский
* 4 - кредит малому бизнесу
* 5 - лизинг
* sort_order не обязательно
* [
* 'monthly_payment',
* 'offer_rate',
* 'agents_reward',
* 'bank_rating',
* 'bank_in_system'
* ]
* сортировка.
* По ежемесячному платежу \
* ставке \
* вознаграждению\
* рейтингу банков \
* наличию банка в системе
*
* offer_initial_fee_percent не обязательно
* первоначальный взнос в процентах.
* При передаче 0 фильтрация не происходит.
*
* product_rate_min
* нет
* float
* минимальная ставка
*
* offer_proof_income
* нет
* 20: по форме банка,
* 10: 2-НДФЛ,
* 30: в свободной форме,
* 40: без подтверждения,
* 50: Налоговая декларация ИП
* подтверждение дохода. Продукт попадает в выдачу если подходит хотя бы по одному подтверждению дохода
*
*
* product_realty_type
* нет
* RealtyType
* тип недвижимости. Пр. попадает в выд
*
* product_bank
* нет
* BankCompany
* банк
*
* monthly_payment_min
* нет
* float
* ежемесячный платёж мин.
*
* monthly_payment_max
* нет
* float
* ежемесячнй платёж макс
*
* offer_last_job_experience
* нет
* integer
* непрерывный трудовой стаж.
* Предложение проходит если стаж в предложении меньше указанного в запросе
*
* offer_total_job_experience
* нет
* integer
* суммарный трудовой стаж.
* Предложение проходит если стаж в предложении меньше указанного в запросе
*
* offer_sex
* нет
* m/f
* пол. Указывается только вместе с возрастом
*
* offer_age
* нет
* integer
* возраст. Если не указан то фильтрация идёт по обоим полам (“или”)
*
* product_refinancing
* нет
* 2 - true
* 3 - false
* 1 - any
* Рефинансирование
*
* offer_locality
* нет
* Locality
* Город
* Регион пользователя
*
* offer_tax_status
* нет
* 10, 11, 12
* физик\юрик\ИП
*
* offer_certificates
* нет
* Certificate
* сертификаты
*
* product_surety
* нет
* 2 - true
* 3 - false
* 1 - any
* Наличие поручителя
*
* offer_wage_project
* нет
* BankCompany
* Зарплатный проект.
* Отфильтровывает зарплатные проекты выбранных банков
*
* offer_positive_credit_history
* нет
* BankCompany
* Положительная кредитная история.
* Продукты выбранных банков с выбранным значением кредитной истории
*
* bank_in_system
* нет
* bool
* Наличие банка в регионе.
* 1 - отображать все
* 0 - только те, в которые можно отправить заявку
*
* metadata
* нет
* bool
* не выводить список предложений. Только метаданные.
* false
*
**/
this.ProductsModel = Backbone.Model.extend({
urlRoot:Lib.data.url + 'products',
defaults:{
action:Lib.data.base_action,
offer_type:2,
// offer_amount:30000000,
// offer_term:240,
region:2,
sort_order:'bank_rating',
offer_initial_fee_percent:0,
bank_in_system:0,
},
parse:function(data){
return data;
}
});
};
/**
* Инициализация либы.
* В самом начале нужно по входищим параметрам координат
* обновить данные о регионе,
* что бы иметь возможность дальнейшей работы.
* @return {[type]} [description]
*/
Glib.prototype.init = function(){
var that = this;
var Geo = new this.Geolocation({
latitude:that.data.options.latitude,
longitude:that.data.options.longitude
});
var geo = Geo.toJSON();
Geo.fetch({
data:geo,
success:function(){
/**
* initialize app
* @type {[type]}
*/
that.data.options.cityID = Geo.get('cityID');
new LoadConfig();
},
error:function(){
alert('error inittialize geo');
}
});
/**
* Создаю конфиг
* @type {this}
*/
var Config = new this.Config();
var config = Config.toJSON();
var LoadConfig = function(){
Config.fetch({
data:config,
success:function(){
/**
* конфиг загрузился
* стартую все приложение that.app.start();
*/
that.data.config = Config.toJSON();
that.app.data = _.extend(that.data, that.app.data);
that.app.start();
},
error:function(){
alert('error to load config');
}
});
};
};
/*********************************************************/
/**
* Само приложение
*/
var Gapp = function(data){
this.data = _.extend({
debug:true,
url:ajaxurl +'?method=cg_',
options:{
latitude:54.971867,
longitude:73.39710549999995,
},
}, data);
this.init();
};
/**
* Инит приложения
* устанавливаю входящие параметры в lib
* и стартую её.
*/
Gapp.prototype.init = function(){
var init = true;
var ids = [
'js_cg_pdata',
'js_cg_pform',
'gc_full_app',
];
for(var i =0; i<ids.length; i++){
var el = document.getElementById(ids[i]);
if(!el){
init = false;
continue;
}
init = true;
break;
}
if(init === false){
return false;
}
this.lib = new Glib(this.data);
this.lib.app = this;
this.lib.init();
};
/**
* модель результатов
*/
var ResultModel = Backbone.Model.extend({
initialize:function(){
this.bind('change', this.reloaddata, this);
},
reloaddata:function(){
var that = this;
var d = this.toJSON();
this.resp = new this.view.app.lib.ProductsModel(d);
// d.action = this.resp.get('action');
// console.log('d', this.resp.get('action'));
var options = this.resp.toJSON();
this.resp.fetch({
data:options,
success:function(){
that.view.trigger('render');
},
error:function(){
console.log('reload data error');
that.view.el.innerHTML = 'reload data error';
}
});
}
});
/**
* модель элемента результата
*/
var ResultitemModel = Backbone.Model.extend();
/**
* вьюха одного элемента результата
*/
var ResultItemView = Backbone.View.extend({
el:document.createElement('div'),
initialize:function(){
this.template = _.template(document.getElementById('product_tpl').innerHTML);
this.model = new ResultitemModel();
},
render:function(){
if(this.model){
var d = this.model.toJSON();
// var offer = new this.app.lib.Offers(d);
// var options = {
// product_id:d.product_id
// };
// console.log(options);
// offer.fetch({
// data:options,
// success:function(d){
// console.log('offer ыгссуыы');
// },
// error:function(){
// console.log('offer error');
// }
// });
d.bankInfo = this.app.data.config.banks.findWhere({id:d.bank}).toJSON();
this.el.innerHTML = this.template(d);
}
return this;
}
});
/**
* вьюха результатов
*/
var ResultView = Backbone.View.extend({
el:document.getElementById('js_cg_pdata'),
initialize:function(){
var rent_credit = document.getElementById('rent_credit');
if(rent_credit){
item_price = document.getElementById('item_price').innerHTML;
rent_credit.value = item_price.split(' ').join('');
}
this.template = _.template(document.getElementById('result_tpl').innerHTML);
this.model = new ResultModel();
this.model.view = this;
this.bind('render', this.render, this);
setTimeout(function() {
$('#js_cg_pf_send').click();
}, 500);
},
render:function(){
this.el.innerHTML = '';
var that = this;
var d = this.model.resp.toJSON();
if(d.results.length <= 0){
this.el.innerHTML = 'Не найдено';
return this;
}
var items = document.createDocumentFragment();
var i =0;
_.each(d.results, function(data){
var monthly_payment = data.monthly_payment.toString();
data.monthly_payment = monthly_payment.replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ');
var item = new ResultItemView();
item.model.set(data);
var el = item.render().el.cloneNode(true);
items.appendChild(el.children[0]);
if(i === 0){
$('#ipotvalue').html(data.monthly_payment);
$('#ipotvalue').removeClass('disable');
}
i++;
});
this.el.appendChild(items);
return this;
}
});
/**
* Вьюха формы устанавливающей атрибуты
* для получения кредитных продуктов
*/
var PostFormView = Backbone.View.extend({
events:{
'click #js_cg_pf_send':'form_send'
},
parse_form:function(){
var o = {};
var a = this.$el.serializeArray();
$.each(a, function() {
if(this.value !== ''){
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
}else {
o[this.name] = this.value || '';
}
}
});
return o;
},
form_send:function()
{
this.resultview.el.innerHTML = 'загрузка...';
var data = this.parse_form();
this.resultview.model.set(data);
return false;
},
initialize:function(){
this.resultview = new ResultView();
}
});
var MortgageApp = function()
{
this.data = _.extend({
}, this.data);
Backbone.Model.prototype.app = this;
var FullPageModel = Backbone.Model.extend({
});
var CalcView = Backbone.View.extend({
el:document.createElement('div'),
events:{
'click #js_cg_pf_send':'form_send',
},
template:_.template(document.getElementById('calctpl').innerHTML),
initialize:function()
{
this.sendtimer = true;
this.resultview = new ResultView();
},
render:function(){
this.el.id = 'gc_full_calc';
this.el.className = 'gc_full_calc';
this.el.innerHTML = this.template();
return this;
},
parse_form:function(){
var o = {};
var form = document.getElementById('js_cg_pform');
var $form = $(form);
var a = $form.serializeArray();
$.each(a, function() {
if(this.value !== ''){
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
}else {
o[this.name] = this.value || '';
}
}
});
return o;
},
form_send:function()
{
var that = this;
var rent_credit = document.getElementById('rent_credit');
if(rent_credit.value.length === 0){
$(rent_credit).addClass('error');
return false;
}
if(this.sendtimer === false){
return false;
}
this.sendtimer = false;
setTimeout(function() {
that.sendtimer = true;
}, 1000);
$(rent_credit).removeClass('error');
this.resultview.setElement(document.getElementById('js_cg_pdata'));
this.resultview.el.innerHTML = 'загрузка...';
this.resultview.$el.removeClass('disable');
var data = this.parse_form();
this.resultview.model.set(data, {silent:true});
this.resultview.model.trigger('change');
return false;
},
});
var ResultsView = Backbone.View.extend({
el:document.createElement('div'),
render:function(){
this.el.innerHTML = 'results';
return this;
}
});
var BanksView = Backbone.View.extend({
el:document.createElement('div'),
render:function(){
var Bdata = Backbone.Collection.extend();
// if(banksdata !== undefined)
// {
// bd = new Bdata(banksdata);
// }
bd = new Bdata();
var that = this;
this.el.id = 'gc_banks_list';
var items = '';
var fulltpl = _.template($('#bankslist').html());
var itemtpl = _.template($('#bankitemtpl').html());
var data = {
// action:model.app.lib.data.base_action,
offer_type:2,
region:this.model.app.data.options.cityID
};
var Banks = new this.model.app.lib.BanksModel();
data = _.extend(Banks.toJSON(), data);
Banks.fetch({
data:data,
success:function(){
el = document.getElementById(that.el.id);
that.setElement(el);
that.model.set({banks:Banks});
that.el.innerHTML = fulltpl();
var itemslist = Banks.get('results').models;
for(var i=0; i<itemslist.length; i++){
var data = itemslist[i].toJSON();
data.info = '';
if(bd){
id = data.id.toString();
var mod = bd.where({id:id});
if(mod.length > 0){
mod = mod[0];
data.info = mod.get('text');
}else{
data.info = data.id;
}
}
data.logo = (!data.ios_logo) ? data.ios_retina_logo : data.ios_logo;
var item = itemtpl(data);
that.el.innerHTML += item;
}
},
error:function(){
alert('banks not load');
that.el.innerHTML = 'error to load banks';
return this;
}
});
return this;
}
});
var FullPageView = Backbone.View.extend({
el:document.getElementById('gc_full_app'),
initialize:function(){
var that = this;
this.model = new FullPageModel();
this.model.view = this;
this.calcview = new CalcView({model:this.model});
this.resultsview = new ResultsView({model:this.model});
this.banksview = new BanksView({model:this.model});
this.model.bind('change:banks', function(){
// that.el.appendChild(that.banksview.render().el);
}, this);
this.render();
},
render:function(){
this.el.innerHTML = '';
this.el.appendChild(this.calcview.render().el);
this.el.appendChild(this.banksview.render().el);
}
});
this.init = function(){
new FullPageView();
};
this.init();
};
/**
* Старт приложения
*/
Gapp.prototype.start = function(){
ResultItemView.prototype.app = this;
PostFormView.prototype.app = this;
ResultView.prototype.app = this;
/**
* START APP
*/
var pformEl = document.getElementById('js_cg_pform');
if(pformEl){
new PostFormView({el:pformEl});
}
var fullApp = document.getElementById('gc_full_app');
if(fullApp){
MortgageApp.apply(this);
}
};
new Gapp();
$(document).ready(function(){
$('body').on('click', '.gc_viewfull', function(){
$(this.parentNode.parentNode).find('.pr_descr').fadeToggle();
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment