// web service
var CoreServiceLocation = "http://data.ninemsn.com.au/Services/Service.axd?ServiceFormat=JSON&ServiceName=NewZealand&ServiceAction=GetTVGuideScheduleV2";
// poisitions the pop-up in close proximity of the program
var modOperator = 590;
var yCordOffSet = 568;
// maximum number of banners that can go in as advertisements between the Guide listings
var maxDivSchedules = 10;
// time different when DST in place
var dstTimeDifference = - 11;
// position an ad-banner after seven rows of channels
var repeatAfter = 7;
var ProgramsInPast = new Array();
// dictionary of channel id : rendering sequence, to sort the JSON object
var AllChannels = {
   "7" : "10", "6" : "20", "1" : "30", "24072" : "40", "31" : "50", "10" : "60", "11" : "70", "12" : "80", "13" : "90", "15" : "100", "14" : "110", "16" : "120", "17" : "130", "30" : "140", "19" : "150", "20" : "160", "21" : "170", "22" : "180", "23" : "190", "24" : "200", "4" : "210", "25" : "220", "26" : "230", "43" : "240", "28" : "250", "29" : "260", "54" : "270", "33" : "280", "34" : "290", "35" : "300", "36" : "310", "41" : "320", "70" : "330", "40" : "340", "39" : "350", "37" : "360", "38" : "370", "71" : "380", "5" : "390", "50" : "400", "51" : "410", "52" : "420", "53" : "430", "56" : "440", "42" : "450", "55" : "460", "57" : "470", "59" : "480", "58" : "490", "62" : "500", "60" : "510", "61" : "520", "63" : "530", "64" : "540", "65" : "550", "66" : "560", "67" : "570"};
var numberOfPixelsPerMinute = 3;
var earlyHoursTVCommencesAt = "00:00";
var morningTVCommencesAt = "06:00";
var afternoonTVCommencesAt = "12:00";
var primeTimeTVCommencesAt = "18:00";
var containerWidth = "450px";
var SlidingDivWidth = "30330px";
var leastWidthAllowed = "90";
var lastPointAt = parseInt(SlidingDivWidth) - parseInt(containerWidth);
var arrAllChannels = new Array();
var arrAllPrograms = new Array();
var arrTimeSlots = new Array();
var arrSetOfRenderingChannels = new Array();
var arrSetOfCurrentChannels = new Array();
var glByMinutes;
var tvScheduleSlidingDivCommencesAt = new Date();
var TimeRange = new Object();
var tempString = new String();
var arrMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var arrDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var totalAdDivs = ['10', '15', '22', '29', '36', '43'];
var totalAdDivsForFTA = ['70'];
var BASETIME;
var FINALTIME;
var freshData;
var setOfAllChannels = [ {
   ChannelRenderingSequence : "10", ChannelID : "7", ChannelFTA : "0", ChannelAbbreviation : "TVONE", ChannelName : "TV ONE"}
, {
   ChannelRenderingSequence : "20", ChannelID : "6", ChannelFTA : "0", ChannelAbbreviation : "TV2", ChannelName : "TV2"}
, {
   ChannelRenderingSequence : "30", ChannelID : "1", ChannelFTA : "0", ChannelAbbreviation : "TV3", ChannelName : "TV3"}
, {
   ChannelRenderingSequence : "40", ChannelID : "24072", ChannelFTA : "0", ChannelAbbreviation : "C4", ChannelName : "C4TV"}
, {
   ChannelRenderingSequence : "50", ChannelID : "31", ChannelFTA : "0", ChannelAbbreviation : "PRIM", ChannelName : "PRIME"}
,
 { ChannelRenderingSequence : "60", ChannelID : "10", ChannelFTA : "1", ChannelAbbreviation : "ALT1", ChannelName : "ALT TV"}, 
{
   ChannelRenderingSequence : "70", ChannelID : "11", ChannelFTA : "1", ChannelAbbreviation : "ANIM", ChannelName : "Animal Planet"}
, {
   ChannelRenderingSequence : "80", ChannelID : "12", ChannelFTA : "1", ChannelAbbreviation : "ARTS", ChannelName : "Arts Channel"}
, {
   ChannelRenderingSequence : "90", ChannelID : "13", ChannelFTA : "1", ChannelAbbreviation : "BBCV", ChannelName : "BBC World News"}
, {
   ChannelRenderingSequence : "100", ChannelID : "15", ChannelFTA : "1", ChannelAbbreviation : "CRTN", ChannelName : "Cartoon Network"}
, {
   ChannelRenderingSequence : "110", ChannelID : "14", ChannelFTA : "1", ChannelAbbreviation : "CNNS", ChannelName : "CNNS"}
, {
   ChannelRenderingSequence : "120", ChannelID : "16", ChannelFTA : "1", ChannelAbbreviation : "DISC", ChannelName : "Discovery Channel"}
, {
   ChannelRenderingSequence : "130", ChannelID : "17", ChannelFTA : "1", ChannelAbbreviation : "DISN", ChannelName : "Disney Channel"}
, {
   ChannelRenderingSequence : "140", ChannelID : "30", ChannelFTA : "1", ChannelAbbreviation : "PHSD", ChannelName : "Disney Playhouse"}
, {
   ChannelRenderingSequence : "150", ChannelID : "19", ChannelFTA : "1", ChannelAbbreviation : "DOCO", ChannelName : "Documentary"}
, {
   ChannelRenderingSequence : "160", ChannelID : "20", ChannelFTA : "1", ChannelAbbreviation : "ECHL", ChannelName : "E! Channel"}
, {
   ChannelRenderingSequence : "170", ChannelID : "21", ChannelFTA : "1", ChannelAbbreviation : "ESPN", ChannelName : "ESPN"}
, {
   ChannelRenderingSequence : "180", ChannelID : "22", ChannelFTA : "1", ChannelAbbreviation : "FOOD", ChannelName : "Food Television"}
, {
   ChannelRenderingSequence : "190", ChannelID : "23", ChannelFTA : "1", ChannelAbbreviation : "FOXN", ChannelName : "Fox News"}
, {
   ChannelRenderingSequence : "200", ChannelID : "24", ChannelFTA : "1", ChannelAbbreviation : "HIST", ChannelName : "History Channel"}
, {
   ChannelRenderingSequence : "210", ChannelID : "4", ChannelFTA : "1", ChannelAbbreviation : "JUIC", ChannelName : "Juice TV"}
, {
   ChannelRenderingSequence : "220", ChannelID : "25", ChannelFTA : "1", ChannelAbbreviation : "LIVI", ChannelName : "Living Channel"}
, {
   ChannelRenderingSequence : "230", ChannelID : "26", ChannelFTA : "1", ChannelAbbreviation : "MGMM", ChannelName : "MGM Movie Channel"}
, {
   ChannelRenderingSequence : "240", ChannelID : "43", ChannelFTA : "1", ChannelAbbreviation : "MTV1", ChannelName : "MTV"}
, {
   ChannelRenderingSequence : "250", ChannelID : "28", ChannelFTA : "1", ChannelAbbreviation : "NATG", ChannelName : "National Geographic"}
, {
   ChannelRenderingSequence : "260", ChannelID : "29", ChannelFTA : "1", ChannelAbbreviation : "NICK", ChannelName : "Nickelodeon"}
, {
   ChannelRenderingSequence : "270", ChannelID : "54", ChannelFTA : "1", ChannelAbbreviation : "SUND", ChannelName : "Rialto"}
, {
   ChannelRenderingSequence : "280", ChannelID : "33", ChannelFTA : "1", ChannelAbbreviation : "SBM2", ChannelName : "SBM2"}
, {
   ChannelRenderingSequence : "290", ChannelID : "34", ChannelFTA : "1", ChannelAbbreviation : "SBM3", ChannelName : "SBM3"}
, {
   ChannelRenderingSequence : "300", ChannelID : "35", ChannelFTA : "1", ChannelAbbreviation : "SBM4", ChannelName : "SBM4"}
, {
   ChannelRenderingSequence : "310", ChannelID : "36", ChannelFTA : "1", ChannelAbbreviation : "SBM5", ChannelName : "SBM5"}
, {
   ChannelRenderingSequence : "320", ChannelID : "41", ChannelFTA : "1", ChannelAbbreviation : "SHIN", ChannelName : "Shine"}
, {
   ChannelRenderingSequence : "330", ChannelID : "70", ChannelFTA : "1", ChannelAbbreviation : "SKRU", ChannelName : "SKRU"}
, {
   ChannelRenderingSequence : "340", ChannelID : "40", ChannelFTA : "1", ChannelAbbreviation : "SBOX", ChannelName : "SKY Box Office 200"}
, {
   ChannelRenderingSequence : "350", ChannelID : "39", ChannelFTA : "1", ChannelAbbreviation : "SBOM", ChannelName : "SKY Box Office 201"}
, {
   ChannelRenderingSequence : "360", ChannelID : "37", ChannelFTA : "1", ChannelAbbreviation : "SBM6", ChannelName : "SKY Box Office 206"}
, {
   ChannelRenderingSequence : "370", ChannelID : "38", ChannelFTA : "1", ChannelAbbreviation : "SBM7", ChannelName : "SKY Box Office 207"}
, {
   ChannelRenderingSequence : "380", ChannelID : "71", ChannelFTA : "1", ChannelAbbreviation : "MOV1", ChannelName : "Sky Movies"}
, {
   ChannelRenderingSequence : "390", ChannelID : "5", ChannelFTA : "1", ChannelAbbreviation : "NEWS", ChannelName : "SKY News NZ"}
, {
   ChannelRenderingSequence : "400", ChannelID : "50", ChannelFTA : "1", ChannelAbbreviation : "SLTV", ChannelName : "SLTV"}
, {
   ChannelRenderingSequence : "410", ChannelID : "51", ChannelFTA : "1", ChannelAbbreviation : "SPT1", ChannelName : "SPT1"}
, {
   ChannelRenderingSequence : "420", ChannelID : "52", ChannelFTA : "1", ChannelAbbreviation : "SPT2", ChannelName : "SPT2"}
, {
   ChannelRenderingSequence : "430", ChannelID : "53", ChannelFTA : "1", ChannelAbbreviation : "SPT3", ChannelName : "SPT3"}
, {
   ChannelRenderingSequence : "440", ChannelID : "56", ChannelFTA : "1", ChannelAbbreviation : "TCM1", ChannelName : "TCM1"}
, {
   ChannelRenderingSequence : "450", ChannelID : "42", ChannelFTA : "1", ChannelAbbreviation : "SKY1", ChannelName : "The Box"}
, {
   ChannelRenderingSequence : "460", ChannelID : "55", ChannelFTA : "1", ChannelAbbreviation : "TAB1", ChannelName : "Trackside"}
, {
   ChannelRenderingSequence : "470", ChannelID : "57", ChannelFTA : "1", ChannelAbbreviation : "TV4", ChannelName : "TV Four"}
, {
   ChannelRenderingSequence : "480", ChannelID : "59", ChannelFTA : "1", ChannelAbbreviation : "WSK3", ChannelName : "TV3"}
, {
   ChannelRenderingSequence : "490", ChannelID : "58", ChannelFTA : "1", ChannelAbbreviation : "UKTV", ChannelName : "UKTV"}
, {
   ChannelRenderingSequence : "500", ChannelID : "62", ChannelFTA : "1", ChannelAbbreviation : "WTV3", ChannelName : "WTV CTV2"}
, {
   ChannelRenderingSequence : "510", ChannelID : "60", ChannelFTA : "1", ChannelAbbreviation : "WTV1", ChannelName : "WTV JTV"}
, {
   ChannelRenderingSequence : "520", ChannelID : "61", ChannelFTA : "1", ChannelAbbreviation : "WTV2", ChannelName : "WTV2"}
, {
   ChannelRenderingSequence : "530", ChannelID : "63", ChannelFTA : "1", ChannelAbbreviation : "WTV4", ChannelName : "WTV4"}
, {
   ChannelRenderingSequence : "540", ChannelID : "64", ChannelFTA : "1", ChannelAbbreviation : "WTV5", ChannelName : "WTV5"}
, {
   ChannelRenderingSequence : "550", ChannelID : "65", ChannelFTA : "1", ChannelAbbreviation : "WTV6", ChannelName : "WTV6"}
, {
   ChannelRenderingSequence : "560", ChannelID : "66", ChannelFTA : "1", ChannelAbbreviation : "WTV7", ChannelName : "WTV7"}
, {
   ChannelRenderingSequence : "570", ChannelID : "67", ChannelFTA : "1", ChannelAbbreviation : "WTV9", ChannelName : "WTV9"}
];
window.onload = function() {
   fncInitialise();
   }
