/// <reference path="jquery-1.3.2-vsdoc.js"/>
/// <reference path="google.maps-vsdoc.js" />

Trop = {

  start: function() {
    $('html').addClass('js');
    $("#custom-message-box").fadeOut(7000);
    this.fixIe6();
    this.manageLongStrings();
    this.enhanceDiscussion();
    // this.addMultiUploader();
    this.enhanceForms();
    this.enhanceCalendars();
    this.createTabBehavior();
    this.registerAsyncForms();
    this.registerFormsLinks();
    this.registerModals();
    this.registerEvents();
    this.activateTooltips();
  },

  activateTooltips: function() {
    $('.tooltip').tipTip({ delay: 200 });
  },

  registerFormsLinks: function() {
    $('a.submit-form').live('click', function() {
      var href = $(this).attr('href');
      var form = $(href.substring(href.indexOf('#')));
      form.submit();
      return false;
    });
  },

  enhanceCalendars: function() {
    $('.calendar').append('<span class="ro"/><span class="lo"/>');
  },

  limitText: function(limitField, limitNum, showDots) {
    var text = limitField.value;
    if (text.length > limitNum) {
      limitField.value = text.substring(0, limitNum) + (showDots ? "&hellip;" : "");
    }
  },

  manageLongStrings: function() {
    // Opera 9.51 and below is not going to respect <wbr/> 
    // without Generated Content. Add this to CSS:
    // `.opera wbr::after { content: "\00200B" }`
    if (window.opera && window.opera.version) {
      if (window.opera.version() <= 9.51) {
        $('html').addClass('opera');
      }
    };

    function wrapBreak(text, delimit) {

      var style = parseInt(delimit / 2);
      var words = text.split(' ');
      var br = '<wbr/>'
      var newWords = [];
      for (var i = 0; i < words.length; i++) {
        var word = words[i];
        var length = word.length;
        var times = parseInt(length / delimit);
        var rest = length % delimit;
        var bitsArray = [];
        var lastBit = '';
        for (var j = 1; j < times + 1; j++) {
          var start = (j - 1) * delimit;
          var end = j * delimit;
          var pass = word.substring(start, end);
          if ((j == times) && (rest > 0)) {
            if (rest <= style) {
              pass += word.substring(end, length);
            } else {
              lastBit = word.substring(end, length)
            }
          }
          bitsArray.push(pass);
          if (lastBit) {
            bitsArray.push(lastBit)
          }
        }
        if (times == 0) {
          newWords.push(word)
        } else {
          var newWord = bitsArray.join(br);
          newWords.push(newWord)
        }
      };
      var newText = newWords.join(' ');
      return newText;

    };

    function delimitElements(selector, delimit) {

      $(selector).each(function() {
        var text = this.firstChild;
        if (text) {
          $(this).html(wrapBreak(text.nodeValue, delimit));
        }
      });

    };

    var elements = [
      ['#featured h2', 3]
    ];

    for (var i = 0; i < elements.length; i++) {
      delimitElements(elements[i][0], elements[i][1]);
    };

  },

  enhanceDiscussion: function() {
    $('.discussion').each(function() {
      var $form = $(this).find('form');
      var $extra = $form.find('.extra');
      var $extra_ul = $extra.find('ul');

      // EXTRA
      var $more_toggle = $('<a class="toggle" href="">' + localization.MoreRatings + '</a>');
      $more_toggle.bind('click', function(e) {
        var $self = $(this);
        if ($(this).is('.hide')) {
          $extra_ul.slideUp('normal', function() {
            $self.removeClass('hide').text(localization.MoreRatings);
          });
        } else {
          $extra_ul.slideDown('normal', function() {
            $self.addClass('hide').text(localization.Hide);
          });
        }
        e.preventDefault();
      });
      $extra_ul.hide();
      $extra.append($more_toggle);

      // TAGS
      var $tags_container = $form.find('.suggested-tags');
      var $tags_input = $tags_container.parent().find('input[type="text"]');
      var $tags = $tags_container.find('a');
      $tags.bind('click', function(e) {
        $tags_input.val($tags_input.val() + ' ' + $(this).text()); // todo: trim
        e.preventDefault();
      });

      // RATINGS
      if (!(jQuery.browser.name == 'msie' && jQuery.browser.versionNumber <= 6)) {
        Trop.createRatings($form.find('select'));
      }

    });
  },

  createRatings: function($selects) {
    $selects.each(function() {
      var $select = $(this);
      var currentRating = $select.val() * 20;
      var $rate_container = $('<div class="rating rating-vote"/>');
      var $rate_value = $('<div class="value" style="width: ' + currentRating + '%">Rate:</div>');
      $rate_container.append($rate_value);
      for (var i = 1; i < 6; i++) {
        var title = $('option[value="' + i + '"]', $select).attr('title');
        var $rate_link = $('<a href="#" class="tooltip" title="' + title + '">' + i + '</a>');
        $rate_container.append($rate_link);
      };
      $rate_container.bind('click', function(e) {
        var target = e.target;
        if ($(target).is('a')) {
          var rating = $(e.target).text();
          $(this).find('.value').css('width', rating * 20 + '%');
          $select[0].selectedIndex = (rating - 1);
        }
        e.preventDefault();
      });
      $select.hide().after($rate_container);
    });
  },

  createTabBehavior: function() {
    var active;
    var tabHashes = [];
    var activeHash = window.location.hash.substring(1);

    function activateTab(name) {
      $('#content-boxes').attr({
        'class': 'section-content loaded ' + name
      });
    }

    $('.section-navigation').find('a').each(function(i, link) {
      tabHashes.push(link.href.substring(link.href.indexOf('#') + 1));
    });

    var isLinkToTab = jQuery.inArray(activeHash, tabHashes) > -1;

    $('.section-navigation').find('a').each(function(i, link) {
      link = $(link);
      var href = link.attr('href');

      if (href.indexOf('#') == 0) {
        var hash = href.substring(1);
        if (activeHash == hash) {
          active = link.parent();
          active.addClass('selected');
          activateTab(hash);
        }
        if (!isLinkToTab && i == 0) {
          active = link.parent();
          active.addClass('selected');
          activateTab(hash);
        }
        link.click(function(sender) {
          activateTab(sender.target.hash.substring(1));
          if (active) active.toggleClass('selected');
          active = $(sender.target).parent().toggleClass('selected');
          return false;
        });
      }
      else {
        if (window.location.pathname == href) {
          active = link.parent();
          active.addClass('selected');
        }
      }
    });
  },

  addMultiUploader: function() {
    $('fieldset.multi-upload').each(function(i) {
      var $this = $(this);
      var $files = $this.children('div').not('.submit');
      var name = $files.find('input[type="file"]').attr('id').replace('[0]', '');
      var $add = $('<div class="block"><a href="">' + localization.AddAnother + '</a></div>');
      $files.after($add);

      function makeNewField() {
        var $container = $('<div class="block"/>');
        var $input = $('<input type="file"/>');
        var $remove = $('<a class="cancel" href="">' + localization.Remove + '</a>');
        $remove.bind('click', function(e) {
          $container.remove();
          rebuildIndex();
          e.preventDefault();
        });
        $container.append($input, $remove);
        return $container;
      };

      function rebuildIndex() {
        $this.find('input[type="file"]').each(function(i) {
          this.id = this.name = name + '[' + i + ']';
        });
      };

      $files.next().find('a').bind('click', function(e) {
        var $field = makeNewField();
        $add.before($field);
        rebuildIndex();
        e.preventDefault();
      });
    });
  },

  enhanceForms: function() {
    $('form span.message').each(function() {
      $(this).
        wrapInner('<span class="message-inner"></span>').
        append('<span class="message-end"/>');
    });
  },

  createCalendars: function(options) {
    jQuery.getScript('/scripts/jquery-ui-1.7.2.custom.min.js', function() {
      $('.calendar').datepicker(options);
    });
  },

  registerAsyncForms: function() {
    if ($('form.async').length == 0) return;
    jQuery.getScript('/scripts/jquery.form.js', function() {
      $('form.async').ajaxForm({
        success: function() { if (jQuery.modal) jQuery.modal.close(); }
      });
    });
  },

  registerModals: function() {
    if ($('.ico1-message, .ico1-add-social, .invite-friend, .upload-image, .show-popup').length == 0) return;
    jQuery.getScript('/scripts/jquery.simplemodal-1.3.min.js', function() {
      $('.ico1-message').click(function() { $('#send-to-friend').modal(); return false; });
      $('.ico1-add-social').click(function() { $('#social').modal(); return false; });
      $('.invite-friend').click(function() { $('#invite').modal(); $('#signin-email').focus(); return false; });
      $('.upload-image').click(function() { $('#upload-image').modal(); return false; });
      $('.show-popup').click(function() { $(this.href.substr(this.href.indexOf('#'))).modal(); return false; });
    });
  },

  registerEvents: function() {
    var limitHandler = function(e) { Trop.limitText(e.target, 75) };
    $('#account-info-about').
      keydown(limitHandler).
      keyup(limitHandler);

    $('#get-my-location').click(function() {
      jQuery.getJSON('/Users/GetLocation', function(response) {
        $('#account-info-place').attr('value', response.country || '');
        $('#account-info-city').attr('value', response.city || '');
        $('#account-info-zip').attr('value', response.zip || '');
      });
    });
  },

  fixIe6: function() {
    jQuery.getScript('/scripts/jquery.browser.min.js', function() {
      if (window.msie && window.msie.version() <= 6) {
        $('input[type="text"]').addClass("text");
        $('input[type="password"]').addClass("text");
      }
    });
  }
}

$(document).ready(function() {
  Trop.start();
})
