<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="TV Gids"
             title_url="http://www.rtl.nl/service/gids/"
             author="Bas Hennekam."
             author_email="bashennekam@gmail.com"
             author_location="Utrecht, the Netherlands"
             category="tools"
             description="Nederlandse TV Gids - Nu en Straks, bekijken per zender of per genre. De volgende genres zijn er: comedy, documentaire, film, muziek, natuur en sport. En de volgende zenders: Nederland 1, Nederland 2, Nederland 3, RTL 4, RTL 5, RTL 7, RTL 8, SBS 6, Veronica, NET 5, Nickelodeon, Cartoon Network, MTV, TMF, Comedy Central, Discovery Channel, National Geographic, Animal Planet, VRT TV1, Canvas/Ketbet, BVN-TV, BBC 1, BBC 2, BBC World, CNN International, Eurosport, Sport 1, Film 1, Film 2, TCM, ARD, ZDF, WDR, NDR Fernsehen, Sudwest Fernsehen, RTL Television, SAT 1, 3 Sat, Pro Sieben, VTM, Kanaal 2, VT4, ARTE, Mezzo, TV 5 Europe, RAI Uno, TRT int, TVE Internacional, La Une, La Deux en AT 5. Dit is een hele lijst, maar in de gadget is in te stellen (configuratie icoontje rechtsboven klikken) welke zenders voor jou van toepassing zijn."
             screenshot="http://gadgets.bashennekam.nl/tvgids/google_gadget_tvgids_screen.png"
             thumbnail="http://gadgets.bashennekam.nl/tvgids/google_gadget_tvgids_thumb.png"
             height="400"
             width="400">
<Require feature="dynamic-height" />
<Require feature="setprefs" />
<Require feature="analytics"/>
</ModulePrefs>

<UserPref name="channels" datatype="hidden" default_value="Z1|Z2|Z3|Z4|Z31|Z46|Z92|Z36|Z34|Z37"/>
<UserPref name="day" datatype="hidden" default_value="0"/>
<UserPref name="lastchannel" datatype="hidden" default_value="nustraks"/>

