var boxW = 587;
var boxH = 252;
var channels = {};
var drag = {};
var dragPixels = 0;
var imageCache = [];
var mode = 'standard';
var linkType = '';
var ignoreNativeDrag = function(e) {
  e.preventDefault();
  e.stopPropagation();
  return false;
};
var sponsors = [];

function toggleFullscreenGuide() {
  var cls = 'fsguide';
  if(!$("body").hasClass(cls)) {
    var ob = lbMovie('video-player');
    if(ob && ob.doPause) {
      ob.doPause();
    }
  }
  $("body").toggleClass(cls);
  updateSize();
}

function updateSize() {
  var cls = 'fsguide';
  var defH = 400;
  var mainH = defH;
  var topStripH = $(".topstrip").height();
  if($("body").hasClass(cls)) {
    mainH = $(window).height() - ($("#header").height() + $("#optionsbox").height() + $("#catsandpromos").height() + 30);
  }
  if(mainH < defH) {
    mainH = defH;
  }
  var leftName = (mode == 'vertical') ? 'times' : 'channels';
  var gridH = mainH - topStripH;
  var searchH = mainH - 20;
  $("#grid, ."+leftName).height(gridH);
  $(".timeslots").height(mainH);
  $("#searchresults").height(mainH);
  $("#searchresults .scrollarea").height(searchH);
 
  positionInfoBox();
}

function setMode(m) {
  mode = m;
}

function setLinkType(type) {
  linkType = type;
}

function cacheImage(path) {
  var img = new Image();
  img.src = path;
  imageCache[imageCache.length] = img;
  return img;
}

function resizeVideo() {
  $("#progmediawrapper").toggleClass('big');
}

function togglePlay() {
  var ob = lbMovie('tvguideplayer');
  if(ob) {
    ob.togglePlay();
  }
}

function showVideo(id) {
  LbVideoPlace('progvideo',
                 {id: 'tvguideplayer',
                  width : '100%',
                  height  : '100%',
                  autoplay: true,
                  skin : '',
                  //skin : 'http://www.tiscali.co.uk/video/tiscali.swf',
                  hoverControls : true,
                  xmlFile : 'http://www.tiscali.co.uk/scripts/make-playlist.php?ids='+id,
                  finalPic: 'http://media.tiscali.co.uk/images/gfx/video-hub/tiscali-video-play-live.gif'
                  }
               );
  var ob = lbMovie('video-player');
  if(ob && ob.doPause) {
    ob.doPause();
  }
}

function getDateFromTimeCode(s) {
  var res = '';
  if(s.match(/^(\d\d\d\d)(\d\d)(\d\d)/)) {
    res = RegExp.$1+'-'+RegExp.$2+'-'+RegExp.$3;
  }
  return res;
};

function getTimeFromTimeCode(s) {
  var res = '';
  if(s.match(/(\d\d)(\d\d)\d\d$/)) {
    var hr = RegExp.$1;
    var min = RegExp.$2;
    hr = parseInt(hr.replace(/^0/,''),10);
    var suffix = 'am';
    if(hr >= 12) {
      suffix = 'pm';
      if(hr > 12) {
        hr -= 12;
      }
    } else if(hr === 0) {
      hr = 12;
    }
    res = hr+':'+min+suffix;
  }
  return res;
};


