document.write('<style type="text/css">' +
  '.js_inline {display: inline} .js_block {display: block}' +
  '.js_inline_hide, .js_block_hide, #flash, .tip {display: none }' +
  '.rewarded .reward { overflow: hidden }' +
  '</style>');


var TweetBrain = {
  
  loadingHTML: '<div class="loading">Loading...</div>',
  loading: function(container) {
    if ($(container).find(".loading")[0]) return true;
    $(container).append('&nbsp;<span class="loading" style="font-size: 16px">&nbsp;&nbsp;&nbsp;</span>');
    return false;
  },
  hadjust: function() { // adjust content/sidebar widths 
    var $toolbox = $('#toolbox'), $main = $("#main");
    var tbHeight = $toolbox.height();

    var adsHeight = 250;
    var margin = 10;
    var minHeight = tbHeight + adsHeight + margin;
    if ($main.height() < tbHeight) $main.css({ minHeight: minHeight + "px"});
    $('#ads').css('top', tbHeight + margin + 'px');
  },
  
  init: function() {
    this.base = $('script[src]:first')[0].src.replace(/\/res\/[^\/]*/, '');
    this.isPublic = $(document.body).hasClass("public")
    
    this.hadjust();
    this.initIEHacks();
    this.initForms();
    this.initPagination();
   
     
    $flash = $("#flash");
    if ($flash.length) {
      $flash.hide();
      window.setTimeout(function() { $flash.show("slow"); }, 0);
      // window.setTimeout(function() { $flash.hide("slow"); }, 3000);
    }
    $('.focused').focus();
    
    $(".tip").hide().addClass("baloon").each(function() {
      var $tip = $(this);
      var $ref = $("#" + this.id.replace(/-tip$/, ''));
      $ref.bind("focus mouseenter", function() {
        if ($tip == TweetBrain._currentTip) return;
        TweetBrain._currentTip = $tip;
        $(".tip").hide();
        
        var pos = $ref.position();
        $ref.css({"borderColor": "red"});
        $tip.css({top: (pos.top + $ref.height() + 4) + "px", left: pos.left + "px"}).show("slow");
        setTimeout(function() { $tip[0].style.display = ""; }, 10); // IE hack
      }).bind("blur mouseout", function() {
        if (TweetBrain._currentTip == $tip) {
          TweetBrain._currentTip = null;
          $tip.hide("slow");
          $ref.css({"borderColor": ""});
        }
      });
    });
    
    $('.users').find('li.u').click(function() {
      location.href = $(this).find('a:first')[0].href;
    });
    
    $('a.login').click(function(ev) { $(this).slideUp("slow"); TweetBrain.checkLogin(null, ev); });
    $('#main_menu a[href*=welcome]').click(function(ev) { TweetBrain.checkLogin(null, ev); });
    $('#follow-button').click(function(ev) {
      if (!this._processing) {
        this._processing = true;
        $.get(this.href);
        $(this).fadeOut("slow");
      }
      ev.preventDefault();
      return false;
    });
    
    this.initList();
    
    this.initHotlists();
    
    this.initTopics();
  },
  
  initTopics: function(parent) {
    if (!parent) parent = document.body;
    $(parent).find(".subtopic-list:not(.ajax)").addClass('ajax').find('a.topic').click(function(ev) {
      var a = this;
      if (!a._processing) {
        var $li = $(a.parentNode);
        if ($li.hasClass("open")) {
          $li.removeClass("open").addClass("closed").find(".topics").remove();
        } else {
          a._processing = true;
          var $div = $li.removeClass("closed").addClass("open").find(".topics");
          if (!$div.length) $div = $(a.parentNode.appendChild(document.createElement("div")));
          $div.addClass('loading topics').text("Loading...");
          var params = { 'short' : $li.hasClass('short') ? 1 : 0 };
          $.get(this.href, params, function(data) {
            a._processing = false;
            $div.removeClass('loading').replaceWith(data);
            TweetBrain.initTopics(a.parentNode);
          });
        }
      }
      ev.preventDefault();
      return false;
    });
  },
  
  initList: function() {
    
    $("a.ext").removeClass("ext").click(function(ev) { open(this.href, "_blank"); ev.preventDefault(); return false; });
    
    $(".abreport:not(.ajax)").addClass('ajax').click(function(ev) {
      if (!this._processing) {
        $.get(this.href, null);
        this._processing = true;
        $(this).parent('span').fadeOut("slow");
      }
      ev.preventDefault();
      return false;
    });
    
    $(".ban:not(.ajax), .unban:not(.ajax)").addClass('ajax').click(function(ev) {
      var handler = arguments.callee;
      var $container = $(this).parent('span');
      if (!this.loading($container)) {
        var a = this;
        var $ui = $container.parent();
        $.get(this.href, null, function(data) {
          $container.replaceWith(data);
          $ui.find(".ban:not(.ajax), .unban:not(.ajax)").click(handler);
        });
      }
      ev.preventDefault();
      return false;
    });
    
    $(".rewarded .reward").each(function() {
      if (this._adjusted) return;
      this._adjusted = true;
      $r = $(this);
      var ls = -1;
      var w = $r.parent().innerWidth();
      while(this.scrollWidth > w || ls < -4) {
        $r.css('letter-spacing', (--ls) + "px");
      }
    });

    $('.favorite:not(.ajax)').addClass('ajax').click(
      function(ev) {
        var $f = $(this);
        if (!TweetBrain.checkLogin(this, ev, 'toggle favorites')) return false;
        
        var current = $f.hasClass('no') ? 'no' : $f.hasClass('yes') ? 'yes' : '';
        if (current) {
          $f.removeClass("yes no").addClass("loading");
          $.get(this.href, null, function(data) {
            $f.removeClass("loading").addClass(/^(?:yes|no)$/.test(data) ? data : current)
          });
        }
        
        ev.preventDefault();
        return false;
      });
    
    if (this.isPublic) {
      $('div.vote:not(.ajax)').addClass('ajax').click(function(ev) { return TweetBrain.checkLogin(null, ev, 'vote'); });
      $('#answers-list .qb:not(.ajax)').addClass('ajax').click(function(ev) { return TweetBrain.checkLogin(null, ev, 'answer'); });
    }
    $('a.vote:not(.ajax)').addClass('ajax').click(function(ev) {
      var a = this;
      
      if (!TweetBrain.checkLogin(a, ev, 'vote')) return false;
      
      var h = arguments.callee;
      var $a = $(a);
      if ($a.hasClass("loading")) return false;
      $a.addClass("loading");
      var p = a.parentNode;
      
      $.get(a.href, null, function(data) {
        $a.removeClass("loading");
        if (/[,\d\s]+/.test(data)) {
          var votes = data.split(/\s*,\s*/);
         
          if (votes.length == 2) {              
            var isUp = $a.hasClass('up');
            var clz = isUp ? ["up", "down"] : ["down", "up"];
            var attrs = ["innerHTML", "href", "className"];
            var rx = new RegExp("\\b" + clz[0] + "\\b");
            var otherA = document.createElement("a"); 
            for (var j = attrs.length; j-- > 0;)
              otherA[attrs[j]] = a[attrs[j]].replace(rx, clz[1]);
            otherA.innerHTML = a.innerHTML.replace(/\d+$/, votes[isUp ? 1 : 0]);
            
            $a.siblings('.' + clz[1]).replaceWith(otherA);
            $a.siblings('.' + clz[1]).click(h);
            
            var div = document.createElement("div");
            div.className = "vote " + clz[0];
            div.innerHTML = $a.html().replace(/\d+$/, votes[isUp ? 0 : 1]);
            $a.replaceWith(div);
            $(p).fadeIn("slow");
          }
        }
        
      });
      ev.preventDefault();
      return false;
    });
    
    $("form.assistant [type=submit]").hide();
    $("form.assistant [name=a]").click(function(ev) {
      var data = {};
      $(this.form).find("input").each(function() {
        if (!(this.type == "checkbox" && !this.checked))
          data[this.name] = this.value;
      });
     // alert(this.checked);
      var chk = this;
      var b = this.checked;
      $.post(this.form.action, data, function(r) {
        chk.checked = b;
      });
      ev.preventDefault();
      ev.cancelBubble = true;
      this.checked = true;
      //alert("here");
      return false;
    });
    
  },
  
  
  initHotlists: function($parent) {
    ($parent || $('#hotlists')).find('ul.select').find('a:not(.ajax)').addClass('ajax').click(this.onHotlistClick);
    $("#time-scope").find('a:not(.ajax)').addClass('ajax').click(function(ev) {
      var ts = this.parentNode;
      if (ts.ajaxLoading) return false;
      ts.ajaxLoading = true;
      $("#hotlists").css("position", "relative")
        .append('<div class="loading" style="position: absolute; top: 0; right: 0; width: 24px; height: 24px">Loading...</div>')
        ;
      $.get(this.href, null, function(data) { $("#hotlists").html(data); TweetBrain.initHotlists(); });
      ev.preventDefault();

      return false;
    });
  },
  _hotlistCache: {},
  onHotlistClick: function() {
    var selector = $(this).closest('ul.select')[0];
    if (selector.ajaxLoading) return false;
    selector.loading = true;
   
    var cat = null;
    var url = TweetBrain.base + '/home/hot/' +
      (/\bhp=/.test(this.href) ? 'people/' : 'questions/') +
      (cat = this.href.replace(/.*[\?&]h[pl]=(\w+).*/, '$1'));
    var onload = function(data) {
        selector.ajaxLoading = false;
        TweetBrain._hotlistCache[url] = data;
        TweetBrain.initHotlists($(selector).parent().html(data));
        document.cookie = (/people/.test(url) ? "hp" : "hl") + "=" + cat;
      };
    if (TweetBrain._hotlistCache[url]) onload(TweetBrain._hotlistCache[url]);   
    else {
      $(selector).nextAll('.hl').html(TweetBrain.loadingHTML);
      $.get(url, null, onload);
    }
    return false;
  },
  
  initIEHacks: function() {
    if ((this.iehacks = !!document.getElementById("iehacks"))) {
      $(".menubox, .round, .qb").addClass("round-ie-hack").wrapInner("<div></div>");
      $('.menubox, .round').children().after('<span class="corners-bottom"><span></span></span>')
        .add(".qb > *").before('<span class="corners-top"><span></span></span>');
      $(".menubox > .corners-top, .menubox > .corners-bottom").each(function() {
        var $c = $(this), $p = $c.parent();
        $p.css({position: "relative", width: $p.width() + "px"});
        $c.css({width: $p.innerWidth() + "px", height: '5px', zIndex: 100, position: "absolute" });
        if ($c.hasClass("corners-top")) $c.css('top', '5px');
        else $c.css('bottom', '5px');
      });
    }
  },
  
  initForms: function() {
    $(".exclusive-cbx input[type=checkbox]").click(function() {
      $(this).parents(".exclusive-cbx").find('input[type=checkbox]:not(#' + this.id + ')').removeAttr("checked");
    });
    
    $('#chars-count').parent().find('textarea').bind('change keyup keypress focus mouseup', function(ev) {
      if (!this._maxlength) this._maxlength = parseInt($("#chars-count").text());
      var overflow = this._maxlength < this.value.length;
      if (overflow) this.value = this.value.substring(0, this._maxlength);
      $("#chars-count").text(this._maxlength - this.value.length);
      return (ev.which < 32 || !overflow);
    });
    
    var formatNumericField;
    $('input.dec, input.int, input.money').keypress(function(ev) {
      var c;
      var cn = this.className;
      return ev.which <= 32 || /\d/.test(c = String.fromCharCode(ev.which))
        || c == '.' && /\b(?:dec|money)\b/.test(cn) && this.value.indexOf('.') < 0
        || c == '-' && /\bneg\b/.test(cn) && this.value.indexOf('-') < 0
        ;
      }).keyup(function(ev) {
        var v = this.value.replace(/[^\-\d\.]/g, '');
        var cn = this.className;
        if (!/\b(?:dec|money)\b/.test(cn)) v = v.replace(/\./g, '');
        if (!/\bneg\b/.test(cn)) v = v.replace(/\-/g, '');
        if (v != this.value) this.value = isNaN(v) ? "" : v;
      }).change(formatNumericField = function() {
        var cn = this.className;
        var v = this.value;
        var v = /\bmoney\b/.test(cn) ? TweetBrain.formatMoney(v)
          : /\bdec\b/.test(cn) ? parseFloat(v) : parseInt(v);
        if (!/\bneg\b/.test(cn)) v = v.toString().replace(/\-/g, '')
        if (v != this.value) this.value = isNaN(v) ? "" : v;
      }).each(function() {
        var maxLength = parseInt($(this).attr("maxlength"));
        if (maxLength) {
          this.length = maxLength;
          this.style.width = maxLength + "em";
        }
        formatNumericField.apply(this);
      });
    
    $("form").each(function() {
      var onsubmit = this.onsubmit;
      this.onsubmit = function() {
        return this._submitted
          ? false
          : this._submitted = !onsubmit || onsubmit.apply(this, arguments);
      }
    });
    
    
   
    
    this.initTopicChoosers();
  },
  
  initTopicChoosers: function(parent) {
    $parent = parent ? $(parent) : $("form");
    $parent.find("select.topics").change(function() {
      var parent = this.parentNode;
      var form = this.form;
      var haveTopic = TweetBrain.haveTopic(form);
      var submit = $(form).find("input[type=submit][name=recat]").show()[0];
      if (submit) {
        submit.disabled = !haveTopic;
      }
      if (!TweetBrain.loading(parent)) {
        var url = TweetBrain.base + "/topics/choose/" + $(parent).find("input[type=hidden]").val() + "/" + $(this).val();
        $.get(url, null, function(data) {
          parent.innerHTML = data;
          TweetBrain.initTopicChoosers(parent);
        });
      }
    });
  },
  
  _pagIds: null,
  initPagination: function() {
    $('div.pagination').each(function() {
      var pag = this;
      var $pag = $(pag);
      var next = $pag.find('strong').next()[0];
      if (next && next.href) {
        pag.innerHTML = '<input type="button" class="button more" value="more">';
        var content = pag.parentNode;
        if (!TweetBrain._pagIds) {
          TweetBrain._pagIds = {};
          TweetBrain._pagLoadCount = 0;
          $(content).find("li.q, li.a, li.u").each(function() { TweetBrain._pagIds[this.id] = true; })
        }
        var url = next.href;
        $pag.css('text-align', 'center').find('.more').click(function() {
          $pag.html(TweetBrain.loadingHTML);
          $.get(url, null, function(data) {
           
            $data = $(data);
            
            $pag.replaceWith($data.find('div.pagination')[0]);
            
            if (TweetBrain.iehacks)
              $data.find('.qb:not(.round-ie-hack)').addClass('round-ie-hack')
                .wrapInner("<div></div>").children().before('<span class="corners-top"><span></span></span>');
            TweetBrain.initPagination();
            
            var $items =  $data.find('ul:first li')
               .filter(function() { return !(TweetBrain._pagIds[this.id] || !(TweetBrain._pagIds[this.id] = true)); });
           
            if ($items.length) {
              TweetBrain._pagLoadCount = 0;
              $items.appendTo($(content).find('ul:first'))
              TweetBrain.initList();
            } else if (TweetBrain._pagLoadCount++ < 4) $(content).find('.more').click();  
          });
        });
      } else pag.innerHTML = "";
    });
  },
  
    
  initAskForm: function(tnor, tr) {
    this.templateNoReward = tnor;
    this.templateReward = tr;
    var eh = TweetBrain.syncPreview;
    $("#q_content, #q_reward").change(eh);
    $("#q_content").mouseup(eh).keyup(eh);
    $("#q_reward").change(function() { $("#credit-error").parent().hide(); });
  },
  
  haveTopic: function(form) {
    var haveTopic = false;
    $(form || "form").find("select.topics").each(function() { if (parseInt($(this).val())) haveTopic = true });
    return haveTopic;
  },
  checkTopic: function(form) {
    if (!TweetBrain.haveTopic(form)) {
      alert("Please select one topic!");
      return false;
    }
    return true;
  },
  
  checkAskForm: function(form) {
    if (!TweetBrain.checkTopic(form)) return false;
    var reward = $("#q_reward").val();
    var amount = parseFloat(reward);
    if (!amount) return true;
    if (amount < 1) {
      alert("Reward, if specified, must be $1.00 minimum!");
      return false;
    }
    return confirm("Are you sure you want to escrow $" + reward + "\nas a reward for the best answer to this question?");
  },
  
  syncPreview: function(ev) {
    var $content = $("#q_content");
    var content = $content[0];
    var text = $content.val();
    if (text.length > 400) {
      $content.val(content._lastVal || '');
      ev.preventDefault();
      return;
    }
    content._lastVal = text;
    if (!text) {
      $("#form-preview").parent().hide('slow');
      return;
    }
    var $reward = $("#q_reward");
    var reward = TweetBrain.formatMoney($reward.val()) || '';
    var template = TweetBrain['template' + (reward ? '' : 'No') + 'Reward'].replace(/%s/, reward);
    var len = 135 - template.length;
    text = len > 0 ? len + 1 > text.length ? text : text.substring(0, len) + "…" : '';
    $("#form-preview").text(template.replace(/%s/, text)).parent().show('slow');
    $reward.val(reward);
  },
  
  formatMoney: function(v) {
    v = Math.round(parseFloat(v.replace(/[^\d.]/g, '')) * 100);
    if (!v) return '';
    v = v.toString();
    if (/00$/.test(v)) return v.substring(0, v.length - 2);
    return v.length < 2 ? ".0" + v :  v.substring(0, v.length - 2) + "." + v.substring(v.length - 2); 
  },
  
  checkLogin: function(o, ev, feat) {
    if (TweetBrain.isPublic) {
      if (o) $(o).replaceWith('<span class="errors">Please sign in first.</span>');
      ev.preventDefault();
      TweetBrain.showLogin(feat);
      return false;
    }
    return true;
  },
  
  _loginText: '',
  showLogin: function(feat) {
    if (!$("#signin-box").length) {
      $("#toolbox").prepend('<div id="signin-box" class="loading">Preparing signin...</div>');
    }
   
    if (TweetBrain._loginText) TweetBrain.flashLogin(feat);
    else $.get(TweetBrain.base + "/home/signin", null, function(data) {
      var h = $("#signin-box").height();
      $("#signin-box").replaceWith(data);
      var h2 = $("#signin-box").height();
      TweetBrain._loginText = $("#signin-box h4").text();
      TweetBrain.flashLogin(feat);
      $("#signin-box").css("height", h + "px").animate({height: h2 + "px"}, "slow", "swing", TweetBrain.hadjust);
    });
  },
  flashLogin: function(feat) {
    var box = $("#signin-box")[0];
    
    if (!box._flashing) {
      box._flashing = true;
      $(box).css({color: '#f00', backgroundColor: '#f85'}).animate({color: '#444', backgroundColor: '#ffd'}, "slow",
          function() { this._flashing = false })
        .find('h4').text(feat ? TweetBrain._loginText.replace(/ to .*/, ' to ') + feat : TweetBrain._loginText);
      window.setTimeout(function() { box.scrollTop = 0; }, 0); // work-around for IE weirdness
    }
    $("#username").focus();
  },
  
  bodyEnd: function() {
    TweetBrain.init();
    var isHttps = "https:" == document.location.protocol;
    var gaJsHost = isHttps ? "https://ssl." : "http://www.";
    var uservoiceJsHost = isHttps ? "https://uservoice.com" : "http://cdn.uservoice.com";
    var ss = [ gaJsHost + "google-analytics.com/ga.js", uservoiceJsHost + "/javascripts/widgets/tab.js",
              $("script[src]:first")[0].src.replace(/[^\/]*\.js$/, 'extras.js')
      ];
    for(var j = 0; j < ss.length; j++) {
      document.write(unescape("%3Cscript src='" + ss[j] + "' type='text/javascript'%3E%3C/script%3E"));
    }
  }
  
}

$(TweetBrain.hadjust);
