alagu/pagoda

View on GitHub
lib/pagoda/public/js/editor.js

Summary

Maintainability
B
4 hrs
Test Coverage
// Generated by CoffeeScript 1.4.0
(function() {

  $(document).ready(function() {
    var add_yaml_entry, clear_empty_yaml, draft_post, focus_to_type, fullscreen_mobile, handle_events, init, is_edit_page, is_iphone, keyboard_events, publish_post, save_post, set_save_button, show_shortcuts, toggle_yaml_table, yaml_hash, yaml_table_set_data;
    key.filter = function(e) {
      return true;
    };
    is_iphone = function() {
      return /iPhone/i.test(navigator.userAgent);
    };
    is_edit_page = function() {
      return window.location.pathname.indexOf('edit') !== -1;
    };
    set_save_button = function(status) {
      if (status === 'saving') {
        $('#save-button').val('SAVING');
        return $('#save-button').addClass('post-saving');
      } else if (status === 'saved') {
        $('#save-button').val('SAVED');
        return setTimeout((function() {
          $('#save-button').val('SAVE');
          return $('#save-button').removeClass('post-saving');
        }), 1000);
      } else if (status === 'error') {
        $('#save-button').val('Error');
        $('#save-button').removeClass('post-saving');
        return setTimeout((function() {
          return set_save_button('saved');
        }), 2000);
      }
    };
    draft_post = function() {
      $('#draft-action').addClass('selected');
      $('#publish-action').removeClass('selected');
      $('.override-select').removeClass('override-select');
      $('[name="yaml_value[published]"]').val("false");
      save_post();
      return false;
    };
    publish_post = function() {
      $('#draft-action').removeClass('selected');
      $('#publish-action').addClass('selected');
      $('.override-select').removeClass('override-select');
      $('[name="yaml_value[published]"]').val("true");
      save_post();
      return false;
    };
    save_post = function() {
      var post_obj;
      clear_empty_yaml();
      set_save_button('saving');
      post_obj = {
        post: {
          title: $('#post-title').val(),
          content: $('#post-content').val(),
          name: $('#post_name').val(),
          yaml: yaml_hash()
        },
        ajax: true
      };
      return $.post(baseUrl + '/save-post', post_obj, function(data) {
        var response;
        response = $.parseJSON(data);
        if (response['status'] === 'OK') {
          return setTimeout((function() {
            return set_save_button('saved');
          }), 1000);
        } else {
          return set_save_button('error');
        }
      }).fail((function() {
        return set_save_button('error');
      }));
    };
    add_yaml_entry = function() {
      var html;
      html = $('#add-yaml-template').html();
      $(html).insertBefore($('.add-yaml-entry'));
      $('.yaml-table-inner .key input').focus();
      $('.yaml-table-inner input').unbind('keyup', yaml_table_set_data);
      return $('.yaml-table-inner input').bind('keyup', yaml_table_set_data);
    };
    clear_empty_yaml = function() {
      var row, rows, _i, _len, _results;
      rows = $('.yaml-table-inner input.yaml-value');
      _results = [];
      for (_i = 0, _len = rows.length; _i < _len; _i++) {
        row = rows[_i];
        if ($(row).val() === '') {
          _results.push($(row).parent().parent().remove());
        } else {
          _results.push(void 0);
        }
      }
      return _results;
    };
    yaml_hash = function() {
      var hash, name, row, rows, value, _i, _len;
      rows = $('.yaml-table-inner input.yaml-value');
      hash = {};
      for (_i = 0, _len = rows.length; _i < _len; _i++) {
        row = rows[_i];
        name = $(row).attr('name').replace("yaml_value[", "").replace("]", "");
        value = $(row).val();
        hash[name] = value;
      }
      return hash;
    };
    toggle_yaml_table = function() {
      console.log(yaml_hash());
      return $('.yaml-table').toggle();
    };
    yaml_table_set_data = function() {
      var key, name, row, rows, value, _i, _len, _results;
      rows = $('.yaml-table-inner input');
      _results = [];
      for (_i = 0, _len = rows.length; _i < _len; _i++) {
        row = rows[_i];
        if ($(row).hasClass('yaml-key')) {
          value = $(row).val();
          value = value.replace(" ", "-");
          $(row).val(value);
          name = "yaml_key[" + value + "]";
          _results.push($(row).attr('name', name));
        } else if ($(row).hasClass('yaml-value')) {
          key = $(row).parent().parent().find('.yaml-key').val();
          name = "yaml_value[" + key + "]";
          _results.push($(row).attr('name', name));
        } else {
          _results.push(void 0);
        }
      }
      return _results;
    };
    handle_events = function() {
      $('#post-editor #post-title').autosize({
        append: "\n"
      });
      $("#fullscreen").click(function(e) {
        return screenfull.request();
      });
      $(".draft-options a").hover((function() {
        if (!$(this).hasClass('selected')) {
          return $(".draft-options a.selected").addClass('override-select');
        }
      }), (function() {
        if (!$(this).hasClass('selected')) {
          return $(".draft-options a.selected").removeClass('override-select');
        }
      }));
      screenfull.onchange = function() {
        if (screenfull.isFullscreen) {
          $('#fullscreen').hide();
          $('#post-content').focus();
          return setTimeout(function() {
            var rows;
            rows = Math.ceil($(window).height() / 40);
            return $('#post-content').attr('rows', rows);
          }, 1000);
        } else {
          $('#fullscreen').show();
          return $('#post-content').attr('rows', 18);
        }
      };
      $('.delete-button').click(function() {
        if (!confirm("Confirm delete?")) {
          return false;
        }
      });
      $('#post-content').bind('scroll', function(e) {
        if ($(this).scrollTop() > 10) {
          return $(this).addClass('scrolled');
        } else {
          return $(this).removeClass('scrolled');
        }
      });
      if (is_edit_page()) {
        $('#save-button').click(function() {
          save_post();
          return false;
        });
        $('#draft-action').click(draft_post);
        $('#publish-action').click(publish_post);
        $('.add-yaml-entry').click(add_yaml_entry);
        $('.yaml-block .button').click(toggle_yaml_table);
        return $('.yaml-table-inner input').bind('keyup', yaml_table_set_data);
      }
    };
    keyboard_events = function() {
      key('⌘+enter, ctrl+enter', function(e) {
        return screenfull.toggle();
      });
      return key('⌘+s, ctrl+s', function(e) {
        if (!is_edit_page()) {
          $('.edit_post').submit();
        } else {
          save_post();
        }
        return false;
      });
    };
    show_shortcuts = function() {
      var fulls_shortcut, is_mac, save_shortcut, special_key;
      is_mac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;
      special_key = is_mac ? '⌘' : 'ctrl';
      save_shortcut = special_key + '+S';
      fulls_shortcut = special_key + '+Enter';
      $('#save-button').attr('title', save_shortcut);
      $('#fullscreen').attr('title', fulls_shortcut);
      $("#save-button").tipTip({
        delay: 200
      });
      return $("#fullscreen").tipTip({
        delay: 200,
        defaultPosition: 'right'
      });
    };
    focus_to_type = function() {
      if (!is_edit_page() && ($('#post-title').val() === '')) {
        return $('#post-title').focus();
      } else {
        return $('#post-content').focus();
      }
    };
    fullscreen_mobile = function() {
      if (is_iphone()) {
        setTimeout((function() {
          return window.scrollTo(0, 1);
        }), 0);
        return $('.links').remove();
      }
    };
    init = function() {
      handle_events();
      keyboard_events();
      if (!is_iphone()) {
        show_shortcuts();
      }
      focus_to_type();
      fullscreen_mobile();
      return yaml_table_set_data();
    };
    return init();
  });

}).call(this);