/**
  Link targeter for pages within canvas iframes.
  2009-10-01 / <brad@causes.com>
**/
if (typeof (Causes) === 'undefined') Causes = {};
if (typeof (Causes.Iframe) === 'undefined') Causes.Iframe = {};

Causes.Iframe.LinkTargeter = (function () {

  var idSession;
  var idUser;
  var urlRedirector;

  // *-* public methods *-*

  function setup() {
    if (top !== self) {
      $('body').addClass('iframed');
      $('a').each(function () {
        if (/(facebook|media\.causes)\.com\//.test($(this).attr('href')) ||
            /\/donations\/select_donation/.test($(this).attr('href'))) {
          $(this).attr('target', '_top');
        }
      });
    }
  }

  function setSessionIdAndUserIdAndURL(session_id, user_id, url) {
    idSession = session_id;
    idUser = user_id;
    urlRedirector = url + (/\?/.test(url) ? '&' : '?') + 'redirect_to=';
    setupSafariLinkLacing();
  }

  // *-* utility methods *-*

  function addSessionGrabberToLink(elLink) {
    var urlWithRedirect = urlRedirector + escape(elLink.href);

    if (elLink.href != '#') {
      $(elLink).click(function(evt) {
        var f = document.createElement('form');
        f.style.display = 'none';
        this.parentNode.appendChild(f);
        f.method = 'POST';
        f.action = urlWithRedirect;
        f.target = elLink.target;
        var m = document.createElement('input');
        m.setAttribute('type', 'hidden');
        m.setAttribute('name', '_session_id');
        m.setAttribute('value', idSession);
        f.appendChild(m);
        var m2 = document.createElement('input');
        m2.setAttribute('type', 'hidden');
        m2.setAttribute('name', '_id');
        m2.setAttribute('value', idUser);
        f.appendChild(m2);
        f.submit();
        evt.preventDefault();
        return false;
      });
    }
  }

  function getCookie(name) {
    var start = document.cookie.indexOf(name + "=");
    var len = start + name.length + 1;
    if ((!start && name != document.cookie.substring(0, name.length)) ||
        start === -1) {
      return null;
    }
    var end = document.cookie.indexOf(";", len);
    if (end == -1) end = document.cookie.length;
    return unescape(document.cookie.substring(len, end));
  }

  function setupSafariLinkLacing() {
    if ($.browser.safari && top !== self) {
      $('a').each(function () {
        if (/causes\.com/.test(this.href)) {
          addSessionGrabberToLink(this);
        }
      });
    }
  }

  // expose public methods
  return {
    setup: setup,
    setSessionIdAndUserIdAndURL: setSessionIdAndUserIdAndURL
  };
})();

$(document).ready(Causes.Iframe.LinkTargeter.setup);
