/data/coffee/ch.coffee
CoffeeScript | 531 lines | 356 code | 158 blank | 17 comment | 12 complexity | bea0d303b7d532a033d2518da3c6b986 MD5 | raw file
Possible License(s): LGPL-2.1, BSD-3-Clause, LGPL-3.0, Apache-2.0, ISC, AGPL-3.0
- # Para compilar:
- #
- # coffee -wc --output "web/js" data/coffee/ch.coffee
- root = exports ? this
- month_to_es= (month)->
- months = ['Ene','Feb','Mar','Abr','May','Jun','Jul','Ago','Set','Oct','Nov','Dic']
- months[month-1]
- match= (what,where)->
- return true unless what?
- (where.toLowerCase().indexOf(what.toLowerCase()) isnt -1)
- class Cooperativa extends Backbone.Model
-
- class CooperativasCollection extends Backbone.Paginator.clientPager #Backbone.Collection
- model: Cooperativa
- paginator_ui:
- firstPage: 1
- currentPage: 1
- perPage: 6
- totalPages: 10
- pagesInRange: 4
-
- search: (attrs)->
-
- @setFieldFilter [ { field: 'school_name', type: 'function', value: (val) -> match(attrs.colegio, val)},
- { field: 'name', type: 'function', value: (val) -> match(attrs.cooperativa, val)},
- { field: 'activity_id', type: 'function', value: (val) -> (not attrs.actividad or val is attrs.actividad)},
- { field: 'address', type: 'function', value: (val) -> match(attrs.address, val)},
- { field: 'level_id', type: 'function', value: (val) -> (not attrs.nivel or val is attrs.nivel)}
- ]
- class CooperativaView extends Backbone.Marionette.ItemView
- template: "#cooperativa-list-item-template"
- templateHelpers:
- klass: ->
- #"open" if @clicked
- "sponsored-#{@sponsored}"
- uri: ->
- root.location.pathname + '/' + @slug + '/home'
-
- class NoCooperativasView extends Backbone.Marionette.ItemView
- template: "#no-cooperativas-template"
- class CooperativaListView extends Backbone.Marionette.CollectionView
- itemView: CooperativaView
- emptyView: NoCooperativasView
- class FilterFormView extends Marionette.ItemView
- template: "#filter-form-template"
- events:
- 'keyup input.colegio': 'filters_changed'
- 'keyup input.cooperativa': 'filters_changed'
- 'change select.nivel': 'filters_changed'
- 'change select.actividad': 'filters_changed'
- 'keyup input.address': 'filters_changed'
- 'click button.reset': 'reset'
-
- filters_changed: (ev)->
- ev.preventDefault()
- @collection.search
- colegio: @$('input.colegio').val()
- cooperativa: @$('input.cooperativa').val()
- nivel: @$('select.nivel').val()
- actividad: @$('select.actividad').val()
- address: @$('input.address').val()
- reset: (ev)->
- ev.preventDefault()
- @$('input.colegio').val('')
- @$('input.cooperativa').val('')
- @$('select.nivel').val('')
- @$('select.actividad').val('')
- @$('input.address').val('')
- @collection.search {}
- onRender: () =>
- @$("input").placeholder()
-
- class CooperativasPagerView extends Marionette.ItemView
- template: "#pager-template"
- events:
- 'click a': 'clicked'
- initialize: ->
- @listenTo @collection, "reset", @render, @
- clicked: (ev)->
- ev.preventDefault()
- @collection.goTo $(ev.target).text()
- serializeData: () ->
- @collection.info()
- class MapView extends Marionette.ItemView
- template: "#map-template"
- map: null
- markers: []
-
- initialize: ->
- @listenTo @collection, "reset", @render, @
- _.each @collection.origModels, (item, index) =>
-
- lat = item.get('latitude')
- lng = item.get('longitude')
- latlng = new google.maps.LatLng(lat,lng)
- marker = new google.maps.Marker
- id: item.get('id')
- position: latlng
- google.maps.event.addListener marker, "click", =>
- @markerClicked marker
- @markers.push marker
- markerClicked: (marker) ->
- @collection.each (item, index) =>
- item.set 'clicked', marker.id is item.get('id')
-
- drawMap: ->
- options =
- mapTypeId: google.maps.MapTypeId.SATELLITE
- zoom: 16
- panControl: false
- mapTypeControl: false
- scaleControl: false
- rotateControl: false
- zoomControl: false
- streetViewControl: false
- #center: @markers[0].getPosition()
- @$el.height 640
- @map = new google.maps.Map(@el, options)
- render: ->
- @drawMap() unless @map
-
- bounds = new google.maps.LatLngBounds()
- ids = _.pluck(@collection.sortedAndFilteredModels, 'id')
- for m in @markers
- if m.id in ids
- bounds.extend m.getPosition()
- m.setMap @map
- else
- m.setMap null
- if ids.length > 0
- @map.setCenter(bounds.getCenter())
- @map.fitBounds(bounds)
- class Application extends Backbone.Marionette.Application
- class Post extends Backbone.Model
-
- class PostsCollection extends Backbone.Paginator.clientPager #Backbone.Collection
- model: Post
- paginator_ui:
- firstPage: 1
- currentPage: 1
- perPage: 6
- totalPages: 10
- pagesInRange: 4
- filter_per_year: (year)->
- field_filter =
- field: 'published_at'
- type: 'function'
- value: (published_at) -> published_at[0...4] is year
-
- @setFieldFilter [field_filter]
- class PostView extends Backbone.Marionette.ItemView
- template: "#post-list-item-template"
- className: "post-item"
- templateHelpers:
- uri: ->
- root.location.pathname + '/' + @slug
- year: ->
- @published_at[0...4]
- month: ->
- month_to_es(@published_at[5...7])
- day: ->
- @published_at[8...10]
-
- class NoPostsView extends Backbone.Marionette.ItemView
- template: "#no-posts-template"
- class PostsListView extends Backbone.Marionette.CollectionView
- itemView: PostView
- emptyView: NoPostsView
- className: "row"
- class PostsFilterView extends Marionette.ItemView
- template: "#filter-template"
- events:
- 'change select': 'filter'
- initialize: ->
- @years= _.uniq(@collection.map( (model) -> model.get('published_at')[0...4] )).sort().reverse()
- @collection.filter_per_year @years[0]
- filter: (ev)->
- @collection.filter_per_year $(ev.target).val()
- serializeData: () ->
- years: @years
-
- class PostsPagerView extends Marionette.ItemView
- template: "#pager-template"
- events:
- 'click a': 'clicked'
- initialize: ->
- @listenTo @collection, "reset", @render, @
- clicked: (ev)->
- ev.preventDefault()
- @collection.goTo $(ev.target).text()
- serializeData: () ->
- @collection.info()
- class PostsLayout extends Backbone.Marionette.Layout
- template: "#layout-template"
- className: "container contenedor-post post-anteriores"
- regions:
- filter: ".filter"
- list: ".list"
- pager: ".pager"
- fsConstructor = ->
- @startCooperativas = (options) ->
- cooperativas = new CooperativasCollection options["cooperativas"]
- cooperativas.bootstrap()
- list = new CooperativaListView
- collection: cooperativas
- el: '#container .list'
- list.render()
- filters = new FilterFormView
- collection: cooperativas
- el: '#container .filter-form'
- filters.render()
- pager = new CooperativasPagerView
- collection: cooperativas
- el: '#container .pager'
- pager.render()
- map = new MapView
- collection: cooperativas
- el: '#container .map'
- map.render()
- @initializeEditor = (options) ->
- window.CKEDITOR_BASEPATH = options.ckeditorPath
- init = ->
- delete window.CKEDITOR.instances[options.name] if window.CKEDITOR.instances[options.name]
- CKEDITOR.replace options.name, options.config
- if CKEDITOR?
- init()
- else
- $.getScript options.webPath, ->
- init()
- @startPosts = (options) ->
- app = new Application
- app.addRegions
- mainRegion: "#container"
- layout = new PostsLayout
- app.mainRegion.show layout
- posts = new PostsCollection options["posts"]
- posts.bootstrap()
- layout.list.show new PostsListView
- collection: posts
- layout.pager.show new PostsPagerView
- collection: posts
- app.start options
- @startEvents = (options) ->
- app = new Application
- app.addRegions
- mainRegion: "#container"
- layout = new PostsLayout
- app.mainRegion.show layout
- posts = new PostsCollection options["posts"]
- posts.bootstrap()
- layout.filter.show new PostsFilterView
- collection: posts
- layout.list.show new PostsListView
- collection: posts
- layout.pager.show new PostsPagerView
- collection: posts
- app.start options
- @startUplodify = (options) ->
- $("#file_upload").uploadify
- swf: "/swf/uploadify.swf"
- uploader: options["uploader"]
- buttonText: "Seleccionar Video"
- multi: false
- fileTypeDesc: "Archivos de Video"
- fileTypeExts: "*.avi;*.mp4;*.wmv;*.mov"
- fileSizeLimit: "100MB"
- debug: false
- onSelectError: (file, errorCode, errorMsg) =>
- console.log @, file, errorCode, errorMsg
- switch errorCode
- when SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED
- errorMsg += "\nThe number of files selected exceeds the remaining upload limit (" + errorMsg + ")."
- when SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT
- errorMsg += "\nThe file \"" + file.name + "\" exceeds the size limit (" + @fileSizeLimit + ")."
- when SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE
- errorMsg += "\nThe file \"" + file.name + "\" is empty."
- when SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT
- errorMsg += "\nThe file \"" + file.name + "\" is not an accepted file type (" + fileTypeDesc + ")."
- alert errorMsg
- onUploadError: (file, errorCode, errorMsg, errorString) ->
- alert "The file " + file.name + " could not be uploaded: " + errorString
- onUploadSuccess: (file, data, response) ->
- r = JSON.parse(data)
- console.log(file, data, response);
- window.location = r.redirect
- @enhancePostForm = (options) ->
- dirty = false
- content = ''
- content_loaded = false
- #my own implementation of ckeditor onChange callback
- checkContent = setInterval () ->
- if CKEDITOR?
- instance = CKEDITOR.instances["#{options['prefix']}[content]"]
- if content_loaded
- if content isnt instance.getData()
- dirty = true
- clearInterval checkContent
- else
- CKEDITOR.on 'instanceReady', ()->
- content = instance.getData() # load content first time only
- content_loaded = true
- ,500
- $("#a-admin-form").find("input, select, textarea").change (ev) ->
- dirty = true
- $(".a-media.a-js-choose-button").click (ev) ->
- if dirty
- window.onbeforeunload = () ->
- 'No guardč´¸ los cambios hechos en el formulario. Si abandona la pagina ahora se perderč°Šn.'
- setTimeout ()->
- window.onbeforeunload = null
- , 50
-
-
-
-
- @enhanceAlerts = (options) ->
- $(".a-admin-container").removeClass "a-ui"
- $(".a-admin-content").removeClass "a-admin-content"
- $(".alert .close").on "click", (ev) ->
- ev.preventDefault()
- href = $(this).attr("href")
- that = this
- $.ajax(url: href).done(->
- $(that).closest(".alert").alert "close"
- ).fail ->
- alert "error"
- @setupMap = (options) ->
-
- reverse_geocode = (latLng)->
- geocoder.geocode
- latLng: latLng
- , (results, status) ->
- if status is google.maps.GeocoderStatus.OK
- if results[0]
- $("#cooperativa_address").val results[0].formatted_address
- getPosition = ->
- lat = $("#cooperativa_latitude").val()
- lng = $("#cooperativa_longitude").val()
- new google.maps.LatLng(lat, lng)
- setPosition = ->
- $("#cooperativa_latitude").val marker.getPosition().lat()
- $("#cooperativa_longitude").val marker.getPosition().lng()
-
- options =
- zoom: 16
- center: getPosition()
- mapTypeId: google.maps.MapTypeId.SATELLITE
- map = new google.maps.Map(document.getElementById("map_canvas"), options)
-
- geocoder = new google.maps.Geocoder()
- marker = new google.maps.Marker(
- map: map
- draggable: true
- )
- marker.setPosition getPosition()
- reverse_geocode getPosition()
-
- $("#cooperativa_address").autocomplete
-
- #This bit uses the geocoder to fetch address values
- source: (request, response) ->
- geocoder.geocode
- address: request.term
- , (results, status) ->
- response $.map(results, (item) ->
- label: item.formatted_address
- value: item.formatted_address
- latitude: item.geometry.location.lat()
- longitude: item.geometry.location.lng()
- )
-
- #This bit is executed upon selection of an address
- select: (event, ui) ->
- location = new google.maps.LatLng(ui.item.latitude, ui.item.longitude)
- marker.setPosition location
- setPosition()
- map.setCenter location
-
- #Add listener to marker for reverse geocoding
- google.maps.event.addListener marker, "drag", ->
- setPosition()
- reverse_geocode marker.getPosition()
-
- google.maps.event.addListener map, "click", (event)->
- marker.setPosition event.latLng
- setPosition()
- reverse_geocode marker.getPosition()
- #map.setCenter event.latLng
- @enhanceSponsorFields = (options) ->
- #disabled. use hidden inputs
- #$("#cooperativa_sponsored").on("change", (ev) ->
- # if $(this).val() is 'apos'
- # $(".a-admin-form-field-sponsor").show()
- # else
- # $(".a-admin-form-field-sponsor").hide()
- #).trigger "change"
- @
- root.fs = new fsConstructor()
- apostrophe.debug = false
-