<Content type="html">
<![CDATA[
<!-- ALm6fM1_m75aGKk24EkJkvMvWWAzDGFkRKY-HGEl2ywFy5FfjVhN-8fWVzt1gU34vVrpGRFqWm001kKAiOIko_kvcpJjLIJlRQi4BKAol-OE9NvtUnN0L73PX4yD7DfOMeHOUQNJrGI-bFHDIH7mlxtIcNwCSW0dJke_rj9ECHT9ji0h-o9C4vhNU5XMvP0rsJdM0WGLrr53 -->

<script language="Javascript" type="text/javascript">
_IG_Analytics("UA-3622119-2", "/GadgetTvGids/load");

var prefs = new _IG_Prefs(__MODULE_ID__);
var json = new Object();
var imagelocation = 'http://gadgets.bashennekam.nl/tvgids/small/';
var channels = [
  { id:'Z1', name:'Nederland 1' },  
  { id:'Z2', name:'Nederland 2' },
  { id:'Z3', name:'Nederland 3' },  
  { id:'Z4', name:'RTL 4' },  
  { id:'Z31', name:'RTL 5' },  
  { id:'Z46', name:'RTL 7' },  
  { id:'Z92', name:'RTL 8' },  
  { id:'Z36', name:'SBS 6' },  
  { id:'Z34', name:'Veronica/Jetix' },  
  { id:'Z37', name:'NET 5' },  
  { id:'Z25', name:'MTV' },  
  { id:'Z35', name:'TMF' },  
  { id:'Z70', name:'Comedy Central' },
  { id:'Z29', name:'Discovery Channel' },  
  { id:'Z18', name:'National Geographic' },  
  { id:'Z65', name:'Animal Planet' },    
  { id:'Z6', name:'Ketnet/Canvas' },   
  { id:'Z7', name:'BBC 1' },
  { id:'Z8', name:'BBC 2' },   
  { id:'Z26', name:'CNN' },  
  { id:'Z19', name:'Eurosport' },  
  { id:'Z10', name:'ZDF' },
  { id:'Z12', name:'WDR Fehrsehen' },
  { id:'Z9', name:'ARD' },  
  { id:'Z32', name:'TRT int' },  
  { id:'Z71', name:'Een' },
  { id:'Z72', name:'Het Gesprek' }
  
  //{ id:'Z89', name:'Nickelodeon' },
  //{ id:'Z21', name:'Cartoon Network' },
  //{ id:'Z5', name:'VRT TV1' }, 
  //{ id:'Z90', name:'BVN-TV' }, 
  //{ id:'Z86', name:'BBC World' }, 
  //{ id:'Z99', name:'Sport 1' },
  //{ id:'Z24', name:'Film 1' },
  //{ id:'Z39', name:'Film 2' },
  //{ id:'Z20', name:'TCM' },
  //{ id:'Z9', name:'ARD' },
  //{ id:'Z87', name:'TVE Internacional' },
  //{ id:'Z15', name:'La Une' },
  //{ id:'Z16', name:'La Deux' },
  //{ id:'Z40', name:'AT 5' },
  //{ id:'Z13', name:'NDR Fernsehen' },
  //{ id:'Z14', name:'Sudwest Fernsehen' },
  //{ id:'Z11', name:'RTL Television' },
  //{ id:'Z28', name:'SAT 1' },
  //{ id:'Z50', name:'3 Sat' },
  //{ id:'Z58', name:'Pro Sieben' },
  //{ id:'Z49', name:'VTM' },
  //{ id:'Z59', name:'Kanaal 2' },
  //{ id:'Z60', name:'VT4' },
  //{ id:'Z38', name:'ARTE' },
  //{ id:'Z73', name:'Mezzo' },
  //{ id:'Z17', name:'TV 5 Europe' },
  //{ id:'Z27', name:'RAI Uno' },
];
var genres = [
  { id:'16', name:'comedy' },
  { id:'17', name:'documentaire' },
  { id:'4', name:'film' },
  { id:'7', name:'muziek' },
  { id:'8', name:'natuur' },
  { id:'13', name:'sport' }
]
  
function load() {
  show('loading');
  var dag = _gel('dag').options[_gel('dag').selectedIndex].value;
  var url = 'http://www.rtl.nl/active/epg_data/dag_data/' + dag;
  
  _IG_FetchContent(url, function(xml) {
    try {		
      xml = xml.replace('</epg_result>','');
      xml = xml.replace(/(.*)\'object\'>/,'');
      json = eval("(" + xml + ")");
      display();
    } catch(e) {
      _gel('error').innerHTML = 'Error: Er is een fout opgetreden, probeer het later nogmaals.';
      show('error');
    }
  });
}

function display() {
  var channelid = _gel('zender').options[_gel('zender').selectedIndex].value;
  var dayid = _gel('dag').options[_gel('dag').selectedIndex].value;
  prefs.set('lastchannel',channelid);
  prefs.set('day',dayid);
  _gel('dag').disabled = false;
  if(channelid == 'nustraks') {
    nustraks();
    _gel('dag').disabled = true;
  } else {
    if(channelid.length > 6) {
      if(channelid.substr(0,6) == 'genre_') { 
        genre()
      } else {
        channel(channelid);
      }
    } else {
      channel(channelid);
    }
  }
  show('results');
}

function channel(channelid) {
  prefs.set('lastchannel',channelid);
  for(var i=0;i<_gel('zender').options.length;i++) {
    _gel('zender').options[i].selected = (_gel('zender').options[i].value == channelid) ? true : false;
  }
  _gel('dag').disabled = false;
  
  var html = new Array();  
  html.push('<table>');
  
  var channelimg = _IG_GetCachedUrl(imagelocation + ChannelById(channelid).id.replace('Z','') + '.gif');
  html.push('<tr>');  
  html.push('<td colspan="3" class="channel"><img class="img" alt="'+ChannelById(channelid).name+'" title="'+ChannelById(channelid).name+'" src="'+channelimg+'" /></td>');
  html.push('</tr>'); 
  
  var last = true;
  for(var i=1;i<json[channelid].length;i++) {   
    var css = ' normal';
    if(_gel('dag').options[_gel('dag').selectedIndex].value == '0') {
      css = (currentProgram(channelid, json[channelid][i][2])) ? ' active' : ' normal';
      if(currentProgram(channelid, json[channelid][i][2])) last = false;
    } else {
      last = (parseFloat(_gel('dag').options[_gel('dag').selectedIndex].value) > 0) ? false : true;
    }
    css = (last) ? ' last' : css;
    html.push('<tr class="program' + css + '">');
    html.push('<td class="time">' + json[channelid][i][0] + '</td>');
    html.push('<td class="title"><a href="#" onclick="loadshow(\''+json[channelid][i][2]+'\')">' + json[channelid][i][1] + '</a></td>');
    html.push('<td class="genre">' + GenreById(json[channelid][i][3]) + '</td>');  
    html.push('</tr>');
  }
  html.push('</table>');
  _gel('list').innerHTML = html.join('');  
}
  
function nustraks() {  
  if(_gel('dag').options[_gel('dag').selectedIndex].value != '0') {
    for(var i=0;i<_gel('dag').options.length;i++) {
      _gel('dag').options[i].selected = (_gel('dag').options[i].value == '0') ? true : false;
    }
    load();
  }
  
  var html = new Array();
  html.push('<table>');
  for(var j=0;j<channels.length;j++) {
    if(channels[j].active) {
      var channelid = channels[j].id;
      for(var i=1;i<json[channelid].length;i++) {
        if(currentProgram(channelid, json[channelid][i][2])) {
          html.push('<tr class="program normal">');
          //html.push('<td class="channel">' + channels[j].name + '</td>');
          var channelimg = _IG_GetCachedUrl(imagelocation + channels[j].id.replace('Z','') + '.gif');
          html.push('<td class="channel"><img onclick="channel(\''+channels[j].id+'\');show(\'results\');" class="img click" alt="'+channels[j].name+'" title="'+channels[j].name+'" src="'+channelimg+'" /></td>');
          html.push('<td class="time">' + json[channelid][i][0] + '</td>');
          html.push('<td class="title"><a href="#" onclick="loadshow(\''+json[channelid][i][2]+'\')">' + json[channelid][i][1] + '</a></td>');
          //html.push('</tr>');
          if((i+1) < json[channelid].length) {
            //html.push('<tr class="program">');
            //html.push('<td class="channel">&nbsp;</td>');
            html.push('<td class="time">' + json[channelid][i+1][0] + '</td>');
            html.push('<td class="title"><a href="#" onclick="loadshow(\''+json[channelid][i+1][2]+'\')">' + json[channelid][i+1][1] + '</a></td>');
            html.push('</tr>');
          } else {
            html.push('<td colspan="2">&nbsp;</td>');
            html.push('</tr>');
          }
        }
      }
    }
  }
  html.push('</table>');
  _gel('list').innerHTML = html.join('');  
}
  
function genre() { 
  var genreid = _gel('zender').options[_gel('zender').selectedIndex].value.replace('genre_','');
  var html = new Array();
  html.push('<table>');
  for(var j=0;j<channels.length;j++) {
    if(channels[j].active) {
      var channelid = channels[j].id;
      for(var i=1;i<json[channelid].length;i++) {
        if(genreid == json[channelid][i][3]) {
          html.push('<tr class="program normal">');
          var channelimg = _IG_GetCachedUrl(imagelocation + channels[j].id.replace('Z','') + '.gif');
          html.push('<td class="channel"><img onclick="channel(\''+channels[j].id+'\');show(\'results\');" class="img click" alt="'+channels[j].name+'" title="'+channels[j].name+'" src="'+channelimg+'" /></td>');
          //html.push('<td class="channel">' + channels[j].name + '</td>');
          html.push('<td class="time">' + json[channelid][i][0] + '</td>');
          html.push('<td class="title"><a href="#" onclick="loadshow(\''+json[channelid][i][2]+'\')">' + json[channelid][i][1] + '</a></td>');
          html.push('</tr>');  
        }      
      }
    }
  }
  html.push('</table>');
  _gel('list').innerHTML = html.join('');  
}
  
function loadshow(showid) {
  show('loading');
  var url = 'http://www.rtl.nl/active/epg_data/uitzending_data/' + showid;
  
  _IG_FetchXmlContent(url, function(xml) {
    try {
      displayshow(showid,xml);
    } catch(e) {
      show('results');
      alert('Er is een fout opgetreden bij het ophalen van de informatie over dit programma.');            
    }
  });
}
  
function displayshow(showid,xml) {
  var uitzending_data_item = xml.getElementsByTagName('uitzending_data_item').item(0);
  var channelid = 'Z' + GetXmlValue(uitzending_data_item,'zendernr');
  var title = GetXmlValue(uitzending_data_item,'titel');
  var begintime = GetXmlValue(uitzending_data_item,'begintijd');  
  var endtime = NextShowById(showid);
  endtime = (endtime) ? endtime[0] : GetXmlValue(uitzending_data_item,'eindtijd');
  endtime = (endtime.length > 1) ? endtime : '?';  
  var description = GetXmlValue(uitzending_data_item,'alginhoud');
  description = (description.length > 1) ? description : 'Geen nadere informatie beschikbaar.';
  var channelimg = _IG_GetCachedUrl(imagelocation + ChannelById(channelid).id.replace('Z','') + '.gif');
  
  var genre = GetXmlValue(uitzending_data_item,'genre');
  var bollogo = _IG_GetCachedUrl('http://gadgets.bashennekam.nl/tvgids/bol.gif');
  var imdblogo = _IG_GetCachedUrl('http://gadgets.bashennekam.nl/tvgids/imdb.gif');
  
  var html = new Array();
  html.push('<table>');
  html.push('<tr>');
  html.push('<td class="show-title">'+title+'</td>');
  html.push('<td class="show-image"><img onclick="channel(\''+channelid+'\');show(\'results\');" class="img click" alt="'+ChannelById(channelid).name+'" title="'+ChannelById(channelid).name+'" src="'+channelimg+'" /></td>');
  html.push('</tr>');
  html.push('<tr><td colspan="2" class="show-time">'+begintime+' - '+endtime+'</td></tr>');
  html.push('<tr><td colspan="2" class="show-description">'+description+'</td></tr>');
  //html.push('<tr><td colspan="2" class="show-ads">');
  //html.push('<a target="_blank" href="http://clk.tradedoubler.com/click?p=67859&g=17299284&a=1630444&td_Section=DVD&td_QueryType=Keyword&td_SearchText=' + title + '"><img src="' + bollogo + '" title="Direct bestellen - bol.com" /></a>');
  //if(genre.toLowerCase() == 'film') html.push('<a target="_blank" href="http://www.imdb.com/find?s=all&q=' + title.replace(/ /ig,'+') + '"><img src="' + imdblogo + '" title="Meer film info - imdb.com" /></a>');
  //html.push('</td></tr>');
  html.push('</table>');
  _gel('show-result').innerHTML = html.join('');
  
  show('show');
}

function GetXmlValue(xml,node) {
  try {
    return xml.getElementsByTagName(node).item(0).firstChild.nodeValue;
  } catch(e) {
    return '';
  }
}
  
function currentProgram(channelid, id) {
  var currentDT = new Date();
  var currentTime = currentDT.getHours();
  currentTime += (currentDT.getMinutes() < 10) ? '0' : '';
  currentTime += currentDT.getMinutes();
  currentTime = parseFloat(currentTime);
  var programStartTime = 0;
  var programEndTime = 0;
  for(var i=1;i<json[channelid].length;i++) {
    if(json[channelid][i][2] == id) {
      programStartTime = parseFloat(json[channelid][i][0].replace(':',''));      
      if((i+1) < json[channelid].length) {        
        programEndTime = parseFloat(json[channelid][i+1][0].replace(':',''));
        programEndTime = (programEndTime < programStartTime) ? programEndTime + 2400 : programEndTime;
      }
    }
  }
  if(currentTime < programStartTime) {
    return false;
  } else {
    return ((currentTime >= programStartTime) && (currentTime < programEndTime)) ? true : false;
  }
}
  
function show(id) {
  _gel('loading').style.display = (id == 'loading') ? '' : 'none';
  _gel('results').style.display = (id == 'results') ? '' : 'none';
  _gel('error').style.display = (id == 'error') ? '' : 'none';
  _gel('settings').style.display = (id == 'settings') ? '' : 'none';
  _gel('show').style.display = (id == 'show') ? '' : 'none';
  if(id != 'loading') _IG_AdjustIFrameHeight();
}
  
function GenreById(id) {
  for(var i=0;i<genres.length;i++) {
    if(genres[i].id == id) return genres[i].name;
  }
  return '&nbsp;';
}
  
function ChannelById(id) {
  for(var i=0;i<channels.length;i++) {
    if(channels[i].id == id) return channels[i];
  }
  return;
}
  
function NextShowById(id) {
  for(var channelid in json) {
    for(var i=0;i<json[channelid].length;i++) {
      if(json[channelid][i][2] == id) {
        if((i+1) < json[channelid].length) {
          return json[channelid][i+1];
        } else {
          return;
        }
      }
    }
  }
}
 
function loadsettings() {  
  var html = new Array();
  html.push('<table>');
  for(var i=0;i<channels.length;i++) {
    channels[i].active = activechannel(channels[i].id);
    var checked = (channels[i].active) ? 'CHECKED' : '';
    var channelimg = _IG_GetCachedUrl(imagelocation + channels[i].id.replace('Z','') + '.gif');
    html.push('<tr>');    
    html.push('<td class="checkbox"><input type="checkbox" value="' + channels[i].id + '" '+checked+'/></td>');
    html.push('<td><img class="img" alt="'+channels[i].name+'" title="'+channels[i].name+'" src="'+channelimg+'" /></td>');
    html.push('<td class="channel">' + channels[i].name + '</td>');
    html.push('</tr>');
  }
  html.push('</table>');
  _gel('channellist').innerHTML = html.join('');
  createdropdown();
}
  
function savesettings() {
  var settings = _gel('channellist').getElementsByTagName('input');
  var settingsstring = '';
  for(var i=0;i<settings.length;i++) {
    if(settings[i].checked) {      
      settingsstring += (settingsstring.length > 0) ? '|' + settings[i].value : settings[i].value;
    }
  }
  prefs.set('channels',settingsstring);  
  loadsettings();
}
  
function activechannel(channelid) {
  var prefsChannels = prefs.getString('channels').split('|');
  for(var j=0;j<prefsChannels.length;j++) {
    if(prefsChannels[j] == channelid) return true;
  }
  return false;
}
  
function createdropdown() {
  while(_gel('zender').firstChild) {
    _gel('zender').removeChild(_gel('zender').firstChild);
  }
  _gel('zender').options.add(new Option('Nu & Straks','nustraks'));   
  
  var gGroup = document.createElement('optgroup');
  gGroup.label = 'Genres';
  for(var i=0;i<genres.length;i++) {
    var gOption = document.createElement('option');
    gOption.value = 'genre_'+genres[i].id;
    gOption.innerText = genres[i].name;   
    gOption.text = genres[i].name; 
    gGroup.appendChild(gOption);
  } 
  _gel('zender').appendChild(gGroup);
  
  var zGroup = document.createElement('optgroup');
  zGroup.label = 'Zenders';
  for(var i=0;i<channels.length;i++) {
    if(channels[i].active) {
      var zOption = document.createElement('option');
      zOption.value = channels[i].id;
      zOption.innerText = channels[i].name;
      zOption.text = channels[i].name;  
      zGroup.appendChild(zOption);
    }
  }  
  _gel('zender').appendChild(zGroup);
  
  var found = false;
  for(var i=0;i<_gel('zender').options.length;i++) {
    if(_gel('zender').options[i].value == prefs.getString('lastchannel')) {
      _gel('zender').options[i].selected = true;
      found = true;
    } else {
      _gel('zender').options[i].selected = false;
    }
  }
  if(!found) _gel('zender').options[0].selected = true;
  
  for(var i=0;i<_gel('dag').options.length;i++) {
    if(_gel('dag').options[i].value == prefs.getString('day')) {
      _gel('dag').options[i].selected = true;
    } else {
      _gel('dag').options[i].selected = false;
    }
  }
}
    
window.onload = function() {  
  loadsettings();
  load();
};
</script>
  
<style>
body, td, div, span, p, th, select, option, input {
  font-family: Arial;
  font-size: 8pt;
}
table {
  width: 100%;
  border-collapse: collapse;
}
td {  
  padding: 0px;  
}
img {
	border: none;
}
  
#zender,
#dag {
  padding: 2px;
}
#list {
  padding: 5px 0px 0px 0px;
}
.header {
  background: #7185AA url('http://gadgets.bashennekam.nl/tvgids/google_gadget_tvgids_bg.jpg');
  background-repeat: repeat-x;
  padding: 3px;
  font-weight: bold;
  color: #FFFFFF;
}
.header a:link,
.header a:visited,
.header a:active {
  text-decoration: none;
  color: #FFFFFF;
  font-weight: bold;
}
.header a:hover {
  text-decoration: underline;
  color: #FFFFFF;
  font-weight: bold;
}
.list {
  width: 100%;
  max-height: 350px;
  overflow-x: hidden;
  overflow-y: auto;
  height: expression(this.scrollHeight > 350 ? "350px" : "auto");  
}

#results td {
  vertical-align: top;
  border-bottom: solid 1px #DDDDDD;
}
#results a:link,
#results a:visited,
#results a:active {
  text-decoration: none;
  
}
#results a:hover {
  text-decoration: underline;
}

