Browse Source

continues to make modules conform to design pattern

Former-commit-id: ddcc1b7355
Former-commit-id: 18303eddb9
pull/258/head
Jack Lukic 11 years ago
parent
commit
f48e3c851f
9 changed files with 475 additions and 252 deletions
  1. 168
      src/modules/behavior/api.js
  2. 67
      src/modules/behavior/form.js
  3. 226
      src/modules/behavior/state.js
  4. 2
      src/modules/carousel.js
  5. 2
      src/modules/chat.js
  6. 6
      src/modules/nag.js
  7. 252
      src/modules/search.js
  8. 2
      src/modules/star.js
  9. 2
      src/modules/tab.js

168
src/modules/behavior/api.js

@ -57,25 +57,31 @@
$module = typeof this == 'object'
? $(context)
: $context,
element = this,
time = new Date().getTime(),
performance = [],
moduleSelector = $module.selector || '',
instance = $module.data('module-' + settings.namespace),
element = $module.get(),
query = arguments[0],
methodInvoked = (typeof query == 'string'),
queryArguments = [].slice.call(arguments, 1),
invokedResponse,
moduleNamespace = settings.namespace + '-module',
className = settings.className,
metadata = settings.metadata,
errors = settings.errors,
instance = $module.data(moduleNamespace),
className = settings.className,
metadata = settings.metadata,
errors = settings.errors,
module
query = arguments[0],
methodInvoked = (instance !== undefined && typeof query == 'string'),
queryArguments = [].slice.call(arguments, 1),
module,
invokedResponse
;
module = {
initialize: function() {
var
exitConditions = false,
runSettings,
loadingTimer = new Date().getTime(),
@ -83,7 +89,6 @@
promise,
url,
urlVariables,
formData = {},
data,
@ -324,7 +329,6 @@
},
url: function(url, urlData) {
var
missingTerm = false,
urlVariables
;
if(url) {
@ -375,27 +379,104 @@
.removeClass(className.loading)
;
},
/* standard module */
setting: function(name, value) {
if(value === undefined) {
if(value !== undefined) {
if( $.isPlainObject(name) ) {
$.extend(true, settings, name);
}
else {
settings[name] = value;
}
}
else {
return settings[name];
}
settings[name] = value;
},
verbose: function() {
if(settings.verbose && settings.debug) {
module.verbose = Function.prototype.bind.call(console.info, console, settings.moduleName + ':');
internal: function(name, value) {
if(value !== undefined) {
if( $.isPlainObject(name) ) {
$.extend(true, module, name);
}
else {
module[name] = value;
}
}
else {
return module[name];
}
},
debug: function() {
if(settings.debug) {
module.debug = Function.prototype.bind.call(console.info, console, settings.moduleName + ':');
if(settings.performance) {
module.performance.log(arguments);
}
else {
module.debug = Function.prototype.bind.call(console.info, console, settings.moduleName + ':');
}
}
},
verbose: function() {
if(settings.verbose && settings.debug) {
if(settings.performance) {
module.performance.log(arguments);
}
else {
module.verbose = Function.prototype.bind.call(console.info, console, settings.moduleName + ':');
}
}
},
error: function() {
if(console.log !== undefined) {
module.error = Function.prototype.bind.call(console.error, console, settings.moduleName + ':');
module.error = Function.prototype.bind.call(console.error, console, settings.moduleName + ':');
},
performance: {
log: function(message) {
var
currentTime,
executionTime,
previousTime
;
if(settings.performance) {
currentTime = new Date().getTime();
previousTime = time || currentTime,
executionTime = currentTime - previousTime;
time = currentTime;
performance.push({
'Element' : element,
'Name' : message[0],
'Arguments' : [].slice.call(message, 1) || '',
'Execution Time' : executionTime
});
}
clearTimeout(module.performance.timer);
module.performance.timer = setTimeout(module.performance.display, 100);
},
display: function() {
var
title = settings.moduleName + ':',
totalTime = 0
;
time = false;
$.each(performance, function(index, data) {
totalTime += data['Execution Time'];
});
title += ' ' + totalTime + 'ms';
if(moduleSelector) {
title += ' \'' + moduleSelector + '\'';
}
if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
console.groupCollapsed(title);
if(console.table) {
console.table(performance);
}
else {
$.each(performance, function(index, data) {
console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
});
}
console.groupEnd();
}
performance = [];
}
},
invoke: function(query, passedArguments, context) {
@ -411,18 +492,17 @@
$.each(query, function(depth, value) {
if( $.isPlainObject( instance[value] ) && (depth != maxDepth) ) {
instance = instance[value];
return true;
}
else if( instance[value] !== undefined ) {
found = instance[value];
return true;
}
module.error(errors.method);
return false;
else {
module.error(errors.method);
}
});
}
if ( $.isFunction( found ) ) {
instance.verbose('Executing invoked function', found);
module.verbose('Executing invoked function', found);
return found.apply(context, passedArguments);
}
return found || false;
@ -441,7 +521,8 @@
}
module.initialize();
}
return (invokedResponse)
return (invokedResponse !== undefined)
? invokedResponse
: this
;
@ -454,7 +535,6 @@
var
// if only function passed it is success callback
$module = $(this),
element = this,
selector = $(this).selector || '',
settings = ( $.isFunction(parameters) )
@ -488,25 +568,25 @@
};
$.api.settings = {
moduleName : 'API Module',
namespace : 'api',
moduleName : 'API',
namespace : 'api',
debug : true,
verbose : true,
debug : true,
verbose : true,
performance : true,
api : {},
api : {},
beforeSend : function(settings) {
beforeSend : function(settings) {
return settings;
},
beforeXHR : function(xhr) {},
success : function(response) {},
complete : function(response) {},
failure : function(errorCode) {},
progress : false,
beforeXHR : function(xhr) {},
success : function(response) {},
complete : function(response) {},
failure : function(errorCode) {},
progress : false,
errors : {
errors : {
missingAction : 'API action used but no url was defined',
missingURL : 'URL not specified for the API action',
missingParameter : 'Missing an essential URL parameter: ',

67
src/modules/behavior/form.js

@ -19,8 +19,6 @@ $.fn.form = function(fields, parameters) {
settings = $.extend(true, {}, $.fn.form.settings, parameters),
validation = $.extend({}, $.fn.form.settings.defaults, fields),
eventNamespace = '.' + settings.namespace,
moduleNamespace = 'module-' + settings.namespace,
moduleSelector = $allModules.selector || '',
time = new Date().getTime(),
@ -46,6 +44,9 @@ $.fn.form = function(fields, parameters) {
element = this,
instance = $module.data('module-' + settings.namespace),
eventNamespace = '.' + settings.namespace,
moduleNamespace = 'module-' + settings.namespace,
namespace = settings.namespace,
metadata = settings.metadata,
className = settings.className,
@ -71,15 +72,27 @@ $.fn.form = function(fields, parameters) {
$submit
.on('click' + eventNamespace, module.submit)
;
module.instantiate();
},
instantiate: function() {
module.verbose('Storing instance of module', module);
instance = module;
$module
.data(moduleNamespace, module)
;
},
destroy: function() {
module.verbose('Destroying previous module', instance);
$module
.off(namespace)
.off(eventNamespace)
.removeData(moduleNamespace)
;
},
refresh: function() {
module.verbose('Refreshing selector cache');
$field = $module.find(settings.selector.field);
},
@ -331,6 +344,7 @@ $.fn.form = function(fields, parameters) {
},
setting: function(name, value) {
module.debug('Changing setting', name, value);
if(value !== undefined) {
if( $.isPlainObject(name) ) {
$.extend(true, settings, name);
@ -344,6 +358,7 @@ $.fn.form = function(fields, parameters) {
}
},
internal: function(name, value) {
module.debug('Changing internal', name, value);
if(value !== undefined) {
if( $.isPlainObject(name) ) {
$.extend(true, module, name);
@ -391,44 +406,42 @@ $.fn.form = function(fields, parameters) {
previousTime = time || currentTime,
executionTime = currentTime - previousTime;
time = currentTime;
performance.push({
performance.push({
'Element' : element,
'Name' : message[0],
'Arguments' : message[1] || 'None',
'Name' : message[0],
'Arguments' : [].slice.call(message, 1) || '',
'Execution Time' : executionTime
});
clearTimeout(module.performance.timer);
module.performance.timer = setTimeout(module.performance.display, 100);
}
clearTimeout(module.performance.timer);
module.performance.timer = setTimeout(module.performance.display, 100);
},
display: function() {
var
title = settings.moduleName,
caption = settings.moduleName + ': ' + moduleSelector + '(' + $allModules.size() + ' elements)',
totalExecutionTime = 0
title = settings.moduleName + ':',
totalTime = 0
;
time = false;
$.each(performance, function(index, data) {
totalTime += data['Execution Time'];
});
title += ' ' + totalTime + 'ms';
if(moduleSelector) {
title += ' Performance (' + moduleSelector + ')';
title += ' \'' + moduleSelector + '\'';
}
if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
console.groupCollapsed(title);
if(console.table) {
$.each(performance, function(index, data) {
totalExecutionTime += data['Execution Time'];
});
console.table(performance);
}
else {
$.each(performance, function(index, data) {
totalExecutionTime += data['Execution Time'];
console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
});
}
console.log('Total Execution Time:', totalExecutionTime +'ms');
console.groupEnd();
performance = [];
time = false;
}
performance = [];
}
},
invoke: function(query, passedArguments, context) {
@ -444,23 +457,22 @@ $.fn.form = function(fields, parameters) {
$.each(query, function(depth, value) {
if( $.isPlainObject( instance[value] ) && (depth != maxDepth) ) {
instance = instance[value];
return true;
}
else if( instance[value] !== undefined ) {
found = instance[value];
return true;
}
else {
module.error(error.method);
}
module.error(errors.method);
return false;
});
}
if ( $.isFunction( found ) ) {
instance.verbose('Executing invoked function', found);
return found.apply(context, passedArguments);
}
return found || false;
}
};
if(methodInvoked) {
if(instance === undefined) {
module.initialize();
@ -473,6 +485,7 @@ $.fn.form = function(fields, parameters) {
}
module.initialize();
}
})
;
return (invokedResponse)
@ -485,10 +498,12 @@ $.fn.form.settings = {
// module info
moduleName : 'Form',
debug : true,
verbose : true,
performance : false,
namespace : 'validate',
performance : true,
namespace : 'form',
keyboardShortcuts : true,
on : 'submit',

226
src/modules/behavior/state.js

@ -40,18 +40,28 @@
$.fn.state = function(parameters) {
var
$allModules = $(this),
settings = $.extend(true, {}, $.fn.state.settings, parameters),
// make available in scope
selector = $allModules.selector || '',
query = arguments[0],
passedArguments = [].slice.call(arguments, 1),
moduleSelector = $allModules.selector || '',
// set up performance tracking
time = new Date().getTime(),
performance = [],
query = arguments[0],
methodInvoked = (typeof query == 'string'),
queryArguments = [].slice.call(arguments, 1),
eventNamespace = '.' + settings.namespace,
moduleNamespace = settings.namespace + '-module',
// shortcuts
errors = settings.errors,
metadata = settings.metadata,
className = settings.className,
states = settings.states,
text = settings.text,
invokedResponse
;
$allModules
@ -59,25 +69,15 @@ $.fn.state = function(parameters) {
var
$module = $(this),
settings = $.extend(true, {}, $.fn.state.settings, parameters),
element = this,
instance = $module.data('module-' + settings.namespace),
methodInvoked = (typeof query == 'string'),
// shortcuts
namespace = settings.namespace,
metadata = settings.metadata,
className = settings.className,
states = settings.states,
text = settings.text,
instance = $module.data(moduleNamespace),
module
;
module = {
initialize: function() {
module.verbose('Initializing module', element);
module.verbose('Initializing module');
// allow module to guess desired state based on element
if(settings.automatic) {
@ -85,71 +85,78 @@ $.fn.state = function(parameters) {
}
// bind events with delegated events
if(settings.context && selector !== '') {
if(settings.context && moduleSelector !== '') {
if( module.allows('hover') ) {
$(element, settings.context)
.on(selector, 'mouseenter.' + namespace, module.hover.enable)
.on(selector, 'mouseleave.' + namespace, module.hover.disable)
.on(moduleSelector, 'mouseenter' + eventNamespace, module.hover.enable)
.on(moduleSelector, 'mouseleave' + eventNamespace, module.hover.disable)
;
}
if( module.allows('pressed') ) {
$(element, settings.context)
.on(selector, 'mousedown.' + namespace, module.pressed.enable)
.on(selector, 'mouseup.' + namespace, module.pressed.disable)
.on(moduleSelector, 'mousedown' + eventNamespace, module.pressed.enable)
.on(moduleSelector, 'mouseup' + eventNamespace, module.pressed.disable)
;
}
if( module.allows('focus') ) {
$(element, settings.context)
.on(selector, 'focus.' + namespace, module.focus.enable)
.on(selector, 'blur.' + namespace, module.focus.disable)
.on(moduleSelector, 'focus' + eventNamespace, module.focus.enable)
.on(moduleSelector, 'blur' + eventNamespace, module.focus.disable)
;
}
$(settings.context)
.on(selector, 'mouseenter.' + namespace, module.text.change)
.on(selector, 'mouseleave.' + namespace, module.text.reset)
.on(selector, 'click.' + namespace, module.toggle)
.on(moduleSelector, 'mouseenter' + eventNamespace, module.text.change)
.on(moduleSelector, 'mouseleave' + eventNamespace, module.text.reset)
.on(moduleSelector, 'click' + eventNamespace, module.toggle)
;
}
else {
if( module.allows('hover') ) {
$module
.on('mouseenter.' + namespace, module.hover.enable)
.on('mouseleave.' + namespace, module.hover.disable)
.on('mouseenter' + eventNamespace, module.hover.enable)
.on('mouseleave' + eventNamespace, module.hover.disable)
;
}
if( module.allows('pressed') ) {
$module
.on('mousedown.' + namespace, module.pressed.enable)
.on('mouseup.' + namespace, module.pressed.disable)
.on('mousedown' + eventNamespace, module.pressed.enable)
.on('mouseup' + eventNamespace, module.pressed.disable)
;
}
if( module.allows('focus') ) {
$module
.on('focus.' + namespace, module.focus.enable)
.on('blur.' + namespace, module.focus.disable)
.on('focus' + eventNamespace, module.focus.enable)
.on('blur' + eventNamespace, module.focus.disable)
;
}
$module
.on('mouseenter.' + namespace, module.text.change)
.on('mouseleave.' + namespace, module.text.reset)
.on('click.' + namespace, module.toggle)
.on('mouseenter' + eventNamespace, module.text.change)
.on('mouseleave' + eventNamespace, module.text.reset)
.on('click' + eventNamespace, module.toggle)
;
}
module.instantiate();
},
instantiate: function() {
module.verbose('Storing instance of module', module);
instance = module;
$module
.data('module-' + namespace, module)
.data(moduleNamespace, module)
;
},
destroy: function() {
module.verbose('Destroying previous module', element);
module.verbose('Destroying previous module', instance);
$module
.off('.' + namespace)
.off(eventNamespace)
.removeData(moduleNamespace)
;
},
refresh: function() {
module.verbose('Refreshing selector cache', element);
module.verbose('Refreshing selector cache');
$module = $(element);
},
@ -369,6 +376,7 @@ $.fn.state = function(parameters) {
var
previousText = module.text.get()
;
module.debug('Flashing text message', text, duration);
text = text || settings.text.flash;
duration = duration || settings.flashDuration;
module.text.update(text);
@ -378,7 +386,6 @@ $.fn.state = function(parameters) {
},
change: function() {
module.verbose('Checking if text should be changed');
if( module.is.textEnabled() ) {
if( module.is.active() ) {
if(text.hover) {
@ -396,7 +403,7 @@ $.fn.state = function(parameters) {
module.text.update(text.hover);
}
else if(text.enable){
module.verbose('Changing text to enable text', text.disable);
module.verbose('Changing text to enable text', text.enable);
module.text.update(text.enable);
}
}
@ -441,76 +448,119 @@ $.fn.state = function(parameters) {
;
}
}
else {
module.debug('Text is already sane, ignoring update', text);
}
}
},
/* standard module */
setting: function(name, value) {
if(value === undefined) {
module.debug('Changing setting', name, value);
if(value !== undefined) {
if( $.isPlainObject(name) ) {
$.extend(true, settings, name);
}
else {
settings[name] = value;
}
}
else {
return settings[name];
}
settings[name] = value;
},
internal: function(name, value) {
module.debug('Changing internal', name, value);
if(value !== undefined) {
if( $.isPlainObject(name) ) {
$.extend(true, module, name);
}
else {
module[name] = value;
}
}
else {
return module[name];
}
},
debug: function() {
if(settings.debug) {
if(settings.performance) {
module.performance.log(arguments);
}
else {
module.debug = Function.prototype.bind.call(console.info, console, settings.moduleName + ':');
}
}
},
verbose: function() {
if(settings.verbose && settings.debug) {
if(settings.performance) {
module.performance.log(arguments);
}
else {
module.verbose = Function.prototype.bind.call(console.info, console, settings.moduleName + ':');
}
}
},
error: function() {
module.error = Function.prototype.bind.call(console.log, console, settings.moduleName + ':');
},
performance: {
log: function(message) {
var
currentTime,
executionTime
executionTime,
previousTime
;
if(settings.performance) {
currentTime = new Date().getTime();
executionTime = currentTime - time;
previousTime = time || currentTime,
executionTime = currentTime - previousTime;
time = currentTime;
performance.push({
'Name' : message,
performance.push({
'Element' : element,
'Name' : message[0],
'Arguments' : [].slice.call(message, 1) || '',
'Execution Time' : executionTime
});
clearTimeout(module.performance.timer);
module.performance.timer = setTimeout(module.performance.display, 100);
}
clearTimeout(module.performance.timer);
module.performance.timer = setTimeout(module.performance.display, 100);
},
display: function() {
var
title = settings.moduleName + ' Performance (' + selector + ')',
caption = settings.moduleName + ': ' + selector + '(' + $allModules.size() + ' elements)'
title = settings.moduleName + ':',
totalTime = 0
;
if(console.group !== undefined && performance.length > 0) {
time = false;
$.each(performance, function(index, data) {
totalTime += data['Execution Time'];
});
title += ' ' + totalTime + 'ms';
if(moduleSelector) {
title += ' \'' + moduleSelector + '\'';
}
if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
console.groupCollapsed(title);
if(console.table) {
console.table(performance);
}
else {
$.each(performance, function(index, data) {
console.log(data['Name'] + ':' + data['Execution Time']);
console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
});
}
console.groupEnd();
performance = [];
}
performance = [];
}
},
verbose: function() {
if(settings.verbose && settings.debug) {
module.performance.log(arguments[0]);
module.verbose = Function.prototype.bind.call(console.info, console, settings.moduleName + ':');
}
},
debug: function() {
if(settings.debug) {
module.performance.log(arguments[0]);
module.debug = Function.prototype.bind.call(console.info, console, settings.moduleName + ':');
}
},
error: function() {
if(console.log !== undefined) {
module.error = Function.prototype.bind.call(console.error, console, settings.moduleName + ':');
}
},
invoke: function(query, context, passedArguments) {
invoke: function(query, passedArguments, context) {
var
maxDepth,
found
;
passedArguments = passedArguments || [].slice.call( arguments, 2 );
passedArguments = passedArguments || queryArguments;
context = element || context;
if(typeof query == 'string' && instance !== undefined) {
query = query.split('.');
maxDepth = query.length - 1;
@ -523,33 +573,32 @@ $.fn.state = function(parameters) {
found = instance[value];
return true;
}
module.error(settings.errors.method);
module.error(errors.method);
return false;
});
}
if ( $.isFunction( found ) ) {
return found.apply(context, passedArguments);
}
// return retrieved variable or chain
return found;
return found || false;
}
};
// check for invoking internal method
if(methodInvoked) {
invokedResponse = module.invoke(query, this, passedArguments);
if(instance === undefined) {
module.initialize();
}
invokedResponse = module.invoke(query);
}
// otherwise initialize
else {
if(instance !== undefined) {
module.destroy();
}
module.initialize();
}
})
;
// chain or return queried method
return (invokedResponse !== undefined)
return (invokedResponse)
? invokedResponse
: this
;
@ -558,19 +607,19 @@ $.fn.state = function(parameters) {
$.fn.state.settings = {
// module info
moduleName : 'State Module',
moduleName : 'State',
// debug output
debug : true,
// verbose debug output
verbose : false,
verbose : true,
// namespace for events
namespace : 'state',
// debug data includes performance
performance: false,
performance: true,
// callback occurs on state change
onActivate : function() {},
@ -597,6 +646,7 @@ $.fn.state.settings = {
},
context : false,
// errors
errors: {
method : 'The method you called is not defined.'

2
src/modules/carousel.js

@ -292,7 +292,7 @@ $.fn.carousel = function(parameters) {
$.fn.carousel.settings = {
moduleName : 'Carousel Module',
moduleName : 'Carousel',
namespace : 'carousel',
verbose : true,

2
src/modules/chat.js

@ -495,7 +495,7 @@
$.fn.chat.settings = {
moduleName : 'Chat Module',
moduleName : 'Chat',
debug : false,
namespace : 'chat',

6
src/modules/nag.js

@ -223,10 +223,10 @@ $.fn.nag = function(parameters) {
return true;
}
if(module.storage.get(settings.storedKey) != settings.storedValue) {
module.debug('Stored value is not set can show nag', module.storage.get(settings.storedKey));
module.debug('Stored value is not set, can show nag', module.storage.get(settings.storedKey));
return true;
}
module.debug('Stored value is set, cant show nag', module.storage.get(settings.storedKey));
module.debug('Stored value is set, cannot show nag', module.storage.get(settings.storedKey));
return false;
},
stick: function() {
@ -445,7 +445,7 @@ $.fn.nag = function(parameters) {
$.fn.nag.settings = {
moduleName : 'Nag Module',
moduleName : 'Nag',
verbose : true,
debug : true,

252
src/modules/search.js

@ -11,10 +11,19 @@
$.fn.search = function(source, parameters) {
var
settings = $.extend(true, {}, $.fn.search.settings, parameters),
// make arguments available
$allModules = $(this),
settings = $.extend(true, {}, $.fn.search.settings, parameters),
eventNamespace = '.' + settings.namespace,
moduleNamespace = settings.namespace + '-module',
moduleSelector = $allModules.selector || '',
time = new Date().getTime(),
performance = [],
query = arguments[0],
passedArguments = [].slice.call(arguments, 1),
methodInvoked = (typeof query == 'string'),
queryArguments = [].slice.call(arguments, 1),
invokedResponse
;
$(this)
@ -28,18 +37,16 @@ $.fn.search = function(source, parameters) {
$category = $module.find(settings.selector.category),
element = this,
selector = $module.selector || '',
instance = $module.data('module-' + settings.namespace),
methodInvoked = (instance !== undefined && typeof query == 'string'),
instance = $module.data(moduleNamespace),
className = settings.className,
namespace = settings.namespace,
errors = settings.errors,
module
;
module = {
initialize: function() {
module.verbose('Initializing module');
var
prompt = $prompt[0],
inputEvent = (prompt.oninput !== undefined)
@ -50,23 +57,33 @@ $.fn.search = function(source, parameters) {
;
// attach events
$prompt
.on('focus.' + namespace, module.event.focus)
.on('blur.' + namespace, module.event.blur)
.on('keydown.' + namespace, module.handleKeyboard)
.on('focus' + eventNamespace, module.event.focus)
.on('blur' + eventNamespace, module.event.blur)
.on('keydown' + eventNamespace, module.handleKeyboard)
;
if(settings.automatic) {
$prompt
.on(inputEvent + '.' + namespace, module.search.throttle)
.on(inputEvent + eventNamespace, module.search.throttle)
;
}
$searchButton
.on('click.' + namespace, module.search.query)
.on('click' + eventNamespace, module.search.query)
;
$results
.on('click.' + namespace, settings.selector.result, module.results.select)
.on('click' + eventNamespace, settings.selector.result, module.results.select)
;
module.instantiate();
},
instantiate: function() {
module.verbose('Storing instance of module', module);
$module
.data(moduleNamespace, module)
;
},
destroy: function() {
module.verbose('Destroying instance');
$module
.data('module-' + namespace, module)
.removeData(moduleNamespace)
;
},
event: {
@ -175,21 +192,18 @@ $.fn.search = function(source, parameters) {
xhr = $module.data('xhr') || false
;
if( xhr && xhr.state() != 'resolved') {
module.debug('Cancelling last search');
xhr.abort();
}
},
throttle: function(event) {
throttle: function() {
var
searchTerm = $prompt.val(),
numCharacters = searchTerm.length,
timer
numCharacters = searchTerm.length
;
clearTimeout($module.data('timer'));
clearTimeout(module.timer);
if(numCharacters >= settings.minCharacters) {
timer = setTimeout(module.search.query, settings.searchThrottle);
$module
.data('timer', timer)
;
module.timer = setTimeout(module.search.query, settings.searchThrottle);
}
else {
module.results.hide();
@ -254,9 +268,6 @@ $.fn.search = function(source, parameters) {
},
remote: function(searchTerm) {
var
xhr = ($module.data('xhr') !== undefined)
? $module.data('xhr')
: false,
apiSettings = {
stateContext : $module,
url : source,
@ -270,10 +281,8 @@ $.fn.search = function(source, parameters) {
},
searchHTML
;
// api attaches xhr event to context, use this to prevent overlapping queries
if( xhr && xhr.state() != 'resolved') {
xhr.abort();
}
module.search.cancel();
module.debug('Executing search');
$.extend(true, apiSettings, settings.apiSettings);
$.api(apiSettings);
},
@ -325,7 +334,7 @@ $.fn.search = function(source, parameters) {
else {
html = module.message(errors.noResults, 'empty');
}
$.proxy(settings.onresults, $module)(response);
$.proxy(settings.onResults, $module)(response);
return html;
},
add: function(html) {
@ -383,50 +392,114 @@ $.fn.search = function(source, parameters) {
}
},
/* standard module */
setting: function(name, value) {
if(value === undefined) {
module.debug('Changing setting', name, value);
if(value !== undefined) {
if( $.isPlainObject(name) ) {
$.extend(true, settings, name);
}
else {
settings[name] = value;
}
}
else {
return settings[name];
}
settings[name] = value;
},
internal: function(name, value) {
module.debug('Changing internal', name, value);
if(value !== undefined) {
if( $.isPlainObject(name) ) {
$.extend(true, module, name);
}
else {
module[name] = value;
}
}
else {
return module[name];
}
},
debug: function() {
var
output = [],
message = settings.moduleName + ': ' + arguments[0],
variables = [].slice.call( arguments, 1 ),
log = console.info || console.log || function(){}
;
log = Function.prototype.bind.call(log, console);
if(settings.debug) {
output.push(message);
log.apply(console, output.concat(variables) );
if(settings.performance) {
module.performance.log(arguments);
}
else {
module.debug = Function.prototype.bind.call(console.info, console, settings.moduleName + ':');
}
}
},
// displays mesage visibly in search results
message: function(text, type) {
type = type || 'standard';
module.results.add( settings.templates.message(text, type) );
return settings.templates.message(text, type);
verbose: function() {
if(settings.verbose && settings.debug) {
if(settings.performance) {
module.performance.log(arguments);
}
else {
module.verbose = Function.prototype.bind.call(console.info, console, settings.moduleName + ':');
}
}
},
// update view with error message
error: function(errorMessage, escalate) {
// show user error message
escalate = (escalate !== undefined)
? escalate
: true
;
console.warn(settings.moduleName + ': ' + errorMessage);
if(escalate && errorMessage !== undefined) {
module.message(errorMessage, 'error');
error: function() {
module.error = Function.prototype.bind.call(console.log, console, settings.moduleName + ':');
},
performance: {
log: function(message) {
var
currentTime,
executionTime,
previousTime
;
if(settings.performance) {
currentTime = new Date().getTime();
previousTime = time || currentTime,
executionTime = currentTime - previousTime;
time = currentTime;
performance.push({
'Element' : element,
'Name' : message[0],
'Arguments' : [].slice.call(message, 1) || '',
'Execution Time' : executionTime
});
}
clearTimeout(module.performance.timer);
module.performance.timer = setTimeout(module.performance.display, 100);
},
display: function() {
var
title = settings.moduleName + ':',
totalTime = 0
;
time = false;
$.each(performance, function(index, data) {
totalTime += data['Execution Time'];
});
title += ' ' + totalTime + 'ms';
if(moduleSelector) {
title += ' \'' + moduleSelector + '\'';
}
if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
console.groupCollapsed(title);
if(console.table) {
console.table(performance);
}
else {
$.each(performance, function(index, data) {
console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
});
}
console.groupEnd();
}
performance = [];
}
},
invoke: function(query, context, passedArguments) {
invoke: function(query, passedArguments, context) {
var
maxDepth,
found
;
passedArguments = passedArguments || [].slice.call( arguments, 2 );
passedArguments = passedArguments || queryArguments;
context = element || context;
if(typeof query == 'string' && instance !== undefined) {
query = query.split('.');
maxDepth = query.length - 1;
@ -446,50 +519,55 @@ $.fn.search = function(source, parameters) {
if ( $.isFunction( found ) ) {
return found.apply(context, passedArguments);
}
// return retrieved variable or chain
return found;
return found || false;
}
};
// check for invoking internal method
if(methodInvoked) {
invokedResponse = module.invoke(query, element, passedArguments);
if(instance === undefined) {
module.initialize();
}
invokedResponse = module.invoke(query);
}
// otherwise initialize
else {
if(instance !== undefined) {
module.destroy();
}
module.initialize();
}
})
;
// chain or return queried method
return (invokedResponse !== undefined)
return (invokedResponse)
? invokedResponse
: this
;
};
$.fn.search.settings = {
moduleName : 'Search Module',
debug : true,
namespace : 'search',
moduleName : 'Search Module',
namespace : 'search',
debug : true,
verbose : true,
performance : true,
// onSelect default action is defined in module
onSelect : 'default',
onResultsAdd : 'default',
onSearchQuery : function(){},
onresults : function(response){},
onResultsOpen : function(){},
onResultsClose : function(){},
automatic : 'true',
type : 'simple',
minCharacters : 3,
searchThrottle : 300,
maxResults : 7,
cache : true,
onSelect : 'default',
onResultsAdd : 'default',
onSearchQuery : function(){},
onResults : function(response){},
onResultsOpen : function(){},
onResultsClose : function(){},
automatic : 'true',
type : 'simple',
minCharacters : 3,
searchThrottle : 300,
maxResults : 7,
cache : true,
searchFields : [
'title',

2
src/modules/star.js

@ -157,7 +157,7 @@
$.fn.starReview.settings = {
moduleName : 'Star Module',
moduleName : 'Star',
namespace : 'star',
rateable : true,

2
src/modules/tab.js

@ -577,7 +577,7 @@
$.fn.tab.settings = {
moduleName : 'Tab Module',
moduleName : 'Tab',
verbose : true,
debug : true,
performance : true,

Loading…
Cancel
Save