MyGames = {
  // cookie format is of games concationated with _|_
  // game data format is id _:_ name _:_ url _:_ visits
  // game array is 2 dimensional in the order above.
  cookie: null, 
  games: []
};
 
MyGames.init = function () {
  var cookieName = 'mygames';
  var theCookie = "" + document.cookie;
  
  var ind=theCookie.indexOf(cookieName);
  if (ind==-1 || cookieName=="") return ""; 
  var ind1=theCookie.indexOf(';',ind);
  if (ind1==-1) ind1=theCookie.length; 
  this.cookie = unescape(theCookie.substring(ind+cookieName.length+1,ind1));
   
  if (this.cookie != '')   
  {
    var games = this.cookie.split('_|_');
    for (var i=0; i < games.length; ++i)
    {
    	this.games.push(games[i].split('_:_'));
    }
  }
}
 
MyGames.write = function(template) {    
  for (var i=0; i < this.games.length; i++)
  {
    if ((this.games[i][1] != null) && (this.games[i][2] != null))
    {
      var line = template.replace('[url]', this.games[i][2]).replace('[title]', this.games[i][1]);
      document.writeln(line);
    }
  }
}
 
MyGames.count = function ()  {
  return this.games.length;
}
 
MyGames.registerVisit = function(id) {
  for (var i=0; i < this.games.length; i++)
  {
    if ((this.games[i][0] != null) && (checkforid == this.games[i][0]))
    {
      ++this.games[i][3];
      this.SaveCookie();
      break;
    }
  }  
}
 
MyGames.SaveCookie = function() {
  var value = '';
  for (var i=0; i < this.games.length; i++)
  {
    if (i > 0)
      value += '_|_'
    value += this.games[i].join('_:_');  
  }
  
  var today = new Date();
  var expiresDate = new Date(today.getTime() + (1000 * 60 * 60 * 24 * 365 * 5));

  document.cookie = "mygames=" + escape(value) + "; path=/; expires=" + expiresDate.toGMTString();
}
 
MyGames.SetCookie = function(id, name, url) {
  this.games.push([id, name, url, 1]);
  this.SaveCookie(); 
}

MyGames.RemoveCookie = function(id) {
  for (var i=0; i < this.games.length; i++)
  {
    if ((this.games[i][0] != null) && (id == this.games[i][0]))
    {
      this.games.splice(i, 1);
      MyGames.SaveCookie();
      window.location.reload(true);
      return true;
    }
  }
  return false;  
}
 
MyGames.HasCookie = function(checkforid) {
  var result = 0;
  for (var i=0; i < this.games.length; i++)
  {
    if ((this.games[i][0] != null) && (checkforid == this.games[i][0]))
    {
      result = 1;
      break;
    }
  }
  return result;
}
   
 
MyGames.init();
 
var CGP = {}; 
 