function getToolsHtml(data) {
  var moreInfoUrl = '/tv/shows/details/'+getSidFromProg(data)+'/';
  var tools = [];
  tools[tools.length] = {'id':'more-info',
                         'url': moreInfoUrl,
                         'title':'More information'};
  var favStatus = (data.fav == '1') ? 'remove' : 'add';

  tools[tools.length] = {'id':'fav-'+favStatus,
                         'click':favStatus+'Fav(\'show\',\''+data.show_id+'\',this,\''+data.evid+'\')',
                         'title':'Favourites: '+favStatus};
  if(data.od == '0') {
    tools[tools.length] = {'id':'reminder',
                           'click':'remindMe(\''+data.evid+'\')',
                           'title':'Remind me'};
  }
  var planStatus = (data.plan == '1') ? 'remove' : 'add';
  tools[tools.length] = {'id':'planner-'+planStatus,
                         'click':planStatus+'Planner(\''+data.show_id+'\')',
                         'title':'Planner: '+planStatus};

  var html = '<div class="tool">';
  var i,t,link,click,tit;
  for(i = 0;i < tools.length;i++) {
    t = tools[i];
    link = t.url ? t.url : '#';
    click = t.click ? ' onclick="'+t.click+';return false;"' : '';
    tit = t.title ? t.title : '';
    html += '<a href="'+link+'"'+click+' title="'+tit+'"><img src="/tv/images/icons/gallery/'+t.id+'.png" style="margin-top: 4px;" /></a>';
    if(i == 1) {
      //html += '<div style="clear: both;"></div>';
    }
  }
  html += '<div style="clear: left;"></div>';
  html += '</div>';
  return html;
}

