1 |
- Ext.define('Ext.google.ux.Client',{extend:'Ext.Mixin',mixins:['Ext.mixin.Mashup'],requiredScripts:['//apis.google.com/js/client.js?onload=_ext_google_ux_client_initialize_'],statics:{getApiVersion:function(b){var a=this.libraries[b];return a&&a.state==2?a.version:null}},mixinConfig:{extended:function(c,b,a){this.load(a.googleApis)}},onClassMixedIn:function(a){this.load(a.prototype.googleApis)},privates:{statics:{initialized:!1,blocked:!1,loading:0,libraries:{},load:function(d){var c=this.libraries,b,a;if(!Ext.isObject(d)){return}Ext.Object.each(d,function(e,f){b=f.version||'v1';a=c[e];if(!Ext.isDefined(a)){c[e]={version:b,state:0}}else if(a.version!==b){Ext.log.error('Google API: failed to load version "'+b+'" of the','"'+e+'" API: "'+a.version+'" already loaded.')}});this.refresh()},refresh:function(){var a=this;if(!a.initialized){return}if(!a.blocked){Ext.env.Ready.block();a.blocked=!0}Ext.Object.each(a.libraries,function(c,b){if(b.state==0){b.state=1;gapi.client.load(c,b.version,function(){b.state=2;if(!--a.loading){a.refresh()}})}if(b.state==1){a.loading++}});if(!a.loading&&a.blocked){Ext.env.Ready.unblock();a.blocked=!1}},initialize:function(){this.initialized=!0;this.refresh()}}}});_ext_google_ux_client_initialize_=function(){gapi.auth.init(function(){Ext.google.ux.Client.initialize()})};Ext.define('Ext.google.data.AbstractProxy',{extend:'Ext.data.proxy.Server',mixins:['Ext.google.ux.Client'],batchActions:!1,reader:{type:'json',rootProperty:'items',messageProperty:'error'},doRequest:function(c){var b=this,a=b.buildRequest(c),d=b.getWriter(),e=!1;if(d&&c.allowWrite()){a=d.write(a)}b.execute(b.buildApiRequests(a)).then(function(d){b.processApiResponse(c,a,d)});return a},buildUrl:function(a){return ''},privates:{execute:function(a){a=[].concat(a);var b=[];return Ext.Array.reduce(a,function(c,d){return c.then(function(){return d.then(function(e){b.push(e)})})},Ext.Deferred.resolved()).then(function(){return {result:b}})},processApiResponse:function(d,e,b){var a=!1,c=[];Ext.each(Object.keys(b.result),function(g){var f=b.result[g].result;if(f.error){a=f.error.message;return !1}c.push(f)});this.processResponse(!0,d,e,{results:a?[]:c,success:!a,error:a})},sanitizeItems:function(c){var a=[],b=[];Ext.Array.each(c,function(d){if(!Ext.Array.contains(b,d.id)){a.push(d);b.push(d.id)}},this,!0);return a}}});Ext.define('Ext.google.data.EventsProxy',{extend:'Ext.google.data.AbstractProxy',alias:'proxy.google-events',googleApis:{'calendar':{version:'v3'}},buildApiRequests:function(a){var b=this,c=a.getAction();switch(c){case 'read':return b.buildReadApiRequests(a);case 'create':return b.buildCreateApiRequests(a);case 'update':return b.buildUpdateApiRequests(a);case 'destroy':return b.buildDestroyApiRequests(a);default:Ext.raise('unsupported request: events.'+c);return null;}},extractResponseData:function(d){var a=this,c=a.callParent(arguments),b=[];Ext.each(c.results,function(c){switch(c.kind){case 'calendar#events':b=b.concat(c.items.map(a.fromApiEvent.bind(a)));break;case 'calendar#event':b.push(a.fromApiEvent(c));break;default:break;}});return {items:a.sanitizeItems(b),success:c.success,error:c.error}},privates:{toApiEvent:function(c,b){var a={};Ext.Object.each(c,function(f,e){var g=null,d=null;switch(f){case 'calendarId':case 'description':a[f]=e;break;case 'id':a.eventId=e;break;case 'title':a.summary=e;break;case 'startDate':case 'endDate':if(b){d=new Date(e);d.setHours(0,-d.getTimezoneOffset());d=Ext.Date.format(d,'Y-m-d')}else {g=Ext.Date.format(new Date(e),'c')};a[f.slice(0,-4)]={date:d,dateTime:g};break;default:break;}});return a},fromApiEvent:function(b){var a={allDay:!0};Ext.Object.each(b,function(g,c){var d,f,e;switch(g){case 'id':case 'description':a[g]=c;break;case 'summary':a.title=c;break;case 'start':case 'end':d=Ext.Date.parse(c.dateTime||c.date,'C');f=d.getTimezoneOffset();e=!!c.date;if(e&&f!==0){d.setHours(0,-f)};a[g+'Date']=d;a.allDay=a.allDay&&e;break;default:break;}});return a},buildReadApiRequests:function(f){var c=f.getParams(),b=new Date(c.startDate),d=new Date(c.endDate),e=[],a;while(b<d){a=Ext.Date.add(b,Ext.Date.MONTH,3);if(a>d){a=d}e.push(gapi.client.calendar.events.list({calendarId:c.calendar,timeMin:Ext.Date.format(b,'C'),timeMax:Ext.Date.format(a,'C'),singleEvents:!0,maxResults:2500}));b=a}return e},buildCreateApiRequests:function(a){var b=a.getRecords()[0];return gapi.client.calendar.events.insert(this.toApiEvent(a.getJsonData(),b.get('allDay')))},buildUpdateApiRequests:function(g){var b=g.getRecords()[0],a=this.toApiEvent(g.getJsonData(),b.get('allDay')),d=b.getModified('calendarId'),c=b.get('calendarId'),f=b.getId(),e=[];a.calendarId=c;a.eventId=f;if(d&&d!==c){e.push(gapi.client.calendar.events.move({destination:c,calendarId:d,eventId:f}))}if(Object.keys(a).length>2){e.push(gapi.client.calendar.events.patch(a))}return e},buildDestroyApiRequests:function(a){var b=a.getRecords()[0];data=a.getJsonData();data.calendarId=data.calendarId||b.get('calendarId')||b.getPrevious('calendarId');return gapi.client.calendar.events['delete']({'calendarId':data.calendarId,'eventId':data.id})}}});Ext.define('Ext.google.data.CalendarsProxy',{extend:'Ext.google.data.AbstractProxy',alias:'proxy.google-calendars',requires:['Ext.google.data.EventsProxy'],googleApis:{'calendar':{version:'v3'}},buildApiRequests:function(a){var c=this,b=a.getAction();switch(b){case 'read':return c.buildReadApiRequests(a);case 'update':return c.buildUpdateApiRequests(a);default:Ext.raise('unsupported request: calendars.'+b);return null;}},extractResponseData:function(d){var a=this,c=a.callParent(arguments),b=[];Ext.each(c.results,function(c){switch(c.kind){case 'calendar#calendarList':b=b.concat(c.items.map(a.fromApiCalendar.bind(a)));break;default:break;}});return {items:a.sanitizeItems(b),success:c.success,error:c.error}},privates:{toApiCalendar:function(b){var a={};Ext.Object.each(b,function(d,c){switch(d){case 'id':a.calendarId=c;break;case 'hidden':a.selected=!c;break;default:break;}});return a},fromApiCalendar:function(b){var a={hidden:!b.selected,editable:!1,eventStore:{autoSync:!0,proxy:{type:'google-events',resourceTypes:'events'}}};Ext.Object.each(b,function(d,c){switch(d){case 'id':case 'description':a[d]=c;break;case 'backgroundColor':a.color=c;break;case 'summary':a.title=c;break;case 'accessRole':a.editable=(c=='owner'||c=='writer');break;default:break;}});return a},buildReadApiRequests:function(a){return gapi.client.calendar.calendarList.list()},buildUpdateApiRequests:function(a){var b=this.toApiCalendar(a.getJsonData());return gapi.client.calendar.calendarList.patch(b)}}});Ext.define('Ext.ux.google.Api',{mixins:['Ext.mixin.Mashup'],requiredScripts:['//www.google.com/jsapi'],statics:{loadedModules:{}},onClassExtended:function(e,d,a){var b=a.onBeforeCreated,c=this;a.onBeforeCreated=function(o,k){var p=this,j=[],l=Ext.Array.from(k.requiresGoogle),h=c.loadedModules,i=0,m=function(){if(!--i){b.call(p,o,k,a)}Ext.env.Ready.unblock()},f,g,n;n=l.length;for(g=0;g<n;++g){if(Ext.isString(f=l[g])){j.push({api:f})}else if(Ext.isObject(f)){j.push(Ext.apply({},f))}}Ext.each(j,function(c){var f=c.api,g=String(c.version||'1.x'),b=h[f];if(!b){++i;Ext.env.Ready.block();h[f]=b=[m].concat(c.callback||[]);delete c.api;delete c.version;if(!window.google){Ext.raise("'google' is not defined.");return !1}google.load(f,g,Ext.applyIf({callback:function(){h[f]=!0;for(var g=b.length;g-->0;){b[g]()}}},c))}else if(b!==!0){b.push(m)}});if(!i){b.call(p,o,k,a)}}}});Ext.define('Ext.ux.google.Map',{extend:'Ext.Container',xtype:['map','google-map'],alternateClassName:'Ext.Map',requires:['Ext.util.Geolocation'],mixins:['Ext.mixin.Mashup'],requires:['Ext.data.StoreManager'],requiredScripts:['//maps.googleapis.com/maps/api/js{options}'],isMap:!0,config:{useCurrentLocation:!1,map:null,geo:null,mapOptions:{},mapListeners:null,markers:null,markerTemplate:{title:'{title}',position:'{position}',animation:'{animation}',clickable:'{clickable}',draggable:'{draggable}',visible:'{visible}'}},baseCls:Ext.baseCSSPrefix+'map',constructor:function(a){this.callParent([a]);if(!(window.google||{}).maps){this.setHtml('Google Maps API is required')}},initialize:function(){this.callParent();this.initMap();this.on({painted:'onPainted',scope:this});this.bodyElement.on('touchstart','onTouchStart',this)},initMap:function(){var c=this.getMap();if(!c){var d=(window.google||{}).maps;if(!d){return null}var f=this.mapContainer,a=this.getMapOptions(),e=d.event,b=this;if(f.dom.firstChild){Ext.fly(f.dom.firstChild).destroy()}if(Ext.os.is.iPad){Ext.merge({navigationControlOptions:{style:d.NavigationControlStyle.ZOOM_PAN}},a)}a.mapTypeId=a.mapTypeId||d.MapTypeId.ROADMAP;a.center=a.center||new d.LatLng(37.381592,-122.135672);if(a.center&&a.center.latitude&&!Ext.isFunction(a.center.lat)){a.center=new d.LatLng(a.center.latitude,a.center.longitude)}a.zoom=a.zoom||12;c=new d.Map(f.dom,a);this.setMap(c);e.addListener(c,'zoom_changed',Ext.bind(b.onZoomChange,b));e.addListener(c,'maptypeid_changed',Ext.bind(b.onTypeChange,b));e.addListener(c,'center_changed',Ext.bind(b.onCenterChange,b));e.addListenerOnce(c,'tilesloaded',Ext.bind(b.onTilesLoaded,b));this.addMapListeners()}return this.getMap()},renderMap:function(){this.initMap()},getElementConfig:function(){return {reference:'element',className:'x-container',children:[{reference:'bodyElement',className:'x-inner',children:[{reference:'mapContainer',className:Ext.baseCSSPrefix+'map-container'}]}]}},onTouchStart:function(a){a.makeUnpreventable()},updateMap:function(b){var a=this.getMarkers();if(a){a.each(function(c){var a=this.getMarkerForRecord(c);if(a){a.setMap(b)}},this)}},applyMapOptions:function(a){return Ext.merge({},this.options,a)},updateMapOptions:function(b){var c=(window.google||{}).maps,a=this.getMap();if(c&&a){a.setOptions(b)}},applyMarkers:function(a){if(!a){return null}if(a.isStore){return a}if(Ext.isArray(a)){a={data:a}}else if(Ext.isObject(a)){a={data:[a]}}return Ext.getStore(a)},updateMarkers:function(a,b){var d=this,c={add:'onMarkersAdd',remove:'onMarkersRemove',itemchange:'onMarkerChange',scope:this};if(b&&b.isStore){b.getData().un(c);d.removeMarkers(b.getRange())}if(a&&a.isStore){d.addMarkers(a.getRange());a.getData().on(c)}},applyMarkerTemplate:function(a){return Ext.util.ObjectTemplate.create(a)},updateMarkerTemplate:function(b){var a=this.getMarkers();if(a){this.refreshMarkers(a.getRange())}},doMapCenter:function(){this.setMapCenter(this.getMapOptions().center)},getMapOptions:function(){return Ext.merge({},this.options||this.getInitialConfig('mapOptions'))},updateUseCurrentLocation:function(a){this.setGeo(a);if(!a){this.setMapCenter()}},applyGeo:function(a){return Ext.factory(a,Ext.util.Geolocation,this.getGeo())},updateGeo:function(a,c){var b={locationupdate:'onGeoUpdate',locationerror:'onGeoError',scope:this};if(c){c.un(b)}if(a){a.on(b);a.updateLocation()}},onPainted:function(){var c=(window.google||{}).maps,a=this.getMap(),b;if(c&&a){b=a.getCenter();c.event.trigger(a,'resize');if(b){a.setCenter(b)}}},onTilesLoaded:function(){this.fireEvent('maprender',this,this.getMap())},addMapListeners:function(){var i=(window.google||{}).maps,j=this.getMap(),d=this.getMapListeners();if(i){var h=i.event,k=this,a,e,c,b,g;if(Ext.isSimpleObject(d)){for(var f in d){a=d[f];if(Ext.isSimpleObject(a)){e=a.scope;c=a.fn}else if(Ext.isFunction(a)){e=null;c=a}if(c){b=function(){this.fn.apply(this.scope,[k]);if(this.handle){h.removeListener(this.handle);delete this.handle;delete this.fn;delete this.scope}};g=h.addListener(j,f,Ext.bind(b,b));b.fn=c;b.scope=e;if(a.single===!0){b.handle=g}}}}}},onGeoUpdate:function(a){if(a){this.setMapCenter(new google.maps.LatLng(a.getLatitude(),a.getLongitude()))}},onGeoError:Ext.emptyFn,setMapCenter:function(a){var d=this,b=d.getMap(),e=d.getMapOptions(),c=(window.google||{}).maps,f;if(c){if(!a){if(b&&b.getCenter){a=b.getCenter()}else if(e.hasOwnProperty('center')){a=e.center}else {a=new c.LatLng(37.381592,-122.135672)}}else if(a.isModel){var f=d.getMarkerForRecord(a);a=f&&f.position}if(a&&!(a instanceof c.LatLng)&&'longitude' in a){a=new c.LatLng(a.latitude,a.longitude)}if(!b){e.center=e.center||a;d.renderMap();b=d.getMap()}if(b&&a instanceof c.LatLng){b.panTo(a)}else {this.options=Ext.apply(this.getMapOptions(),{center:a})}}},fitMarkersInView:function(b){var i=this,c=i.getMap(),h=c.getBounds(),j=i.getMarkers(),k=(window.google||{}).maps,a,d,e,f,g;if(!c||!h||!j){return}if(Ext.isEmpty(b)){b=j.getRange();if(Ext.isEmpty(b)){return}}a=new k.LatLngBounds();Ext.each(b,function(d){var c=i.getMarkerForRecord(d);if(c){a.extend(c.getPosition())}});d=a.getNorthEast();e=a.getSouthWest();f=h.getNorthEast();g=h.getSouthWest();if((d.lat()-e.lat())>(f.lat()-g.lat())||(d.lng()-e.lng())>(f.lng()-g.lng())){c.fitBounds(a)}else {c.panToBounds(a)}},onZoomChange:function(){var c=this.getMapOptions(),a=this.getMap(),b;b=(a&&a.getZoom)?a.getZoom():c.zoom||10;this.options=Ext.apply(c,{zoom:b});this.fireEvent('zoomchange',this,a,b)},onTypeChange:function(){var c=this.getMapOptions(),a=this.getMap(),b;b=(a&&a.getMapTypeId)?a.getMapTypeId():c.mapTypeId;this.options=Ext.apply(c,{mapTypeId:b});this.fireEvent('typechange',this,a,b)},onCenterChange:function(){var c=this.getMapOptions(),a=this.getMap(),b;b=(a&&a.getCenter)?a.getCenter():c.center;this.options=Ext.apply(c,{center:b});this.fireEvent('centerchange',this,a,b)},doDestroy:function(){Ext.destroy(this.getGeo());var a=this.getMap();if(a&&(window.google||{}).maps){google.maps.event.clearInstanceListeners(a)}this.callParent()},privates:{markerEvents:['click','dblclick','drag','dragend','dragstart','mousedown','mouseout','mouseover','mouseup','rightclick'],getMarkerForRecord:function(b){var a=b&&Ext.getExpando(b,this.getId());return (a&&a.marker)||null},buildMarkerOptions:function(c,d){var a=d.apply(c.getData(!0)),e=(window.google||{}).maps,b=a.animation;if(typeof b==='string'){a.animation=e.Animation[b]||null}return a},addMarkers:function(b){var a=this,e=a.getId(),f=a.getMap(),g=a.getMarkerTemplate(),h=(window.google||{}).maps,d=a.getMarkers(),c=a.markerEvents;Ext.each(b,function(i){var m=d.indexOf(i),l=a.buildMarkerOptions(i,g),j=new h.Marker(Ext.apply(l,{map:f})),k=c.map(function(c){return j.addListener(c,function(d){a.fireEvent('marker'+c,a,{index:m,record:i,marker:j,event:d})})});Ext.setExpando(i,e,{listeners:k,marker:j})})},removeMarkers:function(b){var a=this.getId();Ext.each(b,function(e){var c=Ext.getExpando(e,a),d=c&&c.marker;if(d){d.setMap(null);Ext.each(c.listeners||[],function(a){a.remove()})}Ext.setExpando(e,a,undefined)})},refreshMarkers:function(e){var d=this,g=d.getMarkerTemplate(),f=e.length,c,b,a;for(a=0;a<f;++a){c=e[a];b=d.getMarkerForRecord(c);if(b){b.setOptions(d.buildMarkerOptions(c,g))}}},onMarkersAdd:function(b,a){this.addMarkers(a.items)},onMarkersRemove:function(b,a){this.removeMarkers(a.items)},onMarkerChange:function(b,a){this.refreshMarkers([a.item])}}});Ext.define('Ext.ux.google.map.Marker',{extend:'Ext.data.Model',fields:[{name:'position',type:'auto'},{name:'title',type:'string',defaultValue:null},{name:'animation',type:'number',defaultValue:'DROP',persist:!1},{name:'clickable',type:'boolean',defaultValue:!0,persist:!1},{name:'draggable',type:'boolean',defaultValue:!1,persist:!1},{name:'visible',type:'boolean',defaultValue:!0,persist:!1}]});
|