var latest_request = null;
var current_search_selection = null;
var search_result_elements = $([]);
var UP_ARROW = 38,
    DOWN_ARROW = 40,
    ESCAPE = 27,
    DELETE = 127,
    BACKSPACE = 8,
    SPACE = 32,
    LF = 10,
    CR = 13;

$.fn.disableSelection = function() {
  return $(this).each( function( index, el ) {
    if( typeof el.style.MozUserSelect != 'undefined' ) {
      el.style.MozUserSelect = 'none';
    }
    else {
      el.onmousedown = function() { return false; }
    }
    el.style.cursor = 'pointer';
  } );
}

function submitForm( el ) {
  var form = $(el).closest('form');
  if( form.attr('rel') != 'locked' ) {
    form.submit();
    form.attr('rel', 'locked');
  }
  return false;
}
function unlockForm( el ) {
  el.attr('rel', null);
}

function showNewTicketModal() {
  var modal = $('#new_ticket_modal');
  modal.trigger( 'showModal', $('#content') );
  if( !modal.data( 'loaded' ) ) {
    $.ajax( {
      url: traqerousHash.newTicketModalPath,
      type: 'GET',
      dataType: 'html',
      data: { project: traqerousHash.projectId },
      success: function( r ) {
        modal.find('.content').html( r );
        modal.data( 'loaded', true );
        modal.find('a.button').singleClick().click( function() {
          var project = modal.find('select').val();
          window.location.href = '/ticket/' + project + '/new';
          return false;
        } );
      }
    } );
  }
}

function hotkeys() {
  key.setScope( traqerousHash.page || 'all' );

  key( '⇧+1', showNewTicketModal );

  key( 'esc', function() {
    $('input, textarea, select').blur();
    $('#search_form')
      .parents('li.menu').removeClass('active')
        .find('.popup').stop().animate({opacity:0}, 50).hide();
    return false;
  } );

  // search
  key( '/, ⌥+/', function() {
    $('#search_form')
      .parents('li.menu').addClass('active')
        .find('.popup').stop().animate({opacity:1}, 50).show().end()
      .end()
      .find('input:first').focus();
    return false;
  } );

  // help
  key( '⇧+/, ⌥+h', function() {
    var modal = $('#hotkeys_help_modal');
    if( traqerousHash.hotkeyHelp ) {
      modal.trigger( 'hideModal' );
      traqerousHash.hotkeyHelp = false;
    }
    else {
      if( navigator.appVersion.indexOf("Mac") == -1 ) {
        modal.find('.key').each( function() {
          var el = $(this);
          if( el.text() == 'opt' ) {
            el.text( 'alt' );
          }
        } );
      }
      modal.trigger( 'showModal', $('#content') );
      traqerousHash.hotkeyHelp = true;
    }
  } );

  // vi style movement
  key( 'j, ⌥+j', function() {
    $('html,body').stop().animate( {
      scrollTop: '+=100'
    }, 30 );
    return false;
  } );
  key( 'k, ⌥+k', function() {
    $('html,body').stop().animate( {
      scrollTop: '-=100'
    }, 30 );
    return false;
  } );

  // tag and watcher modals
  key( '⇧+t, ⌥+⇧+t', 'edit', function() { $('#title').focus(); return false; } );
  key( '⇧+c, ⌥+⇧+c', 'edit', function() { $('#comment #real').focus(); return false; } );
  key( 't, ⌥+t', 'edit', function() { showToolModal( $('a[rel=tags]') ); return false; } );
  key( 'w, ⌥+w', 'edit', function() { showToolModal( $('a[rel=watchers]') ); return false; } );
  key( 'a, ⌥+a', 'edit', function() { rotateAssignee(); return false; } );
  key( 's, ⌥+s', 'edit', function() { rotateStatus(); return false; } );
  key( 'l, ⌥+l', 'edit', function() { rotateList(); return false; } );
  key( 'p, ⌥+p', 'edit', function() { rotatePriority(); return false; } );
  key( '⌥+return, ⌥+⇧+return', 'edit', function() { $('#edit_ticket_form').submit(); return false; } );
}


$(document).ready( function() {
  $.ajaxSetup( {
    headers: {
      'X-CSRF-Token': $("meta[name='csrf-token']").attr( "content" )
    }
  } );

  // handle singleClick buttons and elements, this
  // needs to happen as early as possible or
  // other handlers callbacks will be fired first
  if( $.fn.singleClick ) {
    $('.single_click').singleClick();
  }

  $('.spacer h1, #app_logo').click( function() {
    window.location = "/";
  } );
  $('[default]').defaultTextField();
  $('.tiny_bottom').disableSelection();

  $('.history_entry .content p a[class!=id]').attr( 'target', '_new' );
  $('a[rel=external]').attr( 'target', '_new' );

  $('#open_ticket_list li').each( function() {
    var element = $(this);
    var link = element.find( 'a.delete' );
    var id = element.attr( 'id' );

    link.click( function() {
      $.ajax( {
        url:  '/ticket/delete/' + id,
        type: 'post',
        dataType: 'json',
        success: function( response ) {
          if( response.status == 'ok' ) {
            element.remove();
            $('#number_of_tickets').text( response.ticket_count );
          }
        }
      } );

      return false;
    } );
  } );

  $('#dismiss_nag').click( function() {
    $('#nag').animate( {
      height: 0,
      borderBottomWidth: 0,
      borderTopWidth: 0,
      opacity: 0,
      paddingTop: 0,
      paddingBottom: 0,
      marginBottom: 0,
      marginTop: 0
    }, 500, function() {
      $(this).remove();
    } );
    $.post( '/billing/nonag' );
  } );

  if( $.fn.littleModal ) {
    setTimeout( function() { $('.modal').littleModal(); }, 0 );
  }
  if( typeof(key) !== 'undefined' ) {
    setTimeout( hotkeys, 1 );
  }
} );