function formatProgDetail(data) {
  var html = '';

  // Channel info start.
  var chan = data.chan;
  var logoId = (parseInt(chan.rg) > 0) ? ('rg'+chan.rg) : chan.id;
  var chLink = '/tv/tv-guide/channel/' + chan.id + '/' + encodeURIComponent(chan.name);
  var logo = '<a href="'+chLink+'" title="View details about '+chan.name+'"><img src="/tv/images/channel-logos/logo_'+logoId+'.gif" width="68" height="38" alt="'+chan.name+'" title="'+chan.name+'" style="float: right; margin: 0px 0px 8px 8px;" /></a>';
  // Channel info end.

  var dt = getDateFromTimeCode(data.start);
  if(dateInfo[dt]) {
    dt = dateInfo[dt].rel_name;
  }
  var timeOn = getTimeFromTimeCode(data.start) + ' ' + dt;
  if(data.od == '1') {
    timeOn = 'ANY TIME';
  }
  html += '<div style="float: right; font-size: 12px;">Broadcast: <strong>'+timeOn+'</strong></div>';

  // Tabs start.
  html += '<div class="tabs">';
  html += '<a id="tabsynopsis" href="#" class="tabfirst tabsel" onclick="showInfo(\'synopsis\');return false;" title="Summary of the programme">Synopsis</a>';
  html += '<a id="tabdetail" href="#" onclick="showInfo(\'detail\');return false;" title="Programme detail including duration, year, certificate etc.">Detail</a>';
  if(data.cast.length) {
    html += '<a id="tabcast" href="#" onclick="showInfo(\'cast\');return false;" title="People starring in the programme/movie">Cast</a>';
  }
  if(data.other_airings.length) {
    html += '<a id="tabairings" href="#" onclick="showInfo(\'airings\');return false;" title="Other times this is on">Other airings</a>';
  }
  if(parseInt(data.show_id) > 0) {
    html += '<a id="tabrating" href="#" onclick="showInfo(\'rating\');return false;" title="See how our users have rated this">Rating</a>';
  }
  html += '<div style="clear: left;"></div>';
  html += '</div>';
  // Tabs end.

  html += '<div style="clear: right; float: right; width: 202px; margin-left: 8px;">';
  // media start.
  var haveVideo = (parseInt(data.promo.id) > 0);
  var haveMedia = (data.image || haveVideo);
  var tit =  haveVideo ? data.promo.title : data.title;
  html += '<div id="progmediawrapper">';
  html += '<div class="reduce">';
  html += '<div class="resizetext" style="float: right; width: 84px; margin: 40px 8px 8px 8px;">';
  html += '<a href="#" onclick="resizeVideo();return false;">Normal size</a>';
  html += '</div>';
  html += '</div>';
  html += '<div style="border: solid 1px #d4d4d4;">';
  html += '<div class="progmedia" title="'+tit+'">';
  html += '<div id="progvideo"></div>';
  if(haveVideo) {
    html += '<img src="/images/t.gif" class="vidhotspot" onclick="togglePlay()"/>';
  }
  var img = '/tv/images/tiscali-tv-generic.jpg';
  if(data.image) {
    img = data.image;
  }
  html += '<img src="'+img+'" width="200" height="112" style="background-color: #eee;" />';
  //html += '</div>';
  html += '</div>';
  html += '</div>';

  if(haveVideo) {
    html += '<div class="enlarge resizetext" style="position: absolute;"><a href="/videos/'+data.promo.id+'" onclick="resizeVideo();return false;" title="Enlarge video">Enlarge</a></div>';
  }

  // Tools.
  html += '<div class="fright" style="padding-top: 8px;">';
  html += getToolsHtml(data);
  html += '</div>';
  // Tools end.

  html += '</div>';

  // media end.

  html += '</div>';

  html += '<div class="desc">';

  html += '<div id="tabconsynopsis" class="tabcontent">'+logo;
  if(data.ep) {
    html += '<div><strong>'+data.ep+'</strong></div>';
  }
  var desc = (data.desc == '') ? 'No synopsis' : data.desc;
  html += '<div class="mbot">'+desc+'</div>';
  if(data.catchup == '1') {
    html += '<div><strong>Available on Tiscali\'s Catch Up service.</strong></div>';
  }
  html += '</div>';

  // Rating.
  html += '<div id="tabconrating" class="tabcontent hide">'+logo;
  var ans = '';
  var per = '';
  if(data.poll) {
    html += '<strong>Our viewers rating</strong>';
    for(i = 0;i < data.poll.answer.length;i++) {
      ans += '<dt class="rank'+(i+1)+'">'+data.poll.answer[i]+'</dt><dd>'+data.poll.percent[i]+'%</dd>';
      per += '<li class="rank-disp'+(i+1)+'" style="height: '+data.poll.percent[i]+'%;"></li>';
    }
    html += '<ul class="rating-chart">';
    html += per;
    html += '</ul>';
    html += '<dl class="table-display">';
    html += ans;
    html += '</dl>';
  }
  html += '</div>';

  html += '<div id="tabcondetail" class="tabcontent hide">'+logo;
  if(data.cert) {
    html += '<div class="mbot" style="clear: right; float: right;"><img src="/tv/images/certificates/cm-'+data.cert+'.gif" width="50" heigth="50" alt="Certificate: '+data.cert+'" /></div>';
  }

  html += '<div class="mbot"><strong>Time:</strong> '+timeOn+'</div>';
  if(data.dur) {
    html += '<div class="mbot"><strong>Duration:</strong> '+data.dur+' mins</div>';
  }
  if(data.year > 0) {
    html += '<div class="mbot"><strong>Year:</strong> '+data.year+'</div>';
  }
  if(data.cat) {
    html += '<div class="mbot"><strong>Category:</strong> '+data.cat+'</div>';
  }
  if(data.attributes) {
    html += '<div class="mbot"><strong>Attributes:</strong> '+data.attributes+'</div>';
  }
  html += '</div>';

  if(data.cast.length) {
    var castImages = '';
    html += '<div id="tabconcast" class="tabcontent hide">'+logo;
    for(i = 0;i < data.cast.length;i++) {
      var cm = data.cast[i];
      if(i > 0) {
        html += ', ';
      }
      var txt = cm.name;
      if(cm.url) {
        txt = '<a href="'+cm.url+'">' + txt + '</a>';
      }
      html += txt;
      for(j = 0;j < cm.images.length;j++) {
        var img = '<img src="'+cm.images[j]+'" width="70" height="70" alt="'+cm.name+'" title="'+cm.name+'" class="img" style="margin: 8px 8px 0px 0px;" />';
        if(cm.url) {
          img = '<a href="'+cm.url+'">' + img + '</a>';
        }
        castImages += img;
      }
    }
    html += '<div class="clear"></div>';
    html += '<div>'+castImages+'</div>';
    html += '</div>';
  }

  if(data.other_airings.length) {
    html += '<div id="tabconairings" class="tabcontent hide">'+logo;
    html += '<strong>Also showing at these times:</strong><br />'
    var i,o,tm,dt;
    for(i = 0;i < data.other_airings.length;i++) {
      o = data.other_airings[i];
      tm = getTimeFromTimeCode(o.start);
      dt = getDateFromTimeCode(o.start);
      if(dateInfo[dt]) {
        dt = dateInfo[dt].rel_name;
      }
      html += '<a href="#" onclick="vp(\''+o.evid+'\');return false;">';
      html += tm + ' ' + dt + ' on ' + o.channel_name + '</a><br />';
    }
    html += '</div>';
  }

  html += '</div>';

  // Channel numbers.
  html += '<div style="margin-top: 8px;">';
  for(i = 0;i < tvData.services.length;i++) {
    var s = tvData.services[i];
    var cn = chan['cn_'+s.id];
    if(parseInt(chan.rg) > 0) {
      cn = s.rp + chan.rg;
    }
    if(cn == '') {
      cn = '-';
    }

    html += '<div class="chan_num chan_num_'+s.id+'" title="'+s.name+' channel number '+cn+'"><span class="txt">'+cn+'</span></div>';
  }
  html += '</div>';

  return html;
}

