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' $module = typeof this == 'object'
? $(context) ? $(context)
: $context, : $context,
element = this,
time = new Date().getTime(),
performance = [],
moduleSelector = $module.selector || '',
instance = $module.data('module-' + settings.namespace), moduleNamespace = settings.namespace + '-module',
element = $module.get(), className = settings.className,
query = arguments[0], metadata = settings.metadata,
methodInvoked = (typeof query == 'string'), errors = settings.errors,
queryArguments = [].slice.call(arguments, 1), instance = $module.data(moduleNamespace),
invokedResponse,
className = settings.className, query = arguments[0],
metadata = settings.metadata, methodInvoked = (instance !== undefined && typeof query == 'string'),
errors = settings.errors, queryArguments = [].slice.call(arguments, 1),
module module,
invokedResponse
; ;
module = { module = {
initialize: function() { initialize: function() {
var var
exitConditions = false,
runSettings, runSettings,
loadingTimer = new Date().getTime(), loadingTimer = new Date().getTime(),
@ -83,7 +89,6 @@
promise, promise,
url, url,
urlVariables,
formData = {}, formData = {},
data, data,
@ -324,7 +329,6 @@
}, },
url: function(url, urlData) { url: function(url, urlData) {
var var
missingTerm = false,
urlVariables urlVariables
; ;
if(url) { if(url) {
@ -375,27 +379,104 @@
.removeClass(className.loading) .removeClass(className.loading)
; ;
}, },
/* standard module */
setting: function(name, value) { 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]; return settings[name];
} }
settings[name] = value;
}, },
verbose: function() { internal: function(name, value) {
if(settings.verbose && settings.debug) { if(value !== undefined) {
module.verbose = Function.prototype.bind.call(console.info, console, settings.moduleName + ':'); if( $.isPlainObject(name) ) {
$.extend(true, module, name);
}
else {
module[name] = value;
}
}
else {
return module[name];
} }
}, },
debug: function() { debug: function() {
if(settings.debug) { 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() { 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) { invoke: function(query, passedArguments, context) {
@ -411,18 +492,17 @@
$.each(query, function(depth, value) { $.each(query, function(depth, value) {
if( $.isPlainObject( instance[value] ) && (depth != maxDepth) ) { if( $.isPlainObject( instance[value] ) && (depth != maxDepth) ) {
instance = instance[value]; instance = instance[value];
return true;
} }
else if( instance[value] !== undefined ) { else if( instance[value] !== undefined ) {
found = instance[value]; found = instance[value];
return true;
} }
module.error(errors.method); else {
return false; module.error(errors.method);
}
}); });
} }
if ( $.isFunction( found ) ) { if ( $.isFunction( found ) ) {
instance.verbose('Executing invoked function', found); module.verbose('Executing invoked function', found);
return found.apply(context, passedArguments); return found.apply(context, passedArguments);
} }
return found || false; return found || false;
@ -441,7 +521,8 @@
} }
module.initialize(); module.initialize();
} }
return (invokedResponse) return (invokedResponse !== undefined)
? invokedResponse ? invokedResponse
: this : this
; ;
@ -454,7 +535,6 @@
var var
// if only function passed it is success callback // if only function passed it is success callback
$module = $(this), $module = $(this),
element = this,
selector = $(this).selector || '', selector = $(this).selector || '',
settings = ( $.isFunction(parameters) ) settings = ( $.isFunction(parameters) )
@ -488,25 +568,25 @@
}; };
$.api.settings = { $.api.settings = {
moduleName : 'API Module', moduleName : 'API',
namespace : 'api', namespace : 'api',
debug : true, debug : true,
verbose : true, verbose : true,
performance : true,
api : {}, api : {},
beforeSend : function(settings) { beforeSend : function(settings) {
return settings; return settings;
}, },
beforeXHR : function(xhr) {}, beforeXHR : function(xhr) {},
success : function(response) {},
success : function(response) {}, complete : function(response) {},
complete : function(response) {}, failure : function(errorCode) {},
failure : function(errorCode) {}, progress : false,
progress : false,
errors : { errors : {
missingAction : 'API action used but no url was defined', missingAction : 'API action used but no url was defined',
missingURL : 'URL not specified for the API action', missingURL : 'URL not specified for the API action',
missingParameter : 'Missing an essential URL parameter: ', 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), settings = $.extend(true, {}, $.fn.form.settings, parameters),
validation = $.extend({}, $.fn.form.settings.defaults, fields), validation = $.extend({}, $.fn.form.settings.defaults, fields),
eventNamespace = '.' + settings.namespace,
moduleNamespace = 'module-' + settings.namespace,
moduleSelector = $allModules.selector || '', moduleSelector = $allModules.selector || '',
time = new Date().getTime(), time = new Date().getTime(),
@ -46,6 +44,9 @@ $.fn.form = function(fields, parameters) {
element = this, element = this,
instance = $module.data('module-' + settings.namespace), instance = $module.data('module-' + settings.namespace),
eventNamespace = '.' + settings.namespace,
moduleNamespace = 'module-' + settings.namespace,
namespace = settings.namespace, namespace = settings.namespace,
metadata = settings.metadata, metadata = settings.metadata,
className = settings.className, className = settings.className,
@ -71,15 +72,27 @@ $.fn.form = function(fields, parameters) {
$submit $submit
.on('click' + eventNamespace, module.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() { destroy: function() {
module.verbose('Destroying previous module', instance);
$module $module
.off(namespace) .off(eventNamespace)
.removeData(moduleNamespace)
; ;
}, },
refresh: function() { refresh: function() {
module.verbose('Refreshing selector cache');
$field = $module.find(settings.selector.field); $field = $module.find(settings.selector.field);
}, },
@ -331,6 +344,7 @@ $.fn.form = function(fields, parameters) {
}, },
setting: function(name, value) { setting: function(name, value) {
module.debug('Changing setting', name, value);
if(value !== undefined) { if(value !== undefined) {
if( $.isPlainObject(name) ) { if( $.isPlainObject(name) ) {
$.extend(true, settings, name); $.extend(true, settings, name);
@ -344,6 +358,7 @@ $.fn.form = function(fields, parameters) {
} }
}, },
internal: function(name, value) { internal: function(name, value) {
module.debug('Changing internal', name, value);
if(value !== undefined) { if(value !== undefined) {
if( $.isPlainObject(name) ) { if( $.isPlainObject(name) ) {
$.extend(true, module, name); $.extend(true, module, name);
@ -391,44 +406,42 @@ $.fn.form = function(fields, parameters) {
previousTime = time || currentTime, previousTime = time || currentTime,
executionTime = currentTime - previousTime; executionTime = currentTime - previousTime;
time = currentTime; time = currentTime;
performance.push({ performance.push({
'Element' : element, 'Element' : element,
'Name' : message[0], 'Name' : message[0],
'Arguments' : message[1] || 'None', 'Arguments' : [].slice.call(message, 1) || '',
'Execution Time' : executionTime '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() { display: function() {
var var
title = settings.moduleName, title = settings.moduleName + ':',
caption = settings.moduleName + ': ' + moduleSelector + '(' + $allModules.size() + ' elements)', totalTime = 0
totalExecutionTime = 0
; ;
time = false;
$.each(performance, function(index, data) {
totalTime += data['Execution Time'];
});
title += ' ' + totalTime + 'ms';
if(moduleSelector) { if(moduleSelector) {
title += ' Performance (' + moduleSelector + ')'; title += ' \'' + moduleSelector + '\'';
} }
if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) { if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
console.groupCollapsed(title); console.groupCollapsed(title);
if(console.table) { if(console.table) {
$.each(performance, function(index, data) {
totalExecutionTime += data['Execution Time'];
});
console.table(performance); console.table(performance);
} }
else { else {
$.each(performance, function(index, data) { $.each(performance, function(index, data) {
totalExecutionTime += data['Execution Time'];
console.log(data['Name'] + ': ' + data['Execution Time']+'ms'); console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
}); });
} }
console.log('Total Execution Time:', totalExecutionTime +'ms');
console.groupEnd(); console.groupEnd();
performance = [];
time = false;
} }
performance = [];
} }
}, },
invoke: function(query, passedArguments, context) { invoke: function(query, passedArguments, context) {
@ -444,23 +457,22 @@ $.fn.form = function(fields, parameters) {
$.each(query, function(depth, value) { $.each(query, function(depth, value) {
if( $.isPlainObject( instance[value] ) && (depth != maxDepth) ) { if( $.isPlainObject( instance[value] ) && (depth != maxDepth) ) {
instance = instance[value]; instance = instance[value];
return true;
} }
else if( instance[value] !== undefined ) { else if( instance[value] !== undefined ) {
found = instance[value]; found = instance[value];
return true;
} }
else { module.error(errors.method);
module.error(error.method); return false;
}
}); });
} }
if ( $.isFunction( found ) ) { if ( $.isFunction( found ) ) {
instance.verbose('Executing invoked function', found);
return found.apply(context, passedArguments); return found.apply(context, passedArguments);
} }
return found || false; return found || false;
} }
}; };
if(methodInvoked) { if(methodInvoked) {
if(instance === undefined) { if(instance === undefined) {
module.initialize(); module.initialize();
@ -473,6 +485,7 @@ $.fn.form = function(fields, parameters) {
} }
module.initialize(); module.initialize();
} }
}) })
; ;
return (invokedResponse) return (invokedResponse)
@ -485,10 +498,12 @@ $.fn.form.settings = {
// module info // module info
moduleName : 'Form', moduleName : 'Form',
debug : true, debug : true,
verbose : true, verbose : true,
performance : false, performance : true,
namespace : 'validate', namespace : 'form',
keyboardShortcuts : true, keyboardShortcuts : true,
on : 'submit', on : 'submit',

226
src/modules/behavior/state.js

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

2
src/modules/carousel.js

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

2
src/modules/chat.js

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

6
src/modules/nag.js

@ -223,10 +223,10 @@ $.fn.nag = function(parameters) {
return true; return true;
} }
if(module.storage.get(settings.storedKey) != settings.storedValue) { 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; 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; return false;
}, },
stick: function() { stick: function() {
@ -445,7 +445,7 @@ $.fn.nag = function(parameters) {
$.fn.nag.settings = { $.fn.nag.settings = {
moduleName : 'Nag Module', moduleName : 'Nag',
verbose : true, verbose : true,
debug : true, debug : true,

252
src/modules/search.js

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

2
src/modules/star.js

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

2
src/modules/tab.js

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

|||||||
100:0
Loading…
Cancel
Save