CGP.Game = {
  ZOOM_FACTOR: 0.1,
  
  maxWidth: null,
  
  setMaxWidth: function(width) {
    CGP.Game.maxWidth = width;
  },
  
  zoomElement: function(element, factor) {
    if (element == null ||
        element.width == null || element.width == '' || 
        element.height == null || element.height == '') return false;
        
    var width = Math.round(element.width * (1 + factor));
    var height = Math.round(element.height * (1 + factor));
    
    if (CGP.Game.maxWidth != null && width > CGP.Game.maxWidth) 
    {
      alert('Het is niet mogelijk om verder in te zoomen op dit spel.');
      return true;
    }

    element.width = width;
    element.height = height;
    
    return true;    
  },
  
  zoom: function(factor) {
    var content = $('cgpGameContent');
    if (content == null) 
    {
      alert('Het is niet mogelijk om in of uit te zoomen op dit spel.');
      return;
    }

    var resultIFrame = this.zoomElement(content.down('iframe'), factor);
    if (!resultIFrame) {
      var resultEmbed  = this.zoomElement(content.down('embed'), factor);
      var resultObject = this.zoomElement(content.down('object'), factor);
    }
    
    if (!resultEmbed && !resultObject && !resultIFrame)
    {
      alert('Het is niet mogelijk om in of uit te zoomen op dit spel.');
      return;
    }
  },

  zoomIn: function() {
    this.zoom(CGP.Game.ZOOM_FACTOR);
  },
  
  zoomOut: function() {
    this.zoom(-CGP.Game.ZOOM_FACTOR);
  },
 
  fullscreen: function(homeUrl) {
    var content = $('cgpGameContent');
    if (content == null) 
    {
      alert('Het is niet mogelijk om dit spel fullscreen te spelen.');
      return;
    }
    
    var width = content.getWidth();
    var height = content.getHeight() + 20;

    var iframe = content.down('iframe');
    var embed = content.down('embed');
    var object = content.down('object');
    
    var source = '';
    
    if (iframe != null) {
      source = iframe.src;
    } else if (embed != null) {
      source = embed.src;
    } else if (object != null) {
      var param = object.down("param[name='movie']");
      if (param != null) {
        source = param.value;
      }
    }
    
    var win = window.open(source, 'game', 'width=' + width + ',height=' + height + ',menubar=0,toolbar=0,status=0,scrollbars=1,resizable=1');
    
    if (source == null || source == '') {
      win.document.writeln('<html><head><title>' + document.title + '</title></head><body>' + content.innerHTML + '</body></html>');
      win.document.close();
    }

    window.location.href = homeUrl;
  },
 
  addToMyGames: function(id, name, url) {
    if (MyGames.HasCookie(id) == 0) {
      MyGames.SetCookie(id, name, url);
      window.location.reload(true);
    } else {
      alert('Het spel is al toegevoegd aan \'Mijn Spelletjes\'');
    }
  },
 
  deleteFromMyGames: function(id) {
    if (!MyGames.RemoveCookie(id)) {
      alert('Het spel is reeds geschrapt uit \'Mijn Spelletjes\'');
    }
  },

  updateReplies: function(el, url) {
    new Ajax.Updater(el, url, {
      method: 'get',
      onSuccess: function(){$(el).scrollTop = 0;}
    });
  },

  loadReply: function(el, url) {
    CGP.Game.update(el, url);
    window.location.href = '#' + $(el).id + '-anchor';    
  },
  
  setRating: function(el, input, classSelected, classUnselected, rating) {
    $(input).value = rating;
    this.previewRating(el, classSelected, classUnselected, rating);
  },
   
  resetRating: function(el, input, classSelected, classUnselected) {
    this.previewRating(el, classSelected, classUnselected, parseInt($F(input)));
  },
   
  previewRating: function(el, classSelected, classUnselected, rating) {
    var box = $(el).up('.ratebox');
    
    for (var i = 1; i <= 5; i++) {
      var rate = box.down('.rate' + i);
      rate.removeClassName(rating < i ? classSelected : classUnselected);
      rate.addClassName(rating >= i ? classSelected : classUnselected);
    }
  },  

  storeReply: function(el, form, url) {
    var params = $(form).serialize(true);
    CGP.Game.update(el, url, params);
  },
   
  loadSendAFriend: function(el, url) {
    CGP.Game.update(el, url);
    window.location.href = '#' + $(el).id;
  },
 
  storeSendAFriend: function(el, form, url) {
    var params = $(form).serialize(true);   
    CGP.Game.update(el, url, params);
  },
   
  loadReportBroken: function(el, url) {
    CGP.Game.update(el, url);
    window.location.href = '#' + $(el).id;    
  },
 
  storeReportBroken: function(el, form, url) {
    var params = $(form).serialize(true);
    params.width = screen.width;
    params.height = screen.height;
    CGP.Game.update(el, url, params);
  },
 
  update: function(el, url, params) {
    new Ajax.Updater(el, url, { parameters: params });
    $(el).show();
  }
};

 
CGP.Referrer = {
  getRequestVariables: function() {
    var url  = window.location.href.replace(/&amp;/g, '&');
    var parameters;
    var query;
    var getparams = {};
   
    if (url.indexOf('?') > -1) {
      var splits = url.split('?');
      url = splits[1];
    }

    if (url.indexOf('&') > -1) {
      parameters = url.split('&');
    }
    else {
      parameters = [url];
    }
  
    for (var i = 0; i < parameters.length; i++) {
      parameters[i] = parameters[i].indexOf('=') > -1 ? parameters[i] : parameters[i] + '=';
      query = parameters[i].split('=')
      getparams[query[0]] = decodeURI(query[1].replace(/\+/g, ' '));
    }
  
    return getparams;
  },

  getCookieVariables: function() {
	  var cookies = new Array();
	  var cookiestring = document.cookie ? document.cookie : '';
	  var splits, key;
	  
	  if (cookiestring) {
	    cookiestring = cookiestring.replace(/; /, ';')
	    var cookiearray = cookiestring.indexOf(';') > -1
	                  ? cookiestring.split(';')
	                  : new Array(document.cookie);
	    for(var i = 0; i < cookiearray.length; i++) {
	      cookiearray[i].indexOf('=') > -1 ? cookiearray[i] : cookiearray[i] + '=';
	      splits = cookiearray[i].split('=');
	      key = splits[0].charAt(0) == ' '
	                ? splits[0].substring(1, splits[0].length)
	                : splits[0];
	      cookies[key] = splits[1].replace(/\+/g, ' ');
	    }
	  }
	  return cookies
  },

  write: function(baseUrl, siteId) {
    var get = CGP.Referrer.getRequestVariables();
    var referrer = false;
    
    // check if we have  a referrer
    if (get['referer'] || get['referrer']) {
      referrer = get['referer'] ? get['referer'] : get['referrer'];
    
      var expires = "";
      
      var date = new Date();
      date.setTime(date.getTime()+(30*24*60*60*1000));
	    var expires = "; expires="+date.toGMTString();
	
	    document.cookie = 'referrer' + "=" + referrer + expires + "; path=/";
    }
    
    // check cookie for referrer
    else {
      var cookie = CGP.Referrer.getCookieVariables();
      if (cookie['referrer']) {
        referrer = cookie['referrer'];
      }
    }

    // write referrer stylesheet    
    if (referrer) {
      var file = baseUrl + '/referrers/' + siteId + '/' + referrer + '.css';
      document.writeln('<link rel="stylesheet" type="text/css" href="' + file + '" />');
    }
  }
}
 