function showProgDetail(data) {
  document.location = '#id='+data.evid;
  var html = formatProgDetail(data);
  var title = data.title;
  $("#infobox .ptitle").html(title);
  $("#proginfo").html(html);
  if(parseInt(data.promo.id) > 0) {
    showVideo(data.promo.id);
  }
}


function getProgDetails(evId) {
  var url = 'tv-prog-details-json3.php';
  var params = {'id': evId};
  var info = $("#proginfo");
  var busy = '<div><img src="/tv/images/busy.gif" width="18" height="18" /></div>';
  info.html(busy);
  var out = '';
  $.getJSON(url,params,function(data) {
    if(data.evid) {
      showProgDetail(data);
    } else {
      closeInfo();
    }
  });
}

function closeInfo() {
  document.location = '#id=';
  $("#infoboxhandle").fadeOut("slow",function() {
    $("#infobox").html('');
  });
}

function vp(evId,ignoreDrag) {
  if(!ignoreDrag) {
    if(drag.status == 'dragged') {
      return false;
    }
  }
  var url = '';
  if(linkType == 'main') {
    url = '/tv/tv-guide/#id='+evId;
  } else if(linkType == 'details') {
    url = '/tv/tv-guide/prog-details.php?id='+evId;
  }
  if(url != '') {
    document.location = url;
    return false;
  }
  var pr = $("#"+evId);
  var gr = $("#grid");
  var prOff = pr.offset();
  var grOff = gr.offset();
  var scrL = gr.get(0).scrollLeft;
  var scrT = gr.get(0).scrollTop;
  var grW = gr.width();
  var grH = gr.height();
  var boxX = ((grW - boxW) / 2);
  var boxY = ((grH - boxH) / 2);
  var closeHtml = '<div class="closebut"><a href="#" onclick="closeInfo(); return false;" title="Close this information box."><img src="/tv/images/tv-but-close.gif" width="19" height="18" alt="Close" /></a></div>';
  var end = {left: boxX+'px',
             top: boxY+'px',
             width: boxW+'px',
             height: boxH+'px',
             fontSize: '25px'};
  var info = '<div id="proginfo"></div>';
  var content = '<span class="pinner"><span class="ptitle"></span><span class="ptime"></span></span>';
  $("#infoboxshad").hide();
  if(pr.length) {
    var start = {left: (prOff.left-grOff.left)+'px',
                 top: (prOff.top-grOff.top)+'px',
                 width: pr.width()+'px',
                 height: pr.height()+'px',
                 fontSize: '12px'};

    var content = pr.html();
    $("#infoboxhandle").css(start).find("#infobox").html(content).end().show().animate(end,300,function() {
      $("#infoboxshad").show();
      $(this).find(".pinner").prepend(closeHtml).append(info);
      getProgDetails(evId);
    });
  } else {
    $("#infoboxhandle").find("#infobox").html(content).end().show().animate(end,100,function() {
      $("#infoboxshad").show();
      $(this).find(".pinner").prepend(closeHtml).append(info);
      getProgDetails(evId);
    });

  }

  return false;
}

