{"version":3,"sources":["global.js","forms.js","main.js","data-service.js","enquiry.js","homepage-app.js","mapoverlay.js","mydetails-app.js","myfavourites-app.js","myredemption-app.js","offer-app.js","redemption.js","search-app.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"main.js","sourcesContent":["// Generic Global Vars\r\n'use strict';\r\n\r\nvar windowW = '',\r\n debounce = '',\r\n detectIE = '',\r\n viewport = '',\r\n indexOf = [].indexOf || function (item) {\r\n for (var i = 0, l = this.length; i < l; i++) {\r\n if (i in this && this[i] === item) return i;\r\n }\r\n return -1;\r\n },\r\n createCookie = '',\r\n readCookie = '',\r\n eraseCookie = '',\r\n replaceCookie = '';\r\n\r\n// Window/Browser/Misc\r\n// Viewport function\r\nviewport = function () {\r\n var a, e;\r\n e = window;\r\n a = 'inner';\r\n if (!(indexOf.call(window, 'innerWidth') >= 0)) {\r\n a = 'client';\r\n e = document.documentElement || document.body;\r\n }\r\n return {\r\n width: e[a + 'Width'],\r\n height: e[a + 'Height']\r\n };\r\n};\r\n\r\n// Assign width of window to variable\r\nwindowW = viewport().width;\r\n\r\nfunction GetCurrentUserLocation(callback) {\r\n if (window.current_location != null) {\r\n callback(window.current_location);\r\n }\r\n\r\n if (navigator.geolocation && window.location.protocol === \"https:\") {\r\n navigator.geolocation.getCurrentPosition(function (position) {\r\n window.current_location = position.coords.latitude + ',' + position.coords.longitude;\r\n $.ajaxSetup({\r\n headers: { 'current-location': window.current_location }\r\n }); \r\n callback(window.current_location);\r\n }, function (err) { \r\n callback(null);\r\n }, { maximumAge: 60000, timeout: 5000, enableHighAccuracy: true });\r\n } else {\r\n callback(null);\r\n }\r\n}\r\n\r\nfunction logout() {\r\n $.ajax({\r\n url: \"/api/fvmember/logout\",\r\n type: \"GET\", \r\n success: function (data) {\r\n var loginPath = $(\"body\").data(\"login-path\");\r\n window.location = loginPath + '?returnUrl='+window.location.pathname + window.location.search;\r\n } \r\n });\r\n}\r\n\r\n//http://stackoverflow.com/questions/27928/calculate-distance-between-two-latitude-longitude-points-haversine-formula\r\nfunction getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2) {\r\n var radius = 6371; // Radius of the earth in km\r\n var dLat = deg2rad(lat2 - lat1); // deg2rad below\r\n var dLon = deg2rad(lon2 - lon1);\r\n var a =\r\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\r\n Math.cos(deg2rad(lat1)) *\r\n Math.cos(deg2rad(lat2)) *\r\n Math.sin(dLon / 2) *\r\n Math.sin(dLon / 2);\r\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n var d = radius * c; // Distance in km\r\n return d;\r\n}\r\n\r\nfunction deg2rad(deg) {\r\n return deg * (Math.PI / 180);\r\n}\r\n\r\nfunction saveUserLocation(bounds) {\r\n if (bounds != null) {\r\n localStorage.NorthEastLat = bounds.getNorthEast().lat();\r\n localStorage.NorthEastLng = bounds.getNorthEast().lng();\r\n localStorage.SouthWestLat = bounds.getSouthWest().lat();\r\n localStorage.SouthWestLng = bounds.getSouthWest().lng();\r\n } \r\n}\r\n\r\nfunction getUserLocation() {\r\n if (localStorage.NorthEastLat != null && localStorage.NorthEastLng != null && localStorage.SouthWestLat != null && localStorage.SouthWestLng != null) {\r\n var bounds = new google.maps.LatLngBounds();\r\n\r\n bounds.extend(new google.maps.LatLng(localStorage.NorthEastLat, localStorage.NorthEastLng));\r\n bounds.extend(new google.maps.LatLng(localStorage.SouthWestLat, localStorage.SouthWestLng));\r\n\r\n return bounds;\r\n }\r\n return null;\r\n}\r\n\r\nfunction resampleImg(canvas, width, height, resize_canvas) {\r\n var width_source = canvas.width;\r\n var height_source = canvas.height;\r\n width = Math.round(width);\r\n height = Math.round(height);\r\n\r\n var ratio_w = width_source / width;\r\n var ratio_h = height_source / height;\r\n var ratio_w_half = Math.ceil(ratio_w / 2);\r\n var ratio_h_half = Math.ceil(ratio_h / 2);\r\n\r\n var ctx = canvas.getContext(\"2d\");\r\n var img = ctx.getImageData(0, 0, width_source, height_source);\r\n var img2 = ctx.createImageData(width, height);\r\n var data = img.data;\r\n var data2 = img2.data;\r\n\r\n for (var j = 0; j < height; j++) {\r\n for (var i = 0; i < width; i++) {\r\n var x2 = (i + j * width) * 4;\r\n var weight = 0;\r\n var weights = 0;\r\n var weights_alpha = 0;\r\n var gx_r = 0;\r\n var gx_g = 0;\r\n var gx_b = 0;\r\n var gx_a = 0;\r\n var center_y = (j + 0.5) * ratio_h;\r\n var yy_start = Math.floor(j * ratio_h);\r\n var yy_stop = Math.ceil((j + 1) * ratio_h);\r\n for (var yy = yy_start; yy < yy_stop; yy++) {\r\n var dy = Math.abs(center_y - (yy + 0.5)) / ratio_h_half;\r\n var center_x = (i + 0.5) * ratio_w;\r\n var w0 = dy * dy; //pre-calc part of w\r\n var xx_start = Math.floor(i * ratio_w);\r\n var xx_stop = Math.ceil((i + 1) * ratio_w);\r\n for (var xx = xx_start; xx < xx_stop; xx++) {\r\n var dx = Math.abs(center_x - (xx + 0.5)) / ratio_w_half;\r\n var w = Math.sqrt(w0 + dx * dx);\r\n if (w >= 1) {\r\n //pixel too far\r\n continue;\r\n }\r\n //hermite filter\r\n weight = 2 * w * w * w - 3 * w * w + 1;\r\n var pos_x = 4 * (xx + yy * width_source);\r\n //alpha\r\n gx_a += weight * data[pos_x + 3];\r\n weights_alpha += weight;\r\n //colors\r\n if (data[pos_x + 3] < 255)\r\n weight = weight * data[pos_x + 3] / 250;\r\n gx_r += weight * data[pos_x];\r\n gx_g += weight * data[pos_x + 1];\r\n gx_b += weight * data[pos_x + 2];\r\n weights += weight;\r\n }\r\n }\r\n data2[x2] = gx_r / weights;\r\n data2[x2 + 1] = gx_g / weights;\r\n data2[x2 + 2] = gx_b / weights;\r\n data2[x2 + 3] = gx_a / weights_alpha;\r\n }\r\n }\r\n //clear and resize canvas\r\n if (resize_canvas === true) {\r\n canvas.width = width;\r\n canvas.height = height;\r\n } else {\r\n ctx.clearRect(0, 0, width_source, height_source);\r\n }\r\n\r\n //draw \r\n ctx.putImageData(img2, 0, 0); \r\n}\r\n\r\nfunction loadExternalSvg(placeholderID, url) {\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"GET\", url); \r\n xhr.overrideMimeType(\"image/svg+xml\");\r\n xhr.addEventListener('load', function(e) {\r\n document.getElementById(placeholderID)\r\n .appendChild(xhr.responseXML.documentElement); \r\n });\r\n xhr.send(\"\");\r\n}\r\nif (window.svgToReplace != null) {\r\n window.svgToReplace.forEach(function(r) {\r\n loadExternalSvg(r.containerID, r.url);\r\n });\r\n}","$(document).ready(function () {\r\n // Add class exclude to make sure, that only the current form will be validated\r\n $(\".form-control\").addClass(\"excluded\");\r\n $(\"[type=checkbox]\").addClass(\"excluded\");\r\n\r\n $(\"form\")\r\n .formValidation({\r\n framework: \"bootstrap\",\r\n excluded: [\":disabled\", \".excluded\", \":hidden\", \":not(:visible)\"],\r\n live: \"submitted\",\r\n autoFocus: false\r\n })\r\n .on(\"err.field.fv\", function (e, data) {\r\n data.fv.disableSubmitButtons(false);\r\n })\r\n .on(\"success.field.fv\", function (e, data) {\r\n data.fv.disableSubmitButtons(false);\r\n })\r\n .on(\"status.field.fv\", function (e, data) {\r\n data.fv.disableSubmitButtons(false);\r\n })\r\n .on(\"success.form.fv\", function (e) {\r\n e.preventDefault();\r\n var $form = $(e.target);\r\n // Make sure that select control will be validated properly\r\n $(\"select.form-control:not(.excluded)\").each(function (index) {\r\n var value = $(this).val();\r\n if (value.length > 0) {\r\n $(this).find(\"option\").removeAttr(\"selected\");\r\n $(this).find(\"option[value='\" + value + \"']\").attr(\"selected\", \"selected\");\r\n $(this).val(value);\r\n }\r\n });\r\n var $button = $form.data(\"formValidation\").getSubmitButton();\r\n // Disable button and show loading animation after submit\r\n $button.prop(\"disabled\", true);\r\n $button.find(\".btn-load.fa-spin\").css(\"visibility\", \"visible\");\r\n var $formContainer = $button.closest(\".form-container\");\r\n var action = $button.attr(\"data-action\");\r\n\r\n // Add form tags arrounf current form container to only serialize data within container\r\n var clone = $formContainer.clone().wrap(\"
\").parent();\r\n var formData = clone.serializeObject();\r\n FormSubmit(JSON.stringify(formData), action, $button);\r\n });\r\n\r\n //bindSelect();\r\n\r\n //$(\"[data-date-picker]\").datetimepicker({\r\n // format: \"DD/MM/YYYY\"\r\n //});\r\n\r\n $(\"#AcceptedTermsCheck\").on(\"click\",\r\n function () { \r\n $(\"#AcceptedTerms\").val($(this).is(\":checked\"));\r\n var group = $(this).closest(\".form-group\");\r\n var err = group.find(\".help-block\");\r\n if (!$(this).is(\":checked\")) {\r\n err.show();\r\n group.addClass(\"has-error\");\r\n } else {\r\n err.hide();\r\n group.removeClass(\"has-error\");\r\n }\r\n });\r\n $(\"#ContactByEntGroupCheck\").on(\"click\",\r\n function () {\r\n $(\"#ContactByEntGroup\").val($(this).is(\":checked\"));\r\n });\r\n});\r\n\r\n$(window).load(function () {\r\n if ($(\".form-control.phone\").length > 0) {\r\n $(\".form-control.phone\")\r\n .intlTelInput({\r\n utilsScript:\r\n \"/WWW_Shared/Assets/js/libphonenumber.js\",\r\n autoPlaceholder: false,\r\n defaultCountry: \"au\"\r\n });\r\n }\r\n});\r\n\r\nfunction validateContainer(id) {\r\n var $container = $(id);\r\n $(\".form-control\").addClass(\"excluded\");\r\n $(\"[type=checkbox]\").addClass(\"excluded\");\r\n $container.find(\".excluded\").removeClass(\"excluded\");\r\n\r\n var fv = $(\"form\").data(\"formValidation\");\r\n var isValidStep = false;\r\n if (typeof fv !== \"undefined\" && fv !== null) {\r\n fv.validateContainer($container);\r\n isValidStep = fv.isValidContainer($container);\r\n }\r\n var selectsValid = selectValidation();\r\n if (isValidStep) {\r\n isValidStep = selectsValid;\r\n }\r\n if (isValidStep === false || isValidStep === null) {\r\n $(\".has-error\").find(\".form-control:not(.excluded), .has-error [type=checkbox]:not(.excluded)\")[0].focus();\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction selectValidation() {\r\n var valid = true;\r\n $(\"select[required]\").each(\r\n function () {\r\n var parent = $(this).closest(\".form-group\");\r\n\r\n $(this).on(\"change\",\r\n function() {\r\n if ($(this).val() !== \"\") {\r\n parent.removeClass(\"has-error\");\r\n parent.find(\".help-block\").remove();\r\n }\r\n });\r\n\r\n if ($(this).val() === \"\") {\r\n var err = $(this).data(\"fv-notempty-message\");\r\n parent.addClass(\"has-error\"); \r\n if (parent.has(\".help-block\").size() === 0) {\r\n parent.append(\"\" + err + \"\");\r\n } else {\r\n parent.find(\".help-block\").show();\r\n }\r\n valid = false;\r\n }\r\n });\r\n return valid;\r\n}\r\n\r\nfunction FormSubmit(formData, action, btn) {\r\n console.log(formData);\r\n $.ajax({\r\n url: action,\r\n type: \"POST\",\r\n data: formData,\r\n contentType: \"application/json\",\r\n success: function (data) { OnFormSubmitSuccess(data, btn); },\r\n error: function (xhr, status) { OnFormSubmitError(xhr.responseText, btn); }\r\n });\r\n return false;\r\n}\r\n\r\nfunction OnFormSubmitSuccess(result, btn) {\r\n console.log(\"success\");\r\n console.log(result);\r\n var $button = btn;\r\n var $form = $button.closest(\".form-container\");\r\n var $danger = $form.find(\".alert-danger\");\r\n var $success = $form.find(\".alert-success\");\r\n\r\n $(\".has-error\").removeClass(\"has-error\");\r\n $(\".help-block\").hide();\r\n\r\n if (result.Info != null && result.Info.Errors.length > 0) {\r\n $button.prop(\"disabled\", false);\r\n $button.removeClass(\"disabled\");\r\n $button.find(\".btn-load.fa-spin\").css(\"visibility\", \"hidden\");\r\n\r\n for (var i = 0, len = result.Info.Errors.length; i < len; i++) {\r\n var inp = $(\"[name=\" + result.Info.Errors[i].ItemRef + \"]\");\r\n if (inp != null) {\r\n var parent = inp.closest(\".form-group\");\r\n parent.addClass(\"has-error\");\r\n if (parent.has(\".help-block\").size() === 0) {\r\n parent.append(\"\" + result.Info.Errors[i].Message + \"\");\r\n } else {\r\n parent.find(\".help-block\").show();\r\n }\r\n }\r\n\r\n $(\"[data-message]\", $danger).hide();\r\n var err = $danger.find(\"[data-message='\" + result.Info.Errors[i].ErrorCode + \"']\");\r\n if (err !== null && err !== undefined) {\r\n err.show();\r\n\r\n if (err.is(\"[data-popup]\")) {\r\n \r\n $(\".info-modal .modal-body\").html(err.parent().clone().show());\r\n \r\n $(\".info-modal\").modal();\r\n }\r\n\r\n } else {\r\n $danger.append(\"

\" + result.Info.Errors[i].Message + \"

\");\r\n }\r\n $form.find(\".alert-danger\").show();\r\n if ($form.find(\".alert-danger\").children(':visible').length <= 0) {\r\n $form.find(\".alert-danger\").hide();\r\n }\r\n }\r\n $form.find(\".alert-success\").hide();\r\n var onError = $button.data(\"on-error\");\r\n if (onError != null && onError !== \"\") {\r\n Function(\"result\", onError)(result);\r\n }\r\n\r\n } else {\r\n if (result.Info != null && result.Info.Infos.length > 0) {\r\n for (var j = 0, len2 = result.Info.Infos.length; j < len2; j++) {\r\n var inf = $success.find(\"[data-message='\" + result.Info.Infos[j].InfoCode + \"']\");\r\n if (inf !== null && inf !== undefined && inf.length > 0) {\r\n inf.show();\r\n } else {\r\n $success.append(\"

\" + result.Info.Infos[j].Message + \"

\");\r\n }\r\n } \r\n }\r\n var onSuccess = $button.data(\"on-success\");\r\n if (onSuccess != null && onSuccess !== \"\") {\r\n Function(onSuccess)();\r\n }\r\n $success.show();\r\n $form.find(\".alert-danger\").hide();\r\n\r\n var ret = $button.attr(\"data-return\");\r\n if (ret === \"collectdetails\") {\r\n if (result.Data.ContactDetailsUpdatedDate === null || (!result.Data.AcceptedTerms && result.Data.AcceptTermsRequired)) {\r\n window.location.href = \"/login/my-details\";\r\n return;\r\n } else {\r\n ret = \"referrer\";\r\n }\r\n }\r\n\r\n if (ret === \"referrer\") {\r\n var returnUrl = $.url().param(\"returnUrl\");\r\n var loginPath = $(\"body\").data(\"login-path\");\r\n if (returnUrl !== null && returnUrl !== undefined && returnUrl !== \"\" && returnUrl !== loginPath) {\r\n window.location.href = returnUrl;\r\n } else {\r\n window.location.href = \"/\";\r\n }\r\n }\r\n else if (ret !== null && ret !== undefined && ret !== \"\") {\r\n window.location.href = ret;\r\n } else {\r\n $button.prop(\"disabled\", false);\r\n $button.find(\".btn-load.fa-spin\").css(\"visibility\", \"hidden\");\r\n $button.removeClass(\"disabled\");\r\n }\r\n }\r\n}\r\n\r\nfunction OnFormSubmitError(result, btn) {\r\n console.log(\"error\");\r\n console.log(result);\r\n var $button = btn;\r\n var $form = $button.closest(\".form-container\");\r\n $button.prop(\"disabled\", false);\r\n $button.find(\".btn-load.fa-spin\").css(\"visibility\", \"hidden\");\r\n if (result && result.length > 0) {\r\n $(id).find(\"[data-error]\").show().text(result);\r\n }\r\n $form.find(\".alert-success\").hide();\r\n $form.find(\".alert-danger\").show();\r\n $form.find([\"data-error\"]).hide();\r\n}\r\n\r\nfunction bindSelect() {\r\n $(\"select[data-default]\").each(function (index) {\r\n var value = $(this).attr(\"data-default\");\r\n if (value && value.length > 0) {\r\n $(this).find(\"option\").removeAttr(\"selected\");\r\n $(this).find(\"option[value='\" + value + \"']\").attr(\"selected\", \"selected\");\r\n $(this).val(value);\r\n }\r\n });\r\n}\r\n\r\n$.fn.serializeObject = function () {\r\n var o = {};\r\n var a = this.serializeArray();\r\n $.each(a, function () {\r\n if (o[this.name] !== undefined) {\r\n if (!o[this.name].push) {\r\n o[this.name] = [o[this.name]];\r\n }\r\n o[this.name].push(this.value || \"\");\r\n } else {\r\n o[this.name] = this.value || \"\";\r\n }\r\n });\r\n return o;\r\n};\r\n\r\n// Submit form on clicking enter in text control\r\n$(\".form-container input[type=text], .form-container input[type=email], .form-container input[type=password], .form-container input[type=number], .form-container textarea\").keypress(function (a) {\r\n if (a.keyCode === 13 || (a.keyCode === 10 && a.ctrlKey)) {\r\n if (!$(this).hasClass(\"no-enter-submit\") || a.ctrlKey) {\r\n (a.preventDefault(), $(this).parents(\".form-container\").find(\"[type=submit]:visible\").click());\r\n }\r\n }\r\n});\r\n\r\nfunction hideFieldsOnSubmitted() {\r\n $(\".form-group\").hide();\r\n}\r\n\r\nfunction singleLoginSuccess(result) {\r\n if (result.Info !== null && result.Info.Errors.length > 0) {\r\n if (result.Info.Errors[0].ErrorCode === \"USERHASPASSWORD\") {\r\n $(\".pnl_password\").show();\r\n $(\".form-group-submit button\").attr(\"data-action\", \"/api/fvmember/login\");\r\n $(\".form-group-submit button\")\r\n .attr(\"data-return\", $(\".form-group-submit button\").attr(\"data-return-login\"));\r\n }\r\n }\r\n}\r\n\r\n$(document).on(\"change\", \"select\", function () {\r\n $('option[value=\"' + this.value + '\"]', this)\r\n .prop(\"selected\", true).siblings() \r\n .removeAttr(\"selected\");\r\n});","$(document).ready(function(){\r\n \r\n $('.backtop').on('click', function () {\r\n $(\"html, body\").animate({\r\n scrollTop: 0\r\n }, 1000);\r\n return false;\r\n });\r\n\r\n $('.mob-panel .btn').click(function(){\r\n $('.collapse.in').collapse('hide');\r\n });\r\n\r\n switchPos();\r\n \r\n $(\".template-homepage-mobile .tiles li\").matchHeight({\r\n byRow: true\r\n });\r\n \r\n $('.popup-gallery').magnificPopup({\r\n delegate: 'a',\r\n type: 'image',\r\n tLoading: 'Loading image #%curr%...',\r\n mainClass: 'mfp-img-mobile',\r\n gallery: {\r\n enabled: true,\r\n navigateByImgClick: true,\r\n preload: [0,1] // Will preload 0 - before current, and 1 after the current image\r\n },\r\n image: {\r\n tError: 'The image #%curr% could not be loaded.',\r\n }\r\n });\r\n $('.alert-danger').each(function(){\r\n var f = $(this);\r\n $(this).find(\".btn-default\").click(function(e){\r\n f.fadeOut();\r\n e.preventDefault();\r\n })\r\n });\r\n\r\n $('.alert-success').each(function () {\r\n var f = $(this);\r\n $(this).find(\".btn-default\").click(function(e) {\r\n f.fadeOut();\r\n e.preventDefault();\r\n });\r\n });\r\n\r\n\r\n $('.modal').on('show.bs.modal', function() {\r\n $(this).show();\r\n setModalMaxHeight(this);\r\n }); \r\n\r\n if ($('.quick-search-slider').length != 0) {\r\n \r\n $('.quick-search-slider').slick({\r\n dots: false,\r\n arrows: true,\r\n infinite: false,\r\n speed: 300,\r\n slidesToShow: 11,\r\n slidesToScroll: 11,\r\n responsive: [\r\n {\r\n breakpoint: 1200,\r\n settings: {\r\n slidesToShow: 9,\r\n slidesToScroll: 9,\r\n infinite: true,\r\n dots: true\r\n }\r\n },\r\n {\r\n breakpoint: 992,\r\n settings: {\r\n slidesToShow: 6,\r\n slidesToScroll: 6\r\n }\r\n },\r\n {\r\n breakpoint: 768,\r\n settings: {\r\n slidesToShow: 5,\r\n slidesToScroll: 5\r\n }\r\n },\r\n {\r\n breakpoint: 480,\r\n settings: {\r\n slidesToShow: 3,\r\n slidesToScroll: 3\r\n }\r\n } \r\n ]\r\n });\r\n\r\n if (windowW > 1199) {\r\n if ($('.quick-search-slider .tiles__item').length <= 10) {\r\n $('.quick-search-slider').slick('unslick');\r\n }\r\n } \r\n\r\n }\r\n \r\n\r\n});\r\n\r\n$(window).resize(function(){\r\n switchPos();\r\n if ($('.modal.in').length != 0) {\r\n setModalMaxHeight($('.modal.in'));\r\n }\r\n});\r\n\r\nfunction setModalMaxHeight(element) {\r\n var $element = $(element); \r\n var $content = $element.find('.modal-content');\r\n var borderWidth = $content.outerHeight() - $content.innerHeight();\r\n var dialogMargin = $(window).width() < 768 ? 20 : 60;\r\n var contentHeight = $(window).height() - (dialogMargin + borderWidth);\r\n var headerHeight = $element.find('.modal-header').outerHeight() || 0;\r\n var footerHeight = $element.find('.modal-footer').outerHeight() || 0;\r\n var maxHeight = contentHeight - (headerHeight + footerHeight);\r\n\r\n $content.css({\r\n 'overflow': 'hidden'\r\n });\r\n \r\n $element\r\n .find('.modal-body').css({\r\n 'max-height': maxHeight,\r\n 'overflow-y': 'auto'\r\n });\r\n}\r\n\r\nfunction switchPos(){\r\n var currWidth = $(window).width();\r\n if(currWidth <= 767){\r\n $('.location--lead').insertAfter('.details');\r\n }\r\n if(currWidth >= 768){\r\n $('.details').insertAfter('.location--lead');\r\n } \r\n}","'use strict';\r\nfunction dataService($http, $q) {\r\n\r\n var searchBaseUrl = \"/api/search\";\r\n\r\n this.searchQueue = [];\r\n this.searchOffers = function (filter) {\r\n var canceller = $q.defer();\r\n\r\n var cancel = function (reason) {\r\n canceller.resolve(reason);\r\n };\r\n\r\n var http = {\r\n method: 'POST',\r\n timeout: canceller.promise,\r\n url: searchBaseUrl,\r\n data: filter\r\n }\r\n\r\n if (window.current_location != null) {\r\n http.headers = {\r\n 'current-location': window.current_location\r\n };\r\n }\r\n var promise = $http(http);\r\n\r\n return {\r\n promise: promise,\r\n cancel: cancel\r\n };\r\n };\r\n this.loadFilters = function (country) {\r\n return $http.get(searchBaseUrl + \"/loadFilters/\" + (country || \"\"));\r\n }\r\n\r\n this.getAreas = function (country) {\r\n return $http.get(searchBaseUrl + \"/loadAreas/\" + country);\r\n }\r\n\r\n this.getGoogleCoordination = function (term) {\r\n return $http.get(\"//maps.google.com/maps/api/geocode/json?components=country:au&address=\" + term);\r\n };\r\n\r\n this.suggest = function (term, categories) {\r\n var canceller = $q.defer();\r\n\r\n var cancel = function (reason) {\r\n canceller.resolve(reason);\r\n };\r\n\r\n var promise = $http({\r\n method: 'GET',\r\n timeout: canceller.promise,\r\n url: searchBaseUrl + \"/suggestion?term=\" + encodeURIComponent(term) + \"&categories=\" + categories\r\n });\r\n\r\n return {\r\n promise: promise,\r\n cancel: cancel\r\n };\r\n };\r\n\r\n this.addToFavourites = function (merchantID) {\r\n return $http.get(\"/api/favourites/\" + merchantID + \"/add\");\r\n };\r\n\r\n this.removeFromFavourites = function (merchantID) {\r\n return $http.get(\"/api/favourites/\" + merchantID + \"/remove\");\r\n };\r\n\r\n this.myFavourites = function () {\r\n var canceller = $q.defer();\r\n\r\n var cancel = function (reason) {\r\n canceller.resolve(reason);\r\n };\r\n\r\n var promise = $http({\r\n method: 'GET',\r\n timeout: canceller.promise,\r\n url: \"/api/favourites/myfavourites\"\r\n });\r\n\r\n return {\r\n promise: promise,\r\n cancel: cancel\r\n };\r\n }\r\n\r\n this.getOffer = function (id, locationID) {\r\n var canceller = $q.defer();\r\n\r\n var cancel = function (reason) {\r\n canceller.resolve(reason);\r\n };\r\n\r\n var promise = $http({\r\n method: 'GET',\r\n timeout: canceller.promise,\r\n url: \"/api/offers/\" + id + \"?locationId=\" + locationID\r\n });\r\n\r\n return {\r\n promise: promise,\r\n cancel: cancel\r\n };\r\n }\r\n\r\n this.getOfferReviews = function(id) {\r\n return $http.get(\"/api/offers/\" + id + \"/reviews?orderDesc=true\");\r\n }\r\n\r\n this.getOfferRedemptionHistory = function (id) {\r\n return $http.get(\"/api/fvmember/redemptions/\" + id);\r\n }\r\n\r\n this.listRedemptions = function (page) {\r\n return $http.get(\"/api/redemption/list?page=\" + page);\r\n };\r\n}\r\n\r\nfunction handlePendingRequests(vm, callStore, req) {\r\n vm[callStore] = vm[callStore] || [];\r\n vm[callStore].forEach(function (r) {\r\n r.cancel(\"new request\");\r\n vm[callStore].splice(vm[callStore].indexOf(r), 1);\r\n });\r\n vm[callStore].push(req);\r\n}","$(function() {\r\n var ddlCountry = $(\"#form-enquiry #Country\");\r\n setRegionList(ddlCountry);\r\n\r\n $(\"#form-enquiry select\").on(\"change\",\r\n function() {\r\n if ($(this).val() === \"\") {\r\n var err = $(this).data(\"fv-notempty-message\");\r\n \r\n var parent = $(this).closest(\".form-group\");\r\n parent.addClass(\"has-error\");\r\n if (parent.has(\".help-block\").size() === 0) {\r\n parent.append(\"\" + err + \"\");\r\n } else {\r\n parent.find(\".help-block\").show();\r\n }\r\n }\r\n });\r\n});\r\n\r\nfunction enquirySuccesfullSubmitted() {\r\n $(\".form-group\").hide();\r\n}\r\n\r\nfunction setRegionList(country) {\r\n\r\n $(\"#form-enquiry #City\").hide();\r\n $(\"#form-enquiry #CityNZ\").hide();\r\n $(\"#form-enquiry #State\").hide();\r\n $(\"#form-enquiry #City\").removeAttr(\"required\");\r\n $(\"#form-enquiry #CityNZ\").removeAttr(\"required\");\r\n $(\"#form-enquiry #State\").removeAttr(\"required\");\r\n $(\".city-based-address\").hide();\r\n $(\".state-based-address\").hide();\r\n \r\n if (country.val() === \"Australia\") {\r\n $(\".state-based-address\").show();\r\n $(\"#form-enquiry #State\").show();\r\n $(\"#form-enquiry #State\").attr(\"required\", \"required\");\r\n\r\n } else if (country.val() === \"New Zealand\") {\r\n $(\".city-based-address\").show();\r\n $(\"#form-enquiry #CityNZ\").show();\r\n $(\"#form-enquiry #CityNZ\").attr(\"required\", \"required\");\r\n } else {\r\n $(\".city-based-address\").show();\r\n $(\"#form-enquiry #City\").show();\r\n $(\"#form-enquiry #City\").attr(\"required\", \"required\");\r\n }\t\t\r\n}","'use strict';\r\n\r\nvar homeapp = angular.module(\"homeapp\", []);\r\n\r\n(function () {\r\n 'use strict'; \r\n\r\n homeapp.service(\"dataService\", dataService);\r\n dataService.$inject = ['$http', '$q'];\r\n\r\n homeapp.directive(\"typeaheadhome\", typeaheadhome);\r\n typeaheadhome.$inject = ['dataService', '$location', '$timeout'];\r\n\r\n function typeaheadhome(dataService, $location, $timeout) {\r\n return {\r\n restrict: 'A',\r\n link: link\r\n };\r\n\r\n function link($scope, elm, attrs) {\r\n\r\n $(elm).typeahead({\r\n minLength: 3,\r\n highlight: true\r\n },\r\n {\r\n displayKey: 'Name',\r\n limit: 50,\r\n source: function (query, syncResults, asyncResults) {\r\n var req = dataService.suggest(query);\r\n $scope.vm.handlePendingRequests(\"suggest\", req);\r\n\r\n req.promise.then(function (res) {\r\n asyncResults(res.data.Data);\r\n });\r\n },\r\n templates: {\r\n suggestion: function (data) {\r\n return '

' + data.Name + '

';\r\n }\r\n }\r\n });\r\n $(elm).bind('typeahead:select', function (ev, item) {\r\n $scope.vm.searchSelectedItem = item;\r\n $scope.vm.filter.suburb = null;\r\n $scope.vm.filter.categories = null;\r\n $scope.vm.filter.cuisineID = null;\r\n $scope.vm.filter.merchantID = null;\r\n\r\n if (item.Type === \"Merchant\") {\r\n $scope.vm.filter.merchantID = item.ID; \r\n }\r\n if (item.Type === \"Suburb\") {\r\n $scope.vm.filter.suburb = item.ID; \r\n }\r\n if (item.Type === \"Category\") {\r\n $scope.vm.filter.categories = item.ID; \r\n }\r\n if (item.Type === \"Cuisine\") { \r\n $scope.vm.filter.cuisineID = item.ID; \r\n }\r\n $scope.vm.search();\r\n });\r\n $(elm).bind('typeahead:change', function (ev, item) {\r\n if ($scope.vm.searchSelectedItem == null || $scope.vm.searchSelectedItem.Name !== item) {\r\n $scope.vm.filter.merchantID = null;\r\n $scope.vm.filter.suburb = null;\r\n $scope.vm.filter.categories = null;\r\n $scope.vm.filter.cuisineID = null;\r\n $(elm).typeahead('val', \"\");\r\n $scope.vm.filter.searchTerm = \"\";\r\n $scope.vm.searchSelectedItem = null; \r\n }\r\n });\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n homeapp.controller(\"homeCtrl\", homeCtrl);\r\n homeCtrl.$inject = ['dataService', '$httpParamSerializer'];\r\n\r\n function homeCtrl(dataService, $httpParamSerializer) {\r\n var vm = this;\r\n vm.handlePendingRequests = handlePendingRequests;\r\n vm.search = search;\r\n vm.filterBySuggestion = filterBySuggestion;\r\n \r\n init();\r\n\r\n function filterBySuggestion(e) {\r\n if (e.keyCode === 13) {\r\n search();\r\n }\r\n }\r\n\r\n function search() {\r\n var url = \"/search?\" + $httpParamSerializer(vm.filter);\r\n window.location = url;\r\n }\r\n\r\n function handlePendingRequests(callStore, req) {\r\n vm[callStore] = vm[callStore] || [];\r\n vm[callStore].forEach(function (r) {\r\n r.cancel(\"new request\");\r\n vm[callStore].splice(vm[callStore].indexOf(r), 1);\r\n });\r\n vm[callStore].push(req);\r\n }\r\n\r\n function init() {\r\n if (navigator.geolocation && window.location.protocol === \"https:\") {\r\n navigator.geolocation.getCurrentPosition(function (position) {\r\n\r\n var links = $(\"a[href^='/Search']\");\r\n links.each(function () {\r\n var href = $(this).attr(\"href\");\r\n href += href.indexOf(\"?\") >= 0 ? \"&\" : \"?\";\r\n href += \"centerLat=\" + position.coords.latitude + \"¢erLng=\" + position.coords.longitude + \"&zoom=12\";\r\n $(this).attr(\"href\", href);\r\n });\r\n\r\n },\r\n function (err) { },\r\n { maximumAge: 60000, timeout: 5000, enableHighAccuracy: true });\r\n }\r\n }\r\n };\r\n})();\r\n\r\n$(window).load(function() {\r\n $('.royalSlider').each(function(){ \r\n if ($(this).find('.item').length){\r\n $(\".slider-loading\").fadeOut(\"slow\");\r\n $(\".template-homepage .royalSlider\").css('display', 'block').royalSlider({\r\n // options go here\r\n // as an example, enable keyboard arrows nav\r\n \r\n transitionType: 'fade',\r\n keyboardNavEnabled: true,\r\n controlNavigation: \"none\",\r\n autoHeight: true,\r\n loop: true,\r\n loopRewind: true,\r\n navigateByClick: false,\r\n autoPlay: {\r\n enabled: true,\r\n pauseOnHover: true,\r\n delay: 5000\r\n }\r\n });\r\n }else{\r\n $('.slider-section').hide();\r\n }\r\n })\r\n});","CustomMapPin.prototype = new google.maps.OverlayView();\r\n\r\n\r\n/** @constructor */\r\nfunction CustomMapPin(bounds, baseImg, item, map) {\r\n\r\n this.item = item;\r\n \r\n // Now initialize all properties.\r\n this.bounds_ = bounds;\r\n this.image_ = item.iconUrl;\r\n this.baseImage_ = baseImg;\r\n this.map_ = map;\r\n this.id_ = item.ID;\r\n this.clickEvent = null;\r\n\r\n // Define a property to hold the image's div. We'll\r\n // actually create this div upon receipt of the onAdd()\r\n // method so we'll leave it null for now.\r\n this.div_ = null;\r\n\r\n // Explicitly call setMap on this overlay\r\n this.setMap(map);\r\n}\r\n\r\nCustomMapPin.prototype.onAdd = function () {\r\n\r\n var div = document.createElement('div');\r\n div.id = this.id_ + '__icon__svg';\r\n div.style.border = 'none';\r\n div.style.borderWidth = '0px';\r\n div.style.position = 'absolute';\r\n\r\n // Create the img element and attach it to the div.\r\n var img = document.createElement('img');\r\n img.src = this.baseImage_;\r\n //img.style.width = '60px';\r\n //img.style.height = '99px';\r\n img.style.position = 'absolute';\r\n img.style.top = '-80px';\r\n img.style.left = '-24px';\r\n\r\n div.appendChild(img);\r\n\r\n if (this.image_.endsWith('svg')) {\r\n loadExternalSvg(div.id, this.image_);\r\n } else {\r\n var icon = document.createElement('img');\r\n icon.src = this.image_;\r\n icon.style.width = '39px';\r\n icon.style.height = '39px';\r\n icon.style.position = 'absolute';\r\n icon.style.top = '-63px';\r\n icon.style.left = '-19px';\r\n\r\n div.appendChild(icon);\r\n }\r\n\r\n this.div_ = div;\r\n\r\n // Add the element to the \"overlayImage\" pane.\r\n var panes = this.getPanes();\r\n panes.overlayImage.appendChild(this.div_);\r\n};\r\n\r\nCustomMapPin.prototype.draw = function () {\r\n\r\n // We use the south-west and north-east\r\n // coordinates of the overlay to peg it to the correct position and size.\r\n // To do this, we need to retrieve the projection from the overlay.\r\n var overlayProjection = this.getProjection();\r\n\r\n // Retrieve the south-west and north-east coordinates of this overlay\r\n // in LatLngs and convert them to pixel coordinates.\r\n // We'll use these coordinates to resize the div.\r\n var sw = overlayProjection.fromLatLngToDivPixel(this.bounds_.getSouthWest());\r\n var ne = overlayProjection.fromLatLngToDivPixel(this.bounds_.getNorthEast());\r\n\r\n // Resize the image's div to fit the indicated dimensions.\r\n var div = this.div_;\r\n div.style.left = sw.x + 'px';\r\n div.style.top = ne.y + 'px';\r\n div.style.width = (ne.x - sw.x) + 'px';\r\n div.style.height = (sw.y - ne.y) + 'px';\r\n\r\n var marker = this.marker;\r\n google.maps.event.addDomListener(div, \"click\", function (event) {\r\n \r\n google.maps.event.trigger(marker, \"click\");\r\n });\r\n};\r\n\r\nCustomMapPin.prototype.onRemove = function () {\r\n this.div_.parentNode.removeChild(this.div_);\r\n};\r\n\r\n// Set the visibility to 'hidden' or 'visible'.\r\nCustomMapPin.prototype.hide = function () {\r\n if (this.div_) {\r\n // The visibility property must be a string enclosed in quotes.\r\n this.div_.style.visibility = 'hidden';\r\n }\r\n};\r\n\r\nCustomMapPin.prototype.show = function () {\r\n if (this.div_) {\r\n this.div_.style.visibility = 'visible';\r\n }\r\n};\r\n\r\nCustomMapPin.prototype.toggle = function () {\r\n if (this.div_) {\r\n if (this.div_.style.visibility === 'hidden') {\r\n this.show();\r\n } else {\r\n this.hide();\r\n }\r\n }\r\n};\r\n\r\nCustomMapPin.prototype.getPosition = function() {\r\n return this.bounds_.getSouthWest();\r\n}\r\n\r\n// Detach the map from the DOM via toggleDOM().\r\n// Note that if we later reattach the map, it will be visible again,\r\n// because the containing
is recreated in the overlay's onAdd() method.\r\nCustomMapPin.prototype.toggleDOM = function () {\r\n if (this.getMap()) {\r\n // Note: setMap(null) calls OverlayView.onRemove()\r\n this.setMap(null);\r\n } else {\r\n this.setMap(this.map_);\r\n }\r\n};\r\n\r\n//CustomMapPin.prototype.addListener = function (name, callback) {\r\n// this.clickEvent = callback;\r\n//}","'use strict';\r\nfunction getMyDetails() {\r\n $.ajax({\r\n url: '/api/fvmember/my-details',\r\n type: \"GET\", \r\n contentType: \"application/json\",\r\n success: function(data) {\r\n\r\n //$(\"#MyDetailsTitle\").val(data.Data.Title);\r\n //$(\"#MyDetailsFirstName\").val(data.Data.FirstName);\r\n //$(\"#MyDetailsLastName\").val(data.Data.LastName);\r\n //$(\"#MyDetailsEmail\").val(data.Data.Email);\r\n\r\n } \r\n });\r\n}","'use strict';\r\n\r\nvar favouritesapp = angular.module(\"favouritesapp\", []);\r\n\r\nfavouritesapp.factory('httpRequestInterceptor', function () {\r\n return {\r\n request: function (config) {\r\n if (config.url.indexOf(\"/api/\") === 0) {\r\n if (window.current_location != null) {\r\n config.headers['current-location'] = window.current_location;\r\n } else {\r\n GetCurrentUserLocation(function (coordinates) {\r\n config.headers['current-location'] = window.current_location;\r\n });\r\n }\r\n }\r\n return config;\r\n }\r\n };\r\n});\r\n\r\nfavouritesapp.config(function ($locationProvider, $httpProvider) {\r\n $locationProvider.html5Mode({\r\n enabled: true,\r\n requireBase: true\r\n });\r\n $httpProvider.interceptors.push('httpRequestInterceptor');\r\n});\r\n\r\n(function () {\r\n 'use strict';\r\n\r\n favouritesapp.service(\"dataService\", dataService);\r\n dataService.$inject = ['$http', '$q'];\r\n \r\n favouritesapp.controller(\"favouritesCtrl\", favouritesCtrl);\r\n favouritesCtrl.$inject = ['dataService', '$timeout', '$window'];\r\n\r\n function favouritesCtrl(dataService, $timeout, $window) {\r\n var vm = this; \r\n vm.showMoreLocations = showMoreLocations; \r\n vm.removeMerchant = removeMerchant;\r\n vm.setMerchantToRemove = setMerchantToRemove;\r\n \r\n init();\r\n\r\n function setMerchantToRemove(merchant) {\r\n vm.currentMerchant = merchant;\r\n $(\".confirm-remove-modal\").modal({\r\n backdrop: \"static\"\r\n });\r\n }\r\n\r\n function removeMerchant(merchantID) {\r\n dataService.removeFromFavourites(merchantID).then(function () {\r\n for (var i = vm.data.length; i--;) {\r\n for (var y = vm.data[i].Merchants.length; y--;) {\r\n if (vm.data[i].Merchants[y].Merchant.MerchantID === merchantID) {\r\n vm.data[i].Merchants.splice(y, 1);\r\n\r\n if (vm.data[i].Merchants.length === 0) {\r\n vm.data.splice(i, 1);\r\n }\r\n }\r\n }\r\n } \r\n });\r\n }\r\n\r\n function showMoreLocations(item) {\r\n item.showMoreHidden = true;\r\n }\r\n \r\n function loadData(q) {\r\n \r\n var req = dataService.myFavourites();\r\n handlePendingRequests(vm, \"myFavourites\", req);\r\n\r\n req.promise.then(function (res) {\r\n vm.data = res.data.Data; \r\n });\r\n } \r\n\r\n function loadCurrentUserLocation() {\r\n GetCurrentUserLocation(function (loc) {\r\n if (loc != null) {\r\n var sp = loc.split(',');\r\n vm.UserCurrentLocation = {\r\n Latitude: parseFloat(sp[0]),\r\n Longitude: parseFloat(sp[1])\r\n };\r\n loadData();\r\n }\r\n });\r\n }\r\n\r\n function init() {\r\n loadCurrentUserLocation();\r\n //wait if we can got user current location\r\n $timeout(function () {\r\n if (vm.UserCurrentLocation == null) {\r\n loadData();\r\n }\r\n }, 200);\r\n\r\n $window.onfocus = function () {\r\n $timeout(function () {\r\n if (vm.UserCurrentLocation == null) {\r\n loadCurrentUserLocation();\r\n }\r\n\r\n }, 200);\r\n };\r\n }\r\n };\r\n})();\r\n\r\n","'use strict';\r\n\r\nvar myredemptionapp = angular.module(\"myredemptionapp\", []);\r\n\r\n(function () {\r\n 'use strict';\r\n\r\n myredemptionapp.service(\"dataService\", dataService);\r\n dataService.$inject = ['$http', '$q'];\r\n\r\n myredemptionapp.controller(\"myredemptionCtrl\", myredemptionCtrl);\r\n myredemptionCtrl.$inject = ['dataService', '$timeout', '$window'];\r\n\r\n function myredemptionCtrl(dataService, $timeout, $window) {\r\n var vm = this;\r\n vm.page = 1;\r\n vm.isInit = true;\r\n vm.data = [];\r\n vm.showMore = showMore;\r\n vm.displayShowMore = false;\r\n vm.dateToString = dateToString;\r\n\r\n init();\r\n \r\n function loadData() {\r\n\r\n var req = dataService.listRedemptions(vm.page);\r\n \r\n req.then(function (res) { \r\n vm.data = vm.data.concat(res.data.Data);\r\n vm.isInit = false;\r\n vm.displayShowMore = res.data.Info.RecordsCount > vm.data.length;\r\n\r\n vm.data.forEach(function (c) {\r\n if (c.CategoryIcon.endsWith('svg')) {\r\n loadExternalSvg(c.ID + '__icon__svg', c.CategoryIcon);\r\n }\r\n });\r\n });\r\n }\r\n\r\n function showMore() {\r\n vm.page++;\r\n loadData();\r\n }\r\n \r\n function init() {\r\n loadData();\r\n }\r\n\r\n function dateToString(value) {\r\n return moment(value).format(\"Do MMM YYYY\");\r\n }\r\n };\r\n})();\r\n\r\n\r\n","'use strict';\r\n\r\nvar offerapp = angular.module(\"offerapp\", []);\r\n\r\nofferapp.factory('httpRequestInterceptor', function () {\r\n return {\r\n request: function (config) {\r\n if (config.url.indexOf(\"/api/\") === 0) {\r\n if (window.current_location != null) {\r\n config.headers['current-location'] = window.current_location;\r\n } else {\r\n GetCurrentUserLocation(function(coordinates) {\r\n config.headers['current-location'] = window.current_location;\r\n });\r\n }\r\n }\r\n return config;\r\n }\r\n };\r\n});\r\n\r\nofferapp.config(function ($locationProvider, $httpProvider) {\r\n $locationProvider.html5Mode({\r\n enabled: true,\r\n requireBase: true\r\n });\r\n $httpProvider.interceptors.push('httpRequestInterceptor');\r\n});\r\n\r\n(function() {\r\n 'use strict';\r\n\r\n offerapp.service(\"dataService\", dataService);\r\n dataService.$inject = ['$http', '$q'];\r\n\r\n offerapp.directive(\"rating\", function () {\r\n return {\r\n templateUrl: \"rating.html\",\r\n restrict: 'A',\r\n replace: true,\r\n scope: { \r\n ratingValue: '@rating'\r\n }\r\n };\r\n });\r\n\r\n offerapp.directive(\"mobileImageList\", function () {\r\n return {\r\n templateUrl: \"mobileImageList.html\",\r\n restrict: 'A',\r\n replace: true,\r\n scope: {\r\n\r\n ratingValue: '@rating',\r\n }\r\n };\r\n });\r\n\r\n offerapp.directive(\"canBeSvg\", externalSvg);\r\n function externalSvg() {\r\n return {\r\n restrict: 'C',\r\n link: link\r\n };\r\n\r\n function link($scope, elm, attrs) { \r\n $(elm).load(function () {\r\n if (!attrs.src.endsWith(\"svg\")) {\r\n return;\r\n }\r\n $(elm).hide();\r\n\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"GET\", attrs.src);\r\n xhr.overrideMimeType(\"image/svg+xml\");\r\n xhr.addEventListener('load',\r\n function (e) { \r\n var container = $(\"\");\r\n container.append(xhr.responseXML.documentElement);\r\n $(elm).after(container);\r\n });\r\n xhr.send(\"\"); \r\n }); \r\n \r\n }\r\n } \r\n\r\n offerapp.filter(\"trust\", ['$sce', function ($sce) {\r\n return function (htmlCode) {\r\n return $sce.trustAsHtml(htmlCode);\r\n }\r\n }]);\r\n\r\n offerapp.controller(\"offerCtrl\", offerCtrl);\r\n offerCtrl.$inject = ['dataService', '$timeout', '$window'];\r\n\r\n function offerCtrl(dataService, $timeout, $window) {\r\n var vm = this;\r\n vm.noOffer = false;\r\n vm.offerID = $(\".offer[data-id]\").data(\"id\");\r\n vm.locationID = $(\".offer[data-locationid]\").data(\"locationid\");\r\n vm.distance = distance;\r\n vm.getOfferReviews = getOfferReviews;\r\n vm.getOfferHistory = getOfferHistory;\r\n vm.dateToString = dateToString;\r\n vm.dateTimeToString = dateTimeToString;\r\n vm.getGoogleLink = getGoogleLink;\r\n vm.showRedeemModal = showRedeemModal;\r\n vm.displayOfferBox = displayOfferBox;\r\n vm.displayOtherLocations = displayOtherLocations;\r\n vm.isMobile = isMobile;\r\n vm.addToFavourites = addToFavourites;\r\n vm.removeFromFavourites = removeFromFavourites;\r\n\r\n init();\r\n\r\n function getGoogleLink(location) {\r\n if (location == null) {\r\n return \"\";\r\n }\r\n return \"http://maps.google.com/?q=\" + location.Address + \",\" + location.Suburb + \",\" + location.State + \",\" + location.Postcode;\r\n }\r\n\r\n function showRedeemModal() {\r\n $(\".offers-modal\").modal();\r\n }\r\n\r\n function dateToString(value) {\r\n return moment(value).format(\"Do MMM YYYY\");\r\n }\r\n\r\n function dateTimeToString(value) {\r\n return moment(value).format(\"Do MMM YYYY, h:mm A\");\r\n } \r\n\r\n function distance(currentlat, currentlog, lat, long) {\r\n currentlat = currentlat || null;\r\n currentlog = currentlog || null;\r\n var d = getDistanceFromLatLonInKm(currentlat, currentlog, lat, long);\r\n return d.toFixed(0).toString() + \"km\";\r\n }\r\n\r\n function getOfferReviews(e, id) {\r\n var button = e.currentTarget; \r\n var isLoaded = $(button).data(\"isloaded\");\r\n if (!isLoaded) {\r\n var target = $(button).data(\"updatedtarget\");\r\n\r\n dataService.getOfferReviews(id).then(function(res) {\r\n vm.reviews = res.data.Data;\r\n $(button).data(\"isloaded\", \"true\");\r\n $(target).show();\r\n }); \r\n }\r\n }\r\n\r\n function getOfferHistory(e, id) {\r\n var button = e.currentTarget;\r\n console.log(button);\r\n var isLoaded = $(button).data(\"isloaded\");\r\n if (!isLoaded) {\r\n var target = $(button).data(\"updatedtarget\");\r\n\r\n dataService.getOfferRedemptionHistory(id).then(function (res) {\r\n vm.histories = res.data.Data;\r\n $(button).data(\"isloaded\", \"true\");\r\n $(target).show();\r\n });\r\n }\r\n }\r\n\r\n function recalculteDistance() {\r\n if (vm.UserCurrentLocation != null) {\r\n if (vm.data != null) {\r\n vm.data.distance = distance(vm.UserCurrentLocation.Latitude, vm.UserCurrentLocation.Longitude,\r\n vm.data.ContextLocation.Latitude, vm.data.ContextLocation.Longitude);\r\n\r\n vm.data.Merchant.Locations.forEach(function(location) {\r\n location.distance = distance(vm.UserCurrentLocation.Latitude, vm.UserCurrentLocation.Longitude,\r\n location.Latitude, location.Longitude);\r\n });\r\n }\r\n }\r\n }\r\n\r\n\r\n function loadOffer(q) {\r\n var req = dataService.getOffer(vm.offerID, vm.locationID);\r\n handlePendingRequests(vm, \"getOffer\", req);\r\n\r\n req.promise.then(function (res) {\r\n \r\n $(\".offer\").parent().show();\r\n if (res.data.Status !== 200) {\r\n vm.noOffer = true;\r\n return;\r\n }\r\n vm.noOffer = false;\r\n\r\n vm.data = res.data.Data;\r\n recalculteDistance();\r\n\r\n $timeout(function () {\r\n if ($(\".royalSlider img\").size() > 0) {\r\n $(\".royalSlider\")\r\n .royalSlider({\r\n keyboardNavEnabled: true,\r\n arrowsNav: false,\r\n controlNavigation: 'bullets',\r\n autoHeight: true,\r\n imageScaleMode: 'fill',\r\n transitionType: 'fade',\r\n autoPlay: {\r\n enabled: true,\r\n pauseOnHover: true,\r\n delay: 5000\r\n }\r\n });\r\n }\r\n var slider = $('.royalSlider'),\r\n nav = slider.find('.rsNav');\r\n if (slider.data('royalSlider') != null && slider.data('royalSlider').numSlides <= 1) {\r\n nav.hide();\r\n }\r\n });\r\n });\r\n }\r\n\r\n function loadCurrentUserLocation() {\r\n GetCurrentUserLocation(function (loc) {\r\n if (loc != null) {\r\n var sp = loc.split(',');\r\n vm.UserCurrentLocation = {\r\n Latitude: parseFloat(sp[0]),\r\n Longitude: parseFloat(sp[1])\r\n };\r\n loadOffer();\r\n }\r\n });\r\n }\r\n\r\n function init() {\r\n loadCurrentUserLocation();\r\n //wait if we can got user current location\r\n $timeout(function () {\r\n if (vm.UserCurrentLocation == null) {\r\n loadOffer();\r\n }\r\n }, 200);\r\n\r\n $window.onfocus = function() {\r\n $timeout(function() {\r\n if (vm.UserCurrentLocation == null) {\r\n loadCurrentUserLocation();\r\n }\r\n\r\n }, 200);\r\n };\r\n }\r\n\r\n function displayOfferBox() {\r\n return $(\".location--lead\").text().trim() !== \"\";\r\n }\r\n\r\n function displayOtherLocations() {\r\n if (vm.data == null) {\r\n return false;\r\n }\r\n var hasMore = vm.data.Merchant.Locations.length > 1;\r\n var hasAnyAddress = false;\r\n vm.data.Merchant.Locations.forEach(function(l, i) {\r\n if (l.DisplayType !== 'None' && i > 0) {\r\n hasAnyAddress = true;\r\n }\r\n });\r\n return hasMore && hasAnyAddress;\r\n }\r\n\r\n function isMobile() {\r\n return $(\".navbar-header .navbar-toggle\").is(\":visible\");\r\n }\r\n\r\n function addToFavourites() {\r\n dataService.addToFavourites(vm.data.Merchant.ID).then(function (res) {\r\n vm.data.IsMyFavourite = true;\r\n });\r\n }\r\n\r\n function removeFromFavourites() {\r\n dataService.removeFromFavourites(vm.data.Merchant.ID).then(function (res) {\r\n vm.data.IsMyFavourite = false;\r\n });\r\n }\r\n };\r\n})();\r\n\r\n","//TODO: use proper css class names instead of #IDs\r\n\r\n\r\nfunction initRedemption(memberNo, offerID) {\r\n $.ajax({\r\n url: \"/api/redemption/\" + offerID + \"/add\"\r\n }).done(function (res) {\r\n if (res.Status === 200) { \r\n addRedemptionIntoLocalStorage(memberNo, offerID, function (success) {\r\n if (success) {\r\n window.location = \"/offer/redemption/\" + offerID;\r\n } else {\r\n $(\".redeem\").hide();\r\n }\r\n });\r\n }\r\n }).fail(function (jqXHR) {\r\n if (jqXHR.status === 401) {\r\n var loginPath = $(\"body\").data(\"login-path\");\r\n window.location = loginPath + '?returnUrl=' + encodeURIComponent(window.location.pathname);\r\n }\r\n });\r\n}\r\n\r\nfunction getCurrentLocalStorage(memberNo) {\r\n var st = localStorage[\"fvredeem\" + memberNo];\r\n\r\n var storage = st != null ? JSON.parse(st) : [];\r\n if (storage == null) {\r\n storage = [];\r\n }\r\n return storage;\r\n}\r\n\r\nfunction addRedemptionIntoLocalStorage(memberNo, offerID, onAfterAdded) {\r\n var storage = getCurrentLocalStorage(memberNo);\r\n\r\n var today = new Date();\r\n var tomorrow = new Date();\r\n tomorrow.setDate(today.getDate() + 1);\r\n\r\n var exists = false;\r\n for (var i in storage) {\r\n if (storage[i].ID === offerID.toString()) {\r\n var now = new Date();\r\n var storedDate = new Date(storage[i].ValidTo);\r\n if (storedDate > now) {\r\n if (storage[i].Redeemed) {\r\n alert(\"Offer was already redeemed\");\r\n onAfterAdded(false);\r\n } else {\r\n onAfterAdded(true);\r\n }\r\n return false;\r\n } else {\r\n storage[i].ValidTo = tomorrow;\r\n storage[i].Redeemed = false;\r\n }\r\n exists = true;\r\n }\r\n }\r\n if (!exists) {\r\n var item = {};\r\n item.ValidTo = tomorrow;\r\n item.ID = offerID;\r\n item.Redeemed = false;\r\n storage.push(item);\r\n }\r\n var stobj = JSON.stringify(storage);\r\n localStorage[\"fvredeem\" + memberNo] = stobj;\r\n onAfterAdded(true);\r\n}\r\n\r\nfunction confirmRedemption(memberNo, offerID, tomorrow) {\r\n confirmRedemptionLocaly(memberNo, offerID, true, tomorrow);\r\n confirmRedemptionRemotelly(memberNo, offerID);\r\n disableRedemption();\r\n}\r\n\r\nfunction confirmRedemptionRemotelly(memberNo, offerID) {\r\n $.get('/api/redemption/' + offerID + '/redeem',\r\n function(data) {\r\n $(\"#uiBtnBackPnl\").show(); \r\n if (data.Status === 200) {\r\n var newArray = [];\r\n var getstorage = JSON.parse(localStorage[\"fvredeem\" + memberNo]);\r\n for (var y in getstorage) {\r\n if (getstorage[y].ID !== offerID.toString()) {\r\n newArray.push(getstorage[y]);\r\n }\r\n }\r\n var getStNew = JSON.stringify(newArray);\r\n localStorage[\"fvredeem\" + memberNo] = getStNew;\r\n }\r\n });\r\n}\r\n\r\nfunction confirmRedemptionLocaly(memberNo, offerID, redeem, tomorrow) {\r\n var storage = getCurrentLocalStorage(memberNo);\r\n\r\n var found = false;\r\n for (var i in storage) {\r\n if (storage[i].ID === offerID.toString()) {\r\n found = true;\r\n if (redeem) {\r\n storage[i].Redeemed = true;\r\n } else {\r\n var now = new Date();\r\n var storedDate = new Date(storage[i].ValidTo);\r\n if (storedDate > now && storage[i].Redeemed) {\r\n disableRedemption();\r\n alert(\"Offer was already redeemed\");\r\n } else {\r\n startCountDown(storage[i].ValidTo);\r\n }\r\n }\r\n }\r\n }\r\n if (!found && !redeem) { \r\n startCountDown(tomorrow);\r\n }\r\n if (found && redeem) {\r\n var stobj = JSON.stringify(storage);\r\n localStorage[\"fvredeem\" + memberNo] = stobj;\r\n }\r\n}\r\n\r\nfunction startCountDown(untilDate) {\r\n tomorrowCount = new Date(untilDate);\r\n timedCount();\r\n}\r\n\r\nvar tomorrowCount = new Date();\r\nvar timer;\r\nfunction timedCount() {\r\n var second = 1000;\r\n var minute = second * 60;\r\n var hour = minute * 60;\r\n var day = hour * 24;\r\n var todayCount = new Date();\r\n var distance = tomorrowCount.getTime() - todayCount.getTime();\r\n if (distance < 0) {\r\n clearInterval(timer);\r\n $(\".RedeemBtn\").remove();\r\n\r\n disableRedemption();\r\n alert(\"Time to redeem this offer expired.\");\r\n return;\r\n }\r\n var hours = Math.floor((distance % day) / hour);\r\n var minutes = Math.floor((distance % hour) / minute);\r\n var seconds = Math.floor((distance % minute) / second);\r\n\r\n var res = \" \" + hours + \"h \" + minutes + \"m and \" + seconds + \"s\";\r\n $(\"#uiValidUntil\").text(res);\r\n timer = setTimeout(\"timedCount()\", 1000);\r\n}\r\n\r\nfunction disableRedemption() {\r\n $(\"#uiVoucherText\").hide();\r\n $(\"#uiThanksInfo\").show();\r\n $(\"#uiLblSerialNumber\").show();\r\n $(\"#uiBtnRedeem\").hide();\r\n $(\"#uiBtnCancel\").hide();\r\n $(\"#uiBtnDisclaimer\").hide();\r\n $(\"#uiValidInfo\").hide();\r\n}\r\n\r\nfunction cancelRedeem(memberNo, offerID) {\r\n clearInterval(timer);\r\n localStorage.removeItem(\"fvredeem\" + memberNo);\r\n $.get('/api/redemption/' + offerID + '/cancel',\r\n function (data) {\r\n $(\"#uiBtnBackPnl\").show(); \r\n if (data.Status === 200) {\r\n //we don't need to do anything with the result\r\n }\r\n\r\n var searchUrl = localStorage.fvsearchurl;\r\n if (searchUrl == null) {\r\n searchUrl = \"/search\";\r\n } else {\r\n searchUrl = unescape(searchUrl);\r\n }\r\n window.location = searchUrl;\r\n }, function () {\r\n var searchUrl = localStorage.fvsearchurl;\r\n if (searchUrl == null) {\r\n searchUrl = \"/search\";\r\n } else {\r\n searchUrl = unescape(searchUrl);\r\n }\r\n window.location = searchUrl;\r\n });\r\n}\r\n\r\nfunction goBack() {\r\n var searchUrl = localStorage.fvsearchurl;\r\n if (searchUrl == null) {\r\n searchUrl = \"/search\";\r\n } else {\r\n searchUrl = unescape(searchUrl);\r\n }\r\n window.location = searchUrl;\r\n return false;\r\n}","'use strict';\r\nvar slideOpts = (200, \"swing\");\r\n\r\nvar app = angular.module(\"app\", ['ngMap']);\r\n\r\napp.config(function ($locationProvider, $httpProvider) {\r\n $locationProvider.html5Mode({\r\n enabled: true,\r\n requireBase: true\r\n }); \r\n});\r\n\r\n\r\n(function () {\r\n 'use strict';\r\n\r\n app.service(\"dataService\", dataService);\r\n dataService.$inject = ['$http', '$q'];\r\n\r\n app.service(\"mapService\", mapService);\r\n function mapService() {\r\n\r\n this.options =\r\n [{ \"featureType\": \"all\", \"elementType\": \"geometry\", \"stylers\": [{ \"visibility\": \"on\" }] }, { \"featureType\": \"all\", \"elementType\": \"geometry.stroke\", \"stylers\": [{ \"visibility\": \"off\" }] }, { \"featureType\": \"administrative\", \"elementType\": \"labels.text.fill\", \"stylers\": [{ \"color\": \"#393a3b\" }] }, { \"featureType\": \"administrative.country\", \"elementType\": \"labels\", \"stylers\": [{ \"visibility\": \"off\" }] }, { \"featureType\": \"administrative.province\", \"elementType\": \"labels\", \"stylers\": [{ \"visibility\": \"on\" }] }, { \"featureType\": \"administrative.locality\", \"elementType\": \"labels\", \"stylers\": [{ \"visibility\": \"on\" }] }, { \"featureType\": \"landscape\", \"elementType\": \"all\", \"stylers\": [{ \"color\": \"#fbfbfb\" }] }, { \"featureType\": \"poi\", \"elementType\": \"all\", \"stylers\": [{ \"visibility\": \"off\" }] }, { \"featureType\": \"road\", \"elementType\": \"all\", \"stylers\": [{ \"saturation\": -100 }, { \"lightness\": 45 }] }, { \"featureType\": \"road.highway\", \"elementType\": \"all\", \"stylers\": [{ \"visibility\": \"simplified\" }] }, { \"featureType\": \"road.arterial\", \"elementType\": \"labels.icon\", \"stylers\": [{ \"visibility\": \"off\" }] }, { \"featureType\": \"transit\", \"elementType\": \"all\", \"stylers\": [{ \"visibility\": \"off\" }] }, { \"featureType\": \"water\", \"elementType\": \"all\", \"stylers\": [{ \"color\": \"#def0f7\" }, { \"visibility\": \"on\" }] }];\r\n\r\n this.initMap = function (vm) {\r\n vm.map.setOptions({ minZoom: 4, zoomControl: false, gestureHandling: 'greedy' });\r\n vm.map.mapTypes.set('map_style', new google.maps.StyledMapType(this.options));\r\n vm.map.setMapTypeId('map_style');\r\n\r\n google.maps.event.addDomListener($(\".zoom-in\")[0], 'click', function () {\r\n vm.refresh = true;\r\n vm.map.setZoom(vm.map.getZoom() + 1);\r\n });\r\n google.maps.event.addDomListener($(\".zoom-out\")[0], 'click', function () {\r\n vm.refresh = true;\r\n vm.map.setZoom(vm.map.getZoom() - 1);\r\n });\r\n\r\n vm.map.controls[google.maps.ControlPosition.TOP_LEFT].push($(\".map-zoom-icons\")[0]);\r\n $(\".map-zoom-icons\").show();\r\n\r\n vm.map.controls[google.maps.ControlPosition.TOP_RIGHT].push($(\".map-reload-icons\")[0]);\r\n $(\".map-reload-icons\").show();\r\n if ($(window).width() > 767) {\r\n $(\".map-reload-button\").hide();\r\n } else {\r\n $(\".map-reload-checkbox\").hide();\r\n $(\".map-reload-button\").hide();\r\n }\r\n\r\n google.maps.event.addDomListener($(\".map-reload-button\")[0], 'click', function () {\r\n vm.refresh = true;\r\n vm.searchThisArea();\r\n });\r\n };\r\n }\r\n\r\n app.filter(\"trust\", ['$sce', function ($sce) {\r\n return function (htmlCode) {\r\n return $sce.trustAsHtml(htmlCode);\r\n }\r\n }]);\r\n\r\n})();\r\n\r\n\r\n(function () {\r\n 'use strict'; \r\n app.directive(\"select\", select);\r\n\r\n function select() {\r\n return {\r\n restrict: 'E',\r\n link: link\r\n };\r\n\r\n function link($scope, elm, attrs) {\r\n $(elm).selectpicker({dropupAuto: false});\r\n }\r\n }\r\n\r\n app.directive(\"mapSideBar\", mapSideBar);\r\n\r\n function mapSideBar() {\r\n return {\r\n restrict: 'C',\r\n link: link\r\n };\r\n\r\n function link($scope, elm, attrs) {\r\n var windowW = window.innerWidth;\r\n $('.items-map-sidebar-listing').on('click', '.sidebar-list-item-dropdown', function (e) {\r\n var $this = $(this);\r\n \r\n if (windowW > 767) {\r\n\r\n e.preventDefault();\r\n var itemDiv = $this.parent();\r\n\r\n var isCurrentItemHidden = $this.next('.sidebar-list-item-dropdown-content').is(':hidden');\r\n \r\n var onSlideUp = function (timeout) {\r\n // open the clicked content\r\n $(\" .sidebar-list-item-dropdown-content\", itemDiv).toggleClass(\"open\");\r\n\r\n $(itemDiv).addClass('active') //highlight the current item\r\n .parent().addClass('open'); //\r\n\r\n setTimeout(function () {\r\n // Slide down the clicked content \r\n $(\" .sidebar-list-item-dropdown-content\", itemDiv).slideDown(slideOpts);\r\n }, timeout);\r\n };\r\n \r\n // Slide up all the content \r\n var $visibleContents = $(\".sidebar-list-item-dropdown-content:visible\", $('.sidebar-list-item').not(itemDiv));\r\n if ($visibleContents.length > 0) { \r\n $visibleContents.slideUp(slideOpts, function() {\r\n if (isCurrentItemHidden) {\r\n onSlideUp(400);\r\n }\r\n }); \r\n }\r\n else if (isCurrentItemHidden) {\r\n onSlideUp(0);\r\n }\r\n }\r\n });\r\n\r\n if (windowW > 991) {\r\n\r\n var createScrollBar = function (elm) {\r\n\r\n var getNetPropertySidebarHeight = function () { \r\n return $(\"ng-map\").height() - $(\".properties-map-sidebar-header\").height(); \r\n };\r\n\r\n $(elm)\r\n .slimScroll({\r\n width: '100%',\r\n height: getNetPropertySidebarHeight(),\r\n position: 'right',\r\n alwaysVisible: true,\r\n distance: 0,\r\n start: 'top',\r\n railVisible: true,\r\n allowPageScroll: false,\r\n disableFadeOut: false\r\n });\r\n\r\n var resizeElementAndSlimScrollHeight = function () { \r\n var mapContainerHeight = getNetPropertySidebarHeight();\r\n var $elm = $(elm);\r\n $elm.add($elm.closest('.slimScrollDiv')).height(mapContainerHeight);\r\n };\r\n\r\n $(window).on('resize', resizeElementAndSlimScrollHeight);\r\n $('.properties-map-search-filters').on('toggle', resizeElementAndSlimScrollHeight);\r\n };\r\n\r\n if ($('.map-side-bar').length > 0) {\r\n $.ajax({\r\n url: \"/WWW_shared/Assets/js/jquery.slimscroll.min.js\",\r\n dataType: 'script',\r\n success: function success() {\r\n createScrollBar(elm);\r\n }\r\n });\r\n }\r\n \r\n $scope.$watchCollection(\r\n \"vm.data\",\r\n function (newValue, oldValue) {\r\n if ($(elm).slimScroll != null) {\r\n $(elm).slimScroll({ destroy: true });\r\n createScrollBar(elm);\r\n }\r\n }\r\n );\r\n }\r\n\r\n }\r\n }\r\n\r\n app.directive(\"typeahead\", typeahead);\r\n typeahead.$inject = ['dataService', '$location', '$timeout'];\r\n\r\n function typeahead(dataService, $location, $timeout) {\r\n return {\r\n restrict: 'A',\r\n link: link\r\n };\r\n\r\n function link($scope, elm, attrs) {\r\n\r\n $(elm).typeahead({\r\n minLength: 3,\r\n highlight: true\r\n },\r\n {\r\n displayKey: 'Name',\r\n limit: 50,\r\n source: function(query, syncResults, asyncResults) {\r\n var req = dataService.suggest(query, $scope.vm.filter.categories || \"\");\r\n handlePendingRequests($scope.vm, \"suggest\", req);\r\n\r\n req.promise.then(function(res) { \r\n asyncResults(res.data.Data);\r\n }); \r\n },\r\n templates: {\r\n suggestion: function (data) {\r\n return '

' + data.Name + '

';\r\n }\r\n }\r\n });\r\n $(elm).bind('typeahead:select', function (ev, item) {\r\n $scope.vm.searchSelectedItem = item;\r\n if (item.Type === \"Merchant\") {\r\n $scope.vm.filter.categories = \"\";\r\n $scope.vm.filter.merchantID = item.ID;\r\n $scope.vm.filter.suburb = null; \r\n $scope.vm.filter.cuisineID = null;\r\n } \r\n if (item.Type === \"Suburb\") {\r\n $scope.vm.filter.suburb = item.ID;\r\n $scope.vm.filter.merchantID = null; \r\n $scope.vm.filter.cuisineID = null;\r\n }\r\n if (item.Type === \"Category\") {\r\n $scope.vm.filter.categories = \"\" + item.ID;\r\n $scope.vm.filter.suburb = null;\r\n $scope.vm.filter.merchantID = null;\r\n $scope.vm.filter.cuisineID = null;\r\n $scope.vm.filter.searchTerm = null;\r\n }\r\n if (item.Type === \"Cuisine\") {\r\n $scope.vm.filter.categories = \"\";\r\n $scope.vm.filter.cuisineID = item.ID;\r\n $scope.vm.filter.suburb = null;\r\n $scope.vm.filter.merchantID = null;\r\n }\r\n $location.search($scope.vm.filter);\r\n $scope.vm.setCategoriesFromUrl();\r\n $scope.vm.search(false);\r\n });\r\n $(elm).bind('typeahead:change', function (ev, item) {\r\n if ($scope.vm.searchSelectedItem == null || $scope.vm.searchSelectedItem.Name !== item) {\r\n $scope.vm.filter.merchantID = null; \r\n $scope.vm.filter.suburb = null;\r\n $scope.vm.filter.cuisineID = null;\r\n $(elm).typeahead('val', \"\");\r\n $scope.vm.filter.searchTerm = \"\";\r\n $scope.vm.searchSelectedItem = null;\r\n $timeout(function () {\r\n $scope.vm.setBounds();\r\n $location.search($scope.vm.filter);\r\n });\r\n }\r\n });\r\n }\r\n } \r\n\r\n})();\r\n\r\n\r\n(function () {\r\n 'use strict';\r\n\r\n app.controller(\"searchCtrl\", searchCtrl);\r\n\r\n searchCtrl.$inject = ['dataService', 'NgMap', '$location', '$timeout', '$sce', '$compile', '$scope', '$filter', 'mapService'];\r\n function searchCtrl(dataService, NgMap, $location, $timeout, $sce, $compile, $scope, $filter, mapService) {\r\n var vm = this;\r\n vm.showloading = true;\r\n vm.data = [];\r\n vm.map = null;\r\n vm.filter = $location.search();\r\n vm.filterData = {\r\n categories: [],\r\n countries: [],\r\n areas: [],\r\n offerTypeCategory: []\r\n };\r\n vm.search = search;\r\n vm.searchFilter = searchFilter;\r\n vm.markers = []; \r\n vm.markerClusterer = null;\r\n vm.infoWindows = [];\r\n vm.showDetail = showDetail;\r\n vm.selectPin = selectPin; \r\n vm.togglesearch = togglesearch;\r\n vm.togglesort = togglesort;\r\n vm.locationTextChanged = locationTextChanged; \r\n vm.noData = false; \r\n vm.closeInfo = closeInfo;\r\n vm.searchNearMe = searchNearMe;\r\n vm.nearMeLocation = null;\r\n vm.searchRegion = searchRegion;\r\n vm.countryChanged = countryChanged;\r\n vm.handlePendingRequests = handlePendingRequests;\r\n vm.filterBySuggestion = filterBySuggestion;\r\n vm.addToFavourites = addToFavourites;\r\n vm.removeFromFavourites = removeFromFavourites;\r\n vm.showItemOnRight = showItemOnRight;\r\n vm.setBounds = setBounds;\r\n vm.selectallcategory = selectallcategory;\r\n vm.setAllCategory = setAllCategory;\r\n vm.selectalloffers = selectalloffers;\r\n vm.setAllOffers = setAllOffers;\r\n vm.fixPageHeight = fixPageHeight;\r\n vm.isInit = false;\r\n vm.mapVisibleArea = null;\r\n vm.switchView = switchView;\r\n vm.searchOrder = searchOrder;\r\n vm.modalItem = {};\r\n vm.setCategoriesFromUrl = setCategoriesFromUrl;\r\n vm.setOfferTypesFromUrl = setOfferTypesFromUrl;\r\n vm.setDefaultLocation = setDefaultLocation;\r\n vm.toggleOtherLocations = toggleOtherLocations;\r\n vm.displayOtherLocations = displayOtherLocations;\r\n vm.quickSearch = quickSearch;\r\n vm.getOfferLink = getOfferLink;\r\n vm.rememberInfo = rememberInfo;\r\n vm.isFitBouds = false;\r\n vm.zoomchanged = zoomchanged;\r\n vm.goToOffer = goToOffer;\r\n vm.searchThisArea = searchThisArea;\r\n vm.searchOnMapMove = true;\r\n\r\n init();\r\n\r\n navigator.geolocation.getCurrentPosition(function(position) {\r\n vm.GetCurrentUserLocation = position.coords;\r\n window.current_location = position.coords.latitude + ',' + position.coords.longitude;\r\n\r\n setDistances();\r\n if (vm.map != null && $.isEmptyObject(vm.filter)) {\r\n vm.filter.searchTerm = \"\";\r\n setBounds();\r\n vm.map.setZoom(12);\r\n vm.map.panTo(new google.maps.LatLng(vm.GetCurrentUserLocation.latitude, vm.GetCurrentUserLocation.longitude)); \r\n search(false);\r\n } \r\n });\r\n\r\n function setDistances() {\r\n if (vm.data != null) {\r\n vm.data.forEach(function(item) {\r\n setDistance(item.Locations);\r\n });\r\n }\r\n if (vm.listData != null) {\r\n vm.listData.forEach(function(item) {\r\n setDistance(item.Locations);\r\n });\r\n }\r\n if (vm.modalItem != null && vm.modalItem.Location != null) {\r\n setDistance([vm.modalItem.Location]);\r\n }\r\n }\r\n\r\n function setDistance(data) {\r\n if (vm.GetCurrentUserLocation != null) {\r\n $timeout(function() {\r\n\r\n if (data != null) {\r\n data.forEach(function(item) { \r\n if (item.Distance <= 0) {\r\n var d =\r\n getDistanceFromLatLonInKm(vm.GetCurrentUserLocation.latitude,\r\n vm.GetCurrentUserLocation.longitude,\r\n item.Lat,\r\n item.Lng);\r\n item.Distance = d.toFixed(0);\r\n }\r\n vm.markers.forEach(function(m) {\r\n if (m.item.ID === item.ID) {\r\n if (item.Distance != null) {\r\n if ((typeof item\r\n .Distance ===\r\n 'string' ||\r\n item.Distance instanceof String)) {\r\n item.Distance = parseFloat(item.Distance);\r\n }\r\n }\r\n if (m.infowindow != null) {\r\n var info = $(m.infowindow.content_).find(\".map-info-distance\");\r\n info.show();\r\n if (item.Distance != null) {\r\n info.text(item.Distance.toFixed(0).toString() + \"kms away\");\r\n }\r\n }\r\n }\r\n });\r\n }); \r\n }\r\n\r\n });\r\n }\r\n }\r\n\r\n function filterBySuggestion(e) { \r\n if (e.keyCode === 13) {\r\n e.preventDefault();\r\n if (vm.filter.searchTerm === \"\") {\r\n vm.filter.suburb = null;\r\n vm.filter.merchantID = null;\r\n vm.filter.cuisineID = null;\r\n $location.search(vm.filter);\r\n }\r\n search(false);\r\n } \r\n }\r\n\r\n function countryChanged() {\r\n var country = vm.filter.country = vm.country;\r\n if (country != null && country !== '') {\r\n dataService.getAreas(country).then(function(res) {\r\n vm.filterData.areas = res.data.Data;\r\n $timeout(function() {\r\n $(\"select\").selectpicker('refresh');\r\n });\r\n });\r\n } else {\r\n vm.filterData.areas = [];\r\n $timeout(function () {\r\n $(\"select\").selectpicker('refresh');\r\n });\r\n }\r\n }\r\n\r\n function searchNearMe() {\r\n vm.filterData.searchRegion = false;\r\n if (navigator.geolocation) {\r\n navigator.geolocation.getCurrentPosition(function (position) { \r\n vm.nearMeLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);\r\n vm.GetCurrentUserLocation = position.coords;\r\n window.current_location = position.coords.latitude + ',' + position.coords.longitude;\r\n }, function(err) {\r\n alert(\"Location service is disabled.\");\r\n }, { enableHighAccuracy: true, maximumAge: 10000 });\r\n }\r\n }\r\n\r\n function searchRegion() {\r\n vm.filterData.searchRegion = true;\r\n vm.nearMeLocation = null;\r\n }\r\n\r\n \r\n function createCustomMarker(item) {\r\n var latLng = new google.maps.LatLng(item.Lat, item.Lng);\r\n var bounds = new google.maps.LatLngBounds(latLng, latLng);\r\n\r\n var baseImg = '/www_fv/assets/icons/map/map_pin.png';\r\n if (vm.customPin != null && vm.customPin !== \"\") {\r\n baseImg = vm.customPin;\r\n }\r\n\r\n return new CustomMapPin(bounds, baseImg, item, vm.map);\r\n }\r\n\r\n function offsetCenter(latlng, offsety) {\r\n\r\n // latlng is the apparent centre-point\r\n // offsetx is the distance you want that point to move to the right, in pixels\r\n // offsety is the distance you want that point to move upwards, in pixels\r\n // offset can be negative\r\n // offsetx and offsety are both optional\r\n\r\n var scale = Math.pow(2, vm.map.getZoom());\r\n\r\n var worldCoordinateCenter = vm.map.getProjection().fromLatLngToPoint(latlng);\r\n var pixelOffset = new google.maps.Point(0, (offsety / scale) || 0);\r\n\r\n var worldCoordinateNewCenter = new google.maps.Point(\r\n worldCoordinateCenter.x - pixelOffset.x,\r\n worldCoordinateCenter.y + pixelOffset.y\r\n );\r\n\r\n var newCenter = vm.map.getProjection().fromPointToLatLng(worldCoordinateNewCenter);\r\n\r\n vm.map.setCenter(newCenter);\r\n\r\n }\r\n \r\n //function createMarkerWithIcon(marker, categoryIcon) { \r\n\r\n // var canvasMain = document.createElement(\"canvas\");\r\n // canvasMain.width = 50 * 1.2;\r\n // canvasMain.height = 83 * 1.2;\r\n // var context = canvasMain.getContext(\"2d\");\r\n\r\n // var canvasImg = document.createElement(\"canvas\"); \r\n // var contextImg = canvasImg.getContext(\"2d\");\r\n\r\n // var baseImg = new Image(); \r\n // baseImg.onload = function () {\r\n\r\n // var iconImg = new Image(); \r\n // iconImg.onload = function () {\r\n // context.drawImage(baseImg, 0, 0, canvasMain.width, canvasMain.height);\r\n\r\n // canvasImg.width = iconImg.width;\r\n // canvasImg.height = iconImg.height;\r\n // contextImg.drawImage(iconImg, 0, 0); \r\n // //resize\r\n // resampleImg(canvasImg, 40, 40, true);\r\n \r\n // context.drawImage(canvasImg, 10, 25);\r\n // marker.setIcon(canvasMain.toDataURL());\r\n // marker.setVisible(true);\r\n // }\r\n // iconImg.src = categoryIcon;\r\n // }\r\n \r\n // if (vm.customPin != null && vm.customPin !== \"\") {\r\n // baseImg.src = vm.customPin;\r\n // } else {\r\n // baseImg.src = '/www_fv/assets/icons/map/map_pin.png';\r\n // }\r\n //}\r\n\r\n function addPins(data) {\r\n \r\n if (data == null || data.length === 0) {\r\n return;\r\n }\r\n\r\n var hasCoodrinates = false;\r\n var bounds = new google.maps.LatLngBounds();\r\n \r\n data.forEach(function (merchant) {\r\n\r\n var item = merchant.Location;\r\n item.Offers = merchant.Offers;\r\n if (item.Lat != null && item.Lng != null) {\r\n hasCoodrinates = true;\r\n } else {\r\n return;\r\n }\r\n\r\n var latLng = new google.maps.LatLng(item.Lat, item.Lng);\r\n\r\n item.iconUrl = null;\r\n vm.filterData.icons.forEach(function (bc) {\r\n if (bc.ID === merchant.BCID && bc.Icon != null) {\r\n item.iconUrl = bc.Icon;\r\n }\r\n });\r\n \r\n var marker = $.grep(vm.markers, function (m) {\r\n return m.item.ID === item.ID;\r\n })[0];\r\n\r\n if (marker != null) {\r\n marker.item = item;\r\n bounds.extend(marker.getPosition());\r\n } else {\r\n var pin = '/www_fv/assets/icons/map/map_pin.png'\r\n if (vm.customPin != null && vm.customPin !== \"\") {\r\n pin = vm.customPin;\r\n }\r\n\r\n marker = new google.maps.Marker({\r\n position: latLng,\r\n item: item,\r\n map: vm.map,\r\n icon: {\r\n url: pin,\r\n anchor: new google.maps.Point(25, 80),\r\n },\r\n optimized: false\r\n });\r\n marker.overlay = createCustomMarker(item); \r\n\r\n // marker.setVisible(false);\r\n\r\n //if (item.iconUrl != null) {\r\n // createMarkerWithIcon(marker, item.iconUrl);\r\n // createCustomMarker(item);\r\n // merchant.iconUrl = item.iconUrl;\r\n //} else {\r\n // marker.setVisible(true);\r\n //}\r\n\r\n bounds.extend(marker.getPosition());\r\n\r\n if (item.Offers.length === 1) {\r\n\r\n var infoOptions = {\r\n pixelOffset: new google.maps.Size(-140, -170),\r\n infoBoxClearance: new google.maps.Size(1, 1),\r\n pane: \"floatPane\",\r\n closeBoxURL: \"\"\r\n };\r\n\r\n var template = $(\".map-info-bubble\").clone();\r\n template.find(\".close\").attr(\"ng-click\", \"vm.closeInfo(\" + item.ID + \")\");\r\n template.find(\".map-info-title\").text(merchant.MN);\r\n template.find(\".map-info-address\").text(item.Address);\r\n if (item.Distance > 0) {\r\n template.find(\".map-info-distance\").text(item.Distance + \"kms away\");\r\n } else {\r\n template.find(\".map-info-distance\").hide();\r\n }\r\n\r\n item.Offers.forEach(function(o) {\r\n var offerDiv = $(\"
\").addClass(\"item\");\r\n offerDiv.html('');\r\n template.find(\".royalSlider\").addClass(\"royalSlider\" + item.ID).append(offerDiv);\r\n });\r\n\r\n var boxText = document.createElement(\"div\");\r\n\r\n boxText.innerHTML = template.html();\r\n $compile(boxText)($scope);\r\n infoOptions.content = boxText;\r\n marker.infowindow = new InfoBox(infoOptions);\r\n vm.infoWindows.push(marker.infowindow);\r\n\r\n marker.addListener('click', function(e) {\r\n closeAllInfos(); \r\n offsetCenter(marker.getPosition(), -70);\r\n marker.infowindow.open(vm.map, marker);\r\n vm.showDetail(e, this.item);\r\n $timeout(function () { \r\n offsetCenter(marker.getPosition(), -70);\r\n }); \r\n });\r\n }\r\n if (item.Offers.length > 1) {\r\n marker.addListener('click', function(e) {\r\n closeAllInfos();\r\n if (e != null) {\r\n vm.modalItem = merchant; \r\n $(\".offers-modal\").modal();\r\n\r\n vm.showDetail(e, this.item);\r\n }\r\n });\r\n } \r\n vm.markers.push(marker);\r\n vm.oms.addMarker(marker);\r\n } \r\n });\r\n if (!hasCoodrinates) {\r\n return;\r\n }\r\n\r\n vm.refresh = false;\r\n if (vm.filter.area != null || vm.filter.suburb != null || vm.filter.merchantID != null || vm.filter.cuisineID != null) {\r\n vm.isFitBouds = true;\r\n vm.map.fitBounds(bounds);\r\n }\r\n vm.isFitBouds = false;\r\n\r\n if (vm.map.getZoom() < 20) {\r\n }\r\n\r\n if (data.length > 0) {\r\n if (vm.markerClusterer != null) {\r\n vm.markerClusterer.addMarkers(vm.markers);\r\n } else {\r\n vm.markerClusterer = new MarkerClusterer(vm.map, vm.markers, getClusterSettings());\r\n\r\n google.maps.event.addListener(vm.markerClusterer, \"clusterclick\", function (e) {\r\n if (vm.map.getZoom() >= 20) {\r\n\r\n var markers = e.getMarkers();\r\n vm.markerClusterer.removeMarkers(markers);\r\n vm.markerClusterer.setZoomOnClick(false);\r\n\r\n markers.forEach(function(m) {\r\n m.setMap(vm.map);\r\n });\r\n\r\n $timeout(function() {\r\n google.maps.event.trigger(markers[0], 'click');\r\n });\r\n } else {\r\n vm.markerClusterer.setZoomOnClick(true);\r\n }\r\n });\r\n }\r\n vm.markerClusterer.setMap(vm.map);\r\n }\r\n\r\n }\r\n\r\n function closeInfo(merchantID) {\r\n vm.markers.forEach(function (m) {\r\n if (m.item.ID == merchantID) {\r\n m.infowindow.close(vm.map, m);\r\n return;\r\n }\r\n });\r\n }\r\n\r\n function getClusterSettings() {\r\n return {\r\n //maxZoom: 19, TODO: there is issue when max zoom (20) and places are very close, but not same location\r\n styles: [\r\n {\r\n url: \"/www_fv/assets/icons/map/cluster-icon.png\", \r\n textColor: \"#fff\",\r\n textSize: 22,\r\n height: '53',\r\n width: '53',\r\n fontFamily: 'HelveticaNeueLTStd-BdCn',\r\n fontWeight: 'normal',\r\n lineHeight: '51px',\r\n anchorIcon: [17, 26]\r\n }]\r\n }\r\n }\r\n\r\n function clearClusters() {\r\n if (vm.oms.getMarkers().length > 0) {\r\n //vm.oms.clearMarkers();\r\n vm.oms.unspiderfy();\r\n }\r\n\r\n if (vm.markerClusterer != null) {\r\n vm.markerClusterer.clearMarkers();\r\n vm.markerClusterer.setMap(null);\r\n } \r\n\r\n var toRemove = [];\r\n vm.markers.forEach(function (m) { \r\n var show = $.grep(vm.data, function (item) {\r\n return m.item.ID === item.Location.ID;\r\n }).length > 0;\r\n if (!show) {\r\n m.setMap(null);\r\n if (m.infowindow != null) {\r\n m.infowindow.close();\r\n }\r\n toRemove.push(m);\r\n\r\n }\r\n \r\n });\r\n toRemove.forEach(function(m) {\r\n var i = vm.markers.indexOf(m);\r\n vm.markers.splice(i, 1);\r\n m.overlay.setMap(null);\r\n });\r\n }\r\n\r\n function setBounds() {\r\n var map = vm.map;\r\n vm.filter.centerLat = map.getCenter().lat();\r\n vm.filter.centerLng = map.getCenter().lng();\r\n vm.filter.zoom = map.getZoom();\r\n }\r\n\r\n \r\n function getSearchFilter() {\r\n var isMapVisible = $(\".search-map\").width() > 0;\r\n\r\n var categoriesIDs = [];\r\n if (vm.filter.categories != null && vm.filter.categories.length > 0) {\r\n categoriesIDs = vm.filter.categories.split(',');\r\n }\r\n\r\n var offerTypes = [];\r\n if (vm.filter.offerTypeCategory != null && vm.filter.offerTypeCategory.length > 0) {\r\n offerTypes = vm.filter.offerTypeCategory.split(',');\r\n }\r\n\r\n if (vm.map != null && (isMapVisible || vm.nearMeLocation != null)) {\r\n vm.nearMeLocation = null;\r\n vm.mapVisibleArea = {\r\n NorthEastLat: vm.map.getBounds().getNorthEast().lat(),\r\n NorthEastLng: vm.map.getBounds().getNorthEast().lng(),\r\n SouthWestLat: vm.map.getBounds().getSouthWest().lat(),\r\n SouthWestLng: vm.map.getBounds().getSouthWest().lng(),\r\n }\r\n }\r\n\r\n return {\r\n NorthEastLat: vm.mapVisibleArea != null ? vm.mapVisibleArea.NorthEastLat : null,\r\n NorthEastLng: vm.mapVisibleArea != null ? vm.mapVisibleArea.NorthEastLng : null,\r\n SouthWestLat: vm.mapVisibleArea != null ? vm.mapVisibleArea.SouthWestLat : null,\r\n SouthWestLng: vm.mapVisibleArea != null ? vm.mapVisibleArea.SouthWestLng : null,\r\n\r\n Area: vm.filter.area, \r\n MerchantID: vm.filter.merchantID,\r\n OfferTypeID: vm.filter.offerTypeID,\r\n Suburb: vm.filter.suburb,\r\n Cuisine: vm.filter.cuisineID,\r\n Categories: categoriesIDs,\r\n OfferTypes: offerTypes,\r\n Sort: vm.filter.sort,\r\n SearchTerm: vm.filter.searchTerm,\r\n Page: 1\r\n };\r\n }\r\n\r\n function quickSearch(categories) {\r\n vm.filter.categories = categories;\r\n if (vm.filter.cuisineID != null) {\r\n vm.filter.cuisineID = null;\r\n vm.filter.searchTerm = null;\r\n }\r\n $location.search(vm.filter);\r\n setCategoriesFromUrl();\r\n vm.filter.centerLat = null;\r\n vm.filter.centerLng = null;\r\n vm.filter.zoom = null;\r\n vm.filter.merchantID = null;\r\n vm.filter.searchTerm = null;\r\n clearEmtyValuesFromFilter();\r\n setDefaultLocation();\r\n vm.search(true);\r\n if ($(\".search-filter-panel\").is(\".slideIn\")) {\r\n togglesearch();\r\n }\r\n }\r\n \r\n function searchFilter() {\r\n if (vm.nearMeLocation != null) {\r\n vm.filter.area = null;\r\n vm.country = null;\r\n $timeout(function () {\r\n $(\"select\").selectpicker('refresh');\r\n });\r\n\r\n vm.map.panTo(vm.nearMeLocation); \r\n vm.refresh = false;\r\n vm.map.setZoom(12);\r\n }\r\n setUrlFromTopFilter();\r\n $location.search(vm.filter);\r\n setBounds();\r\n\r\n if ($(\".search-sort-panel\").is(\".slideIn\")) {\r\n togglesort();\r\n } else {\r\n togglesearch();\r\n } \r\n search(false);\r\n }\r\n\r\n function searchOrder() {\r\n var sort = vm.filter.sort;\r\n vm.listData.forEach(function (d) {\r\n d.Locations = $filter('orderBy')(d.Locations, 'Distance');\r\n if (d.Offer.PageNo == null || d.Offer.PageNo === \"\") {\r\n d.Offer.PageNo = \"XXX\";\r\n }\r\n if (d.Offer.DistanceSortOrder >= 0) {\r\n d.Offer.DistanceSortOrder = d.Locations[0].Distance;\r\n }\r\n if (d.Offer.DistanceSortOrder === -10) {\r\n d.nameSort = \"\";\r\n d.defaultSort = \"\";\r\n }\r\n else if (d.Offer.DistanceSortOrder === -1) {\r\n d.nameSort = d.MN;\r\n d.defaultSort = \"_\"; \r\n } else {\r\n d.nameSort = d.MN;\r\n d.defaultSort = \"_\" + d.MN;\r\n }\r\n d.DistanceSortOrder = d.Offer.DistanceSortOrder;\r\n });\r\n\r\n if (sort === \"\" || sort == null) {\r\n vm.listData = $filter('orderBy')(vm.listData, '[defaultSort,Offer.PageNo]');\r\n }\r\n if (sort === \"distance\") { \r\n vm.listData = $filter('orderBy')(vm.listData, 'DistanceSortOrder');\r\n }\r\n if (sort === \"name\") {\r\n vm.listData = $filter('orderBy')(vm.listData, 'nameSort');\r\n }\r\n if (sort === \"offertype\") {\r\n //if we want to sort like this. we need to rework front end nested repeaters.\r\n //vm.data = $filter('orderBy')(vm.data, '???');\r\n }\r\n if ($(\".search-sort-panel\").is(\".slideIn\")) {\r\n togglesort();\r\n } \r\n }\r\n\r\n function guid() {\r\n function s4() {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n }\r\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' +\r\n s4() + '-' + s4() + s4() + s4();\r\n }\r\n\r\n function searchThisArea() {\r\n vm.showloading = true;\r\n vm.noData = false;\r\n setBounds();\r\n vm.filter = vm.filter || {};\r\n vm.filter.suburb = null;\r\n vm.filter.searchTerm = null;\r\n var filter = getSearchFilter();\r\n\r\n callSearch(false, filter);\r\n }\r\n\r\n function search(isInit, callback) {\r\n vm.showloading = true; \r\n vm.noData = false;\r\n \r\n if (!isInit) {\r\n setBounds();\r\n }\r\n \r\n var filter = getSearchFilter();\r\n var reqid = guid();\r\n dataService.searchQueue.push({ g: reqid, f: filter }); \r\n\r\n $timeout(function() {\r\n var last = dataService.searchQueue[dataService.searchQueue.length - 1];\r\n if (last.g === reqid) {\r\n //call ajax\r\n callSearch(isInit, last.f, callback);\r\n } \r\n }, 1000); \r\n }\r\n\r\n function callSearch(isInit, filter, callback) {\r\n var req = dataService.searchOffers(filter);\r\n handlePendingRequests(vm, \"searchOffers\", req); \r\n\r\n req.promise.then(function (res) { \r\n\r\n if (res.data.Info.Infos.length > 0) {\r\n\r\n $(\".info-modal .modal-body\").text(res.data.Info.Infos[0].Message);\r\n $(\".info-modal\").modal();\r\n }\r\n \r\n vm.noData = res.data.Info.RecordsCount <= 0;\r\n vm.allHasLocation = true;\r\n res.data.Data.forEach(function (merchant) {\r\n merchant.Locations.forEach(function(item) {\r\n if (item.Lat == null || item.Lng == null) {\r\n vm.allHasLocation = false;\r\n }\r\n });\r\n });\r\n\r\n var listData = jQuery.extend(true, {}, res.data).Data;\r\n var mapData = jQuery.extend(true, {}, res.data).Data;\r\n\r\n var groupByOffer = [];\r\n listData.forEach(function (merchant) {\r\n merchant.Offers.forEach(function (offer) {\r\n var m = jQuery.extend(true, {}, merchant);\r\n m.Offer = offer; \r\n groupByOffer.push(m);\r\n });\r\n });\r\n\r\n var groupByLocations = [];\r\n mapData.forEach(function (merchant) {\r\n merchant.Locations.forEach(function (location) {\r\n var m = jQuery.extend(true, {}, merchant);\r\n m.Location = location;\r\n groupByLocations.push(m);\r\n });\r\n });\r\n\r\n vm.data = groupByLocations;\r\n vm.listData = groupByOffer;\r\n\r\n setDefaultSort();\r\n searchOrder(); \r\n\r\n $timeout(function () {\r\n if (isInit) {\r\n vm.isInit = false;\r\n }\r\n setDistances();\r\n\r\n $(\".map-reload-button\").hide();\r\n if ($(window).width() > 767) {\r\n $(\".map-reload-checkbox\").show();\r\n $(\".map-reload-icons\").show();\r\n } else {\r\n $(\".map-reload-icons\").hide(); \r\n }\r\n \r\n\r\n clearClusters(); \r\n addPins(vm.data);\r\n vm.fixPageHeight();\r\n\r\n if (callback != null) {\r\n callback();\r\n }\r\n vm.showloading = false;\r\n });\r\n });\r\n }\r\n\r\n function setDefaultSort() {\r\n if ($(\".properties-map-sidebar-refine-search .btn-marker\").is(\":visible\") && vm.filter.sort == null && vm.GetCurrentUserLocation != null) {\r\n vm.filter.sort = \"distance\";\r\n }\r\n else if (vm.filter.sort == null) {\r\n vm.filter.sort = \"\";\r\n }\r\n }\r\n\r\n\r\n function setUrlFromTopFilter() {\r\n \r\n var categories = $.grep(vm.filterData.categories, function (i) { return i.selected === true });\r\n var categoriesIDs = [];\r\n categories.forEach(function (cat) { categoriesIDs.push(cat.ID) });\r\n if (categoriesIDs.length === vm.filterData.categories.length) {\r\n vm.filter.categories = null;\r\n } else {\r\n vm.filter.categories = categoriesIDs.join();\r\n }\r\n\r\n\r\n var offerTypes = $.grep(vm.filterData.offerTypeCategory, function (i) { return i.selected === true });\r\n var offerTypesValues = [];\r\n offerTypes.forEach(function (cat) { offerTypesValues.push(cat.Value) });\r\n if (offerTypesValues.length === vm.filterData.offerTypeCategory.length) {\r\n vm.filter.offerTypeCategory = null;\r\n } else {\r\n vm.filter.offerTypeCategory = offerTypesValues.join();\r\n }\r\n\r\n if (vm.filter.searchTerm == null) {\r\n vm.filter.merchantID = null;\r\n vm.filter.suburb = null;\r\n vm.filter.cuisineID = null;\r\n vm.filter.searchTerm = null;\r\n }\r\n\r\n\r\n clearEmtyValuesFromFilter();\r\n }\r\n\r\n function clearEmtyValuesFromFilter() {\r\n for (var i in vm.filter) {\r\n if (vm.filter[i] === null || vm.filter[i] === undefined || vm.filter[i] == \"\") {\r\n if (i !== \"minspace\" && i !== \"minprice\") {\r\n delete vm.filter[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n function showSingleOfferDetail(item, offerID) {\r\n var itemDiv = $(\".sidebar-list-item-dropdown[data-offer-id=\" + offerID + \"][data-item-id=\" + item.ID + \"]\");\r\n if(itemDiv.size() === 0) {\r\n return;\r\n }\r\n $(\".sidebar-list-item-dropdown-content\", itemDiv.parent()).slideDown(slideOpts, function() {});\r\n }\r\n\r\n function showDetail(e, item) {\r\n $timeout(function() {\r\n vm.selectedID = item.ID; \r\n });\r\n offerRoyalSlider(item);\r\n var itemDiv = $(\".sidebar-list-item[data-item-id=\" + item.ID + \"]\");\r\n if (itemDiv.size() === 0) {\r\n return;\r\n }\r\n\r\n var slideItemToTop = function() {\r\n var parent = $(\".map-side-bar\").offset().top;\r\n var firstDff = $(\".map-side-bar div:first\").offset().top - parent;\r\n\r\n if ($(\".map-side-bar\").is(\":visible\") && $(\".map-side-bar\").slimScroll != null) {\r\n $(\".map-side-bar\").slimScroll({\r\n scrollTo: ($(itemDiv).offset().top - parent - firstDff) + 'px',\r\n animate: true\r\n });\r\n }\r\n }\r\n\r\n $(\".sidebar-list-item-dropdown-content\", $(\".sidebar-list-item\").not(itemDiv)).hide();\r\n $(\".sidebar-list-item-dropdown-content\", itemDiv).slideDown(slideOpts, function() {\r\n slideItemToTop();\r\n });\r\n\r\n slideItemToTop();\r\n }\r\n\r\n function offerRoyalSlider(item) {\r\n $timeout(function() {\r\n $(\".royalSlider\" + item.ID)\r\n .royalSlider({\r\n keyboardNavEnabled: false,\r\n controlNavigation: \"none\",\r\n sliderDrag: false,\r\n autoHeight: true,\r\n arrowsNav: false,\r\n autoPlay: {\r\n enabled: true,\r\n pauseOnHover: true,\r\n delay: 5000\r\n }\r\n });\r\n });\r\n }\r\n\r\n function closeAllInfos() {\r\n // Close all the info windows\r\n vm.infoWindows.forEach(function (info) {\r\n info.close();\r\n });\r\n }\r\n\r\n function getCurrentCluster(itemID) {\r\n var currentCluster = null;\r\n var clusters = vm.markerClusterer.getClusters();\r\n clusters.forEach(function (cl) {\r\n if (currentCluster == null) {\r\n var markers = cl.getMarkers();\r\n markers.forEach(function(m) {\r\n if (itemID === m.item.ID) {\r\n currentCluster = cl;\r\n }\r\n });\r\n }\r\n });\r\n return currentCluster;\r\n }\r\n \r\n function addIdleCallback(itemID) {\r\n vm.clusterzoom = true;\r\n google.maps.event.addListenerOnce(vm.map, 'idle', function () {\r\n var currentCluster = getCurrentCluster(itemID);\r\n if (currentCluster != null && currentCluster.getMarkers().length > 1 && vm.map.getZoom() < 20) {\r\n addIdleCallback(itemID);\r\n vm.isFitBouds = true;\r\n vm.map.fitBounds(currentCluster.getBounds());\r\n vm.isFitBouds = false;\r\n } else {\r\n if (currentCluster != null) {\r\n $timeout(function () {\r\n google.maps.event.clearListeners(vm.map, 'zoom_changed');\r\n $(currentCluster.clusterIcon_.div_).click();\r\n $timeout(function () {\r\n vm.map.addListener('zoom_changed', function () {\r\n vm.zoomchanged();\r\n }); \r\n }, 1000);\r\n });\r\n }\r\n google.maps.event.clearListeners(vm.map, 'idle');\r\n vm.clusterzoom = false;\r\n removeOtherItems(itemID);\r\n }\r\n });\r\n }\r\n\r\n function removeOtherItems(itemID) { \r\n vm.markers.forEach(function(m) {\r\n if (!vm.map.getBounds().contains(m.getPosition())) {\r\n var index = vm.data.indexOf($.grep(vm.data,\r\n function(item) { return m.item.ID === item.Location.ID; })[0]);\r\n vm.data.splice(index, 1);\r\n m.setMap(null);\r\n if (m.item.ID === itemID) {\r\n $timeout(function() {\r\n google.maps.event.trigger(m, 'click');\r\n });\r\n }\r\n }\r\n });\r\n $timeout(function() {\r\n vm.data = vm.data;\r\n vm.markers.forEach(function(m) {\r\n if (!vm.map.getBounds().contains(m.getPosition())) {\r\n m.setMap(null);\r\n } \r\n });\r\n });\r\n }\r\n\r\n function selectPin(merchant, location) {\r\n if (location == null) {\r\n return;\r\n }\r\n vm.selectedID = location.ID;\r\n\r\n if (!$(\"ng-map\").is(\":visible\") && merchant != null) {\r\n vm.switchView(true);\r\n }\r\n\r\n var marker = $.grep(vm.markers, function (m) {\r\n return m.item.ID === location.ID;\r\n })[0];\r\n \r\n closeAllInfos();\r\n\r\n if (marker == null) {\r\n return;\r\n }\r\n marker.setMap(vm.map);\r\n\r\n var currentCluster = null;\r\n if (vm.markerClusterer != null) {\r\n currentCluster = getCurrentCluster(location.ID);\r\n if (currentCluster != null && currentCluster.getMarkers().length > 1) {\r\n if (vm.map.getZoom() < 20) {\r\n addIdleCallback(location.ID);\r\n vm.isFitBoud = true;\r\n vm.map.fitBounds(currentCluster.getBounds());\r\n vm.isFitBoud = false;\r\n } else { \r\n $(currentCluster.clusterIcon_.div_).click(); \r\n }\r\n }\r\n }\r\n\r\n $timeout(function () {\r\n if (marker.infowindow != null) {\r\n google.maps.event.trigger(marker, 'click');\r\n } else {\r\n var latLng = marker.getPosition();\r\n vm.map.setCenter(latLng);\r\n }\r\n if (vm.map.getZoom() > 20) {\r\n google.maps.event.clearListeners(vm.map, 'zoom_changed');\r\n vm.map.setZoom(20);\r\n vm.map.addListener('zoom_changed', function () {\r\n vm.zoomchanged();\r\n }); \r\n }\r\n });\r\n\r\n if (marker.infowindow != null) {\r\n // Check if the clicked marker's info window is close or not\r\n var isInfoWindowOpen = marker.infowindow.getVisible();\r\n\r\n marker.infowindow.open(vm.map, marker);\r\n // if the info window is not already open\r\n if (!isInfoWindowOpen) {\r\n // open the info window \r\n offerRoyalSlider(location);\r\n\r\n // pan to the marker position\r\n vm.map.panTo(marker.getPosition());\r\n }\r\n }\r\n }\r\n\r\n function filterLocationEmpty() {\r\n var filterEmpty = $.isEmptyObject(vm.filter) ||\r\n (Object.keys(vm.filter).length === 1 && Object.keys(vm.filter)[0] === 'categories');\r\n return filterEmpty\r\n && (vm.filter.centerLat == null && vm.filter.centerLng == null)\r\n && vm.filter.area == null && vm.filter.suburb == null && vm.filter.merchantID == null;\r\n }\r\n\r\n function zoomchanged() {\r\n if ($(window).width() <= 767) {\r\n //mobile do not search on map interaction\r\n $(\".map-reload-icons\").show(); \r\n $(\".map-reload-button\").show();\r\n return;\r\n }\r\n\r\n if (!vm.searchOnMapMove) {\r\n $(\".map-reload-button\").show();\r\n $(\".map-reload-checkbox\").hide();\r\n return;\r\n }\r\n $(\".map-reload-button\").hide();\r\n $(\".map-reload-checkbox\").show();\r\n \r\n\r\n if (vm.isInit || vm.clusterzoom || vm.isFitBouds) {\r\n return;\r\n }\r\n\r\n if (vm.refresh && vm.filter.area == null && vm.filter.suburb == null && vm.filter.merchantID == null) {\r\n vm.search(false);\r\n }\r\n $timeout(function () {\r\n setBounds();\r\n $location.search(vm.filter);\r\n });\r\n\r\n if (vm.refresh) {\r\n vm.filter.area = null;\r\n vm.filter.suburb = null;\r\n vm.filter.searchTerm = null;\r\n $('select').selectpicker('refresh');\r\n }\r\n vm.refresh = true;\r\n }\r\n\r\n function init() {\r\n vm.country = vm.filter.country;\r\n\r\n $('.info-modal').on('show.bs.modal',\r\n function(e) {\r\n $(\".modal-backdrop\").hide();\r\n $timeout(function() {\r\n $(\".modal.in\").after($(\".modal-backdrop\"));\r\n },\r\n 200).then(function() {\r\n $(\".modal-backdrop\").show();\r\n });\r\n });\r\n \r\n NgMap.getMap().then(function (map) {\r\n vm.map = map; \r\n mapService.initMap(vm);\r\n vm.fixPageHeight(); \r\n\r\n vm.oms = new OverlappingMarkerSpiderfier(vm.map, { keepSpiderfied: true, nearbyDistance : 40, markersWontHide: true, circleSpiralSwitchover: Infinity }); \r\n vm.oms.addListener('unspiderfy', function (markers) {\r\n var addMarkers = [];\r\n var existingMarkers = vm.markerClusterer.getMarkers();\r\n\r\n var add = true;\r\n markers.forEach(function(m) {\r\n existingMarkers.forEach(function(exm) {\r\n if (exm.item.ID === m.item.ID) {\r\n add = false;\r\n }\r\n });\r\n if (add) {\r\n addMarkers.push(m);\r\n }\r\n });\r\n\r\n vm.markerClusterer.addMarkers(addMarkers);\r\n });\r\n \r\n \r\n dataService.loadFilters(vm.country || null).then(function (res) {\r\n vm.filterData = res.data.Data;\r\n\r\n vm.filterData.categories.forEach(function(c) {\r\n if (c.Icon.endsWith('svg')) {\r\n loadExternalSvg(c.ID + '__icon__svg', c.Icon); \r\n }\r\n });\r\n\r\n if (vm.filterData.countries != null && vm.filterData.countries.length === 1) {\r\n vm.country = vm.filterData.countries[0].ID; \r\n }\r\n\r\n vm.customPin = vm.filterData.defaultLocation.Pin;\r\n $timeout(function () {\r\n $(\"select\").selectpicker('refresh');\r\n });\r\n\r\n setCategoriesFromUrl();\r\n setOfferTypesFromUrl();\r\n\r\n vm.filterData.searchRegion = vm.filter.area != null;\r\n \r\n setUrlFromTopFilter();\r\n\r\n setDefaultLocation();\r\n\r\n if (vm.filter.view !== \"map\") {\r\n vm.switchView();\r\n }\r\n });\r\n\r\n\r\n map.addListener(\"click\", function (event) {\r\n closeAllInfos();\r\n });\r\n\r\n map.addListener(\"dragstart\", function (event) {\r\n closeAllInfos();\r\n });\r\n\r\n map.addListener('mousemove', function () { \r\n vm.refresh = true; \r\n });\r\n\r\n map.addListener('zoom_changed', function () {\r\n vm.zoomchanged();\r\n });\r\n\r\n map.addListener('dragend',\r\n function() {\r\n if ($(window).width() <= 767) {\r\n //mobile do not search on map interaction\r\n $(\".map-reload-icons\").show();\r\n $(\".map-reload-button\").show();\r\n return;\r\n }\r\n\r\n if (!vm.searchOnMapMove) {\r\n $(\".map-reload-button\").show();\r\n $(\".map-reload-checkbox\").hide();\r\n return;\r\n }\r\n $(\".map-reload-button\").hide();\r\n $(\".map-reload-checkbox\").show();\r\n \r\n vm.filter.area = null;\r\n vm.filter.searchTerm = null;\r\n vm.filter.suburb = null;\r\n $('select').selectpicker('refresh');\r\n\r\n if (vm.filter.merchantID == null) {\r\n vm.search(false);\r\n $timeout(function() {\r\n $location.search(vm.filter);\r\n });\r\n } else {\r\n $timeout(function() {\r\n setBounds();\r\n $location.search(vm.filter);\r\n });\r\n }\r\n });\r\n\r\n });\r\n\r\n angular.element($(window)).bind('resize', function () { \r\n vm.fixPageHeight();\r\n $scope.$digest();\r\n });\r\n\r\n \r\n watchBack();\r\n }\r\n\r\n function setDefaultLocation() {\r\n if (!filterLocationEmpty()) {\r\n vm.isInit = true;\r\n if (vm.filter.merchantID != null) {\r\n }\r\n else if (vm.filter.suburb != null) {\r\n }\r\n else if (vm.filter.centerLat != null && vm.filter.centerLng != null && vm.filter.zoom != null) {\r\n vm.map.setCenter(new google.maps.LatLng(vm.filter.centerLat, vm.filter.centerLng));\r\n vm.map.setZoom(parseInt(vm.filter.zoom));\r\n setBounds();\r\n } else {\r\n if (vm.filterData.defaultLocation == null) {\r\n return;\r\n }\r\n vm.map.setZoom(12);\r\n vm.map.panTo(new google.maps.LatLng(vm.filterData.defaultLocation.Lat, vm.filterData.defaultLocation.Lng));\r\n }\r\n vm.search(true);\r\n }\r\n else if (vm.GetCurrentUserLocation != null) {\r\n vm.map.setZoom(12);\r\n vm.map.panTo(new google.maps.LatLng(vm.GetCurrentUserLocation.latitude, vm.GetCurrentUserLocation.longitude));\r\n $location.search(vm.filter);\r\n vm.search(false);\r\n } else {\r\n if (vm.map == null) {\r\n return;\r\n }\r\n vm.isInit = true;\r\n vm.map.setZoom(12);\r\n if (vm.filterData.defaultLocation != null) {\r\n vm.map.panTo(new google.maps.LatLng(vm.filterData.defaultLocation.Lat,\r\n vm.filterData.defaultLocation.Lng));\r\n if (vm.filterData.defaultLocation.Zoom != null) {\r\n vm.map.setZoom(parseInt(vm.filterData.defaultLocation.Zoom));\r\n }\r\n }\r\n vm.search(true);\r\n }\r\n }\r\n\r\n function setCategoriesFromUrl() {\r\n $(\"#allCategories\").prop(\"checked\", false);\r\n vm.filterData.categories.forEach(function (cat) {\r\n cat.selected = false;\r\n });\r\n var categories = vm.filter.categories;\r\n if (categories != null && categories.length > 0) {\r\n var catIDs = categories.split(','); \r\n vm.filterData.categories.forEach(function (cat) {\r\n var grouppedCurrentIDs = cat.ID.split(',');\r\n var groupedSelected = 0;\r\n grouppedCurrentIDs.forEach(function(gID) {\r\n catIDs.forEach(function (catID) {\r\n if (gID == catID) { \r\n groupedSelected ++;;\r\n }\r\n });\r\n });\r\n if (groupedSelected === grouppedCurrentIDs.length) {\r\n cat.selected = true;\r\n } \r\n });\r\n } else {\r\n vm.filterData.categories.forEach(function(cat) {\r\n cat.selected = true;\r\n });\r\n $(\"#allCategories\").prop(\"checked\", true); \r\n }\r\n }\r\n\r\n function setOfferTypesFromUrl() {\r\n $(\"#allOffers\").prop(\"checked\", false);\r\n var offerTypes = vm.filter.offerTypeCategory;\r\n if (offerTypes != null && offerTypes.length > 0) {\r\n var typeValues = offerTypes.split(',');\r\n vm.filterData.offerTypeCategory.forEach(function (cat) {\r\n typeValues.forEach(function (catID) {\r\n if (cat.Value == catID) {\r\n cat.selected = true;\r\n }\r\n });\r\n });\r\n } else {\r\n vm.filterData.offerTypeCategory.forEach(function (cat) {\r\n cat.selected = true;\r\n });\r\n $(\"#allOffers\").prop(\"checked\", true); \r\n }\r\n }\r\n\r\n function locationTextChanged() {\r\n vm.place = this.getPlace();\r\n if (vm.place.geometry != null) { \r\n vm.map.setCenter(vm.place.geometry.location);\r\n if (vm.place.geometry.viewport != null) {\r\n vm.map.fitBounds(vm.place.geometry.viewport);\r\n } else {\r\n vm.map.setCenter(vm.place.geometry.location);\r\n vm.map.setZoom(17);\r\n }\r\n saveUserLocation(vm.map.getBounds());\r\n vm.filter.text = null;\r\n vm.search(false); \r\n }\r\n }\r\n \r\n function togglesearch() {\r\n var filter = $('.search-filter-panel');\r\n filter.show();\r\n filter.toggleClass('slideIn'); \r\n $('.search-sort-panel').removeClass('slideIn');\r\n $('.btn-refine').toggleClass('open');\r\n }\r\n\r\n function togglesort() {\r\n $(\".search-filter-panel\").removeClass(\"slideIn\");\r\n $(\".search-sort-panel\").toggleClass(\"slideIn\");\r\n }\r\n \r\n\r\n function addToFavourites(merchant) {\r\n dataService.addToFavourites(merchant.MID).then(function (res) {\r\n merchant.IsMyFavourite = true;\r\n });\r\n }\r\n\r\n function removeFromFavourites(merchant) {\r\n dataService.removeFromFavourites(merchant.MID).then(function (res) {\r\n merchant.IsMyFavourite = false; \r\n });\r\n }\r\n\r\n function showItemOnRight(merchantID) {\r\n var marker;\r\n vm.markers.forEach(function (m) {\r\n if (m.item.ID == merchantID) {\r\n marker = m;\r\n return;\r\n }\r\n });\r\n if (marker != null) {\r\n return vm.map.getBounds().contains(marker.getPosition());\r\n }\r\n return false;\r\n }\r\n \r\n function selectallcategory() {\r\n var check = $(\"#allCategories\").is(\":checked\");\r\n\r\n vm.filterData.categories.forEach(function(cat) {\r\n cat.selected = check;\r\n });\r\n }\r\n\r\n function setAllCategory(category) {\r\n var checkCount = 0;\r\n vm.filterData.categories.forEach(function (cat) {\r\n if (category.ID !== cat.ID) {\r\n cat.selected = false;\r\n }\r\n if (cat.selected) {\r\n checkCount++;\r\n }\r\n });\r\n $(\"#allCategories\").prop('checked', vm.filterData.categories.length === checkCount);\r\n }\r\n\r\n function selectalloffers() {\r\n var check = $(\"#allOffers\").is(\":checked\");\r\n\r\n vm.filterData.offerTypeCategory.forEach(function (cat) {\r\n cat.selected = check;\r\n });\r\n }\r\n\r\n function setAllOffers() {\r\n var checkCount = 0;\r\n vm.filterData.offerTypeCategory.forEach(function (cat) {\r\n if (cat.selected) {\r\n checkCount++;\r\n }\r\n });\r\n $(\"#allOffers\").prop('checked', vm.filterData.offerTypeCategory.length === checkCount);\r\n }\r\n\r\n function fixPageHeight() {\r\n\r\n\r\n $('footer').hide();\r\n $('body').css({ overflow: 'hidden' });\r\n var wH = $(window).height(),\r\n navDiff = (wH - 142);\r\n if (navDiff < 550) {\r\n $('header').addClass('sticky condensed');\r\n } else {\r\n $('header').removeClass('sticky').removeClass('condensed');\r\n };\r\n var mobileMenu = $(\".properties-map-sidebar-refine-search .btn-marker:visible\");\r\n var h = wH - $(\".properties-map-wrap\").offset().top;\r\n $('.properties-map-table-wrap').css({ height: h + 'px' });\r\n $(\"ng-map\").parent().height(h);\r\n $(\"ng-map\").height(h);\r\n google.maps.event.trigger(angular.element($(\"ng-map > div\"))[0], \"resize\");\r\n\r\n }\r\n\r\n function switchView(doNotShowMessage) {\r\n var isMapVisible = $(\".search-map\").width() > 0;\r\n if (isMapVisible) {\r\n vm.mapVisibleArea = {\r\n NorthEastLat: vm.map.getBounds().getNorthEast().lat(),\r\n NorthEastLng: vm.map.getBounds().getNorthEast().lng(),\r\n SouthWestLat: vm.map.getBounds().getSouthWest().lat(),\r\n SouthWestLng: vm.map.getBounds().getSouthWest().lng(),\r\n }\r\n delete vm.filter[\"view\"];\r\n } else {\r\n vm.mapVisibleArea = null;\r\n vm.filter.view = \"map\"; \r\n\r\n if (!vm.allHasLocation && localStorage.RememberInfo !== \"Remember\" && !doNotShowMessage) {\r\n $(\".info-modal .modal-body\").html(\"Please note some of the web offers cannot be displayed on the map as they dont have locations. Please switch back to text view to redeem those offers online\");\r\n $(\".modal-content__remember-info\").show();\r\n $(\".info-modal\").modal();\r\n }\r\n }\r\n \r\n $location.search(vm.filter);\r\n\r\n $(\".search-sort-panel\").removeClass(\"slideIn\");\r\n\r\n var filter = $('.search-filter-panel');\r\n filter.removeClass('slideIn');\r\n $(\".properties-map-wrap, .properties-map-sidebar-header\").toggleClass('open');\r\n google.maps.event.trigger(vm.map, 'resize');\r\n \r\n }\r\n\r\n function watchBack() {\r\n window.onpopstate = function (event) {\r\n var _vm = angular.element($(\"div[data-ng-app]\")).scope().vm;\r\n _vm.filter = $location.search();\r\n _vm.isInit = true;\r\n\r\n _vm.setCategoriesFromUrl();\r\n _vm.setOfferTypesFromUrl();\r\n _vm.setDefaultLocation();\r\n };\r\n }\r\n\r\n\r\n function toggleOtherLocations(merchant) {\r\n var show = !merchant.showAll;\r\n merchant.showAll = show;\r\n var elems = $(\".merchant__other-offers[data-offer-id=\" + merchant.Offer.BookOfferID + \"]\"); \r\n if (show) {\r\n elems.hide().slideDown(); \r\n } else {\r\n elems.slideUp().hide(); \r\n }\r\n }\r\n\r\n function displayOtherLocations(merchant) {\r\n if (vm.data == null) {\r\n return false;\r\n }\r\n var hasMore = merchant.Locations.length > 1;\r\n var hasAnyAddress = false;\r\n merchant.Locations.forEach(function (l, i) {\r\n if (l.DisplayType !== 'None' && i > 0) {\r\n hasAnyAddress = true;\r\n }\r\n });\r\n return hasMore && hasAnyAddress;\r\n }\r\n\r\n function getOfferLink(merchant, location) {\r\n var link = \"/offer/\" + merchant.Offer.BookOfferID + \"?location=\" + location.ID;\r\n if (merchant.Offer.DisplayTemplateCode === \"WebLink\" || merchant.Offer.BookOfferType === \"Online\") {\r\n link += \"&redirect=sso\"; \r\n }\r\n return link;\r\n }\r\n\r\n function goToOffer(merchant, location) {\r\n var url = getOfferLink(merchant, location);\r\n window.location = url;\r\n }\r\n\r\n function rememberInfo() {\r\n localStorage.RememberInfo = \"Remember\";\r\n }\r\n }\r\n})();"]}