// set defaults where necessary
var fzDefaults = {
  c: '',
  kwd: '',
  code: 'html',
  widget_width: 170,
  widget_height: 400,
  news_scroll: 'v',
  news_format: '',
  news_category: '',
  news_subcategory: '',
  news_keywords: '',
  show_widget_border: 'Yes',
  number_of_summaries: 10,
  show_summary: 'Yes',
  show_summary_source: 'Yes',
  show_summary_date: 'Yes',
  show_related: '',
  headers_text: '',
  font_headers_size: 14,
  font_summary_title_size: 12,
  font_summary_title_bold: 'Yes',
  font_size: 10,
  font_family: 'Arial',
  text_alignment: 'Left',
  space_between_summaries: 'Yes',
  color_font_headers: '#15aa15',
  color_font_title: '#2200cc',
  color_font: '#1b1b1b',
  color_summary: '#1b1b1b',
  color_media_source: '#008000',
  color_date: '#777777',
  color_border: '#00232c',
  color_background: '#ffffff',
  related_show: 'Yes',
  related_color: '#ff0000',
  style_id: ''
}

// widget vars
var c = '';
var kwd = '';
var code = 'html';
var widget_width = 170;
var widget_height = 400;
var news_scroll = 'v';
var news_format = '';
var news_category = '';
var news_subcategory = '';
var news_keywords = '';
var show_widget_border = 'Yes';
var number_of_summaries = 10;
var show_summary = 'Yes';
var show_summary_source = 'Yes';
var show_summary_date = 'Yes';
var show_related = '';
var headers_text = '';
var font_headers_size = 14;
var font_summary_title_size = 12;
var font_summary_title_bold = 'Yes';
var font_size = 10;
var font_family = 'Arial';
var text_alignment = 'Left';
var space_between_summaries = 'Yes';
var color_font_headers = '#15aa15';
var color_font_title = '#2200cc';
var color_font = '#1b1b1b';
var color_summary = '#1b1b1b';
var color_media_source = '#008000';
var color_date = '#777777';
var color_border = '#00232c';
var color_background = '#ffffff';
var related_show = 'Yes';
var related_color = '#ff0000';
var style_id;

// default params
var fzDefaultWidth = 170;
var fzDefaultHeight = 400;
var fzSkyScraperWidth = 160;
var fzSkyScraperHeight = 600;
var fzRectangleWidth = 500;
var fzRectangleHeight = 300;

// default vars
var ajax_loader_height = 24;    // ajax loader image height
var fzCountries = ['usa', 'uk', 'canada', 'australia', 'india', 'brazil', 'france', 'germany', 'mexico', 'spain', 'turkey', 'argentina', 'pakistan'];
var fzCountryURLs = ['us', 'uk', 'ca', 'au', 'in', 'br', 'fr', 'de', 'mx', 'es', 'tr', 'ar', 'pk'];
var popular_themes = ['popular1', 'popular2', 'popular3', 'popular4', 'popular5', 'popular6'];
var default_themes = ['fzStyle1', 'fzStyle2', 'fzStyle3', 'fzStyle4', 'fzStyle5',
      'fzStyle6', 'fzStyle7', 'fzStyle8', 'fzStyle9', 'fzStyle10', 'fzStyle11',
      'fzStyle12'];
var r_lang = 'us';
var r_lcid = '';
var v_charset = '';
var r_country = '';
var categoriesFile = '/lists/categories.xml';
var subcategoriesFile = '/lists/';
var codeURL = '/widgets/get_code.asp';
var customWidgetFile = '/en/v2/widgets/config/';
var widgetURL = '/widgets/preview/flash.asp';

// declare other vars
var timeOutLanguageChooser;