function viewProgInfo(evId) {
  vp(evId,true);
}

function getLoadedFunc(b) {
  return function(data) {
    blocks[b].status = 'loaded';
    blocks[b].curVis = true;
    blocks[b].html = data;
    var ob = $("#block"+b);
    var f = function() {
      ob.html(blocks[b].html);
    };
    setTimeout(f,10);
  }
}

function loadBlocks() {
  var b;
  for(b in blocks) {
    var ob = $("#block"+b);
    if(blocks[b].vis && !blocks[b].curVis) {
      if(!blocks[b].status) {
        blocks[b].status='loading';
        var url = 'get-data.php';
        var params = {'block':b,'size':blockSize};
        $.get(url,params,getLoadedFunc(b),'html');
      } else {
        ob.html(blocks[b].html);
        blocks[b].curVis = true;
      }
    } else if(!blocks[b].vis && blocks[b].curVis) {
      ob.html('');
      blocks[b].curVis = false;
    }
  }
}

function addSponsor(id) {
  sponsors[sponsors.length] = id;
}

function handleScroll() {
  var ids = ['channels','times'];
  if(mode == 'vertical') {
    ids = ['times','channels'];
  }
  $("#"+ids[0]).get(0).scrollTop = $(this).get(0).scrollTop;
  $("#"+ids[1]).get(0).scrollLeft = $(this).get(0).scrollLeft;
  if(mode == 'standard') {
    var scrollBarW = 16;
    var w = $(this).width() - scrollBarW;
    var scrollLeft = $(this).get(0).scrollLeft;
    var left = scrollLeft + ((w - 400) /2);
    $("#guidebanner").css("left",left+'px');
    var i;
    for(i = 0;i < sponsors.length;i++) {
      var ob = $("#"+sponsors[i]);
      var spW = ob.width();
      var spLeft = scrollLeft + ((w - spW) /2);
      ob.css("left",spLeft+'px');
    }
  }
}

function showInfo(name) {
  $("#infobox .tabs a").removeClass("tabsel");
  $("#infobox #tab"+name).addClass("tabsel");
  $("#infobox .tabcontent").hide();
  $("#infobox #tabcon"+name).show();
}

function minutesToPixels(m) {
  var res = m * 4;
  return res;
}

function goToHour(hr,func) {
  var pos = minutesToPixels(hr * 60);
  var attr = {'scrollLeft':pos+'px'};
  if(mode == 'vertical') {
    attr = {'scrollTop': pos+'px'};
  }
  $("#grid").animate(attr,500,func);
}

function goToNow(func) {
  var dt = new Date();
  var hr = dt.getHours();
  goToHour(hr,func);
}

function getSidFromProg(p) {
  var sid = p.title;
  sid = sid.toLowerCase(sid);
  sid = sid.replace(/[^\w]/g,' ');
  sid = sid.replace(/^\s*/,'');
  sid = sid.replace(/\s*$/,'');
  sid = sid.replace(/\s+/g,'-');
  return sid;
}

function updateTimeLine() {
  var dt = new Date();
  var hr = dt.getHours();
  var min = dt.getMinutes();
  var pos =  minutesToPixels((hr*60)+min);
  var attr = {'left':pos+'px'};
  if(mode == 'vertical') {
    attr = {'top':pos+'px'};
  }
  $("#timeline").css(attr);
}

function loadSettings() {
  var url = 'settings.php';
  $.get(url,{},function(data) {
    $("#settings").find("#settingscontent").html(data).end().slideDown("slow");
    document.location = '#settings';
  },'html');
}