CGP.getOuterHeight = function(el) {
    var marginTop = el.getStyle('marginTop') || '0px';
    var marginBottom = el.getStyle('marginBottom') || '0px';
    var paddingTop = el.getStyle('paddingTop') || '0px';
    var paddingBottom = el.getStyle('paddingBottom') || '0px';
    
    return parseInt(marginTop.split('px')[0]) + parseInt(marginBottom.split('px')[0]) +
           parseInt(paddingTop.split('px')[0]) + parseInt(paddingBottom.split('px')[0]);           
  };

CGP.fixCellDimensions = function() {
  var table = $('tableHome');
  if (!table) return;
   
  var tableWidth = table.getWidth();
  var firstRowCells = $$('#tableHome > TBODY > TR:first-child > TD');

  var cellCount = 0;
  firstRowCells.each(function(cell) {
    cellCount += (cell.colSpan ? cell.colSpan : 1);
  });
   
  var cells = $$('#tableHome > TBODY > TR > TD');
  
  // collect dimensions
  var baseCellWidth = Math.floor(tableWidth / cellCount);
  var dimensions = [];
  for (var i = 0; i < cells.length; i++) {
    var cell = cells[i];

    var content = cell.down('.panelcontent');
    var cellWidth = cell.width ? cell.width : baseCellWidth * (cell.colSpan ? cell.colSpan : 1);
    
    if (content && (cell.colSpan ? cell.colSpan : 1) != cellCount) {
      dimensions.push({ cell: cell, cellWidth: cellWidth });
    } 
  }
  
  // apply the new dimensions for everything at once so that they can't influence each other 
  for (var i = 0; i < dimensions.length; i++) {
    dimensions[i].cell.width = dimensions[i].cellWidth;
  }
  
  // collect dimensions
  var dimensions = [];    
  for (var i = 0; i < cells.length; i++) {
    var cell = cells[i];

    var content = cell.down('.panelcontent');
     
    if (content && (cell.colSpan ? cell.colSpan : 1) != cellCount) {
      var header = cell.down('.paneltop');
      var footer = cell.down('.panelbottom');
      var contentHeight = cell.getHeight() - this.getOuterHeight(content) - header.getHeight() - this.getOuterHeight(cell) - footer.getHeight();  
      dimensions.push({ content: content, contentHeight: contentHeight });
    } 
  }  
  
  for (var i = 0; i < dimensions.length; i++) {
    dimensions[i].content.setStyle({ height: dimensions[i].contentHeight + 'px' });
  }  
   
  table.setStyle({ visibility: '' });   
};


CGP.addFavorite = function() {
  if (document.all) {
    window.external.AddFavorite(window.location.href, document.title);  
  } else {
    alert('Sleep deze link naar je favorieten om deze pagina toe te voegen.');
  }
  
  return false;
}

CGP.makeHomepage = function(link) {
  if (document.all) { 
    link.style.behavior = 'url(#default#homepage)'; 
    link.setHomePage(window.location.href);
  } else {
    alert('Sleep deze link op de homepage knop om deze pagina als homepage in te stellen.');
  }
  
  return false;
}

CGP.showPreview = function(event, image, className) {
  var popup = $('cgpPreview');

  if (popup == null) {
    popup = $(document.createElement('div'));
    popup.hide();
    popup.id = 'cgpPreview';
    document.body.appendChild(popup);
  }

  var x = Event.pointerX(event);
  var y = Event.pointerY(event) + 20;

  popup.setStyle({ position: 'absolute', zIndex: 1000, left: x + 'px', top: y + 'px' });  
  popup.innerHTML = '<img src="' + image + '" class="' + className + '"/>';
  popup.show();
}

