/** quick search **/
function quicksearch() {
  // make sure there's something to search
  if($('body').not('.browse') && !$('#fierce').length) {
    $('<div/>')
      .attr('id','fierce')
      .hide()
      .appendTo($('#containment'))
      .load('/browse/ #content div.idea', function() {
        $('#fierce')
          .show()
          .siblings()
          .hide();
      });
  }

  var text = $('#quicksearch input').val();
  
  if(text.length < 2) {
    $('#content .idea')
      .show()
      .removeHighlight();
    $('#fierce')
      .hide()
      .siblings()
      .show();
  } else {
    $('#fierce')
      .show()
      .siblings()
      .hide();
    $('#content .idea')
      .hide()
      .removeHighlight();
    $("#content .idea:contains('" + text + "')")
      .show()
      .highlight(text);
  }
}

/** Highlight string function **/
jQuery.fn.highlight = function(pat) {
 function innerHighlight(node, pat) {
  var skip = 0;
  if (node.nodeType == 3) {
   var pos = node.data.toUpperCase().indexOf(pat);
   if (pos >= 0) {
    var spannode = document.createElement('span');
    spannode.className = 'highlight';
    var middlebit = node.splitText(pos);
    var endbit = middlebit.splitText(pat.length);
    var middleclone = middlebit.cloneNode(true);
    spannode.appendChild(middleclone);
    middlebit.parentNode.replaceChild(spannode, middlebit);
    skip = 1;
   }
  }
  else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
   for (var i = 0; i < node.childNodes.length; ++i) {
    i += innerHighlight(node.childNodes[i], pat);
   }
  }
  return skip;
 }
 return this.each(function() {
  innerHighlight(this, pat.toUpperCase());
 });
};

jQuery.fn.removeHighlight = function() {
 return this.find("span.highlight").each(function() {
  this.parentNode.firstChild.nodeName;
  with (this.parentNode) {
   replaceChild(this.firstChild, this);
   normalize();
  }
 }).end();
};