function updateList(id,name,b) {
  var fm = document.getElementById("editform");
  var obj;
  var i;
  var pos = -1;

  obj = fm.channellist;
  var len = obj.options.length;
  for(i = 0;i < obj.options.length;i++) {
    if(obj.options[i].value == id) {
      pos = i;
      break;
    }
  }

  if(b && (pos == -1)) {
    // Add item.
    obj.options[obj.options.length] = new Option(name,id);
  } else if(!b && (pos != -1)) {
    // Remove item.
    for(i = pos;i < len-1;i++) {
      obj.options[i].value = obj.options[i+1].value;
      obj.options[i].text = obj.options[i+1].text;
    }
    obj.options.length--;
  }

}
updatelist=updateList;

function selectChannelCat(catId,select) {
  var catClass = '#settings .chancat'+catId;
  var sel = select ? 'checked' : '';
  $(catClass).find("input").each(function(i) {
    this.checked = select;
    var id = this.value;
    var name = $(this).parent().find("label").html();
    updateList(id,name,select);
  });
}

function selectChannelService() {
  var service = $("#tvservice").val();
  $("#settings .settingschannel input").each(function() {
     this.checked = 'checked';
     var id = this.value;
     var name = $(this).parent().find("label").html();
     updateList(id,name,true);
  });
  $("#settings .settingschannel").not(".tsp_"+service).find("input").each(function() {
    this.checked = '';
     var id = this.value;
     var name = $(this).parent().find("label").html();
     updateList(id,name,false);
  });
}

function moveitem(dir) {
  var obj = document.getElementById('channellist');
  var len = obj.options.length;
  var newpos = -1;
  var si = obj.selectedIndex;
  if(si < 0) {
    return;
  }

  if(dir == "up") {
    newpos = si-1;
  } else if(dir == "down") {
    newpos = si+1;
  }
  if((newpos >= 0) && (newpos < len)) {
    var tmpv = obj.options[si].value;
    var tmpt = obj.options[si].text;
    obj.options[si].value = obj.options[newpos].value;
    obj.options[si].text = obj.options[newpos].text;
    obj.options[newpos].value = tmpv;
    obj.options[newpos].text = tmpt;
    obj.selectedIndex = newpos;
  }

}

function checkForm() {
  var fm = document.getElementById('editform');
  var obj = fm.channellist;
  var i;
  var res = "";
  for(i = 0;i < obj.options.length;i++) {
    if(i > 0) {
      res += ",";
    }
    res += obj.options[i].value;
  }
  fm.channelids.value = res;
}

function closeSettings() {
  $("#settings").hide();
}