function fncInitialise() {
   if(!document.getElementById("tvg_wrapper")) return;
   var containerToAttachTo = document.getElementById("tvg_wrapper");
   fncSetDefaultsForDropDowns();
   fncDetermineTheBaseAndFinalTime();
   fncInitiateProcessing();
   };
function fncSetDefaultsForDropDowns() {
   if(document.getElementById("show_day")) {
      var SelectToAppend = document.getElementById("show_day");
      var today = new Date();
      var yesterday = new Date();
      var tomorrow = new Date();
      var dayOption = document.createElement("option");
      SelectToAppend.appendChild(dayOption);
      dayOption.innerHTML = "Today";
      dayOption.setAttribute("value", today.toDateString());
      document.getElementById("show_day").value = "0";
      var nextDay = new Date();
      nextDay.setDate(today.getDate() + 1);
      var dayOption = document.createElement("option");
      SelectToAppend.appendChild(dayOption);
      dayOption.innerHTML = "Tomorrow";
      dayOption.setAttribute("value", nextDay.toDateString());
      var nextDay = new Date();
      nextDay.setDate(today.getDate() + 2);
      var dayOption = document.createElement("option");
      SelectToAppend.appendChild(dayOption);
      dayOption.innerHTML = arrDays[nextDay.getDay()];
      dayOption.setAttribute("value", nextDay.toDateString());
      var nextDay = new Date();
      nextDay.setDate(today.getDate() + 3);
      var dayOption = document.createElement("option");
      SelectToAppend.appendChild(dayOption);
      dayOption.innerHTML = arrDays[nextDay.getDay()];
      dayOption.setAttribute("value", nextDay.toDateString());
      var nextDay = new Date();
      nextDay.setDate(today.getDate() + 4);
      var dayOption = document.createElement("option");
      SelectToAppend.appendChild(dayOption);
      dayOption.innerHTML = arrDays[nextDay.getDay()];
      dayOption.setAttribute("value", nextDay.toDateString());
      var nextDay = new Date();
      nextDay.setDate(today.getDate() + 5);
      var dayOption = document.createElement("option");
      SelectToAppend.appendChild(dayOption);
      dayOption.innerHTML = arrDays[nextDay.getDay()];
      dayOption.setAttribute("value", nextDay.toDateString());
      var nextDay = new Date();
      nextDay.setDate(today.getDate() + 6);
      var dayOption = document.createElement("option");
      SelectToAppend.appendChild(dayOption);
      dayOption.innerHTML = arrDays[nextDay.getDay()];
      dayOption.setAttribute("value", nextDay.toDateString());
      }
   if(document.getElementById("leap_in_time")) {
      var goButton = document.getElementById("leap_in_time");
      goButton.onclick = function() {
         fncLeapInTime() ;
         };
      }
   if(document.getElementById("show_time")) document.getElementById("show_time").value = "primetime";
   if(document.getElementById("show_channel")) document.getElementById("show_channel").value = "0";
   };
function fncSelectChannelsScreenings() {
   };
function fncLeapInTime() {
   fncGenerateLoaderForZones();
   // read day for the week
   var dayStatus = document.getElementById("show_day").options[document.getElementById("show_day").selectedIndex].value;
   var timeStatus = document.getElementById("show_time").value;
   var channelStatus = document.getElementById("show_channel").value;
   var currentlySittingAt = fncGetLeftMostVisibleTime();
   var startFetch = new Date(dayStatus);
   // read time for the day
   var setHourAt;
   var setMinuteAt;
   if(timeStatus == "primetime") {
      var primeTime = primeTimeTVCommencesAt.split(":");
      var setHourAt = primeTime[0];
      var setMinuteAt = primeTime[1];
      startFetch.setHours(setHourAt, setMinuteAt, 0);
      }
   else if(timeStatus == "earlyhours") {
      var earlyTime = earlyHoursTVCommencesAt.split(":");
      var setHourAt = earlyTime[0];
      var setMinuteAt = earlyTime[1];
      startFetch.setHours(setHourAt, setMinuteAt, 0);
      }
   else if(timeStatus == "morning") {
      var morningTime = morningTVCommencesAt.split(":");
      var setHourAt = morningTime[0];
      var setMinuteAt = morningTime[1];
      startFetch.setHours(setHourAt, setMinuteAt, 0);
      }
   else if(timeStatus == "afternoon") {
      var afternoonTime = afternoonTVCommencesAt.split(":");
      var setHourAt = afternoonTime[0];
      var setMinuteAt = afternoonTime[1];
      startFetch.setHours(setHourAt, setMinuteAt, 0);
      }
   else {
      var tvStartsAt = fncDetermineCurrentTime();
      if(tvStartsAt.getMinutes() <= 30) 
        startFetch.setHours(tvStartsAt.getHours(), 0, 0, 0);
      else 
        startFetch.setHours(startFetch.getHours(), 30, 0, 0);
      }
   var totalMinutesToSlide = ((startFetch.getTime() - currentlySittingAt.getTime()) / 60000);
   if( startFetch.getTime() >= TimeRange.finishTime) {
      startFetch.setTime(TimeRange.finishTime);
      startFetch.setHours(startFetch.getHours() - 2);
      }
   var differenceInMinutes = parseInt(((startFetch.getTime() - currentlySittingAt.getTime()) / (60 * 1000)));
   var cleanUIAt = document.getElementById("tvg_wrapper");
   if(cleanUIAt.hasChildNodes()) {
      cleanUIAt.removeChild(document.getElementById("tvg_listings"));
      cleanUIAt.style.height = "300px";
      if(document.getElementById("id_new_time_0")) document.getElementById("tvg_time_information_0").removeChild(document.getElementById("id_new_time_0"));
      }
   fncInitiateProcessing(startFetch);
   };
