(function($){

  // On DOM Ready:
  $(function() {
    $('#videos_5800').tabSwitcher();
    $('#spec_5800').phoneSpec();
    // $('#flash_container_5800').campaignFlash();
    // $('#flash_container_5800_competition').campaignFlash(300);
    $('a[rel=video]').videoLink();
    $('a[rel=external]').externalLink();
    $('a[rel=picture]').pictureLink();
  });

  /* Plugins ===============================================================*/

  $.fn.externalLink = function() {
    var open = function() {
      var link = $(this);
      var url  = link.attr('href');
      window.open(url);
      return false;
    };

    return this.click(open);
  };

  $.fn.campaignFlash = function(height) {
    if (!this.length || this.length > 1) return false;
    var height = height || 536;

    var link = this.find('a:first');
    var src  = link.attr('href');

    this.flash({
      src: src,
      width: 756,
      height: height
    }, {
      version: 8,
      expressInstall: true
    });

    return this;
  };

  $.fn.phoneSpec = function() {
    var h = 'hidden'; // "Hidden" class, for groups
    var c = 'collapsed'; // "Collapsed" class, for headers/links

    var expandCollapse = function() {
      var header = $(this);
      var group  = header.next('div.spec-group');

      header.toggleClass(c);
      group.toggleClass(h);

      return false;
    };

    var expandCollapseAll = function(operation) {
      var headers = wrapper.find('h3');
      var groups  = wrapper.find('div.spec-group');

      if (operation=='collapse') {
        headers.addClass(c);
        groups.addClass(h);
      } else {
        headers.removeClass(c);
        groups.removeClass(h);
      }
    }

    if (!this.length || (this.length > 1)) return false;

    var wrapper = this;

    wrapper.find('h3').click(expandCollapse);

    wrapper.find('p.expand-collapse-all a.expand').click(function() {
      expandCollapseAll();
      return false;
    });
    wrapper.find('p.expand-collapse-all a.collapse').click(function() {
      expandCollapseAll('collapse');
      return false;
    });

    return this;
  };

  $.fn.videoLink = function() {
    var openVideo = function() {
      var link = $(this);
      var element = $(link.attr('href').replace(/^[^#]*/, ''));
      if (element.length) NokiaLightbox.open({ element: element, callback: afterOpen, removeAfterClose: true });
      return false;
    };

    var afterOpen = function(content) {
      var videoArea = content.find('div.video');
      var videoLink = videoArea.find('a');

      if (videoLink.length) {
        var videoUrl = videoLink.attr('href');
        videoArea.flash({
          src: videoUrl,
          width: 512,
          height: 338
        }, {
          version: 9
        });
        videoLink.remove();
      }

      content.find('ul.video-nav a').click(openVideo);
    };

    this.click(openVideo);
  };

  $.fn.pictureLink = function() {
    var openPicture = function() {
      var link = $(this);
      var img = $('<div class="picture"><img src="'+link.attr('href')+'" /></div>')
      NokiaLightbox.open({ data: img });
      return false;
    };

    this.click(openPicture);
  };

  $.fn.tabSwitcher = function() {
    var switchTab = function() {
      contentAreas.hide();
      var self = $(this);
      var tab = self.parents('li:first');
      var id = self.attr('href').replace(/^#/, '');
      tabs.removeClass('active');
      tab.addClass('active');
      contentAreas.each(function() {
        var ca = $(this);
        if (ca.attr('id') == id) ca.show();
      });
    }

    if (!this.length || this.length > 1) return this;

    var self = $(this);
    var tabs = self.find('.nav li');
    var contentAreas = self.find('div.content');

    tabs.find('a').click(function() {
      switchTab.apply(this);
      return false;
    });
    switchTab.apply(tabs.slice(0,1).find('a').get(0));

    return this;
  };


  /*--------------------------------------------------------------------------
    Lightbox
  --------------------------------------------------------------------------*/

  $.fn.lightbox = function(options) {
    var options = jQuery.extend({}, NokiaLightbox.defaults, options);

    return this.each(function() {
      var self = $(this);
      var href = self.attr('href');
      var hashRe = href.match(/^(#.+)/);
      var passOptions = hashRe ? { element: $(hashRe[1]) } : { url: self.attr('href') };
      passOptions = jQuery.extend({}, options, passOptions);
      self.click(function() {
        self.trigger('blur');
        NokiaLightbox.open(passOptions);
        return false;
      });
    });
  };

  NokiaLightbox = {
    open: function(options) {
      var options = jQuery.extend({}, NokiaLightbox.defaults, options);

      if (!options.url && (!options.element || !options.element.length) && !options.data) return false;

      /* "Private functions": */
      var showBackground = function() {
        NokiaLightbox.redraw.call(this);

        var loader;

        if (this.options.url) {
          loader = $('<div id="'+this.options.loaderId+'"/>');
          loader.css('opacity', 0);
          $('body').append(loader);
        }

        this.background.fadeTo(300, this.options.backgroundOpacity, function() {
          if (loader) loader.css('opacity', 1);
        });
      };

      var showContainer = function() {
        var that = this;
        var html = $('html');
        var body = $('body');

        var scrollTop = html.scrollTop() || body.scrollTop();

        this.container.css('top', scrollTop+this.options.offsetTop);
        this.container.css('left', (html.width()-this.container.outerWidth())/2);

        $('#'+this.options.loaderId).remove();

        this.container.fadeTo(100, 1, function() {
          that.container.find(':input:first').trigger('focus');
        });

        // Close the lightbox when pressing ESC
        $(window).bind("keypress.lightbox", function(e) {
          if (e.keyCode == 27) NokiaLightbox.close.call(that);
        });
      };

      var fill = function(data) {
        this.content.empty();
        this.content.append(data);
        if (typeof options.callback=='function') options.callback.call(this, this.content);
      };


      /* Let's begin! */
      var container, background, content;
      var body = $('body');

      // See if the container and background exist
      container  = $('#'+options.containerId);
      background = $('#'+options.backgroundId);

      if (container.length && background.length) {
        // Found; prepare them for being shown
        content = container.find('.'+options.contentClass);
        container.css('opacity', 0).show();
        if (!background.is(':visible')) background.css('height', 'auto').css('opacity', 0).show();
      } else {
        // Not found; go ahead and create elements
        container  = $('<div />');
        background = $('<div />');
        closeLink  = $('<a class="'+options.closeClass+'" title="'+options.closeText+'">'+options.closeText+'</a>');
        content    = $('<div class="'+options.contentClass+'" />');

        container.attr('id', options.containerId);
        background.attr('id', options.backgroundId);

        container.append('<div class="'+options.containerTopClass+'" />');
        container.append(closeLink);
        container.append(content);

        container.css('opacity', 0);
        background.css('opacity', 0);

        background.bind('click', function() { NokiaLightbox.close(options, container, background); });
        closeLink.bind('click',  function() {
          NokiaLightbox.close(options, container, background);
          return(false);
        });

        body.append(container);
        body.append(background);
      }

      // Alias some details in an object to pass as a reference to the
      // "Private" functions
      var lightboxInfo = {
        background: background,
        container:  container,
        content:    content,
        options:    options
      };

      // An URL was specified
      if (options.url) {
        showBackground.call(lightboxInfo);

        jQuery.ajax({
          url: options.url,
          error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert('Error: Could not load content ('+XMLHttpRequest.status+')');
            NokiaLightbox.close(lightboxInfo);
          },
          success: function(data) {
            fill.call(lightboxInfo, data);
            showContainer.call(lightboxInfo);
          }
        })
      }

      // Use an existing element instead
      else if (options.element) {
        fill.call(lightboxInfo, options.element.children().clone());
        showBackground.call(lightboxInfo);
        showContainer.call(lightboxInfo);
      }

      // Use data
      else if (options.data) {
        fill.call(lightboxInfo, options.data);
        showBackground.call(lightboxInfo);
        showContainer.call(lightboxInfo);
      }

      return lightboxInfo;
    },

    redraw: function(options) {
      var options = this.options || jQuery.extend({}, NokiaLightbox.defaults, options);

      // Use passed objects if available, otherwise do a lookup
      var container  = this.container  || $('#'+options.containerId);
      var background = this.background || $('#'+options.backgroundId);
      var document = $(document);

      background.css('height', document.height());
    },

    /* Publically available close method: */
    close: function(options) {
      var options = this.options || jQuery.extend({}, NokiaLightbox.defaults, options);

      // Use passed objects if available, otherwise do a lookup
      var container  = this.container  || $('#'+options.containerId);
      var background = this.background || $('#'+options.backgroundId);

      background.fadeOut(100).css('height', 'auto');
      container.fadeOut(50, function() { container.css('top', 0); });
      $('#'+options.loaderId).remove();

      if (options.removeAfterClose) {
        background.remove();
        container.remove();
      }

      $(window).unbind("keypress.lightbox");
    },

    defaults: {
      containerId:       'lightbox',
      containerTopClass: 'top',
      closeClass:        'close',
      closeText:         'Close',
      contentClass:      'content',
      backgroundId:      'lightbox_background',
      loaderId:          'lightbox_loader',
      backgroundOpacity: 0.6,
      offsetTop:         30,
      url:               null,
      element:           null,
      data:              null,
      callback:          null,
      removeAfterClose:  false
    }
  };

}(jQuery));