AuteursWidget = {
  loadScript: function(url, type, head) {
    var script;

    switch (type)
    {
      case "script":
        script = document.createElement('script');
        script.setAttribute("type","text/javascript");
        script.setAttribute("src", url);
        break;

      case "link":
        script = document.createElement('link');
        script.setAttribute("type","text/css");
        script.setAttribute("href", url);
        script.setAttribute("media", "screen");
        script.setAttribute("rel", "stylesheet");
        break;
    }

    if ( typeof script != "undefined" ) {
      if ( typeof head != "undefined" && head ) {
        document.getElementsByTagName("head")[0].appendChild(script);
      } else {
        document.getElementsByTagName("body")[0].appendChild(script);
      }
    }
  }
};

AuteursWidget.ListPrototype = {
  widgetID: 'auteurs_list',
  width: 300,
  height: 350,
  color: '#299ecc',
  showPosition: true,
  showDirector: true,
  showYear: true,
  openLinksInNewWindow: true,

  /* This can't run until jQuery is loaded.  This bug shows up mostly in IE8, but also in Safari and IE7 to a lesser degree */
  render: function(list) {
    if (AuteursWidget.Lists.jqueryLoaded) {
      AuteursWidget.Lists.buildList(list, this);
    } else {
      var instance = this;
      setTimeout(function() { instance.render(list); }, 100);
    }
  }
};

AuteursWidget.Lists = {
  domain: null,

  jqueryLoaded: false,
  cssLoaded: false,

  director_url: "/cast_members/",
  film_url: "/films/",
  list_url: "/lists/",
  user_url: "/users/",

  initialize: function() {
    // Continually polls to see if jQuery is loaded.
    if ( typeof jQuery == "undefined" ) {
      AuteursWidget.loadScript('http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js', 'script', true);
      setTimeout(function() { AuteursWidget.Lists.initialize(); }, 100);
    // Once loaded, get the rest of the stuff
    } else if (this.cssLoaded === false) {
      // Grab the domain from the script tag loading the widget.
      var domainRegex = new RegExp("http(s?)://([^/]*)");
      var matches = domainRegex.exec(jQuery("script[src$=/widgets/list_widget.js]").attr("src"));
      if (matches) {
        this.domain = matches[2];
      }

      // We are probably in the preview box in this case.
      if (! this.domain) {
        this.domain = TA.domain;
      }

      AuteursWidget.loadScript('http://' + this.domain + '/widgets/list_widget.css', 'link', true);
      this.cssLoaded = true;

      // This check is required for the case where this file is used on mubi.com
      // where jQuery has already been re-aliased to $j
      if ( typeof $j == "undefined" ) {
        jQuery.noConflict();
      }

      this.jqueryLoaded = true;
    }
  },

  create: function() {
    function F() {}
    F.prototype = AuteursWidget.ListPrototype;
    return new F();
  },

  buildList: function(list, settings) {
    if ( AuteursWidget.Lists.cssLoaded === false ) {
      setTimeout(function() { AuteursWidget.Lists.buildList(list); }, 100);
      return;
    }
    // This is the method we'll setup as the callback when the data is returned

    // list.id = List's ID (for creating URL)
    // list.title = List's title
    // list.fanships_count = Number of fans
    // list.films = Array of films in the list
    // list.user = User who created the list

    // ORDER of Films is implicitly set to position in list

    // film.id = Film's ID (for creating URL)
    // film.title = Film title
    // film.directors = Array of directors of this film

    // director.id = Director's ID (for creating URL)
    // director.name = Director's full name

    var tbl = jQuery('<table />');
    var title = jQuery("<a />").attr({id: 'list_title', href: 'http://' + AuteursWidget.Lists.domain + AuteursWidget.Lists.list_url + list.id, title: list.title}).html( list.title );
    var user_details = jQuery('<div />').addClass("auteurs_user").append(jQuery('<a />').attr({href: 'http://' + AuteursWidget.Lists.domain + AuteursWidget.Lists.user_url + list.user.id, title: list.user.name}).html( 'a list by ' + list.user.name ));

    var header = jQuery('<div />').addClass("auteurs_header").append(title).append(user_details);
    var list_block = jQuery('<div />').addClass("auteurs_list");

    jQuery('#' + settings.widgetID).append(header).append(list_block);

    list_block.append(tbl);
    jQuery('<a href="http://' + AuteursWidget.Lists.domain + '"><img src="http://' + AuteursWidget.Lists.domain + '/images/mubi_logo_embed.gif' + '" title="MUBI" /></a>').appendTo(list_block);

    var number_of_films = list.films.length;
    for( var i = 0; i < number_of_films; i++ )
    {
      AuteursWidget.Lists.renderRow( list.films[i], i + 1, settings ).appendTo(tbl);
    }

    // Set width of containing block
    if ( settings.width > 0 ) {
      jQuery('#' + settings.widgetID + '.auteurs_list_widget').css('width', settings.width);
    }

    // Set height of containing block
    if ( settings.height > 0 ) {
      jQuery('#' + settings.widgetID + ' div.auteurs_list').css('height', settings.height - header.outerHeight() );
    }

    header.css('backgroundColor', settings.color );

  },

  renderRow: function(film, idx, settings) {
    var utm_tagging = '?utm_source=offsite_widget&utm_medium=widget&utm_campaign=list_widget';
    var tr = jQuery('<tr />', {
      "class": "film_row",
      click: function() {
        // open url in new window
        if ( !settings.openLinksInNewWindow ) {
          location.href = 'http://' + AuteursWidget.Lists.domain + AuteursWidget.Lists.film_url + film.id + utm_tagging;
        } else {
          window.open( 'http://' + AuteursWidget.Lists.domain + AuteursWidget.Lists.film_url + film.id + utm_tagging );
        }

        return false;
      } });

    if ( settings.showPosition ) {
      jQuery('<td />').addClass('list_position').html( ((idx > 0 && idx < 10) ? "0" + idx : idx) ).appendTo(tr);
    }

    var td_film = jQuery('<td />').addClass('film_cell').appendTo(tr);
    var div_title = jQuery('<div />').addClass('film_title').appendTo(td_film);
    var film_title = film.title;

    jQuery('<a />').attr({href: 'http://' + AuteursWidget.Lists.domain + AuteursWidget.Lists.film_url + film.id + utm_tagging, title: film_title}).html(film_title).appendTo(div_title);

    if ( settings.showYear ) {
      jQuery('<span />').addClass('film_year').html(film.year).appendTo(div_title);
    }

    if ( settings.showDirector ) {
      var div_director = jQuery('<div />').addClass('film_director').appendTo(td_film);
      jQuery('<a />').attr({ href: 'http://' + AuteursWidget.Lists.domain + AuteursWidget.Lists.director_url + film.directors[0].id + utm_tagging, title: film.directors[0].name }).html(film.directors[0].name).appendTo(div_director);
    }

    return tr;
  }
};

// Runs immediately
AuteursWidget.Lists.initialize();