.channel {
  color: #333333;
  padding: 0px 5px 0px 0px;
}
.program {
  
}
.active {
  background-color: #7185AA;
  font-weight: bold;
}
.active,
.active a:link,
.active a:visited,
.active a:active,
.active a:hover {
  color: #FFFFFF;
}
.last,
.last a:link,
.last a:visited,
.last a:active,
.last a:hover {
  color: #666666;
}
.normal,
.normal a:link,
.normal a:visited,
.normal a:active,
.normal a:hover {
  color: #000000;
}
.time {
  font-weight: bold;
  padding: 0px 5px 0px 0px;
}
.title {
  padding: 0px 5px 0px 0px;
}
.genre {
  text-align: right;
  padding: 0px 5px 0px 0px;
  color: #555555;
}
.img {
  width: 39px;
  height: 24px;
}
.click {
  cursor: pointer;
}

#settings td {
  vertical-align: middle;
  border-bottom: solid 1px #DDDDDD;
} 
#settings-link {
  cursor: pointer;
  float: right;
}
#channellist {
  margin: 0px 0px 3px 0px;
  padding: 5px 0px 0px 0px;
}
.checkbox {
  width: 25px;
}
  
.show-title {
  font-weight: bold;
}
.show-time {
  color: #555555;
}
.show-description {
  padding: 5px 0px 0px 0px;
}
.show-image {
  text-align: right;
}
.show-ads img {
	width: 80px;
	height: 32px;
	margin: 10px 5px 5px 0px;
}
</style>