CGP.hidePreview = function() {
  var popup = $('cgpPreview');
  popup.hide();
}

CGP.submitOnEnter = function(input, event) {
  var keyCode;
  
  if (window.event) { 
    keyCode = window.event.keyCode;
  } else if (event) {
    keyCode = event.which;
  } else {
    return true;
  }
  
  if (keyCode == 13) {
    input.form.submit();
    return false;
  }
  
  return true;
}

CGP.Preloader = {
  DELAY: 5,
 
  element: null,
  barElement: null,  
  countdownElement: null,
  game: '',
  isLoaded: false,
  countdown: null,
  
  create: function(id, barId, countdownId, game) {
    CGP.Preloader.element = $(id);
    CGP.Preloader.barElement = $(barId);
    CGP.Preloader.countdownElement = $(countdownId);
    CGP.Preloader.game = game;
    CGP.Preloader.maySkip();
  },
  
  maySkip: function() {
    var image = CGP.Preloader.element.down('img')
   
    if (image != null && image.src.match(/pixel\.gif$/)) {
      CGP.Preloader.skip();
    } else {
      CGP.Preloader.delayedSkip();
    }
  },
  
  skip: function() {
    if (CGP.Preloader.isLoaded) return;
    CGP.Preloader.isLoaded = true;
    $$('.cgpBanner').each(function(banner) { banner.setStyle({ visibility: '' }); });
    CGP.Preloader.element.update(CGP.Preloader.game);
    var iframe = CGP.Preloader.element.down('iframe');
    if (iframe != null) {
      iframe.src = iframe.src; // fix IE6 issue with not loading the iframe contents
    }
  },
  
  updateCountdown: function() {
    if (CGP.Preloader.isLoaded) return;
    
    var step = Math.floor(CGP.Preloader.barElement.getWidth() / CGP.Preloader.DELAY);
    var width = (CGP.Preloader.DELAY - CGP.Preloader.countdown) * step;
    $(CGP.Preloader.barElement.firstChild).setStyle({ width: width + 'px' });
    
    var countstep = (100 / CGP.Preloader.DELAY);
    CGP.Preloader.countdownElement.update( Math.floor(( CGP.Preloader.DELAY - CGP.Preloader.countdown) * countstep) + ' %');
  },
  
  delayedSkip: function() {
    if (CGP.Preloader.isLoaded) return;
      
    $$('.cgpBanner').each(function(banner) { banner.setStyle({ visibility: 'hidden' }); });
    CGP.Preloader.countdown = CGP.Preloader.DELAY;

    var color = CGP.Preloader.barElement.getStyle('color');
    CGP.Preloader.barElement.innerHTML = '<div style="height: 100%; width: 0px; background-color: ' + color + '; float: left"></div>';
    
    CGP.Preloader.updateCountdown();
    window.setTimeout(CGP.Preloader.skipOrWait, 1000);
  },
  
  skipOrWait: function() {
    if (CGP.Preloader.isLoaded) return;
      
    CGP.Preloader.countdown -= 1;
    
    if (CGP.Preloader.countdown > 0) {
      CGP.Preloader.updateCountdown();    
      window.setTimeout(CGP.Preloader.skipOrWait, 1000);
    } else {
      CGP.Preloader.skip();
    }
  }
}

CGP.Message = {
  setCookie: function(name, value) {
    var today = new Date();
    var expiresDate = new Date(today.getTime() + (1000 * 60 * 60 * 24 * 365 * 5));
    document.cookie = name + "=" + escape(value) + "; path=/; expires=" + expiresDate.toGMTString();    
  },

  getCookie: function(name) {
    var dc = document.cookie;
    var prefix = name + "=";
    
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
      begin = dc.indexOf(prefix);
      if (begin != 0) return null;
    } else {
      begin += 2;
    }
    
    var end = document.cookie.indexOf(";", begin);
    if (end == -1) {
      end = dc.length;
    }
    
    return unescape(dc.substring(begin + prefix.length, end));
  },
  
  show: function(message, version) {
    if (message == null || message.length == 0) return;

    var cookie = this.getCookie('cgp_message');
    if (cookie != null && parseInt(cookie) >= version) return;

    Modalbox.show(
      message + 
      '<br/><br/>' +
      '<div style="text-align: center">' + 
        '<form onsubmit="return false;"><input type="button" value="Sluiten" onclick="Modalbox.hide(); return false;"></form>' +
      '</div>', 
      { title: '&nbsp;&nbsp;&nbsp;' }
    );    
   
    this.setCookie('cgp_message', version);
  }
}

function OpenWindow(wUrl,wName,wOptions) {
  window.open(wUrl, wName, wOptions);
}