function fncDetermineTheBaseAndFinalTime() {
   var currentTime = new Date();
   var startTimeSlotsAt = new Date();
   var finishTimeSlotsAt = new Date();
   startTimeSlotsAt.setDate(currentTime.getDate() - 1);
   finishTimeSlotsAt.setDate(currentTime.getDate() + 6);
   var toScrollInMinutes = ((currentTime.getTime() - startTimeSlotsAt.getTime()) / (60 * 1000));
   if(currentTime.getMinutes() <= 30) {
      currentTime.setHours(currentTime.getHours(), 0, 0, 0);
      startTimeSlotsAt.setHours(startTimeSlotsAt.getHours(), 0, 0, 0);
      finishTimeSlotsAt.setHours(finishTimeSlotsAt.getHours(), 0, 0, 0);
      }
   else {
      currentTime.setHours(currentTime.getHours(), 30, 0, 0);
      startTimeSlotsAt.setHours(startTimeSlotsAt.getHours(), 30, 0, 0);
      finishTimeSlotsAt.setHours(finishTimeSlotsAt.getHours(), 30, 0, 0);
      }
   tvScheduleSlidingDivCommencesAt.setTime(startTimeSlotsAt.getTime()) ;
   var noDST = false;
   while(startTimeSlotsAt.getTime() <= finishTimeSlotsAt.getTime()) {
      arrTimeSlots.push(startTimeSlotsAt.getTime());
      // check for DST settings
      var detectTimeInFuture = new Date(startTimeSlotsAt);
      detectTimeInFuture.setMinutes(detectTimeInFuture.getMinutes() + 90);
      var detectDST = detectTimeInFuture.getTimezoneOffset() / 60;
      if(detectDST == dstTimeDifference && noDST) {
         startTimeSlotsAt.setMinutes(startTimeSlotsAt.getMinutes() + 90);
         noDST = false;
         }
      else {
         startTimeSlotsAt.setMinutes(startTimeSlotsAt.getMinutes() + 30);
         }
      }
   baseTime = new Date(arrTimeSlots[0]);
   finalTime = new Date(arrTimeSlots[arrTimeSlots.length - 1]);
   // check to see the use of this object
   TimeRange.startTime = baseTime;
   TimeRange.finishTime = finalTime;
   };
function fncInitiateProcessing(GuideShouldStartAt) {
   /*
   a) When a start-time is passed to the function (when the user changes the drop-down with days or on the 24-hour jumps),
   the guide re-sets itself and starts from the time that gets passed, creating the two-and-a-half hour window and making
   the fetch.
   b) When the guide loads on a page-refresh, the guide reads the 'default time' of start from the drop-downs and follows the
   process of creating the fetch-window.
   c) Not concerned with sliding the guide to the right place at this stage.
   */
   var timeZero = new Date();
   if(GuideShouldStartAt) timeZero.setTime(GuideShouldStartAt);
   else timeZero.setTime(fncReadDropDownDefaults());
   fncCollectChannelsToRender();
   fncCreateChannelInterface(timeZero);
   };
function fncReadChannelsToRender() {
   var renderThisSet = document.getElementById("show_channel").value;
   return renderThisSet;
   };
function fncCollectChannelsToRender() {
   arrSetOfRenderingChannels = new Array();
   if(document.getElementById("show_channel")) var renderThisSet = document.getElementById("show_channel").value;
   else var renderThisSet = 0;
   for(oo = 0; oo < setOfAllChannels.length; oo++) {
      if(setOfAllChannels[oo].ChannelFTA == renderThisSet) arrSetOfRenderingChannels.push(setOfAllChannels[oo]);
      }
   };
function fncCreateChannelInterface(GuideShouldStartAt) {
   // alert("creating channel interface...");
   // renders the user-interface for time and all drop-downs on the guide
   fncRenderUserInterfaceForTime(document.getElementById("tvg_time_information_0"), 0);
   document.getElementById("tvg_wrapper").style.height = "auto";
   if(document.getElementById("tvg_listings")) {
      var parentContainer = document.getElementById("tvg_listings");
      parentContainer.style.height = "auto";
      }
   else {
      var parentContainer = document.getElementById("tvg_wrapper").appendChild(document.createElement("div"));
      parentContainer.id = "tvg_listings";
      parentContainer.style.height = "auto";
      }
   var totalChannelsToRender = arrSetOfRenderingChannels.length;
   var totalChannelsPerContainer;
   if(totalChannelsToRender < repeatAfter) {
      totalAdvertisements = 1;
      totalChannelsPerContainer = 5;
      }
   else {
      totalAdvertisements = parseInt(totalChannelsToRender / repeatAfter);
      totalChannelsPerContainer = repeatAfter;
      }
   var channelsAlreadyRendered = new String();
   var channelCounter = 0;
   var getThisChannel = 0;
   for(ad = 0; ad < totalAdvertisements; ad++) {
      if(document.getElementById("div_schedule_" + ad)) continue;
      var divSechdules = parentContainer.appendChild(document.createElement("div"));
      divSechdules.id = "div_schedule_" + ad;
      divSechdules.className = "div_schedule";
      var channelContainer = divSechdules.appendChild(document.createElement("div"));
      channelContainer.className = "tvg_channels";
      var scheduleWrapper = divSechdules.appendChild(document.createElement("div"));
      scheduleWrapper.className = "tvg_schedule";
      scheduleWrapper.id = "tvg_schedule_" + ad;
      var schedulesContainer = scheduleWrapper.appendChild(document.createElement("div"));
      schedulesContainer.className = "tvg_slides";
      schedulesContainer.id = "tvg_slides_" + ad;
      for(pp = 0; pp < totalChannelsPerContainer; pp++) {
         getThisChannel = pp + channelCounter;
         var thisChannel = arrSetOfRenderingChannels[getThisChannel];
         var channelCell = channelContainer.appendChild(document.createElement("div"));
         channelCell.id = "channel_id_" + thisChannel.ChannelID;
         channelCell.className = "class_channel_row";
         channelName = channelCell.appendChild(document.createElement("p"));
         channelName.className = "channelname";
         if(thisChannel.ChannelName != "") channelName.innerHTML = thisChannel.ChannelName;
         else channelName.innerHTML = thisChannel.ChannelAbbreviation;
         channelsAlreadyRendered = channelsAlreadyRendered + "," + thisChannel.ChannelID;
         var channelProgramsRow = schedulesContainer.appendChild(document.createElement("div"));
         channelProgramsRow.id = "channel_row_" + thisChannel.ChannelID;
         channelProgramsRow.className = "class_channel_row";
         }
      channelCounter += 7;
      fncCreateAdvertisement(parentContainer, ad);
      if(totalAdvertisements != 1) {
         var ff = ad + 1;
         fncRenderUserInterfaceForTime(parentContainer, ff);
         }
      }
   // big 'for' concludes
   var totalChannelsDrawn = repeatAfter * totalAdvertisements;
   // render the remaining set of channels, last slot
   if(totalChannelsDrawn != 0) {
      var divSechdules = parentContainer.appendChild(document.createElement("div"));
      divSechdules.id = "div_schedule_" + totalAdvertisements;
      divSechdules.className = "div_schedule";
      var channelContainer = divSechdules.appendChild(document.createElement("div"));
      channelContainer.className = "tvg_channels";
      var scheduleWrapper = divSechdules.appendChild(document.createElement("div"));
      scheduleWrapper.className = "tvg_schedule";
      scheduleWrapper.id = "tvg_schedule_" + totalAdvertisements;
      // hack to hide the last, redundant div for FTA channels
      if(totalAdvertisements == 1) {
         if(document.getElementById("div_schedule_1")) document.getElementById("div_schedule_1").style.display = "none";
         }
      var schedulesContainer = scheduleWrapper.appendChild(document.createElement("div"));
      schedulesContainer.className = "tvg_slides";
      schedulesContainer.id = "tvg_slides_" + totalAdvertisements;
      for(zz = totalChannelsDrawn; zz < arrSetOfRenderingChannels.length; zz++) {
         var thisChannel = arrSetOfRenderingChannels[zz];
         var channelCell = channelContainer.appendChild(document.createElement("div"));
         channelCell.id = "channel_id_" + thisChannel.ChannelID;
         channelCell.className = "class_channel_row";
         channelName = channelCell.appendChild(document.createElement("p"));
         channelName.className = "channelname";
         if(thisChannel.ChannelName != "") channelName.innerHTML = thisChannel.ChannelName;
         else channelName.innerHTML = thisChannel.ChannelAbbreviation;
         channelsAlreadyRendered = channelsAlreadyRendered + "," + thisChannel.ChannelID;
         var channelProgramsRow = schedulesContainer.appendChild(document.createElement("div"));
         channelProgramsRow.id = "channel_row_" + thisChannel.ChannelID;
         channelProgramsRow.className = "class_channel_row";
         }
      }
   fncPopulateChannelsDropDown();
   var differenceInMinutesFromBaseTime = parseInt((GuideShouldStartAt.getTime() - arrTimeSlots[0]) / (1000*60));
   fncSlideTimeZonesOnly(differenceInMinutesFromBaseTime);
   // the function gets called when initiating the guide, so the fetch window will always be of 2.5 hours (150 minutes) here
   fncStartGuide(GuideShouldStartAt);
   };