function saveSettings() {
  checkForm();
  var url = '/tv/tv-guide/settings.php';
  var channelids = $("#channelids").val();
  var service = $("#tvservice").val();
  var params = {
    'channelids': channelids,
    'tvservice': service,
    'mode':'save'
  };
  for(var i = 1;i <= 3;i++) {
    params['rg'+i] = $("#rg"+i).val();
  }
  $.post(url,params,function(data,status) {
    // Reset reload page.
    var loc = ''+document.location;
    loc = loc.replace(/#.*$/,'');
    document.location = loc;

    // close settings window.
    closeSettings();
  });
}

function doSearch(cat) {
    var q = $("#searchquery").val();
    var url = 'search3.php';
    var dt = $("#listingsdate").val();
    var epgFormat = 'standard';
    var params = {bd: dt,epgformat: epgFormat,version:3};
    if(cat) {
      params.category = cat;
    } else {
      params.query = q;
    }
    var busy = '<img src="/tv/images/busy.gif" width="18" height="18" alt="loading" />';
    $("#searchresultsinner").html(busy);
    $("#searchresults .scrollarea").animate({'scrollTop': 0},500);
    $("#searchresults").show("slow",positionInfoBox);
    $.get(url,params,function(data,status) {
      $("#searchresultsinner").html(data);
    },'html');
}

function positionInfoBox() {
  var x = ($("#grid").width() - boxW) / 2;
  var y = ($("#grid").height() - boxH) / 2;
  $("#infoboxhandle").stop().animate({'left': x+'px','top': y+'px'},500);
}

function closeSearch() {
  $("#searchresults").hide("slow",positionInfoBox);
}

function startProg() {
  var loc = ''+document.location;
  var hash = ''+document.location.hash;
  var id = '';
  if(hash.match(/id=(\d+_\w+)/)) {
    id = RegExp.$1;
  } else if(loc.match(/[\?\&]id=(\d+_\w+)/)) {
    id = RegExp.$1;
  }
  if(id != '') {
    vp(id);
  }
}

function setUpDragCode() {
$('#grid').bind('drag',ignoreNativeDrag);
$('#grid').bind('dragstart',ignoreNativeDrag);
$('#grid').bind('draggesture',ignoreNativeDrag);
$('#grid').bind('selectstart',ignoreNativeDrag);

    // Drag code start.
    $("#grid").mousedown(function(e) {
      var d = drag;
      d.status = '';
      var g = $("#grid");
      var pos = g.offset();
      var minx = pos.left + g.width() - 16;
      var miny = pos.top + g.height() - 16;
      if((e.pageX < minx) && (e.pageY < miny)) {
        d.mdx = e.pageX;
        d.mdy = e.pageY;
        d.scrx = g.get(0).scrollLeft;
        d.scry = g.get(0).scrollTop;
        d.element = $("#grid").get(0);
        d.mask = 0;
        //d.status = 'dragging';
/*
        $('#grid').bind('drag',ignoreNativeDrag);
        if($.browser.msie) {
          $('#grid').bind('dragstart',ignoreNativeDrag).bind('selectstart', ignoreNativeDrag);
        } else {
          $('#grid').bind('draggesture',ignoreNativeDrag);
        }
*/
      }
    });

    $(document).mousemove(function(e) {
      var d = drag;
      if(((typeof d.mdx) == 'number')) {
        var shiftX = e.pageX - d.mdx;
        var shiftY = e.pageY - d.mdy;
        if(d.status != 'dragging') {
          if((Math.abs(shiftX) > dragPixels) || (Math.abs(shiftY) > dragPixels)) {
            d.element = $("#grid").get(0);
            if(d.element) {
              d.element.style.MozUserSelect = 'none';
              //$(".prog").css('cursor','url(/tv/images/grabbing.cur), -moz-grabbing');
            }
            d.status = 'dragging';
            //$("#gridcover").css("zIndex",100);
          }
        }
        if(d.status == 'dragging') {
          if(d.element) {
            var sx = d.scrx - e.pageX + d.mdx;
            var sy = d.scry - e.pageY + d.mdy;
            d.element.scrollLeft = sx;
            d.element.scrollTop = sy;
          }
        }
      }
    });

    $(document).mouseup(function(e) {
      var d = drag;
      d.mdx = null;
      d.mdy = null;
      if(d.status == 'dragging') {
        document.onselectstart = null;
        e.preventDefault();
        e.stopPropagation();
        if(d.element) {
          d.element.style.MozUserSelect = null;
        }
        //$("#gridcover").css("zIndex",-1);
        d.status = 'dragged';
        //$(".prog").css('cursor','pointer');
/*
        if($.browser.msie) {
          $("#grid").unbind('dragstart', ignoreNativeDrag).unbind('selectstart', ignoreNativeDrag);
        } else {
          $('#grid').unbind('draggesture',ignoreNativeDrag);
        }
*/
      }
    });
    // Drag code end.

}

setInterval('updateTimeLine()',5000);

cacheImage('/tv/images/busy.gif');
cacheImage('/tv/images/tv-but-close.gif');
cacheImage('/tv/images/tv-prog-bg.jpg');
cacheImage('/tv/images/tv-top2bot-fade.jpg');
cacheImage('/tv/images/tv-slot-bg.jpg');
cacheImage('/tv/images/service-channels.jpg');
cacheImage('/tv/images/button-tool-blk-grn.gif');
cacheImage('/tv/images/icons/gallery/more-info.png');
cacheImage('/tv/images/icons/gallery/fav-add.png');
cacheImage('/tv/images/icons/gallery/reminder.png');
cacheImage('/tv/images/icons/gallery/planner-add.png');
