var Orderer = {
  
  cloudPos : { x : 0, y : 0},
  cloudRate : 1,
  cloudSize : { width: 506, height: 465 },
  cloudSpeed : 400,
  visitCookieName : 'has_visited',
  isSaving : false, // whether a save is in progress
  
  attachEventHandlers : function() {
    $('#pmwform').submit(Orderer.onFormSubmit);
    $('#project_name').change(Orderer.onProjectNameChanged);
    $('#project_duration').change(Orderer.onProjectDurationChanged);
    $('#project_units').change(Orderer.onProjectUnitsChanged);
    $('input').keydown(Orderer.dirty);
    $('textarea').keydown(Orderer.dirty);
    $('textarea').change(Orderer.dirty);
    $('#edit-heyboss').click(Orderer.onEditMessageClicked);
    $('#start').click(Orderer.start);
    $('#add').click(Orderer.onAddClicked);
    $('#save_top').click(Orderer.onSave);
    $('#save').click(Orderer.onSave);
  },
  
  attachRowEventHandlers : function() {
      $('#items li').each(function(i, elem) {
        Orderer.addEventListeners($(elem));
      });
      $('#items input').keydown(Orderer.dirty);
  },

  
  browserSupportsInputPlaceholder : function () {
    //  implementation of this function courtesy of Mark Pilgrim
    //  http://diveintohtml5.org/detect.html
    var i = document.createElement('input');
    return 'placeholder' in i;
  },
  
  getTimeUnits : function() {
    return  $('#project_units').attr('value');
  },
  
  activatePlaceholder : function(inputElement) {
    inputElement = $(inputElement);
    if(!inputElement.attr('placeholder')) {
      document.title = "No placeholder";
      return false;
    }
    
    if(inputElement.attr('value') == '') {
      inputElement.attr('value', inputElement.attr('placeholder'));
    }
    
    if(inputElement.attr('value') == inputElement.attr('placeholder')) {
      inputElement.addClass('placeholder');
    }
    
    inputElement.bind('focus', function(e) {
      var elem = $(e.target);
      if(elem.attr('value') == elem.attr('placeholder')) {
        elem.attr('value', '');
      }
      elem.removeClass('placeholder');
    });
    inputElement.bind('blur', function(e) {
      var elem = $(e.target);
      if(elem.attr('value') == '') {
        elem.attr('value', elem.attr('placeholder'));
        elem.addClass('placeholder');
      }
    });
  },
  
  addEventListeners : function(item) {
    item.find('.item-name').bind('change', Orderer.onItemNameChanged);
    item.find('.item-time').bind('change', Orderer.onItemTimeChanged);
    item.find('.item-delete').bind('click', Orderer.onItemDeleteClicked);
    if(!Orderer.browserSupportsInputPlaceholder()) {
      //  Le sigh
      Orderer.activatePlaceholder(item.find('.item-name').first());
    }
  },
  
  newItem : function() {
      
console.log("in newItem");
      
    var template = $('#template-row').html();
    var newItem = $('<li></li>').html(template);
    var id = Orderer.getNextUnusedItemId();
    
    newItem.find('.order').attr('name', 'workitem_' + id + '_order');
    newItem.find('.item-id').attr('name', 'workitem_' + id + '_id');
    newItem.find('.item-name').attr('name', 'workitem_' + id + '_name');
    newItem.find('.item-time').attr('name', 'workitem_' + id + '_duration');
    
    
    Orderer.addEventListeners(newItem);
    $('#items').append(newItem);
    
    newItem.remove = function() {
      newItem.remove();
    };
    
    newItem.focus = function() {
      newItem.find('.item-name').focus();
    };
    
    Orderer.onItemMoved();
    
    return newItem;
  },
  
  onAddClicked : function(e) {
      console.log("yay");
    e.stopPropagation();
    e.preventDefault();
    var newItem = Orderer.newItem();
    newItem.focus();
  },
  
  onItemNameChanged : function(e) {
      console.log("name changed");
    var elem = $(e.target);
    var isDirty = (elem.attr('value') != elem.attr('ui:original')) ? 1 : 0;
    console.log("isDirty = "+isDirty);
    elem.parent().find('.item-name-dirty').attr('value', isDirty);
    
    if(isDirty) {
      console.log("making dirty");
      Orderer.dirty(false);
    }
  },
  
  onItemTimeChanged : function(e) {
    $(e.target.parentNode).find('.item-duration-dirty').attr('value', 1);
    var elem = $(e.target);
    var value = parseFloat(elem.attr('value'));
    value = isNaN(value) ? 0 : value;
    elem.attr('value', value);
    
    var units = Orderer.getTimeUnits();
    if(value != 1) {
      units += "s";
    }
    elem.next().html(units);
    Orderer.dirty(true);
    Orderer.updateHourSummary();
  },
  
  getItemForElement : function(e) {
    e = $(e.target || e);
    return e.closest('li');
  },
  
  onItemDeleteClicked : function(e) {
    e.preventDefault();
    var item = Orderer.getItemForElement(e);
    item.hide();
    item.find('input.item-name').attr('value', 'DELETED');
    Orderer.onItemMoved();
  },
  
  onItemMoved : function(e) {
    var orderPosition = 1;
    $('#items li').each(function(i, elem) {
      if($(elem).find('input.item-name').attr('value') !== 'DELETED') {
        $(elem).find('input.order').attr('value', orderPosition++);
      }
    });
    Orderer.dirty(true);
    Orderer.updateHourSummary();
  },
  
  updateHourSummary : function(e) {
    if ($('.summarytable')) $('.summarytable').remove();
    var project_duration = 1 * $('#project_duration').attr('value');
    var units = $('#project_units').attr('value').toUpperCase();
    var shown_waves = false;
    var sofar = 0;
    
    $('#items li').each(function(i, elem) {
      var duration = 1 * $(elem).find('input.item-time').attr('value');
      var presofar = sofar;
      sofar += duration;
      if (sofar > project_duration && !shown_waves) {
        var units_p = presofar == 1 ? units : units + "S";
        
        $(elem).prepend("<li class=summarytable><table width=100% border=0 cellspacing=0 cellpadding=0><tr><td width=50%><hr size=1></td><td class='hoursummary'>"+presofar+" "+units_p+"</nobr></td><td width=50%><hr size=1></td></tr></table></li>");
        shown_waves = true; 
      }
    });    
  },

  hideHourSummary : function(e) {
    if ($('.summarytable')) $('.summarytable').remove();
  },

  onProjectNameChanged : function(e) {
    var projectName = $(e.target).attr('value').trim();
    document.title = "Prioritize My Work";
    if(projectName) {
      document.title = projectName + ' - ' + document.title;
    }
    Orderer.dirty(false);
  },

  onProjectDurationChanged : function(e) {
    Orderer.dirty(false);
    Orderer.updateHourSummary();
  },

  onProjectUnitsChanged : function(e) {
    $('.item-units').each(function(i, elem) {
      var label = $(e.target).attr('value');
      var dur;
      if (elem.previousSibling.previousSibling.value) {
        dur = elem.previousSibling.previousSibling.value;
      }
      if (dur!=1) {
         label += "s";
      }
      $(elem).html(label); 
    });
    Orderer.dirty(false);
    Orderer.updateHourSummary();
  },

  onSave : function(e) {
      if(e) {
        e.preventDefault();
      }
    if ($("#save").hasClass("disabled")) {
      return;
    }
    setTimeout("$('#pmwform').submit();",1);
  },
  
  onFormSubmit : function(e) {
    if(Orderer.isSaving) {
      return false;
    }
    Orderer.isSaving = true;
    
    $(".save_button").addClass("saving").addClass("disabled");
    
    if($(document.body).hasClass('new')) {
      //  Need to do a non-AJAX submission the very first time
      return;
    }
    
    e.preventDefault();
    e.stopPropagation();
    
    $.post(window.location, $('form#pmwform').serialize(), function(data) {
      var dom = $(data);
      var theItems = dom.find('#items').html();
      $('#items').html(theItems);
      $(".save_button").removeClass("saving");
      //Orderer.attachEventHandlers();
      Orderer.attachRowEventHandlers();
      Orderer.isSaving = false;
    });
  },
  
  dirty : function(updateHourSummaryToo) {
    if (updateHourSummaryToo===true) {
      Orderer.updateHourSummary();
    }
    $('#save').removeClass("disabled");
    $('#save_top').removeClass("disabled");
  },
  
  onEditMessageClicked : function(e) {
    e.preventDefault();
    $('#heyboss textarea').first().focus().select();
    return false;
  },    
  
  getNextUnusedItemId : function(e) {
    var maxId = 0;
    $('#items li input.item-name').each(function(i, elem) {
      maxId = Math.max(maxId, parseInt($(elem).attr('name').split('_')[1]));
    });
    return maxId + 1;
  },
  
  moveClouds : function(e) {    
    Orderer.cloudPos.x -= Orderer.cloudRate;
    if(Orderer.cloudPos.x % 50 == 0) {
      Orderer.cloudPos.y -= Orderer.cloudRate;
    }
    
    if(Orderer.cloudPos.x < -Orderer.cloudSize.width) {
      Orderer.cloudPos.x += Orderer.cloudSize.width;
    }
    if(Orderer.cloudPos.y < -Orderer.cloudSize.height) {
      Orderer.cloudPos.y += Orderer.cloudSize.height;
    }
    
    document.body.style.backgroundPosition = Orderer.cloudPos.x + 'px ' + Orderer.cloudPos.y + 'px';
  },

  start : function(e) {
    $('#footercontainer').addClass('closed').removeClass('open');
    $('#info').hide("slow");
    $('#overlay').animate({opacity: 0.0}, 600, function(){$('#overlay').css('z-index',-5)});
    $('#logo').animate({width:140,height:25}, 300);
    $('#footerlinks').animate({opacity: 1.0}, 150);
    $('#start').html('Hide instructions');
    $('#project_name').focus();
  },
  
  toggleFooter : function(e) {
    if($('#footercontainer').hasClass('closed')) {
      Orderer.unstart();
    } else {
      Orderer.start();
    }
  },

  unstart : function(e) {
    $('#footercontainer').addClass('open').removeClass('closed');
    $('#info').show("slow");
    $('#overlay').css({ 'z-index' : 50, 'display' : 'block' }).animate({opacity: 0.75}, 600);
    $('#logo').css({width:280, height:50});
    $('#footerlinks').css('filter', 'alpha(opacity = 0)');
    $('#footerlinks').animate({opacity: 0.0}, 300);
  },
    
  init : function() {
    if($('#footercontainer').hasClass('closed')) {
      $('#project_name').focus();
    }
    Orderer.attachEventHandlers();
    Orderer.attachRowEventHandlers();
    
    $(document).keyup(function(e) { 
        if (e.which == 27) { Orderer.start(); }
    });
        
    $('#items').sortable({
      handle : '.cloud',
      start  : Orderer.hideHourSummary,
      stop   : Orderer.updateHourSummary,
      update : Orderer.onItemMoved,
    });
        
    if(Orderer.isFirstVisit()) {
      Orderer.noteVisit();
      if(!$(document.body).hasClass('new')) {
        //  Even though we're viewing an existing list, this is the user's visit time to the site,
        //  so show them the instructions.
        Orderer.unstart();
      }
    }
    
    Orderer.moveCloudsTimer = window.setInterval(Orderer.moveClouds, Orderer.cloudSpeed);
  },
  
  isFirstVisit : function() {
    return !$.cookie(Orderer.visitCookieName);
  },
  
  noteVisit : function() {
    $.cookie(Orderer.visitCookieName, "is it me you're looking for");
  },
  
  eof : null
}

$(document).ready(Orderer.init);