// accepts the start-time for the fetch and the total minutes to fetch from there
function fncStartGuide(GuideShouldStartAt, fetchWindow) {
   fncGenerateLoaderForZones();
   // alert("times slided, now about to initiate fetching and processing the schedules");
   fncCreateFetchWindow(GuideShouldStartAt);
   };
function fncCreateFetchWindow(GuideShouldStartAt, fetchWindow, dayLeaps) {
   var leftSittingAt = fncGetLeftMostVisibleTime();
   var rightSittingAt = new Date(leftSittingAt);
   rightSittingAt.setHours(rightSittingAt.getHours() + 2);
   var fetchDataFrom = new Date(GuideShouldStartAt);
   var fetchDataTill = new Date(GuideShouldStartAt);
   if(dayLeaps != null && dayLeaps != undefined) {
      var fetchDataFrom = new Date(GuideShouldStartAt);
      var fetchDataTill = new Date(fetchDataFrom);
      fetchDataTill.setHours(fetchDataTill.getHours() + 2);
      }
   else {
      if(fetchWindow > 0) {
         fetchDataTill.setHours(fetchDataFrom.getHours() + 2);
         fetchDataTill.setMinutes(fetchDataFrom.getMinutes() + 30);
         }
      else {
         fetchDataTill.setHours(fetchDataFrom.getHours() + 2);
         fetchDataTill.setMinutes(fetchDataFrom.getMinutes() + 30);
         }
      if(fetchDataFrom.getTime() <= TimeRange.startTime) {
         fetchDataFrom.setTime(TimeRange.startTime);
         fetchDataTill.setTime(rightSittingAt);
         if(leftSittingAt.getTime() <= TimeRange.startTime) {
            fncDeGenerateLoaderForZones();
            return;
            }
         }
      if(fetchDataTill.getTime() >= TimeRange.finishTime) {
         fetchDataFrom.setTime(leftSittingAt);
         fetchDataTill.setTime(TimeRange.finishTime);
         if(rightSittingAt.getTime() >= TimeRange.finishTime) {
            fncDeGenerateLoaderForZones();
            return;
            }
         }
      }
   fncResetUserInterfaceOfSchedules();
   if(fetchWindow != undefined || fetchWindow != null) fncSlideTimeZonesOnly(fetchWindow);
   fncCheckForDateStatus();
   // // alert("fetchDataFrom = " + fetchDataFrom + " fetchDataTill = " + fetchDataTill);
   var FetchChannels = "";
   var setOfChannels = fncReadChannelsToRender();
   if(setOfChannels == 0) FetchChannels = "7,6,1,24072,31";
   else FetchChannels = "4,5,10,11,12,13,14,15,16,17,19,20,21,22,23,24,25,26,28,29,30,33,34,35,36,37,38,39,40,41,42,43,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,70,71";
   // alert("FetchChannels = " + FetchChannels);
   var leftMostDate = fetchDataFrom.getFullYear() + "-" + arrMonths[fetchDataFrom.getMonth()] + "-" + fetchDataFrom.getDate() + " " + fetchDataFrom.getHours() + ":" + fetchDataFrom.getMinutes() + ":00";
   var rightMostDate = fetchDataTill.getFullYear() + "-" + arrMonths[fetchDataTill.getMonth()] + "-" + fetchDataTill.getDate() + " " + fetchDataTill.getHours() + ":" + fetchDataTill.getMinutes() + ":00";
   var CallLocation = CoreServiceLocation + "&callback=CollectPrograms&StartDate=" + leftMostDate + "&endDate=" + rightMostDate + "&ChannelIDs=" + FetchChannels + "&Mode=live&AttributeStyle=true";
   alert(CallLocation);
   var obj = new JSONscriptRequest(CallLocation);
   obj.buildScriptTag();
   obj.addScriptTag();
   };
function CollectPrograms(data) {
   freshData = new Array();
   if(data && data.RowList != null) {
      for (i = 0; i < data.RowList.Row.length; i++) {
         var currentProgram = new Object;
         currentProgram = data.RowList.Row[i];
         freshData.push(currentProgram);
         arrAllPrograms.push(currentProgram);
         }
      }
   function sortArray(rowA, rowB) {
      var seqA = parseInt(AllChannels[rowA.ChannelID]);
      var seqB = parseInt(AllChannels[rowB.ChannelID]);
      var ST_A = fncCreateTimeForProgram(rowA.StartTime);
      var ST_B = fncCreateTimeForProgram(rowB.StartTime);
      if(seqA == seqB) {
         if(ST_B > ST_A) { return - 1 } else if (ST_B < ST_A) { return 1; } else return 0;
         }
      return seqA - seqB;
      }
   freshData.sort(sortArray);
   // // alert("programs fetched, a total of = " + freshData.length + " programs fetched");
   fncRender8Channels(0);
   fncDeGenerateLoaderForZones();
   // alert("programs rendered!!!!");
   };
function fncCheckForEmptyChannels() {
   for(j = 0; j < arrSetOfRenderingChannels.length; j++) {
      var channelRow = document.getElementById("channel_row_" + arrSetOfRenderingChannels[j].ChannelID);
      if(channelRow != null && channelRow) {
         if(channelRow.childNodes.length == 0) {
            var createNoListingsDiv = channelRow.appendChild(document.createElement("div"));
            createNoListingsDiv.id = "no_listings";
            createNoListingsDiv.className = "class_program_div";
            noListings = createNoListingsDiv.appendChild(document.createElement("p"));
            noListings.className = "nolisting";
            createNoListingsDiv.style.width = "450px";
            noListings.innerHTML = "no listings available";
            }
         }
      }
   };
