forked from gijs/jewel
-
Notifications
You must be signed in to change notification settings - Fork 0
/
jewel.coffee
93 lines (74 loc) · 1.93 KB
/
jewel.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
Function::clone = ->
clone = ->
for property of @
clone[property] = @[property] if @hasOwnProperty property
clone.prototype = @prototype
clone
class Jewel
@define: (selector, options = {}) ->
model = do Model.clone
model::selector = model.selector = selector
model::options = model.options = options
model.__defineGetter__ 'all', ->
do model.find
model.__defineGetter__ 'first', ->
model.find(limit: 1)[0]
model.__defineGetter__ 'last', ->
model.find(limit: 1, order: 'desc')[0]
model::model = model.model = model
model
class Model
constructor: ->
init: (element) ->
if element instanceof HTMLElement
@element = element
if @options.keys
for key of @options.keys
e = $(element).find @options.keys[key]
@[key] = e.html()
else
for key of element
@[key] = element[key]
@find: (options = {}) ->
items = $(@selector).children()
results = undefined
if items.length > 0
if options.skip or options.limit or options.order
if options.order.toLowerCase() is 'desc'
i = items.length - 1
modifier = -1
else
i = 0
modifier = 1
results = []
loop_times = 0
loop
break if loop_times >= options.limit
break if not items[i]
if loop_times >= (options.skip or -1)
model = new @model
model.init items[i]
results.push model
i += modifier
loop_times++
results = items if not results
results
fields: ->
notFields = ['init', 'save', 'remove', 'selector', 'options', 'model']
fields = {}
for key of @
fields[key] = @[key] if -1 is notFields.indexOf key
fields
save: ->
if not @element then @create() else @update()
create: ->
@element = $ @options.template @fields()
@element.prependTo @selector
update: ->
fields = @fields()
for key of fields
$(@element).find(@options.keys[key]).html(fields[key])
remove: ->
do $(@element).remove
@remove: ->
do $(@selector).remove