3 window._w.publicvaluation = {
12 highestOfferId : false,
14 publicCentreList : {},
16 onValuationViewTemplateReady : function( template, event, eventData )
18 _w.publicvaluation.itemData = null;
19 _w.publicvaluation.ti = _t[template];
20 _w.publicvaluation.limited = false;
24 'publicCentreList', 'Company', 'Company.SelectGrid', null, {},
28 'publicCentreList', {}, {},
29 $.proxy(function(response)
31 _w.publicvaluation.publicCentreList = {};
32 for (var i in response.Data.DataSet)
34 var company = response.Data.DataSet[i];
35 if (undefined == _w.publicvaluation.publicCentreList[company.city.region.id])
37 _w.publicvaluation.publicCentreList[company.city.region.id] = [];
39 _w.publicvaluation.publicCentreList[company.city.region.id].push({
51 App.DataStore.setData('sparekeys', [{"value":"1", "label":"Yes"}, {"value":"0", "label":"No"}]);
52 App.DataStore.loadSelectListData('categories', false, 'Stock', 'Category.SelectList', null, {}, {}, function(){
53 var data = App.DataStore.getData('categories');
54 data.splice(data.length - 1, 1);
55 App.DataStore.setData('categories', data);
57 App.DataStore.loadSelectListGroup([
58 {dataId: 'years', isStatic: true, workspace: 'Stock', task: 'Year.SelectList'},
59 {dataId: 'conditions', isStatic: true, workspace: 'Stock', task: 'Condition.SelectList'},
60 {dataId: 'exteriorColours', isStatic: true, workspace: 'Stock', task: 'ExteriorColour.SelectList'},
61 {dataId: 'interiorColours', isStatic: true, workspace: 'Stock', task: 'InteriorColour.SelectList'},
62 {dataId: 'upholsteries', isStatic: true, workspace: 'Stock', task: 'Upholstery.SelectList'},
63 {dataId: 'papers', isStatic: true, workspace: 'Stock', task: 'Paper.SelectList'},
64 {dataId: 'natis', isStatic: true, workspace: 'Stock', task: 'Natis.SelectList'},
65 {dataId: 'fsh', isStatic: true, workspace: 'Stock', task: 'FullServiceHistory.SelectList'},
66 {dataId: 'fuelTypes', isStatic: true, workspace: 'Stock', task: 'FuelType.SelectList'},
67 {dataId: 'transmissionTypes', isStatic: true, workspace: 'Stock', task: 'TransmissionType.SelectList'},
68 {dataId: 'damages', isStatic: true, workspace: 'Stock', task: 'Damage.SelectList'},
69 {dataId: 'accessories', isStatic: true, workspace: 'Stock', task: 'Accessory.SelectList'}
71 App.DataStore.loadSelectListData(
72 'regions', false, 'Location', 'Region.SelectListNames', null,
75 "name" : ['Gauteng','Western Cape','KwaZulu-Natal']
80 _w.publicvaluation.setValuationViewFormMeta();
81 _w.publicvaluation.ti.hydrate(_w.publicvaluation.formMeta);
82 // Retrieve initial view data.
83 _w.publicvaluation.itemId = 0;
85 _w.publicvaluation.newItem = true;
86 _w.publicvaluation.itemData = {stock:{}};
88 'createPublicValuation', 'Valuation', 'Valuation.CreatePublic',
89 null, {}, function(){}, _w.taskContractError
93 onValuationViewPublished : function( template, event, eventData )
96 // Do a check here for the ie browser - if ie show upload file buttons
97 // IE browsers prevent submitting files when the input field didn't receive a direct click
99 if(navigator.appVersion.indexOf("MSIE ")!=-1)
101 //alert( "This is msie IE!" );
103 $("#btn_mainImage").show();
104 $("#mainImage").show();
107 $("#btn_frontImage").show();
108 $("#frontImage").show();
111 $("#btn_leftImage").show();
112 $("#leftImage").show();
115 $("#btn_rightImage").show();
116 $("#rightImage").show();
119 $("#btn_backImage").show();
120 $("#backImage").show();
123 $("#btn_interiorImage").show();
124 $("#interiorImage").show();
127 $("#btn_engineImage").show();
128 $("#engineImage").show();
131 $("#btn_natisImage").show();
132 $("#natisImage").show();
135 $(".acceptText").hide();
136 $(".acceptTextIE").show();
138 $('#terms').parent().addClass("IE");
142 _w.publicvaluation.limited = false;
143 _w.publicvaluation._setupValidation();
144 $('#terms').change(function() {
145 $('#btnSaveNewValuation').prop('disabled', !$(this).is(':checked'));
147 $('#btnSaveNewValuation').prop('disabled', true);
148 $('#btnSaveNewValuation').show();
149 $('#btnSaveNewValuation').click(function () {
150 $('#btnSaveNewValuation').prop('disabled', true);
151 $('#terms').prop('disabled', true);
152 if (!$('#frmValuationView').valid())
154 $('#btnSaveNewValuation').prop('disabled', false);
158 //Check for mobi photo's
159 // the IE doesn't support matchMedia ...
160 var isMobile = 'none' == $('#customerTitle').css('display');
162 // check for IE as well // if (!isMobile.matches && !navigator.appVersion.indexOf("MSIE ")!=-1 )
165 var data = _w.publicvaluation.ti.harvest();
167 if ('' == data.mainImage) { images--; }
168 if ('' == data.leftImage) { images--; }
169 if ('' == data.backImage) { images--; }
170 if ('' == data.engineImage) { images--; }
171 if ('' == data.frontImage) { images--; }
172 if ('' == data.rightImage) { images--; }
173 if ('' == data.interiorImage) { images--; }
174 if ('' == data.natisImage) { images--; }
178 $('#btnSaveNewValuation').prop('disabled', false);
179 alert('Please upload at least 2 images.');
184 var data = _w.publicvaluation._prepValuationUpdateData();
186 'createPublicValuation', data, {},
187 _w.publicvaluation._onValuationUpdated,
188 _w.publicvaluation._onValuationFail
192 $('.back-btn').on('click', function(){
193 window.history.back();
197 setValuationViewFormMeta : function()
200 _w.publicvaluation.formMeta = {
205 dataStoreId : 'years',
206 value : data.stock.vehicleYear ? data.stock.vehicleYear : '',
207 onChange : function () {
208 if (!App.DataStore.getItem('BuildSelect:vehicleYear', false))
210 _w.publicvaluation._listMakesModelsTypes();
216 id : 'vehicleCategory',
218 dataStoreId : 'categories',
219 value : data.stock.type ? data.stock.type.category.id : '',
220 onChange : function () {
221 if (!App.DataStore.getItem('BuildSelect:vehicleCategory', false))
223 _w.publicvaluation._listMakesModelsTypes();
230 title : 'Vehicle Make',
231 dataStoreId : 'makes',
232 value : data.stock.type ? data.stock.type.model.make.id : '',
233 onChange : function () {
234 if (!App.DataStore.getItem('BuildSelect:vehicleMake', false))
236 _w.publicvaluation._listMakesModelsTypes();
243 title : 'Vehicle Model',
244 dataStoreId : 'models',
245 value : data.stock.type ? data.stock.type.model.id : '',
246 onChange : function () {
247 if (!App.DataStore.getItem('BuildSelect:vehicleModel', false))
249 _w.publicvaluation._listMakesModelsTypes();
256 title : 'Vehicle Type',
257 dataStoreId : 'types',
258 value : data.stock.type ? data.stock.type.id : ''
262 id : 'vehicleFuelType',
264 dataStoreId : 'fuelTypes',
265 value : data.stock.fuelType ? data.stock.fuelType : ''
267 'transmissionType' : {
269 id : 'vehicleTransmissionType',
270 title : 'Transmission Type',
271 dataStoreId : 'transmissionTypes',
272 value : data.stock.transmissionType ? data.stock.transmissionType : ''
274 'registrationNumber' : {
276 id : 'registrationNumber',
277 title : 'Registration no',
278 value : data.stock.registrationNumber ? data.stock.registrationNumber : '',
285 value : data.stock.vinNumber ? data.stock.vinNumber : '',
292 value : data.stock.engineNumber ? data.stock.engineNumber : '',
299 value : data.stock.km ? data.stock.km : ''
303 id : 'vehicleCondition',
305 dataStoreId : 'conditions',
306 value : data.stock.condition ? data.stock.condition : ''
310 id : 'exteriorColour',
311 title : 'Main ext. colour',
312 dataStoreId : 'exteriorColours',
313 value : data.stock.exteriorColour ? data.stock.exteriorColour : ''
317 id : 'interiorColour',
318 title : 'Main int. colour',
319 dataStoreId : 'interiorColours',
320 value : data.stock.interiorColour ? data.stock.interiorColour : ''
324 id : 'vehicleUpholstery',
325 title : 'Upholstery',
326 dataStoreId : 'upholsteries',
327 value : data.stock.upholstery ? data.stock.upholstery : ''
331 id : 'vehiclePapers',
333 dataStoreId : 'papers',
334 value : data.stock.papers ? data.stock.papers : ''
340 dataStoreId : 'natis',
341 value : data.stock.natis ? data.stock.natis : ''
346 title : 'Spare keys',
347 dataStoreId : 'sparekeys',
348 value : undefined != data.stock.spareKeys && null != data.stock.spareKeys
349 ? (data.stock.spareKeys == true ? "1" : "0")
352 'fullServiceHistory' : {
354 id : 'fullServiceHistory',
355 title : 'Full service history',
357 value : data.stock.fullServiceHistory ? data.stock.fullServiceHistory : ''
360 type : 'textarea-small',
363 value : data.stock.fshNotes ? data.stock.fshNotes : ''
366 type : 'damageDetails',
369 dataStoreId : 'damages',
370 data : data.stock.damages ? data.stock.damages : {}
372 'damageTotal' : 'R 0.00',
374 type : 'textarea-styled',
377 title : 'Damages comments: i.e. Scratches, Dents, Paintwork, etc.',
378 style : 'damages-comments1',
379 value : data.stock.damageNotes ? data.stock.damageNotes : ''
381 'previousRepairsNoted' : {
383 id : 'previousRepairsNoted',
384 title : 'Previous repairs',
385 style : 'damages-comments',
386 value : data.stock.previousRepairsNoted ? data.stock.previousRepairsNoted : false
388 'previousRepairsNotes' : {
389 type : 'textarea-styled',
391 id : 'previousRepairsNotes',
392 title : 'Previous repairs notes',
393 style : 'damages-comments',
394 value : data.stock.previousRepairsNotes ? data.stock.previousRepairsNotes : '',
395 onChange: function(){
396 var haveData = ('' != $(this).val() ? true : false);
397 $('#previousRepairsNoted').prop('checked', haveData);
403 dataStoreId : 'accessories',
404 itemName : 'accessory',
405 data : data.stock.accessories ? data.stock.accessories : {}
408 type : 'textarea-styled',
409 id : 'accessoryNotes',
411 style : 'comment mobile-comment',
412 areaStyle : 'comment-text-box',
413 value : data.stock.accessoryNotes ? data.stock.accessoryNotes : ''
418 baseImage : 'main_img_car.jpg',
420 value : data.stock.mainImage ? data.stock.mainImage : ''
425 baseImage : 'front_car.jpg',
427 value : data.stock.frontImage ? data.stock.frontImage : ''
432 baseImage : 'left_car.jpg',
434 value : data.stock.leftImage ? data.stock.leftImage : ''
439 baseImage : 'right_car.jpg',
441 value : data.stock.rightImage ? data.stock.rightImage : ''
446 baseImage : 'back_car.jpg',
448 value : data.stock.backImage ? data.stock.backImage : ''
452 id : 'interiorImage',
453 baseImage : 'interior_car.jpg',
455 value : data.stock.interiorImage ? data.stock.interiorImage : ''
460 baseImage : 'engine_car.jpg',
462 value : data.stock.engineImage ? data.stock.engineImage : ''
467 baseImage : 'copy_of_natis_car.jpg',
469 value : data.stock.natisImage ? data.stock.natisImage : ''
476 value : data.firstName ? data.firstName : ''
482 value : data.familyName ? data.familyName : ''
487 title : 'Email address',
488 value : data.email ? data.email : ''
493 title : 'Confirm email address',
501 value : data.mobile ? data.mobile : ''
507 dataStoreId : 'regions',
509 onChange : $.proxy(function () {
510 if (!App.DataStore.getItem('BuildSelect:region', false))
512 /*App.DataStore.loadSelectListData(
513 'cities', false, 'Location', 'Town.SelectList', null,
515 "region" : $(this).val()
519 var dataList = undefined != _w.publicvaluation.publicCentreList[$('#region').val()]
520 ? _w.publicvaluation.publicCentreList[$('#region').val()]
522 App.DataStore.setData('publicCentre', dataList);
523 if ($('#sameAsBusinessAddress').prop('checked'))
525 $('#billingRegion').selectpicker('val', $('#region').val());
534 dataStoreId : 'cities',
541 title : 'Public Center',
542 dataStoreId : 'publicCentre',
556 style : 'rand-input',
557 id : 'requiredPrice',
558 title : 'Required price',
564 _listMakesModelsTypes : function( fromItemData, callback )
568 var year = _w.publicvaluation.itemData.stock.vehicleYear;
569 var category = _w.publicvaluation.itemData.stock.type.category.id;
570 var make = _w.publicvaluation.itemData.stock.type.model.make.id;
571 var model = _w.publicvaluation.itemData.stock.type.model.id;
572 var type = _w.publicvaluation.itemData.stock.type.id;
576 var year = $('#vehicleYear').val();
577 var category = $('#vehicleCategory').val();
578 var make = $('#vehicleMake').val();
579 var model = $('#vehicleModel').val();
580 var type = $('#vehicleType').val();
582 if (year && category)
584 App.DataStore.loadSelectListData(
585 'makes', false, 'Stock', 'Utility.ListMakes', null,
587 "category" : category,
592 if (make && year && category)
594 App.DataStore.loadSelectListData(
595 'models', false, 'Stock', 'Utility.ListModels', null,
598 "category" : category,
603 if (model && year && category)
605 App.DataStore.loadSelectListData(
606 'types', false, 'Stock', 'Utility.ListTypes', null,
609 "category" : category,
616 _setupValidation : function ()
618 App.DataStore.listen('regValidation', 'damages', function(id, damages) {
620 firstName: {required: true, minlength: 3},
621 familyName: {required: true, minlength: 3},
622 email: {required: true, email: true},
623 confirmEmail: {required: true, email: true, equalTo: "#email"},
624 mobile: {required: true, mobile: true},
625 region: {required: true},
626 city: {required: false},
627 publicCentre: {required: true},
628 street: {required: false},
629 requiredPrice: {required: true, number: true, min: 0.01},
630 vehicleYear: "required",
631 vehicleCategory: "required",
632 vehicleMake: "required",
633 vehicleModel: "required",
634 vehicleType: "required",
635 vehicleFuelType: "required",
636 vehicleTransmissionType: "required",
637 registrationNumber: "required",
639 vehicleCondition: "required",
640 exteriorColour: "required",
641 interiorColour: "required",
642 vehicleUpholstery: "required",
643 vehiclePapers: {required: false},
644 vehicleNatis: {required: false},
645 spareKeys: "required",
646 fullServiceHistory: "required",
647 km: { required: true, digits: true }
649 for (var i = 0; i < damages.length; i++)
651 rules['damage' + damages[i].value + 'Amount'] = {number: true};
653 $('#frmValuationView').validate({
657 minlength: "This field is required."
660 minlength: "This field is required."
663 required: "This field is required.",
664 email: "Please enter a valid<br/>email address."
667 required: "This field is required.",
668 email: "Please enter a valid<br/>email address.",
669 equalTo: "Please enter the same<br/>value again."
672 required: "This field is required.",
673 number: "Please enter a valid amount.",
674 min: "Please enter a<br/>valid amount."
676 vehicleYear : "This field is required.",
677 vehicleCategory : "This field is required.",
678 vehicleMake : "This field is required.",
679 vehicleModel : "This field is required.",
680 vehicleType : "This field is required.",
681 vehicleFuelType : "This field is required.",
682 vehicleTransmissionType : "This field is required.",
683 registrationNumber : "This field is required.",
684 vehicleCondition : "This field is required.",
685 exteriorColour : "This field is required.",
686 interiorColour : "This field is required.",
687 vehicleUpholstery : "This field is required.",
688 //vehiclePapers : "This field is required.",
689 //vehicleNatis : "This field is required.",
690 spareKeys : "This field is required.",
691 fullServiceHistory : "This field is required.",
692 km : {required: "This field is required."}
694 invalidHandler: function(event, validator) {
695 var errors = validator.numberOfInvalids();
696 if (0 < _w.publicvaluation.validations && errors) {
697 var message = errors == 1
698 ? 'You missed 1 field. It has been highlighted'
699 : 'You missed ' + errors + ' fields. They have been highlighted';
702 _w.publicvaluation.validations++;
704 submitHandler: function( form ) {
709 _w.publicvaluation.validations = 0;
710 $('#frmValuationView').valid();
712 $('label.error').remove();
713 $('.valid').removeClass('valid');
717 _prepValuationUpdateData : function()
719 function isValidEmailAddress(emailAddress) {
720 var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i);
721 return pattern.test(emailAddress);
724 var data = _w.publicvaluation.ti.harvest();
725 data.km = '' == data.km
728 data.retailPrice = 0.00;
729 data.tradePrice = 0.00;
730 data.listPrice = 0.00;
731 delete data.damageTotal;
733 if ('' == data.mainImage)
735 delete data.mainImage;
737 if ('' == data.leftImage)
739 delete data.leftImage;
741 if ('' == data.backImage)
743 delete data.backImage;
745 if ('' == data.engineImage)
747 delete data.engineImage;
749 if ('' == data.frontImage)
751 delete data.frontImage;
753 if ('' == data.rightImage)
755 delete data.rightImage;
757 if ('' == data.interiorImage)
759 delete data.interiorImage;
761 if ('' == data.natisImage)
763 delete data.natisImage;
767 var postData = {Stock:{}, Valuation:{}};
768 var valuationFields = [
769 "firstName","familyName","mobile",
770 "email","region","city","street","requiredPrice"," publicCentre"
772 for (var field in data)
774 if (-1 == valuationFields.indexOf(field))
776 postData.Stock[field] = data[field];
780 postData.Valuation[field] = data[field];
783 if ('' == postData.Valuation.idNumber)
785 delete postData.Valuation.idNumber;
788 if( !isValidEmailAddress( postData.Valuation.email ) )
790 testEmail = postData.Valuation.email;
791 //console.log("went through check", testEmail);
792 postData.Valuation.email = null;
796 if ('' == postData.Valuation.email)
798 postData.Valuation.email = null;
804 _onValuationUpdated : function( response )
806 //alert('Your vehicle has successfully been submitted.');
807 window.location.hash = '/thankyouvaluation';
809 _onValuationFail : function( response )
811 alert('Oops, something went wrong, please check your data carefully and try again.');
812 //window.location.hash = '/public-landing';