<div id="loading"><center>Even geduld a.u.b.</center></div>

<div id="results" style="display:none">
  <div class="header">
    <div id="settings-link" onclick="show('settings')">
      <img src="http://gadgets.bashennekam.nl/tvgids/google_gadget_tvgids_settings.gif" title="instellingen" alt="instellingen" />
    </div>
    <select id="zender" onchange="display()"></select>
    <select id="dag" onchange="load()">
      <option value="-1">Gisteren</option>
      <option value="0">Vandaag</option>
      <option value="1">Morgen</option>
      <option value="2">Overmorgen</option>
      <option value="3">Over 3 dagen</option>
      <option value="4">Over 4 dagen</option>
      <option value="5">Over 5 dagen</option>
      <option value="6">Over 6 dagen</option>
      <option value="7">Over 7 dagen</option>
    </select>
  </div>
  <div id="list"></div>
</div>

<div id="show" style="display:none">
   <div class="header">
     <a href="#" onclick="show('results');return false">&laquo; terug</a>
   </div>
   <div id="show-result"></div>
   <br />
   <script type="text/javascript"><!--
    google_ad_client = "pub-6497214114655846";
    /* 234x60, created 1/6/09 */
    google_ad_slot = "8002917734";
    google_ad_width = 234;
    google_ad_height = 60;
    //-->
  </script>
  <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
</div>

<div id="settings" style="display:none">
  <div class="header">Stel hier uw zenders in:</div>   
  <div id="channellist" class="list"></div>
  <input type="button" onclick="savesettings();display();" value="Opslaan" style="font-weight:bold" />
  <input type="button" onclick="loadsettings();display();" value="Annuleren" />
</div>

<div id="error" style="display:none"></div>

]]>
</Content>

</Module>