function fncRender8Channels(p) {
   var currentChannel = freshData[p].ChannelID;
   var firstChannelToRender = currentChannel;
   var channelRow = document.getElementById("channel_row_" + firstChannelToRender);
   var forThisChannel = new Array();
   var blnDone = false;
   while(freshData.length > p && freshData[p].ChannelID == currentChannel) {
      var previousProgramStartedAt = null;
      var previousProgramFinishedAt = null;
      var noListings = false;
      var overLay = null;
      var programStartedInPast = false;
      var program = freshData[p];
      var channelToCheck = program.ChannelID;
      if(channelToCheck != firstChannelToRender) {
         firstChannelToRender = channelToCheck;
         channelRow = document.getElementById("channel_row_" + firstChannelToRender);
         forThisChannel = new Array();
         }
      forThisChannel.push(program);
      // gets the start time and the finish time right at the start
      var programStartTimeIs = fncCreateTimeForProgram(program.StartTime);
      var programFinishTimeIs = fncCreateTimeForProgram(program.FinishTime);
      var leftMostVisibleTimeIs = fncGetLeftMostVisibleTime();
      // when it is certain the channel row exists for the program to be appended to
      if(channelRow != null) {
         if(channelRow.childNodes.length == 0) {
            var programStartedInPast = (leftMostVisibleTimeIs.getTime() > programStartTimeIs.getTime()) ? true : false;
            if(programStartedInPast) {
               overLay = ((programFinishTimeIs.getTime() - leftMostVisibleTimeIs.getTime()) / 60000);
               if(overLay > 0) {
                  var programDiv = channelRow.appendChild(document.createElement("div"));
                  programDiv.id = "program_id_" + program.ScheduleID;
                  programDiv.className = "class_program_div";
                  fncSetWidth(programDiv, overLay);
                  programDiv.innerHTML = "";
                  var me = programDiv;
                  me.onclick = function(evt) {
                     fncRenderPopUp(this, evt);
                     }
                  }
               // program started in the past but finished at the start of the guide
               }
            // if the program 'runs' into the start of the guide check, concludes
            else {
               if(previousProgramFinishedAt && previousProgramFinishedAt != null) {
                  if(previousProgramFinishedAt.getTime() != programStartTimeIs.getTime()) {
                     var blankSpotStartsAt = new Date(previousProgramFinishedAt);
                     var blankSpotExistsFor = ((programStartTimeIs.getTime() - previousProgramFinishedAt.getTime()) / 60000);
                     var finishTimeForBlankSpot = new Date(blankSpotStartsAt);
                     finishTimeForBlankSpot.setMinutes(finishTimeForBlankSpot.getMinutes() + blankSpotExistsFor);
                     var createNoListingsDiv = channelRow.appendChild(document.createElement("div"));
                     createNoListingsDiv.id = "no_listings";
                     createNoListingsDiv.className = "class_program_div";
                     noListings = createNoListingsDiv.appendChild(document.createElement("p"));
                     noListings.className = "nolisting";
                     noListings.innerHTML = "no listings available";
                     fncSetWidth(createNoListingsDiv, blankSpotExistsFor);
                     var noListings = true;
                     }
                  // program data insonsistent, a blank spot is found
                  }
               // there is a 'previousProgramFinishedAt' check, concludes
               fncRenderProgramThumbnail(program, programStartTimeIs, programFinishTimeIs, channelRow);
               }
            }
         // check to see if this is the first node that needs be attached to the channel, concludes
         else {
            // drops the repeated program right here, doesnt add to DOM
            if(previousProgramStartedAt != null && previousProgramStartedAt.getTime() >= programStartTimeIs.getTime()) continue;
            if(document.getElementById("program_id_" + program.ScheduleID)) continue;
            if(previousProgramFinishedAt && previousProgramFinishedAt != null) {
               if(previousProgramFinishedAt.getTime() != programStartTimeIs.getTime()) {
                  var blankSpotStartsAt = new Date(previousProgramFinishedAt);
                  var blankSpotExistsFor = ((programStartTimeIs.getTime() - previousProgramFinishedAt.getTime()) / 60000);
                  var finishTimeForBlankSpot = new Date(blankSpotStartsAt);
                  finishTimeForBlankSpot.setMinutes(finishTimeForBlankSpot.getMinutes() + blankSpotExistsFor);
                  var createNoListingsDiv = channelRow.appendChild(document.createElement("div"));
                  createNoListingsDiv.id = "no_listings";
                  createNoListingsDiv.className = "class_program_div";
                  noListings = createNoListingsDiv.appendChild(document.createElement("p"));
                  noListings.className = "nolisting";
                  noListings.innerHTML = "no listings available";
                  fncSetWidth(createNoListingsDiv, blankSpotExistsFor);
                  var noListings = true;
                  }
               }
            fncRenderProgramThumbnail(program, programStartTimeIs, programFinishTimeIs, channelRow);
            }
         previousProgramStartedAt = new Date(programStartTimeIs);
         previousProgramFinishedAt = new Date(programFinishTimeIs);
         }
      p++;
      if(p == freshData.length) {
         blnDone = true;
         fncCheckForEmptyChannels();
         }
      ;
      }
   if(p < freshData.length) {
      window.setTimeout('fncRender8Channels(' + p + ')', 1);
      }
   }
function fncCreateTimeForProgram(convert_time) {
   var strMonth = 0;
   var strHour = 0;
   var arrDate = convert_time.split(" ");
   var strDateIs = arrDate[0];
   var strDatePart = strDateIs.split("-");
   var strYear = strDatePart[0];
   var strMonth = strDatePart[1];
   var strDateIs = strDatePart[2];
   var allMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
   for (c = 0; c <= allMonths.length; c++) {
      if(strMonth == allMonths[c]) strMonth = c;
      }
   var strTimeIs = arrDate[1];
   var splitedTime = strTimeIs.split("+");
   var timePart = splitedTime[0].split(":");
   var strHour = timePart[0];
   var strMinute = timePart[1];
   var strSecond = timePart[2];
   var FormattedTime = new Date(strYear, strMonth, strDateIs, strHour, strMinute, strSecond);
   return FormattedTime;
   };
function fncRenderProgramThumbnail(program, programStartTimeIs, programFinishTimeIs, channelRow) {
   var runningTime = ((programFinishTimeIs.getTime() - programStartTimeIs.getTime()) / 60000);
   var programDiv = channelRow.appendChild(document.createElement("div"));
   programDiv.id = "program_id_" + program.ScheduleID;
   programDiv.className = "class_program_div";
   fncSetWidth(programDiv, runningTime);
   var WidthOfTheProgramDiv = parseInt(programDiv.style.width);
   if(WidthOfTheProgramDiv < leastWidthAllowed) {
      if(WidthOfTheProgramDiv > 15) programDiv.innerHTML = "<img src='img/tvguide/icon_info.gif' alt='' title=''>";
      else programDiv.innerHTML = "<img src='img/tvguide/icon_info.gif' alt='' title='' style='margin-left:1px;'>";
      }
   else {
      var programSpan = programDiv.appendChild(document.createElement("span"));
      var timeToBeRendered = formatTime(programStartTimeIs);
      programSpan.innerHTML = timeToBeRendered;
      var programTitle = programDiv.appendChild(document.createElement("p"));
      var cleanProgramTitle = program.Title;
      programTitle.innerHTML = cleanProgramTitle.replace("&apos;", "'");
      if(programTitle.clientHeight != undefined && programTitle.clientHeight > 30) var TrimmedProgramTitle = fncTrimTitleToHeight(programTitle);
      if (program.premire == "True") programTitle.className = "highlight";
      }
   var me = programDiv;
   me.onclick = function(evt) {
      fncRenderPopUp(this, evt);
      }
   };
function fncSetWidth(ofDiv, forTime) {
   if(forTime < 0) forTime = ( - 1) * forTime;
   ofDiv.style.width = (forTime * numberOfPixelsPerMinute) + "px";
   return ofDiv.style.width;
   };
function fncCheckIfSchedulesAreCached(fetchDataFrom, fetchDataTill) {
   return false;
   };
function fncSlideTimeZonesOnly(slideByTotalMinutes) {
   if (!document.getElementById("time_slots_0")) return;
   var totalPixelsToSlide = slideByTotalMinutes * numberOfPixelsPerMinute;
   var divToSlideToLeft = document.getElementById("time_slots_0");
   var currentLeftPositionOfSlidingDiv = parseInt(divToSlideToLeft.style.left);
   // // alert("now about to render times only by " + slideByTotalMinutes + "minutes, where the current time_slot_0 is positoned at = " + currentLeftPositionOfSlidingDiv);
   // slide in past
   if(slideByTotalMinutes < 0) {
      var afterSlidingItWillBe = (currentLeftPositionOfSlidingDiv - totalPixelsToSlide);
      var finalPosition = afterSlidingItWillBe;
      if(finalPosition > 0) afterSlidingItWillBe = 0;
      for(xx = 0; xx < maxDivSchedules; xx++) {
         if(document.getElementById("time_slots_" + xx)) {
            document.getElementById("time_slots_" + xx).style.left = afterSlidingItWillBe + "px";
            }
         }
      }
   // slide ahead
   else if(slideByTotalMinutes > 0) {
      var afterSlidingItWillBe = currentLeftPositionOfSlidingDiv - totalPixelsToSlide;
      var finalPosition = ( - 1) * afterSlidingItWillBe;
      if(finalPosition >= lastPointAt) afterSlidingItWillBe = ( - 1) * lastPointAt;
      for(xx = 0; xx < maxDivSchedules; xx++) {
         if(document.getElementById("time_slots_" + xx)) {
            document.getElementById("time_slots_" + xx).style.left = afterSlidingItWillBe + "px";
            }
         }
      }
   var currentLeftPositionOfSlidingDiv = parseInt(divToSlideToLeft.style.left);
   // // alert("slide complete, total pixels slided = " + totalPixelsToSlide + "and the new time_slot_0 is positoned at = " + currentLeftPositionOfSlidingDiv);
   };
function fncDeGenerateLoaderForZones() {
   for(xx = 0; xx < maxDivSchedules; xx++) {
      if(document.getElementById("tvg_schedule_" + xx)) {
         var tvScheduleContainer = document.getElementById("tvg_schedule_" + xx);
         if(document.getElementById("id_loading_div_" + xx)) tvScheduleContainer.removeChild(document.getElementById("id_loading_div_" + xx));
         }
      }
   };
