aboutsummaryrefslogtreecommitdiff
path: root/src/js
diff options
context:
space:
mode:
authorDavid Barksdale <amatus@amatus.name>2015-07-18 20:28:46 -0500
committerDavid Barksdale <amatus@amatus.name>2015-07-18 20:28:46 -0500
commit688a411dcfb0a07e6f464b30ac6144a0c9602e31 (patch)
tree3002e14ee28998020ca3fcb6526add3515c50685 /src/js
parent88e5e2307a5bce44a19f452e4b93dc1656c8c874 (diff)
Upgrade to Hoplon 6 and Boot 2
Diffstat (limited to 'src/js')
-rw-r--r--src/js/deps.cljs7
-rw-r--r--src/js/semantic.js15420
-rw-r--r--src/js/semantic.min.js (renamed from src/js/semantic.min.inc.js)0
3 files changed, 15427 insertions, 0 deletions
diff --git a/src/js/deps.cljs b/src/js/deps.cljs
new file mode 100644
index 0000000..74ab9a4
--- /dev/null
+++ b/src/js/deps.cljs
@@ -0,0 +1,7 @@
+{:foreign-libs [{:file "client-lib.js"
+ :provides ["client-lib"]}
+ {:file "semantic.js"
+ :file-min "semantic.min.js"
+ :provides ["semantic-ui"]
+ :requires ["cljsjs.jquery"]}]
+ :externs ["window.crypto.ext.js"]}
diff --git a/src/js/semantic.js b/src/js/semantic.js
new file mode 100644
index 0000000..c0ea5b7
--- /dev/null
+++ b/src/js/semantic.js
@@ -0,0 +1,15420 @@
+ /*
+ * # Semantic UI
+ * https://github.com/Semantic-Org/Semantic-UI
+ * http://www.semantic-ui.com/
+ *
+ * Copyright 2014 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+/*
+ * # Semantic - Site
+ * http://github.com/semantic-org/semantic-ui/
+ *
+ *
+ * Copyright 2014 Contributor
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+;(function ( $, window, document, undefined ) {
+
+$.site = $.fn.site = function(parameters) {
+ var
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.site.settings, parameters)
+ : $.extend({}, $.site.settings),
+
+ namespace = settings.namespace,
+ error = settings.error,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $document = $(document),
+ $module = $document,
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ module,
+ returnedValue
+ ;
+ module = {
+
+ initialize: function() {
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of site', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ normalize: function() {
+ module.fix.console();
+ module.fix.requestAnimationFrame();
+ },
+
+ fix: {
+ console: function() {
+ module.debug('Normalizing window.console');
+ if (console === undefined || console.log === undefined) {
+ module.verbose('Console not available, normalizing events');
+ module.disable.console();
+ }
+ if (typeof console.group == 'undefined' || typeof console.groupEnd == 'undefined' || typeof console.groupCollapsed == 'undefined') {
+ module.verbose('Console group not available, normalizing events');
+ window.console.group = function() {};
+ window.console.groupEnd = function() {};
+ window.console.groupCollapsed = function() {};
+ }
+ if (typeof console.markTimeline == 'undefined') {
+ module.verbose('Mark timeline not available, normalizing events');
+ window.console.markTimeline = function() {};
+ }
+ },
+ consoleClear: function() {
+ module.debug('Disabling programmatic console clearing');
+ window.console.clear = function() {};
+ },
+ requestAnimationFrame: function() {
+ module.debug('Normalizing requestAnimationFrame');
+ if(window.requestAnimationFrame === undefined) {
+ module.debug('RequestAnimationFrame not available, normailizing event');
+ window.requestAnimationFrame = window.requestAnimationFrame
+ || window.mozRequestAnimationFrame
+ || window.webkitRequestAnimationFrame
+ || window.msRequestAnimationFrame
+ || function(callback) { setTimeout(callback, 0); }
+ ;
+ }
+ }
+ },
+
+ moduleExists: function(name) {
+ return ($.fn[name] !== undefined && $.fn[name].settings !== undefined);
+ },
+
+ enabled: {
+ modules: function(modules) {
+ var
+ enabledModules = []
+ ;
+ modules = modules || settings.modules;
+ $.each(modules, function(index, name) {
+ if(module.moduleExists(name)) {
+ enabledModules.push(name);
+ }
+ });
+ return enabledModules;
+ }
+ },
+
+ disabled: {
+ modules: function(modules) {
+ var
+ disabledModules = []
+ ;
+ modules = modules || settings.modules;
+ $.each(modules, function(index, name) {
+ if(!module.moduleExists(name)) {
+ disabledModules.push(name);
+ }
+ });
+ return disabledModules;
+ }
+ },
+
+ change: {
+ setting: function(setting, value, modules, modifyExisting) {
+ modules = (typeof modules === 'string')
+ ? (modules === 'all')
+ ? settings.modules
+ : [modules]
+ : modules || settings.modules
+ ;
+ modifyExisting = (modifyExisting !== undefined)
+ ? modifyExisting
+ : true
+ ;
+ $.each(modules, function(index, name) {
+ var
+ namespace = (module.moduleExists(name))
+ ? $.fn[name].settings.namespace || false
+ : true,
+ $existingModules
+ ;
+ if(module.moduleExists(name)) {
+ module.verbose('Changing default setting', setting, value, name);
+ $.fn[name].settings[setting] = value;
+ if(modifyExisting && namespace) {
+ $existingModules = $(':data(module-' + namespace + ')');
+ if($existingModules.size() > 0) {
+ module.verbose('Modifying existing settings', $existingModules);
+ $existingModules[name]('setting', setting, value);
+ }
+ }
+ }
+ });
+ },
+ settings: function(newSettings, modules, modifyExisting) {
+ modules = (typeof modules === 'string')
+ ? [modules]
+ : modules || settings.modules
+ ;
+ modifyExisting = (modifyExisting !== undefined)
+ ? modifyExisting
+ : true
+ ;
+ $.each(modules, function(index, name) {
+ var
+ $existingModules
+ ;
+ if(module.moduleExists(name)) {
+ module.verbose('Changing default setting', newSettings, name);
+ $.extend(true, $.fn[name].settings, newSettings);
+ if(modifyExisting && namespace) {
+ $existingModules = $(':data(module-' + namespace + ')');
+ if($existingModules.size() > 0) {
+ module.verbose('Modifying existing settings', $existingModules);
+ $existingModules[name]('setting', newSettings);
+ }
+ }
+ }
+ });
+ }
+ },
+
+ enable: {
+ console: function() {
+ module.console(true);
+ },
+ debug: function(modules, modifyExisting) {
+ modules = modules || settings.modules;
+ module.debug('Enabling debug for modules', modules);
+ module.change.setting('debug', true, modules, modifyExisting);
+ },
+ verbose: function(modules, modifyExisting) {
+ modules = modules || settings.modules;
+ module.debug('Enabling verbose debug for modules', modules);
+ module.change.setting('verbose', true, modules, modifyExisting);
+ }
+ },
+ disable: {
+ console: function() {
+ module.console(false);
+ },
+ debug: function(modules, modifyExisting) {
+ modules = modules || settings.modules;
+ module.debug('Disabling debug for modules', modules);
+ module.change.setting('debug', false, modules, modifyExisting);
+ },
+ verbose: function(modules, modifyExisting) {
+ modules = modules || settings.modules;
+ module.debug('Disabling verbose debug for modules', modules);
+ module.change.setting('verbose', false, modules, modifyExisting);
+ }
+ },
+
+ console: function(enable) {
+ if(enable) {
+ if(instance.cache.console === undefined) {
+ module.error(error.console);
+ return;
+ }
+ module.debug('Restoring console function');
+ window.console = instance.cache.console;
+ }
+ else {
+ module.debug('Disabling console function');
+ instance.cache.console = window.console;
+ window.console = {
+ clear : function(){},
+ error : function(){},
+ group : function(){},
+ groupCollapsed : function(){},
+ groupEnd : function(){},
+ info : function(){},
+ log : function(){},
+ markTimeline : function(){},
+ warn : function(){}
+ };
+ }
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous site for', $module);
+ $module
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ cache: {},
+
+ setting: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ settings[name] = value;
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ 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.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ 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.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ },
+ 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.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ 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) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if($.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ module.destroy();
+ }
+ module.initialize();
+ }
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.site.settings = {
+
+ name : 'Site',
+ namespace : 'site',
+
+ error : {
+ console : 'Console cannot be restored, most likely it was overwritten outside of module',
+ method : 'The method you called is not defined.'
+ },
+
+ debug : false,
+ verbose : true,
+ performance : true,
+
+ modules: [
+ 'accordion',
+ 'api',
+ 'checkbox',
+ 'dimmer',
+ 'dropdown',
+ 'form',
+ 'modal',
+ 'nag',
+ 'popup',
+ 'rating',
+ 'shape',
+ 'sidebar',
+ 'state',
+ 'sticky',
+ 'tab',
+ 'transition',
+ 'video',
+ 'visit',
+ 'visibility'
+ ],
+
+ siteNamespace : 'site',
+ namespaceStub : {
+ cache : {},
+ config : {},
+ sections : {},
+ section : {},
+ utilities : {}
+ }
+
+};
+
+// allows for selection of elements with data attributes
+$.extend($.expr[ ":" ], {
+ data: ($.expr.createPseudo)
+ ? $.expr.createPseudo(function(dataName) {
+ return function(elem) {
+ return !!$.data(elem, dataName);
+ };
+ })
+ : function(elem, i, match) {
+ // support: jQuery < 1.8
+ return !!$.data(elem, match[ 3 ]);
+ }
+});
+
+
+})( jQuery, window , document );
+/*
+ * # Semantic - Form Validation
+ * http://github.com/semantic-org/semantic-ui/
+ *
+ *
+ * Copyright 2014 Contributor
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ( $, window, document, undefined ) {
+
+$.fn.form = function(fields, parameters) {
+ var
+ $allModules = $(this),
+
+ settings = $.extend(true, {}, $.fn.form.settings, parameters),
+ validation = $.extend({}, $.fn.form.settings.defaults, fields),
+
+ namespace = settings.namespace,
+ metadata = settings.metadata,
+ selector = settings.selector,
+ className = settings.className,
+ error = settings.error,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+ $allModules
+ .each(function() {
+ var
+ $module = $(this),
+ $field = $(this).find(selector.field),
+ $group = $(this).find(selector.group),
+ $message = $(this).find(selector.message),
+ $prompt = $(this).find(selector.prompt),
+ $submit = $(this).find(selector.submit),
+
+ formErrors = [],
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.verbose('Initializing form validation', $module, validation, settings);
+ module.bindEvents();
+ 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.removeEvents();
+ $module
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ refresh: function() {
+ module.verbose('Refreshing selector cache');
+ $field = $module.find(selector.field);
+ },
+
+ submit: function() {
+ module.verbose('Submitting form', $module);
+ $module
+ .submit()
+ ;
+ },
+
+ attachEvents: function(selector, action) {
+ action = action || 'submit';
+ $(selector)
+ .on('click', function(event) {
+ module[action]();
+ event.preventDefault();
+ })
+ ;
+ },
+
+ bindEvents: function() {
+
+ if(settings.keyboardShortcuts) {
+ $field
+ .on('keydown' + eventNamespace, module.event.field.keydown)
+ ;
+ }
+ $module
+ .on('submit' + eventNamespace, module.validate.form)
+ ;
+ $field
+ .on('blur' + eventNamespace, module.event.field.blur)
+ ;
+ // attach submit events
+ module.attachEvents($submit, 'submit');
+
+ $field
+ .each(function() {
+ var
+ type = $(this).prop('type'),
+ inputEvent = module.get.changeEvent(type)
+ ;
+ $(this)
+ .on(inputEvent + eventNamespace, module.event.field.change)
+ ;
+ })
+ ;
+ },
+
+ removeEvents: function() {
+ $module
+ .off(eventNamespace)
+ ;
+ $field
+ .off(eventNamespace)
+ ;
+ $submit
+ .off(eventNamespace)
+ ;
+ $field
+ .off(eventNamespace)
+ ;
+ },
+
+ event: {
+ field: {
+ keydown: function(event) {
+ var
+ $field = $(this),
+ key = event.which,
+ keyCode = {
+ enter : 13,
+ escape : 27
+ }
+ ;
+ if( key == keyCode.escape) {
+ module.verbose('Escape key pressed blurring field');
+ $field
+ .blur()
+ ;
+ }
+ if(!event.ctrlKey && key == keyCode.enter && $field.is(selector.input) && $field.not(selector.checkbox).size() > 0 ) {
+ module.debug('Enter key pressed, submitting form');
+ $submit
+ .addClass(className.down)
+ ;
+ $field
+ .one('keyup' + eventNamespace, module.event.field.keyup)
+ ;
+ }
+ },
+ keyup: function() {
+ module.verbose('Doing keyboard shortcut form submit');
+ $submit.removeClass(className.down);
+ module.submit();
+ },
+ blur: function() {
+ var
+ $field = $(this),
+ $fieldGroup = $field.closest($group)
+ ;
+ if( $fieldGroup.hasClass(className.error) ) {
+ module.debug('Revalidating field', $field, module.get.validation($field));
+ module.validate.field( module.get.validation($field) );
+ }
+ else if(settings.on == 'blur' || settings.on == 'change') {
+ module.validate.field( module.get.validation($field) );
+ }
+ },
+ change: function() {
+ var
+ $field = $(this),
+ $fieldGroup = $field.closest($group)
+ ;
+ if(settings.on == 'change' || ( $fieldGroup.hasClass(className.error) && settings.revalidate) ) {
+ clearTimeout(module.timer);
+ module.timer = setTimeout(function() {
+ module.debug('Revalidating field', $field, module.get.validation($field));
+ module.validate.field( module.get.validation($field) );
+ }, settings.delay);
+ }
+ }
+ }
+
+ },
+
+ get: {
+ changeEvent: function(type) {
+ if(type == 'checkbox' || type == 'radio' || type == 'hidden') {
+ return 'change';
+ }
+ else {
+ return (document.createElement('input').oninput !== undefined)
+ ? 'input'
+ : (document.createElement('input').onpropertychange !== undefined)
+ ? 'propertychange'
+ : 'keyup'
+ ;
+ }
+ },
+ field: function(identifier) {
+ module.verbose('Finding field with identifier', identifier);
+ if( $field.filter('#' + identifier).size() > 0 ) {
+ return $field.filter('#' + identifier);
+ }
+ else if( $field.filter('[name="' + identifier +'"]').size() > 0 ) {
+ return $field.filter('[name="' + identifier +'"]');
+ }
+ else if( $field.filter('[data-' + metadata.validate + '="'+ identifier +'"]').size() > 0 ) {
+ return $field.filter('[data-' + metadata.validate + '="'+ identifier +'"]');
+ }
+ return $('<input/>');
+ },
+ validation: function($field) {
+ var
+ rules
+ ;
+ $.each(validation, function(fieldName, field) {
+ if( module.get.field(field.identifier).get(0) == $field.get(0) ) {
+ rules = field;
+ }
+ });
+ return rules || false;
+ }
+ },
+
+ has: {
+
+ field: function(identifier) {
+ module.verbose('Checking for existence of a field with identifier', identifier);
+ if( $field.filter('#' + identifier).size() > 0 ) {
+ return true;
+ }
+ else if( $field.filter('[name="' + identifier +'"]').size() > 0 ) {
+ return true;
+ }
+ else if( $field.filter('[data-' + metadata.validate + '="'+ identifier +'"]').size() > 0 ) {
+ return true;
+ }
+ return false;
+ }
+
+ },
+
+ add: {
+ prompt: function(identifier, errors) {
+ var
+ $field = module.get.field(identifier),
+ $fieldGroup = $field.closest($group),
+ $prompt = $fieldGroup.find(selector.prompt),
+ promptExists = ($prompt.size() !== 0)
+ ;
+ errors = (typeof errors == 'string')
+ ? [errors]
+ : errors
+ ;
+ module.verbose('Adding field error state', identifier);
+ $fieldGroup
+ .addClass(className.error)
+ ;
+ if(settings.inline) {
+ if(!promptExists) {
+ $prompt = settings.templates.prompt(errors);
+ $prompt
+ .appendTo($fieldGroup)
+ ;
+ }
+ $prompt
+ .html(errors[0])
+ ;
+ if(!promptExists) {
+ if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
+ module.verbose('Displaying error with css transition', settings.transition);
+ $prompt.transition(settings.transition + ' in', settings.duration);
+ }
+ else {
+ module.verbose('Displaying error with fallback javascript animation');
+ $prompt
+ .fadeIn(settings.duration)
+ ;
+ }
+ }
+ else {
+ module.verbose('Inline errors are disabled, no inline error added', identifier);
+ }
+ }
+ },
+ errors: function(errors) {
+ module.debug('Adding form error messages', errors);
+ $message
+ .html( settings.templates.error(errors) )
+ ;
+ }
+ },
+
+ remove: {
+ prompt: function(field) {
+ var
+ $field = module.get.field(field.identifier),
+ $fieldGroup = $field.closest($group),
+ $prompt = $fieldGroup.find(selector.prompt)
+ ;
+ $fieldGroup
+ .removeClass(className.error)
+ ;
+ if(settings.inline && $prompt.is(':visible')) {
+ module.verbose('Removing prompt for field', field);
+ if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
+ $prompt.transition(settings.transition + ' out', settings.duration, function() {
+ $prompt.remove();
+ });
+ }
+ else {
+ $prompt
+ .fadeOut(settings.duration, function(){
+ $prompt.remove();
+ })
+ ;
+ }
+ }
+ }
+ },
+
+ set: {
+ success: function() {
+ $module
+ .removeClass(className.error)
+ .addClass(className.success)
+ ;
+ },
+ error: function() {
+ $module
+ .removeClass(className.success)
+ .addClass(className.error)
+ ;
+ }
+ },
+
+ validate: {
+
+ form: function(event) {
+ var
+ allValid = true,
+ apiRequest
+ ;
+ // reset errors
+ formErrors = [];
+ $.each(validation, function(fieldName, field) {
+ if( !( module.validate.field(field) ) ) {
+ allValid = false;
+ }
+ });
+ if(allValid) {
+ module.debug('Form has no validation errors, submitting');
+ module.set.success();
+ return $.proxy(settings.onSuccess, this)(event);
+ }
+ else {
+ module.debug('Form has errors');
+ module.set.error();
+ if(!settings.inline) {
+ module.add.errors(formErrors);
+ }
+ // prevent ajax submit
+ if($module.data('moduleApi') !== undefined) {
+ event.stopImmediatePropagation();
+ }
+ return $.proxy(settings.onFailure, this)(formErrors);
+ }
+ },
+
+ // takes a validation object and returns whether field passes validation
+ field: function(field) {
+ var
+ $field = module.get.field(field.identifier),
+ fieldValid = true,
+ fieldErrors = []
+ ;
+ if(field.optional && $.trim($field.val()) === ''){
+ module.debug('Field is optional and empty. Skipping', field.identifier);
+ fieldValid = true;
+ }
+ else if(field.rules !== undefined) {
+ $.each(field.rules, function(index, rule) {
+ if( module.has.field(field.identifier) && !( module.validate.rule(field, rule) ) ) {
+ module.debug('Field is invalid', field.identifier, rule.type);
+ fieldErrors.push(rule.prompt);
+ fieldValid = false;
+ }
+ });
+ }
+ if(fieldValid) {
+ module.remove.prompt(field, fieldErrors);
+ $.proxy(settings.onValid, $field)();
+ }
+ else {
+ formErrors = formErrors.concat(fieldErrors);
+ module.add.prompt(field.identifier, fieldErrors);
+ $.proxy(settings.onInvalid, $field)(fieldErrors);
+ return false;
+ }
+ return true;
+ },
+
+ // takes validation rule and returns whether field passes rule
+ rule: function(field, validation) {
+ var
+ $field = module.get.field(field.identifier),
+ type = validation.type,
+ value = $.trim($field.val() + ''),
+
+ bracketRegExp = /\[(.*)\]/i,
+ bracket = bracketRegExp.exec(type),
+ isValid = true,
+ ancillary,
+ functionType
+ ;
+ // if bracket notation is used, pass in extra parameters
+ if(bracket !== undefined && bracket !== null) {
+ ancillary = '' + bracket[1];
+ functionType = type.replace(bracket[0], '');
+ isValid = $.proxy(settings.rules[functionType], $module)(value, ancillary);
+ }
+ // normal notation
+ else {
+ isValid = $.proxy(settings.rules[type], $field)(value);
+ }
+ return isValid;
+ }
+ },
+
+ setting: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ settings[name] = value;
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ 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.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ 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.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ },
+ 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({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 100);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if($allModules.size() > 1) {
+ title += ' ' + '(' + $allModules.size() + ')';
+ }
+ 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) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {