OSDN Git Service

conflict
[pettanr/pettanr.git] / app / assets / javascripts / views / scrolls / play.js.coffee
index ffd19aa..5dfdd63 100644 (file)
@@ -1,15 +1,5 @@
 class Pettanr.Views.Scroll.PlayModule\r
-class Pettanr.Views.Scroll.PlayModule.Header extends Pettanr.Views.Show.Header\r
-  \r
-  initialize: (options) ->\r
-    super(options)\r
-  \r
-class Pettanr.Views.Scroll.PlayModule.Owner extends Pettanr.Views.Show.Owner\r
-  \r
-  initialize: (options) ->\r
-    super(options)\r
-  \r
-class Pettanr.Views.Scroll.PlayModule.FooterSwitch extends Backbone.View\r
+class Pettanr.Views.Scroll.PlayModule.FooterSwitch extends Pettanr.View\r
   tagName: 'div'\r
   className: 'player-item-switch'\r
   events: {\r
@@ -20,6 +10,8 @@ class Pettanr.Views.Scroll.PlayModule.FooterSwitch extends Backbone.View
     @scroll_panel = options.scroll_panel\r
     @panel = options.panel\r
     @visible = false\r
+    @enabled = true\r
+    @listenTo(@scroll_panel, 'sync', @render)\r
   \r
   render: () ->\r
     this.$el.html('')\r
@@ -27,21 +19,31 @@ class Pettanr.Views.Scroll.PlayModule.FooterSwitch extends Backbone.View
       style: Pettanr.to_style({height: Pettanr.to_s(@panel.get('height')) + 'px'})\r
     }\r
     this.$el.attr(attr)\r
-    face = if @visible\r
+    face =  if @visible\r
       '<'\r
     else\r
       '>'\r
     caption = new Tag.Span({content: face})\r
     this.$el.append(@scroll_panel.get('t') + 1)\r
-    this.$el.append(caption.render().el)\r
+    this.$el.append(caption.render().el) if @enabled\r
     this\r
   \r
   click: () ->\r
+    return false if !@enabled\r
     @visible = !@visible\r
     @render()\r
     @trigger('click', @visible)\r
   \r
-class Pettanr.Views.Scroll.PlayModule.Footer extends Backbone.View\r
+  enable: () ->\r
+    @enabled = true\r
+    @render()\r
+  \r
+  disable: () ->\r
+    @enabled = false\r
+    @visible = false\r
+    @render()\r
+  \r
+class Pettanr.Views.Scroll.PlayModule.Footer extends Pettanr.View\r
   tagName: 'div'\r
   className: 'player-item-footer'\r
   \r
@@ -53,44 +55,55 @@ class Pettanr.Views.Scroll.PlayModule.Footer extends Backbone.View
   render: () ->\r
     this.$el.html('')\r
     @hide()\r
-    retriever = @panel.author()\r
-    @listenTo(retriever, 'retrieve', @retrieve_author)\r
-    retriever.retrieve()\r
-    this\r
-  \r
-  retrieve_author: (@author) -> \r
-    @panel_icon = new Pettanr.Views.Panel.Icon({item: @panel, half: true})\r
-    @author_icon = new Pettanr.Views.Author.Icon({item: @author, half: true})\r
-    @new_scroll_panel = new Pettanr.ScrollPanel()\r
-    @insert_button = new Pettanr.Views.Show.LinkedNewButton({item: @new_scroll_panel, dic_name: 'scroll_panels.player.before_insert'})\r
-    @move_button = new Pettanr.Views.Show.LinkedEditButton({item: @scroll_panel, dic_name: 'scroll_panels.player.move'})\r
-    @destroy_button = new Pettanr.Views.Show.LinkedDestroyButton({item: @scroll_panel, dic_name: 'scroll_panels.player.destroy'})\r
-    @listenTo(@panel_icon, 'click', @click_panel)\r
-    @listenTo(@author_icon, 'click', @click_author)\r
-    @listenTo(@insert_button, 'click', @click_insert)\r
-    @listenTo(@move_button, 'click', @click_move)\r
-    @listenTo(@destroy_button, 'click', @click_destroy)\r
-    l1 = new Tag.H3({\r
-      content: Pettanr.AppHelper.t_m('Panel')\r
+    @panel.get_parent('author', this, {\r
+      success: (@author) =>\r
+        @panel_face_button = @panel.mini_face_button({\r
+          context: this,\r
+          click: () ->\r
+            @trigger('click:panel')\r
+        })\r
+        @author_face_button = @author.mini_face_button({\r
+          context: this,\r
+          click: () ->\r
+            @trigger('click:author', @author)\r
+        })\r
+        l1 = new Tag.H3({\r
+          content: Pettanr.AppHelper.t_m('Panel')\r
+        })\r
+        l2 = new Tag.H3({\r
+          content: Pettanr.AppHelper.t_m('ScrollPanel')\r
+        })\r
+        this.$el.append(l1.render().el)\r
+        this.$el.append(@panel_face_button.render().el)\r
+        this.$el.append(@author_face_button.render().el)\r
+        this.$el.append(\r
+          Pettanr.AppHelper.distance_of_time_in_words_to_now(@panel.get('updated_at'))\r
+        )\r
+        this.$el.append(l2.render().el)\r
+        if @scroll.is_own()\r
+          @new_scroll_panel = new Pettanr.ScrollPanel()\r
+          @insert_button = new Pettanr.View.Button.ItemAction(@new_scroll_panel, 'new', 'scroll_panels.player.before_insert', {\r
+            context: this,\r
+            click: () ->\r
+              @trigger('click:insert')\r
+          })\r
+          @move_button = new Pettanr.View.Button.ItemAction(@scroll_panel, 'edit', 'scroll_panels.player.move', {\r
+            context: this,\r
+            click: () ->\r
+              @trigger('click:move')\r
+          })\r
+          @destroy_button = new Pettanr.View.Button.ItemAction(@scroll_panel, 'destroy', 'scroll_panels.player.destroy', {\r
+            context: this,\r
+            click: () ->\r
+              @trigger('click:destroy')\r
+          })\r
+          this.$el.append(@insert_button.render().el)\r
+          @append_rb()\r
+          this.$el.append(@move_button.render().el)\r
+          @append_rb()\r
+          this.$el.append(@destroy_button.render().el)\r
     })\r
-    l2 = new Tag.H3({\r
-      content: Pettanr.AppHelper.t_m('ScrollPanel')\r
-    })\r
-    this.$el.append(l1.render().el)\r
-    this.$el.append(@panel_icon.render().el)\r
-    this.$el.append(@author_icon.render().el)\r
-    this.$el.append(\r
-      Pettanr.AppHelper.distance_of_time_in_words_to_now(@panel.get('updated_at'))\r
-    )\r
-    this.$el.append(l2.render().el)\r
-    if @scroll.is_own()\r
-      this.$el.append(@insert_button.render().el)\r
-      rb = new Tag.RowBreak()\r
-      this.$el.append(rb.render().el)\r
-      this.$el.append(@move_button.render().el)\r
-      rb = new Tag.RowBreak()\r
-      this.$el.append(rb.render().el)\r
-      this.$el.append(@destroy_button.render().el)\r
+    this\r
   \r
   hide: () ->\r
     attr = {\r
@@ -104,46 +117,7 @@ class Pettanr.Views.Scroll.PlayModule.Footer extends Backbone.View
     }\r
     this.$el.attr(attr)\r
   \r
-  click_panel: () ->\r
-    @trigger('click:panel')\r
-  \r
-  click_author: () ->\r
-    @trigger('click:author')\r
-  \r
-  click_insert: () ->\r
-    @trigger('click:insert')\r
-  \r
-  click_move: () ->\r
-    @trigger('click:move')\r
-  \r
-  click_destroy: () ->\r
-    @trigger('click:destroy')\r
-  \r
-class Pettanr.Views.Scroll.PlayModule.Credits extends Backbone.View\r
-  tagName: 'div'\r
-  className: 'credits'\r
-  \r
-  initialize: (options) ->\r
-    @parent = options.parent\r
-    @licensed_pictures = {}\r
-  \r
-  render: () ->\r
-    this.$el.html('')\r
-    this\r
-  \r
-  push: (retrievers) ->\r
-    _.each retrievers, (retriever) =>\r
-      @listenTo(retriever, 'retrieve', @retrieve_picture)\r
-      retriever.retrieve()\r
-  \r
-  retrieve_picture: (picture) ->\r
-    pid = picture.get('id')\r
-    return if @licensed_pictures[pid]\r
-    @licensed_pictures[pid] = picture\r
-    credit = picture.credit_view()\r
-    this.$el.append(credit.render().el)\r
-  \r
-class Pettanr.Views.Scroll.PlayModule.PanelBody extends Backbone.View\r
+class Pettanr.Views.Scroll.PlayModule.PanelBody extends Pettanr.View\r
   tagName: 'div'\r
   className: 'player-item-panel'\r
   \r
@@ -159,7 +133,7 @@ class Pettanr.Views.Scroll.PlayModule.PanelBody extends Backbone.View
     this.$el.append(body.render().el)\r
     this\r
   \r
-class Pettanr.Views.Scroll.PlayModule.Panel extends Backbone.View\r
+class Pettanr.Views.Scroll.PlayModule.Panel extends Pettanr.View\r
   tagName: 'li'\r
   className: 'player-item'\r
   \r
@@ -169,41 +143,54 @@ class Pettanr.Views.Scroll.PlayModule.Panel extends Backbone.View
   \r
   clear: () ->\r
     this.$el.html('')\r
-    retriever = @scroll_panel.panel()\r
-    @listenTo(retriever, 'retrieve', @retrieve_panel)\r
-    retriever.retrieve()\r
+    @scroll_panel.get_parent('panel', this, {\r
+      success: (@panel) =>\r
+        @render()\r
+    })\r
     this\r
   \r
-  retrieve_panel: (@panel) ->\r
-    @render()\r
-  \r
   render: () ->\r
     this.$el.html('')\r
-    @panel = @panel.with_elements() # retake panel for 'with_elements' mode\r
-    @panel.fetch({cache: true}).done =>\r
-      @panel.attributes = @panel.replaced_attributes()\r
-      body = new Pettanr.Views.Scroll.PlayModule.PanelBody({\r
-        panel: @panel\r
-      })\r
-      btn = new Pettanr.Views.Scroll.PlayModule.FooterSwitch({\r
-        scroll_panel: @scroll_panel,\r
-        panel: @panel\r
-      })\r
-      @listenTo(btn, 'click', @click_footer_switch)\r
-      @footer = new Pettanr.Views.Scroll.PlayModule.Footer({\r
-        scroll: @scroll,\r
-        scroll_panel: @scroll_panel,\r
-        panel: @panel,\r
-      })\r
-      @listenTo(@footer, 'click:panel', @click_show)\r
-      @listenTo(@footer, 'click:author', @click_author)\r
-      @listenTo(@footer, 'click:insert', @click_insert)\r
-      @listenTo(@footer, 'click:move', @click_move)\r
-      @listenTo(@footer, 'click:edit', @click_edit)\r
-      this.$el.append(body.render().el)\r
-      this.$el.append(btn.render().el)\r
-      this.$el.append(@footer.render().el)\r
-      @trigger('ready', @panel)\r
+    @panel = @panel.play() # retake panel for 'with_elements' mode\r
+    @panel.fetch({\r
+      success: (model, response, opt) => \r
+        @panel.attributes = @panel.decoded_attributes()\r
+        body = new Pettanr.Views.Scroll.PlayModule.PanelBody({\r
+          panel: @panel\r
+        })\r
+        @footer_switch = new Pettanr.Views.Scroll.PlayModule.FooterSwitch({\r
+          scroll_panel: @scroll_panel,\r
+          panel: @panel\r
+        })\r
+        @listenTo(@footer_switch, 'click', @click_footer_switch)\r
+        move_to = new Tag.A({\r
+          attr: {href: '/' + @scroll_panel.edit_url()},\r
+          content: I18n.t('scroll_panels.player.move_to')\r
+        })\r
+        @insert_point = new Pettanr.Views.Scroll.PlayModule.InsertPoint({\r
+          class_name: 'insert-point', content: move_to.render().el\r
+        })\r
+        @footer = new Pettanr.Views.Scroll.PlayModule.Footer({\r
+          scroll: @scroll,\r
+          scroll_panel: @scroll_panel,\r
+          panel: @panel,\r
+        })\r
+        @listenTo(move_to, 'click', @click_move_to)\r
+        @listenTo(@footer, 'click:panel', @click_show)\r
+        @listenTo(@footer, 'click:author', @click_author)\r
+        @listenTo(@footer, 'click:insert', @click_insert)\r
+        @listenTo(@footer, 'click:move', @click_move)\r
+        @listenTo(@footer, 'click:edit', @click_edit)\r
+        @listenTo(@footer, 'click:destroy', @click_destroy)\r
+        this.$el.append(@insert_point.clear().el)\r
+        @append_rb()\r
+        this.$el.append(body.render().el)\r
+        this.$el.append(@footer_switch.render().el)\r
+        this.$el.append(@footer.render().el)\r
+        @trigger('ready', @panel)\r
+      error: (item, response, opt) =>\r
+        @open_error_dialog(response, opt)\r
+    })\r
     this\r
   \r
   hide: () ->\r
@@ -216,6 +203,19 @@ class Pettanr.Views.Scroll.PlayModule.Panel extends Backbone.View
     attr = {style: Pettanr.to_style(style)}\r
     this.$el.attr(attr)\r
   \r
+  enable_footer_switch: () ->\r
+    @footer_switch.enable()\r
+  \r
+  disable_footer_switch: () ->\r
+    @footer_switch.disable()\r
+    @footer.hide()\r
+  \r
+  show_insert_point: () ->\r
+    @insert_point.show()\r
+  \r
+  hide_insert_point: () ->\r
+    @insert_point.hide()\r
+  \r
   click_footer_switch: (visible) ->\r
     if visible\r
       @footer.show()\r
@@ -225,8 +225,8 @@ class Pettanr.Views.Scroll.PlayModule.Panel extends Backbone.View
   click_show: () ->\r
     @trigger('http_get', @panel.show_url())\r
   \r
-  click_author: () ->\r
-    @trigger('http_get', @panel.author().show_url())\r
+  click_author: (author) ->\r
+    @trigger('http_get', author.show_url())\r
   \r
   click_insert: () ->\r
     @trigger('click:insert', this)\r
@@ -237,7 +237,46 @@ class Pettanr.Views.Scroll.PlayModule.Panel extends Backbone.View
   click_destroy: () ->\r
     @trigger('click:destroy', this)\r
   \r
-class Pettanr.Views.Scroll.PlayModule.Panels extends Backbone.View\r
+  click_move_to: () ->\r
+    @trigger('click:move_to', this)\r
+  \r
+class Pettanr.Views.Scroll.PlayModule.InsertPoint extends Tag.Div\r
+  \r
+  clear: () ->\r
+    this.$el.html('')\r
+    @hide()\r
+    @render()\r
+    this\r
+  \r
+  hide: () ->\r
+    @set_style({display: 'none'})\r
+  \r
+  show: () ->\r
+    @set_style({display: 'inline'})\r
+  \r
+  set_style: (style) ->\r
+    attr = {style: Pettanr.to_style(style)}\r
+    this.$el.attr(attr)\r
+  \r
+class Pettanr.Views.Scroll.PlayModule.EmptyNotice extends Tag.H2\r
+  \r
+  clear: () ->\r
+    this.$el.html('')\r
+    @hide()\r
+    @render()\r
+    this\r
+  \r
+  hide: () ->\r
+    @set_style({display: 'none'})\r
+  \r
+  show: () ->\r
+    @set_style({display: 'inline'})\r
+  \r
+  set_style: (style) ->\r
+    attr = {style: Pettanr.to_style(style)}\r
+    this.$el.attr(attr)\r
+  \r
+class Pettanr.Views.Scroll.PlayModule.Panels extends Pettanr.View\r
   tagName: 'ul'\r
   className: 'player'\r
   \r
@@ -250,139 +289,348 @@ class Pettanr.Views.Scroll.PlayModule.Panels extends Backbone.View
   \r
   render: () ->\r
     this.$el.html('')\r
+    @empty_notice = new Pettanr.Views.Scroll.PlayModule.EmptyNotice({content: I18n.t('scrolls.play.empty')})\r
+    this.$el.append(@empty_notice.clear().el)\r
     _.each @items, (scroll_panel) =>\r
-      return if not scroll_panel.has_panel()\r
-      panel_view = new Pettanr.Views.Scroll.PlayModule.Panel({\r
-        scroll: @binder,scroll_panel: scroll_panel,\r
-      })\r
-      @listenTo(panel_view, 'ready', @ready)\r
-      @listenTo(panel_view, 'click:insert', @click_insert)\r
-      @listenTo(panel_view, 'click:move', @click_move)\r
-      @listenTo(panel_view, 'click:destroy', @click_destroy)\r
-      this.$el.append(panel_view.clear().el)\r
-      @views.push(panel_view)\r
-    rb = new Tag.RowBreak()\r
-    this.$el.append(rb.render().el)\r
+      @append_scroll_panel(scroll_panel)\r
+    @refresh_empty_notice()\r
     this\r
   \r
+  refresh_empty_notice: () ->\r
+    if @views.length < 1\r
+      @empty_notice.show()\r
+    else\r
+      @empty_notice.hide()\r
+    this\r
+  \r
+  append_scroll_panel: (scroll_panel) ->\r
+    return if not scroll_panel.has_panel()\r
+    panel_view = @create_panel_view(scroll_panel)\r
+    this.$el.append(panel_view.clear().el)\r
+    @refresh_empty_notice()\r
+  \r
+  create_panel_view: (scroll_panel) ->\r
+    panel_view = new Pettanr.Views.Scroll.PlayModule.Panel({\r
+      scroll: @binder, scroll_panel: scroll_panel,\r
+    })\r
+    @listenTo(panel_view, 'ready', @ready)\r
+    @listenTo(panel_view, 'http_get', @http_get)\r
+    @listenTo(panel_view, 'click:insert', @click_insert)\r
+    @listenTo(panel_view, 'click:move', @click_move)\r
+    @listenTo(panel_view, 'click:destroy', @click_destroy)\r
+    @listenTo(panel_view, 'click:move_to', @click_move_to)\r
+    @views.push(panel_view)\r
+    panel_view\r
+  \r
   ready: (panel) ->\r
     this.credits.push(panel.licensed_pictures())\r
   \r
-  click_insert: (panel_view) ->\r
-    @trigger('click:insert')\r
+  http_get: (url) ->\r
+    @trigger('http_get', url)\r
+  \r
+  click_insert: (panel_view = null) ->\r
     @dialog = new Editor.Player.PanelInsertDialog({\r
-      parent: this\r
+      parent: this, binder: @binder, target_model: Pettanr.ScrollPanel,\r
+      insert_point: panel_view\r
     })\r
+    @listenTo(@dialog, 'pick', @pick)\r
+    @listenTo(@dialog, 'open', @open_dialog)\r
+    @listenTo(@dialog, 'close', @close_dialog)\r
     this.$el.append(@dialog.render().el)\r
-    _this = this\r
-    @dialog.$el.dialog({\r
-      autoOpen: false,\r
-      width: 500, \r
-      height: 500,\r
-      close: (ui, event) ->\r
-        _this.remove()\r
-    })\r
-    @listenTo(@dialog, 'success', @success)\r
-    @dialog.start(panel_view.panel)\r
+    @dialog.start()\r
+    @trigger('click:insert', @dialog)\r
+  \r
+  pick: (new_item, insert_point) ->\r
+    @parent.appender.show()\r
+    panel_view = @create_panel_view(new_item)\r
+    ul = this.$el[0]\r
+    if insert_point\r
+      # insert before insert_point\r
+      li = insert_point.$el[0]\r
+      ul.insertBefore(panel_view.clear().el, li)\r
+    else\r
+      # append\r
+      this.$el.append(panel_view.clear().el)\r
+    @refresh_views()\r
+    @dialog.stop()\r
+  \r
+  open_dialog: () ->\r
+    @trigger('dialog:open', dialog)\r
+  \r
+  close_dialog: () ->\r
+    @trigger('dialog:close', @dialog)\r
+    if @dialog.is_catch()\r
+      # stored panel back to player\r
+      @back()\r
   \r
   click_move: (panel_view) ->\r
-    @trigger('click:move')\r
     @dialog = new Editor.Player.PanelMoveDialog({\r
-      parent: this\r
+      parent: this, binder: @binder, target_model: Pettanr.ScrollPanel,\r
+      from: panel_view\r
     })\r
+    @listenTo(@dialog, 'open', @open_dialog)\r
+    @listenTo(@dialog, 'close', @close_dialog)\r
     this.$el.append(@dialog.render().el)\r
-    _this = this\r
-    @dialog.$el.dialog({\r
-      autoOpen: false,\r
-      width: 500, \r
-      height: 500,\r
-      close: (ui, event) ->\r
-        _this.remove()\r
-    })\r
-    @listenTo(@dialog, 'success', @success)\r
+    @disable_footer_switch()\r
     @dialog.start(panel_view.panel)\r
     panel_view.hide()\r
+    @show_insert_point()\r
+    @trigger('click:move', @dialog)\r
+  \r
+  enable_footer_switch: () ->\r
+    _.each @views, (panel_view) =>\r
+      panel_view.enable_footer_switch()\r
+  \r
+  disable_footer_switch: () ->\r
+    _.each @views, (panel_view) =>\r
+      panel_view.disable_footer_switch()\r
   \r
   show_insert_point: () ->\r
     _.each @views, (panel_view) =>\r
-      panel_view.show_insert_point\r
+      panel_view.show_insert_point()\r
+  \r
+  hide_insert_point: () ->\r
+    _.each @views, (panel_view) =>\r
+      panel_view.hide_insert_point()\r
+  \r
+  refresh_views: () ->\r
+    _.each @views, (panel_view) =>\r
+      Pettanr.cache.refresh(panel_view.scroll_panel)\r
+  \r
+  click_move_to: (to_panel_view) ->\r
+    @enable_footer_switch()\r
+    @listenTo(@dialog, 'success', @move_success)\r
+    @dialog.save(to_panel_view)\r
+  \r
+  move_success: (model, response) ->\r
+    from_panel_view = @create_panel_view(@dialog.from.scroll_panel)\r
+    @dialog.release()\r
+    @listenTo(from_panel_view, 'ready', @ready_from_panel_view)\r
+    ul = this.$el[0]\r
+    li = @dialog.to.$el[0]\r
+    ul.insertBefore(from_panel_view.clear().el, li)\r
+  \r
+  ready_from_panel_view: (panel) ->\r
+    @remove_panel_view(@dialog.from)\r
+    @dialog.stop()\r
+    @hide_insert_point()\r
+    @refresh_views()\r
+  \r
+  back: () ->\r
+    @hide_insert_point()\r
+    @enable_footer_switch()\r
+    @dialog.from.show()\r
   \r
   click_destroy: (panel_view) ->\r
-    @trigger('click:destroy')\r
+    success = (model, response) =>\r
+      @remove_panel_view(panel_view)\r
+      panel_view.remove()\r
+      @refresh_empty_notice()\r
+      @refresh_views()\r
+      @trigger('click:destroy')\r
+    Pettanr.Proxy.destroy(panel_view.scroll_panel, {success: success})\r
+  \r
+  remove_panel_view: (panel_view) ->\r
+    @views = _.without(@views, panel_view)\r
+    panel_view.remove()\r
+  \r
+class Pettanr.Views.Scroll.PlayModule.Append extends Tag.Div\r
   \r
-class Pettanr.Views.Scroll.PlayModule.Body extends Backbone.View\r
+  initialize: (options) ->\r
+    super(options)\r
+    @enabled = false\r
+  \r
+  render: () ->\r
+    this.$el.html('')\r
+    if @enabled\r
+      @link = new Tag.A({\r
+        attr: {href: '/scroll_panels/new'},\r
+        content: I18n.t('scroll_panels.player.append')\r
+      })\r
+      @listenTo(@link, 'click', @click)\r
+      @content = @link.render().el\r
+      super()\r
+    this\r
+  \r
+  enable: () ->\r
+    @enabled = true\r
+    @show()\r
+  \r
+  disable: () ->\r
+    @enabled = false\r
+    @hide()\r
+  \r
+  hide: () ->\r
+    @set_style({display: 'none'})\r
+  \r
+  show: () ->\r
+    if @enabled\r
+      @set_style({display: 'inline'})\r
+    else\r
+      @hide()\r
+  \r
+  set_style: (style) ->\r
+    attr = {style: Pettanr.to_style(style)}\r
+    this.$el.attr(attr)\r
+    @render()\r
+  \r
+  click: () ->\r
+    @trigger('click')\r
+  \r
+class Pettanr.Views.Scroll.PlayModule.Body extends Pettanr.View\r
   tagName: 'div'\r
   \r
   initialize: (options) ->\r
     @parent = options.parent\r
     @binder = options.binder\r
     @list = options.list\r
+    @pager = options.pager\r
     @items = @list.items()\r
-    if @items.length < 1\r
-      @render_empty()\r
-    else\r
-      @render()\r
-  \r
-  render_empty: () ->\r
-    this.$el.html('')\r
-    this.$el.append((new Tag.H2({content: I18n.t('scrolls.play.empty')})).render().el)\r
-    this\r
   \r
   render: () ->\r
     this.$el.html('')\r
     # paginate(@pager)\r
-    credits = new Pettanr.Views.Scroll.PlayModule.Credits({parent: this})\r
-    panels = new Pettanr.Views.Scroll.PlayModule.Panels({\r
+    credits = new Pettanr.View.Credits(this, {icon: true})\r
+    @panels = new Pettanr.Views.Scroll.PlayModule.Panels({\r
       parent: this,\r
       binder: @binder,\r
       items: @items,\r
       credits: credits,\r
     })\r
     @listenTo(credits, 'click:credit:icon', @click_credit_icon)\r
-    this.$el.append(panels.render().el)\r
+    @listenTo(@panels, 'click:insert', @click_insert)\r
+    @listenTo(@panels, 'click:move', @click_move)\r
+    @listenTo(@panels, 'dialog:close', @close_dialog)\r
+    this.$el.append(@panels.render().el)\r
+    @append_rb()\r
+    @appender = new Pettanr.Views.Scroll.PlayModule.Append({\r
+    })\r
+    @listenTo(@appender, 'click', @click_append)\r
+    this.$el.append(@appender.render().el)\r
+    if @is_appendable()\r
+      @appender.enable()\r
+    if @pager\r
+      @listenTo(@pager, 'page', @continue)\r
+      this.$el.append(@pager.render().el)\r
     this.$el.append(credits.render().el)\r
-    rb = new Tag.RowBreak()\r
-    this.$el.append(rb.render().el)\r
-    # paginate(@pager)\r
+    @append_rb()\r
     this\r
   \r
+  is_appendable: () ->\r
+    return true if _.isEmpty(@items)\r
+    if @pager and @pager.hasNextPage()\r
+      false\r
+    else\r
+      this.$el.html('')\r
+      # paginate(@pager)\r
+      credits = new Pettanr.View.Credits(this, {icon: true})\r
+      @panels = new Pettanr.Views.Scroll.PlayModule.Panels({\r
+        parent: this,\r
+        binder: @binder,\r
+        items: @items,\r
+        credits: credits,\r
+      })\r
+      @listenTo(credits, 'click:credit:icon', @click_credit_icon)\r
+      @listenTo(@panels, 'http_get', @http_get)\r
+      @listenTo(@panels, 'click:insert', @click_insert)\r
+      @listenTo(@panels, 'click:move', @click_move)\r
+      @listenTo(@panels, 'dialog:close', @close_dialog)\r
+      @listenTo(@pager, 'page', @continue)\r
+      this.$el.append(@panels.render().el)\r
+      @append_rb()\r
+      @appender = new Pettanr.Views.Scroll.PlayModule.Append({\r
+      })\r
+      @listenTo(@appender, 'click', @click_append)\r
+      this.$el.append(@appender.render().el)\r
+      if !@pager.hasNextPage()\r
+        @appender.enable()\r
+      this.$el.append(@pager.render().el)\r
+      this.$el.append(credits.render().el)\r
+      @append_rb()\r
+      true\r
+  \r
   click_credit_icon: (item) ->\r
     @trigger('http_get', item.show_url())\r
   \r
-class Pettanr.Views.Scroll.Play extends Backbone.View\r
-  tagName: 'div'\r
-  className: 'show'\r
+  click_append: () ->\r
+    @panels.click_insert()\r
+  \r
+  http_get: (url) ->\r
+    @trigger('http_get', url)\r
+  \r
+  click_insert: (dialog) ->\r
+    @appender.hide()\r
+    @trigger('click:insert', dialog)\r
+  \r
+  click_move: (dialog) ->\r
+    @appender.hide()\r
+    @trigger('click:move', dialog)\r
+  \r
+  close_dialog: (dialog) ->\r
+    @appender.show()\r
+    @trigger('dialog:close', dialog)\r
+  \r
+  continue: (page) ->\r
+    params = _.clone(@pager.params)\r
+    params['page'] = page\r
+    continue_list = Locmare.ListGroup.list(\r
+      @list.list_group_name, @list.list_name, params\r
+    )\r
+    continue_list.open(this, {\r
+      success: (next_page_items) =>\r
+        _.each next_page_items, (scroll_panel) =>\r
+          @items.push(scroll_panel)\r
+          @panels.append_scroll_panel(scroll_panel)\r
+        @list = continue_list\r
+        continue_pager = Locmare.ListGroupModule.LibModule.PlayPager.factory(@list.page_status, params)\r
+        @listenTo(continue_pager, 'page', @continue)\r
+        @pager.$el.replaceWith(continue_pager.render().el)\r
+        @pager = continue_pager\r
+        if !@pager.hasNextPage()\r
+          @appender.enable()\r
+    })\r
+  \r
+class Pettanr.Views.Scroll.Play extends Pettanr.View.Show\r
   \r
   initialize: (options) ->\r
-    @item = options.item\r
     @list = options.list\r
-    icon_url = Pettanr.url(@item.table_name(), 'show', {id: @item.get('id')})\r
-    caption_url = Pettanr.url(@item.table_name(), 'play', {id: @item.get('id')})\r
-    prof_url = Pettanr.url(@item.table_name(), 'show', {id: @item.get('id'), format: 'prof'})\r
-    @header = new Pettanr.Views.Scroll.PlayModule.Header({\r
-      item: @item, \r
-      caption: @item.get('title'), \r
-      icon_url: icon_url,\r
-      caption_url: caption_url,\r
-      prof_url: prof_url\r
-    })\r
-    @author = new Pettanr.Views.Show.HeaderAuthor({item: @item})\r
+    @pager = options.pager\r
+    @header = new Pettanr.View.Show.Header(@item, this, @binder_header_options())\r
+    @authored_by = @item.authored_by()\r
     @body = new Pettanr.Views.Scroll.PlayModule.Body({\r
       parent: this,\r
       binder: @item,\r
       list: @list, \r
+      pager: @pager\r
     })\r
-    @owner = new Pettanr.Views.Scroll.PlayModule.Owner({item: @item})\r
+    @owner = new Pettanr.Views.Scroll.PlayModule.Owner({item: @item})\r
     @listenTo(@header, 'click:pick', @click_pick)\r
-    @listenTo(@header, 'click:icon', @click_show)\r
-    @listenTo(@header, 'click:caption', @click_show)\r
-    @listenTo(@header, 'click:prof', @click_prof)\r
+    @listenTo(@authored_by, 'click', @click_authored_by)\r
+    @listenTo(@body, 'http_get', @http_get)\r
+    @listenTo(@body, 'click:insert', @click_insert)\r
+    @listenTo(@body, 'click:move', @click_move)\r
+    @listenTo(@body, 'dialog:close', @close_dialog)\r
   \r
   render: () ->\r
     this.$el.html('')\r
     this.$el.append(@header.render().el)\r
-    this.$el.append(@author.render().el)\r
+    this.$el.append(@authored_by.render().el)\r
     this.$el.append(@body.render().el)\r
-    this.$el.append(@owner.render().el) if @item.is_own()\r
+    this.$el.append(@owner.render().el) if @item.is_own()\r
     this\r
   \r
+  click_pick: () ->\r
+    @trigger('pick', @item)\r
+  \r
+  http_get: (url) ->\r
+    @trigger('http_get', url)\r
+  \r
+  click_insert: (dialog) ->\r
+    @trigger('insert', dialog)\r
+  \r
+  click_move: (dialog) ->\r
+    @trigger('move', dialog)\r
+  \r
+  close_dialog: (dialog) ->\r
+    @trigger('dialog:close', dialog)\r
+  \r