function fncGenerateLoaderForZones() {
   for(xx = 0; xx < maxDivSchedules; xx++) {
      if(document.getElementById("tvg_schedule_" + xx)) {
         var tvScheduleContainer = document.getElementById("tvg_schedule_" + xx);
         var heightOfContainer = tvScheduleContainer.clientHeight;
         var totalChildNodes = tvScheduleContainer.childNodes.length;
         // if tvScheduleContainer already has a loader attached
         if(totalChildNodes != 1) continue;
         var loadingDiv = tvScheduleContainer.appendChild(document.createElement("div"));
         loadingDiv.id = "id_loading_div_" + xx;
         loadingDiv.className = "class_loading_div";
         loadingDiv.style.width = "450px";
         loadingDiv.style.height = heightOfContainer + "px";
         var loadingNote = loadingDiv.appendChild(document.createElement("p"));
         loadingNote.innerHTML = "loading schedules...please wait" }
      }
   };
function fncScrollTimeZones(byMinutes) {
   var totalPixelsToSlide = byMinutes * numberOfPixelsPerMinute;
   var divToSlideToLeft = document.getElementById("time_slots_0");
   var currentLeftPositionOfSlidingDiv = parseInt(divToSlideToLeft.style.left);
   var afterSlidingItWillBe = (currentLeftPositionOfSlidingDiv + totalPixelsToSlide);
   var finalPosition = afterSlidingItWillBe;
   if(finalPosition > 0) afterSlidingItWillBe = 0;
   for(xx = 0; xx < maxDivSchedules; xx++) {
      if(document.getElementById("time_slots_" + xx)) {
         document.getElementById("time_slots_" + xx).style.left = afterSlidingItWillBe + "px";
         var scrolledDiv = document.getElementById("time_slots_" + xx);
         }
      }
   fncCheckForDateStatus();
   };
function fncGetLeftMostVisibleTime() {
   if(document.getElementById("time_slots_0").style.left) {
      var leftPositionForSlide = parseInt(document.getElementById("time_slots_0").style.left);
      var totalMinutes = ( - 1) * (parseInt(leftPositionForSlide) / numberOfPixelsPerMinute);
      }
   else {
      var leftPositionForSlide = "0px";
      var totalMinutes = 0;
      }
   var Position = new Date(tvScheduleSlidingDivCommencesAt);
   Position.setMinutes(Position.getMinutes() + totalMinutes);
   return Position;
   };
function fncCheckForDateStatus() {
   var leftMostVisibleTimeIs = fncGetLeftMostVisibleTime();
   for(nn = 0; nn < maxDivSchedules; nn++) {
      if(!document.getElementById("current_screening_and_day_" + nn)) continue;
      var renderDate = document.getElementById("current_screening_and_day_" + nn);
      if(document.getElementById("id_date_" + nn)) document.getElementById("id_date_" + nn).innerHTML = leftMostVisibleTimeIs.getDate() + " " + arrMonths[leftMostVisibleTimeIs.getMonth()] + " " + leftMostVisibleTimeIs.getFullYear() + ", " + arrDays[leftMostVisibleTimeIs.getDay()];
      else {
         var renderDateP = renderDate.appendChild(document.createElement("p"));
         renderDateP.id = "id_date_" + nn;
         renderDateP.innerHTML = leftMostVisibleTimeIs.getDate() + " " + arrMonths[leftMostVisibleTimeIs.getMonth()] + " " + leftMostVisibleTimeIs.getFullYear() + ", " + arrDays[leftMostVisibleTimeIs.getDay()];
         }
      }
   };
function fncReadDropDownDefaults() {
   var firstFetchAt = new Date();
   var firstFetchTimeInformation;
   var dropDownValue = document.getElementById("show_time").value;
   if(dropDownValue == "fromnow") {
      var currentRoundedUpTime = fncDetermineCurrentTime();
      firstFetchTimeInformation = currentRoundedUpTime.getHours() + ":" + currentRoundedUpTime.getMinutes();
      }
   else if(dropDownValue == "earlyhours") firstFetchTimeInformation = earlyHoursTVCommencesAt;
   else if(dropDownValue == "morning") firstFetchTimeInformation = morningTVCommencesAt;
   else if (dropDownValue == "afternoon") firstFetchTimeInformation = afternoonTVCommencesAt;
   else if(dropDownValue == "primetime") firstFetchTimeInformation = primeTimeTVCommencesAt;
   var hourInformation = firstFetchTimeInformation.split(":");
   firstFetchAt.setHours(hourInformation[0]);
   firstFetchAt.setMinutes(hourInformation[1]);
   firstFetchAt.setSeconds("00");
   return firstFetchAt;
   };
function fncDetermineCurrentTime() {
   var currentTime = new Date();
   if(currentTime.getMinutes() <= 30) currentTime.setHours(currentTime.getHours(), 0, 0, 0);
   else currentTime.setHours(currentTime.getHours(), 30, 0, 0);
   return currentTime;
   };
function fncPopulateChannelsDropDown() {
   var ChannelSelect = document.getElementById("id_drop_down_channels");
   for(bb = 0; bb < arrSetOfRenderingChannels.length; bb++) {
      var modifiedChannelID = arrSetOfRenderingChannels[bb].ChannelID;
      var createOption = ChannelSelect.appendChild(document.createElement("option"));
      createOption.setAttribute("value", modifiedChannelID);
      if(arrSetOfRenderingChannels[bb].ChannelName == "") createOption.innerHTML = arrSetOfRenderingChannels[bb].ChannelAbbreviation;
      else createOption.innerHTML = arrSetOfRenderingChannels[bb].ChannelName;
      };
   };
function fncCreateAdvertisement(parentContainer, i) {
   var advertisementDiv = parentContainer.appendChild(document.createElement("div"));
   advertisementDiv.id = "div_advertisement_" + i;
   advertisementDiv.className = "div_advertisement";
   if(!document.getElementById("hl_banner_promotion")) advertisementDiv.style.display = "none";
   else {
      var divHighlight = document.getElementById("hl_banner_promotion");
      var anotherHighlight = divHighlight.cloneNode(true);
      anotherHighlight.id = "hl_banner_promotion_" + i;
      advertisementDiv.appendChild(anotherHighlight);
      }
   };
function fncRenderUserInterfaceForTime(parentContainer, f) {
   if(document.getElementById("id_new_time_" + f)) return;
   var divNewTimeInformation = parentContainer.appendChild(document.createElement("div"));
   divNewTimeInformation.id = "id_new_time_" + f;
   divNewTimeInformation.className = "class_repeat_time";
   var divTimeInformation = divNewTimeInformation.appendChild(document.createElement("div"));
   divTimeInformation.id = "tvg_navigation_" + f;
   divTimeInformation.className = "tvg_navigation";
   var divBack24 = divTimeInformation.appendChild(document.createElement("div"));
   divBack24.className = "tvg_nav_button";
   divBack24.innerHTML = "<< -24 hrs";
   divBack24.onclick = function() {
      fncPreProcessBeforeFetch( - 1440);
      };
   var divBack6 = divTimeInformation.appendChild(document.createElement("div"));
   divBack6.className = "tvg_nav_button";
   divBack6.innerHTML = "<< -6 hrs";
   divBack6.onclick = function() {
      fncPreProcessBeforeFetch( - 360);
      };
   var divBack2 = divTimeInformation.appendChild(document.createElement("div"));
   divBack2.className = "tvg_nav_button";
   divBack2.innerHTML = "<< -2 hrs";
   divBack2.onclick = function() {
      fncPreProcessBeforeFetch( - 120);
      };
   var divOnNow = divTimeInformation.appendChild(document.createElement("div"));
   divOnNow.className = "tvg_nav_button";
   divOnNow.innerHTML = "On now / next";
   divOnNow.onclick = function() {
      fncOnNow();
      };
   var divRest = divTimeInformation.appendChild(document.createElement("div"));
   divRest.className = "tvg_nav_button";
   divRest.innerHTML = "For the rest of the day";
   divRest.onclick = function() {
      fncForRestOfTheDay();
      };
   var divForward2 = divTimeInformation.appendChild(document.createElement("div"));
   divForward2.className = "tvg_nav_button";
   divForward2.innerHTML = "+2 hrs >>";
   divForward2.onclick = function() {
      fncPreProcessBeforeFetch(120);
      };
   var divForward6 = divTimeInformation.appendChild(document.createElement("div"));
   divForward6.className = "tvg_nav_button";
   divForward6.innerHTML = "+6 hrs >>";
   divForward6.onclick = function() {
      fncPreProcessBeforeFetch(360);
      };
   var divForward24 = divTimeInformation.appendChild(document.createElement("div"));
   divForward24.className = "tvg_nav_button_last";
   divForward24.innerHTML = "+24 hrs >>";
   divForward24.onclick = function() {
      fncPreProcessBeforeFetch(1440);
      };
   var divNewScreeningForTheDay = divNewTimeInformation.appendChild(document.createElement("div"));
   divNewScreeningForTheDay.id = "current_screening_and_day_" + f;
   divNewScreeningForTheDay.className = "current_screening_and_day";
   if(f == 0) fncRenderDropDownForChannels(divNewScreeningForTheDay);
   var BASETIMEIS = new Date(arrTimeSlots[0]);
   var FINALTIMEIS = new Date(arrTimeSlots[arrTimeSlots.length - 1]);
   var timeSlotsDiv = divNewTimeInformation.appendChild(document.createElement("div"));
   timeSlotsDiv.id = "time_slots_container" + f;
   timeSlotsDiv.className = "class_time_slots";
   var totalWidth = 0;
   var cityCell = timeSlotsDiv.appendChild(document.createElement("div"));
   cityCell.className = "class_empty_cell";
   cityCell.id = "div_empty_cell_" + f ;
   var timeslotsDiv = timeSlotsDiv.appendChild(document.createElement("div"));
   timeslotsDiv.id = "time_slots_" + f;
   timeslotsDiv.className = "time_slots";
   for(tt = 0; tt < arrTimeSlots.length; tt++) {
      var slotForTime = new Date(arrTimeSlots[tt]);
      var timeDiv = timeslotsDiv.appendChild(document.createElement("div"));
      timeDiv.style.width = (30 * numberOfPixelsPerMinute) + "px";
      timeDiv.className = "class_time_slot";
      totalWidth = totalWidth + 90;
      timeDiv.innerHTML = formatTime(slotForTime);
      }
   timeslotsDiv.style.width = totalWidth + "px";
   timeslotsDiv.style.left = "0px";
   };
