Taddeus Kroes преди 12 години
родител
ревизия
59adfe9c18
променени са 6 файла, в които са добавени 184 реда и са изтрити 94 реда
  1. 0 0
      channels.js
  2. 3 0
      channels.php
  3. 93 56
      guide.coffee
  4. 32 25
      index.html
  5. 4 0
      programs.php
  6. 52 13
      style.sass

Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
channels.js


+ 3 - 0
channels.php

@@ -0,0 +1,3 @@
+<?php
+echo file_get_contents('http://www.tvgids.nl/json/lists/channels.php')
+?>

+ 93 - 56
guide.coffee

@@ -2,38 +2,22 @@
 # Config
 #
 
+#FETCH_URL = 'http://www.tvgids.nl/json/lists/programs.php'
+FETCH_URL = 'programs.php'
 HOUR_WIDTH = 200
 SCROLL_MULTIPLIER = HOUR_WIDTH
 
-CHANNELS =
-    '1':   name: 'Nederland 1'
-    '2':   name: 'Nederland 2'
-    '3':   name: 'Nederland 3'
-    '4':   name: 'RTL 4'
-    '5':   name: 'E&eacute;n'
-    '6':   name: 'Canvas'
-    '18':  name: 'NGC'
-    '24':  name: 'Film 1 Premium'
-    '29':  name: 'Discovery'
-    '31':  name: 'RTL 5'
-    '34':  name: 'Veronica'
-    '36':  name: 'SBS6'
-    '37':  name: 'NET 5'
-    '46':  name: 'RTL 7'
-    '91':  name: 'Comedy Central'
-    '92':  name: 'RTL 8'
-    '435': name: '24 Kitchen'
-    '438': name: 'TLC'
-    '440': name: 'FOX'
-
 
 #
 # Utils
 #
 
-tosecs = (date) -> date.getHours() * 60 + date.getSeconds()
-now = -> tosecs(new Date())
+seconds_today = (time) -> (time - (new Date()).setHours(0, 0, 0, 0)) / 1000
 time2px = (seconds) -> HOUR_WIDTH / 3600 * seconds
+zeropad = (digit) -> if digit < 10 then '0' + digit else String(digit)
+format_time = (time) ->
+    date = new Date(time)
+    zeropad(date.getHours()) + ':' + zeropad(date.getMinutes())
 
 #
 # Models & collections
@@ -44,16 +28,18 @@ Channel = Backbone.Model.extend(
         id: null
         name: 'Some channel'
         visible: true
-
-    initialize: (attrs, options) ->
-        @programs = []
+        programs: []
 )
 
