+ view.append button_box
+ if card.marked
+ view.addClass 'marked'
+ if card.flipped
+ view.addClass 'flipped'
+ $table.append view
+ view.draggable containment: '#table', grid: [20, 20]
+ view.bind 'dragstart', (event, ui) ->
+ view.css 'z-index': card.z = next_card_z()
+ if card.pile?
+ delete card.pile
+ update_pile_views()
+ view.bind 'dragstop', (event, ui) ->
+ p = view.position()
+ x = transform_x(p.left)
+ y = transform_y(p.top)
+ pile = find_pile x, y
+ if pile?
+ x = pile.x
+ y = pile.y
+ pile = pile.key
+ view.css {left: transform_x(x), top: transform_y(y)}
+ state.move state.agent, card.number, x, y, card.z, pile
+
+error_lag = 3
+
+outgoing_messages = []
+# message should be [agent, method, args...]
+# don't forget the agent (state.agent)
+tell_server = (message) ->
+ outgoing_messages.push message
+ send_updates()
+
+send_updates = ->
+ return if outgoing_messages.length is 0
+
+ messages = outgoing_messages
+ outgoing_messages = []
+
+ $.ajax "#{server_url}/set", {
+ cache: false
+ data: {
+ agent: state.agent
+ game: 'test' # FIXME, and in the /get call too
+ messages: JSON.stringify(messages)
+ }
+ type: 'POST'
+ dataType: 'json'
+ error: (xhr, status, error) ->
+ show_message "Network error while sending, you might want to refresh. Trying again in #{error_lag} seconds. (Status: #{status}, Error: #{error})"
+ for message in messages
+ outgoing_messages.unshift message
+ timeout error_lag * 1000, send_updates
+ error_lag *= 2
+ success: (data, status, xhr) ->
+ show_message "update sent"
+ error_lag = 3
+ }
+
+error_lag = 3
+poll_for_updates = ->
+ $.ajax "#{server_url}/get?agent=#{state.agent}&game=test", {
+ cache: false
+ type: 'GET'
+ dataType: 'json'
+ error: (xhr, status, error) ->
+ show_message "Network error, you might want to refresh. Trying again in #{error_lag} seconds. (Status: #{status}, Error: #{error})"
+ timeout error_lag * 1000, poll_for_updates
+ error_lag *= 2
+ success: (data, status, xhr) ->
+ state.process_messages data
+ timeout 100, poll_for_updates
+ error_lag = 3
+ }
+
+n_cards = (count) ->
+ return "#{count} cards" unless count is 1
+ return "1 card"
+
+initialize_cards = () ->
+ show_message 'initialize_cards'
+ $('.card').remove()
+ top_card_z = 0
+ # instantiate cards in play
+ for card in state.cards
+ delete card.view
+
+ unless piles?
+ piles = [ # global
+ {key: 'p2_draw', x: 140, y: 20, name: "Draw Pile"}
+ {key: 'p2_discard', x: 20, y: 20, name: "Discard Pile"}
+ {key: 'p1_draw', x: flip_x(140), y: flip_y(20), name: "Draw Pile"}
+ {key: 'p1_discard', x: flip_x(20), y: flip_y(20), name: "Discard Pile"}
+ ]
+ for pile in piles
+ if pile.key.substr(0, 2) is state.agent
+ css_class = 'my_card'
+ else
+ css_class = 'your_card'
+ pile.$blank = new_blank_card pile.x, pile.y, css_class
+ pile.$caption = $ $ "<div class=\"pile_caption\"><div>#{pile.name}:</div><div class=\"n_cards\">#{n_cards 0}</div></div>"
+
+ update_pile_views()
+
+# also makes sure all non-piled cards are instantiated
+update_pile_views = ->
+ ps = {}
+ for card in state.cards
+ if card.pile?
+ if ps[card.pile]?
+ ps[card.pile].total += 1
+ if card.z > ps[card.pile].top_z
+ if ps[card.pile].top_card.view?
+ uninstantiate_card ps[card.pile].top_card
+ ps[card.pile].top_card = card
+ ps[card.pile].top_z = card.z
+ else if card.view
+ uninstantiate_card card
+ else
+ ps[card.pile] = { total: 1, top_card: card, top_z: card.z }
+ else
+ # not in a pile
+ instantiate_card card unless card.view?
+
+ for pile in piles
+ # where should the caption be?
+ if ps[pile.key]?
+ unless ps[pile.key].top_card.view?
+ ps[pile.key].top_card.x = pile.x
+ ps[pile.key].top_card.y = pile.y
+ instantiate_card ps[pile.key].top_card
+ caption_dest = ps[pile.key].top_card.view
+ else
+ caption_dest = pile.$blank
+ if caption_dest isnt pile.caption_loc
+ pile.$caption.detach()
+ caption_dest.append pile.$caption
+ pile.caption_loc = caption_dest
+
+ # update caption to show correct number of cards in the pile
+ card_count = 0
+ card_count = ps[pile.key].total if ps[pile.key]?
+ pile.$caption.children('.n_cards').html n_cards card_count
+