Skip to content
Snippets Groups Projects
Commit 9dbbb0ad authored by Justin Cleveland's avatar Justin Cleveland
Browse files

Merge branch 'master' of https://bitbucket.org/xnatdev/xnat-web

parents 771e5ee0 050b2415
No related branches found
No related tags found
No related merge requests found
Showing
with 6165 additions and 2107 deletions
......@@ -183,6 +183,17 @@ dependencies {
compile "dcm4che:dcm4che-iod:2.0.25"
compile "dcm4che:dcm4che-net:2.0.25"
compile "org.springframework:spring-aop:${vSpring}"
compile "org.springframework:spring-beans:${vSpring}"
compile "org.springframework:spring-context-support:${vSpring}"
compile "org.springframework:spring-context:${vSpring}"
compile "org.springframework:spring-core:${vSpring}"
compile "org.springframework:spring-jdbc:${vSpring}"
compile "org.springframework:spring-jms:${vSpring}"
compile "org.springframework:spring-messaging:${vSpring}"
compile "org.springframework:spring-orm:${vSpring}"
compile "org.springframework:spring-oxm:${vSpring}"
compile "org.springframework:spring-tx:${vSpring}"
compile "org.springframework:spring-web:${vSpring}"
compile "org.springframework:spring-webmvc:${vSpring}"
......
Source diff could not be displayed: it is too large. Options to address this: view the blob.
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by Tim Olsen (Washington University) -->
<Instance_Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schemas/xdat/instance.xsd" site_url="http://xnat17dev.xnat.org" admin_email="jrherrick@wustl.edu" archive_root_path="/data/xnat17/archive" prearchive_path="/data/xnat17/prearchive" cache_path="/data/xnat17/cache" smtp_server="irony.wusm.wustl.edu" ftp_path="/data/xnat17/ftp" build_path="/data/xnat17/build" pipeline_path="/data/xnat17/pipeline" require_login="true" user_registration="false" enable_csrf_token="true">
<Instance_Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schemas/xdat/instance.xsd"
site_url="http://localhost:8080" admin_email="administrator@xnat.org" archive_root_path="/data/xnat/archive"
prearchive_path="/data/xnat/prearchive" cache_path="/data/xnat/cache"
smtp_server="irony.wusm.wustl.edu" ftp_path="/data/xnat/ftp" build_path="/data/xnat/build"
pipeline_path="/data/xnat/pipeline" require_login="true" user_registration="false" enable_csrf_token="true">
<Databases>
<Database Type="POSTGRESQL" Id="xnat17" Driver="org.postgresql.Driver" Url="jdbc:postgresql://localhost/xnat17" User="xnat" Pass="xnat" MaxConnections="10"/>
<Database Type="POSTGRESQL" Id="xnat" Driver="org.postgresql.Driver" Url="jdbc:postgresql://localhost/xnat" User="xnat" Pass="xnat" MaxConnections="10"/>
</Databases>
<Models>
<Data_Model File_Name="security.xsd" File_Location="schemas/security" DB="xnat17"/>
<Data_Model File_Name="birnprov.xsd" File_Location="schemas/birn" DB="xnat17"/>
<Data_Model File_Name="xnat.xsd" File_Location="schemas/xnat" DB="xnat17"/>
<Data_Model File_Name="workflow.xsd" File_Location="schemas/pipeline" DB="xnat17"/>
<Data_Model File_Name="repository.xsd" File_Location="schemas/pipeline" DB="xnat17"/>
<Data_Model File_Name="project.xsd" File_Location="schemas/project" DB="xnat17"/>
<Data_Model File_Name="assessments.xsd" File_Location="schemas/assessments" DB="xnat17"/>
<Data_Model File_Name="catalog.xsd" File_Location="schemas/catalog" DB="xnat17"/>
<Data_Model File_Name="protocolValidation.xsd" File_Location="schemas/validation" DB="xnat17"/>
<Data_Model File_Name="screeningAssessment.xsd" File_Location="schemas/screening" DB="xnat17"/>
<Data_Model File_Name="security.xsd" File_Location="schemas/security" DB="xnat"/>
<Data_Model File_Name="birnprov.xsd" File_Location="schemas/birn" DB="xnat"/>
<Data_Model File_Name="xnat.xsd" File_Location="schemas/xnat" DB="xnat"/>
<Data_Model File_Name="workflow.xsd" File_Location="schemas/pipeline" DB="xnat"/>
<Data_Model File_Name="repository.xsd" File_Location="schemas/pipeline" DB="xnat"/>
<Data_Model File_Name="project.xsd" File_Location="schemas/project" DB="xnat"/>
<Data_Model File_Name="assessments.xsd" File_Location="schemas/assessments" DB="xnat"/>
<Data_Model File_Name="catalog.xsd" File_Location="schemas/catalog" DB="xnat"/>
<Data_Model File_Name="protocolValidation.xsd" File_Location="schemas/validation" DB="xnat"/>
<Data_Model File_Name="screeningAssessment.xsd" File_Location="schemas/screening" DB="xnat"/>
<!--<Data_Model File_Name="ext.xsd" File_Location="schemas/ext" DB="xnat17"/>-->
<!--<Data_Model File_Name="ext.xsd" File_Location="schemas/ext" DB="xnat"/>-->
<!-- Start modules schemas: Reserved for xnat_builder, don't modify anything between this line and the end modules line. -->
<!-- End modules schemas: Reserved for xnat_builder, don't modify anything between this line and the start modules line. -->
</Models>
......
......@@ -260,7 +260,7 @@ use.ssl=false
# will be initialized. Keep this is mind if you have services
# that depend on other services during initialization.
# -------------------------------------------------------------------
services.AvalonComponentService.classname=org.apache.turbine.services.avaloncomponent.TurbineAvalonComponentService
# services.AvalonComponentService.classname=org.apache.turbine.services.avaloncomponent.TurbineAvalonComponentService
services.CryptoService.classname=org.apache.turbine.services.crypto.TurbineCryptoService
#services.ComponentService.classname=org.apache.turbine.services.component.TurbineComponentService
services.FactoryService.classname=org.apache.turbine.services.factory.TurbineFactoryService
......@@ -660,12 +660,12 @@ url.case.folding=lower
#
# Name and location to the configuration file for the components.
#
services.AvalonComponentService.componentConfiguration = WEB-INF/conf/componentConfiguration.xml
# services.AvalonComponentService.componentConfiguration = WEB-INF/conf/componentConfiguration.xml
#
# Name and location to the configuration file for the component roles.
#
services.AvalonComponentService.componentRoles = WEB-INF/conf/roleConfiguration.xml
# services.AvalonComponentService.componentRoles = WEB-INF/conf/roleConfiguration.xml
# -------------------------------------------------------------------
#
......
......@@ -117,7 +117,7 @@ log4j.additivity.org.nrg.automation=false
#
log4j.appender.turbine=org.apache.log4j.DailyRollingFileAppender
log4j.appender.turbine.DatePattern='.'yyy-MM-dd
log4j.appender.turbine.file=${applicationRoot}/logs/turbine.log
log4j.appender.turbine.file=${xnat.home}/logs/turbine.log
log4j.appender.turbine.layout=org.apache.log4j.PatternLayout
log4j.appender.turbine.layout.conversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.turbine.append=false
......@@ -126,7 +126,7 @@ log4j.appender.turbine.append=false
# Scheduler Output
#
log4j.appender.scheduler=org.apache.log4j.FileAppender
log4j.appender.scheduler.file=${applicationRoot}/logs/scheduler.log
log4j.appender.scheduler.file=${xnat.home}/logs/scheduler.log
log4j.appender.scheduler.layout=org.apache.log4j.PatternLayout
log4j.appender.scheduler.layout.conversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.scheduler.append=false
......@@ -137,7 +137,7 @@ log4j.appender.scheduler.append=false
#
log4j.appender.velocity=org.apache.log4j.DailyRollingFileAppender
log4j.appender.velocity.DatePattern='.'yyy-MM-dd
log4j.appender.velocity.file=${applicationRoot}/logs/velocity.log
log4j.appender.velocity.file=${xnat.home}/logs/velocity.log
log4j.appender.velocity.layout=org.apache.log4j.PatternLayout
log4j.appender.velocity.layout.conversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.velocity.append=false
......@@ -147,7 +147,7 @@ log4j.appender.velocity.append=false
# category.
#
log4j.appender.avalon=org.apache.log4j.FileAppender
log4j.appender.avalon.file=${applicationRoot}/logs/avalon.log
log4j.appender.avalon.file=${xnat.home}/logs/avalon.log
log4j.appender.avalon.layout=org.apache.log4j.PatternLayout
log4j.appender.avalon.layout.conversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.avalon.append=false
......@@ -157,7 +157,7 @@ log4j.appender.avalon.append=false
#
log4j.appender.xnatfs=org.apache.log4j.DailyRollingFileAppender
log4j.appender.xnatfs.DatePattern='.'yyy-MM-dd
log4j.appender.xnatfs.file=${applicationRoot}/logs/xnatfs.log
log4j.appender.xnatfs.file=${xnat.home}/logs/xnatfs.log
log4j.appender.xnatfs.layout=org.apache.log4j.PatternLayout
log4j.appender.xnatfs.layout.conversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.xnatfs.append=false
......@@ -167,7 +167,7 @@ log4j.appender.xnatfs.append=false
#
log4j.appender.app=org.apache.log4j.DailyRollingFileAppender
log4j.appender.app.DatePattern='.'yyy-MM-dd
log4j.appender.app.file=${applicationRoot}/logs/application.log
log4j.appender.app.file=${xnat.home}/logs/application.log
log4j.appender.app.layout=org.apache.log4j.PatternLayout
log4j.appender.app.layout.conversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.app.append=false
......@@ -178,7 +178,7 @@ log4j.appender.app.append=false
log4j.appender.axis=org.apache.log4j.DailyRollingFileAppender
log4j.appender.axis.DatePattern='.'yyy-MM-dd
log4j.appender.axis.File=${applicationRoot}/logs/axis.log
log4j.appender.axis.File=${xnat.home}/logs/axis.log
log4j.appender.axis.Append=true
log4j.appender.axis.Threshold=WARN
log4j.appender.axis.layout=org.apache.log4j.PatternLayout
......@@ -189,7 +189,7 @@ log4j.appender.axis.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
#
log4j.appender.xdat=org.apache.log4j.DailyRollingFileAppender
log4j.appender.xdat.DatePattern='.'yyy-MM-dd
log4j.appender.xdat.file=${applicationRoot}/logs/xdat.log
log4j.appender.xdat.file=${xnat.home}/logs/xdat.log
log4j.appender.xdat.layout=org.apache.log4j.PatternLayout
log4j.appender.xdat.layout.conversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.xdat.append=true
......@@ -199,7 +199,7 @@ log4j.appender.xdat.append=true
#
log4j.appender.restlet=org.apache.log4j.DailyRollingFileAppender
log4j.appender.restlet.DatePattern='.'yyy-MM-dd
log4j.appender.restlet.file=${applicationRoot}/logs/restlet.log
log4j.appender.restlet.file=${xnat.home}/logs/restlet.log
log4j.appender.restlet.layout=org.apache.log4j.PatternLayout
log4j.appender.restlet.layout.conversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.restlet.append=true
......@@ -209,7 +209,7 @@ log4j.appender.restlet.append=true
#
log4j.appender.prearchive=org.apache.log4j.DailyRollingFileAppender
log4j.appender.prearchive.DatePattern='.'yyy-MM-dd
log4j.appender.prearchive.file=${applicationRoot}/logs/prearchive.log
log4j.appender.prearchive.file=${xnat.home}/logs/prearchive.log
log4j.appender.prearchive.layout=org.apache.log4j.PatternLayout
log4j.appender.prearchive.layout.conversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.prearchive.append=true
......@@ -219,7 +219,7 @@ log4j.appender.prearchive.append=true
#
log4j.appender.dicom=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dicom.DatePattern='.'yyy-MM-dd
log4j.appender.dicom.file=${applicationRoot}/logs/dicom.log
log4j.appender.dicom.file=${xnat.home}/logs/dicom.log
log4j.appender.dicom.layout=org.apache.log4j.PatternLayout
log4j.appender.dicom.layout.conversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.dicom.append=true
......@@ -229,7 +229,7 @@ log4j.appender.dicom.append=true
#
log4j.appender.access=org.apache.log4j.DailyRollingFileAppender
log4j.appender.access.DatePattern='.'yyy-MM-dd
log4j.appender.access.file=${applicationRoot}/logs/access.log
log4j.appender.access.file=${xnat.home}/logs/access.log
log4j.appender.access.ImmediateFlush=true
log4j.appender.access.Threshold=ERROR
log4j.appender.access.append=true
......@@ -240,7 +240,7 @@ log4j.appender.access.layout.conversionPattern=%d - %m%n
# QUERY LOG
#
log4j.appender.sql=org.apache.log4j.DailyRollingFileAppender
log4j.appender.sql.file=${applicationRoot}/logs/sql.log
log4j.appender.sql.file=${xnat.home}/logs/sql.log
log4j.appender.sql.ImmediateFlush=true
log4j.appender.sql.DatePattern='.'yyy-MM-dd
log4j.appender.sql.append=true
......@@ -250,7 +250,7 @@ log4j.appender.sql.layout.conversionPattern=%d - %m%n
# REMOTE LOG
#
log4j.appender.remote=org.apache.log4j.DailyRollingFileAppender
log4j.appender.remote.file=${applicationRoot}/logs/remote.log
log4j.appender.remote.file=${xnat.home}/logs/remote.log
log4j.appender.remote.ImmediateFlush=true
log4j.appender.remote.DatePattern='.'yyy-MM-dd
log4j.appender.remote.append=true
......@@ -273,7 +273,7 @@ log4j.appender.remote.layout.conversionPattern=%d - %m%n
#
log4j.appender.security=org.apache.log4j.DailyRollingFileAppender
log4j.appender.security.DatePattern='.'yyy-MM-dd
log4j.appender.security.file=${applicationRoot}/logs/security.log
log4j.appender.security.file=${xnat.home}/logs/security.log
log4j.appender.security.layout=org.apache.log4j.PatternLayout
log4j.appender.security.layout.conversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.security.append=true
......@@ -282,7 +282,7 @@ log4j.appender.security.append=true
# Automation log output
#
log4j.appender.automation=org.apache.log4j.DailyRollingFileAppender
log4j.appender.automation.File=${applicationRoot}/logs/automation.log
log4j.appender.automation.File=${xnat.home}/logs/automation.log
log4j.appender.automation.DatePattern='.'yyyy-MM-dd
log4j.appender.automation.layout=org.apache.log4j.PatternLayout
log4j.appender.automation.layout.ConversionPattern=%d %m%n
......@@ -291,7 +291,7 @@ log4j.appender.automation.layout.ConversionPattern=%d %m%n
# Received file log
#
log4j.appender.RECEIVED=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RECEIVED.File=${applicationRoot}/logs/received.log
log4j.appender.RECEIVED.File=${xnat.home}/logs/received.log
log4j.appender.RECEIVED.DatePattern='.'yyyy-MM-dd
log4j.appender.RECEIVED.layout=org.apache.log4j.PatternLayout
log4j.appender.RECEIVED.layout.ConversionPattern=%d %m%n
......@@ -304,7 +304,7 @@ log4j.logger.org.nrg.xnat.received=INFO,RECEIVED
log4j.category.org.nrg.pipeline=ERROR, pipeline
log4j.additivity.org.nrg.pipeline=false
log4j.appender.pipeline=org.apache.log4j.DailyRollingFileAppender
log4j.appender.pipeline.File=${applicationRoot}/logs/pipeline.log
log4j.appender.pipeline.File=${xnat.home}/logs/pipeline.log
log4j.appender.pipeline.DatePattern='.'yyyy-MM-dd
log4j.appender.pipeline.layout=org.apache.log4j.PatternLayout
log4j.appender.pipeline.layout.ConversionPattern=%d %m%n
......@@ -315,7 +315,7 @@ log4j.appender.pipeline.layout.ConversionPattern=%d %m%n
log4j.category.org.nrg.pipeline.launch=INFO, launch
log4j.additivity.org.nrg.pipeline.launch=false
log4j.appender.launch=org.apache.log4j.DailyRollingFileAppender
log4j.appender.launch.File=${applicationRoot}/logs/launch.log
log4j.appender.launch.File=${xnat.home}/logs/launch.log
log4j.appender.launch.DatePattern='.'yyyy-MM-dd
log4j.appender.launch.layout=org.apache.log4j.PatternLayout
log4j.appender.launch.layout.ConversionPattern=%d %m%n
......@@ -328,7 +328,7 @@ log4j.additivity.org.springframework.jms=false
log4j.category.org.nrg.xnat.services.messaging=INFO, jms
log4j.additivity.org.nrg.xnat.services.messaging=false
log4j.appender.jms=org.apache.log4j.DailyRollingFileAppender
log4j.appender.jms.File=${applicationRoot}/logs/jms.log
log4j.appender.jms.File=${xnat.home}/logs/jms.log
log4j.appender.jms.DatePattern='.'yyyy-MM-dd
log4j.appender.jms.layout=org.apache.log4j.PatternLayout
log4j.appender.jms.layout.ConversionPattern=%d %m%n
......@@ -21,7 +21,7 @@ mailserver.port=25
mailserver.username=
mailserver.password=
mailserver.protocol=smtp
mailserver.admin=jrherrick@wustl.edu
mailserver.admin=administrator@xnat.org
mailserver.prefix=XNAT
# Session XML rebuilder settings. interval is in minutes, repeat is in milliseconds.
......
src/main/webapp/images/nav_more_light.png

107 B

src/main/webapp/images/subnav_more_light.png

117 B

src/main/webapp/images/xnat-nav-logo-white-lg.png

4.35 KiB

......@@ -138,14 +138,21 @@ function isArray( arr ){
function isEmptyArray( arr ){
return isArray(arr) && arr.length === 0;
}
function isEmpty( x ){
function isEmpty( x, args ){
if (isString(x)){
return x === '';
}
if (isPlainObject(x)){
return isEmptyObject(x);
}
if (isArray(x)){
return isEmptyArray(x);
}
return (x === '' || x === null || isUndefined(x) || !isFunction(x));
// does a function return an 'empty' value?
if (isFunction(x)){
return isEmpty(x.apply(null, [].concat(args)));
}
return (x === null || isUndefined(x) || !isFunction(x));
}
function isFunction( func ){
return typeof func == 'function';
......@@ -182,9 +189,11 @@ function extend(){
if ( typeof target !== "object" && !isFunction(target) ) {
target = {};
}
// extend parent object if only one argument is passed
// Copy object if only one argument is passed.
// jQuery extends its own object, but since this
// isn't jQuery, 'this' is the global object (bad)
if ( i === length ) {
target = this;
target = {};
i--;
}
for ( ; i < length; i++ ) {
......@@ -712,7 +721,7 @@ function setMin(min){
function scriptUrl(url, min){
var parts = url.split('|');
url = parts[0].trim();
min = (min || parts[1] || '').trim();
min = (min || parts[1] || '').replace(/([!~\*])+/g,'').trim();
return serverRoot + '/scripts/' + (url.replace(/\.js$/i,'')) + setMin(min) + '.js';
}
......@@ -758,19 +767,6 @@ function hasScript( url ){
return getScriptElements().indexOf(url) > -1;
}
function scriptURL( url, min ){
url = url.replace(/\.js$/i,''); // tolerate '.js' suffix
if (min) {
url += min;
}
if (url){ // cannot be empty to add '.js'
url += '.js';
}
// return empty string if this <script> is already present
//if (hasScript(url)){ return '' }
return url;
}
// split params passed as a pipe-separated string
// and return object with property names for params
function scriptParams( script ){
......@@ -1046,6 +1042,32 @@ function loadScripts( scripts, parent_or_callback, callback ){
}
}
function cssUrl( url, min, query ){
var parts = url.split('|');
url = parts[0].trim();
min = (min || parts[1] || '').replace(/([!~\*])+/g,'').trim();
query = (query || parts[2] || '').trim();
if (query) {
query = '?' + query.replace(/^\?/,'');
}
return serverRoot +
'/' + (url.replace(/\.css$/i,'')) +
setMin(min) + '.css' + query;
}
function cssElement( href ){
var el = document.createElement('link');
el.rel = 'stylesheet';
el.type = 'text/css';
el.href = cssUrl(href);
return el;
}
// document.write(css)
function writeCSS( href ){
document.write(cssElement(href).outerHTML);
}
function loadCSS( url, parent ){
// use CSS-style selector for 'parent'
parent = parent ? document.querySelector(parent) : document.querySelector('head');
......
/*
Masked Input plugin for jQuery
Copyright (c) 2007-2013 Josh Bush (digitalbush.com)
Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license)
Version: 1.3.1
jQuery Masked Input Plugin
Copyright (c) 2007 - 2015 Josh Bush (digitalbush.com)
Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license)
Version: 1.4.1
*/
(function($) {
function getPasteEvent() {
var el = document.createElement('input'),
name = 'onpaste';
el.setAttribute(name, '');
return (typeof el[name] === 'function')?'paste':'input';
}
var pasteEventName = getPasteEvent() + ".mask",
ua = navigator.userAgent,
iPhone = /iphone/i.test(ua),
android=/android/i.test(ua),
caretTimeoutId;
$.mask = {
//Predefined character definitions
definitions: {
'9': "[0-9]",
'a': "[A-Za-z]",
'*': "[A-Za-z0-9]"
},
dataName: "rawMaskFn",
placeholder: '_'
};
$.fn.extend({
//Helper Function for Caret positioning
caret: function(begin, end) {
var range;
if (this.length === 0 || this.is(":hidden")) {
return;
}
if (typeof begin == 'number') {
end = (typeof end === 'number') ? end : begin;
return this.each(function() {
if (this.setSelectionRange) {
this.setSelectionRange(begin, end);
} else if (this.createTextRange) {
range = this.createTextRange();
range.collapse(true);
range.moveEnd('character', end);
range.moveStart('character', begin);
range.select();
}
});
} else {
if (this[0].setSelectionRange) {
begin = this[0].selectionStart;
end = this[0].selectionEnd;
} else if (document.selection && document.selection.createRange) {
range = document.selection.createRange();
begin = 0 - range.duplicate().moveStart('character', -100000);
end = begin + range.text.length;
}
return { begin: begin, end: end };
}
},
unmask: function() {
return this.trigger("unmask");
},
mask: function(mask, settings) {
var input,
defs,
tests,
partialPosition,
firstNonMaskPos,
len;
if (!mask && this.length > 0) {
input = $(this[0]);
return input.data($.mask.dataName)();
}
settings = $.extend({
placeholder: $.mask.placeholder, // Load default placeholder
completed: null
}, settings);
defs = $.mask.definitions;
tests = [];
partialPosition = len = mask.length;
firstNonMaskPos = null;
$.each(mask.split(""), function(i, c) {
if (c == '?') {
len--;
partialPosition = i;
} else if (defs[c]) {
tests.push(new RegExp(defs[c]));
if (firstNonMaskPos === null) {
firstNonMaskPos = tests.length - 1;
}
} else {
tests.push(null);
}
});
return this.trigger("unmask").each(function() {
var input = $(this),
buffer = $.map(
mask.split(""),
function(c, i) {
if (c != '?') {
return defs[c] ? settings.placeholder : c;
}
}),
focusText = input.val();
function seekNext(pos) {
while (++pos < len && !tests[pos]);
return pos;
}
function seekPrev(pos) {
while (--pos >= 0 && !tests[pos]);
return pos;
}
function shiftL(begin,end) {
var i,
j;
if (begin<0) {
return;
}
for (i = begin, j = seekNext(end); i < len; i++) {
if (tests[i]) {
if (j < len && tests[i].test(buffer[j])) {
buffer[i] = buffer[j];
buffer[j] = settings.placeholder;
} else {
break;
}
j = seekNext(j);
}
}
writeBuffer();
input.caret(Math.max(firstNonMaskPos, begin));
}
function shiftR(pos) {
var i,
c,
j,
t;
for (i = pos, c = settings.placeholder; i < len; i++) {
if (tests[i]) {
j = seekNext(i);
t = buffer[i];
buffer[i] = c;
if (j < len && tests[j].test(t)) {
c = t;
} else {
break;
}
}
}
}
function keydownEvent(e) {
var k = e.which,
pos,
begin,
end;
//backspace, delete, and escape get special treatment
if (k === 8 || k === 46 || (iPhone && k === 127)) {
pos = input.caret();
begin = pos.begin;
end = pos.end;
if (end - begin === 0) {
begin=k!==46?seekPrev(begin):(end=seekNext(begin-1));
end=k===46?seekNext(end):end;
}
clearBuffer(begin, end);
shiftL(begin, end - 1);
e.preventDefault();
} else if (k == 27) {//escape
input.val(focusText);
input.caret(0, checkVal());
e.preventDefault();
}
}
function keypressEvent(e) {
var k = e.which,
pos = input.caret(),
p,
c,
next;
if (e.ctrlKey || e.altKey || e.metaKey || k < 32) {//Ignore
return;
} else if (k) {
if (pos.end - pos.begin !== 0){
clearBuffer(pos.begin, pos.end);
shiftL(pos.begin, pos.end-1);
}
p = seekNext(pos.begin - 1);
if (p < len) {
c = String.fromCharCode(k);
if (tests[p].test(c)) {
shiftR(p);
buffer[p] = c;
writeBuffer();
next = seekNext(p);
if(android){
setTimeout($.proxy($.fn.caret,input,next),0);
}else{
input.caret(next);
}
if (settings.completed && next >= len) {
settings.completed.call(input);
}
}
}
e.preventDefault();
}
}
function clearBuffer(start, end) {
var i;
for (i = start; i < end && i < len; i++) {
if (tests[i]) {
buffer[i] = settings.placeholder;
}
}
}
function writeBuffer() { input.val(buffer.join('')); }
function checkVal(allow) {
//try to place characters where they belong
var test = input.val(),
lastMatch = -1,
i,
c;
for (i = 0, pos = 0; i < len; i++) {
if (tests[i]) {
buffer[i] = settings.placeholder;
while (pos++ < test.length) {
c = test.charAt(pos - 1);
if (tests[i].test(c)) {
buffer[i] = c;
lastMatch = i;
break;
}
}
if (pos > test.length) {
break;
}
} else if (buffer[i] === test.charAt(pos) && i !== partialPosition) {
pos++;
lastMatch = i;
}
}
if (allow) {
writeBuffer();
} else if (lastMatch + 1 < partialPosition) {
input.val("");
clearBuffer(0, len);
} else {
writeBuffer();
input.val(input.val().substring(0, lastMatch + 1));
}
return (partialPosition ? i : firstNonMaskPos);
}
input.data($.mask.dataName,function(){
return $.map(buffer, function(c, i) {
return tests[i]&&c!=settings.placeholder ? c : null;
}).join('');
});
if (!input.attr("readonly"))
input
.one("unmask", function() {
input
.unbind(".mask")
.removeData($.mask.dataName);
})
.bind("focus.mask", function() {
clearTimeout(caretTimeoutId);
var pos,
moveCaret;
focusText = input.val();
pos = checkVal();
caretTimeoutId = setTimeout(function(){
writeBuffer();
if (pos == mask.length) {
input.caret(0, pos);
} else {
input.caret(pos);
}
}, 10);
})
.bind("blur.mask", function() {
checkVal();
if (input.val() != focusText)
input.change();
})
.bind("keydown.mask", keydownEvent)
.bind("keypress.mask", keypressEvent)
.bind(pasteEventName, function() {
setTimeout(function() {
var pos=checkVal(true);
input.caret(pos);
if (settings.completed && pos == input.val().length)
settings.completed.call(input);
}, 0);
});
checkVal(); //Perform initial check for existing values
});
}
});
})(jQuery);
\ No newline at end of file
!function(factory) {
"function" == typeof define && define.amd ? define([ "jquery" ], factory) : factory("object" == typeof exports ? require("jquery") : jQuery);
}(function($) {
var caretTimeoutId, ua = navigator.userAgent, iPhone = /iphone/i.test(ua), chrome = /chrome/i.test(ua), android = /android/i.test(ua);
$.mask = {
definitions: {
"9": "[0-9]",
a: "[A-Za-z]",
"*": "[A-Za-z0-9]"
},
autoclear: !0,
dataName: "rawMaskFn",
placeholder: "_"
}, $.fn.extend({
caret: function(begin, end) {
var range;
if (0 !== this.length && !this.is(":hidden")) return "number" == typeof begin ? (end = "number" == typeof end ? end : begin,
this.each(function() {
this.setSelectionRange ? this.setSelectionRange(begin, end) : this.createTextRange && (range = this.createTextRange(),
range.collapse(!0), range.moveEnd("character", end), range.moveStart("character", begin),
range.select());
})) : (this[0].setSelectionRange ? (begin = this[0].selectionStart, end = this[0].selectionEnd) : document.selection && document.selection.createRange && (range = document.selection.createRange(),
begin = 0 - range.duplicate().moveStart("character", -1e5), end = begin + range.text.length),
{
begin: begin,
end: end
});
},
unmask: function() {
return this.trigger("unmask");
},
mask: function(mask, settings) {
var input, defs, tests, partialPosition, firstNonMaskPos, lastRequiredNonMaskPos, len, oldVal;
if (!mask && this.length > 0) {
input = $(this[0]);
var fn = input.data($.mask.dataName);
return fn ? fn() : void 0;
}
return settings = $.extend({
autoclear: $.mask.autoclear,
placeholder: $.mask.placeholder,
completed: null
}, settings), defs = $.mask.definitions, tests = [], partialPosition = len = mask.length,
firstNonMaskPos = null, $.each(mask.split(""), function(i, c) {
"?" == c ? (len--, partialPosition = i) : defs[c] ? (tests.push(new RegExp(defs[c])),
null === firstNonMaskPos && (firstNonMaskPos = tests.length - 1), partialPosition > i && (lastRequiredNonMaskPos = tests.length - 1)) : tests.push(null);
}), this.trigger("unmask").each(function() {
function tryFireCompleted() {
if (settings.completed) {
for (var i = firstNonMaskPos; lastRequiredNonMaskPos >= i; i++) if (tests[i] && buffer[i] === getPlaceholder(i)) return;
settings.completed.call(input);
}
}
function getPlaceholder(i) {
return settings.placeholder.charAt(i < settings.placeholder.length ? i : 0);
}
function seekNext(pos) {
for (;++pos < len && !tests[pos]; ) ;
return pos;
}
function seekPrev(pos) {
for (;--pos >= 0 && !tests[pos]; ) ;
return pos;
}
function shiftL(begin, end) {
var i, j;
if (!(0 > begin)) {
for (i = begin, j = seekNext(end); len > i; i++) if (tests[i]) {
if (!(len > j && tests[i].test(buffer[j]))) break;
buffer[i] = buffer[j], buffer[j] = getPlaceholder(j), j = seekNext(j);
}
writeBuffer(), input.caret(Math.max(firstNonMaskPos, begin));
}
}
function shiftR(pos) {
var i, c, j, t;
for (i = pos, c = getPlaceholder(pos); len > i; i++) if (tests[i]) {
if (j = seekNext(i), t = buffer[i], buffer[i] = c, !(len > j && tests[j].test(t))) break;
c = t;
}
}
function androidInputEvent() {
var curVal = input.val(), pos = input.caret();
if (oldVal && oldVal.length && oldVal.length > curVal.length) {
for (checkVal(!0); pos.begin > 0 && !tests[pos.begin - 1]; ) pos.begin--;
if (0 === pos.begin) for (;pos.begin < firstNonMaskPos && !tests[pos.begin]; ) pos.begin++;
input.caret(pos.begin, pos.begin);
} else {
for (checkVal(!0); pos.begin < len && !tests[pos.begin]; ) pos.begin++;
input.caret(pos.begin, pos.begin);
}
tryFireCompleted();
}
function blurEvent() {
checkVal(), input.val() != focusText && input.change();
}
function keydownEvent(e) {
if (!input.prop("readonly")) {
var pos, begin, end, k = e.which || e.keyCode;
oldVal = input.val(), 8 === k || 46 === k || iPhone && 127 === k ? (pos = input.caret(),
begin = pos.begin, end = pos.end, end - begin === 0 && (begin = 46 !== k ? seekPrev(begin) : end = seekNext(begin - 1),
end = 46 === k ? seekNext(end) : end), clearBuffer(begin, end), shiftL(begin, end - 1),
e.preventDefault()) : 13 === k ? blurEvent.call(this, e) : 27 === k && (input.val(focusText),
input.caret(0, checkVal()), e.preventDefault());
}
}
function keypressEvent(e) {
if (!input.prop("readonly")) {
var p, c, next, k = e.which || e.keyCode, pos = input.caret();
if (!(e.ctrlKey || e.altKey || e.metaKey || 32 > k) && k && 13 !== k) {
if (pos.end - pos.begin !== 0 && (clearBuffer(pos.begin, pos.end), shiftL(pos.begin, pos.end - 1)),
p = seekNext(pos.begin - 1), len > p && (c = String.fromCharCode(k), tests[p].test(c))) {
if (shiftR(p), buffer[p] = c, writeBuffer(), next = seekNext(p), android) {
var proxy = function() {
$.proxy($.fn.caret, input, next)();
};
setTimeout(proxy, 0);
} else input.caret(next);
pos.begin <= lastRequiredNonMaskPos && tryFireCompleted();
}
e.preventDefault();
}
}
}
function clearBuffer(start, end) {
var i;
for (i = start; end > i && len > i; i++) tests[i] && (buffer[i] = getPlaceholder(i));
}
function writeBuffer() {
input.val(buffer.join(""));
}
function checkVal(allow) {
var i, c, pos, test = input.val(), lastMatch = -1;
for (i = 0, pos = 0; len > i; i++) if (tests[i]) {
for (buffer[i] = getPlaceholder(i); pos++ < test.length; ) if (c = test.charAt(pos - 1),
tests[i].test(c)) {
buffer[i] = c, lastMatch = i;
break;
}
if (pos > test.length) {
clearBuffer(i + 1, len);
break;
}
} else buffer[i] === test.charAt(pos) && pos++, partialPosition > i && (lastMatch = i);
return allow ? writeBuffer() : partialPosition > lastMatch + 1 ? settings.autoclear || buffer.join("") === defaultBuffer ? (input.val() && input.val(""),
clearBuffer(0, len)) : writeBuffer() : (writeBuffer(), input.val(input.val().substring(0, lastMatch + 1))),
partialPosition ? i : firstNonMaskPos;
}
var input = $(this), buffer = $.map(mask.split(""), function(c, i) {
return "?" != c ? defs[c] ? getPlaceholder(i) : c : void 0;
}), defaultBuffer = buffer.join(""), focusText = input.val();
input.data($.mask.dataName, function() {
return $.map(buffer, function(c, i) {
return tests[i] && c != getPlaceholder(i) ? c : null;
}).join("");
}), input.one("unmask", function() {
input.off(".mask").removeData($.mask.dataName);
}).on("focus.mask", function() {
if (!input.prop("readonly")) {
clearTimeout(caretTimeoutId);
var pos;
focusText = input.val(), pos = checkVal(), caretTimeoutId = setTimeout(function() {
input.get(0) === document.activeElement && (writeBuffer(), pos == mask.replace("?", "").length ? input.caret(0, pos) : input.caret(pos));
}, 10);
}
}).on("blur.mask", blurEvent).on("keydown.mask", keydownEvent).on("keypress.mask", keypressEvent).on("input.mask paste.mask", function() {
input.prop("readonly") || setTimeout(function() {
var pos = checkVal(!0);
input.caret(pos), tryFireCompleted();
}, 0);
}), chrome && android && input.off("input.mask").on("input.mask", androidInputEvent),
checkVal();
});
}
});
});
\ No newline at end of file
/*
Masked Input plugin for jQuery
Copyright (c) 2007-2013 Josh Bush (digitalbush.com)
Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license)
Version: 1.3.1
jQuery Masked Input Plugin
Copyright (c) 2007 - 2015 Josh Bush (digitalbush.com)
Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license)
Version: 1.4.1
*/
(function(e){function t(){var e=document.createElement("input"),t="onpaste";return e.setAttribute(t,""),"function"==typeof e[t]?"paste":"input"}var n,a=t()+".mask",r=navigator.userAgent,i=/iphone/i.test(r),o=/android/i.test(r);e.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},dataName:"rawMaskFn",placeholder:"_"},e.fn.extend({caret:function(e,t){var n;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof e?(t="number"==typeof t?t:e,this.each(function(){this.setSelectionRange?this.setSelectionRange(e,t):this.createTextRange&&(n=this.createTextRange(),n.collapse(!0),n.moveEnd("character",t),n.moveStart("character",e),n.select())})):(this[0].setSelectionRange?(e=this[0].selectionStart,t=this[0].selectionEnd):document.selection&&document.selection.createRange&&(n=document.selection.createRange(),e=0-n.duplicate().moveStart("character",-1e5),t=e+n.text.length),{begin:e,end:t})},unmask:function(){return this.trigger("unmask")},mask:function(t,r){var c,l,s,u,f,h;return!t&&this.length>0?(c=e(this[0]),c.data(e.mask.dataName)()):(r=e.extend({placeholder:e.mask.placeholder,completed:null},r),l=e.mask.definitions,s=[],u=h=t.length,f=null,e.each(t.split(""),function(e,t){"?"==t?(h--,u=e):l[t]?(s.push(RegExp(l[t])),null===f&&(f=s.length-1)):s.push(null)}),this.trigger("unmask").each(function(){function c(e){for(;h>++e&&!s[e];);return e}function d(e){for(;--e>=0&&!s[e];);return e}function m(e,t){var n,a;if(!(0>e)){for(n=e,a=c(t);h>n;n++)if(s[n]){if(!(h>a&&s[n].test(R[a])))break;R[n]=R[a],R[a]=r.placeholder,a=c(a)}b(),x.caret(Math.max(f,e))}}function p(e){var t,n,a,i;for(t=e,n=r.placeholder;h>t;t++)if(s[t]){if(a=c(t),i=R[t],R[t]=n,!(h>a&&s[a].test(i)))break;n=i}}function g(e){var t,n,a,r=e.which;8===r||46===r||i&&127===r?(t=x.caret(),n=t.begin,a=t.end,0===a-n&&(n=46!==r?d(n):a=c(n-1),a=46===r?c(a):a),k(n,a),m(n,a-1),e.preventDefault()):27==r&&(x.val(S),x.caret(0,y()),e.preventDefault())}function v(t){var n,a,i,l=t.which,u=x.caret();t.ctrlKey||t.altKey||t.metaKey||32>l||l&&(0!==u.end-u.begin&&(k(u.begin,u.end),m(u.begin,u.end-1)),n=c(u.begin-1),h>n&&(a=String.fromCharCode(l),s[n].test(a)&&(p(n),R[n]=a,b(),i=c(n),o?setTimeout(e.proxy(e.fn.caret,x,i),0):x.caret(i),r.completed&&i>=h&&r.completed.call(x))),t.preventDefault())}function k(e,t){var n;for(n=e;t>n&&h>n;n++)s[n]&&(R[n]=r.placeholder)}function b(){x.val(R.join(""))}function y(e){var t,n,a=x.val(),i=-1;for(t=0,pos=0;h>t;t++)if(s[t]){for(R[t]=r.placeholder;pos++<a.length;)if(n=a.charAt(pos-1),s[t].test(n)){R[t]=n,i=t;break}if(pos>a.length)break}else R[t]===a.charAt(pos)&&t!==u&&(pos++,i=t);return e?b():u>i+1?(x.val(""),k(0,h)):(b(),x.val(x.val().substring(0,i+1))),u?t:f}var x=e(this),R=e.map(t.split(""),function(e){return"?"!=e?l[e]?r.placeholder:e:void 0}),S=x.val();x.data(e.mask.dataName,function(){return e.map(R,function(e,t){return s[t]&&e!=r.placeholder?e:null}).join("")}),x.attr("readonly")||x.one("unmask",function(){x.unbind(".mask").removeData(e.mask.dataName)}).bind("focus.mask",function(){clearTimeout(n);var e;S=x.val(),e=y(),n=setTimeout(function(){b(),e==t.length?x.caret(0,e):x.caret(e)},10)}).bind("blur.mask",function(){y(),x.val()!=S&&x.change()}).bind("keydown.mask",g).bind("keypress.mask",v).bind(a,function(){setTimeout(function(){var e=y(!0);x.caret(e),r.completed&&e==x.val().length&&r.completed.call(x)},0)}),y()}))}})})(jQuery);
\ No newline at end of file
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b,c=navigator.userAgent,d=/iphone/i.test(c),e=/chrome/i.test(c),f=/android/i.test(c);a.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},autoclear:!0,dataName:"rawMaskFn",placeholder:"_"},a.fn.extend({caret:function(a,b){var c;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof a?(b="number"==typeof b?b:a,this.each(function(){this.setSelectionRange?this.setSelectionRange(a,b):this.createTextRange&&(c=this.createTextRange(),c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",a),c.select())})):(this[0].setSelectionRange?(a=this[0].selectionStart,b=this[0].selectionEnd):document.selection&&document.selection.createRange&&(c=document.selection.createRange(),a=0-c.duplicate().moveStart("character",-1e5),b=a+c.text.length),{begin:a,end:b})},unmask:function(){return this.trigger("unmask")},mask:function(c,g){var h,i,j,k,l,m,n,o;if(!c&&this.length>0){h=a(this[0]);var p=h.data(a.mask.dataName);return p?p():void 0}return g=a.extend({autoclear:a.mask.autoclear,placeholder:a.mask.placeholder,completed:null},g),i=a.mask.definitions,j=[],k=n=c.length,l=null,a.each(c.split(""),function(a,b){"?"==b?(n--,k=a):i[b]?(j.push(new RegExp(i[b])),null===l&&(l=j.length-1),k>a&&(m=j.length-1)):j.push(null)}),this.trigger("unmask").each(function(){function h(){if(g.completed){for(var a=l;m>=a;a++)if(j[a]&&C[a]===p(a))return;g.completed.call(B)}}function p(a){return g.placeholder.charAt(a<g.placeholder.length?a:0)}function q(a){for(;++a<n&&!j[a];);return a}function r(a){for(;--a>=0&&!j[a];);return a}function s(a,b){var c,d;if(!(0>a)){for(c=a,d=q(b);n>c;c++)if(j[c]){if(!(n>d&&j[c].test(C[d])))break;C[c]=C[d],C[d]=p(d),d=q(d)}z(),B.caret(Math.max(l,a))}}function t(a){var b,c,d,e;for(b=a,c=p(a);n>b;b++)if(j[b]){if(d=q(b),e=C[b],C[b]=c,!(n>d&&j[d].test(e)))break;c=e}}function u(){var a=B.val(),b=B.caret();if(o&&o.length&&o.length>a.length){for(A(!0);b.begin>0&&!j[b.begin-1];)b.begin--;if(0===b.begin)for(;b.begin<l&&!j[b.begin];)b.begin++;B.caret(b.begin,b.begin)}else{for(A(!0);b.begin<n&&!j[b.begin];)b.begin++;B.caret(b.begin,b.begin)}h()}function v(){A(),B.val()!=E&&B.change()}function w(a){if(!B.prop("readonly")){var b,c,e,f=a.which||a.keyCode;o=B.val(),8===f||46===f||d&&127===f?(b=B.caret(),c=b.begin,e=b.end,e-c===0&&(c=46!==f?r(c):e=q(c-1),e=46===f?q(e):e),y(c,e),s(c,e-1),a.preventDefault()):13===f?v.call(this,a):27===f&&(B.val(E),B.caret(0,A()),a.preventDefault())}}function x(b){if(!B.prop("readonly")){var c,d,e,g=b.which||b.keyCode,i=B.caret();if(!(b.ctrlKey||b.altKey||b.metaKey||32>g)&&g&&13!==g){if(i.end-i.begin!==0&&(y(i.begin,i.end),s(i.begin,i.end-1)),c=q(i.begin-1),n>c&&(d=String.fromCharCode(g),j[c].test(d))){if(t(c),C[c]=d,z(),e=q(c),f){var k=function(){a.proxy(a.fn.caret,B,e)()};setTimeout(k,0)}else B.caret(e);i.begin<=m&&h()}b.preventDefault()}}}function y(a,b){var c;for(c=a;b>c&&n>c;c++)j[c]&&(C[c]=p(c))}function z(){B.val(C.join(""))}function A(a){var b,c,d,e=B.val(),f=-1;for(b=0,d=0;n>b;b++)if(j[b]){for(C[b]=p(b);d++<e.length;)if(c=e.charAt(d-1),j[b].test(c)){C[b]=c,f=b;break}if(d>e.length){y(b+1,n);break}}else C[b]===e.charAt(d)&&d++,k>b&&(f=b);return a?z():k>f+1?g.autoclear||C.join("")===D?(B.val()&&B.val(""),y(0,n)):z():(z(),B.val(B.val().substring(0,f+1))),k?b:l}var B=a(this),C=a.map(c.split(""),function(a,b){return"?"!=a?i[a]?p(b):a:void 0}),D=C.join(""),E=B.val();B.data(a.mask.dataName,function(){return a.map(C,function(a,b){return j[b]&&a!=p(b)?a:null}).join("")}),B.one("unmask",function(){B.off(".mask").removeData(a.mask.dataName)}).on("focus.mask",function(){if(!B.prop("readonly")){clearTimeout(b);var a;E=B.val(),a=A(),b=setTimeout(function(){B.get(0)===document.activeElement&&(z(),a==c.replace("?","").length?B.caret(0,a):B.caret(a))},10)}}).on("blur.mask",v).on("keydown.mask",w).on("keypress.mask",x).on("input.mask paste.mask",function(){B.prop("readonly")||setTimeout(function(){var a=A(!0);B.caret(a),h()},0)}),e&&f&&B.off("input.mask").on("input.mask",u),A()})}})});
\ No newline at end of file
......@@ -4,7 +4,7 @@
*/
if (typeof jQuery == 'undefined') {
throw new Error('jQuery is required');
throw new Error('jquery.spawn.js requires jQuery');
}
(function($, undefined){
......@@ -20,7 +20,7 @@ if (typeof jQuery == 'undefined') {
// returns first defined argument
// useful for retrieving 'falsey' values
function firstDefined() {
var undefined, i = -1;
var i = -1;
while (++i < arguments.length) {
if (arguments[i] !== undefined) {
return arguments[i];
......@@ -36,10 +36,10 @@ if (typeof jQuery == 'undefined') {
// var $div2 = $.spawn('div'), {}, {id:'div2'}, "Div2's HTML content")
/**
* Create a jQuery-wrapped DOM object
* @param tag - HTML tag
* @param opts - jQuery methods / child element(s) / HTML
* @param attr - native DOM attributes
* @param content - child element(s) / HTML
* @param {String} tag - HTML tag
* @param {Object} opts - jQuery methods / child element(s) / HTML
* @param {Object} attr - native DOM methods, properties, and attributes
* @param {String|Array|Object|Elements} content - child element(s) / HTML
* @returns {object} - jQuery object
*/
$.spawn = function(tag, opts, attr, content){
......@@ -70,8 +70,11 @@ if (typeof jQuery == 'undefined') {
// pass empty string or #text as
// first argument to create fragment
if (tag === '' || tag === '#text'){
if (tag === '' || /^(#text|#html)/i.test(tag)){
el = document.createDocumentFragment();
// the second argument MUST be
// text or HTML content
el.innerHTML = opts;
}
else {
try {
......@@ -97,8 +100,11 @@ if (typeof jQuery == 'undefined') {
var quotes = /^('|")|('|")$/g;
var key = att.split(sep)[0].trim();
var val = (att.split(sep)[1]||'').trim().replace(quotes, '') || key;
// allow use of 'class', but (secretly) use 'className'
//if (key === 'class') { key = 'className' }
// add each attribute/property directly to DOM element
el[key] = val;
//el[key] = val;
el.setAttribute(key, val);
});
$el = $(el);
......@@ -150,6 +156,8 @@ if (typeof jQuery == 'undefined') {
$.each(_opts, function(prop, val){
prop = prop.trim();
// skip 'tag' property
if (prop === 'tag') return;
......@@ -184,9 +192,9 @@ if (typeof jQuery == 'undefined') {
$.each([].concat(val), function(i, child){
try {
// recursively append spawns as needed
$el.append(child); // each child must be an 'appendable' item
//$el.append(child); // each child must be an 'appendable' item
//$.spawn(child).appendTo($el);
//$el.append($.spawn.apply(null, [].concat(child)));
$el.append($.spawn.apply(null, [].concat(child)));
}
catch (e) {
if (console && console.log) console.log(e);
......
This diff is collapsed.
This diff is collapsed.
Source diff could not be displayed: it is too large. Options to address this: view the blob.
......@@ -82,7 +82,8 @@
s.onload = s.onerror = function(ev) {
// remove script
s.parentNode.removeChild(s);
var p = s.parentNode;
if (p) p.removeChild(s);
// de-reference script
s = null;
......@@ -190,6 +191,68 @@
};
/**
* Load multiple scripts sequentially (in series).
* Shortcut for nested loadjs() calls.
* @param {string[]} scripts - Array of loadjs setup arrays
* @param {Function} [callback] - Callback function
*/
loadjs.series = function(/* script1, [script2, etc...,] callback */){
var len = 0, scripts = [],
argLen = arguments.length,
lastArg = arguments[argLen-1],
callback = null;
// convert arguments to actual array
while (len < argLen){
scripts = scripts.concat([arguments[len]]);
len++;
}
// len should now equal scripts.length
if (typeof lastArg == 'function'){
callback = lastArg;
}
if (callback && argLen > 1) {
len = argLen - 1;
}
function doLoad(i){
if (i === len) return;
var script = scripts[i],
name = script[0],
url = script[1],
fn = script[2]||null, // optional individual callback for this script
next = i + 1;
if (script.length === 1){
url = name;
}
if (typeof script == 'string'){
name = url = script;
}
// execute callback after last item
if (next === len) {
loadjs(url, callback);
}
else {
loadjs(url, name);
loadjs.ready(name, function(){
doLoad(next);
// does this item have its own callback?
// var example = ['name', '/path/to/script.js', function(){ doStuffAfterThisScriptLoads() }];
if (fn && typeof fn == 'function'){
fn(name, url)
}
});
}
}
// set it off
doLoad(0);
};
// export
win.loadjs = loadjs;
})(window, document);
!function(n,o){function e(n,o){n=n.push?n:[n];var e,t,r,i,u=[],f=n.length,c=f;for(e=function(n,e){e.length&&u.push(n),c-=1,0===c&&o(u)};f--;)t=n[f],r=a[t],r?e(t,r):(i=d[t]=d[t]||[],i.push(e))}function t(n,o){if(n){var e=d[n];if(a[n]=o,e)for(;e.length;)e[0](n,o),e.splice(0,1)}}function r(n,e){var t=o.createElement("script");t.src=n,t.onload=t.onerror=function(o){t.parentNode.removeChild(t),t=null,e(n,o.type)},f.appendChild(t)}function i(n,o){n=n.push?n:[n];var e,t=n.length,i=t,u=[];for(e=function(n,e){"error"===e&&u.push(n),i-=1,0===i&&o(u)};t--;)r(n[t],e)}function u(o,e,r,u){var f,a,d;if(e&&!e.call&&(f=e),a=f?r:e,d=f?u:r,f){if(f in l)throw new Error("LoadJS: Bundle already defined");l[f]=!0}n.setTimeout(function(){i(o,function(n){n.length?(d||c)(n):(a||c)(),t(f,n)})},0)}var f=o.head,c=function(){},l={},a={},d={};u.ready=function(n,o,t){return e(n,function(n){n.length?(t||c)(n):(o||c)()}),u},u.done=function(n){t(n,[])},n.loadjs=u}(window,document);
\ No newline at end of file
!function(n,o){function e(n,o){n=n.push?n:[n];var e,t,r,i,u=[],f=n.length,c=f;for(e=function(n,e){e.length&&u.push(n),c-=1,0===c&&o(u)};f--;)t=n[f],r=l[t],r?e(t,r):(i=d[t]=d[t]||[],i.push(e))}function t(n,o){if(n){var e=d[n];if(l[n]=o,e)for(;e.length;)e[0](n,o),e.splice(0,1)}}function r(n,e){var t=o.createElement("script");t.src=n,t.onload=t.onerror=function(o){var r=t.parentNode;r&&r.removeChild(t),t=null,e(n,o.type)},f.appendChild(t)}function i(n,o){n=n.push?n:[n];var e,t=n.length,i=t,u=[];for(e=function(n,e){"error"===e&&u.push(n),i-=1,0===i&&o(u)};t--;)r(n[t],e)}function u(o,e,r,u){var f,l,d;if(e&&!e.call&&(f=e),l=f?r:e,d=f?u:r,f){if(f in a)throw new Error("LoadJS: Bundle already defined");a[f]=!0}n.setTimeout(function(){i(o,function(n){n.length?(d||c)(n):(l||c)(),t(f,n)})},0)}var f=o.head,c=function(){},a={},l={},d={};u.ready=function(n,o,t){return e(n,function(n){n.length?(t||c)(n):(o||c)()}),u},u.done=function(n){t(n,[])},n.loadjs=u}(window,document);
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Spawn Samples</title>
<script src="../jquery/jquery.js"></script>
<script src="../jquery-plugins/jquery.spawn.js"></script>
<script src="spawn.js"></script>
<script>
// shortcuts
function byId(id){
return document.getElementById(id)
}
</script>
</head>
<body>
<h1>Samples for spawn.js</h1>
<h2>Spawn a simple &lt;table&gt; element:</h2>
<div id="spawn-table-1"></div>
<h2>Spawn a table from input data:</h2>
<div id="spawn-table-2"></div>
<h2>Spawn a table from input data and wrap in a jQuery object:</h2>
<p>(click a table cell to trigger an 'onclick' event)</p>
<div id="spawn-table-3"></div>
<h2>Spawn elements with the jQuery Spawner <b>$.spawn()</b>:</h2>
<p>The jQuery Spawner returns a jQuery-wrapped element.</p>
<div id="jquery-spawn-div"></div>
<script>
(function(){
function th(opts, content){
if (!content) {
content = opts;
opts = {};
}
return spawn('td', opts, content);
}
function td(opts, content){
if (!content) {
content = opts;
opts = {};
}
return spawn('td', opts, content);
}
function tr(opts, cells){
// cells is an array of table row data for <td> elements
if (!cells) {
cells = opts;
opts = {};
}
return spawn('tr', opts, cells.map(function(content){
return td(content);
}));
// var _row = spawn('tr', opts, cells.map(function(content){
// return td(content);
// }));
// cells.forEach(function(data){
// _row.appendChild(td(data));
// });
// return _row;
}
function table(opts, rows){
// rows is an array of arrays of table data
var rowsSample = [
['a', 'b', 'c'],
['x', 'y', 'z'],
[1, 2, 3]
];
// -OR- an array of objects using the keys for <th> elements
// (also add a [data-key="key_name"] attribute)
var _table = spawn('table', opts);
if (rows) {
rows.forEach(function(row){
_table.appendChild(tr(null, row));
});
}
return _table;
}
// append data to an existing table
// [data] array length must match
// number of columns
function tableAppend(table, data){
var table$ = $(table),
rowCount = table$.find('> tr').length,
i = 0;
while (i < rowCount) {
table$.append(tr(data));
i++;
}
}
function trWithClass(classes, data){
return tr({ className: classes }, data);
}
byId('spawn-table-1').appendChild(spawn('table|id=table1', [
['tr', [
td('Cell 1'),
td('Cell 2'),
td('Cell 3'),
td('Cell 4')
]]
]));
byId('spawn-table-2').appendChild(table({ id: 'table2' }, [
['Cell 1a', 'Cell 2a', 'Cell 3a'],
['Cell 1b', 'Cell 2b', 'Cell 3b']
]));
$('#spawn-table-3').append($(table({ id: 'table2' }, [
['Cell 1a', 'Cell 2a', 'Cell 3a'],
['Cell 1b', 'Cell 2b', 'Cell 3b']
])).css({color:'blue'}).on('click', 'td', function(e){
this.style.color = 'red';
alert(this.innerHTML);
}));
$('#jquery-spawn-div').append($.spawn('div|id=spawn1', [
['', 'Foo'],
['h1', 'Bar']
]));
}())
</script>
</body>
</html>
\ No newline at end of file
/*!
* DOM element spawner with *optional* jQuery functionality
*
* EXAMPLES:
* var p1 = spawn('p|id:p1', 'Text for paragraph 1.');
* var div2 = spawn('div|class=div2', ['Text for div2.', p1]) // inserts text and puts p1 inside div2
* var ul1 = spawn('ul', [['li', 'Content for <li> 1.'], ['li', 'Content for the next <li>.']]);
* div2.appendChild(ul1); // add ul1 to div2
*/
(function(window, doc){
var undefined;
function isElement(it){
return it.nodeType && it.nodeType === 1;
}
function isFragment(it){
return it.nodeType && it.nodeType === 11;
}
// main factory function
function spawn(tag, opts, inner){
var el, parts, attrs, classArray=[], contents='', children,
use$, $el, $opts={}, toDelete=['tag', 'tagName'];
if (!isDefined(tag)) {
return doc.createDocumentFragment();
}
// handle cases where 'tag' is already an element
if (isElement(tag) || isFragment(tag)){
return tag;
//el = tag;
//tag = el.tagName; // will this create a new element?
}
tag = typeof tag == 'string' ? tag.trim() : tag;
if (arguments.length === 1){
if (Array.isArray(tag)){
children = tag;
tag = '#html';
}
else if (tag === '!'){
return doc.createDocumentFragment();
}
else if (typeof tag == 'string' && tag !== '' &&
!(/^(#text|#html|!)|\|/gi.test(tag))
){
return doc.createElement(tag||'span')
}
}
// make sure opts is defined
opts = opts || {};
if (arguments.length === 3){
contents = inner;
}
if (Array.isArray(opts) || typeof opts == 'string'){
contents = opts;
}
if (isPlainObject(tag)){
opts = tag;
tag = firstDefined(opts.tag||opts.tagName||undefined, '#html');
}
// NOW make sure opts is an Object
opts = getObject(opts);
if (typeof contents == 'number'){
contents = contents+'';
}
// combine 'content', 'contents', and 'children' respectively
contents = [].concat(contents||[], opts.content||[], opts.contents||[], opts.children||[], children||[]);
// add contents/children properties to list of properties to be deleted
toDelete.push('content', 'contents', 'children');
// trim outer white space and remove any trailing
// semicolons or commas from 'tag'
// (shortcut for adding attributes)
parts = tag.trim().replace(/(;|,)$/,'').split('|');
tag = parts[0].trim();
if (el && (isElement(el) || isFragment(el))){
// don't do anything if
// el is already an element
}
else {
// pass '!' as first argument to create fragment
//if (tag === '!'){
// el = doc.createDocumentFragment();
// //el.appendChild(contents);
// if (!contents.length){
// return el;
// }
//}
// pass empty string '', '#text', or '#html' as first argument
// to create a textNode
if (tag === '' || /^(#text|#html|!)|\|/gi.test(tag)){
el = doc.createDocumentFragment();
//el.appendChild(doc.createTextNode(contents));
//return el;
}
else {
try {
el = doc.createElement(tag||'span');
}
catch(e){
if (console && console.log) console.log(e);
el = doc.createDocumentFragment();
el.appendChild(doc.createTextNode(tag||''));
}
}
}
// pass element attributes in 'tag' string, like:
// spawn('a|id="foo-link";href="foo";class="bar"');
// or (colons for separators, commas for delimeters, no quotes),:
// spawn('input|type:checkbox,id:foo-ckbx');
// allow ';' or ',' for attribute delimeter
attrs = parts[1] ? parts[1].split(/;|,/) || null : null;
forEach(attrs, function(att){
if (!att) return;
var sep = /:|=/; // allow ':' or '=' for key/value separator
var quotes = /^('|")|('|")$/g;
var key = att.split(sep)[0].trim();
var val = (att.split(sep)[1]||'').trim().replace(quotes, '') || key;
// add each attribute/property directly to DOM element
//el[key] = val;
el.setAttribute(key, val);
});
// any 'data-' attributes?
if (opts.data) {
forOwn(opts.data, function(name, val){
el.setAttribute('data-'+name, val);
});
}
// 'attr' property (object) to EXPLICITLY set attribute=value
if (opts.attr){
forOwn(opts.attr, function(name, val){
el.setAttribute(name, val);
});
}
toDelete.push('data', 'attr');
//opts = isPlainObject(opts) ? opts : {};
// Are we using jQuery later?
// jQuery stuff needs to be in a property named $, jq, jQuery, or jquery
opts.$ = opts.$ || opts.jq || opts.jQuery || opts.jquery;
use$ = isDefined(opts.$||undefined);
if (use$){
// copy to new object so we can delete from {opts}
forOwn(opts.$, function(method, args){
$opts[method] = args;
});
}
// delete these before adding stuff to the element
toDelete.push('$', 'jq', 'jQuery', 'jquery');
// allow use of 'classes', 'classNames', 'className', and 'addClass'
// as a space-separated string or array of strings
opts.className = [].concat(opts.classes||[], opts.classNames||[], opts.className||[], opts.addClass||[]);
// delete bogus 'class' properties later
toDelete.push('classes', 'classNames', 'addClass');
forEach(opts.className.join(' ').split(/\s+/), function(name){
if (classArray.indexOf(name) === -1){
classArray.push(name)
}
});
// apply sanitized className string back to opts.className
opts.className = classArray.join(' ').trim();
// if no className, delete property
if (!opts.className) toDelete.push('className');
// contents MUST be an array before being processed later
// add 'prepend' and 'append' properties
contents = [].concat(opts.prepend||[], contents, opts.append||[]);
toDelete.push('prepend', 'append');
// DELETE PROPERTIES THAT AREN'T VALID *ELEMENT* ATTRIBUTES OR PROPERTIES
forEach(toDelete, function(prop){
delete opts[prop];
});
// add remaining properties and attributes to element
// (there should only be legal attributes left)
if (isPlainObject(opts)){
forOwn(opts, function(attr, val){
el[attr] = val;
});
}
forEach(contents, function(part){
try {
if (typeof part == 'string'){
el.innerHTML += part;
}
else if (isElement(part) || isFragment(part)){
el.appendChild(part);
}
else {
el.appendChild(spawn.apply(null, [].concat(part)))
}
}
catch(e){
if (console && console.log) console.log(e);
}
});
// that's it... 'contents' HAS to be one of the following
// - text or HTML string
// - array of spawn() compatible arrays: ['div', '{divOpts}']
// - element or fragment
// OPTIONALLY do some jQuery stuff, if specified (and available)
if (use$ && isDefined(window.jQuery||undefined)){
$el = window.jQuery(el);
forOwn($opts, function(method, args){
method = method.toLowerCase();
// accept on/off event handlers with varying
// number of arguments
if (/^(on|off)$/.test(method)){
forOwn(args, function(evt, fn){
try {
$el[method].apply($el, [].concat(evt, fn));
}
catch(e){
if (console && console.log) console.log(e);
}
});
return;
}
$el[method].apply($el, [].concat(args))
});
//return $el;
}
return el;
}
// export to the global window object
window.spawn = spawn;
//
// utility functions:
//
function isDefined(it){
return typeof it != 'undefined';
}
// returns first defined argument
// useful for retrieving 'falsey' values
function firstDefined() {
var undefined, i = -1;
while (++i < arguments.length) {
if (arguments[i] !== undefined) {
return arguments[i];
}
}
return undefined;
}
function isPlainObject( obj ){
return Object.prototype.toString.call(obj) === '[object Object]';
}
function getObject(obj){
return isPlainObject(obj) ? obj : {};
}
function forEach( arr, fn ){
if (!arr) return;
var i = -1, len = arr.length;
while (++i < len){
fn(arr[i], i);
}
}
function forOwn( obj, fn ){
if (!obj) return;
var key;
for ( key in obj ){
if (obj.hasOwnProperty(key)) {
fn(key, obj[key]);
}
}
}
})(this, document);
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment