Commit 0cbac7fa authored by 神楽坂玲奈's avatar 神楽坂玲奈

drop upload

parent 4b0eb0c4
......@@ -45,7 +45,7 @@ class Card extends Spine.Model
@fetch_by_name: (name, callback)->
$.getJSON "#{@locale_url}&q=#{JSON.stringify {name: {$regex: name.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'), $options: 'i'}}}", (langs) =>
$.getJSON "#{@locale_url}?q=#{JSON.stringify {name: {$regex: name.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'), $options: 'i'}}}", (langs) =>
result = []
cards_id = []
for lang in langs
......@@ -54,7 +54,7 @@ class Card extends Spine.Model
catch e
cards_id.push lang._id
if cards_id.length
$.getJSON "#{@url}&q=#{JSON.stringify({_id:{ $in: cards_id}})}", (cards) =>
$.getJSON "#{@url}?q=#{JSON.stringify({_id:{ $in: cards_id}})}", (cards) =>
@load cards, langs
for card in cards
result.push Card.find card._id
......@@ -65,7 +65,7 @@ class Card extends Spine.Model
@fetch_by_id: (cards_id, callback)->
cards_id = (card_id for card_id in cards_id when !Card.exists(card_id))
if cards_id.length
$.when($.getJSON("#{@url}&q=#{JSON.stringify({_id: {$in: cards_id}})}"), $.getJSON("#{@locale_url}&q=#{JSON.stringify({_id:{ $in: cards_id}})}")).done (cards, langs)=>
$.when($.getJSON("#{@url}?q=#{JSON.stringify({_id: {$in: cards_id}})}"), $.getJSON("#{@locale_url}?q=#{JSON.stringify({_id:{ $in: cards_id}})}")).done (cards, langs)=>
@load(cards[0], langs[0])
callback()
else
......@@ -84,15 +84,58 @@ class Deck extends Spine.Model
@key: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789*-="
encode: ->
result = ''
for card_usage in @main.concat @extra, @side
for card_usage in @card_usages().all()
c = card_usage.side << 29 | card_usage.count << 27 | card_usage.card_id
for i in [4..0]
result += @key.charAt((c >> i * 6) & 0x3F)
result += Deck.key.charAt((c >> i * 6) & 0x3F)
result
sort: ->
@_main = []
@_side = []
@_extra = []
@_main_count = 0
@_side_count = 0
@_extra_count = 0
@_category_count = {}
for category in Card.categories
@_category_count[category] = 0
for card_usage in @card_usages().all()
card = card_usage.card()
if card_usage.side
@_side.push card_usage
@_side_count += card_usage.count
else if (card_type for card_type in card.card_type when card_type in Card.card_types_extra).length
@_extra.push card_usage
@_extra_count += card_usage.count
else
@_main.push card_usage
@_main_count += card_usage.count
@_category_count[(category for category in card.card_type when category in Card.categories).pop()] += card_usage.count
main: ->
@sort() if !@_main?
@_main
side: ->
@sort() if !@_side?
@_side
extra: ->
@sort() if !@_extra?
@_extra
main_count: ->
@sort() if !@_main_count?
@_main_count
side_count: ->
@sort() if !@_side_count
@_side_count
extra_count: ->
@sort() if !@_extra_count
@_extra_count
category_count: ->
@sort() if !@_category_count?
@_category_count
@decode: (str, name)->
card_usages = []
result = new Deck(name: name)
result.save()
card_usages = []
for i in [0...str.length] by 5
decoded = 0
for char in str.substr(i, 5)
......@@ -103,25 +146,64 @@ class Deck extends Spine.Model
card_usages.push {id: "#{result.cid}_#{side}_#{card_id}", card_id: card_id, side: side, count: count}
result.card_usages card_usages
result
@load: (str, name)->
result = new Deck(name: name)
result.save()
card_usages = []
lines = str.split("\n")
side = false
last_id = 0
count = 0
for line in lines
if !line or line.charAt(0) == '#'
continue
else if line.substr(0,5) == '!side'
card_usages.push {card_id: last_id, side: side, count: count} if last_id
side = true
last_id = null
else
card_id = parseInt(line)
if card_id
if card_id == last_id
count++
else
card_usages.push {id: "#{result.cid}_#{side}_#{card_id}", card_id: last_id, side: side, count: count} if last_id
last_id = card_id
count = 1
else
throw '无效卡组'
card_usages.push {id: "#{result.cid}_#{side}_#{card_id}", card_id: last_id, side: side, count: count} if last_id
result.card_usages card_usages
result
class CardsController extends Spine.Controller
events:
'mouseover .card_search_result': 'show',
'click .card_search_result': 'add',
'contextmenu .card_search_result': 'minus'
add: (e)->
Deck.current.add_card($(this).tmplItem().data)
minus: (e)->
Deck.current.minus_card($(this).tmplItem().data)
show: (e)->
Deck.current.show_card($(this).tmplItem().data)
search: (name)->
Card.fetch_by_name name, (cards)=>
@html $('#cards_search_result_template').tmpl cards
location: ->
"/decks/new?name=#{@name}&cards=#{@encode()}"
location_ydk: ->
"/decks/new.ydk?name=#{@name}&cards=#{@encode()}"
url: ->
"http://my-card.in" + @location()
url_ydk: ->
"http://my-card.in" + @location_ydk()
add: (card_usage)->
if !card_usage.card_id #card
card_usage = @card_usages().findByAttribute('card_id', card.id) || new CardUsage(card_id: card.id, deck_id: deck.id, main: true, count: 0)
count = 0
for c in @card_usages().findAllByAttribute('card_id', card_usage.card_id) #TODO: alias
count += c.count
if count < 3 #TODO: lflist
card_usage.count++
card_usage.save()
minus: (card_usage)->
if !card_usage.card_id #card
card_usage = @card_usages().findByAttribute('card_id', card.id)
return if !card_usage
card_usage.count--
if card_usage.count
card_usage.save()
else
card_usage.destroy()
class DecksController extends Spine.Controller
events:
'mouseover .card_usage': 'show',
'click .card_usage': 'add',
......@@ -130,56 +212,21 @@ class DecksController extends Spine.Controller
deck: (deck) ->
if deck
@_deck = deck
@_deck.bind('change', @refresh)
@refresh(deck)
CardUsage.bind('change refresh', @refresh)
@refresh()
$('#name').html deck.name
@_deck
#constructor: ->
# super
# CardUsage.bind("refresh change", @refresh)
refresh: (deck)=>
Card.fetch_by_id (card_usage.card_id for card_usage in deck.card_usages().all()), =>
refresh: =>
Card.fetch_by_id (card_usage.card_id for card_usage in @deck().card_usages().all()), =>
@render()
render: =>
@main = []
@side = []
@extra = []
main_count = 0
side_count = 0
extra_count = 0
category_count = {}
for category in Card.categories
category_count[category] = 0
#alert @deck().card_usages()
for card_usage in @deck().card_usages().all()
card = card_usage.card()
if card_usage.side
@side.push card_usage
side_count += card_usage.count
else if (card_type for card_type in card.card_type when card_type in Card.card_types_extra).length
@extra.push card_usage
extra_count += card_usage.count
else
@main.push card_usage
main_count += card_usage.count
category_count[(category for category in card.card_type when category in Card.categories).pop()] += card_usage.count
@html $('#deck_template').tmpl({main: @main, side: @side, extra: @extra, main_count: main_count, side_count: side_count, extra_count: extra_count, category_count: category_count})
$('#search_card').html $('#search_card_template').tmpl({test: 'test'})
if $.browser.chrome
$('#deck_url_ydk').attr 'download', @deck_name + '.ydk'
$('#deck_url_ydk').attr 'href', 'data:application/x-ygopro-deck,' + encodeURI ["#generated by mycard/web"].concat(
(card_usage.card_id for i in [0...card_usage.count]).join("\r\n") for card_usage in @main,
(card_usage.card_id for i in [0...card_usage.count]).join("\r\n") for card_usage in @extra,
["!side"],
(card_usage.card_id for i in [0...card_usage.count]).join("\r\n") for card_usage in @side
).join("\r\n")
else
$('#deck_url_ydk').attr 'href', @url_ydk()
@html $('#deck_template').tmpl({main: @deck().main(), side: @deck().side(), extra: @deck().extra(), main_count: @deck().main_count(), side_count: @deck().side_count(), extra_count: @deck().extra_count(), category_count: @deck().category_count()})
@set_history()
@set_download()
###
$( ".deck_part" ).sortable(
connectWith: ".deck_part"
stop: =>
......@@ -188,7 +235,6 @@ class DecksController extends Spine.Controller
for el in $('.card_usage')
card_id = $(el).tmplItem().data.card_id
side = $(el).parent().hasClass('side')
if last_item
if last_item.card_id == card_id and last_item.side == side
last_item.count++
......@@ -198,9 +244,10 @@ class DecksController extends Spine.Controller
else
last_item = {card_id: card_id, side: side, count: 1}
card_usages.push last_item
@refresh card_usages
@set_history()
@deck().card_usages card_usages, clear: true
).disableSelection();
###
if $('.operate_area').hasClass('text')
#文字版
@el.jscroll({W: "12px", Btn:
......@@ -209,29 +256,53 @@ class DecksController extends Spine.Controller
deck_width = $('.deck_part').width()
card_width = $('.card_usage').width()
main_margin = Math.floor((deck_width - card_width * Math.max(Math.ceil(main_count/4),10)) / (Math.max(Math.ceil(main_count/4),10)-1) / 2)
main_margin = Math.floor((deck_width - card_width * Math.max(Math.ceil(@deck().main_count() / 4),10)) / (Math.max(Math.ceil(@deck().main_count() / 4),10)-1) / 2)
$('.deck_part.main').css {'margin-left': -main_margin, 'margin-right': -main_margin}
$('.deck_part.main .card_usage').css {'margin-left': main_margin, 'margin-right': main_margin}
side_margin = Math.floor((deck_width - card_width * Math.max(side_count,10)) / (Math.max(side_count,10)-1) / 2)
side_margin = Math.floor((deck_width - card_width * Math.max(@deck().side_count(),10)) / (Math.max(@deck().side_count(),10)-1) / 2)
$('.deck_part.side').css {'margin-left': -side_margin, 'padding-right': -side_margin}
$('.deck_part.side .card_usage').css {'margin-left': side_margin, 'margin-right': side_margin}
extra_margin = Math.floor((deck_width - card_width * Math.max(extra_count,10)) / (Math.max(extra_count,10)-1) / 2)
extra_margin = Math.floor((deck_width - card_width * Math.max(@deck().extra_count(),10)) / (Math.max(@deck().extra_count(),10)-1) / 2)
$('.deck_part.extra').css {'margin-left': -extra_margin, 'padding-right': -extra_margin}
$('.deck_part.extra .card_usage').css {'margin-left': extra_margin, 'margin-right': extra_margin}
location: ->
"/decks/new?name=#{@deck_name}&cards=#{@encode()}"
location_ydk: ->
"/decks/new.ydk?name=#{@deck_name}&cards=#{@encode()}"
url: ->
"http://my-card.in" + @location()
url_ydk: ->
"http://my-card.in" + @location_ydk()
upload: (files)->
file = files[0]
reader = new FileReader()
$('#deck_load').attr 'disabled', true if file
reader.onload = (ev)->
$('#deck_load').attr 'disabled', false
try
decks.deck Deck.load(ev.target.result, file.name.split('.')[0])
catch error
alert error
reader.readAsText(file)
load_from_url: (url)->
try
decks.deck Deck.decode $.url(url).param('cards'), $.url().param('name')
catch error
alert error
set_history: ->
history.pushState(CardUsage.toJSON(), @deck_name, @location())
history.pushState(CardUsage.toJSON(), @deck().name, @deck().location()) unless @deck().location() == $.url().attr('relative')
set_download: ->
if $.browser.chrome
$('#deck_url_ydk').attr 'download', @deck().name + '.ydk'
$('#deck_url_ydk').attr 'href', 'data:application/x-ygopro-deck,' + encodeURI ["#generated by mycard/web"].concat(
(card_usage.card_id for i in [0...card_usage.count]).join("\r\n") for card_usage in @deck().main(),
(card_usage.card_id for i in [0...card_usage.count]).join("\r\n") for card_usage in @deck().extra(),
["!side"],
(card_usage.card_id for i in [0...card_usage.count]).join("\r\n") for card_usage in @deck().side()
).join("\r\n")
else
$('#deck_url_ydk').attr 'href', @url_ydk()
@tab_control: ->
$(".bottom_area div").click ->
......@@ -254,86 +325,55 @@ class DecksController extends Spine.Controller
$('.bottom_area div').eq(active_page_index).addClass('bottom_button_active').removeClass("bottom_button")
DecksController.tab_control()
add: (e)->
card_usage = $(e.target).tmplItem().data
count = 0
for c in CardUsage.findAllByAttribute('card_id', card_usage.card_id) #TODO: alias
count += c.count
if count < 3 #TODO: lflist
card_usage.count++
card_usage.save()
@set_history()
add_card: (card)->
card_usage = CardUsage.findByAttribute('card_id', card.id) || new CardUsage(card_id: card.id, main: true, count: 0)
count = 0
for c in CardUsage.findAllByAttribute('card_id', card_usage.card_id) #TODO: alias
count += c.count
if count < 3 #TODO: lflist
card_usage.count++
card_usage.save()
@set_history()
@deck().add $(e.target).tmplItem().data
minus: (e)->
e.preventDefault()
card_usage = $(e.target).tmplItem().data
card_usage.count--
if card_usage.count
card_usage.save()
else
card_usage.destroy()
@set_history()
minus_card: (card)->
e.preventDefault()
card_usage = CardUsage.findByAttribute('card_id', card.id)
return unless card_usage
card_usage.count--
if card_usage.count
card_usage.save()
else
card_usage.destroy()
@set_history()
@deck().minus $(e.target).tmplItem().data
class CardsController extends Spine.Controller
events:
'mouseover .card_search_result': 'show',
'click .card_search_result': 'add',
'contextmenu .card_search_result': 'minus'
add: (e)->
decks.deck().add($(this).tmplItem().data)
minus: (e)->
decks.deck().minus($(this).tmplItem().data)
show: (e)->
decks.show_card($(this).tmplItem().data)
search: (name)->
Card.fetch_by_name name, (cards)=>
@html $('#cards_search_result_template').tmpl cards
class CardsSearchController extends Spine.Controller
decks = new DecksController(el: $("#deck"))
cards = new CardsController(el: $("#cards_search"))
$(document).ready ->
$('#name').html $.url().param('name')
$("#deck_share_dialog").dialog
modal: true
autoOpen: false
addthis.init()
$.i18n.properties
name: 'card'
path: '/locales/'
mode: 'map'
cache: true
callback: ->
decks.load_from_url()
@decks = new DecksController(el: $("#deck"))
#@decks.tab_control()
@cards_search = new CardsSearchController(el: $("#cards_search"))
@decks.deck Deck.decode $.url().param('cards'), $.url().param('name')
#search
$('#search').submit ->
cards_search.search $('.search_input').val()
cards.search $('.search_input').val()
return false
#share
$('#deck_share').click ->
$("#deck_url").val deck.url()
$("#deck_url_qrcode").attr 'src', 'https://chart.googleapis.com/chart?chs=200x200&cht=qr&chld=|0&chl=' + encodeURIComponent(deck.url())
$("#deck_url_qrcode").attr 'src', 'https://chart.googleapis.com/chart?chs=200x200&cht=qr&chld=|0&chl=' + encodeURIComponent(decks.deck().url())
$("#deck_share_dialog").dialog('open')
$('#deck_url_shorten').click ->
$('#deck_url_shorten').attr "disabled",true
$.ajax
url: 'https://www.googleapis.com/urlshortener/v1/url'
type: 'POST'
data: JSON.stringify {longUrl: deck.url()}
data: JSON.stringify {longUrl: decks.deck().url()}
contentType: 'application/json; charset=utf-8'
success: (data)->
$("#deck_url").val data.id
......@@ -341,46 +381,22 @@ $(document).ready ->
#upload
$('#deck_load').change ->
file = @files[0]
reader = new FileReader()
$('#deck_load').attr 'disabled', true if file
reader.onload = (ev)->
$('#deck_load').attr 'disabled', false
result = []
lines = ev.target.result.split("\n")
side = false
last_id = 0
count = 0
for line in lines
if !line or line.charAt(0) == '#'
continue
else if line.substr(0,5) == '!side'
result.push {card_id: last_id, side: side, count: count} if last_id
side = true
last_id = null
else
card_id = parseInt(line)
if card_id
if card_id == last_id
count++
else
result.push {card_id: last_id, side: side, count: count} if last_id
last_id = card_id
count = 1
else
alert('无效卡组')
return
result.push {card_id: last_id, side: side, count: count} if last_id
$('#name').html deck.deck_name = file.name.split('.')[0]
deck.refresh result
deck.set_history()
reader.readAsText(file)
decks.upload(@files)
window.addEventListener 'popstate', (ev)->
if ev.state
deck.refresh ev.state, false
$('.main_div').bind 'drop', (ev)->
decks.upload event.dataTransfer.files
false
$(".rename_ope").click ->
$(".text,.graphic").toggleClass("graphic text")
deck.render()
decks.render()
$("#deck_share_dialog").dialog
modal: true
autoOpen: false
addthis.init()
\ No newline at end of file
// Generated by CoffeeScript 1.4.0
(function() {
var Card, CardUsage, CardsController, CardsSearchController, Deck, DecksController, locale,
var Card, CardUsage, CardsController, Deck, DecksController, cards, decks, locale,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
locale = 'zh';
......@@ -102,7 +102,7 @@
Card.fetch_by_name = function(name, callback) {
var _this = this;
return $.getJSON("" + this.locale_url + "&q=" + (JSON.stringify({
return $.getJSON("" + this.locale_url + "?q=" + (JSON.stringify({
name: {
$regex: name.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'),
$options: 'i'
......@@ -120,7 +120,7 @@
}
}
if (cards_id.length) {
return $.getJSON("" + _this.url + "&q=" + (JSON.stringify({
return $.getJSON("" + _this.url + "?q=" + (JSON.stringify({
_id: {
$in: cards_id
}
......@@ -154,11 +154,11 @@
return _results;
})();
if (cards_id.length) {
return $.when($.getJSON("" + this.url + "&q=" + (JSON.stringify({
return $.when($.getJSON("" + this.url + "?q=" + (JSON.stringify({
_id: {
$in: cards_id
}
}))), $.getJSON("" + this.locale_url + "&q=" + (JSON.stringify({
}))), $.getJSON("" + this.locale_url + "?q=" + (JSON.stringify({
_id: {
$in: cards_id
}
......@@ -210,24 +210,129 @@
Deck.prototype.encode = function() {
var c, card_usage, i, result, _i, _j, _len, _ref;
result = '';
_ref = this.main.concat(this.extra, this.side);
_ref = this.card_usages().all();
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
card_usage = _ref[_i];
c = card_usage.side << 29 | card_usage.count << 27 | card_usage.card_id;
for (i = _j = 4; _j >= 0; i = --_j) {
result += this.key.charAt((c >> i * 6) & 0x3F);
result += Deck.key.charAt((c >> i * 6) & 0x3F);
}
}
return result;
};
Deck.prototype.sort = function() {
var card, card_type, card_usage, category, _i, _j, _len, _len1, _ref, _ref1, _results;
this._main = [];
this._side = [];
this._extra = [];
this._main_count = 0;
this._side_count = 0;
this._extra_count = 0;
this._category_count = {};
_ref = Card.categories;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
category = _ref[_i];
this._category_count[category] = 0;
}
_ref1 = this.card_usages().all();
_results = [];
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
card_usage = _ref1[_j];
card = card_usage.card();
if (card_usage.side) {
this._side.push(card_usage);
_results.push(this._side_count += card_usage.count);
} else if (((function() {
var _k, _len2, _ref2, _results1;
_ref2 = card.card_type;
_results1 = [];
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
card_type = _ref2[_k];
if (__indexOf.call(Card.card_types_extra, card_type) >= 0) {
_results1.push(card_type);
}
}
return _results1;
})()).length) {
this._extra.push(card_usage);
_results.push(this._extra_count += card_usage.count);
} else {
this._main.push(card_usage);
this._main_count += card_usage.count;
_results.push(this._category_count[((function() {
var _k, _len2, _ref2, _results1;
_ref2 = card.card_type;
_results1 = [];
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
category = _ref2[_k];
if (__indexOf.call(Card.categories, category) >= 0) {
_results1.push(category);
}
}
return _results1;
})()).pop()] += card_usage.count);
}
}
return _results;
};
Deck.prototype.main = function() {
if (!(this._main != null)) {
this.sort();
}
return this._main;
};
Deck.prototype.side = function() {
if (!(this._side != null)) {
this.sort();
}
return this._side;
};
Deck.prototype.extra = function() {
if (!(this._extra != null)) {
this.sort();
}
return this._extra;
};
Deck.prototype.main_count = function() {
if (!(this._main_count != null)) {
this.sort();
}
return this._main_count;
};
Deck.prototype.side_count = function() {
if (!this._side_count) {
this.sort();
}
return this._side_count;
};
Deck.prototype.extra_count = function() {
if (!this._extra_count) {
this.sort();
}
return this._extra_count;
};
Deck.prototype.category_count = function() {
if (!(this._category_count != null)) {
this.sort();
}
return this._category_count;
};
Deck.decode = function(str, name) {
var card_id, card_usages, char, count, decoded, i, result, side, _i, _j, _len, _ref, _ref1;
card_usages = [];
result = new Deck({
name: name
});
result.save();
card_usages = [];
for (i = _i = 0, _ref = str.length; _i < _ref; i = _i += 5) {
decoded = 0;
_ref1 = str.substr(i, 5);
......@@ -249,46 +354,121 @@
return result;
};
return Deck;
})(Spine.Model);
CardsController = (function(_super) {
__extends(CardsController, _super);
function CardsController() {
return CardsController.__super__.constructor.apply(this, arguments);
Deck.load = function(str, name) {
var card_id, card_usages, count, last_id, line, lines, result, side, _i, _len;
result = new Deck({
name: name
});
result.save();
card_usages = [];
lines = str.split("\n");
side = false;
last_id = 0;
count = 0;
for (_i = 0, _len = lines.length; _i < _len; _i++) {
line = lines[_i];
if (!line || line.charAt(0) === '#') {
continue;
} else if (line.substr(0, 5) === '!side') {
if (last_id) {
card_usages.push({
card_id: last_id,
side: side,
count: count
});
}
side = true;
last_id = null;
} else {
card_id = parseInt(line);
if (card_id) {
if (card_id === last_id) {
count++;
} else {
if (last_id) {
card_usages.push({
id: "" + result.cid + "_" + side + "_" + card_id,
card_id: last_id,
side: side,
count: count
});
}
last_id = card_id;
count = 1;
}
} else {
throw '无效卡组';
}
}
}
if (last_id) {
card_usages.push({
id: "" + result.cid + "_" + side + "_" + card_id,
card_id: last_id,
side: side,
count: count
});
}
result.card_usages(card_usages);
return result;
};
CardsController.prototype.events = {
'mouseover .card_search_result': 'show',
'click .card_search_result': 'add',
'contextmenu .card_search_result': 'minus'
Deck.prototype.location = function() {
return "/decks/new?name=" + this.name + "&cards=" + (this.encode());
};
CardsController.prototype.add = function(e) {
return Deck.current.add_card($(this).tmplItem().data);
Deck.prototype.location_ydk = function() {
return "/decks/new.ydk?name=" + this.name + "&cards=" + (this.encode());
};
CardsController.prototype.minus = function(e) {
return Deck.current.minus_card($(this).tmplItem().data);
Deck.prototype.url = function() {
return "http://my-card.in" + this.location();
};
CardsController.prototype.show = function(e) {
return Deck.current.show_card($(this).tmplItem().data);
Deck.prototype.url_ydk = function() {
return "http://my-card.in" + this.location_ydk();
};
CardsController.prototype.search = function(name) {
var _this = this;
return Card.fetch_by_name(name, function(cards) {
return _this.html($('#cards_search_result_template').tmpl(cards));
Deck.prototype.add = function(card_usage) {
var c, count, _i, _len, _ref;
if (!card_usage.card_id) {
card_usage = this.card_usages().findByAttribute('card_id', card.id) || new CardUsage({
card_id: card.id,
deck_id: deck.id,
main: true,
count: 0
});
}
count = 0;
_ref = this.card_usages().findAllByAttribute('card_id', card_usage.card_id);
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
c = _ref[_i];
count += c.count;
}
if (count < 3) {
card_usage.count++;
return card_usage.save();
}
};
return CardsController;
Deck.prototype.minus = function(card_usage) {
if (!card_usage.card_id) {
card_usage = this.card_usages().findByAttribute('card_id', card.id);
}
if (!card_usage) {
return;
}
card_usage.count--;
if (card_usage.count) {
return card_usage.save();
} else {
return card_usage.destroy();
}
};
})(Spine.Controller);
return Deck;
})(Spine.Model);
DecksController = (function(_super) {
......@@ -310,183 +490,65 @@
DecksController.prototype.deck = function(deck) {
if (deck) {
this._deck = deck;
this._deck.bind('change', this.refresh);
this.refresh(deck);
CardUsage.bind('change refresh', this.refresh);
this.refresh();
$('#name').html(deck.name);
}
return this._deck;
};
DecksController.prototype.refresh = function(deck) {
DecksController.prototype.refresh = function() {
var card_usage,
_this = this;
return Card.fetch_by_id((function() {
var _i, _len, _ref, _results;
_ref = deck.card_usages().all();
_ref = this.deck().card_usages().all();
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
card_usage = _ref[_i];
_results.push(card_usage.card_id);
}
return _results;
})(), function() {
}).call(this), function() {
return _this.render();
});
};
DecksController.prototype.render = function() {
var card, card_type, card_usage, card_width, category, category_count, deck_width, extra_count, extra_margin, i, main_count, main_margin, side_count, side_margin, _i, _j, _len, _len1, _ref, _ref1,
_this = this;
this.main = [];
this.side = [];
this.extra = [];
main_count = 0;
side_count = 0;
extra_count = 0;
category_count = {};
_ref = Card.categories;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
category = _ref[_i];
category_count[category] = 0;
}
_ref1 = this.deck().card_usages().all();
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
card_usage = _ref1[_j];
card = card_usage.card();
if (card_usage.side) {
this.side.push(card_usage);
side_count += card_usage.count;
} else if (((function() {
var _k, _len2, _ref2, _results;
_ref2 = card.card_type;
_results = [];
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
card_type = _ref2[_k];
if (__indexOf.call(Card.card_types_extra, card_type) >= 0) {
_results.push(card_type);
}
}
return _results;
})()).length) {
this.extra.push(card_usage);
extra_count += card_usage.count;
} else {
this.main.push(card_usage);
main_count += card_usage.count;
category_count[((function() {
var _k, _len2, _ref2, _results;
_ref2 = card.card_type;
_results = [];
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
category = _ref2[_k];
if (__indexOf.call(Card.categories, category) >= 0) {
_results.push(category);
}
}
return _results;
})()).pop()] += card_usage.count;
}
}
var card_width, deck_width, extra_margin, main_margin, side_margin;
this.html($('#deck_template').tmpl({
main: this.main,
side: this.side,
extra: this.extra,
main_count: main_count,
side_count: side_count,
extra_count: extra_count,
category_count: category_count
main: this.deck().main(),
side: this.deck().side(),
extra: this.deck().extra(),
main_count: this.deck().main_count(),
side_count: this.deck().side_count(),
extra_count: this.deck().extra_count(),
category_count: this.deck().category_count()
}));
$('#search_card').html($('#search_card_template').tmpl({
test: 'test'
}));
if ($.browser.chrome) {
$('#deck_url_ydk').attr('download', this.deck_name + '.ydk');
$('#deck_url_ydk').attr('href', 'data:application/x-ygopro-deck,' + encodeURI(["#generated by mycard/web"].concat((function() {
var _k, _len2, _ref2, _results;
_ref2 = this.main;
_results = [];
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
card_usage = _ref2[_k];
_results.push(((function() {
var _l, _ref3, _results1;
_results1 = [];
for (i = _l = 0, _ref3 = card_usage.count; 0 <= _ref3 ? _l < _ref3 : _l > _ref3; i = 0 <= _ref3 ? ++_l : --_l) {
_results1.push(card_usage.card_id);
}
return _results1;
})()).join("\r\n"));
}
return _results;
}).call(this), (function() {
var _k, _len2, _ref2, _results;
_ref2 = this.extra;
_results = [];
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
card_usage = _ref2[_k];
_results.push(((function() {
var _l, _ref3, _results1;
_results1 = [];
for (i = _l = 0, _ref3 = card_usage.count; 0 <= _ref3 ? _l < _ref3 : _l > _ref3; i = 0 <= _ref3 ? ++_l : --_l) {
_results1.push(card_usage.card_id);
}
return _results1;
})()).join("\r\n"));
}
return _results;
}).call(this), ["!side"], (function() {
var _k, _len2, _ref2, _results;
_ref2 = this.side;
_results = [];
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
card_usage = _ref2[_k];
_results.push(((function() {
var _l, _ref3, _results1;
_results1 = [];
for (i = _l = 0, _ref3 = card_usage.count; 0 <= _ref3 ? _l < _ref3 : _l > _ref3; i = 0 <= _ref3 ? ++_l : --_l) {
_results1.push(card_usage.card_id);
}
return _results1;
})()).join("\r\n"));
}
return _results;
}).call(this)).join("\r\n")));
} else {
$('#deck_url_ydk').attr('href', this.url_ydk());
}
$(".deck_part").sortable({
connectWith: ".deck_part",
stop: function() {
var card_id, card_usages, el, last_item, side, _k, _len2, _ref2;
card_usages = [];
last_item = null;
_ref2 = $('.card_usage');
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
el = _ref2[_k];
card_id = $(el).tmplItem().data.card_id;
side = $(el).parent().hasClass('side');
if (last_item) {
if (last_item.card_id === card_id && last_item.side === side) {
last_item.count++;
} else {
card_usages.push(last_item);
last_item = {
card_id: card_id,
side: side,
count: 1
};
}
} else {
last_item = {
card_id: card_id,
side: side,
count: 1
};
}
}
card_usages.push(last_item);
_this.refresh(card_usages);
return _this.set_history();
}
}).disableSelection();
this.set_history();
this.set_download();
/*
$( ".deck_part" ).sortable(
connectWith: ".deck_part"
stop: =>
card_usages = []
last_item = null
for el in $('.card_usage')
card_id = $(el).tmplItem().data.card_id
side = $(el).parent().hasClass('side')
if last_item
if last_item.card_id == card_id and last_item.side == side
last_item.count++
else
card_usages.push last_item
last_item = {card_id: card_id, side: side, count: 1}
else
last_item = {card_id: card_id, side: side, count: 1}
card_usages.push last_item
@deck().card_usages card_usages, clear: true
).disableSelection();
*/
if ($('.operate_area').hasClass('text')) {
return this.el.jscroll({
W: "12px",
......@@ -497,7 +559,7 @@
} else {
deck_width = $('.deck_part').width();
card_width = $('.card_usage').width();
main_margin = Math.floor((deck_width - card_width * Math.max(Math.ceil(main_count / 4), 10)) / (Math.max(Math.ceil(main_count / 4), 10) - 1) / 2);
main_margin = Math.floor((deck_width - card_width * Math.max(Math.ceil(this.deck().main_count() / 4), 10)) / (Math.max(Math.ceil(this.deck().main_count() / 4), 10) - 1) / 2);
$('.deck_part.main').css({
'margin-left': -main_margin,
'margin-right': -main_margin
......@@ -506,7 +568,7 @@
'margin-left': main_margin,
'margin-right': main_margin
});
side_margin = Math.floor((deck_width - card_width * Math.max(side_count, 10)) / (Math.max(side_count, 10) - 1) / 2);
side_margin = Math.floor((deck_width - card_width * Math.max(this.deck().side_count(), 10)) / (Math.max(this.deck().side_count(), 10) - 1) / 2);
$('.deck_part.side').css({
'margin-left': -side_margin,
'padding-right': -side_margin
......@@ -515,7 +577,7 @@
'margin-left': side_margin,
'margin-right': side_margin
});
extra_margin = Math.floor((deck_width - card_width * Math.max(extra_count, 10)) / (Math.max(extra_count, 10) - 1) / 2);
extra_margin = Math.floor((deck_width - card_width * Math.max(this.deck().extra_count(), 10)) / (Math.max(this.deck().extra_count(), 10) - 1) / 2);
$('.deck_part.extra').css({
'margin-left': -extra_margin,
'padding-right': -extra_margin
......@@ -527,24 +589,94 @@
}
};
DecksController.prototype.location = function() {
return "/decks/new?name=" + this.deck_name + "&cards=" + (this.encode());
DecksController.prototype.upload = function(files) {
var file, reader;
file = files[0];
reader = new FileReader();
if (file) {
$('#deck_load').attr('disabled', true);
}
reader.onload = function(ev) {
$('#deck_load').attr('disabled', false);
try {
return decks.deck(Deck.load(ev.target.result, file.name.split('.')[0]));
} catch (error) {
return alert(error);
}
};
DecksController.prototype.location_ydk = function() {
return "/decks/new.ydk?name=" + this.deck_name + "&cards=" + (this.encode());
return reader.readAsText(file);
};
DecksController.prototype.url = function() {
return "http://my-card.in" + this.location();
DecksController.prototype.load_from_url = function(url) {
try {
return decks.deck(Deck.decode($.url(url).param('cards'), $.url().param('name')));
} catch (error) {
return alert(error);
}
};
DecksController.prototype.url_ydk = function() {
return "http://my-card.in" + this.location_ydk();
DecksController.prototype.set_history = function() {
if (this.deck().location() !== $.url().attr('relative')) {
return history.pushState(CardUsage.toJSON(), this.deck().name, this.deck().location());
}
};
DecksController.prototype.set_history = function() {
return history.pushState(CardUsage.toJSON(), this.deck_name, this.location());
DecksController.prototype.set_download = function() {
var card_usage, i;
if ($.browser.chrome) {
$('#deck_url_ydk').attr('download', this.deck().name + '.ydk');
return $('#deck_url_ydk').attr('href', 'data:application/x-ygopro-deck,' + encodeURI(["#generated by mycard/web"].concat((function() {
var _i, _len, _ref, _results;
_ref = this.deck().main();
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
card_usage = _ref[_i];
_results.push(((function() {
var _j, _ref1, _results1;
_results1 = [];
for (i = _j = 0, _ref1 = card_usage.count; 0 <= _ref1 ? _j < _ref1 : _j > _ref1; i = 0 <= _ref1 ? ++_j : --_j) {
_results1.push(card_usage.card_id);
}
return _results1;
})()).join("\r\n"));
}
return _results;
}).call(this), (function() {
var _i, _len, _ref, _results;
_ref = this.deck().extra();
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
card_usage = _ref[_i];
_results.push(((function() {
var _j, _ref1, _results1;
_results1 = [];
for (i = _j = 0, _ref1 = card_usage.count; 0 <= _ref1 ? _j < _ref1 : _j > _ref1; i = 0 <= _ref1 ? ++_j : --_j) {
_results1.push(card_usage.card_id);
}
return _results1;
})()).join("\r\n"));
}
return _results;
}).call(this), ["!side"], (function() {
var _i, _len, _ref, _results;
_ref = this.deck().side();
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
card_usage = _ref[_i];
_results.push(((function() {
var _j, _ref1, _results1;
_results1 = [];
for (i = _j = 0, _ref1 = card_usage.count; 0 <= _ref1 ? _j < _ref1 : _j > _ref1; i = 0 <= _ref1 ? ++_j : --_j) {
_results1.push(card_usage.card_id);
}
return _results1;
})()).join("\r\n"));
}
return _results;
}).call(this)).join("\r\n")));
} else {
return $('#deck_url_ydk').attr('href', this.url_ydk());
}
};
DecksController.tab_control = function() {
......@@ -582,113 +714,78 @@
};
DecksController.prototype.add = function(e) {
var c, card_usage, count, _i, _len, _ref;
card_usage = $(e.target).tmplItem().data;
count = 0;
_ref = CardUsage.findAllByAttribute('card_id', card_usage.card_id);
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
c = _ref[_i];
count += c.count;
}
if (count < 3) {
card_usage.count++;
card_usage.save();
}
return this.set_history();
};
DecksController.prototype.add_card = function(card) {
var c, card_usage, count, _i, _len, _ref;
card_usage = CardUsage.findByAttribute('card_id', card.id) || new CardUsage({
card_id: card.id,
main: true,
count: 0
});
count = 0;
_ref = CardUsage.findAllByAttribute('card_id', card_usage.card_id);
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
c = _ref[_i];
count += c.count;
}
if (count < 3) {
card_usage.count++;
card_usage.save();
}
return this.set_history();
return this.deck().add($(e.target).tmplItem().data);
};
DecksController.prototype.minus = function(e) {
var card_usage;
e.preventDefault();
card_usage = $(e.target).tmplItem().data;
card_usage.count--;
if (card_usage.count) {
card_usage.save();
} else {
card_usage.destroy();
}
return this.set_history();
};
DecksController.prototype.minus_card = function(card) {
var card_usage;
e.preventDefault();
card_usage = CardUsage.findByAttribute('card_id', card.id);
if (!card_usage) {
return;
}
card_usage.count--;
if (card_usage.count) {
card_usage.save();
} else {
card_usage.destroy();
}
return this.set_history();
return this.deck().minus($(e.target).tmplItem().data);
};
return DecksController;
})(Spine.Controller);
CardsSearchController = (function(_super) {
CardsController = (function(_super) {
__extends(CardsSearchController, _super);
__extends(CardsController, _super);
function CardsSearchController() {
return CardsSearchController.__super__.constructor.apply(this, arguments);
function CardsController() {
return CardsController.__super__.constructor.apply(this, arguments);
}
return CardsSearchController;
CardsController.prototype.events = {
'mouseover .card_search_result': 'show',
'click .card_search_result': 'add',
'contextmenu .card_search_result': 'minus'
};
CardsController.prototype.add = function(e) {
return decks.deck().add($(this).tmplItem().data);
};
CardsController.prototype.minus = function(e) {
return decks.deck().minus($(this).tmplItem().data);
};
CardsController.prototype.show = function(e) {
return decks.show_card($(this).tmplItem().data);
};
CardsController.prototype.search = function(name) {
var _this = this;
return Card.fetch_by_name(name, function(cards) {
return _this.html($('#cards_search_result_template').tmpl(cards));
});
};
return CardsController;
})(Spine.Controller);
$(document).ready(function() {
$('#name').html($.url().param('name'));
$("#deck_share_dialog").dialog({
modal: true,
autoOpen: false
decks = new DecksController({
el: $("#deck")
});
addthis.init();
return $.i18n.properties({
cards = new CardsController({
el: $("#cards_search")
});
$(document).ready(function() {
$.i18n.properties({
name: 'card',
path: '/locales/',
mode: 'map',
cache: true,
callback: function() {
this.decks = new DecksController({
el: $("#deck")
});
this.cards_search = new CardsSearchController({
el: $("#cards_search")
});
this.decks.deck(Deck.decode($.url().param('cards'), $.url().param('name')));
decks.load_from_url();
$('#search').submit(function() {
cards_search.search($('.search_input').val());
cards.search($('.search_input').val());
return false;
});
$('#deck_share').click(function() {
$("#deck_url").val(deck.url());
$("#deck_url_qrcode").attr('src', 'https://chart.googleapis.com/chart?chs=200x200&cht=qr&chld=|0&chl=' + encodeURIComponent(deck.url()));
$("#deck_url_qrcode").attr('src', 'https://chart.googleapis.com/chart?chs=200x200&cht=qr&chld=|0&chl=' + encodeURIComponent(decks.deck().url()));
return $("#deck_share_dialog").dialog('open');
});
$('#deck_url_shorten').click(function() {
......@@ -697,7 +794,7 @@
url: 'https://www.googleapis.com/urlshortener/v1/url',
type: 'POST',
data: JSON.stringify({
longUrl: deck.url()
longUrl: decks.deck().url()
}),
contentType: 'application/json; charset=utf-8',
success: function(data) {
......@@ -707,80 +804,28 @@
});
});
$('#deck_load').change(function() {
var file, reader;
file = this.files[0];
reader = new FileReader();
if (file) {
$('#deck_load').attr('disabled', true);
}
reader.onload = function(ev) {
var card_id, count, last_id, line, lines, result, side, _i, _len;
$('#deck_load').attr('disabled', false);
result = [];
lines = ev.target.result.split("\n");
side = false;
last_id = 0;
count = 0;
for (_i = 0, _len = lines.length; _i < _len; _i++) {
line = lines[_i];
if (!line || line.charAt(0) === '#') {
continue;
} else if (line.substr(0, 5) === '!side') {
if (last_id) {
result.push({
card_id: last_id,
side: side,
count: count
});
}
side = true;
last_id = null;
} else {
card_id = parseInt(line);
if (card_id) {
if (card_id === last_id) {
count++;
} else {
if (last_id) {
result.push({
card_id: last_id,
side: side,
count: count
});
}
last_id = card_id;
count = 1;
}
} else {
alert('无效卡组');
return;
}
}
}
if (last_id) {
result.push({
card_id: last_id,
side: side,
count: count
});
}
$('#name').html(deck.deck_name = file.name.split('.')[0]);
deck.refresh(result);
return deck.set_history();
};
return reader.readAsText(file);
return decks.upload(this.files);
});
window.addEventListener('popstate', function(ev) {
if (ev.state) {
return deck.refresh(ev.state, false);
}
});
$('.main_div').bind('drop', function(ev) {
decks.upload(event.dataTransfer.files);
return false;
});
return $(".rename_ope").click(function() {
$(".text,.graphic").toggleClass("graphic text");
return deck.render();
return decks.render();
});
}
});
$("#deck_share_dialog").dialog({
modal: true,
autoOpen: false
});
return addthis.init();
});
}).call(this);
......@@ -27,7 +27,7 @@
<script src="/vendor/javascripts/less-1.3.1.min.js"></script>
<script id="card_template" type="text/x-jquery-tmpl">
<div id="card_name" class="card_name">${name}</div>
<div id="card_name" class="card_name"><a href="http://www.ourocg.cn/S.aspx?key=${name}">${name}</a></div>
<div class="card_img line floatleft">
<img id="card_image" height="187px" width="130px" src="http://my-card.in/images/cards/ygocore/${id}.jpg" alt="card_name"/>
</div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment