/*! * Amplify Core @VERSION * * Copyright 2011 appendTo LLC. (http://appendto.com/team) * Dual licensed under the MIT or GPL licenses. * http://appendto.com/open-source-licenses * * http://amplifyjs.com */ (function ( global, undefined ) { var slice = [].slice, subscriptions = {}; var amplify = global.amplify = { publish : function ( topic ) { var args = slice.call( arguments, 1 ), subscription, length, i = 0, ret; if ( !subscriptions[ topic ] ) { return true; } for ( length = subscriptions[ topic ].length; i < length; i++ ) { subscription = subscriptions[ topic ][ i ]; ret = subscription.callback.apply( subscription.context, args ); if ( ret === false ) { break; } } return ret !== false; }, subscribe : function ( topic, context, callback, priority ) { if ( arguments.length === 3 && typeof callback === "number" ) { priority = callback; callback = context; context = null; } if ( arguments.length === 2 ) { callback = context; context = null; } priority = priority || 10; var topicIndex = 0, topics = topic.split( /\s/ ), topicLength = topics.length, added; for ( ; topicIndex < topicLength; topicIndex++ ) { topic = topics[ topicIndex ]; added = false; if ( !subscriptions[ topic ] ) { subscriptions[ topic ] = []; } var i = subscriptions[ topic ].length - 1, subscriptionInfo = { callback : callback, context : context, priority : priority }; for ( ; i >= 0; i-- ) { if ( subscriptions[ topic ][ i ].priority <= priority ) { subscriptions[ topic ].splice( i + 1, 0, subscriptionInfo ); added = true; break; } } if ( !added ) { subscriptions[ topic ].unshift( subscriptionInfo ); } } return callback; }, unsubscribe : function ( topic, callback ) { if ( !subscriptions[ topic ] ) { return; } var length = subscriptions[ topic ].length, i = 0; for ( ; i < length; i++ ) { if ( subscriptions[ topic ][ i ].callback === callback ) { subscriptions[ topic ].splice( i, 1 ); break; } } } }; }( this ) );