Files
2025-02-26 14:49:25 +07:00

880 lines
87 KiB
JavaScript

//////////////////////////////////////////////////////////////////////////
// //
// This is a generated file. You can view the original //
// source in your browser if your browser supports source maps. //
// Source maps are supported by all recent versions of Chrome, Safari, //
// and Firefox, and by Internet Explorer 11. //
// //
//////////////////////////////////////////////////////////////////////////
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var $ = Package.jquery.$;
var jQuery = Package.jquery.jQuery;
(function(){
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/amplify/packages/amplify.js //
// //
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
(function () {
///////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/amplify/amplify.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////
//
/*! // 1
* Amplify 1.1.2 // 2
* // 3
* Copyright 2011 - 2013 appendTo LLC. (http://appendto.com/team) // 4
* Dual licensed under the MIT or GPL licenses. // 5
* http://appendto.com/open-source-licenses // 6
* // 7
* http://amplifyjs.com // 8
*/ // 9
(function( global, undefined ) { // 10
// 11
var slice = [].slice, // 12
subscriptions = {}; // 13
// 14
var amplify = global.amplify = { // 15
publish: function( topic ) { // 16
if ( typeof topic !== "string" ) { // 17
throw new Error( "You must provide a valid topic to publish." ); // 18
} // 19
// 20
var args = slice.call( arguments, 1 ), // 21
topicSubscriptions, // 22
subscription, // 23
length, // 24
i = 0, // 25
ret; // 26
// 27
if ( !subscriptions[ topic ] ) { // 28
return true; // 29
} // 30
// 31
topicSubscriptions = subscriptions[ topic ].slice(); // 32
for ( length = topicSubscriptions.length; i < length; i++ ) { // 33
subscription = topicSubscriptions[ i ]; // 34
ret = subscription.callback.apply( subscription.context, args ); // 35
if ( ret === false ) { // 36
break; // 37
} // 38
} // 39
return ret !== false; // 40
}, // 41
// 42
subscribe: function( topic, context, callback, priority ) { // 43
if ( typeof topic !== "string" ) { // 44
throw new Error( "You must provide a valid topic to create a subscription." ); // 45
} // 46
// 47
if ( arguments.length === 3 && typeof callback === "number" ) { // 48
priority = callback; // 49
callback = context; // 50
context = null; // 51
} // 52
if ( arguments.length === 2 ) { // 53
callback = context; // 54
context = null; // 55
} // 56
priority = priority || 10; // 57
// 58
var topicIndex = 0, // 59
topics = topic.split( /\s/ ), // 60
topicLength = topics.length, // 61
added; // 62
for ( ; topicIndex < topicLength; topicIndex++ ) { // 63
topic = topics[ topicIndex ]; // 64
added = false; // 65
if ( !subscriptions[ topic ] ) { // 66
subscriptions[ topic ] = []; // 67
} // 68
// 69
var i = subscriptions[ topic ].length - 1, // 70
subscriptionInfo = { // 71
callback: callback, // 72
context: context, // 73
priority: priority // 74
}; // 75
// 76
for ( ; i >= 0; i-- ) { // 77
if ( subscriptions[ topic ][ i ].priority <= priority ) { // 78
subscriptions[ topic ].splice( i + 1, 0, subscriptionInfo ); // 79
added = true; // 80
break; // 81
} // 82
} // 83
// 84
if ( !added ) { // 85
subscriptions[ topic ].unshift( subscriptionInfo ); // 86
} // 87
} // 88
// 89
return callback; // 90
}, // 91
// 92
unsubscribe: function( topic, context, callback ) { // 93
if ( typeof topic !== "string" ) { // 94
throw new Error( "You must provide a valid topic to remove a subscription." ); // 95
} // 96
// 97
if ( arguments.length === 2 ) { // 98
callback = context; // 99
context = null; // 100
} // 101
// 102
if ( !subscriptions[ topic ] ) { // 103
return; // 104
} // 105
// 106
var length = subscriptions[ topic ].length, // 107
i = 0; // 108
// 109
for ( ; i < length; i++ ) { // 110
if ( subscriptions[ topic ][ i ].callback === callback ) { // 111
if ( !context || subscriptions[ topic ][ i ].context === context ) { // 112
subscriptions[ topic ].splice( i, 1 ); // 113
// 114
// Adjust counter and length for removed item // 115
i--; // 116
length--; // 117
} // 118
} // 119
} // 120
} // 121
}; // 122
// 123
}( this ) ); // 124
// 125
(function( amplify, undefined ) { // 126
// 127
var store = amplify.store = function( key, value, options ) { // 128
var type = store.type; // 129
if ( options && options.type && options.type in store.types ) { // 130
type = options.type; // 131
} // 132
return store.types[ type ]( key, value, options || {} ); // 133
}; // 134
// 135
store.types = {}; // 136
store.type = null; // 137
store.addType = function( type, storage ) { // 138
if ( !store.type ) { // 139
store.type = type; // 140
} // 141
// 142
store.types[ type ] = storage; // 143
store[ type ] = function( key, value, options ) { // 144
options = options || {}; // 145
options.type = type; // 146
return store( key, value, options ); // 147
}; // 148
}; // 149
store.error = function() { // 150
return "amplify.store quota exceeded"; // 151
}; // 152
// 153
var rprefix = /^__amplify__/; // 154
function createFromStorageInterface( storageType, storage ) { // 155
store.addType( storageType, function( key, value, options ) { // 156
var storedValue, parsed, i, remove, // 157
ret = value, // 158
now = (new Date()).getTime(); // 159
// 160
if ( !key ) { // 161
ret = {}; // 162
remove = []; // 163
i = 0; // 164
try { // 165
// accessing the length property works around a localStorage bug // 166
// in Firefox 4.0 where the keys don't update cross-page // 167
// we assign to key just to avoid Closure Compiler from removing // 168
// the access as "useless code" // 169
// https://bugzilla.mozilla.org/show_bug.cgi?id=662511 // 170
key = storage.length; // 171
// 172
while ( key = storage.key( i++ ) ) { // 173
if ( rprefix.test( key ) ) { // 174
parsed = JSON.parse( storage.getItem( key ) ); // 175
if ( parsed.expires && parsed.expires <= now ) { // 176
remove.push( key ); // 177
} else { // 178
ret[ key.replace( rprefix, "" ) ] = parsed.data; // 179
} // 180
} // 181
} // 182
while ( key = remove.pop() ) { // 183
storage.removeItem( key ); // 184
} // 185
} catch ( error ) {} // 186
return ret; // 187
} // 188
// 189
// protect against name collisions with direct storage // 190
key = "__amplify__" + key; // 191
// 192
if ( value === undefined ) { // 193
storedValue = storage.getItem( key ); // 194
parsed = storedValue ? JSON.parse( storedValue ) : { expires: -1 }; // 195
if ( parsed.expires && parsed.expires <= now ) { // 196
storage.removeItem( key ); // 197
} else { // 198
return parsed.data; // 199
} // 200
} else { // 201
if ( value === null ) { // 202
storage.removeItem( key ); // 203
} else { // 204
parsed = JSON.stringify({ // 205
data: value, // 206
expires: options.expires ? now + options.expires : null // 207
}); // 208
try { // 209
storage.setItem( key, parsed ); // 210
// quota exceeded // 211
} catch( error ) { // 212
// expire old data and try again // 213
store[ storageType ](); // 214
try { // 215
storage.setItem( key, parsed ); // 216
} catch( error ) { // 217
throw store.error(); // 218
} // 219
} // 220
} // 221
} // 222
// 223
return ret; // 224
}); // 225
} // 226
// 227
// localStorage + sessionStorage // 228
// IE 8+, Firefox 3.5+, Safari 4+, Chrome 4+, Opera 10.5+, iPhone 2+, Android 2+ // 229
for ( var webStorageType in { localStorage: 1, sessionStorage: 1 } ) { // 230
// try/catch for file protocol in Firefox and Private Browsing in Safari 5 // 231
try { // 232
// Safari 5 in Private Browsing mode exposes localStorage // 233
// but doesn't allow storing data, so we attempt to store and remove an item. // 234
// This will unfortunately give us a false negative if we're at the limit. // 235
window[ webStorageType ].setItem( "__amplify__", "x" ); // 236
window[ webStorageType ].removeItem( "__amplify__" ); // 237
createFromStorageInterface( webStorageType, window[ webStorageType ] ); // 238
} catch( e ) {} // 239
} // 240
// 241
// globalStorage // 242
// non-standard: Firefox 2+ // 243
// https://developer.mozilla.org/en/dom/storage#globalStorage // 244
if ( !store.types.localStorage && window.globalStorage ) { // 245
// try/catch for file protocol in Firefox // 246
try { // 247
createFromStorageInterface( "globalStorage", // 248
window.globalStorage[ window.location.hostname ] ); // 249
// Firefox 2.0 and 3.0 have sessionStorage and globalStorage // 250
// make sure we default to globalStorage // 251
// but don't default to globalStorage in 3.5+ which also has localStorage // 252
if ( store.type === "sessionStorage" ) { // 253
store.type = "globalStorage"; // 254
} // 255
} catch( e ) {} // 256
} // 257
// 258
// userData // 259
// non-standard: IE 5+ // 260
// http://msdn.microsoft.com/en-us/library/ms531424(v=vs.85).aspx // 261
(function() { // 262
// IE 9 has quirks in userData that are a huge pain // 263
// rather than finding a way to detect these quirks // 264
// we just don't register userData if we have localStorage // 265
if ( store.types.localStorage ) { // 266
return; // 267
} // 268
// 269
// append to html instead of body so we can do this from the head // 270
var div = document.createElement( "div" ), // 271
attrKey = "amplify"; // 272
div.style.display = "none"; // 273
document.getElementsByTagName( "head" )[ 0 ].appendChild( div ); // 274
// 275
// we can't feature detect userData support // 276
// so just try and see if it fails // 277
// surprisingly, even just adding the behavior isn't enough for a failure // 278
// so we need to load the data as well // 279
try { // 280
div.addBehavior( "#default#userdata" ); // 281
div.load( attrKey ); // 282
} catch( e ) { // 283
div.parentNode.removeChild( div ); // 284
return; // 285
} // 286
// 287
store.addType( "userData", function( key, value, options ) { // 288
div.load( attrKey ); // 289
var attr, parsed, prevValue, i, remove, // 290
ret = value, // 291
now = (new Date()).getTime(); // 292
// 293
if ( !key ) { // 294
ret = {}; // 295
remove = []; // 296
i = 0; // 297
while ( attr = div.XMLDocument.documentElement.attributes[ i++ ] ) { // 298
parsed = JSON.parse( attr.value ); // 299
if ( parsed.expires && parsed.expires <= now ) { // 300
remove.push( attr.name ); // 301
} else { // 302
ret[ attr.name ] = parsed.data; // 303
} // 304
} // 305
while ( key = remove.pop() ) { // 306
div.removeAttribute( key ); // 307
} // 308
div.save( attrKey ); // 309
return ret; // 310
} // 311
// 312
// convert invalid characters to dashes // 313
// http://www.w3.org/TR/REC-xml/#NT-Name // 314
// simplified to assume the starting character is valid // 315
// also removed colon as it is invalid in HTML attribute names // 316
key = key.replace( /[^\-._0-9A-Za-z\xb7\xc0-\xd6\xd8-\xf6\xf8-\u037d\u037f-\u1fff\u200c-\u200d\u203f\u2040\u2070-\u218f]/g, "-" );
// adjust invalid starting character to deal with our simplified sanitization // 318
key = key.replace( /^-/, "_-" ); // 319
// 320
if ( value === undefined ) { // 321
attr = div.getAttribute( key ); // 322
parsed = attr ? JSON.parse( attr ) : { expires: -1 }; // 323
if ( parsed.expires && parsed.expires <= now ) { // 324
div.removeAttribute( key ); // 325
} else { // 326
return parsed.data; // 327
} // 328
} else { // 329
if ( value === null ) { // 330
div.removeAttribute( key ); // 331
} else { // 332
// we need to get the previous value in case we need to rollback // 333
prevValue = div.getAttribute( key ); // 334
parsed = JSON.stringify({ // 335
data: value, // 336
expires: (options.expires ? (now + options.expires) : null) // 337
}); // 338
div.setAttribute( key, parsed ); // 339
} // 340
} // 341
// 342
try { // 343
div.save( attrKey ); // 344
// quota exceeded // 345
} catch ( error ) { // 346
// roll the value back to the previous value // 347
if ( prevValue === null ) { // 348
div.removeAttribute( key ); // 349
} else { // 350
div.setAttribute( key, prevValue ); // 351
} // 352
// 353
// expire old data and try again // 354
store.userData(); // 355
try { // 356
div.setAttribute( key, parsed ); // 357
div.save( attrKey ); // 358
} catch ( error ) { // 359
// roll the value back to the previous value // 360
if ( prevValue === null ) { // 361
div.removeAttribute( key ); // 362
} else { // 363
div.setAttribute( key, prevValue ); // 364
} // 365
throw store.error(); // 366
} // 367
} // 368
return ret; // 369
}); // 370
}() ); // 371
// 372
// in-memory storage // 373
// fallback for all browsers to enable the API even if we can't persist data // 374
(function() { // 375
var memory = {}, // 376
timeout = {}; // 377
// 378
function copy( obj ) { // 379
return obj === undefined ? undefined : JSON.parse( JSON.stringify( obj ) ); // 380
} // 381
// 382
store.addType( "memory", function( key, value, options ) { // 383
if ( !key ) { // 384
return copy( memory ); // 385
} // 386
// 387
if ( value === undefined ) { // 388
return copy( memory[ key ] ); // 389
} // 390
// 391
if ( timeout[ key ] ) { // 392
clearTimeout( timeout[ key ] ); // 393
delete timeout[ key ]; // 394
} // 395
// 396
if ( value === null ) { // 397
delete memory[ key ]; // 398
return null; // 399
} // 400
// 401
memory[ key ] = value; // 402
if ( options.expires ) { // 403
timeout[ key ] = setTimeout(function() { // 404
delete memory[ key ]; // 405
delete timeout[ key ]; // 406
}, options.expires ); // 407
} // 408
// 409
return value; // 410
}); // 411
}() ); // 412
// 413
}( this.amplify = this.amplify || {} ) ); // 414
// 415
/*global amplify*/ // 416
// 417
(function( amplify, undefined ) { // 418
'use strict'; // 419
// 420
function noop() {} // 421
function isFunction( obj ) { // 422
return ({}).toString.call( obj ) === "[object Function]"; // 423
} // 424
// 425
function async( fn ) { // 426
var isAsync = false; // 427
setTimeout(function() { // 428
isAsync = true; // 429
}, 1 ); // 430
return function() { // 431
var that = this, // 432
args = arguments; // 433
if ( isAsync ) { // 434
fn.apply( that, args ); // 435
} else { // 436
setTimeout(function() { // 437
fn.apply( that, args ); // 438
}, 1 ); // 439
} // 440
}; // 441
} // 442
// 443
amplify.request = function( resourceId, data, callback ) { // 444
// default to an empty hash just so we can handle a missing resourceId // 445
// in one place // 446
var settings = resourceId || {}; // 447
// 448
if ( typeof settings === "string" ) { // 449
if ( isFunction( data ) ) { // 450
callback = data; // 451
data = {}; // 452
} // 453
settings = { // 454
resourceId: resourceId, // 455
data: data || {}, // 456
success: callback // 457
}; // 458
} // 459
// 460
var request = { abort: noop }, // 461
resource = amplify.request.resources[ settings.resourceId ], // 462
success = settings.success || noop, // 463
error = settings.error || noop; // 464
// 465
settings.success = async( function( data, status ) { // 466
status = status || "success"; // 467
amplify.publish( "request.success", settings, data, status ); // 468
amplify.publish( "request.complete", settings, data, status ); // 469
success( data, status ); // 470
}); // 471
// 472
settings.error = async( function( data, status ) { // 473
status = status || "error"; // 474
amplify.publish( "request.error", settings, data, status ); // 475
amplify.publish( "request.complete", settings, data, status ); // 476
error( data, status ); // 477
}); // 478
// 479
if ( !resource ) { // 480
if ( !settings.resourceId ) { // 481
throw "amplify.request: no resourceId provided"; // 482
} // 483
throw "amplify.request: unknown resourceId: " + settings.resourceId; // 484
} // 485
// 486
if ( !amplify.publish( "request.before", settings ) ) { // 487
settings.error( null, "abort" ); // 488
return; // 489
} // 490
// 491
amplify.request.resources[ settings.resourceId ]( settings, request ); // 492
return request; // 493
}; // 494
// 495
amplify.request.types = {}; // 496
amplify.request.resources = {}; // 497
amplify.request.define = function( resourceId, type, settings ) { // 498
if ( typeof type === "string" ) { // 499
if ( !( type in amplify.request.types ) ) { // 500
throw "amplify.request.define: unknown type: " + type; // 501
} // 502
// 503
settings.resourceId = resourceId; // 504
amplify.request.resources[ resourceId ] = // 505
amplify.request.types[ type ]( settings ); // 506
} else { // 507
// no pre-processor or settings for one-off types (don't invoke) // 508
amplify.request.resources[ resourceId ] = type; // 509
} // 510
}; // 511
// 512
}( amplify ) ); // 513
// 514
// 515
(function( amplify, $, undefined ) { // 516
'use strict'; // 517
// 518
var xhrProps = [ "status", "statusText", "responseText", "responseXML", "readyState" ], // 519
rurlData = /\{([^\}]+)\}/g; // 520
// 521
amplify.request.types.ajax = function( defnSettings ) { // 522
defnSettings = $.extend({ // 523
type: "GET" // 524
}, defnSettings ); // 525
// 526
return function( settings, request ) { // 527
var xhr, handleResponse, // 528
url = defnSettings.url, // 529
abort = request.abort, // 530
ajaxSettings = $.extend( true, {}, defnSettings, { data: settings.data } ), // 531
aborted = false, // 532
ampXHR = { // 533
readyState: 0, // 534
setRequestHeader: function( name, value ) { // 535
return xhr.setRequestHeader( name, value ); // 536
}, // 537
getAllResponseHeaders: function() { // 538
return xhr.getAllResponseHeaders(); // 539
}, // 540
getResponseHeader: function( key ) { // 541
return xhr.getResponseHeader( key ); // 542
}, // 543
overrideMimeType: function( type ) { // 544
return xhr.overrideMimeType( type ); // 545
}, // 546
abort: function() { // 547
aborted = true; // 548
try { // 549
xhr.abort(); // 550
// IE 7 throws an error when trying to abort // 551
} catch( e ) {} // 552
handleResponse( null, "abort" ); // 553
}, // 554
success: function( data, status ) { // 555
settings.success( data, status ); // 556
}, // 557
error: function( data, status ) { // 558
settings.error( data, status ); // 559
} // 560
}; // 561
// 562
handleResponse = function( data, status ) { // 563
$.each( xhrProps, function( i, key ) { // 564
try { // 565
ampXHR[ key ] = xhr[ key ]; // 566
} catch( e ) {} // 567
}); // 568
// Playbook returns "HTTP/1.1 200 OK" // 569
// TODO: something also returns "OK", what? // 570
if ( /OK$/.test( ampXHR.statusText ) ) { // 571
ampXHR.statusText = "success"; // 572
} // 573
if ( data === undefined ) { // 574
// TODO: add support for ajax errors with data // 575
data = null; // 576
} // 577
if ( aborted ) { // 578
status = "abort"; // 579
} // 580
if ( /timeout|error|abort/.test( status ) ) { // 581
ampXHR.error( data, status ); // 582
} else { // 583
ampXHR.success( data, status ); // 584
} // 585
// avoid handling a response multiple times // 586
// this can happen if a request is aborted // 587
// TODO: figure out if this breaks polling or multi-part responses // 588
handleResponse = $.noop; // 589
}; // 590
// 591
amplify.publish( "request.ajax.preprocess", // 592
defnSettings, settings, ajaxSettings, ampXHR ); // 593
// 594
$.extend( ajaxSettings, { // 595
isJSONP: function () { // 596
return (/jsonp/gi).test(this.dataType); // 597
}, // 598
cacheURL: function () { // 599
if (!this.isJSONP()) { // 600
return this.url; // 601
} // 602
// 603
var callbackName = 'callback'; // 604
// 605
// possible for the callback function name to be overridden // 606
if (this.hasOwnProperty('jsonp')) { // 607
if (this.jsonp !== false) { // 608
callbackName = this.jsonp; // 609
} else { // 610
if (this.hasOwnProperty('jsonpCallback')) { // 611
callbackName = this.jsonpCallback; // 612
} // 613
} // 614
} // 615
// 616
// search and replace callback parameter in query string with empty string // 617
var callbackRegex = new RegExp('&?' + callbackName + '=[^&]*&?', 'gi'); // 618
return this.url.replace(callbackRegex, ''); // 619
}, // 620
success: function( data, status ) { // 621
handleResponse( data, status ); // 622
}, // 623
error: function( _xhr, status ) { // 624
handleResponse( null, status ); // 625
}, // 626
beforeSend: function( _xhr, _ajaxSettings ) { // 627
xhr = _xhr; // 628
ajaxSettings = _ajaxSettings; // 629
var ret = defnSettings.beforeSend ? // 630
defnSettings.beforeSend.call( this, ampXHR, ajaxSettings ) : true; // 631
return ret && amplify.publish( "request.before.ajax", // 632
defnSettings, settings, ajaxSettings, ampXHR ); // 633
} // 634
}); // 635
// 636
// cache all JSONP requests // 637
if (ajaxSettings.cache && ajaxSettings.isJSONP()) { // 638
$.extend(ajaxSettings, { // 639
cache: true // 640
}); // 641
} // 642
// 643
$.ajax( ajaxSettings ); // 644
// 645
request.abort = function() { // 646
ampXHR.abort(); // 647
abort.call( this ); // 648
}; // 649
}; // 650
}; // 651
// 652
// 653
// 654
amplify.subscribe( "request.ajax.preprocess", function( defnSettings, settings, ajaxSettings ) { // 655
var mappedKeys = [], // 656
data = ajaxSettings.data; // 657
// 658
if ( typeof data === "string" ) { // 659
return; // 660
} // 661
// 662
data = $.extend( true, {}, defnSettings.data, data ); // 663
// 664
ajaxSettings.url = ajaxSettings.url.replace( rurlData, function ( m, key ) { // 665
if ( key in data ) { // 666
mappedKeys.push( key ); // 667
return data[ key ]; // 668
} // 669
}); // 670
// 671
// We delete the keys later so duplicates are still replaced // 672
$.each( mappedKeys, function ( i, key ) { // 673
delete data[ key ]; // 674
}); // 675
// 676
ajaxSettings.data = data; // 677
}); // 678
// 679
// 680
// 681
amplify.subscribe( "request.ajax.preprocess", function( defnSettings, settings, ajaxSettings ) { // 682
var data = ajaxSettings.data, // 683
dataMap = defnSettings.dataMap; // 684
// 685
if ( !dataMap || typeof data === "string" ) { // 686
return; // 687
} // 688
// 689
if ( $.isFunction( dataMap ) ) { // 690
ajaxSettings.data = dataMap( data ); // 691
} else { // 692
$.each( defnSettings.dataMap, function( orig, replace ) { // 693
if ( orig in data ) { // 694
data[ replace ] = data[ orig ]; // 695
delete data[ orig ]; // 696
} // 697
}); // 698
ajaxSettings.data = data; // 699
} // 700
}); // 701
// 702
// 703
// 704
var cache = amplify.request.cache = { // 705
_key: function( resourceId, url, data ) { // 706
data = url + data; // 707
var length = data.length, // 708
i = 0; // 709
// 710
/*jshint bitwise:false*/ // 711
function chunk() { // 712
return data.charCodeAt( i++ ) << 24 | // 713
data.charCodeAt( i++ ) << 16 | // 714
data.charCodeAt( i++ ) << 8 | // 715
data.charCodeAt( i++ ) << 0; // 716
} // 717
// 718
var checksum = chunk(); // 719
while ( i < length ) { // 720
checksum ^= chunk(); // 721
} // 722
/*jshint bitwise:true*/ // 723
// 724
return "request-" + resourceId + "-" + checksum; // 725
}, // 726
// 727
_default: (function() { // 728
var memoryStore = {}; // 729
return function( resource, settings, ajaxSettings, ampXHR ) { // 730
// data is already converted to a string by the time we get here // 731
var cacheKey = cache._key( settings.resourceId, // 732
ajaxSettings.cacheURL(), ajaxSettings.data ), // 733
duration = resource.cache; // 734
// 735
if ( cacheKey in memoryStore ) { // 736
ampXHR.success( memoryStore[ cacheKey ] ); // 737
return false; // 738
} // 739
var success = ampXHR.success; // 740
ampXHR.success = function( data ) { // 741
memoryStore[ cacheKey ] = data; // 742
if ( typeof duration === "number" ) { // 743
setTimeout(function() { // 744
delete memoryStore[ cacheKey ]; // 745
}, duration ); // 746
} // 747
success.apply( this, arguments ); // 748
}; // 749
}; // 750
}()) // 751
}; // 752
// 753
if ( amplify.store ) { // 754
$.each( amplify.store.types, function( type ) { // 755
cache[ type ] = function( resource, settings, ajaxSettings, ampXHR ) { // 756
var cacheKey = cache._key( settings.resourceId, // 757
ajaxSettings.cacheURL(), ajaxSettings.data ), // 758
cached = amplify.store[ type ]( cacheKey ); // 759
// 760
if ( cached ) { // 761
ajaxSettings.success( cached ); // 762
return false; // 763
} // 764
var success = ampXHR.success; // 765
ampXHR.success = function( data ) { // 766
amplify.store[ type ]( cacheKey, data, { expires: resource.cache.expires } ); // 767
success.apply( this, arguments ); // 768
}; // 769
}; // 770
}); // 771
cache.persist = cache[ amplify.store.type ]; // 772
} // 773
// 774
amplify.subscribe( "request.before.ajax", function( resource ) { // 775
var cacheType = resource.cache; // 776
if ( cacheType ) { // 777
// normalize between objects and strings/booleans/numbers // 778
cacheType = cacheType.type || cacheType; // 779
return cache[ cacheType in cache ? cacheType : "_default" ] // 780
.apply( this, arguments ); // 781
} // 782
}); // 783
// 784
// 785
// 786
amplify.request.decoders = { // 787
// http://labs.omniti.com/labs/jsend // 788
jsend: function( data, status, ampXHR, success, error ) { // 789
if ( data.status === "success" ) { // 790
success( data.data ); // 791
} else if ( data.status === "fail" ) { // 792
error( data.data, "fail" ); // 793
} else if ( data.status === "error" ) { // 794
delete data.status; // 795
error( data, "error" ); // 796
} else { // 797
error( null, "error" ); // 798
} // 799
} // 800
}; // 801
// 802
amplify.subscribe( "request.before.ajax", function( resource, settings, ajaxSettings, ampXHR ) { // 803
var _success = ampXHR.success, // 804
_error = ampXHR.error, // 805
decoder = $.isFunction( resource.decoder ) ? // 806
resource.decoder : // 807
resource.decoder in amplify.request.decoders ? // 808
amplify.request.decoders[ resource.decoder ] : // 809
amplify.request.decoders._default; // 810
// 811
if ( !decoder ) { // 812
return; // 813
} // 814
// 815
function success( data, status ) { // 816
_success( data, status ); // 817
} // 818
function error( data, status ) { // 819
_error( data, status ); // 820
} // 821
ampXHR.success = function( data, status ) { // 822
decoder( data, status, ampXHR, success, error ); // 823
}; // 824
ampXHR.error = function( data, status ) { // 825
decoder( data, status, ampXHR, success, error ); // 826
}; // 827
}); // 828
// 829
}( amplify, jQuery ) ); // 830
// 831
///////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
//////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
Package._define("amplify");
})();