$(document).ready(function(){
/** Basics **/
$('body').addClass('java');
$("input[type='password']").val('');
$("input[type='password'], input.tagsex").attr('autocomplete','off');
var userid = $('#userid').attr('title');

$('#form_body, #form_email').focus();

/** Lock form submission **/
$('form').not('#form_browse').submit(function(e) {
  $('form :input, form :submit, textarea, select, input.checkbox').attr('readonly','readonly');
});


/** sign up form slide fade thingy **/
$('a.signup').click(function() {
  if($('#form_login').length > 0) {
    $('#form_login, h2:first, img, p:first, #newbie').fadeOut('slow',function(){
      $('#form_signup').fadeIn('slow');
      $('#form_login').remove();
    });
  }
});

/** Quick search **/
$('#menu .browse').prepend('<form id="quicksearch"><input type="text" name="q" value="Search" onfocus="if($(this).val() == \'Search\') { $(this).val(\'\'); }" onkeydown="quicksearch();" /></form>');


/** Lovely tag suggest functions **/
$('.tagsex').keydown(function(e) {
  if(e.keyCode == 13) {
   if($('ul.results li.selected').length > 0) {
    e.stopPropagation();
    e.preventDefault();
    return false;
   }
  } else if(e.keyCode == 38 ||e.keyCode == 40) {
    e.stopPropagation();
    e.preventDefault();
    return false;
  }
});

$('#message').click(function() {
  $(this).remove();
});

$('.tagsex').blur(function() {
  setTimeout(function() {
    $('ul.results').remove();
  },300) // time delay for removal, in case they're clicking an item
});

$('.tagsex').keyup(function(e) {
  var thisTagsex = $(this).attr('id');
  // Normal key presses get queried
  if(e.keyCode >= 48 && e.keyCode <= 122 || e.keyCode == 8) {
    tagsex = $(this);
    var tagString = $(this).val();
    var x = tagsex.offset().left;
    var y = tagsex.offset().top;
    var w = tagsex.outerWidth();
    var h = tagsex.outerHeight();
    var leng = Math.max(tagString.lastIndexOf(' ') + 1, tagString.lastIndexOf('+') + 1, tagString.lastIndexOf('-') + 1);
    var sugTag = tagString.substr(leng);
    $('ul.results').remove();
    if(sugTag.length > 0 && $('ul.results').length < 1) {
      setTimeout(function() {
        tagsex.addClass('loading');
        $.get('/ajax/suggest.php',
          { tag: sugTag, userid: userid },
          function(data){
            $('ul.results').remove();
            tagsex.removeClass('loading');
            $('body').append('<ul class="results" style="position:absolute;top:' + (y + h) + 'px;left:' + (x + 5) + 'px;width:' + (w - 10) + 'px;">' + data + '</ul>');
            $('ul.results li').each(function(i){
              tagText = $(this).html();
              tag = $(this).text();
              $(this).html('<a href="/browse/' + tag + '" onclick="tagSug(\'' + tag + '\', \'#' + thisTagsex + '\'); return false;">' + tagText + '</a>');
            });
            $('ul.results li:even').addClass('stripe');
          }
        );
      },1000) // time delay for tag drop
    }
  }
  // Down arrow
  else if(e.keyCode == 40) {
    if($('ul.results li.selected').length < 1) {
      $('ul.results li:first').addClass('selected');
    }
    else if(!$('ul.results li:last').is('.selected')) {
      $('ul.results li.selected').next().addClass('selected');
      $('ul.results li.selected:first').removeClass('selected');
    }
    return false;
  }
  // Up arrow
  else if(e.keyCode == 38) {
    if($('ul.results li.selected').length < 1) {
      $('ul.results li:last').addClass('selected');
    }
    else if(!$('ul.results li:first').is('.selected')) {
      $('ul.results li.selected').prev().addClass('selected');
      $('ul.results li.selected:last').removeClass('selected');
    }
    return false;
  }
  // Enter, selecting a tag
  else if(e.keyCode == 13) {
    if($('ul.results li.selected').length > 0) {
      var selectTag = $('ul.results li.selected').text();
      tagSug(selectTag, '#' + thisTagsex);
      return false;
    }
  }
  else {
    $('ul.results').remove();
  }
});

/** Quick delete **/
$('ul.menu li.delete a').not('.ready').click(function() {
  var url = $(this).attr('href');
  var urlParams = url.split('/');
  $(this).after('<a href="#" class="ready" onclick="deleteIdea(\'' + urlParams[2] + '\',\'' + urlParams[3] + '\'); return false;">Click again to delete</a>');
  $(this).remove();
  return false;
});

/** End document.ready **/
});

function tagSug(tag, thisTagsex) {
  $('ul.results').remove();
  var tagString = $(thisTagsex).val();
  var leng = Math.max(tagString.lastIndexOf(' ') + 1, tagString.lastIndexOf('+') + 1, tagString.lastIndexOf('-') + 1);
  var sugTag = tagString.substr(0,leng);
  $(thisTagsex).val(sugTag + '' + tag + ' ');
  $(thisTagsex).focus();
}

function deleteIdea(ideaID, token) {
  $('#idea' + ideaID + ' ul.menu li.delete').html('Deleting...');
  $('#idea' + ideaID + ' ul.menu li').not('.delete').remove();

  var tags = '';
  if($('body.browse').length) {
    var rawTags = $('#idea' + ideaID + ' div.tags a');
  } else {
    var rawTags = $('#idea' + ideaID + ' div.tags h3 a');
  }
  for(var i = 0; i < rawTags.length; i++) {
    tag = $(rawTags[i]).text();
    tags += tag + ' ';
  }
  $.post('/',
    { deleteidea: '1', oldtags: tags, checksum: token, ideaid: ideaID },
    function(data){
      $('#idea' + ideaID).fadeOut('fast');
    }
  );
}
