﻿/*****************

  (c) 2006 Q42 B.V.

  The contents of this file, partially or in whole, may not be reproduced
  without prior written permission by Q42 B.V.

*****************/

function Favorites()
{
  Spif.DOMEvents.attach(window, "load", this.doLoad, this);
}

Favorites.prototype = {
  
  doLoad: function()
  {
    Spif.DOMEvents.attach(document, "click", favorites.doClick);
        
    // check for a cookie and put the count in the "favorites" link at the top if it exists
    var extramenu = document.getElementById('extramenu');
    if (!extramenu) return;
    var elFavs = extramenu.getElementsByTagName('li')[0].getElementsByTagName('a')[0];
    if (Cookie.exists("favorites"))
    {
      var cookie = Cookie.read("favorites");
      
      // Check if a favorites cookie from the old site is used
      if(cookie.indexOf("#") != -1)
      {
         Cookie.remove("favorites"); // Remove the cookie
         //Cookie.write("favorites","", (60 * 60 * 24 * 365), "/", "", 0); // And set a new empty one
         elFavs.innerHTML += " (0)";
      }
      else // Regular favorites cookie is found
      {
		    cookie = cookie.substring(1, cookie.length);
		    var favs = cookie.indexOf("|") != -1 ? cookie.split("|") : [cookie];
		    // put class=added on all the links that are in the cookie
		    if (cookie != "")
		    {
			    for (var i = 0; i < favs.length; i++)
			    {
			      try
			      {
				      document.getElementById('add-to-favorites_' + favs[i].split(";")[0]).className += " added";
				      document.getElementById('add-to-favorites_' + favs[i].split(";")[0]).innerHTML = resources.messages.favorites.already_added;
			      }
			      catch (e) {}
			    }
			    elFavs.innerHTML += " (" + favs.length + ")";
		    }
		    else
		    {
			    elFavs.innerHTML += " (0)";
		    }
      }
      
    }      
    else
    {
      elFavs.innerHTML += " (0)";
    }
  },
  
  // determine whether to add or remove a cookie based on the element classname
  doClick: function(e)
  {
    el = e.srcElement || e.target;
    if (/add-to-favorites\b/.test(el.className) && !/\badded\b/.test(el.className))
    {
      favorites.addItemToFavs(el);
      
      if (e.preventDefault)
        e.preventDefault();
        
      return false;
    }
    
    if (/\bremove-from-favorites\b/.test(el.className))
    {
      favorites.removeItemFromFavs(el);
      
      if (e.preventDefault)
        e.preventDefault();
        
      return false;
    }
    
    if (/\badded/.test(el.className))
    {
      el.blur();
      if (e.preventDefault)
        e.preventDefault();
      return false;
    }
    
  },
  
  // Add to favorites when you click "add to favorites"
  // Write the id and code from the link to a cookie
  addItemToFavs: function(el)
  {
    var id = el.id.split('_')[1];
    var code = el.className.replace(/result-/, '').replace(/add-to-favorites code-/, '');
  
    if (!Cookie.isSupported())
    {
      alert(resources.messages.favorites.no_cookies);
      return false;
    }
            
    // if the ID is already in the cookie, don't do anything (shouldn't happen)
    var regex = new RegExp("\\|" + id);
    if (regex.test(Cookie.read("favorites")))
      return false;
    
    Cookie.write('favorites', Cookie.read('favorites') + '|' + id + ";" + code, (60 * 60 * 24 * 365), '/', '', 0);
    
    favorites.updateFavoritesButton(1);
    
    /*var notice = document.getElementById('notice');
    if (notice)
    {
      notice.style.display = 'block';
      notice.getElementsByTagName('p')[0].innerHTML = resources.messages.favorites.added_notice;
      alert(resources.messages.favorites.added_notice.replace(/<[^>]+>/g, ''));
    }*/
    
    el.className += ' added beforeAnimation morph-duration1500';
    el.innerHTML = resources.messages.favorites.already_added;
    
    Spif.ClassNameAbstraction.replace(el, 'beforeAnimation', 'afterAnimation');
    
    el.blur();
      
    return false;
  
  },
    
  removeItemFromFavs: function(el)
  {
    var id = el.id.split('_')[1];
    var code = el.className.replace(/result-/, '').replace(/remove-from-favorites code-/, '');
  
    if (!Cookie.isSupported())
    {
      alert(resources.messages.favorites.no_cookies);
      return false;
    }
    
    // remove the favorite from the cookie
    var cookie = Cookie.read("favorites");
    var regex = new RegExp("\\|" + id + ";" + code);
    
    cookie = cookie.replace(regex, '');
    
    Cookie.write('favorites', cookie, (60 * 60 * 24 * 365), '/', '', 0);
  
    // update the link at the top of the page
    favorites.updateFavoritesButton(-1);
    
    // remove the entire result from the DOM
    var removeEl = document.getElementById('result_' + id);
    removeEl.parentNode.removeChild(removeEl);
    var removeSeperator = document.getElementById('seperator_' + id);
    removeSeperator.parentNode.removeChild(removeSeperator);
    var removeTable = document.getElementById('table_' + + id);
    removeTable.parentNode.removeChild(removeTable);
    
    // TODO: if there are no more favorites left ... show the "no favorites" notice
        
    /* display message
    var notice = document.getElementById('notice');
    if (notice)
    {
      notice.style.display = 'block';
      notice.getElementsByTagName('p')[0].innerHTML = resources.messages.favorites.removed_notice;
    }*/
      
    return false;
    
  },
  
  updateFavoritesButton: function(amount)
  {
    var el = document.getElementById('extramenu').getElementsByTagName('li')[0].getElementsByTagName('a')[0];
    var regex = /[0-9]+/g;
    switch (amount)
    {
      case 0:
        el.innerHTML = el.innerHTML.replace(regex, 0);
        break;
      case 1:
        var currentAmount = el.innerHTML.match(regex)[0];
        if (currentAmount == 0 && amount == -1)
          break;
        el.innerHTML = el.innerHTML.replace(regex, parseInt(currentAmount) + amount);
        break;
      case -1:
        var currentAmount = el.innerHTML.match(regex)[0];
        if (currentAmount == 0 && amount == -1)
          break;
        el.innerHTML = el.innerHTML.replace(regex, parseInt(currentAmount) + amount);
        break;
      default:
        break;
    }
  }
  
};
var favorites = new Favorites();
