forked from 1602/compound
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Anatoliy Chakkaev
committed
Jan 15, 2011
1 parent
78a8cbb
commit 1bc3be0
Showing
5 changed files
with
199 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
jQuery(function ($) { | ||
var csrf_token = $('meta[name=csrf-token]').attr('content'), | ||
csrf_param = $('meta[name=csrf-param]').attr('content'); | ||
|
||
$.fn.extend({ | ||
/** | ||
* Triggers a custom event on an element and returns the event result | ||
* this is used to get around not being able to ensure callbacks are placed | ||
* at the end of the chain. | ||
* | ||
* TODO: deprecate with jQuery 1.4.2 release, in favor of subscribing to our | ||
* own events and placing ourselves at the end of the chain. | ||
*/ | ||
triggerAndReturn: function (name, data) { | ||
var event = new $.Event(name); | ||
this.trigger(event, data); | ||
|
||
return event.result !== false; | ||
}, | ||
|
||
/** | ||
* Handles execution of remote calls firing overridable events along the way | ||
*/ | ||
callRemote: function () { | ||
var el = this, | ||
method = el.attr('method') || el.attr('data-method') || 'GET', | ||
url = el.attr('action') || el.attr('href'), | ||
dataType = el.attr('data-type') || 'script'; | ||
|
||
if (url === undefined) { | ||
throw "No URL specified for remote call (action or href must be present)."; | ||
} else { | ||
if (el.triggerAndReturn('ajax:before')) { | ||
var data = el.is('form') ? el.serializeArray() : []; | ||
$.ajax({ | ||
url: url, | ||
data: data, | ||
dataType: dataType, | ||
type: method.toUpperCase(), | ||
beforeSend: function (xhr) { | ||
el.trigger('ajax:loading', xhr); | ||
}, | ||
success: function (data, status, xhr) { | ||
el.trigger('ajax:success', [data, status, xhr]); | ||
}, | ||
complete: function (xhr) { | ||
el.trigger('ajax:complete', xhr); | ||
}, | ||
error: function (xhr, status, error) { | ||
el.trigger('ajax:failure', [xhr, status, error]); | ||
} | ||
}); | ||
} | ||
|
||
el.trigger('ajax:after'); | ||
} | ||
} | ||
}); | ||
|
||
/** | ||
* confirmation handler | ||
*/ | ||
$('a[data-confirm],input[data-confirm]').live('click', function () { | ||
var el = $(this); | ||
if (el.triggerAndReturn('confirm')) { | ||
if (!confirm(el.attr('data-confirm'))) { | ||
return false; | ||
} | ||
} | ||
}); | ||
|
||
|
||
/** | ||
* remote handlers | ||
*/ | ||
$('form[data-remote]').live('submit', function (e) { | ||
$(this).callRemote(); | ||
e.preventDefault(); | ||
}); | ||
|
||
$('a[data-remote],input[data-remote]').live('click', function (e) { | ||
$(this).callRemote(); | ||
e.preventDefault(); | ||
}); | ||
|
||
$('a[data-method]:not([data-remote])').live('click', function (e){ | ||
var link = $(this), | ||
href = link.attr('href'), | ||
method = link.attr('data-method'), | ||
form = $('<form method="post" action="'+href+'"></form>'), | ||
metadata_input = '<input name="_method" value="'+method+'" type="hidden" />'; | ||
|
||
if (csrf_param != null && csrf_token != null) { | ||
metadata_input += '<input name="'+csrf_param+'" value="'+csrf_token+'" type="hidden" />'; | ||
} | ||
|
||
form.hide() | ||
.append(metadata_input) | ||
.appendTo('body'); | ||
|
||
e.preventDefault(); | ||
form.submit(); | ||
}); | ||
|
||
/** | ||
* disable-with handlers | ||
*/ | ||
var disable_with_input_selector = 'input[data-disable-with]'; | ||
var disable_with_form_remote_selector = 'form[data-remote]:has(' + disable_with_input_selector + ')'; | ||
var disable_with_form_not_remote_selector = 'form:not([data-remote]):has(' + disable_with_input_selector + ')'; | ||
|
||
var disable_with_input_function = function () { | ||
$(this).find(disable_with_input_selector).each(function () { | ||
var input = $(this); | ||
input.data('enable-with', input.val()) | ||
.attr('value', input.attr('data-disable-with')) | ||
.attr('disabled', 'disabled'); | ||
}); | ||
}; | ||
|
||
$(disable_with_form_remote_selector).live('ajax:before', disable_with_input_function); | ||
$(disable_with_form_not_remote_selector).live('submit', disable_with_input_function); | ||
|
||
$(disable_with_form_remote_selector).live('ajax:complete', function () { | ||
$(this).find(disable_with_input_selector).each(function () { | ||
var input = $(this); | ||
input.removeAttr('disabled') | ||
.val(input.data('enable-with')); | ||
}); | ||
}); | ||
|
||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
/* v1.0 | 20080212 */ | ||
|
||
html, body, div, span, applet, object, iframe, | ||
h1, h2, h3, h4, h5, h6, p, blockquote, pre, | ||
a, abbr, acronym, address, big, cite, code, | ||
del, dfn, em, font, img, ins, kbd, q, s, samp, | ||
small, strike, strong, sub, sup, tt, var, | ||
b, u, i, center, | ||
dl, dt, dd, ol, ul, li, | ||
fieldset, form, label, legend, | ||
table, caption, tbody, tfoot, thead, tr, th, td { | ||
margin: 0; | ||
padding: 0; | ||
border: 0; | ||
outline: 0; | ||
font-size: 100%; | ||
vertical-align: baseline; | ||
background: transparent; | ||
} | ||
body { | ||
line-height: 1; | ||
} | ||
ol, ul { | ||
list-style: none; | ||
} | ||
blockquote, q { | ||
quotes: none; | ||
} | ||
blockquote:before, blockquote:after, | ||
q:before, q:after { | ||
content: ''; | ||
content: none; | ||
} | ||
|
||
/* remember to define focus styles! */ | ||
:focus { | ||
outline: 0; | ||
} | ||
|
||
/* remember to highlight inserts somehow! */ | ||
ins { | ||
text-decoration: none; | ||
} | ||
del { | ||
text-decoration: line-through; | ||
} | ||
|
||
/* tables still need 'cellspacing="0"' in the markup */ | ||
table { | ||
border-collapse: collapse; | ||
border-spacing: 0; | ||
} |