Created
May 22, 2014 10:17
-
-
Save edtoken/c8ad1d3d4ce125b0966c 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
| /** | |
| * либа, базовый набор. | |
| * Принимает входящие параметры. | |
| */ | |
| // 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