var generateFlashString = function(url) {
  
  if (!code) code = 'html';
  if (!c) c = '';
  if (!kwd) kwd = '';

  var flashString = url.replace(/\?/, '?lang=' + r_lang + '&');    // make lang the first param because of flash bug
  flashString += '&charset=' + v_charset;
  flashString += '&lcid=' + r_lcid;
  flashString += '&country=' + r_lang;
  flashString += '&c=' + c;
  flashString += '&code=' + code;
  flashString += '&scroll=' + news_scroll;
  flashString += news_keywords ? '&prov=keywords' : '&prov=news';
  flashString += '&width=' + widget_width;
  flashString += '&height=' + widget_height;
  //flashString += '&cat=' + news_category;
  flashString += ($('#cat :selected').val()) ? '&cat=' + $('#cat :selected').text() : '&cat=' + news_category;
  //flashString += '&cat2=' + news_subcategory;
  flashString += ($('#cat2 :selected').val()) ? '&cat2=' + $('#cat2 :selected').text() : '&cat2=' + news_subcategory;
  flashString += '&num_articles=' + number_of_summaries;
  flashString += '&show_border=' + show_widget_border;
  flashString += '&show_summaries=' + show_summary;
  flashString += '&show_sources=' + show_summary_source;
  flashString += '&show_dates=' + show_summary_date;
  flashString += '&title=' + headers_text;
  flashString += '&keywords=' + news_keywords;
  flashString += '&andor=and&url=';
  flashString += '&headers_size=' + font_headers_size + 'pt';
  flashString += '&title_size=' + font_summary_title_size + 'pt';
  flashString += '&title_bold=' + font_summary_title_bold;
  flashString += '&font_size=' + font_size + 'pt';
  flashString += '&font_family=' + font_family;
  flashString += '&text_alignment=' + text_alignment;
  flashString += '&space=' + space_between_summaries;
  flashString += '&titlecolor=' + color_font_headers.replace(/#/, '%23');
  flashString += '&fcolor=' + color_font_title.replace(/#/, '%23');
  flashString += '&desccolor=' + color_font.replace(/#/, '%23');
  flashString += '&sourcecolor=' + color_media_source.replace(/#/, '%23');
  flashString += '&datecolor=' + color_date.replace(/#/, '%23');
  flashString += '&bordercolor=' + color_border.replace(/#/, '%23');
  flashString += '&bgcolor=' + color_background.replace(/#/, '%23');
  flashString += '&related_show=' + related_show;
  //flashString += '&related_color=' + related_color.replace(/#/, '%23');
  flashString += '&kwd=' + kwd;
  
  return flashString;
}

var generateStyleId = function() {

  var d = new Date();
  var sec = d.getSeconds();
  var min = d.getMinutes();
  var hours = d.getHours();
  var day = d.getDate();
  var month = d.getMonth() + 1;  // JS Date returns months from 0-11
  var year = d.getFullYear();
  var rand = Math.random();
  
  if (sec < 10) sec = '0' + sec;
  if (min < 10) min = '0' + min;
  if (hours < 10) hours = '0' + hours;
  if (day < 10) day = '0' + day;
  if (month < 10) month = '0' + month;
  rand = Math.round(rand * 1000).toString();
  
  style_id = sec.toString() + min.toString() + hours.toString() + day.toString() + month.toString() + year.toString() + rand;
  
  if (r_lang != 'us') style_id = r_lang + style_id;
}

var updateWidgetPreview = function() {

  //var url = 'http://www.feedzilla.com/tools/flash_new.asp?myp=homepage'; // for local testing only
  var url = widgetURL + '?myp=homepage';
  var flashString = generateFlashString(url);
  
  // add an extra 2 px width and height to wrappers so that the widget border can show
  var wrapperWidth = parseInt(widget_width) + 2;
  var wrapperHeight = parseInt(widget_height) + 2;

  // update widget container and reload widget
  $('.fzWidget').css({'width' : wrapperWidth + 'px', 'height' : wrapperHeight + 'px'});
  $('.fzWidget div').css({'width' : wrapperWidth + 'px', 'height' : wrapperHeight + 'px'});

  $('#fzWidgetPreview').attr('src', flashString);
  $('#fzWidgetPreview').css({'width' : wrapperWidth + 'px', 'height' : wrapperHeight + 'px'});
}

$(document).ready(function() {

  $('#main').before('<div id="debug"></div>');
  $('#debug').addClass('debugSmall');
  $('#debug').click(function(){
    var width = $('#debug').width();

    if ($('#debug').is('.debugSmall')) {
      $('#debug').addClass('debugBig');
      $('#debug').removeClass('debugSmall');
    }
    else {
      $('#debug').addClass('debugSmall');
      $('#debug').removeClass('debugBig');
    }
  });

  // declare vars
  var fzDefaultWidget = 'fzStyle1';
  var lastScroll = new Date();
  var movingWizard = false;
  var selectedSuggest = false;
  var t;
  
  // initialise vars
  r_lang = ($('#r_lang').text()) ? $('#r_lang').text() : r_lang;

  if (r_lang != 'us') {
    fzDefaults['related_show'] = 'No';  // no video support for local sites yet
    codeURL = '/steps/get_code.asp';
    widgetURL = '/tools/flash.asp';
    r_lcid = $('#r_lcid').text();
    v_charset = $('#v_charset').text();
    r_country = r_lang;
  }
  else {
    v_charset = 'iso-8859-1';
    r_lcid = 1033;
  }
  
  var applyWidgetResize = function (chosen_width, chosen_height) {

    $('#step2bHeader').siblings('.tick').remove();
    $('#step2bHeader').after('<div class="tick"></div>');

    if (widget_width != chosen_width || widget_height != chosen_height) {
      widget_width = chosen_width;
      widget_height = chosen_height;
      $('#widget_width').val(chosen_width);
      $('#widget_height').val(chosen_height);
      updateWidgetPreview();
    }
  }

  /*
     BEGIN DEBUG
     DEBUG only, take this function out for production environment.
  */
  function parseXML( xml ) {
    if( window.ActiveXObject && window.GetObject ) {
        var dom = new ActiveXObject( 'Microsoft.XMLDOM' );
        dom.loadXML( xml );
        return dom;
    }
    if( window.DOMParser )
        return new DOMParser().parseFromString( xml, 'text/xml' );
    throw new Error( 'No XML parser available' );
  }
  /* END debug */

  var applyPreviewStyle = function(data) {

    /*
       BEGIN DEBUG
       DEBUG only, take out for production environment.
    */
    if (typeof(data) == 'string') {
      try {
        data = parseXML(data);
        //$('#debug').append($('feedzillaWidget',data).find('version').text() + '<br/>');
        data = $('feedzillaWidget',data);
      }
      catch (e) { alert(e);}
    }
    /* END DEBUG */

    if ($(data).find('version').text() == '1.0') {

      var style_id = $(data).find('style_id').text();
      var description = $(data).find('description').text();
      var color_font_headers = $(data).find('color_font_headers').text();
      var color_font_title = $(data).find('color_font_title').text();
      var color_font = $(data).find('color_font').text();
      var color_summary = $(data).find('color_summary').text();
      var color_media_source = $(data).find('color_media_source').text();
      var color_date = $(data).find('color_date').text();
      var color_border = $(data).find('color_border').text();
      var color_background = $(data).find('color_background').text();
      var show_widget_border = $(data).find('show_widget_border').text();

      if (style_id == fzDefaultWidget && !($('#fz_id').text())) {
        readXML(data, true, ($('#fz_v_cat').length > 0));  // don't overwrite cat, subcat, keywords
        applyStyle('init', true);
        //$('#debug').append('<br/>applyPreviewStyle: ' + news_category + ': ' + news_subcategory + '<br/>fz_v_cat: ' + $('#fz_v_cat').text());
      }

      var styleHtml =
        '<div id="' + style_id + '" class="fzStylePreviewCanvas invisibleBorder">' +
          '<div class="fzStylePreview">' +
            '<div class="fzStylePreviewHeaders"></div>' +
            '<div class="fzStylePreviewTitle"></div>' +
            '<div class="fzStylePreviewSummary"></div>' +
            '<div class="fzStylePreviewSummary"></div>' +
            '<div class="fzStylePreviewSummary"></div>' +
            '<div class="fzStylePreviewSummary"></div>' +
            '<div class="fzStylePreviewSummarySource"></div>' +
            '<div class="fzStylePreviewSummaryDate"></div>' +
          '</div>' +
        '</div>';

      $('#widgetStyles').append(styleHtml);

      // change mouse cursor over style div
      $('#' + style_id).hover(function(){
          $(this).addClass('hoverClickable');

          var pos = $('#' + style_id).offset();
          var thisPosTop = pos.top;
          var thisWidth = $('#' + style_id).width();
          var thisLeft = pos.left;
          var thisCanvas = $('#' + style_id);
          //$('#debug').html('t: ' + thisPosTop + '<br/>' + 'l: ' + thisLeft + '<br/>' + 'w: ' + thisWidth);

          $('<div><p>' + description + '</p></div>')
            .addClass('altBubble')
            .addClass('hidden')
            .addClass('stylePreviewBubble')    // label for easy removal when hovering out
            .css('position', 'absolute')
            .css('top', thisPosTop - 61)
            .css('left', thisLeft)
            .css('zIndex', 5)
            .insertAfter($('#container'))
            .fadeIn("slow");
        }, function(){
          $(this).removeClass('hoverClickable');
          $('.stylePreviewBubble').remove();
        }
      );

      // apply custom css for widget theme preview
      if (show_widget_border == 'Yes') {
        $('#' + style_id + ' .fzStylePreview').css('border', '1px solid ' + color_border);
      }
      else {
        $('#' + style_id + ' .fzStylePreview').css('border', '1px solid transparent');
      }

      $('#' + style_id + ' .fzStylePreview').css('background-color', color_background);
      $('#' + style_id + ' .fzStylePreviewHeaders').css('background-color', color_font_headers);
      $('#' + style_id + ' .fzStylePreviewTitle').css('background-color', color_font_title);
      $('#' + style_id + ' .fzStylePreviewSummary').css('background-color', color_summary);
      $('#' + style_id + ' .fzStylePreviewSummarySource').css('background-color', color_media_source);
      $('#' + style_id + ' .fzStylePreviewSummaryDate').css('background-color', color_date);
    }
  }

  var getPreviewStyle = function(styleIndex, styleValue) {
    //$('#debug').append(styleValue + '<br/>');
    var file = '/en/v2/widgets/config/' + styleValue + '.xml';

    $.get(file, applyPreviewStyle, 'xml');
  }

  var initPreviewStyles = function() {

    $.each(default_themes, getPreviewStyle);
  }

  var applyPopularTheme = function(data) {

    /*
       BEGIN DEBUG
       DEBUG only, take out for production environment.
    */
    if (typeof(data) == 'string') {
      try {
        data = parseXML(data);
        //$('#debug').append($('feedzillaWidget',data).find('version').text() + '<br/>');
        data = $('feedzillaWidget',data);
      }
      catch (e) { alert(e);}
    }
    /* END DEBUG */

    if ($(data).find('version').text() == '1.0') {

      var style_id = $(data).find('style_id').text();
      var description = $(data).find('description').text();
      var color_font_headers = $(data).find('color_font_headers').text();
      var color_font_title = $(data).find('color_font_title').text();
      var color_font = $(data).find('color_font').text();
      var color_summary = $(data).find('color_summary').text();
      var color_media_source = $(data).find('color_media_source').text();
      var color_date = $(data).find('color_date').text();
      var color_border = $(data).find('color_border').text();
      var color_background = $(data).find('color_background').text();
      var show_widget_border = $(data).find('show_widget_border').text();

      var styleHtml =
        '<div class="moreContentItem">' +
          '<div id="' + style_id + '" class="fzThemePreviewCanvas invisibleBorder">' +
            '<div class="fzStylePreview">' +
              '<div class="fzStylePreviewHeaders"></div>' +
              '<div class="fzStylePreviewTitle"></div>' +
              '<div class="fzStylePreviewSummary"></div>' +
              '<div class="fzStylePreviewSummary"></div>' +
              '<div class="fzStylePreviewSummary"></div>' +
              '<div class="fzStylePreviewSummary"></div>' +
              '<div class="fzStylePreviewSummarySource"></div>' +
              '<div class="fzStylePreviewSummaryDate"></div>' +
            '</div>' +
          '</div>' +
          '<p><a href="#">' + description + '</a></p>' +
        '</div>';

      $('#popularThemes .moreContent').append(styleHtml);

      // change mouse cursor over style div
      $('#' + style_id).hover(function(){
          $(this).addClass('hoverClickable');
        }, function(){
          $(this).removeClass('hoverClickable')
        }
      );

      // apply custom css for widget theme preview
      if (show_widget_border == 'Yes') {
        $('#' + style_id + ' .fzStylePreview').css('border', '1px solid ' + color_border);
      }
      else {
        $('#' + style_id + ' .fzStylePreview').css('border', '1px solid transparent');
      }

      $('#' + style_id + ' .fzStylePreview').css('background-color', color_background);
      $('#' + style_id + ' .fzStylePreviewHeaders').css('background-color', color_font_headers);
      $('#' + style_id + ' .fzStylePreviewTitle').css('background-color', color_font_title);
      $('#' + style_id + ' .fzStylePreviewSummary').css('background-color', color_summary);
      $('#' + style_id + ' .fzStylePreviewSummarySource').css('background-color', color_media_source);
      $('#' + style_id + ' .fzStylePreviewSummaryDate').css('background-color', color_date);

      if (style_id == popular_themes[popular_themes.length - 1]) {  // finished populating themes
        $('#popularThemes > .moreContentWrapper').fadeIn().siblings('.loadingWrapper').remove();
      }
    }
  }

  var getPopularTheme = function(styleIndex, styleValue) {
    //$('#debug').append(styleValue + '<br/>');
    var file = '/en/v2/widgets/config/' + styleValue + '.xml';
    $.get(file, applyPopularTheme, 'xml');
  }

  var initPopularThemes = function() {

    $('#popularThemes > .moreContentWrapper').hide();
    makeLoadingDiv($('#popularThemes > .moreContentWrapper'));

    $.each(popular_themes, getPopularTheme);
  }
  
  var processSubCatsForTopTopicsLocal = function(data, max) {
  
    if (!max) max = 50;    // no more than 50 subcategories per topic
    var $ul = $('<ul></ul>');
    
    /*
       BEGIN DEBUG
       DEBUG only, take out for production environment.
    */
    if (typeof(data) == 'string') {
      try {
        data = parseXML(data);
        data = $('cats', data);
      }
      catch (e) { alert(e); }
    }
    /* END DEBUG */
    
    // randomise list
    var $items = $('cat2[value!=""]', data);
    $items.sort(function(){ return (Math.round(Math.random())-0.5); });
    
    $items.each( function(index, value) {
        //$('#debug').append('<br/>value: ' + $(value).text());

        if ($(value).text()) {
          $ul.append('<li><a href="#">' + $(value).text() + '</a></li>');
        }
        
        if ($ul.children().size() >= max) return false;    // get out of each loop
      }
    );

    return $ul;
  }

  var processSubCategories = function(data) {

    //$('#debug').text('processSubCategories: ' + data);

    /*
       BEGIN DEBUG
       DEBUG only, take out for production environment.
    */
    if (typeof(data) == 'string') {
      try {
        data = parseXML(data);
        data = $('cats', data);
      }
      catch (e) { alert(e); }
    }
    /* END DEBUG */

    $('#cat2')
      .append('<option value="">' + $('#dict_subcategoryPrompt').text().replace(/%s/, $('#cat :selected').text()) + '</option>');

    $('cat2', data).each( function(index, value) {
        //$('#debug').append('<br/>value: ' + $(value).text());

        if ($(value).text()) {
          $('#cat2')
            .append('<option value="' + $(value).text() + '">' + $(value).text() + '</option>');
        }
      }
    );

    if ($('#cat2')[0].value) {    // any value other than empty
      $('#cat2 option[value=""]')[0].selected = true;
    }
  }

  var processSubCategoriesAndShow = function(data) {

    processSubCategories(data);
    $('#cat2').fadeIn().siblings('.loadingWrapper').remove();
  }

  /*
    Places a loading div after the given element, which, when hidden is visually replaced.
    @param object el: jQuery object to be replaced with loading div
  */
  var makeLoadingDiv = function(el) {

    el.after('<div></div>');
    el.siblings('.loadingWrapper').remove();    // clear up any previous loading wrappers

    if (el.is('.moreContentWrapper')) {
      //$('#debug').text(el.css('text-align'));
    }

    //$('#debug').append(el.attr('class'));

    // certain CSS attributes break IE, such as margin, so be careful adding more and test each
    var loadingDiv = $('<div class="loadingWrapper"></div>')
      .addClass(el.attr('class'))
      .css({'width' : el.css('width'),
        'height' : el.css('height'),
        'margin-top' : el.css('margin-top'),
        'margin-right' : el.css('margin-right'),
        'margin-bottom' : el.css('margin-bottom'),
        'margin-left' : el.css('margin-left'),
        'position' : el.css('position'),
        'top': el.css('top'),
        'left': el.css('left'),
        'bottom': el.css('bottom'),
        'border' : el.css('border'),
        'border-top' : el.css('border-top'),
        'border-right' : el.css('border-right'),
        'border-bottom' : el.css('border-bottom'),
        'border-left' : el.css('border-left'),
        'float' : el.css('float'),
        'text-align' : 'center',
        'background-color' : '#ffffff'})
      .insertAfter(el);

    var height = parseInt(loadingDiv.css('height').replace(/px/, ''));

    var mt = (height > ajax_loader_height) ? Math.round(height/2) - Math.round(ajax_loader_height/2) : 0;
    //$('#debug').text($('#cat').css('background'));

    $('<img src="/en/v2/img2/ajax_loader.gif" alt="Loading..."/>')
      .css('margin-top', mt + 'px')
      .hide()
      .appendTo(loadingDiv)
      .fadeIn();
    
    return loadingDiv;
    //$('#debug').append('<p>made loading div for: ' + el.attr('class') + ' ' + el.attr('id') + '</p>');
  }

  /*
    @param bool show: if the subcategories should be displayed once loaded
    @param string subcat: which subcategory to show, empty string in case of none
  */
  var loadSubcategories = function(show, subcat) {

    var file = subcategoriesFile + 'list_media_' + $('#cat :selected').val().replace(/\s/g, '_').toLowerCase() + '.xml';
    $('#cat2').hide().empty();

    if (show) {
      makeLoadingDiv($('#cat2'));
      $.get(file,
        function(data) {
          processSubCategoriesAndShow(data);

          if (subcat) {    // see if we can find the top cat in our list
            $('#cat2 option').each(function(index, option) {
              $option = $(option);
              
              // compare case-insensitive
              if ($option.val().toLowerCase() == subcat.toLowerCase()) {
                news_subcategory = $option.val();    //  choose sub cat from our list to ensure we have a valid sub cat
                $('#cat2 option[value="' + news_subcategory + '"]')[0].selected = true;
              }
            });
          }
        }, 'xml');
    }
    else $.get(file, processSubCategories, 'xml');
  }

  var processCategories = function(data) {

    //$('#debug').text(data);

    /*
       BEGIN DEBUG
       DEBUG only, take out for production environment.
    */
    if (typeof(data) == 'string') {
      try {
        data = parseXML(data);
        data = $('cats', data);
      }
      catch (e) { alert(e); }
    }
    /* END DEBUG */

    $('cat', data).each( function(index, value) {
        //$('#debug').append('<br/>value: ' + $(value).text());

        if ($(value).text()) {
          if ($(value).text().toLowerCase() != 'twitter') {
            if (r_lang == 'us') {
              $('#cat')
                .append('<option value="' + $(value).text() + '">' + $(value).text() + '</option>');
            }
            else {
              $('#cat')
                .append('<option value="' + $(value).attr('en') + '">' + $(value).text() + '</option>');
            }
          }
        }
        else {
          $('#cat')
            .append('<option value="">' + $('#dict_categoryPrompt').text() + '</option>');
        }
      }
    );

    // show the result and remove loading animation
    $('#cat')
      .fadeIn()
      .siblings('.loadingWrapper').remove();
  }

  var loadStart = function() {

    $('#cat').empty().hide();

    makeLoadingDiv($('#cat'));

    $.get(categoriesFile, function(data) {
        processCategories(data);
        
        if ($('#cat :selected').val()) {    // any value other than empty
          var $catEmpty = $('#cat option[value=""]');
          
          if ($catEmpty.length > 0) $catEmpty[0].selected = true;
          else {    // create a category prompt and select it
            $('<option>' + $('#dict_categoryPrompt').text() + '</option>')
              .val('')
              .prependTo($('#cat'))
              .attr('selected', 'selected');
          }
        }
        
        if ($('#fz_id').text()) {    // load a custom widget
          var cFile = customWidgetFile + $('#fz_id').text() + '.xml';

          $.get(cFile, function(data) {

            readXML(data, true, false);
            applyStyle('custom', false);

            // open the wizard
            if (news_keywords) {               // set keywords
              loadWizardKeywords(news_category, news_keywords);
            }
            else {                              // set subcategory
              loadWizardSubCat(news_category, news_subcategory);
            }
            updateWidgetPreview();
            
          }, 'xml');
        }
        else loadWizardParams();
        
        if ($('#topTopicsLocal').length > 0) loadTopTopicsLocal();
      }, 'xml');
      //$('#debug').append('loadStart: ' + news_category + ': ' + news_subcategory);
  }

  var scrollToWizard = function() {

    if ($('#wizard').is(':visible')) {
      document.getElementById('wizard').scrollIntoView(true);
    }
    else {
      document.getElementById('wizardNews').scrollIntoView(true);
    }
  }

  /*
    @param string subcat: which subcategory to show, empty string for none
  */
  var showStep1SubCat = function(subcat) {

    // if there's a keyword search then user wants to see it
    if ($('#keywordSearch').length > 0) {
      if ($('#keywordSearchField').val() != '') {
        $('<div class="tick hidden"></div>')
          .insertAfter($('#cat'))
          .fadeIn();
      }
      $('#cat2PopularKeywords').html('<a href="#">' + $('#dict_cat2PopularKeywords').text() + ' <b>' + $('#cat :selected').text() + '</b></a>');
      $('#advancedSearch').hide();
      $('#wizardStep1b').fadeIn();
      $('#wizardStep1c').fadeIn();

      // changed top category means we need to reload subcats
      loadSubcategories(false, '');
    }
    else if ($('#cat').val()) {    // any value other than empty
      $('#stepBubble1').fadeOut();
      $('<div></div>')
          .hide()
          .addClass('tick')
          .insertAfter($('#cat'))
          .fadeIn();

      loadSubcategories(true, subcat);
      $('#wizardStep1b').fadeIn();
    }
  }

  var showStep1Start = function(event) {

    if ($(event.target).is('#cat')) {
      $('#topic .tick').remove();  // get rid of all ticks first

      if ($('#cat')[0].value) {    // any value other than empty
        $('#stepBubble1').fadeOut();
        //news_category = $('#cat')[0].value;
        news_category = $('#cat :selected').val();
        news_subcategory = $('#common_cat2').text();    // just show the common subcat while nothing is chosen yet
        updateWidgetPreview();
        news_subcategory = '';
        showStep1SubCat('');
      }
      else {    // return to step 1a
        $('#wizardStep1b').fadeOut(
          function() {
            $('#stepBubble1').fadeIn();
            $('#wizardStep1b .tick').remove();
          }
        );
        $('#wizardStep1c').fadeOut();
      }
      //alert($('#cat')[0].value);
    }
  };

  var showStep1Finish = function(event) {

    $('#wizardStep1b .tick').remove();  // get rid of all ticks first

    if ($(event.target).is('#cat2')) {
      if ($('#cat2')[0].value) {    // any value other than empty
        $('<div></div>')
          .hide()
          .addClass('tick')
          .insertAfter('#advancedSearch')
          .fadeIn();

        $('#wizardStep1c').fadeIn();
        news_subcategory = $('#cat2')[0].value;
        news_keywords = '';
        updateWidgetPreview();
      }
      else {    // return to step 1b
        $('#wizardStep1c').fadeOut();
      }
    }
  };

  /*
    Hides the first step and initialises the second step.
  */
  var showStep2Start = function(event) {

    if ($(event.target).is('#finishStep1') || $(event.target).is('#cat2BubbleLink')) {
      event.preventDefault();

      $('#wizardStep1').fadeOut();
      $('#step2aHeader .tick').remove();
      $('#customStyle').addClass('hidden');
      $('#wizardStep2').fadeIn();

      scrollToWizard();
    }
  };

  var step1Edit = function(event) {

    if ($(event.target).is('.step1Edit')) {
      event.preventDefault();

      $('#wizardStep1').fadeIn();
      $('#wizardStep2').fadeOut();
      $('#wizardStep3').fadeOut();
    }
  };

  var step2Edit = function(event) {

    if ($(event.target).is('#step2Edit')) {
      event.preventDefault();

      $('#wizardStep2').fadeIn();
      $('#wizardStep3').fadeOut();
    }
  };

  var setRadio = function(parentID, val) {

      if ($('#' + parentID).length > 0) {    // make sure parent exists
        $('#' + parentID + ' input:radio[value="' + val + '"]')[0].checked = true;
        $('#' + parentID + ' input:radio[value!="' + val + '"]')[0].checked = false;
      }
  }

  /*
    @param string applyHow ('init'|'custom'|<anything else>):
      - init: apply the initial style, without touching the categories
      - custom: if we want to apply a custom config, which sets all fields.
      - anything else: apply only the theme
    @param bool updateWidget: true if we want to reload the widget after applying the new config.
  */
  var applyStyle = function(applyHow, updateWidget) {

    //$('#debug').html("width: " + widget_width);

    if (applyHow == 'custom' || applyHow == 'init') {
      $('#widget_width').val(widget_width);
      $('#widget_height').val(widget_height);

      setRadio('related_show', related_show);
      $('#number_of_summaries option[value="' + number_of_summaries + '"]')[0].selected = true;
      setRadio('show_summary', show_summary);
      setRadio('show_summary_source', show_summary_source);
      setRadio('show_summary_date', show_summary_date);
      setRadio('space_between_summaries', space_between_summaries);
      setRadio('news_scroll', news_scroll);

      $('#headers_text').val(headers_text);

      //$('#').val(news_keywords);
    }

    setRadio('show_widget_border', show_widget_border);

    $('#font_headers_size option[value="' + font_headers_size + '"]')[0].selected = true;
    $('#font_summary_title_size option[value="' + font_summary_title_size + '"]')[0].selected = true;
    $('#font_size option[value="' + font_size + '"]')[0].selected = true;

    setRadio('font_summary_title_bold', font_summary_title_bold);

    $('#font_family option[value="' + font_family + '"]')[0].selected = true;
    $('#text_alignment option[value="' + text_alignment + '"]')[0].selected = true;

    $('#color_font_headers').val(color_font_headers.substr(1,6));
    $('#headerFontColorCurrent').css('background', color_font_headers);
    $('#headerFontColorCube').ColorPickerSetColor(color_font_headers);

    $('#color_font_title').val(color_font_title.substr(1,6));
    $('#titleFontColorCurrent').css('background', color_font_title);
    $('#titleFontColorCube').ColorPickerSetColor(color_font_title);

    $('#color_font').val(color_font.substr(1,6));
    $('#summaryFontColorCurrent').css('background', color_font);
    $('#summaryFontColorCube').ColorPickerSetColor(color_font);

    $('#color_media_source').val(color_media_source.substr(1,6));
    $('#summarySourceFontColorCurrent').css('background', color_media_source);
    $('#summarySourceFontColorCube').ColorPickerSetColor(color_media_source);

    $('#color_date').val(color_date.substr(1,6));
    $('#summaryDateFontColorCurrent').css('background', color_date);
    $('#summaryDateFontColorCube').ColorPickerSetColor(color_date);

    $('#related_color').val(related_color.substr(1,6));
    $('#relatedLinksFontColorCurrent').css('background', related_color);
    $('#relatedLinksFontColorCube').ColorPickerSetColor(related_color);
    
    $('#color_border').val(color_border.substr(1,6));
    $('#borderColorCurrent').css('background', color_border);
    $('#borderColorCube').ColorPickerSetColor(color_border);

    $('#color_background').val(color_background.substr(1,6));
    $('#bgColorCurrent').css('background', color_background);
    $('#bgColorCube, #bgColorCurrent').ColorPickerSetColor(color_background);

    if (updateWidget) updateWidgetPreview();
  }

  /*
    @param data XML
    @param bool custom:
      - true: for custom widgets, where all data should be read
      - false: for reading styles, to preserve categories and headers
    @param bool avoidParams: If we don't want to touch cat, cat2 and keywords
  */
  var readXML = function(data, custom, avoidParams) {
    //$('#debug').text(data);

    if ($(data).find('version').text() == '1.0') {

      if (custom) {
      
        if (!avoidParams) {
          news_category = decodeURIComponent($(data).find('news_category').text());
          news_subcategory = decodeURIComponent($(data).find('news_subcategory').text());
          news_keywords = decodeURIComponent($(data).find('news_keywords').text());
          
          // set defaults for empty or undefined params
          if (news_category == undefined || news_category == '') {
            news_category = fzDefaults['news_category'];
          }
          if (news_subcategory == undefined || news_subcategory == '') {
            news_subcategory = fzDefaults['news_subcategory'];
          }
          if (news_keywords == undefined || news_keywords == '') {
            news_keywords = fzDefaults['news_keywords'];
          }
        }
        
        related_show = $(data).find('related_show').text();
        news_format = $(data).find('news_format').text();
        headers_text = decodeURIComponent($(data).find('headers_text').text());
        space_between_summaries = $(data).find('space_between_summaries').text();
        widget_width = $(data).find('widget_width').text();
        widget_height = $(data).find('widget_height').text();
        news_scroll = $(data).find('news_scroll').text();
        
        // set defaults for empty or undefined params
        if (related_show == undefined || related_show == '') {
          related_show = fzDefaults['related_show'];
        }
        if (news_format == undefined || news_format == '') {
          news_format = fzDefaults['news_format'];
        }
        if (headers_text == undefined || headers_text == '') {
          headers_text = fzDefaults['headers_text'];
        }
        if (space_between_summaries == undefined || space_between_summaries == '') {
          space_between_summaries = fzDefaults['space_between_summaries'];
        }
        if (widget_width == undefined || widget_width == '') {
          widget_width = fzDefaults['widget_width'];
        }
        if (widget_height == undefined || widget_height == '') {
          widget_height = fzDefaults['widget_height'];
        }
        if (news_scroll == undefined) {    // news scroll can take an empty value
          news_scroll = fzDefaults['news_scroll'];
        }
      }

      show_widget_border = $(data).find('show_widget_border').text();
      number_of_summaries = $(data).find('number_of_summaries').text();
      show_summary = $(data).find('show_summary').text();
      show_summary_source = $(data).find('show_summary_source').text();
      show_summary_date = $(data).find('show_summary_date').text();
      font_headers_size = $(data).find('font_headers_size').text().replace(/[^0-9]/g, '');  // remove non-numeric characters
      font_summary_title_size = $(data).find('font_summary_title_size').text().replace(/[^0-9]/g, '');  // remove non-numeric characters
      font_summary_title_bold = $(data).find('font_summary_title_bold').text();
      font_size = $(data).find('font_size').text().replace(/[^0-9]/g, '');  // remove non-numeric characters
      font_family = $(data).find('font_family').text();
      text_alignment = $(data).find('text_alignment').text();
      related_color = $(data).find('related_color').text();
      color_font_headers = $(data).find('color_font_headers').text();
      color_font_title = $(data).find('color_font_title').text();
      color_font = $(data).find('color_font').text();
      color_summary = $(data).find('color_summary').text();
      color_media_source = $(data).find('color_media_source').text();
      color_date = $(data).find('color_date').text();
      color_border = $(data).find('color_border').text();
      color_background = $(data).find('color_background').text();
      
      // set defaults for empty or undefined params
      if (show_widget_border == undefined || show_widget_border == '') {
        show_widget_border = fzDefaults['show_widget_border'];
      }
      if (number_of_summaries == undefined || number_of_summaries == '') {
        number_of_summaries = fzDefaults['number_of_summaries'];
      }
      if (show_summary == undefined || show_summary == '') {
        show_summary = fzDefaults['show_summary'];
      }
      if (show_summary_source == undefined || show_summary_source == '') {
        show_summary_source = fzDefaults['show_summary_source'];
      }
      if (show_summary_date == undefined || show_summary_date == '') {
        show_summary_date = fzDefaults['show_summary_date'];
      }
      if (font_headers_size == undefined || font_headers_size == '') {
        font_headers_size = fzDefaults['font_headers_size'];
      }
      if (font_summary_title_size == undefined || font_summary_title_size == '') {
        font_summary_title_size = fzDefaults['font_summary_title_size'];
      }
      if (font_summary_title_bold == undefined || font_summary_title_bold == '') {
        font_summary_title_bold = fzDefaults['font_summary_title_bold'];
      }
      if (font_size == undefined || font_size == '') {
        font_size = fzDefaults['font_size'];
      }
      if (font_family == undefined || font_family == '') {
        font_family = fzDefaults['font_family'];
      }
      if (text_alignment == undefined || text_alignment == '') {
        text_alignment = fzDefaults['text_alignment'];
      }
      if (related_color == undefined || related_color == '') {
        related_color = fzDefaults['related_color'];
      }
      if (color_font_headers == undefined || color_font_headers == '') {
        color_font_headers = fzDefaults['color_font_headers'];
      }
      if (color_font_title == undefined || color_font_title == '') {
        color_font_title = fzDefaults['color_font_title'];
      }
      if (color_font == undefined || color_font == '') {
        color_font = fzDefaults['color_font'];
      }
      if (color_summary == undefined || color_summary == '') {
        color_summary = fzDefaults['color_summary'];
      }
      if (color_media_source == undefined || color_media_source == '') {
        color_media_source = fzDefaults['color_media_source'];
      }
      if (color_date == undefined || color_date == '') {
        color_date = fzDefaults['color_date'];
      }
      if (color_border == undefined || color_border == '') {
        color_border = fzDefaults['color_border'];
      }
      if (color_background == undefined || color_background == '') {
        color_background = fzDefaults['color_background'];
      }
    }
  }

  var processXML = function(data) {
    //$('#debug').text(data);
    /*
       BEGIN DEBUG
       DEBUG only, take out for production environment.
    */
    if (typeof(data) == 'string') {
      try {
        data = parseXML(data);
        //$('#debug').append($('feedzillaWidget',data).find('version').text() + '<br/>');
        data = $('feedzillaWidget', data);
      }
      catch (e) { alert(e); }
    }
    /* END DEBUG */

    readXML(data, false, false);
    applyStyle(false, true);
  }

  var loadStyle = function(themeCanvas) {

    //$('#debug').html($(themeCanvas).attr('id'));

    if ($(themeCanvas).attr('id')) {

      var file = '/en/v2/widgets/config/' + $(themeCanvas).attr('id') + '.xml';

      $.get(file, processXML, 'xml');
    }
  }

  var showStyleFinish = function(event) {

    var themeCanvas = $(event.target).is('.fzStylePreviewCanvas') ?
      $(event.target) : $(event.target).parents('.fzStylePreviewCanvas');

    if (themeCanvas.is('.fzStylePreviewCanvas')) {
      $('#popularThemes .fzThemePreviewCanvas').addClass('invisibleBorder').removeClass('highlighted').fadeTo(500, 1);
      $('#widgetStyles .fzStylePreviewCanvas.highlighted').addClass('invisibleBorder').removeClass('highlighted');
      $('#wizardStep2aContentWrapper .tick').remove();
      themeCanvas.addClass('highlighted').removeClass('invisibleBorder').fadeTo(500, 1);
      $('#widgetStyles .fzStylePreviewCanvas.invisibleBorder').fadeTo(500, 0.5);
      $('#step2aHeader').after('<div class="tick"></div>');
      $('#customStyle').addClass('hidden');
      $('#wizardStep2b').removeClass('hidden');
      loadStyle(themeCanvas);
    }
  }

  var showThemeFinish = function(event) {

    var themeCanvas;

    if ($(event.target).is('.fzThemePreviewCanvas')) {
      themeCanvas = $(event.target);
    }
    else if ($(event.target).is('a')) {
      event.preventDefault();
      $(event.target).blur();
      themeCanvas = $(event.target).parent().prev('.fzThemePreviewCanvas');
    }
    else {
      themeCanvas = $(event.target).parents('.fzThemePreviewCanvas');
    }

    if (themeCanvas.is('.fzThemePreviewCanvas')) {
      $('#widgetStyles .fzStylePreviewCanvas').addClass('invisibleBorder').removeClass('highlighted').fadeTo(500, 1);
      $('#popularThemes .fzThemePreviewCanvas.highlighted').addClass('invisibleBorder').removeClass('highlighted');
      $('#wizardStep2aContentWrapper .tick').remove();
      themeCanvas.addClass('highlighted').removeClass('invisibleBorder').fadeTo(500, 1);
      $('#popularThemes .fzThemePreviewCanvas.invisibleBorder').fadeTo(500, 0.5);
      $('#step2aHeader').after('<div class="tick"></div>');
      $('#customStyle').addClass('hidden');
      $('#wizardStep2b').removeClass('hidden');
      loadStyle(themeCanvas);
      document.getElementById('container').scrollIntoView(true);
    }
  }

  var showCustomStyle = function(event) {
    if ($(event.target).is('#ownStyle') || $(event.target).is('#customStyleClose img')) {
      event.preventDefault();
      $('#widgetStyles img').removeClass('highlighted');
      $('#widgetStyles img').addClass('invisibleBorder');
      $('#wizardStep2aContentWrapper .tick').remove();
      $('#customStyle').toggle("slow");
      $('#ownStyle').parent().after('<div class="tick"></div>');
      $('#wizardStep2b').removeClass('hidden');
      $('#ownStyle').blur();
    }
  };

  var showSize = function(event) {

    // make sure to only react for links
    if ($(event.target).is('a')) {
      event.preventDefault();
      $(event.target).blur();
      $('#sizes li a').removeClass('bold');
      $(event.target).addClass('bold');
      $('#step2bHeader').siblings('.tick').remove();
      $('#step2bHeader').after('<div class="tick"></div>');
    }

    if ($(event.target).is('#sizeDefault')) {
      $('#widget_width').val(widget_width);
      $('#widget_height').val(widget_height);
      $('#wizardStep2b1').hide("slow");
      $('#wizardStep2b2').toggle("slow");
    }
    else if ($(event.target).is('#sizeHelp')) {
      $('#wizardStep2b2').hide("slow");
      $('#wizardStep2b1').toggle("slow");
    }
    else if ($(event.target).is('#helpSizingClose img')) {
      event.preventDefault();
      $('#wizardStep2b1').hide("slow");
    }
  };

  var showStep3Start = function(event) {

    if ($(event.target).is('#finishStep2') || $(event.target).is('#step3BubbleLink')) {
      event.preventDefault();
      $('#wizardStep3').fadeIn();
      $('#wizardStep2').fadeOut();
      scrollToWizard();
    }
  };

  var showStep3Finish = function(event) {

    if ($(event.target).is('img')) {
      event.preventDefault();
      $(event.target).parent().blur();
      
      $('#step3Status')
        .empty()
        .html('<h2>' + $('#dict_step3Loading').text() + '</h2> <img class="step3StatusLoadingPic" src="/en/v2/img2/ajax_loader2.gif" alt="' + $('#dict_step3Loading').text() + '"/>');

      if ($.browser.msie) {  // fading transparent pngs in IE turns their transparent areas solid
        $('#installBlog a img:not(#'+ $(event.target).attr('id') + ')')
          .addClass('invisibleBorder').removeClass('highlighted');
        $('#installSocial a img:not(#'+ $(event.target).attr('id') + ')')
          .addClass('invisibleBorder').removeClass('highlighted');
        $('#installWeb a img:not(#'+ $(event.target).attr('id') + ')')
          .addClass('invisibleBorder').removeClass('highlighted');
        $(event.target).addClass('highlighted').removeClass('invisibleBorder');
      }
      else {
        $('#installBlog a img:not(#'+ $(event.target).attr('id') + ')')
          .addClass('invisibleBorder').removeClass('highlighted').fadeTo(300, 0.5);
        $('#installSocial a img:not(#'+ $(event.target).attr('id') + ')')
          .addClass('invisibleBorder').removeClass('highlighted').fadeTo(300, 0.5);
        $('#installWeb a img:not(#'+ $(event.target).attr('id') + ')')
          .addClass('invisibleBorder').removeClass('highlighted').fadeTo(300, 0.5);
        $(event.target).addClass('highlighted').removeClass('invisibleBorder').fadeTo(300, 1);
      }
      
      // generate widget code URL
      code = $(event.target).attr('id').replace(/fzInstall_/, '');
      
      var url = codeURL + '?' + 'id=' + style_id;
      
      var $iFrame = $('<iframe></iframe>')
        .attr('src', generateFlashString(url))
        .css({
          'width' : '100%',
          'height' : '250px',
          'overflow' : 'hidden'
        });

      $('#widgetCode')
        .empty()
        .append($iFrame);

      $('#wizardStep3bContent').fadeIn('fast', function() {document.getElementById('wizardStep3bContent').scrollIntoView(true);});
    }
  };

  var copyWidgetCode = function(event) {

    if ($(event.target).is('#widgetCodeCopyBtn')) {
      $('#widgetCode textarea').select();
    }
  }

  var showRelatedVideosHelp = function(event) {

    if ($(event.target).is('#helpRelatedVideos')) {
      event.preventDefault();
      $('#helpRelatedVideos').blur();
      $('#relatedVideosInfo').fadeIn("slow");
      setTimeout(function() {$('#relatedVideosInfo').fadeOut("slow");}, 5000);
    }
  }

  var moveWizard = function(){

    var now = new Date();
    if ((now.getTime() - lastScroll.getTime()) > 300) {
      var widgetStart = 50;

      var wizardStart = ($('#wizard').length > 0) ? $('#wizard').css('min-height') : $('#wizardNews').css('min-height');
      wizardStart = wizardStart.replace(/px/, '');

      var wizardHeight = ($('#wizard').length > 0) ? $('#wizard').height() : $('#wizardNews').height();
      var scrollTop = $(window).scrollTop();
      var space = (wizardHeight > wizardStart) ? wizardHeight - wizardStart : 0;
      var travel = (scrollTop <= space) ? scrollTop + widgetStart : space + widgetStart;

      var moveSmoothly = function() {

        var pace = 2;         // how often to move in milliseconds
        var stride = 7;       // how far to move
        var jumpUp = 600;     // up to what distance to jump up
        var jumpDown = 300;   // up to what distance to jump down
        var pos = $('#widgetContainer').css('top');

        // check if user changed their mind and scrolled elsewhere
        if ((now.getTime() - lastScroll.getTime()) < 50) {
          movingWizard = false;    // abandon move
          return true;
        }

        movingWizard = true;    // show wizard is moving to avoid opposing scroll requests
        pos = parseInt(pos.replace(/px/, ''));

        if (pos == travel) {    // we have arrived
          movingWizard = false;
          return true;
        }

        // 3 different speeds: for long distance jump, then slow down to travel speed, then parking speed
        if (pos > travel) {
          if ((pos - travel) > (jumpUp)) $('#widgetContainer').css('top', (travel+jumpUp) + 'px');
          else if ((pos - travel) <= (stride * 6)) $('#widgetContainer').css('top', (pos-1) + 'px');
          else $('#widgetContainer').css('top', (pos-stride) + 'px');
        }
        else if (pos < travel) {
          if ((travel - pos) > (jumpDown)) $('#widgetContainer').css('top', (travel-jumpDown) + 'px');
          else if ((travel - pos) <= (stride * 6)) $('#widgetContainer').css('top', (pos+1) + 'px');
          else $('#widgetContainer').css('top', (pos+stride) + 'px');
        }
        setTimeout(moveSmoothly, pace);
      }

      // only request move to next location once the previous move is complete
      if (!movingWizard) moveSmoothly();
      else setTimeout(moveWizard, 100);
    }
  }

  var sanitiseHex = function(hex) {

    var validHex = /^[0-9a-f]{3,6}$/i;

    if (!validHex.test(hex)) {
        hex = hex.replace(/^\s\s*/, '').replace(/\s\s*$/, '').toLowerCase();
        hex = hex.replace(/.{6}.+/gi, hex.substr(0,6));
        hex = hex.replace(/[^0-9a-f]/gi, 'f');
    }

    if (hex.length < 6) {
      switch (hex.length) {
        case 0: hex = '000000';
          break;
        case 1:
          hex += hex + hex + hex + hex + hex;
          break;
        case 2: hex += hex + hex;
          break;
        case 3:
          hex = hex.charAt(0) + hex.charAt(0) + hex.charAt(1) + hex.charAt(1) + hex.charAt(2) + hex.charAt(2);
          break;
        case 4:
          hex += hex.substr(2,2);
          break;
        case 5: hex += hex.charAt(4);
          break;
      }
    }

    return hex;
  }

  var updateBorderColor = function(event) {

    if ($(event.target).is('.colorField input')) {

      var hex = sanitiseHex($(this).val());

      $(this).parent().siblings('.colorCurrent').css('background', '#' + hex);

      target_id = $(event.target).attr('id');
      //$('#debug').append(target_id + ' currently: ' + window[target_id] + ' set to: ' + event.target.value);

      target_value = '#' + hex;

      // for input values of 1, 3 or 6 digits update the widget, if we have a new color
      if (($(this).val().length == 1 || $(this).val().length == 3 || $(this).val().length == 6) &&
        window[target_id] != target_value) {
        window[target_id] = target_value;
        $(this).parent().siblings('.colorCube').ColorPickerSetColor(target_value);
        updateWidgetPreview();
      }
    }
  }

  var showCustomStyleAdvancedOptions = function(event) {

    if ($(event.target).is('#customStyleAdvancedOptions a')) {
      event.preventDefault();

      if ($('#show_summary input:radio:checked').val() == 'No') {
        $('#customStyleSummaries').removeClass("advancedOption").hide();
      }

      $('#customStyleAdvancedOptions').fadeOut("slow");
      $('.advancedOption').fadeIn("slow");
      $('#customStyleBasicOptions').fadeIn("slow");
    }
  }

  var showCustomStyleBasicOptions = function(event) {

    if ($(event.target).is('#customStyleBasicOptions a')) {
      event.preventDefault();

      if ($('#showSummariesField input:radio:checked').val() == 'Yes') {
        $('#customStyleSummaries').addClass("advancedOption");
      }

      $('.advancedOption').fadeOut("slow");
      $('#customStyleBasicOptions').fadeOut("slow");
      $('#customStyleAdvancedOptions').fadeIn("slow");
      document.getElementById('ownStyle').scrollIntoView(true);
    }
  }

  var showSubCatField = function() {

    $('#keywordSearch').remove();
    $('#cat2').fadeIn('slow');
    $('#advancedSearch').fadeIn('slow');
    $('#cat2').trigger('change');
  }

  var showSubCatSearch = function(event) {

    if ($(event.target).is('#cat2Search a')) {
      event.preventDefault();
      $('#cat2').next('.tick').remove();
      $('#cat2Search').parent().fadeOut('slow', function() {$(this).remove();});
      $('#keywordSearch').fadeOut('slow', showSubCatField);
    }
  }

  var processKeywordTagCloud = function(data) {

    /*
       BEGIN DEBUG
       DEBUG only, take out for production environment.
    */
    if (typeof(data) == 'string') {
      try {
        data = parseXML(data);
        //$('#debug').append($('feedzillaWidget',data).find('version').text() + '<br/>');
        data = $('feedzillaSuggest', data);
      }
      catch (e) { alert(e); }
    }
    /* END DEBUG */

    $('#keywordTagCloud').remove();

    if (!data.length) return;

    var suggest = $('<div id="keywordTagCloud"></div>')
      .appendTo('#keywordSearch');

    $(data).find('keyword').each(
      function(keyIndex, keyword) {
        //$('#debug').append( $(keyword).text() + ' ' + $(keyword).attr('size') + '<br/>');
        $('<a class="tagSize' + $(keyword).attr('size') + '" href="#">' + $(keyword).text() + ' </a>') // space fixes ff line breaks
          .appendTo($(suggest))
          .click(
            function(event) {
              event.preventDefault();
              $('#keywordSearchField').val($(keyword).text());
              applyKeywordSuggestion();
              $('#keywordTagCloud').fadeOut('slow', function() { $(this).remove(); });
            }
          );
      }
    );

    var close = $('<div></div>').addClass('simpleWrapper').addClass('closeLink').appendTo($(suggest));

    $('<a href="#">' + $('#dict_linkClose').text() + '</a>')
      .appendTo($(close))
      .css({'color' : '#666666', 'padding-right' : '5px'})
      .click(
        function(event) {
          event.preventDefault();
          $('#keywordTagCloud').fadeOut('slow', function() { $(this).remove(); });
        }
      );
  }

/*
  // handles a click on the keyword tagcloud link by getting and processing an XML file
  var toggleKeywordTagCloud = function(event) {

    event.preventDefault();
    $(event.target).blur();

    if ($('#keywordTagCloud').length > 0) {
      $('#keywordTagCloud').fadeOut('slow', function() { $(this).remove(); });
    }
    else {
      $.get('/en/v2/widgets/config/cat_tag_cloud.xml', processKeywordTagCloud, 'xml');
    }
  }
*/
  var toggleKeywordTagCloud = function(event) {

    event.preventDefault();
    $(event.target).blur();

    if ($('#keywordTagCloud').length > 0) {
      $('#keywordTagCloud').fadeOut('slow', function() { $(this).remove(); });
    }
    else {
      var $suggest = $('<div id="keywordTagCloud"></div>')
        .appendTo('#keywordSearch');
      
      $loadingDiv = makeLoadingDiv($suggest).insertBefore($suggest);
      var suggestSourceFile = '/news/tc/tc_html_' + news_category.replace(/\s/g, '_') + '.html';

      $suggest.hide().load(suggestSourceFile, function() {
        
          $loadingDiv.remove();
          
          $suggest.children('a').each(
            function(keyIndex, keyword) {
              //$('#debug').append( $(keyword).text() + ' ' + $(keyword).attr('size') + '<br/>');
              $(keyword)
                .click(
                  function(event) {
                    event.preventDefault();
                    $('#keywordSearchField').val($(keyword).text().replace(/"/g, ''));
                    applyKeywordSuggestion();
                    $('#keywordTagCloud').fadeOut('slow', function() { $(this).remove(); });
                  }
                );
            }
          );
          
          var $close = $('<div></div>').addClass('simpleWrapper').addClass('closeLink').appendTo($suggest);

          $('<a href="#">' + $('#dict_linkClose').text() + '</a>')
            .appendTo($close)
            .css({'color' : '#666666', 'padding-right' : '5px'})
            .click(
              function(event) {
                event.preventDefault();
                $('#keywordTagCloud').fadeOut('slow', function() { $(this).remove(); });
              }
            );
        });
        
      $suggest.fadeIn();
    }
  }

  var applyKeywordSuggestion = function() {

    $('#wizardStep1b .tick').remove();  // get rid of all ticks first
    $('#keywordSearch label').hide();

    if (news_keywords != $('#keywordSearchField').val()) {
      news_keywords = $('#keywordSearchField').val();
      updateWidgetPreview();
    }
    if (news_keywords) {
      $('<div></div>')
        .hide()
        .addClass('tick')
        .insertAfter('#keywordSearchButton')
        .fadeIn();

      $('#wizardStep1c').fadeIn();
    }
  }

  var setSelectedSuggest = function(index) {

    selectedSuggest = index;

    if (typeof(selectedSuggest) == 'boolean') {
      return;
    }

    var suggestWords = $('#keywordSuggest ul').find('li').removeClass('keywordSelected');

    if (selectedSuggest < 0) {    // select none
      selectedSuggest = -1;
      return;
    }
    else if (selectedSuggest > suggestWords.length - 1) {
      selectedSuggest = suggestWords.length - 1;
    }

    suggestWords.eq(selectedSuggest).addClass('keywordSelected');
  }

  var populateKeywordField = function() {

    if (typeof(selectedSuggest) != 'boolean' && selectedSuggest >= 0) {
      var keywords = $('#keywordSuggest ul').find('li').eq(selectedSuggest).text();
      $('#keywordSearchField').val(keywords);
      setSelectedSuggest(-1);
      $('#keywordSuggest').fadeOut('slow', function() {$(this).remove()});
    }
    else {
      news_keywords = $('#keywordSearchField').val();
      setSelectedSuggest(-1);
      $('#wizardStep1b .tick').remove();  // get rid of all ticks first
      $('#keywordSuggest').fadeOut('slow', function() {$(this).remove()});
      $('#cat2Search').after('<div class="tick hidden"></div>');
      $('#wizardStep1b .tick').fadeIn();
      $('#wizardStep1c').fadeIn();
      updateWidgetPreview();
    }
  }

  var processKeywords = function(data) {

    /*
       BEGIN DEBUG
       DEBUG only, take out for production environment.
    */
    if (typeof(data) == 'string') {
      try {
        data = parseXML(data);
        //$('#debug').append($('feedzillaWidget',data).find('version').text() + '<br/>');
        data = $('feedzillaSuggest', data);
      }
      catch (e) { alert(e); }
    }
    /* END DEBUG */

    $('#keywordSuggest').remove();
    setSelectedSuggest(-1);

    if (!data.length) return;

    $('<div id="keywordSuggest"></div>')
      .appendTo('#keywordSearch');

    var suggest = $('<ul></ul>')
      .appendTo('#keywordSuggest');

    $(data).find('keyword').each(
      function(keyIndex, keyword) {
        //$('#debug').append( $(keyword).text() + ' ' + $(keyword).attr('size') + '<br/>');
        $('<li><a class="tagSize' + $(keyword).attr('size') + '" href="#">' + $(keyword).text() + '</a></li>')
          .appendTo($(suggest))
          .click(
            function(event) {
              event.preventDefault();
              $('#keywordSearchField').val($(keyword).text());
              applyKeywordSuggestion();
            }
          )
          .mouseover(
            function() { setSelectedSuggest(keyIndex); }
          );
      }
    );

    $(suggest).appendTo('#keywordSuggest');
  }

  var getKeywords = function(event) {

    if ($('#keywordSearchField').val() == '') {
      $('#keywordSuggest').fadeOut('slow', function() {$(this).remove();});
      selectedSuggest = false;
    }
    else {
      if (event.keyCode == 38 && typeof(selectedSuggest) != 'boolean' && selectedSuggest >= 0) {
        event.preventDefault();
        setSelectedSuggest(selectedSuggest - 1);
      }
      else if (event.keyCode == 40 && typeof(selectedSuggest) != 'boolean') {
        event.preventDefault();
        setSelectedSuggest(selectedSuggest + 1);
      }
      else if (event.keyCode == 8 || event.keyCode > 40 ) {    // avoid special key events
        $.get('/en/v2/widgets/config/suggest.xml', processKeywords, 'xml');
      }
    }
  }

  /*
  * @param bool populate: if the keyword field should be populated or not
  */
  var showKeywordField = function(populate) {

    if ($('#keywordSearch').length > 0) {    // if the keywordSearch Field exists, don't create it again

      $('#keywordSearch').fadeIn();
      return false;
    }

    $('<div id="keywordSearch">' +
        '<input id="keywordSearchField" name="keywordSearchField" type="text"></input>' +
        '<label for="keywordSearchField">' + $('#dict_keywordSearchField').text() + '</label>' +
      '</div>')
        .hide()
        .css('zIndex', 5)    // needed for IE7
        .insertBefore('#advancedSearch')
        .fadeIn('slow');

      $('#keywordSearch label')
        .click(
          function() {
            $('#keywordSearchField').trigger('focus');
          }
        );

      if (populate) $('#keywordSearch label').hide();

      $('#keywordSearchField')
        .attr('autocomplete', 'off')
        .focus(
          function() {
            $('#keywordSearch label').hide();
            //getKeywords();  // keyword suggestion box, maybe used later
          }
        )
        .click(
          function() {
            $('#keywordSearch label').hide();
          }
        )
        .blur(
          function() {
            if ($('#keywordSearchField').val() == '') $('#keywordSearch label').show();
            $('#keywordSuggest').fadeOut('slow', function() {$(this).remove()});
          }
        )
        .keypress(
          function(event) {
            var keycode = (event.which) ? event.which : event.keyCode;
            if (keycode == 13) {    // ENTER
              event.preventDefault();
              //populateKeywordField();  // keyword suggestion box, maybe used later
              applyKeywordSuggestion();
            }
            else if (keycode == 39) {  // Arrow Right
              event.preventDefault();
              //populateKeywordField();  // keyword suggestion box, maybe used later
            }
            else if (keycode == 27) {  // ESC
              event.preventDefault();
              $('#keywordSuggest').fadeOut('slow', function() {$(this).remove()});
              setSelectedSuggest(-1);
            }
          }
        );
        //.keyup(getKeywords);  // keyword suggestion box, maybe used later

    if (populate) {
      $('#keywordSearchField').val(news_keywords).text(news_keywords);
    }

    $('<div id="keywordSearchButton"></div>')
      .appendTo('#keywordSearch');

    $('<a href="#">' + $('#dict_keywordSearchButton').text() + '</a>')
      .appendTo('#keywordSearchButton')
      .click(
        function(event) {
          event.preventDefault();
          $(this).blur();
          applyKeywordSuggestion();
        }
      );
    
    var nextLine = $('<div></div>')
      .addClass('clearWrapper')
      .appendTo('#keywordSearch');

    $('<div id="cat2PopularKeywords"><a href="#">' + $('#dict_cat2PopularKeywords').text() + ' <b>' + $('#cat :selected').text() + '</b></a></div>')
      .addClass('searchOption')
      .appendTo($(nextLine))
      .fadeIn('slow')
      .click(toggleKeywordTagCloud);

    $('<div id="cat2Search"><a href="#">' + $('#dict_cat2Search').text() + '</a></div>')
      .addClass('searchOption')
      //.insertAfter('#keywordSearch')
      .appendTo($(nextLine))
      .fadeIn('slow')
      .click(showSubCatSearch);
  }

  var showKeywordSearch = function(event) {

    if ($(event.target).is('#advancedSearch a')) {
      event.preventDefault();
      $('#advancedSearch')
        .hide()
        .next('.tick')
        .remove();

      $('#cat2').fadeOut('fast', function() { showKeywordField(false); });
      $('#wizardStep1c').fadeOut();
    }
  }

  var toggleSummaries = function(event) {

    if ($(event.target).is('#show_summary input:radio') &&
        $('#show_summary input:radio:checked').val() != show_summary &&
        $('.advancedOption').is(":visible")) {

      if ($('#show_summary input:radio:checked').val() == 'Yes') {
        $('#customStyleSummaries').fadeIn("slow");
      }
      else if ($('#show_summary input:radio:checked').val() == 'No') {
        $('#customStyleSummaries').fadeOut("slow");
      }
    }
  }

  var toggleMediaSourceColor = function(event) {

    if ($(event.target).is('#show_summary_source input:radio') &&
        $('#show_summary_source input:radio:checked').val() != show_summary_source &&
        $('.advancedOption').is(":visible")) {

      if ($('#show_summary_source input:radio:checked').val() == 'Yes') {
        $('#mediaSourceColor').fadeIn("slow");
      }
      else if ($('#show_summary_source input:radio:checked').val() == 'No') {
        $('#mediaSourceColor').fadeOut("slow");
      }
    }
  }

  var toggleDateColor = function(event) {

    if ($(event.target).is('#show_summary_date input:radio') &&
        $('#show_summary_date input:radio:checked').val() != show_summary_date &&
        $('.advancedOption').is(":visible")) {

      if ($('#show_summary_date input:radio:checked').val() == 'Yes') {
        $('#dateColorField').fadeIn("slow");
      }
      else if ($('#show_summary_date input:radio:checked').val() == 'No') {
        $('#dateColorField').fadeOut("slow");
      }
    }
  }

  var applyCustomStyleChange = function(event) {

    var target_id = null;
    var target_value = event.target.value;

    if ($(event.target).is('input:radio')) {
      target_id = $(event.target).parent().attr('id');
      $('#' + target_id + ' input:radio:checked').blur();
      //$('#debug').append(target_id + ' currently: ' + window[target_id] + ' set to: ' + event.target.value);

      if (window[target_id] != target_value) {    // only update real change
        window[target_id] = target_value;
        updateWidgetPreview();
      }
    }
    else if ($(event.target).is('input:text')) {
      target_id = $(event.target).attr('id');
      //$('#debug').append(target_id + ' currently: ' + window[target_id] + ' set to: ' + event.target.value);

      if (target_id == 'headers_text') {
        if (window[target_id] != target_value) {
          window[target_id] = target_value;
          updateWidgetPreview();
        }
      }
      else {
        target_value = '#' + target_value;    // color fields are hex

        if (window[target_id] != target_value) {
          window[target_id] = target_value;
          $('#' + target_id).parent().siblings('.colorCube').ColorPickerSetColor(target_value);
          updateWidgetPreview();
        }
      }
    }
    else if ($(event.target).is('select')) {
      target_id = $(event.target).attr('id');
      //$('#debug').append(target_id + ' currently: ' + window[target_id] + ' set to: ' + event.target.value);

      if (window[target_id] != target_value) {    // only update real change
        $('#' + target_id).blur();    // blur on change only
        window[target_id] = target_value;
        updateWidgetPreview();
      }
    }
  }

  var applyCommonSize = function(event) {

    if ($(event.target).is('a')) {
      event.preventDefault();
      target_id = $(event.target).attr('id');

      $('#helpSizingCommonSizes .commonSizes li a').removeClass('bold');
      $('#' + target_id).blur().addClass('bold');

      // common size id format (eg size200x400) allows regex use to find size
      var size = target_id.match(/\d+/g, '');
      applyWidgetResize(size[0], size[1]);
    }
    return false;    // stop event-propagation
  }

  var applyCustomSize = function(event) {

    if ($(event.target).is('a')) {
      event.preventDefault();
      $(event.target).blur();
    }
    var chosen_width = $('#widget_width').val();
    var chosen_height = $('#widget_height').val();

    applyWidgetResize(chosen_width, chosen_height);
    return false;
  }

  var applyPresetSize = function(event) {

    $(event.target).blur();
    target_val = $('#presetSize').val();

    $('#helpSizingCommonSizes .commonSizes li a').removeClass('bold');    // in case a common size was previously selected

    // common size id format (eg size200x400) allows regex use to find size
    var size = target_val.match(/\d+/g, '');
    applyWidgetResize(size[0], size[1]);

    return false;    // stop event-propagation
  }

  /*
    @param bool submit:
    - false if we only check for validity
    - true if we also submit
  */
  var validateEmailField = function(submit) {

    var email = $('#emailThemeField').val();

    if (email.match(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/)) {

      if (submit) {
        var postURL = '/widgets/se.asp';
        var postParams = {email : email, id : style_id}; //'email=' + email + '&id=' + style_id
        
        $('#emailTheme > *').remove();
        $('<p></p>')
          .addClass('loading')
          .appendTo($('#emailTheme'))
          .html('<img class="loadingPic" src="/en/v2/img2/ajax_loader2.gif" alt="Loading..."/>')
          .load(postURL, postParams, function() {
            
            $(this).removeClass('loading').find('.loadingPic').remove();
            $(this).css('text-align', 'left').fadeIn();
            //setTimeout( function() {$('#emailTheme').fadeOut('slow', function() { $(this).remove() })}, 5000);
          });
      }
    }
    else if (submit) {
      $('#emailTheme p').remove();
      $('<p>' + $('#dict_emailThemeFail').text() + '</p>')
        .hide().appendTo($('#emailTheme')).fadeIn('slow');
    }
  }

  var showEmailThemeForm = function(event) {

    event.preventDefault();
    $(event.target).blur();

    if ($('#emailTheme').length > 0) {
      $('#emailTheme').fadeOut('slow', function() { $(this).remove() });
      return false;
    }

    $('<div id="emailTheme">' +
        '<input id="emailThemeField" name="emailThemeField" type="text"></input>' +
        '<label for="emailThemeField">' + $('#dict_emailThemeLabelEmailField').text() + '</label>' +
      '</div>')
        .hide()
        .appendTo('#flashInstructions')
        .fadeIn('slow');

      $('#emailTheme label')
        .click(
          function() {
            $('#emailThemeField').trigger('focus');
          }
        );

      $('#emailThemeField')
        .attr('autocomplete', 'off')
        .focus(
          function() {
            $('#emailTheme label').hide();
            getKeywords();
          }
        )
        .click(
          function() {
            $('#emailTheme label').hide();
          }
        )
        .blur(
          function() {
            if ($('#emailThemeField').val() == '') $('#emailTheme label').show();
          }
        )
        .keypress(
          function(event) {
            var keycode = (event.which) ? event.which : event.keyCode;
            if (keycode == 13) {    // ENTER
              event.preventDefault();
              validateEmailField(true);
            }
          }
        )
        .keyup(validateEmailField(false));

    $('<div id="emailThemeButton"></div>')
      .appendTo('#emailTheme');

    $('<a href="#">' + $('#dict_emailThemeButtonSubmit').text() + '</a>')
      .appendTo('#emailThemeButton')
      .click(
        function(event) {
          event.preventDefault();
          $(this).blur();
          validateEmailField(true);
        }
      );

    $('<p></p>')
      .html($('#dict_emailThemeInfo1').text() + '<br/>')
      .appendTo('#emailTheme');

    $('<p></p>')
      .html($('#dict_emailThemeInfo2').text() + '<br/>')
      .appendTo('#emailTheme');

    $('<p></p>')
      .html($('#dict_emailThemeInfo3').text())
      .appendTo('#emailTheme');
  }

  var hideSizes = function(event) {

    event.preventDefault();
    $('#wizardStep2b2').hide('slow');
    return false;
  }

  var customStyleUpdateButtonAction = function(event) {

    if ($(event.target).is('a')) {
      event.preventDefault();
      $(event.target).blur();
    }

    return false;    // stop event delegation
  }

  // Begin PopOut Code
  /*var viewport = {
        o: function() {
            if (self.innerHeight) {
    			this.pageYOffset = self.pageYOffset;
    			this.pageXOffset = self.pageXOffset;
    			this.innerHeight = self.innerHeight;
    			this.innerWidth = self.innerWidth;
    		} else if (document.documentElement && document.documentElement.clientHeight) {
    			this.pageYOffset = document.documentElement.scrollTop;
    			this.pageXOffset = document.documentElement.scrollLeft;
    			this.innerHeight = document.documentElement.clientHeight;
    			this.innerWidth = document.documentElement.clientWidth;
    		} else if (document.body) {
    			this.pageYOffset = document.body.scrollTop;
    			this.pageXOffset = document.body.scrollLeft;
    			this.innerHeight = document.body.clientHeight;
    			this.innerWidth = document.body.clientWidth;
    		}
    		return this;
        },
        init: function(el) {

            $(el).css("left",Math.round(viewport.o().innerWidth/2) + viewport.o().pageXOffset - Math.round($(el).width()/2));
            $(el).css("top",Math.round(viewport.o().innerHeight/2) + viewport.o().pageYOffset - Math.round($(el).height()/2));
        }
    };

  // internal pop out
  var showWidgetPopOut = function(event) {

    event.preventDefault();
    $(event.target).blur();

    $(".simple_popup_div").remove();
    var previewCopy = $('#widgetContainer').clone();
    previewCopy.attr('id', 'widgetContainerPopOut');
    previewCopy.css({'top' : '0', 'left' : '0'});
    previewCopy.find('#fzWidgetPreview').removeAttr('id');
    previewCopy.find('#widgetPopOut').remove();
    var closeButton = $('<div class="widgetButton"></div>').insertAfter(previewCopy.find('h2'));

    $('<a href="#"><img src="/en/v2/img2/close_custom_button.png" alt="' + $('#dict_linkClose').text() + '" /></a>')
      .appendTo(closeButton)
      .click(function() {
          $('.simple_popup_div').fadeOut('fast', function() { $(this).remove(); });
          $('#widgetContainerPopOutBg').fadeOut('fast', function() { $(this).remove(); });
          $('#fzWidgetPreview').show();
          return false;
        }
      );

    var wrapper = $('<div class="simple_popup_div"></div>').hide().appendTo('body');
    var inner = $('<div class="simple_popup_inner"></div>').appendTo(wrapper);
    inner.append(previewCopy);

    $('<div id="widgetContainerPopOutBg"></div>').fadeTo('fast', 0.7).appendTo('body');

    viewport.init(".simple_popup_div");
    wrapper.show();
    $('#fzWidgetPreview').hide();
    return false;
  }
  */

  var populateWidgetPopOutExt = function(previewWindow) {

    var previewWrapperStyle = 'style="' +
      'width:' + $('.fzWidget').css('width') + '; ' +
      '"';

    fzWidgetCopy = '<iframe ' +
      'style="' +
      'border:' + $('#fzWidgetPreview').css('border') + '; ' +
      'width:' + $('#fzWidgetPreview').css('width') + '; ' +
      'height: ' + $('#fzWidgetPreview').css('height') + ';' +
      '" ' +
      'scrolling="no" frameborder="0" marginwidth="0" marginheight="0" allowtransparency="True" ' +
      'src="' + $('#fzWidgetPreview').attr('src') + '"></iframe>';

    //var debug = 'css width: ' + $('#fzWidgetPreview').css('width') + '<br/>' +
    //  ' attr width: ' + $('#fzWidgetPreview').attr('width') + '<br/>' +
    //  ' css height: ' + $('#fzWidgetPreview').css('height') + '<br/>' +
    //  ' attr height: ' + $('#fzWidgetPreview').attr('height');
    //$('#debug').html(debug);
    
    var cssPath = (r_lang == 'us') ? '/css' : '/en/v2/css';
    var imgPath = (r_lang == 'us') ? '/img2' : '/en/v2/img2';

    var previewHTML =
      '<?xml version="1.0" encoding="' + v_charset + '"?>' +
      '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' +
      '<html xmlns="http://www.w3.org/1999/xhtml">' +
      '<head>' +
      '<title>Feedzilla Widget Preview</title>' +
      '<meta http-equiv="Content-Type" content="text/html; charset=' + v_charset + '" />' +
      '<link rel="shortcut icon" href="' + imgPath + '/feedzilla.ico" />' +
      '<link type="text/css" href="' + cssPath + '/style.css" rel="stylesheet" />' +
      '</head>' +
      '<body>' +
      '<div class="previewTitle">' + $('#dict_previewTitle').text() + '</div>' +
      '<div class="logo"> <img src="' + imgPath + '/logo.png" alt="' + $('#dict_altLogo').text() + '" /></div>' +
      '<div class="previewCloseLink"><a href="#" onClick="window.close()">' + $('#dict_linkPreviewClose').text() + '</a></div>' +
      '<div class="previewWidgetSeparator"></div>' +
      '<div class="previewWidgetWrapper" ' + previewWrapperStyle + '>' + fzWidgetCopy + '</div>' +
      '</body>' +
      '</html>';

    previewWindow.document.write(previewHTML);
    previewWindow.document.close();
    previewWindow.focus();
  }
/* This is another version of the populateWidgetPopOutExt function which is more elegant, but does not work for IE
  var populateWidgetPopOutExt = function(previewWindow) {

    var previewHTML =
      '<?xml version="1.0" encoding="iso-8859-1"?>' +
      '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' +
      '<html xmlns="http://www.w3.org/1999/xhtml">' +
      '<head>' +
      '<title>Feedzilla Widget Preview</title>' +
      '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />' +
      '<link rel="shortcut icon" href="/en/v2/img2/feedzilla.ico" />' +
      '<link type="text/css" href="/en/v2/css/style.css" rel="stylesheet" />' +
      '</head>' +
      '<body>' +
      '<div class="previewTitle">Your Widget Preview</div>' +
      '<div class="logo"> <img src="/en/v2/img2/logo.png" alt="Feedzilla logo" /></div>' +
      '<div class="previewCloseLink"></div>' +
      '<div class="previewWidgetSeparator"></div>' +
      '</body>' +
      '</html>';

    previewWindow.document.write(previewHTML);
    previewWindow.document.close();

    //$('#debug').text($(previewWindow.document).class()); // debug

    $('<a href="#">Close this window</a>')
      .click(function() {previewWindow.close();})
      .appendTo($('.previewCloseLink', previewWindow.document));

    var fzWidgetCopy = $('#fzWidgetPreview').clone();
    fzWidgetCopy.removeAttr('id');

    var wrapper = $('<div class="previewWidgetWrapper"></div>')
      .hide()
      .css('width', $('.fzWidget').css('width'))
      .css('height', $('.fzWidget').css('height'))
      .appendTo($('body', previewWindow.document));

    wrapper.append(fzWidgetCopy);
    wrapper.show();
    previewWindow.focus();
  }
*/
  var showWidgetPopOutExt = function(event) {

    event.preventDefault();
    $(event.target).blur();

    var minWidth = 600;
    var minHeight = 400;
    var minPadding = 200;
    var widgetWidth = parseInt($('.fzWidget').css('width').replace(/px/, ''));
    var widgetHeight = parseInt($('.fzWidget').css('height').replace(/px/, ''));
    var winWidth = minWidth + minPadding;
    var winHeight = minHeight + minPadding;

    if (widgetWidth > minWidth) winWidth = widgetWidth + minPadding;
    if (widgetHeight > minHeight) winHeight = widgetHeight + minPadding;

    //var previewWindow = window.open('', 'fzWidgetPreview', 'height=' + screen.height + ',width=' + screen.width + ',fullscreen');
    var previewWindow = window.open('', 'fzWidgetPreview', 'menubar=no,location=no,height=' + winHeight + ',width=' + winWidth);

    populateWidgetPopOutExt(previewWindow);

    return false;
  }
  
  var initHotKeywords = function() {
    
    var groupSize = 44;    // how many links should be displayed in one slide
    var $linksContainer = $('#hotKeywords > .moreContentWrapper > .moreContent');
    var $links = $linksContainer.find('a');
    var slidesNo =  Math.ceil($links.length / groupSize);
    var slides = new Array(slidesNo);

    // make a container for the slides
    var $slideWrapper = $('<div></div>')
      .addClass('hotKeywordSlideWrapper')
      .insertAfter($linksContainer);

    // make the slides and append to wrapper
    for (var i=0; i<slidesNo; i++) {

      var offset = (i == 0) ? 0 : 10 + (i * 460);

      slides[i] = $('<div></div>')
        .hide()
        .appendTo($slideWrapper);
    }
    
    // append links to slides
    $links.each(function(index, link) {
      var slideNo = (index == 0) ? 0 : Math.ceil(index/groupSize) - 1;
      //$('#debug').append('<br/>Number: ' + slideNo);
      if ($('a', slides[slideNo]).length > 0) slides[slideNo].append(' &bull; ');
      
      slides[slideNo].append($(link));
      //$('#debug').append(index + ': ' + index % groupSize + ' link ' + $(link).text() +'<br/>');
    });

    if (slidesNo > 1) {    // navigation for the slides, so they actually slide
      
      var $nav = $('<div id="hotKeywordsNavigation"></div>')
        .insertAfter($slideWrapper);
        
      $.each(slides, function(index, slide) {  // create navigation links
      
        var slideNo = index + 1;
        $('<a></a>')
          .attr({
            id : 'hotKeywordsNavigationLink' + index,
            href : '#',
            title : slideNo
          })
          .addClass('hotKeywordsNavigationLink')
          .text(slideNo)
          .click(function(event) {
          
            event.preventDefault();
            $(this).blur().addClass('bold');
            
            $.each(slides, function(sIndex, sVal){    // hide other slides
            
              if (sIndex != index) {
                sVal.hide();
                $('#hotKeywordsNavigationLink' + sIndex).removeClass('bold');
              }
            });
            
            slide.fadeIn();
            return false;    // stop event propagation
          })
          .appendTo($nav);
      });
      
      $('#hotKeywordsNavigationLink0').addClass('bold');
    }
/*    
    var backButton = $('<a id="buttonHotKeywordsBack" href="#" title="' + $('#dict_buttonPrevious').text() + '"><img alt="' + $('#dict_buttonPrevious').text() + '" src="/en/v2/img2/back_arrow2.png"/></a>')
      .hide()
      .appendTo($nav)
      .click(function(event){
        event.preventDefault();
        $(this).blur();
        
        $('#buttonHotKeywordsNext').show();
        
        if (slides[0].is(':visible')) {
          return false;    // we are showing the first slide, do nothing
        }
        
        $.each(slides, function(slideIndex, slide) {
          if (slide.is(':visible')) {
            slide.hide();
            slides[slideIndex-1].fadeIn();
          }          
        });
        
        if (slides[0].is(':visible')) $('#buttonHotKeywordsBack').hide();
        return false;
      });

    var nextButton = $('<a id="buttonHotKeywordsNext" href="#" title="' + $('#dict_buttonNext').text() + '"><img alt="' + $('#dict_buttonNext').text() + '" src="/en/v2/img2/next_arrow2.png"/></a>')
      .appendTo($nav)
      .click(function(event){
        event.preventDefault();
        $(this).blur();
        
        backButton.show();
        
        if (slides[slidesNo-1].is(':visible')) {
          return false;    // we are showing the last slide, do nothing
        }
        
        //$('.hotKeywordSlide', $slideWrapper).each(function(slideIndex, slide) {
        $.each(slides, function(slideIndex, slide) {
          if (slide.is(':visible')) {    // current slide
            //$('#debug').append(slideIndex + ': visible');
            slide.hide();
            slides[slideIndex+1].fadeIn();
            
            if (slides[slidesNo-1].is(':visible')) $('#buttonHotKeywordsNext').hide();
            return false;    // exit loop
          }
        });
        return false;
      });
*/
    slides[0].show();
    $('#hotKeywords').unbind('click');
    $('.hotKeywordSlideWrapper').click(showHotKeyword);
    $linksContainer.remove();
  }
 
/* 
  // this function scrolls the hot keywords, but the surrounding container appears to "shiver"
  var initHotKeywords = function() {
    
    var groupSize = 40;    // how many links should be displayed in one slide
    var $linksContainer = $('#hotKeywords > .moreContentWrapper > .moreContent');
    var $links = $linksContainer.find('a');
    var slidesNo =  Math.ceil($links.length / groupSize);
    var slides = new Array(slidesNo);

    // make a container for the slides
    var $slideWrapper = $('<div></div>')
      .addClass('hotKeywordSlideWrapper')
      .insertAfter($linksContainer);

    // make the slides and append to wrapper
    for (var i=0; i<slidesNo; i++) {

      var offset = (i == 0) ? 0 : 10 + (i * 460);

      slides[i] = $('<div></div>')
        .addClass('hotKeywordSlide')
        .css('top', offset + 'px')
        .appendTo($slideWrapper);
    }
    
    // append links to slides
    $links.each(function(index, link) {
      var slideNo = (index == 0) ? 0 : Math.ceil(index/groupSize) - 1;
      //$('#debug').append('<br/>Number: ' + slideNo);
      if (index%groupSize != 0) slides[slideNo].append(' &bull; ');
      
      slides[slideNo].append($(link));
      //$('#debug').append(index + ': ' + index % groupSize + '<br/>');
    });

    // navigation for the slides, so they actually slide
    var $nav = $('<div></div>')
      .insertAfter($slideWrapper);
    
    var backButton = $('<a href="#">Prev</a>')
      .appendTo($nav)
      .click(function(event){
        event.preventDefault();
        $(this).blur();
        
        if (parseInt(slides[0].css('top').replace(/px/, '')) == 0) {
          return false;    // we are showing the first slide, do nothing
        }
        
        $.each(slides, function(slideIndex, slide) {
          if (slide.css('top') == '-470px') {
            slide.animate({top : '0px'}, {duration: 1000});
          }
          else if (slide.css('top') == '0px') {    // current slide
            slide.animate({top : '470px'}, {duration: 1000});
          }
          else {
            var top = parseInt(slide.css('top').replace(/px/, ''));
            
            var targetTop = top + 460;
            slide.css('top', targetTop + 'px');
          }
        });
        return false;
      });

    var nextButton = $('<a href="#">Next</a>')
      .appendTo($nav)
      .click(function(event){
        event.preventDefault();
        $(this).blur();
        
        if (parseInt(slides[slidesNo-1].css('top').replace(/px/, '')) == 0) {
          return false;    // we are showing the last slide, do nothing
        }
        
        //$('.hotKeywordSlide', $slideWrapper).each(function(slideIndex, slide) {
        $.each(slides, function(slideIndex, slide) {
          if (slide.css('top') == '0px') {    // current slide
            slide.animate({top : '-470px'}, {duration: 500});
          }
          else if (slide.css('top') == '470px') {
            slide.animate({top : '0px'}, {duration: 500});
          }
          else {
            var top = parseInt(slide.css('top').replace(/px/, ''));
            
            var targetTop = top - 460;
            slide.css('top', targetTop + 'px');
          }
        });
        return false;
      });

    $('#hotKeywords').unbind('click');
    $('.hotKeywordSlide').click(showHotKeyword);
    $linksContainer.remove();
  }
*/
  
  var loadWizardKeywords = function(target_cat, target_keywords) {
  
    news_category = target_cat;
    document.getElementById('container').scrollIntoView(true);

    // hide wizard steps 2 & 3 and show step 1
    $('#wizardStep1').fadeIn();
    $('#wizardStep2').fadeOut();
    $('#wizardStep3').fadeOut();

    // select top category
    $('#stepBubble1').fadeOut();
    $('#topic .tick').remove();
    $('#cat option[value="' + news_category + '"]')[0].selected = true;
    news_subcategory = '';

    // open wizard with topcat selected and keywords entered
    news_keywords = target_keywords;              // do this after showing subcats
    showKeywordField(true);                       // only creates the field
    $('#keywordSearchField')
      .trigger('focus')
      .val(news_keywords);  // insert new keywords

    showStep1SubCat('');
    $('#wizardStep1b .tick').remove();
    $('<div></div>')
      .hide()
      .addClass('tick')
      .insertAfter('#keywordSearchButton')
      .fadeIn();
  }
  
  var loadWizardSubCat = function(target_cat, target_subcat) {
    
    news_keywords = '';
    news_category = target_cat;
    news_subcategory = target_subcat;
    $('#keywordSearch').remove();
    document.getElementById('container').scrollIntoView(true);

    // hide wizard steps 2 & 3 and show step 1
    $('#wizardStep1').fadeIn();
    $('#wizardStep2').fadeOut();
    $('#wizardStep3').fadeOut();

    // select top category
    $('#stepBubble1').fadeOut();
    $('#topic .tick').remove();
    
    // see if we can find the top cat in our list
    $('#cat option').each(function(index, option) {
      $option = $(option);
      
      // compare case-insensitive
      if ($option.val().toLowerCase() == news_category.toLowerCase()) {
        news_category = $option.val();    //  choose top cat from our list to ensure we have a valid top cat
        $('#cat option[value="' + news_category + '"]')[0].selected = true;
      }
    });

    // open wizard with topcat selected and subcategory chosen
    showStep1SubCat(news_subcategory);
    $('#wizardStep1b .tick').remove();
    $('#advancedSearch').show();
    $('<div></div>')
      .hide()
      .addClass('tick')
      .insertAfter('#advancedSearch')
      .fadeIn();

    $('#wizardStep1c').fadeIn();
  }

  var showHotKeyword = function(event) {

    if ($(event.target).is('a')) {
      event.preventDefault();
      $(event.target).blur();

      // in JS topCat is stored with spaces
      var target_cat = $(event.target).attr('id').replace(/fzTopCat/, '').replace(/_/g, ' ').toLowerCase();
      
      // see if we find a valid news_category that matches using case-insensitive comparison
      target_cat = $('#cat option').filter(function () { 
        return $(this).val().toLowerCase() == target_cat; 
      }).val();
      
      var target_keywords = $(event.target).text().replace(/"/g, '');
      var updatePreview = false;
      
      if (!target_cat) target_cat = news_category;    // when no category is given, default to current news cat

      //$('#debug').text('cat: ' + news_category + ' new cat: ' + target_cat + ' kws: ' + news_keywords + ' new kws: ' + target_keywords);
      if (target_cat && !( news_category == target_cat && $('#cat2 :selected').val() == '' && news_keywords == target_keywords)) {
        updatePreview = true;
      }

      loadWizardKeywords(target_cat, target_keywords);

      if (updatePreview) updateWidgetPreview();

      return false;    // prevent further event delegation
    }
  }

  var showTopTopic = function(event) {

    if ($(event.target).is('a')) {
      event.preventDefault();
      $target_a = $(event.target);
      $target_a.blur();
      
      var target_cat = $target_a.parent().parent().prev('h3').text();    // top cat of this section
      var target_subcat = $target_a.text();
      var updatePreview = false;

      if ($('#topTopicsLocal').length > 0) {    // find the translation of the top cat
        target_cat = $('#cat > option:contains(' + target_cat + ')').val();
      }

      //$('#debug').html('cat: ' + news_category + '<br/>new cat: ' + target_cat + '<br/>subcat: ' + news_keywords + '<br/>new subcat: ' + target_subcat);
      if (target_cat && !( $('#cat :selected').val().toLowerCase() == target_cat.toLowerCase() && 
         $('#cat2 :selected').val().toLowerCase() == target_subcat.toLowerCase())) {
        updatePreview = true;
      }

      loadWizardSubCat(target_cat, target_subcat);

      if (updatePreview) updateWidgetPreview();

      return false;    // prevent further event delegation
    }
  }

  var loadTopTopicsLocal = function() {
    
    var defaults = ['Top News', 'Entertainment', 'Music', 'Sports', 'World News', 'Celebrities', 
      'Internet', 'Politics', 'Local News', 'Health', 'Blogs', 'Technology', 'IT'];
      
    var numCategories = $('#cat > option[value!=""]').size();
    
    var col1 = $('<div></div>').addClass('moreContentCol').appendTo('#topTopicsLocal .moreContent');
    var col2 = $('<div></div>').addClass('moreContentCol').appendTo('#topTopicsLocal .moreContent');
    var colBoundary = 1;
    var initialSpaces = 5;
    var maxSpaces = 5;
    var matchedCats = [];
    
    if (numCategories == 0) {
      return false;    // this should never happen
    }
    
    if (numCategories < 10) {    // use all categories
      
      if (numCategories > 1) colBoundary = Math.floor(numCategories/2);
      
      initialSpaces = Math.floor(25 / colBoundary);
      maxSpaces = initialSpaces;
      
      $.each($('#cat > option[value!=""]'), function(i, v) {
        matchedCats.push($(v).val());
      });
    }
    else {    // use as many defaults as possible, then remaining ones
      colBoundary = 5;
      numCategories = 10;
      
      $.each(defaults, function(index, value) {    // match all default cats first

        if ( $('#cat > option[value="' + value + '"]').length > 0 ) {
          matchedCats.push(value);
          if (matchedCats.length > 9) return false;    // exit each loop
        }
      });
      
      $('#cat > option').each(function(i, v){    // fill up matches with remaining cats
        
        if (matchedCats.length > 9) return false;    // exit each loop
        var matchedCat = $(v).val();

        if ( matchedCat && $.inArray(matchedCat, matchedCats) == -1 ) {  // any value not duplicate
          matchedCats.push(matchedCat);
        }
      });
    }
    
    // generate the headings and lists with links
    $.each(matchedCats, function(i, v){
      
      var $v = $('#cat > option[value="' + v + '"]');
    
      // get subcats
      var file = subcategoriesFile + 'list_media_' + v.replace(/\s/g, '_').toLowerCase() + '.xml';
      
      $.get(file, function(data) {
        
        var $ul = processSubCatsForTopTopicsLocal(data, maxSpaces);

        // adjust number of spaces based on the size of the previous list
        if ((i == (colBoundary-1)) && (numCategories > colBoundary)) {
          initialSpaces = Math.floor(25 / (numCategories - colBoundary));
          maxSpaces = initialSpaces;
        }
        else maxSpaces = initialSpaces + maxSpaces - $ul.children().size();

        if (i < colBoundary) {
          $('<h3></h3>')
            .text($v.text())
            .appendTo(col1)
            .after($ul);
        }
        else {
          $('<h3></h3>')
            .text($v.text())
            .appendTo(col2)
            .after($ul);
        }
      }, 'xml');
    });

    $('#topTopicsLocal').click(showTopTopic);
  }
  
  var hideCatBubble = function(event) {

    event.preventDefault();
    $('#stepBubble1').fadeOut();
    //$('#cat').attr('size', $('#cat').attr('length')).css('height', '100%');  // looks ugly and distorts
  }
  
  var removeLanguageChooser = function() {
    
    clearTimeout(timeOutLanguageChooser);
    $('#countrySelector').fadeOut('fast', function() { $(this).remove(); });
  }

  var showLanguageChooser = function(event) {

    var excludeCountry = r_lang;    // exclude current country from options

    $('#languageChooser').blur();

    if ($('#countrySelector').is(":visible")) {
      
      if ($(event.target).is('#languageChooser')) {
        event.preventDefault();
        $('#countrySelector').fadeOut('fast', function() { $(this).remove(); });
      }
    }
    else {
      event.preventDefault();

      // each flag needs 36 px (22 px width + 1 px border + 1 px padding + 5 px margin)
      // then 10 px outside for the left and right margins
      // and 15 px for the close button
      var selectorWidth = 36 * (fzCountries.length - 1) + 25;
      
      var selectorDiv = $('<div id="countrySelector"></div>')
        .hide()
        .css('width', selectorWidth + 'px')
        .appendTo('#languageChooser');
      var flags = $('<ul id="countryList"></ul>').appendTo(selectorDiv);

      $.each(fzCountries, function(index, value) {
          
          if (fzCountryURLs[index] != excludeCountry) {
            var flagSuffix = fzCountryURLs[index];
            var subDomain = (fzCountryURLs[index] == 'us') ? 'www' : fzCountryURLs[index];
            var countryParams = (fzCountryURLs[index] == 'us') ? '/?ct=us' : '';
            
            var title = (value.length < 4) ? value.toUpperCase() : value.substring(0,1).toUpperCase() + value.substring(1);
            flags.append('<li><a id="country_' + value + 
              '" href="http://' + subDomain + '.feedzilla.com' + countryParams + '" title="' + title + 
              '"><img class="flag" src="/en/v2/img2/flag_' + flagSuffix + '.png" alt="' + value + '"></a></li>');
          }
        }
      );

      var closeItem = $('<li></li>')
        .appendTo(flags);

      var close = $('<a id="country_close" href="#" title="' + $('#dict_linkClose').text() + '"></a>')
        .append('<img src="/en/v2/img2/close_countries_button.png" alt="' + $('#dict_linkClose').text() + '">')
        .appendTo(closeItem)
        .click(function(event) { $('#countrySelector').fadeOut('fast', function() { $(this).remove(); }); });

      selectorDiv
        .append(flags)
        .fadeIn()
        .mouseover(function() { clearTimeout(timeOutLanguageChooser); });
    }
  }
  
  /*
    Checks if there are any loading params set and updates the wizard and preview 
    with category and subcategory or keywords, the latter take priority in case both
    are set.
  */
  var loadWizardParams = function() {
  
    var targetCat = $('#fz_v_cat').text();
    var targetSubCat = $('#fz_v_cat2').text();
    var targetKeywords = $('#fz_v_kw').text();
    var targetC = $('#fz_c').text();
    var targetKwd = $('#fz_kwd').text();
    
    if (targetC) {
      c = targetC;
      
      if (targetKwd) kwd = targetKwd;
    }

    if (targetCat) {

      if (targetKeywords) {               // set keywords
        loadWizardKeywords(targetCat, targetKeywords);
      }
      else {                              // set subcategory
        loadWizardSubCat(targetCat, targetSubCat);
      }
      //$('#debug').text(news_category + ': ' + news_subcategory + ' given cat: ' + targetCat + ' subcat: ' + targetSubCat);
      updateWidgetPreview();
    }
  }

  // perform initial setup
  $('.tick').remove();
  $('#wizardStep1b').addClass('hidden');
  $('#wizardStep1c').addClass('hidden');
  $('#wizardStep2b1').addClass('hidden');
  $('#wizardStep2b').addClass('hidden');
  $('#wizardStep2').addClass('hidden');
  $('#wizardStep3bContent').addClass('hidden');
  $('#wizardStep3').addClass('hidden');
  generateStyleId();
  loadStart();
  initPreviewStyles();
  $('#popularThemes .moreContent').html('');    // clear moreContent

  if ($('#wizard').is(':visible')) {    // only for the main page, not the news page
    initPopularThemes();
    $('#popularThemes').click(showThemeFinish);
  }
  
  // read hot keywords and split into slides
  if ($('#hotKeywords').length > 0) initHotKeywords();
  
  if ($('#tagCloud').length > 0) $('#tagCloud').click(showHotKeyword);
  if ($('#tagCloudMain').length > 0) $('#tagCloudMain').click(showHotKeyword);
  if ($('#helpRelatedVideos').length > 0) $('#helpRelatedVideos').click(showRelatedVideosHelp);
  if ($('#topTopics').length > 0) $('#topTopics').click(showTopTopic);

  // define event handlers
  $('#cat').change(showStep1Start);
  $('#cat2').change(showStep1Finish);
  $('#finishStep1').click(showStep2Start);
  $('.step1Edit').click(step1Edit);
  $('#step2Edit').click(step2Edit);
  $('#widgetStyles').click(showStyleFinish);
  $('#ownStyle, #customStyleClose').click(showCustomStyle);
  $('#helpSizingCommonSizes .commonSizes').click(applyCommonSize);
  $('#presetSize').change(applyPresetSize);
  $('#sizesClose').click(hideSizes);
  $('#sizes, #helpSizing').click(showSize);
  $('#finishStep2').click(showStep3Start);
  $('#installBlog').click(showStep3Finish);
  $('#installSocial').click(showStep3Finish);
  $('#installWeb').click(showStep3Finish);
  $('#widgetCodeCopyBtn').click(copyWidgetCode);
  $('#customStyleAdvancedOptions').click(showCustomStyleAdvancedOptions);
  $('#customStyleBasicOptions').click(showCustomStyleBasicOptions);
  $('#show_summary').change(toggleSummaries);                   // doesn't get fired in IE
  $('#show_summary_source').change(toggleMediaSourceColor);     // doesn't get fired in IE
  $('#show_summary_date').change(toggleDateColor);              // doesn't get fired in IE
  $('#customStyleContent').change(applyCustomStyleChange);      // doesn't get fired in IE
  $('.colorField input').keyup(updateBorderColor);
  $('#advancedSearch').click(showKeywordSearch);
  $('#customSizeUpdateButton').click(applyCustomSize).hover(
    function() { $(this).addClass('hoverClickable'); },
    function() { $(this).removeClass('hoverClickable'); }
  );
  $('#emailThemeLink, #emailThemeLinkPicture').click(showEmailThemeForm);
  $('.customStyleUpdateButton').click(customStyleUpdateButtonAction);
  $('#widgetPopOut').click(showWidgetPopOutExt);
  //$('#hotKeywords').click(showHotKeyword);
  $('input:radio').hover(
    function() { $(this).addClass('hoverClickable'); },
    function() { $(this).removeClass('hoverClickable'); }
  );
  $('#catBubbleLink').click(hideCatBubble);
  $('#cat2BubbleLink').click(showStep2Start);
  $('#step3BubbleLink').click(showStep3Start);
  $('#languageChooser').click(showLanguageChooser)
    .hover(
      function() {
        clearTimeout(timeOutLanguageChooser);
        if ($('#countrySelector').length == 0) $(this).trigger('click');
      },
      function() { timeOutLanguageChooser = setTimeout(removeLanguageChooser, 2000); });

  // IE8 and below don't support bubbling of change events
  if ($.browser.msie) {
    $('#show_summary').click(toggleSummaries);
    $('#show_summary_source').click(toggleMediaSourceColor);
    $('#show_summary_date').click(toggleDateColor);
    $('#customStyleContent').click(applyCustomStyleChange);
    $('#customStyleContent input:text').blur(applyCustomStyleChange);
  }

  $('#borderColorCube, #borderColorCurrent').ColorPicker({
    color: '#ffffff',
    onShow: function (colpkr) {
        $('#borderColorCurrent').ColorPickerSetColor($('#color_border').val());
        $(colpkr).fadeIn("slow");
        return false;
    },
    onHide: function (colpkr) {
        $(colpkr).fadeOut("slow");
        $('#borderColorCube').ColorPickerSetColor($('#color_border').val());
        $('#borderColorCurrent').css('background', '#' + $('#color_border').val());
        return false;
    },
    onChange: function (hsb, hex, rgb) {
        $('#borderColorCurrent').css('background', '#' + hex);

    },
    onSubmit: function(hsb, hex, rgb, el) {
      $(el).ColorPickerHide();
      $('#color_border').val(hex);
      $('#color_border').trigger('change');
    }
  });

  $('#bgColorCube, #bgColorCurrent').ColorPicker({
    color: '#ffffff',
    onShow: function (colpkr) {
        $('#bgColorCurrent').ColorPickerSetColor($('#color_background').val());
        $(colpkr).fadeIn("slow");
        return false;
    },
    onHide: function (colpkr) {
        $(colpkr).fadeOut("slow");
        $('#bgColorCube').ColorPickerSetColor($('#color_background').val());
        $('#bgColorCurrent').css('background', '#' + $('#color_background').val());
        return false;
    },
    onChange: function (hsb, hex, rgb) {
        $('#bgColorCurrent').css('background', '#' + hex);
    },
    onSubmit: function(hsb, hex, rgb, el) {
      $(el).ColorPickerHide();
      $('#color_background').val(hex);
      $('#color_background').trigger('change');
    }
  });

  $('#headerFontColorCube, #headerFontColorCurrent').ColorPicker({
    color: '#ffffff',
    onShow: function (colpkr) {
        $('#headerFontColorCurrent').ColorPickerSetColor($('#color_font_headers').val());
        $(colpkr).fadeIn("slow");
        return false;
    },
    onHide: function (colpkr) {
        $(colpkr).fadeOut("slow");
        $('#headerFontColorCube').ColorPickerSetColor($('#color_font_headers').val());
        $('#headerFontColorCurrent').css('background', '#' + $('#color_font_headers').val());
        return false;
    },
    onChange: function (hsb, hex, rgb) {
        $('#headerFontColorCurrent').css('background', '#' + hex);
    },
    onSubmit: function(hsb, hex, rgb, el) {
      $(el).ColorPickerHide();
      $('#color_font_headers').val(hex);
      $('#color_font_headers').trigger('change');
    }
  });

  $('#titleFontColorCube, #titleFontColorCurrent').ColorPicker({
    color: '#ffffff',
    onShow: function (colpkr) {
        $('#titleFontColorCurrent').ColorPickerSetColor($('#color_font_title').val());
        $(colpkr).fadeIn("slow");
        return false;
    },
    onHide: function (colpkr) {
        $(colpkr).fadeOut("slow");
        $('#titleFontColorCube').ColorPickerSetColor($('#color_font_title').val());
        $('#titleFontColorCurrent').css('background', '#' + $('#color_font_title').val());
        return false;
    },
    onChange: function (hsb, hex, rgb) {
        $('#titleFontColorCurrent').css('background', '#' + hex);
    },
    onSubmit: function(hsb, hex, rgb, el) {
      $(el).ColorPickerHide();
      $('#color_font_title').val(hex);
      $('#color_font_title').trigger('change');
    }
  });

  $('#summaryFontColorCube, #summaryFontColorCurrent').ColorPicker({
    color: '#ffffff',
    onShow: function (colpkr) {
        $('#summaryFontColorCube').ColorPickerSetColor($('#summaryFontColorCurrent').val());
        $(colpkr).fadeIn("slow");
        return false;
    },
    onHide: function (colpkr) {
        $(colpkr).fadeOut("slow");
        $('#summaryFontColorCube').ColorPickerSetColor($('#color_font').val());
        $('#summaryFontColorCurrent').css('background', '#' + $('#color_font').val());
        return false;
    },
    onChange: function (hsb, hex, rgb) {
        $('#summaryFontColorCurrent').css('background', '#' + hex);
    },
    onSubmit: function(hsb, hex, rgb, el) {
      $(el).ColorPickerHide();
      $('#color_font').val(hex);
      $('#color_font').trigger('change');
    }
  });

  $('#summarySourceFontColorCube, #summarySourceFontColorCurrent').ColorPicker({
    color: '#ffffff',
    onShow: function (colpkr) {
        $('#summarySourceFontColorCurrent').ColorPickerSetColor($('#color_media_source').val());
        $(colpkr).fadeIn("slow");
        return false;
    },
    onHide: function (colpkr) {
        $(colpkr).fadeOut("slow");
        $('#summarySourceFontColorCube').ColorPickerSetColor($('#color_media_source').val());
        $('#summarySourceFontColorCurrent').css('background', '#' + $('#color_media_source').val());
        return false;
    },
    onChange: function (hsb, hex, rgb) {
        $('#summarySourceFontColorCurrent').css('background', '#' + hex);
    },
    onSubmit: function(hsb, hex, rgb, el) {
      $(el).ColorPickerHide();
      $('#color_media_source').val(hex);
      $('#color_media_source').trigger('change');
    }
  });

  $('#summaryDateFontColorCube, #summaryDateFontColorCurrent').ColorPicker({
    color: '#ffffff',
    onShow: function (colpkr) {
        $('#summaryDateFontColorCurrent').ColorPickerSetColor($('#color_date').val());
        $(colpkr).fadeIn("slow");
        return false;
    },
    onHide: function (colpkr) {
        $(colpkr).fadeOut("slow");
        $('#summaryDateFontColorCube').ColorPickerSetColor($('#color_date').val());
        $('#summaryDateFontColorCurrent').css('background', '#' + $('#color_date').val());
        return false;
    },
    onChange: function (hsb, hex, rgb) {
        $('#summaryDateFontColorCurrent').css('background', '#' + hex);
    },
    onSubmit: function(hsb, hex, rgb, el) {
      $(el).ColorPickerHide();
      $('#color_date').val(hex);
      $('#color_date').trigger('change');
    }
  });
  
  $('#relatedLinksFontColorCube, #relatedLinksFontColorCurrent').ColorPicker({
    color: '#ffffff',
    onShow: function (colpkr) {
        $('#relatedLinksFontColorCurrent').ColorPickerSetColor($('#related_color').val());
        $(colpkr).fadeIn("slow");
        return false;
    },
    onHide: function (colpkr) {
        $(colpkr).fadeOut("slow");
        $('#relatedLinksFontColorCube').ColorPickerSetColor($('#related_color').val());
        $('#relatedLinksFontColorCurrent').css('background', '#' + $('#related_color').val());
        return false;
    },
    onChange: function (hsb, hex, rgb) {
        $('#relatedLinksFontColorCurrent').css('background', '#' + hex);

    },
    onSubmit: function(hsb, hex, rgb, el) {
      $(el).ColorPickerHide();
      $('#related_color').val(hex);
      $('#related_color').trigger('change');
    }
  });

  // it would be much nicer like this...
  /*
  $('#bgColorCube, #borderColorCube').ColorPicker({
    color: '#ffffff',
    onShow: function (colpkr) {
        $(colpkr).fadeIn("slow");
        return false;
    },
    onHide: function (colpkr) {
        $(colpkr).fadeOut("slow");
        return false;
    },
    onChange: function (hsb, hex, rgb, el) {
        $(el).siblings('.colorCurrent').css('background', '#' + hex);
        $(el).siblings('.colorField input').val(hex);
    },
    onSubmit: function(hsb, hex, rgb, el) {
      $(el).ColorPickerHide();
    }
  });
  */

  $(window).scroll(function(){

    lastScroll = new Date();    // update the last scroll time
    clearTimeout(t);            // remove scheduled task
    t = setTimeout(moveWizard, 500);

  });
});