function fncResetUserInterfaceOfSchedules() {
   for(mm = 0; mm < arrSetOfRenderingChannels.length; mm++) {
      var currentChannel = arrSetOfRenderingChannels[mm];
      if(!document.getElementById("channel_row_" + currentChannel.ChannelID)) continue;
      var currentChannelRow = document.getElementById("channel_row_" + currentChannel.ChannelID);
      var totalProgramsForThisChannel = currentChannelRow.childNodes.length;
      while (currentChannelRow.firstChild) currentChannelRow.removeChild(currentChannelRow.firstChild);
      }
   };
function fncPreProcessBeforeFetch(leapBy) {
   // // alert(leapBy);
   fncGenerateLoaderForZones();
   // leaps in future, creating the fetch window times now
   var currentLeftMostTime = fncGetLeftMostVisibleTime();
   var currentRightMostTime = new Date(currentLeftMostTime);
   currentRightMostTime.setHours(currentRightMostTime.getHours() + 2);
   var nextLeftMostTime = new Date(currentLeftMostTime);
   var deriveHoursFromFetchWindow = parseInt(leapBy / 60);
   var deriveMinutesFromFetchWindow = leapBy - (deriveHoursFromFetchWindow * 60);
   nextLeftMostTime.setHours(nextLeftMostTime.getHours() + deriveHoursFromFetchWindow);
   nextLeftMostTime.setMinutes(nextLeftMostTime.getMinutes() + deriveMinutesFromFetchWindow);
   var nextRightMostTime = new Date(nextLeftMostTime);
   nextRightMostTime.setHours(nextRightMostTime.getHours() + 2);
   nextRightMostTime.setMinutes(nextRightMostTime.getMinutes() + 30);
   // alert("nextLeftMostTime = " + nextLeftMostTime + " leapBy " + leapBy);
   fncCreateFetchWindow(nextLeftMostTime, leapBy);
   };
function fncReInitiateGuide(renintiateByMinutes) {
   var GuideCurrentlySittingAt = fncGetLeftMostVisibleTime();
   var GuideShouldStartAt = new Date(GuideCurrentlySittingAt);
   // determining the load window for the tv guide
   GuideShouldStartAt.setMinutes(GuideShouldStartAt.getMinutes() + renintiateByMinutes);
   // // // alert("re-initating tv guide, starting at " + GuideShouldStartAt + "<br> and finishing at " + GuideShouldFinishAt);
   fncInitiateProcessing(GuideShouldStartAt, renintiateByMinutes);
   };
function fncSlideTimeAndSchedules(byMinutes) {
   if(!document.getElementById("time_slots_0")) return;
   var currentSittingAt = fncGetLeftMostVisibleTime();
   var afterSlideWillSitAt = new Date(currentSittingAt);
   // the time-window is available here, do the cached test
   // if cached, just slide
   // if not cached, make the request, append the programs, slide
   if(byMinutes > 0) {
      currentSittingAt.setHours(currentSittingAt.getHours() + 2);
      currentSittingAt.setMinutes(currentSittingAt.getMinutes() + 30);
      afterSlideWillSitAt.setTime(currentSittingAt);
      afterSlideWillSitAt.setMinutes(afterSlideWillSitAt.getMinutes() + byMinutes);
      }
   else if (byMinutes < 0) {
      var currentSittingAt = fncGetLeftMostVisibleTime();
      afterSlideWillSitAt.setTime(currentSittingAt);
      afterSlideWillSitAt.setMinutes(afterSlideWillSitAt.getMinutes() + byMinutes);
      }
   fncFetchDataToCache(currentSittingAt, afterSlideWillSitAt);
   // // // alert(afterSlideWillSitAt);
   var totalPixelsToSlide = byMinutes * numberOfPixelsPerMinute;
   var divToSlideToLeft = document.getElementById("time_slots_0");
   var currentLeftPositionOfSlidingDiv = parseInt(divToSlideToLeft.style.left);
   // slide in past
   if(byMinutes < 0) {
      var afterSlidingItWillBe = (currentLeftPositionOfSlidingDiv - totalPixelsToSlide);
      var finalPosition = afterSlidingItWillBe;
      if(finalPosition > 0) afterSlidingItWillBe = 0;
      for(xx = 0; xx < maxDivSchedules; xx++) {
         if(document.getElementById("time_slots_" + xx)) {
            document.getElementById("time_slots_" + xx).style.left = afterSlidingItWillBe + "px";
            document.getElementById("tvg_slides_" + xx).style.left = afterSlidingItWillBe + "px";
            }
         }
      }
   // slide ahead
   else if(byMinutes > 0) {
      var afterSlidingItWillBe = currentLeftPositionOfSlidingDiv - totalPixelsToSlide;
      var finalPosition = ( - 1) * afterSlidingItWillBe;
      if(finalPosition >= lastPointAt) afterSlidingItWillBe = ( - 1) * lastPointAt;
      for(xx = 0; xx < maxDivSchedules; xx++) {
         if(document.getElementById("time_slots_" + xx)) {
            document.getElementById("time_slots_" + xx).style.left = afterSlidingItWillBe + "px";
            document.getElementById("tvg_slides_" + xx).style.left = afterSlidingItWillBe + "px";
            }
         }
      }
   fncCheckForDateStatus();
   };
function fncRenderDropDownForChannels(divNewScreeningForTheDay) {
   var lstChannels = divNewScreeningForTheDay.appendChild(document.createElement("select"));
   lstChannels.id = "id_drop_down_channels";
   var channelsBeingRendered = document.getElementById("show_channel").value;
   if(channelsBeingRendered == 0) lstChannels.style.display = "none";
   lstChannels.onchange = function(evt) {
      fncScrollPageToChannel(evt);
      };
   var lstOption = lstChannels.appendChild(document.createElement("option"));
   lstOption.innerHTML = "Choose a channel";
   };
function fncScrollPageToChannel(evt) {
   var channelID = document.getElementById("id_drop_down_channels").value;
   // alert(channelID);
   var divOfChannel = "channel_id_" + channelID;
   var channelDiv = document.getElementById(divOfChannel);
   var divPosition = channelDiv.offsetTop;
   var channelExistsOn = parseInt(divPosition / modOperator);
   if(channelExistsOn > 0) {
      var channelExistsOn = channelExistsOn - 1;
      var divAdvertisementBlock = "div_advertisement_" + channelExistsOn;
      if(!document.getElementById(divAdvertisementBlock)) return;
      var getBlock = document.getElementById(divAdvertisementBlock);
      var getToY = getBlock.offsetTop + yCordOffSet;
      window.scroll(0, getToY);
      }
   };
function formatTime(forTime) {
   var a_p = "";
   var curr_hour = forTime.getHours();
   if (curr_hour < 12) a_p = "am";
   else a_p = "pm";
   if (curr_hour == 0) curr_hour = 12;
   if (curr_hour > 12) curr_hour = curr_hour - 12;
   var curr_min = forTime.getMinutes();
   curr_min = curr_min + "";
   if (curr_min.length == 1) curr_min = "0" + curr_min;
   return(curr_hour + ":" + curr_min + " " + a_p);
   };