-Progam = Backbone.Model.extend(
+Program = Backbone.Model.extend(
     defaults: ->
         title: 'Some program'
-        start: null
-        end: null
+        genre: ''
+        sort: ''
+        start: 0
+        end: 0
+        #article_id: null
+        #article_title: null
 )
 
 ChannelList = Backbone.Collection.extend(
@@ -61,9 +47,15 @@ ChannelList = Backbone.Collection.extend(
     comparator: 'id'
 
     initialize: (models, options) ->
-        _.each(CHANNELS, (props, id) => @add(_.extend({id: id}, props)))
+        #_.each(CHANNELS, (props, id) => @add(_.extend({id: id}, props)))
+
         @fetchVisible()
-        #@loadPrograms(0)
+        #@fetchPrograms(0)
+
+    fetch: ->
+        @reset(CHANNELS.slice(0,3))
+        @reset(CHANNELS)
+        #$.getJSON('channels.php', (data) => @reset(data))
 
     fetchVisible: ->
         visible = if localStorage.hasOwnProperty('channels') \
@@ -83,16 +75,24 @@ ChannelList = Backbone.Collection.extend(
 
         @saveVisible() if save
 
-    loadPrograms: (day, callback) ->
-        $.get(
-            'http://www.tvgids.nl/json/lists/programs.php'
+    fetchPrograms: (day) ->
+        $.getJSON(
+            FETCH_URL
             channels: @pluck('id').join(','), day: day
             (channels) ->
-                _.each channels, (id, programs) ->
+                _.each channels, (programs, id) ->
                     channel = Channels.findWhere(id: id)
-                    channel.programs = (new Program(p) for p in programs)
-                    callback() if callback
-            'json'
+                    channel.set('programs', (
+                        new Program(
+                            title: p.titel
+                            genre: p.genre
+                            sort: p.soort
+                            start: Date.parse(p.datum_start)
+                            end: Date.parse(p.datum_end)
+                            #article_id: p.artikel_id
+                            #article_title: p.artikel_titel
+                        ) for p in programs
+                    ))
         )
 )
 
@@ -106,10 +106,19 @@ ChannelView = Backbone.View.extend(
     #template: _.template($('#channel-template').html())
 
     initialize: ->
-        $el.text(@model.title)
+        @listenTo(@model, 'change:programs', @render)
+        @listenTo(@model, 'change:visible', @toggleVisible)
+        #@$el.text(@model.get('title'))
 
     render: ->
-        $el.toggle(@model.visible)
+        @$el.empty()
+        _.each @model.get('programs'), (program) =>
+            view = new ProgramView(model: program)
+            view.render()
+            @$el.append(view.el)
+
+    toggleVisible: ->
+        @$el.toggle(@model.get('visible'))
 )
 
 ProgramView = Backbone.View.extend(
@@ -117,42 +126,70 @@ ProgramView = Backbone.View.extend(
     className: 'program'
 
     initialize: ->
-        $el.text(@model.title)
+        @$el.text(@model.get('title'))
+        from = format_time(@model.get('start'))
+        to = format_time(@model.get('end'))
+        @$el.attr('title', @model.get('title') + " (#{from} - #{to})")
+
+        left = time2px(Math.max(0, seconds_today(@model.get('start'))))
+        width = time2px(seconds_today(@model.get('end'))) - left
+        @$el.css(
+            left: left + 'px'
+            width: (width - 10) + 'px'
+        )
 
     render: ->
-        # TODO: set highlight to past/present/future
+        if @model.get('start') <= Date.now()
+            if @model.get('end') < Date.now()
+                @$el.removeClass('current').addClass('past')
+            else
+                @$el.addClass('current')
 )
 
 AppView = Backbone.View.extend(
     el: $('#guide')
 
+    events:
+        'click #yesterday': -> @loadDay(-1)
+        'click #today': -> @loadDay(0)
+        'click #tomorrow': -> @loadDay(1)
+
     initialize: ->
-        @listenTo(Channels, 'add', @addChannel)
-        @listenTo(Channels, 'reset', => Channels.each(@addChannel, @))
-        @listenTo(Channels, 'all', @render)
+        @updateIndicator()
+        @listenTo(Channels, 'reset', @addChannels)
 
-        @setDay(0, => @updateIndicator())
+        Channels.fetch()
+        @listenTo(Settings, 'change:day', @fetchPrograms)
 
-        #setInterval(=> @updateIndicator(), 3600000 / HOUR_WIDTH)
+        setInterval((=> @updateIndicator()), 3600000 / HOUR_WIDTH)
 
-    setDay: (day, callback) ->
-        Channels.loadPrograms(@day = day, callback)
+    addChannels: () ->
+        Channels.each((channel) ->
+            view = new ChannelView(model: channel)
+            view.render()
+            @$('.channels').append(view.el)
+        , @)
+        @fetchPrograms()
 
-    addChannel: (channel) ->
-        view = new ChannelView(model: channel)
-        @$('.channels').append(view.render().el)
+    loadDay: (day) ->
+        Settings.set(day: day)
+        @$('.navbar .active').removeClass('active')
+        $(@$('.navbar .navitem')[day + 1]).addClass('active')
 
     updateIndicator: ->
-        @$('.indicator').css('left', time2px(now()) + 'px')
+        @$('.indicator').css('left', time2px(seconds_today(Date.now())) + 'px')
 
-    render: ->
-        hidden
-        @$('.channel')
+    fetchPrograms: ->
+        Channels.fetchPrograms(Settings.get('day'))
 )
 
 #
 # Main
 #
 
+Settings = new (Backbone.Model.extend(
+    defaults: ->
+        day: 0
+))()
 Channels = new ChannelList()
 App = new AppView()

+ 32 - 25
index.html

@@ -6,34 +6,40 @@
     </head>
     <body>
         <div id="guide" class="guide">
+            <div class="navbar">
+                <a href="javascript:void(0);" id="yesterday" class="navitem">Gisteren</a>
+                <a href="javascript:void(0);" id="today" class="navitem active">Vandaag</a>
+                <a href="javascript:void(0);" id="tomorrow" class="navitem">Morgen</a>
+                <a href="settings.html" class="navitem">Selecteer zenders</a>
+            </div>
             <div class="timeline">
-                <div class="hour"><span class="label">00:00</span></div>
-                <div class="hour"><span class="label">01:00</span></div>
-                <div class="hour"><span class="label">02:00</span></div>
-                <div class="hour"><span class="label">03:00</span></div>
-                <div class="hour"><span class="label">04:00</span></div>
-                <div class="hour"><span class="label">05:00</span></div>
-                <div class="hour"><span class="label">06:00</span></div>
-                <div class="hour"><span class="label">07:00</span></div>
-                <div class="hour"><span class="label">08:00</span></div>
-                <div class="hour"><span class="label">09:00</span></div>
-                <div class="hour"><span class="label">10:00</span></div>
-                <div class="hour"><span class="label">11:00</span></div>
-                <div class="hour"><span class="label">12:00</span></div>
-                <div class="hour"><span class="label">13:00</span></div>
-                <div class="hour"><span class="label">14:00</span></div>
-                <div class="hour"><span class="label">15:00</span></div>
-                <div class="hour"><span class="label">16:00</span></div>
-                <div class="hour"><span class="label">17:00</span></div>
-                <div class="hour"><span class="label">18:00</span></div>
-                <div class="hour"><span class="label">19:00</span></div>
-                <div class="hour"><span class="label">20:00</span></div>
-                <div class="hour"><span class="label">21:00</span></div>
-                <div class="hour"><span class="label">22:00</span></div>
-                <div class="hour"><span class="label">23:00</span></div>
+                <div class="hour">00:00</div>
+                <div class="hour">01:00</div>
+                <div class="hour">02:00</div>
+                <div class="hour">03:00</div>
+                <div class="hour">04:00</div>
+                <div class="hour">05:00</div>
+                <div class="hour">06:00</div>
+                <div class="hour">07:00</div>
+                <div class="hour">08:00</div>
+                <div class="hour">09:00</div>
+                <div class="hour">10:00</div>
+                <div class="hour">11:00</div>
+                <div class="hour">12:00</div>
+                <div class="hour">13:00</div>
+                <div class="hour">14:00</div>
+                <div class="hour">15:00</div>
+                <div class="hour">16:00</div>
+                <div class="hour">17:00</div>
+                <div class="hour">18:00</div>
+                <div class="hour">19:00</div>
+                <div class="hour">20:00</div>
+                <div class="hour">21:00</div>
+                <div class="hour">22:00</div>
+                <div class="hour">23:00</div>
             </div>
-            <div class="indicator"></div>
             <div class="channels"></div>
+            <div class="indicator"></div>
         </div>
 
         <script src="lib/jquery-1.10.2.min.js" type="text/javascript"></script>
@@ -48,6 +54,7 @@
             </div>
         </script>
 
+        <script src="channels.js" type="text/javascript"></script>
         <script src="guide.js" type="text/javascript"></script>
     </body>
 </html>

+ 4 - 0
programs.php

@@ -0,0 +1,4 @@
+<?php
+echo file_get_contents('http://www.tvgids.nl/json/lists/programs.php?channels='
+                       . $_GET['channels'] . '&day=' . $_GET['day'])
+?>

+ 52 - 13
style.sass

@@ -1,7 +1,6 @@
 $indicator-color: red
-$timeline-height: 30px
 $hour-width: 200px
-$channel-height: 40px
+$channel-height: 34px
 
 html, body
     width: 100%
@@ -11,6 +10,24 @@ html, body
     padding: 0
 
 
+.navbar
+    background-color: #232323
+    width: 24 * $hour-width
+
+    .navitem
+        color: #9a9a9a
+        text-decoration: none
+        font: normal 13px/18px Helvetica
+        display: inline-block
+        padding: 10px 20px
+
+        &:hover
+            color: #bcbcbc
+
+        &.active
+            color: #fff
+            background-color: #1a1a1a
+
 .guide
     width: 100%
     overflow-x: scroll
@@ -18,30 +35,52 @@ html, body
     position: relative
 
 .timeline
-    height: $timeline-height
     width: 24 * $hour-width
+    height: 26px
 
     .hour
+        font: normal 13px Helvetica
         float: left
-        width: $hour-width
-        height: $timeline-height
+        width: $hour-width - 7px
+        border-left: 1px solid #444
+        padding: 5px 0 0 6px
+        height: 21px
 
     //.label
     //    width: 50px
     //    margin-left: -25px
     //    text-align: center
 
-.indicator
-    position: absolute
-    width: 1px
-    height: 100%
-    top: 0
-    background-color: $indicator-color
+.channels
+    width: 24 * $hour-width
+    overflow: hidden
 
 .channel
     position: relative
+    height: $channel-height
 
     .program
         position: absolute
-        height: $channel-height - 2px
-        border: 1px solid white
+        white-space: nowrap
+        height: $channel-height - 10px
+        padding: 8px 0 0 8px
+        border-left: 2px solid white
+        background-color: #eee
+        font: normal 13px/15px Helvetica
+        overflow: hidden
+        color: #555
+
+        &.past
+            background-color: #ececec
+            color: #aaa
+
+        &.current
+            background-color: #ddd
+            color: #444
+
+.indicator
+    position: absolute
+    width: 1px
+    height: 100%
+    top: 0
+    background-color: $indicator-color

Някои файлове не бяха показани, защото твърде много файлове са промени