function fncOnNow() {
   var valueOfDropDown = document.getElementById("show_day").value;
   var currentlySittingAt = new Date(fncGetLeftMostVisibleTime());
   var currentTime = new Date(valueOfDropDown);
   var timeRightNow = new Date();
   currentTime.setHours(timeRightNow.getHours());
   currentTime.setMinutes(timeRightNow.getMinutes());
   if(currentTime.getMinutes() <= 30) currentTime.setHours(currentTime.getHours(), 0, 0, 0);
   else currentTime.setHours(currentTime.getHours(), 30, 0, 0);
   var totalMinutesDifference = (( currentTime.getTime() - currentlySittingAt.getTime()) / 60000);
   fncPreProcessBeforeFetch(totalMinutesDifference);
   };
function fncForRestOfTheDay() {
   var valueOfDropDown = document.getElementById("show_day").value;
   var currentTime = new Date(valueOfDropDown);
   var timeRightNow = new Date();
   currentTime.setHours(timeRightNow.getHours());
   currentTime.setMinutes(timeRightNow.getMinutes());
   var currentMinute = currentTime.getMinutes();
   if(currentMinute > 0 && currentMinute <= 29) currentTime.setHours(currentTime.getHours(), 30, 0, 0);
   else if(currentMinute > 30 && currentMinute <= 59) currentTime.setHours(currentTime.getHours() + 1, 0, 0, 0);
   var currentlySittingAt = new Date(fncGetLeftMostVisibleTime());
   var totalMinutesDifference = ((currentTime.getTime() - currentlySittingAt.getTime()) / 60000);
   fncPreProcessBeforeFetch(totalMinutesDifference);
   };
function fncRenderPopUp(program, evt) {
   var posx = 0;
   var posy = 0;
   if (!evt) var evt = window.event;
   if (evt.pageX || evt.pageY) {
      posx = evt.pageX;
      posy = evt.pageY;
      }
   else if (evt.clientX || evt.clientY) {
      posx = evt.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
      posy = evt.clientY + document.body.scrollTop + document.documentElement.scrollTop;
      }
   if(document.getElementById("id_program_envelope")) fncClosePopUp();
   var lockOut = document.getElementById("tvg_wrapper").appendChild(document.createElement("div"));
   lockOut.id = "id_lockout";
   lockOut.className = "class_locked";
   var heightofLock = document.getElementById("tvg_listings").clientHeight;
   lockOut.style.height = heightofLock + "px";
   var divIDIS = program.id;
   var detailsForProgram = new Object();
   for(aa = 0; aa < arrAllPrograms.length; aa++) {
      var createdProgramID = "program_id_" + arrAllPrograms[aa].ScheduleID;
      if(divIDIS == createdProgramID) {
         detailsForProgram = arrAllPrograms[aa];
         }
      }
   var programEnvelope = document.getElementById("tvg_wrapper").appendChild(document.createElement("div"));
   programEnvelope.id = "id_program_envelope";
   programEnvelope.className = "class_program_details";
   var browser = navigator.appName;
   var browser_version = navigator.appVersion;
   var is6 = browser_version.indexOf("MSIE 6.0");
   if(browser == "Microsoft Internet Explorer" && is6 != - 1) {
      if(posy >= 570 && posy <= 630) {
         var positionOfPopUp = posy - 600;
         programEnvelope.style.top = positionOfPopUp + "px";
         }
      if(posy >= 631 && posy <= 670) {
         var positionOfPopUp = posy - 550;
         programEnvelope.style.top = positionOfPopUp + "px";
         }
      }
   else {
      var positionOfPopUp = posy - 700;
      programEnvelope.style.top = positionOfPopUp + "px";
      }
   var programEnvelopeTop = programEnvelope.appendChild(document.createElement("div"));
   programEnvelopeTop.id = "id_top_envelope";
   var programEnvelopeLeft = programEnvelope.appendChild(document.createElement("div"));
   programEnvelopeLeft.id = "id_left_envelope";
   var programEnvelopeMiddle = programEnvelope.appendChild(document.createElement("div"));
   programEnvelopeMiddle.id = "id_middle_envelope";
   var programEnvelopeRight = programEnvelope.appendChild(document.createElement("div"));
   programEnvelopeRight.id = "id_right_envelope";
   var programEnvelopeBottom = programEnvelope.appendChild(document.createElement("div"));
   programEnvelopeBottom.id = "id_bottom_envelope";
   var divProgramDetails = programEnvelopeMiddle.appendChild(document.createElement("div"));
   divProgramDetails.className = "class_details_for_program";
   var programSpecs = divProgramDetails.appendChild(document.createElement("div"));
   programSpecs.className = "class_program_specs";
   var programTitle = programSpecs.appendChild(document.createElement("h1"));
   programTitle.className = "class_program_title_h1";
   var cleanProgramTitle = detailsForProgram.Title;
   var newCleanTitle = cleanProgramTitle.replace(/'/g,"'");
   programTitle.innerHTML = newCleanTitle;
   var programTimes = programSpecs.appendChild(document.createElement("div"));
   programTimes.className = "class_program_times";
   var programTimesP = programTimes.appendChild(document.createElement("p"));
   programTimesP.className = "class_program_times";
   var programStartsAt = fncCreateTimeForProgram(detailsForProgram.StartTime);
   var programFinishesAt = fncCreateTimeForProgram(detailsForProgram.FinishTime);
   programTimesP.innerHTML = formatTime(programStartsAt) + " - " + formatTime(programFinishesAt) + " " + detailsForProgram.Channel + "<br />" + arrDays[programStartsAt.getDay()] + ", " + programStartsAt.getDate() + " " + arrMonths[programStartsAt.getMonth()] + " " + programStartsAt.getFullYear();
   var programDescription = programSpecs.appendChild(document.createElement("p"));
   programDescription.className = "class_program_specs_p";
   var cleanDescription = detailsForProgram.Description;
   if((cleanDescription.length > 200 && cleanProgramTitle.length > 25) || (cleanDescription.length > 220)) {
      cleanDescription = cleanDescription.substr(0, 200);
      cleanDescription = cleanDescription + "...";
      }
   var newCleanDescription = cleanDescription.replace(/'/g,"'");
   programDescription.innerHTML = newCleanDescription;
   var programMinorSpecs = programSpecs.appendChild(document.createElement("div"));
   programMinorSpecs.className = "class_program_minor_specs";
   var programMinorSpecsUL = programMinorSpecs.appendChild(document.createElement("ul"));
   // links
   var programMinorSpecsULLI = programMinorSpecsUL.appendChild(document.createElement("li"));
   var spanTitle = programMinorSpecsULLI.appendChild(document.createElement("span"));
   spanTitle.className = "title";
   spanTitle.innerHTML = "Links:";
   var spanTitle = programMinorSpecsULLI.appendChild(document.createElement("span"));
   spanTitle.className = "title_details";
   var LiveSearch = spanTitle.appendChild(document.createElement("a"));
   LiveSearch.onclick = function() {
      fncClosePopUp();
      window.open("http://search.live.com/results.aspx?q=" + detailsForProgram.Title + "&mkt=en-nz")};
   LiveSearch.title = "Find out more on '" + cleanProgramTitle.replace("&apos;", "'") + "' with Live Search";
   LiveSearch.className = "class_liveSearch";
   LiveSearch.innerHTML = "Find out more on this program with Live Search";
   var programAd = divProgramDetails.appendChild(document.createElement("div"));
   programAd.id = "ADEXPERT_RECTANGLE";
   programAd.setAttribute('name', "ADEXPERT_RECTANGLE");
   programAd.className = "class_program_ad";
   programAd.style.position = "absolute";
   programAd.style.left = "275px";
   programAd.style.top = "45px";
   fncGenerateAdvertisement();
   var closeDiv = divProgramDetails.appendChild(document.createElement("div"));
   closeDiv.className = "class_close_div";
   closeDiv.onclick = function() {
      fncClosePopUp();
      };
   // var clickedOn = program.id + "~" + newCleanTitle;
   // OMNTRPageTracking("msnnz", "entertainment", "nz-entertainment", "tvguide", "", clickedOn);
   OMNTRPageTracking("msnnz", "nz", "nz-entertainment", "tv", "popup", "tvguide.aspx");
   };
function fncClosePopUp() {
   document.getElementById("tvg_wrapper").removeChild(document.getElementById("id_program_envelope"));
   document.getElementById("tvg_wrapper").removeChild(document.getElementById("id_lockout"));
   };
function fncGenerateAdvertisement() {
   var w;
   var h;
   w = 300;
   h = 250;
   var pg;
   pg = JS_ADEXPERT_RECTANGLE;
   dapMgr.renderAd("ADEXPERT_RECTANGLE", pg, w, h);
   };

