From d50abec492bf0803eea98707392148db13c1affe Mon Sep 17 00:00:00 2001 From: Yasin Date: Fri, 9 Aug 2013 13:31:17 +0200 Subject: [PATCH] Moved css,js and img to /portal/static dir --- portal/static/jquery.validate.js | 1222 ++++++++++++++++++++++ portal/static/my_account.common.css | 230 ++++ portal/static/my_account.edit_profile.js | 198 ++++ portal/static/my_account.profile.css | 173 +++ portal/static/my_account.register.js | 56 + portal/static/ques_icon.png | Bin 0 -> 102623 bytes portal/templates/my_account.html | 14 +- third-party/jquery/js/jquery.validate.js | 1222 ++++++++++++++++++++++ 8 files changed, 3108 insertions(+), 7 deletions(-) create mode 100644 portal/static/jquery.validate.js create mode 100644 portal/static/my_account.common.css create mode 100644 portal/static/my_account.edit_profile.js create mode 100644 portal/static/my_account.profile.css create mode 100644 portal/static/my_account.register.js create mode 100644 portal/static/ques_icon.png create mode 100644 third-party/jquery/js/jquery.validate.js diff --git a/portal/static/jquery.validate.js b/portal/static/jquery.validate.js new file mode 100644 index 00000000..51eb2ef5 --- /dev/null +++ b/portal/static/jquery.validate.js @@ -0,0 +1,1222 @@ +/** + * jQuery Validation Plugin 1.11.0pre + * + * http://bassistance.de/jquery-plugins/jquery-plugin-validation/ + * http://docs.jquery.com/Plugins/Validation + * + * Copyright 2013 Jörn Zaefferer + * Released under the MIT license: + * http://www.opensource.org/licenses/mit-license.php + */ + +(function($) { + +$.extend($.fn, { + // http://docs.jquery.com/Plugins/Validation/validate + validate: function( options ) { + + // if nothing is selected, return nothing; can't chain anyway + if ( !this.length ) { + if ( options && options.debug && window.console ) { + console.warn( "Nothing selected, can't validate, returning nothing." ); + } + return; + } + + // check if a validator for this form was already created + var validator = $.data( this[0], "validator" ); + if ( validator ) { + return validator; + } + + // Add novalidate tag if HTML5. + this.attr( "novalidate", "novalidate" ); + + validator = new $.validator( options, this[0] ); + $.data( this[0], "validator", validator ); + + if ( validator.settings.onsubmit ) { + + this.validateDelegate( ":submit", "click", function( event ) { + if ( validator.settings.submitHandler ) { + validator.submitButton = event.target; + } + // allow suppressing validation by adding a cancel class to the submit button + if ( $(event.target).hasClass("cancel") ) { + validator.cancelSubmit = true; + } + }); + + // validate the form on submit + this.submit( function( event ) { + if ( validator.settings.debug ) { + // prevent form submit to be able to see console output + event.preventDefault(); + } + function handle() { + var hidden; + if ( validator.settings.submitHandler ) { + if ( validator.submitButton ) { + // insert a hidden input as a replacement for the missing submit button + hidden = $("").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm); + } + validator.settings.submitHandler.call( validator, validator.currentForm, event ); + if ( validator.submitButton ) { + // and clean up afterwards; thanks to no-block-scope, hidden can be referenced + hidden.remove(); + } + return false; + } + return true; + } + + // prevent submit for invalid forms or custom submit handlers + if ( validator.cancelSubmit ) { + validator.cancelSubmit = false; + return handle(); + } + if ( validator.form() ) { + if ( validator.pendingRequest ) { + validator.formSubmitted = true; + return false; + } + return handle(); + } else { + validator.focusInvalid(); + return false; + } + }); + } + + return validator; + }, + // http://docs.jquery.com/Plugins/Validation/valid + valid: function() { + if ( $(this[0]).is("form")) { + return this.validate().form(); + } else { + var valid = true; + var validator = $(this[0].form).validate(); + this.each(function() { + valid &= validator.element(this); + }); + return valid; + } + }, + // attributes: space seperated list of attributes to retrieve and remove + removeAttrs: function( attributes ) { + var result = {}, + $element = this; + $.each(attributes.split(/\s/), function( index, value ) { + result[value] = $element.attr(value); + $element.removeAttr(value); + }); + return result; + }, + // http://docs.jquery.com/Plugins/Validation/rules + rules: function( command, argument ) { + var element = this[0]; + + if ( command ) { + var settings = $.data(element.form, "validator").settings; + var staticRules = settings.rules; + var existingRules = $.validator.staticRules(element); + switch(command) { + case "add": + $.extend(existingRules, $.validator.normalizeRule(argument)); + staticRules[element.name] = existingRules; + if ( argument.messages ) { + settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages ); + } + break; + case "remove": + if ( !argument ) { + delete staticRules[element.name]; + return existingRules; + } + var filtered = {}; + $.each(argument.split(/\s/), function( index, method ) { + filtered[method] = existingRules[method]; + delete existingRules[method]; + }); + return filtered; + } + } + + var data = $.validator.normalizeRules( + $.extend( + {}, + $.validator.classRules(element), + $.validator.attributeRules(element), + $.validator.dataRules(element), + $.validator.staticRules(element) + ), element); + + // make sure required is at front + if ( data.required ) { + var param = data.required; + delete data.required; + data = $.extend({required: param}, data); + } + + return data; + } +}); + +// Custom selectors +$.extend($.expr[":"], { + // http://docs.jquery.com/Plugins/Validation/blank + blank: function( a ) { return !$.trim("" + a.value); }, + // http://docs.jquery.com/Plugins/Validation/filled + filled: function( a ) { return !!$.trim("" + a.value); }, + // http://docs.jquery.com/Plugins/Validation/unchecked + unchecked: function( a ) { return !a.checked; } +}); + +// constructor for validator +$.validator = function( options, form ) { + this.settings = $.extend( true, {}, $.validator.defaults, options ); + this.currentForm = form; + this.init(); +}; + +$.validator.format = function( source, params ) { + if ( arguments.length === 1 ) { + return function() { + var args = $.makeArray(arguments); + args.unshift(source); + return $.validator.format.apply( this, args ); + }; + } + if ( arguments.length > 2 && params.constructor !== Array ) { + params = $.makeArray(arguments).slice(1); + } + if ( params.constructor !== Array ) { + params = [ params ]; + } + $.each(params, function( i, n ) { + source = source.replace( new RegExp("\\{" + i + "\\}", "g"), function() { + return n; + }); + }); + return source; +}; + +$.extend($.validator, { + + defaults: { + messages: {}, + groups: {}, + rules: {}, + errorClass: "error", + validClass: "valid", + errorElement: "label", + focusInvalid: true, + errorContainer: $([]), + errorLabelContainer: $([]), + onsubmit: true, + ignore: ":hidden", + ignoreTitle: false, + onfocusin: function( element, event ) { + this.lastActive = element; + + // hide error label and remove error class on focus if enabled + if ( this.settings.focusCleanup && !this.blockFocusCleanup ) { + if ( this.settings.unhighlight ) { + this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass ); + } + this.addWrapper(this.errorsFor(element)).hide(); + } + }, + onfocusout: function( element, event ) { + if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) { + this.element(element); + } + }, + onkeyup: function( element, event ) { + if ( event.which === 9 && this.elementValue(element) === "" ) { + return; + } else if ( element.name in this.submitted || element === this.lastElement ) { + this.element(element); + } + }, + onclick: function( element, event ) { + // click on selects, radiobuttons and checkboxes + if ( element.name in this.submitted ) { + this.element(element); + } + // or option elements, check parent select in that case + else if ( element.parentNode.name in this.submitted ) { + this.element(element.parentNode); + } + }, + highlight: function( element, errorClass, validClass ) { + if ( element.type === "radio" ) { + this.findByName(element.name).addClass(errorClass).removeClass(validClass); + } else { + $(element).addClass(errorClass).removeClass(validClass); + } + }, + unhighlight: function( element, errorClass, validClass ) { + if ( element.type === "radio" ) { + this.findByName(element.name).removeClass(errorClass).addClass(validClass); + } else { + $(element).removeClass(errorClass).addClass(validClass); + } + } + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults + setDefaults: function( settings ) { + $.extend( $.validator.defaults, settings ); + }, + + messages: { + required: "This field is required.", + remote: "Please fix this field.", + email: "Please enter a valid email address.", + url: "Please enter a valid URL.", + date: "Please enter a valid date.", + dateISO: "Please enter a valid date (ISO).", + number: "Please enter a valid number.", + digits: "Please enter only digits.", + creditcard: "Please enter a valid credit card number.", + equalTo: "Please enter the same value again.", + maxlength: $.validator.format("Please enter no more than {0} characters."), + minlength: $.validator.format("Please enter at least {0} characters."), + rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."), + range: $.validator.format("Please enter a value between {0} and {1}."), + max: $.validator.format("Please enter a value less than or equal to {0}."), + min: $.validator.format("Please enter a value greater than or equal to {0}.") + }, + + autoCreateRanges: false, + + prototype: { + + init: function() { + this.labelContainer = $(this.settings.errorLabelContainer); + this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm); + this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer ); + this.submitted = {}; + this.valueCache = {}; + this.pendingRequest = 0; + this.pending = {}; + this.invalid = {}; + this.reset(); + + var groups = (this.groups = {}); + $.each(this.settings.groups, function( key, value ) { + if ( typeof value === "string" ) { + value = value.split(/\s/); + } + $.each(value, function( index, name ) { + groups[name] = key; + }); + }); + var rules = this.settings.rules; + $.each(rules, function( key, value ) { + rules[key] = $.validator.normalizeRule(value); + }); + + function delegate(event) { + var validator = $.data(this[0].form, "validator"), + eventType = "on" + event.type.replace(/^validate/, ""); + if ( validator.settings[eventType] ) { + validator.settings[eventType].call(validator, this[0], event); + } + } + $(this.currentForm) + .validateDelegate(":text, [type='password'], [type='file'], select, textarea, " + + "[type='number'], [type='search'] ,[type='tel'], [type='url'], " + + "[type='email'], [type='datetime'], [type='date'], [type='month'], " + + "[type='week'], [type='time'], [type='datetime-local'], " + + "[type='range'], [type='color'] ", + "focusin focusout keyup", delegate) + .validateDelegate("[type='radio'], [type='checkbox'], select, option", "click", delegate); + + if ( this.settings.invalidHandler ) { + $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler); + } + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/form + form: function() { + this.checkForm(); + $.extend(this.submitted, this.errorMap); + this.invalid = $.extend({}, this.errorMap); + if ( !this.valid() ) { + $(this.currentForm).triggerHandler("invalid-form", [this]); + } + this.showErrors(); + return this.valid(); + }, + + checkForm: function() { + this.prepareForm(); + for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { + this.check( elements[i] ); + } + return this.valid(); + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/element + element: function( element ) { + element = this.validationTargetFor( this.clean( element ) ); + this.lastElement = element; + this.prepareElement( element ); + this.currentElements = $(element); + var result = this.check( element ) !== false; + if ( result ) { + delete this.invalid[element.name]; + } else { + this.invalid[element.name] = true; + } + if ( !this.numberOfInvalids() ) { + // Hide error containers on last error + this.toHide = this.toHide.add( this.containers ); + } + this.showErrors(); + return result; + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/showErrors + showErrors: function( errors ) { + if ( errors ) { + // add items to error list and map + $.extend( this.errorMap, errors ); + this.errorList = []; + for ( var name in errors ) { + this.errorList.push({ + message: errors[name], + element: this.findByName(name)[0] + }); + } + // remove items from success list + this.successList = $.grep( this.successList, function( element ) { + return !(element.name in errors); + }); + } + if ( this.settings.showErrors ) { + this.settings.showErrors.call( this, this.errorMap, this.errorList ); + } else { + this.defaultShowErrors(); + } + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/resetForm + resetForm: function() { + if ( $.fn.resetForm ) { + $(this.currentForm).resetForm(); + } + this.submitted = {}; + this.lastElement = null; + this.prepareForm(); + this.hideErrors(); + this.elements().removeClass( this.settings.errorClass ).removeData( "previousValue" ); + }, + + numberOfInvalids: function() { + return this.objectLength(this.invalid); + }, + + objectLength: function( obj ) { + var count = 0; + for ( var i in obj ) { + count++; + } + return count; + }, + + hideErrors: function() { + this.addWrapper( this.toHide ).hide(); + }, + + valid: function() { + return this.size() === 0; + }, + + size: function() { + return this.errorList.length; + }, + + focusInvalid: function() { + if ( this.settings.focusInvalid ) { + try { + $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []) + .filter(":visible") + .focus() + // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find + .trigger("focusin"); + } catch(e) { + // ignore IE throwing errors when focusing hidden elements + } + } + }, + + findLastActive: function() { + var lastActive = this.lastActive; + return lastActive && $.grep(this.errorList, function( n ) { + return n.element.name === lastActive.name; + }).length === 1 && lastActive; + }, + + elements: function() { + var validator = this, + rulesCache = {}; + + // select all valid inputs inside the form (no submit or reset buttons) + return $(this.currentForm) + .find("input, select, textarea") + .not(":submit, :reset, :image, [disabled]") + .not( this.settings.ignore ) + .filter(function() { + if ( !this.name ) { + if ( window.console ) { + console.error( "%o has no name assigned", this ); + } + throw new Error( "Failed to validate, found an element with no name assigned. See console for element reference." ); + } + + // select only the first element for each name, and only those with rules specified + if ( this.name in rulesCache || !validator.objectLength($(this).rules()) ) { + return false; + } + + rulesCache[this.name] = true; + return true; + }); + }, + + clean: function( selector ) { + return $(selector)[0]; + }, + + errors: function() { + var errorClass = this.settings.errorClass.replace(" ", "."); + return $(this.settings.errorElement + "." + errorClass, this.errorContext); + }, + + reset: function() { + this.successList = []; + this.errorList = []; + this.errorMap = {}; + this.toShow = $([]); + this.toHide = $([]); + this.currentElements = $([]); + }, + + prepareForm: function() { + this.reset(); + this.toHide = this.errors().add( this.containers ); + }, + + prepareElement: function( element ) { + this.reset(); + this.toHide = this.errorsFor(element); + }, + + elementValue: function( element ) { + var type = $(element).attr("type"), + val = $(element).val(); + + if ( type === "radio" || type === "checkbox" ) { + return $("input[name='" + $(element).attr("name") + "']:checked").val(); + } + + if ( typeof val === "string" ) { + return val.replace(/\r/g, ""); + } + return val; + }, + + check: function( element ) { + element = this.validationTargetFor( this.clean( element ) ); + + var rules = $(element).rules(); + var dependencyMismatch = false; + var val = this.elementValue(element); + var result; + + for (var method in rules ) { + var rule = { method: method, parameters: rules[method] }; + try { + + result = $.validator.methods[method].call( this, val, element, rule.parameters ); + + // if a method indicates that the field is optional and therefore valid, + // don't mark it as valid when there are no other rules + if ( result === "dependency-mismatch" ) { + dependencyMismatch = true; + continue; + } + dependencyMismatch = false; + + if ( result === "pending" ) { + this.toHide = this.toHide.not( this.errorsFor(element) ); + return; + } + + if ( !result ) { + this.formatAndAdd( element, rule ); + return false; + } + } catch(e) { + if ( this.settings.debug && window.console ) { + console.log( "Exception occured when checking element " + element.id + ", check the '" + rule.method + "' method.", e ); + } + throw e; + } + } + if ( dependencyMismatch ) { + return; + } + if ( this.objectLength(rules) ) { + this.successList.push(element); + } + return true; + }, + + // return the custom message for the given element and validation method + // specified in the element's HTML5 data attribute + customDataMessage: function( element, method ) { + return $(element).data("msg-" + method.toLowerCase()) || (element.attributes && $(element).attr("data-msg-" + method.toLowerCase())); + }, + + // return the custom message for the given element name and validation method + customMessage: function( name, method ) { + var m = this.settings.messages[name]; + return m && (m.constructor === String ? m : m[method]); + }, + + // return the first defined argument, allowing empty strings + findDefined: function() { + for(var i = 0; i < arguments.length; i++) { + if ( arguments[i] !== undefined ) { + return arguments[i]; + } + } + return undefined; + }, + + defaultMessage: function( element, method ) { + return this.findDefined( + this.customMessage( element.name, method ), + this.customDataMessage( element, method ), + // title is never undefined, so handle empty string as undefined + !this.settings.ignoreTitle && element.title || undefined, + $.validator.messages[method], + "Warning: No message defined for " + element.name + "" + ); + }, + + formatAndAdd: function( element, rule ) { + var message = this.defaultMessage( element, rule.method ), + theregex = /\$?\{(\d+)\}/g; + if ( typeof message === "function" ) { + message = message.call(this, rule.parameters, element); + } else if (theregex.test(message)) { + message = $.validator.format(message.replace(theregex, "{$1}"), rule.parameters); + } + this.errorList.push({ + message: message, + element: element + }); + + this.errorMap[element.name] = message; + this.submitted[element.name] = message; + }, + + addWrapper: function( toToggle ) { + if ( this.settings.wrapper ) { + toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) ); + } + return toToggle; + }, + + defaultShowErrors: function() { + var i, elements; + for ( i = 0; this.errorList[i]; i++ ) { + var error = this.errorList[i]; + if ( this.settings.highlight ) { + this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass ); + } + this.showLabel( error.element, error.message ); + } + if ( this.errorList.length ) { + this.toShow = this.toShow.add( this.containers ); + } + if ( this.settings.success ) { + for ( i = 0; this.successList[i]; i++ ) { + this.showLabel( this.successList[i] ); + } + } + if ( this.settings.unhighlight ) { + for ( i = 0, elements = this.validElements(); elements[i]; i++ ) { + this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass ); + } + } + this.toHide = this.toHide.not( this.toShow ); + this.hideErrors(); + this.addWrapper( this.toShow ).show(); + }, + + validElements: function() { + return this.currentElements.not(this.invalidElements()); + }, + + invalidElements: function() { + return $(this.errorList).map(function() { + return this.element; + }); + }, + + showLabel: function( element, message ) { + var label = this.errorsFor( element ); + if ( label.length ) { + // refresh error/success class + label.removeClass( this.settings.validClass ).addClass( this.settings.errorClass ); + + // check if we have a generated label, replace the message then + if ( label.attr("generated") ) { + label.html(message); + } + } else { + // create label + label = $("<" + this.settings.errorElement + "/>") + .attr({"for": this.idOrName(element), generated: true}) + .addClass(this.settings.errorClass) + .html(message || ""); + if ( this.settings.wrapper ) { + // make sure the element is visible, even in IE + // actually showing the wrapped element is handled elsewhere + label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent(); + } + if ( !this.labelContainer.append(label).length ) { + if ( this.settings.errorPlacement ) { + this.settings.errorPlacement(label, $(element) ); + } else { + label.insertAfter(element); + } + } + } + if ( !message && this.settings.success ) { + label.text(""); + if ( typeof this.settings.success === "string" ) { + label.addClass( this.settings.success ); + } else { + this.settings.success( label, element ); + } + } + this.toShow = this.toShow.add(label); + }, + + errorsFor: function( element ) { + var name = this.idOrName(element); + return this.errors().filter(function() { + return $(this).attr("for") === name; + }); + }, + + idOrName: function( element ) { + return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name); + }, + + validationTargetFor: function( element ) { + // if radio/checkbox, validate first element in group instead + if ( this.checkable(element) ) { + element = this.findByName( element.name ).not(this.settings.ignore)[0]; + } + return element; + }, + + checkable: function( element ) { + return (/radio|checkbox/i).test(element.type); + }, + + findByName: function( name ) { + return $(this.currentForm).find("[name='" + name + "']"); + }, + + getLength: function( value, element ) { + switch( element.nodeName.toLowerCase() ) { + case "select": + return $("option:selected", element).length; + case "input": + if ( this.checkable( element) ) { + return this.findByName(element.name).filter(":checked").length; + } + } + return value.length; + }, + + depend: function( param, element ) { + return this.dependTypes[typeof param] ? this.dependTypes[typeof param](param, element) : true; + }, + + dependTypes: { + "boolean": function( param, element ) { + return param; + }, + "string": function( param, element ) { + return !!$(param, element.form).length; + }, + "function": function( param, element ) { + return param(element); + } + }, + + optional: function( element ) { + var val = this.elementValue(element); + return !$.validator.methods.required.call(this, val, element) && "dependency-mismatch"; + }, + + startRequest: function( element ) { + if ( !this.pending[element.name] ) { + this.pendingRequest++; + this.pending[element.name] = true; + } + }, + + stopRequest: function( element, valid ) { + this.pendingRequest--; + // sometimes synchronization fails, make sure pendingRequest is never < 0 + if ( this.pendingRequest < 0 ) { + this.pendingRequest = 0; + } + delete this.pending[element.name]; + if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) { + $(this.currentForm).submit(); + this.formSubmitted = false; + } else if (!valid && this.pendingRequest === 0 && this.formSubmitted) { + $(this.currentForm).triggerHandler("invalid-form", [this]); + this.formSubmitted = false; + } + }, + + previousValue: function( element ) { + return $.data(element, "previousValue") || $.data(element, "previousValue", { + old: null, + valid: true, + message: this.defaultMessage( element, "remote" ) + }); + } + + }, + + classRuleSettings: { + required: {required: true}, + email: {email: true}, + url: {url: true}, + date: {date: true}, + dateISO: {dateISO: true}, + number: {number: true}, + digits: {digits: true}, + creditcard: {creditcard: true} + }, + + addClassRules: function( className, rules ) { + if ( className.constructor === String ) { + this.classRuleSettings[className] = rules; + } else { + $.extend(this.classRuleSettings, className); + } + }, + + classRules: function( element ) { + var rules = {}; + var classes = $(element).attr("class"); + if ( classes ) { + $.each(classes.split(" "), function() { + if ( this in $.validator.classRuleSettings ) { + $.extend(rules, $.validator.classRuleSettings[this]); + } + }); + } + return rules; + }, + + attributeRules: function( element ) { + var rules = {}; + var $element = $(element); + + for (var method in $.validator.methods) { + var value; + + // support for in both html5 and older browsers + if ( method === "required" ) { + value = $element.get(0).getAttribute(method); + // Some browsers return an empty string for the required attribute + // and non-HTML5 browsers might have required="" markup + if ( value === "" ) { + value = true; + } + // force non-HTML5 browsers to return bool + value = !!value; + } else { + value = $element.attr(method); + } + + if ( value ) { + rules[method] = value; + } else if ( $element[0].getAttribute("type") === method ) { + rules[method] = true; + } + } + + // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs + if ( rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength) ) { + delete rules.maxlength; + } + + return rules; + }, + + dataRules: function( element ) { + var method, value, + rules = {}, $element = $(element); + for (method in $.validator.methods) { + value = $element.data("rule-" + method.toLowerCase()); + if ( value !== undefined ) { + rules[method] = value; + } + } + return rules; + }, + + staticRules: function( element ) { + var rules = {}; + var validator = $.data(element.form, "validator"); + if ( validator.settings.rules ) { + rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {}; + } + return rules; + }, + + normalizeRules: function( rules, element ) { + // handle dependency check + $.each(rules, function( prop, val ) { + // ignore rule when param is explicitly false, eg. required:false + if ( val === false ) { + delete rules[prop]; + return; + } + if ( val.param || val.depends ) { + var keepRule = true; + switch (typeof val.depends) { + case "string": + keepRule = !!$(val.depends, element.form).length; + break; + case "function": + keepRule = val.depends.call(element, element); + break; + } + if ( keepRule ) { + rules[prop] = val.param !== undefined ? val.param : true; + } else { + delete rules[prop]; + } + } + }); + + // evaluate parameters + $.each(rules, function( rule, parameter ) { + rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter; + }); + + // clean number parameters + $.each(["minlength", "maxlength", "min", "max"], function() { + if ( rules[this] ) { + rules[this] = Number(rules[this]); + } + }); + $.each(["rangelength", "range"], function() { + var parts; + if ( rules[this] ) { + if ( $.isArray(rules[this]) ) { + rules[this] = [Number(rules[this][0]), Number(rules[this][1])]; + } else if ( typeof rules[this] === "string" ) { + parts = rules[this].split(/[\s,]+/); + rules[this] = [Number(parts[0]), Number(parts[1])]; + } + } + }); + + if ( $.validator.autoCreateRanges ) { + // auto-create ranges + if ( rules.min && rules.max ) { + rules.range = [rules.min, rules.max]; + delete rules.min; + delete rules.max; + } + if ( rules.minlength && rules.maxlength ) { + rules.rangelength = [rules.minlength, rules.maxlength]; + delete rules.minlength; + delete rules.maxlength; + } + } + + return rules; + }, + + // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true} + normalizeRule: function( data ) { + if ( typeof data === "string" ) { + var transformed = {}; + $.each(data.split(/\s/), function() { + transformed[this] = true; + }); + data = transformed; + } + return data; + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/addMethod + addMethod: function( name, method, message ) { + $.validator.methods[name] = method; + $.validator.messages[name] = message !== undefined ? message : $.validator.messages[name]; + if ( method.length < 3 ) { + $.validator.addClassRules(name, $.validator.normalizeRule(name)); + } + }, + + methods: { + + // http://docs.jquery.com/Plugins/Validation/Methods/required + required: function( value, element, param ) { + // check if dependency is met + if ( !this.depend(param, element) ) { + return "dependency-mismatch"; + } + if ( element.nodeName.toLowerCase() === "select" ) { + // could be an array for select-multiple or a string, both are fine this way + var val = $(element).val(); + return val && val.length > 0; + } + if ( this.checkable(element) ) { + return this.getLength(value, element) > 0; + } + return $.trim(value).length > 0; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/remote + remote: function( value, element, param ) { + if ( this.optional(element) ) { + return "dependency-mismatch"; + } + + var previous = this.previousValue(element); + if (!this.settings.messages[element.name] ) { + this.settings.messages[element.name] = {}; + } + previous.originalMessage = this.settings.messages[element.name].remote; + this.settings.messages[element.name].remote = previous.message; + + param = typeof param === "string" && {url:param} || param; + + if ( previous.old === value ) { + return previous.valid; + } + + previous.old = value; + var validator = this; + this.startRequest(element); + var data = {}; + data[element.name] = value; + $.ajax($.extend(true, { + url: param, + mode: "abort", + port: "validate" + element.name, + dataType: "json", + data: data, + success: function( response ) { + validator.settings.messages[element.name].remote = previous.originalMessage; + var valid = response === true || response === "true"; + if ( valid ) { + var submitted = validator.formSubmitted; + validator.prepareElement(element); + validator.formSubmitted = submitted; + validator.successList.push(element); + delete validator.invalid[element.name]; + validator.showErrors(); + } else { + var errors = {}; + var message = response || validator.defaultMessage( element, "remote" ); + errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message; + validator.invalid[element.name] = true; + validator.showErrors(errors); + } + previous.valid = valid; + validator.stopRequest(element, valid); + } + }, param)); + return "pending"; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/minlength + minlength: function( value, element, param ) { + var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); + return this.optional(element) || length >= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/maxlength + maxlength: function( value, element, param ) { + var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); + return this.optional(element) || length <= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/rangelength + rangelength: function( value, element, param ) { + var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); + return this.optional(element) || ( length >= param[0] && length <= param[1] ); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/min + min: function( value, element, param ) { + return this.optional(element) || value >= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/max + max: function( value, element, param ) { + return this.optional(element) || value <= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/range + range: function( value, element, param ) { + return this.optional(element) || ( value >= param[0] && value <= param[1] ); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/email + email: function( value, element ) { + // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/ + return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/url + url: function( value, element ) { + // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/ + return this.optional(element) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/date + date: function( value, element ) { + return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString()); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/dateISO + dateISO: function( value, element ) { + return this.optional(element) || /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/number + number: function( value, element ) { + return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/digits + digits: function( value, element ) { + return this.optional(element) || /^\d+$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/creditcard + // based on http://en.wikipedia.org/wiki/Luhn + creditcard: function( value, element ) { + if ( this.optional(element) ) { + return "dependency-mismatch"; + } + // accept only spaces, digits and dashes + if ( /[^0-9 \-]+/.test(value) ) { + return false; + } + var nCheck = 0, + nDigit = 0, + bEven = false; + + value = value.replace(/\D/g, ""); + + for (var n = value.length - 1; n >= 0; n--) { + var cDigit = value.charAt(n); + nDigit = parseInt(cDigit, 10); + if ( bEven ) { + if ( (nDigit *= 2) > 9 ) { + nDigit -= 9; + } + } + nCheck += nDigit; + bEven = !bEven; + } + + return (nCheck % 10) === 0; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/equalTo + equalTo: function( value, element, param ) { + // bind to the blur event of the target in order to revalidate whenever the target field is updated + // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead + var target = $(param); + if ( this.settings.onfocusout ) { + target.unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { + $(element).valid(); + }); + } + return value === target.val(); + } + + } + +}); + +// deprecated, use $.validator.format instead +$.format = $.validator.format; + +}(jQuery)); + +// ajax mode: abort +// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); +// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() +(function($) { + var pendingRequests = {}; + // Use a prefilter if available (1.5+) + if ( $.ajaxPrefilter ) { + $.ajaxPrefilter(function( settings, _, xhr ) { + var port = settings.port; + if ( settings.mode === "abort" ) { + if ( pendingRequests[port] ) { + pendingRequests[port].abort(); + } + pendingRequests[port] = xhr; + } + }); + } else { + // Proxy ajax + var ajax = $.ajax; + $.ajax = function( settings ) { + var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode, + port = ( "port" in settings ? settings : $.ajaxSettings ).port; + if ( mode === "abort" ) { + if ( pendingRequests[port] ) { + pendingRequests[port].abort(); + } + return (pendingRequests[port] = ajax.apply(this, arguments)); + } + return ajax.apply(this, arguments); + }; + } +}(jQuery)); + +// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation +// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target +(function($) { + $.extend($.fn, { + validateDelegate: function( delegate, type, handler ) { + return this.bind(type, function( event ) { + var target = $(event.target); + if ( target.is(delegate) ) { + return handler.apply(target, arguments); + } + }); + } + }); +}(jQuery)); + + diff --git a/portal/static/my_account.common.css b/portal/static/my_account.common.css new file mode 100644 index 00000000..82540a63 --- /dev/null +++ b/portal/static/my_account.common.css @@ -0,0 +1,230 @@ +/***************************************************************** + + common.css + + + January 18, 2009 + + + March 7, 2009 + + + shawiz@cs.washington.edu + Xuanhua (Sean) Ren + + + Provides the common stylesheet for Seattle Clearinghouse + + +*****************************************************************/ + + +/******************* +* RESET +********************/ + +* { + margin: 0; + padding: 0; +} + +fieldset, img { + border: 0; +} + + + +/************************ +* GENERAL +************************/ + +body { + background-color: #fff; + font-family: "Segoe UI", "Lucida Grande", "Helvetica" , sans-serif; + font-size: 12pt; + min-width: 1000px; /* ADDED July 2012 */ + margin: 0px auto; /* ADDED Aug 14, 2012 */ +} + +ol { + list-style-position: inside; +} + +a { + text-decoration: none; + color: #0066FF; +} + +code { + font-family: "Consolas", "Lucida Console", "Monaco", "Courier New"; +} + +.odd { + background-color: #fff; +} + +.even { + background-color: #eee; +} + + +/************************ +* LAYOUT +************************/ + +/***** Header *****/ + +#header { + width: 900px; /* Edited Aug 14, 2012 prev width:70%*/ + margin: 30px auto 20px auto; +} + +#header #logo { + font-size: 42px; /* Edited Sept 28, 2012 prev value :36pt*/ + font-weight: bold; +} + +#header #logo a { + color: #000; +} + +#header #caption { + margin-left: 20px; + font-size: 13.3333px; +} + +#header #caption a { + color: #0066FF; +} + + +/***** Navigator *****/ + +#navigator { + border-bottom: 3px solid #222; + width: 100%; + margin: 0 auto; /* ADDED Aug 14, 2012 */ +} + +#tabs { + margin: 0 auto; + width: 900px; /* Editied Aug 14, 2012 prev width: 70% */ +} + +#meta { + float: right; + font-size: 13pt; + margin: 5px 0; +} + +#meta a.logout { + color: red; +} + +#tabs table { + border-collapse: collapse; + border-spacing: 0; +} + +#tabs table tr td { + padding: 5px 15px; + font-size: 14pt; + border-top: 1px solid #222; + border-right: 2px solid #222; + border-left: 2px solid #222; +} + +#tabs table tr td a { + color: #000; +} + +#tabs table tr td.active { + background-color: #222; + color: #fff; +} + +#tabs table tr td.active a { + color: #fff; +} + + +/***** Main *****/ + +#main { + width: 100%; + height: 400px; + padding: 40px 0; + background-image: url(../images/bg.png); + background-repeat: repeat-x; +} + +#middle { + margin: 0 auto; + width: 900px; /* Edited Aug 14, 2012 prev width:70% */ + padding-bottom: 60px; +} + + +/***** Notifications *****/ + +.warning { + border: 1px solid red; + margin: 20px 60px; + padding: 10px 20px; + color: red; + background-color: #f2dbdb; + text-align: center; +} +.warning2 { + border: 1px solid red; + margin: 20px 60px; + padding: 10px 20px; + color: red; + background-color: #f2dbdb; + text-align: center; +} +.message { + border: 1px solid green; + max-width : 682px; /* ADDED July 2012 */ + margin: 20px 60px; + padding: 10px 20px; + color: green; + font-weight: bold; + background-color: #CCFFCC; + text-align: center; +} + +.tooltip { + background-color: #efefef; + color: #333; + font-size: 10pt; + padding: 3px; + border: solid 1px #333; + z-index:100; +} + +ul.errorlist li { + color: red; + font-weight: normal; + font-size: 10pt; + background-color: #f2dbdb; + padding: 3px; + list-style-position: inside; +} + +#learn-about-seattle { + /* max-width : 70%;*/ + text-align : center; + background-color : #ded; + border : 1px solid #0a0; + padding : 1em; + margin-top : 1em; + margin-bottom : 1em; + font-size : 1.3em; +} + + + + + + diff --git a/portal/static/my_account.edit_profile.js b/portal/static/my_account.edit_profile.js new file mode 100644 index 00000000..de71b107 --- /dev/null +++ b/portal/static/my_account.edit_profile.js @@ -0,0 +1,198 @@ +/* + ********* + ******* JQuery for the MySlice [Local] account buttons ********************* + ******** +Authors: + Mohammed Yasin Rahman +Copyright 2013, UPMC Sorbonne Universités / LIP6 + + */ + +jQuery(document).ready(function(){ + // jquery functionalities of different buttons [Edit, Cancel, Upload] + //edit name + jQuery("#edit_name").click(function(){ + + jQuery("#span_name").show(); + jQuery("#nameval").hide(); + jQuery("#edit_name").hide(); + // enforcing when one edit is clicked the rest will not work at same time + jQuery("#span_pass").hide(); + jQuery("#edit_pass").show(); + jQuery("#passval").show(); + jQuery("#span_aff").hide(); + jQuery("#edit_aff").show(); + jQuery("#affval").show(); + jQuery("#span_email").hide(); + jQuery("#edit_email").show(); + jQuery("#emailval").show(); + jQuery("#span_upload").hide(); + jQuery("#keyval").show(); + jQuery("#dl_file").show(); + jQuery("#upload_file").show(); + }); + jQuery("#cancel_name_change").click(function(){ + + jQuery("#span_name").hide(); + jQuery("#nameval").show(); + jQuery("#edit_name").show(); + + + }); + //edit pass + jQuery("#edit_pass").click(function(){ + + jQuery("#span_pass").show(); + jQuery("#passval").hide(); + jQuery("#edit_pass").hide(); + // enforcing when one edit is clicked the rest will not work at same time + jQuery("#span_name").hide(); + jQuery("#edit_name").show(); + jQuery("#nameval").show(); + jQuery("#span_aff").hide(); + jQuery("#edit_aff").show(); + jQuery("#affval").show(); + jQuery("#span_email").hide(); + jQuery("#edit_email").show(); + jQuery("#emailval").show(); + jQuery("#span_upload").hide(); + jQuery("#keyval").show(); + jQuery("#dl_file").show(); + jQuery("#upload_file").show(); + }); + jQuery("#cancel_pass_change").click(function(){ + + jQuery("#span_pass").hide(); + jQuery("#passval").show(); + jQuery("#edit_pass").show(); + }); + // both password should be same + jQuery("#editForm").validate({ + rules: { + password: { + required: true + }, + confirmpassword: { + required: true, equalTo: "#password" + } + } + }); + //edit affiliation + jQuery("#edit_aff").click(function(){ + + jQuery("#span_aff").show(); + jQuery("#affval").hide(); + jQuery("#edit_aff").hide(); + // enforcing when one edit is clicked the rest will not work at same time + jQuery("#span_pass").hide(); + jQuery("#edit_pass").show(); + jQuery("#passval").show(); + jQuery("#span_name").hide(); + jQuery("#edit_name").show(); + jQuery("#nameval").show(); + jQuery("#span_email").hide(); + jQuery("#edit_email").show(); + jQuery("#emailval").show(); + jQuery("#span_upload").hide(); + jQuery("#keyval").show(); + jQuery("#dl_file").show(); + jQuery("#upload_file").show(); + }); + jQuery("#cancel_aff_change").click(function(){ + + jQuery("#span_aff").hide(); + jQuery("#affval").show(); + jQuery("#edit_aff").show(); + }); + //edit email + /* edit email will be done by PI if needed + jQuery("#edit_email").click(function(){ + + jQuery("#span_email").show(); + jQuery("#emailval").hide(); + jQuery("#edit_email").hide(); + // enforcing when one edit is clicked the rest will not work at same time + jQuery("#span_pass").hide(); + jQuery("#edit_pass").show(); + jQuery("#passval").show(); + jQuery("#span_aff").hide(); + jQuery("#edit_aff").show(); + jQuery("#affval").show(); + jQuery("#span_name").hide(); + jQuery("#edit_name").show(); + jQuery("#nameval").show(); + jQuery("#span_upload").hide(); + jQuery("#keyval").show(); + jQuery("#dl_file").show(); + jQuery("#upload_file").show(); + }); + jQuery("#cancel_email_change").click(function(){ + + jQuery("#span_email").hide(); + jQuery("#emailval").show(); + jQuery("#edit_email").show(); + }); */ + //upload pub keys + jQuery("#upload_file").click(function(){ + + jQuery("#span_upload").show(); + jQuery("#dl_file").hide(); + jQuery("#upload_file").hide(); + jQuery("#keyval").hide(); + // enforcing when one edit is clicked the rest will not work at same time + jQuery("#span_name").hide(); + jQuery("#edit_name").show(); + jQuery("#nameval").show(); + jQuery("#span_pass").hide(); + jQuery("#edit_pass").show(); + jQuery("#passval").show(); + jQuery("#span_aff").hide(); + jQuery("#edit_aff").show(); + jQuery("#affval").show(); + jQuery("#span_email").hide(); + jQuery("#edit_email").show(); + jQuery("#emailval").show(); + }); + jQuery("#cancel_upload").click(function(){ + + jQuery("#span_upload").hide(); + jQuery("#keyval").show(); + jQuery("#dl_file").show(); + jQuery("#upload_file").show(); + }); + }); + +// alert box for the "Generate new Key Pair button" +function myFunction() +{ +alert("You have requested to generate new key pairs. Please download and save the new keypairs after receiving the success message."); +} + +function emailAlert() +{ +alert("To edit email please contact the administratior. You will be redirected to the support page now"); +window.location.href = "/support"; +} + +function affAlert() +{ +alert("To edit affiliation please contact the administratior. You will be redirected to the support page now"); +window.location.href = "/support"; +} +/* + // alert having ok or cancel option +function show_confirm() +{ +var r=confirm("Press a button!"); +if (r==true) + { + alert("You pressed OK!"); + } +else + { + alert("You pressed Cancel!"); + } +} +*/ + + diff --git a/portal/static/my_account.profile.css b/portal/static/my_account.profile.css new file mode 100644 index 00000000..b6e1b208 --- /dev/null +++ b/portal/static/my_account.profile.css @@ -0,0 +1,173 @@ + + +/****************************** +* STYLE FOR PROFILE PAGE +*******************************/ + +h1 { + font-size: 1.8em; + border-bottom: 1px solid #bbb; + width: 70%; + min-width: 688px; +} + +#info { + background-color : #ded; + border : 1px solid #0a0; + padding : 1em; + margin-bottom : 1em; +} + +#error_msg { + background-color : #f2dbdb; + border : 1px solid red; + padding : 1em; + margin-bottom : 1em; +} + +ul.errorlist li { + font-size: 12pt; + padding: 0px; +} + +/* ADDED July 27, 2012 to fix the table collapsing on itself when the browser is below a certain size */ +table.profile { + border-collapse: collapse; + border-spacing: 0; + width: 70%; + min-width: 703px; +} + +table.profile tr td.key { + text-align: right; + height: 30px; + font-size: 16px; + font-weight: bold; + width: 160px; +} + +table.profile tr td.value { + padding-left: 20px; + min-width: 500px; /* ADDED July 27, 2012 */ +} + +table.profile button { + width: 80px; + vertical-align: middle; + float: right; + margin-right: 15px; +} + +table.profile span.hide_this{ + display: inline; + display: none; +} + +table.profile form{ + display:inline; +} + +#download { + float: right; + border: 2px solid #666; + background-color: #fff; + padding: 10px; + margin-right: 0px; + text-align: center; + font-weight: bold; +} + +#download a img { + display: block; + width: 150px; +} + +#download a { + color: black; +} + +#download_pubkey_form { + display : inline; +} +/* ADDED(everything below) Aug 14, 2012 */ +#generate_api { + width: 175px; +} + +#change_key form { + display: inline; + width: 688px; +} + +#generate_keypair { + position:relative; + width: 175px; + float: right; + margin-right: 15px; + +} +#edit_password table { + display:inline; + margin: auto; + border-collapse: collapse; + border-spacing: 0; + padding-left: 5px; + width: 100%; +} + +#edit_password td.field { + padding-left: 5px; + +} + +.wide_button { + width: 175px; +} + +.api_cell { + color:red; +} + +.api_cell:hover { + text-decoration: underline; +} + +img.help { + position: relative; + float: left; + left: 162px; + display: none; + /* when a negative margin is applied to right or bottom + it allows the element to overlap + */ + margin-bottom: -50px; +} + +#id_email { + width: 200px; +} + +#aff_list { + width: 200px; +} +#name { + width: 200px; +} + +/*Added Sept 2012 to fix long api keys creating a new line*/ +#api_key { + color: red; + font-family: courier; +} + +#up_arrow { + height: 36px; + width: 36px; + float: right; + position: relative; + margin-right: 132px; + /*when a negative margin is applied to right or bottom + it allows the element to overlap + */ + margin-bottom:-50px; +} diff --git a/portal/static/my_account.register.js b/portal/static/my_account.register.js new file mode 100644 index 00000000..bb7fba49 --- /dev/null +++ b/portal/static/my_account.register.js @@ -0,0 +1,56 @@ +/* +# Jquery for password matching and Affiliation list + +Authors: + Mohammed Yasin Rahman +Copyright 2013, UPMC Sorbonne Universités / LIP6 + +*/ +jQuery(document).ready(function(){ + + jQuery("#commentForm").validate({ + rules: { + password: { + required: true + }, + confirmpassword: { + required: true, equalTo: "#password" + } + } + }); + // upload button + jQuery("#question").change(function(){ + if(this.value=="upload"){ + jQuery("#upload_key").show(); + }else{ + jQuery("#upload_key").hide(); + } + }); + +}); + +jQuery(function() { + var availableTags = [ + "iMinds", + "IT Innovation", + "UPMC", + "Fraunhofer", + "TUB", + "UEDIN", + "INRIA", + "NICTA", + "ATOS", + "UTH", + "NTUA", + "UNIVBRIS", + "i2CAT", + "EUR", + "DANTE Limited", + "UC", + "NIA" + ]; + jQuery( "#aff_list" ).autocomplete({ + source: availableTags + }); + }); + diff --git a/portal/static/ques_icon.png b/portal/static/ques_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4113c1216504fd87f383305037ea92b04551d1af GIT binary patch literal 102623 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 literal 0 HcmV?d00001 diff --git a/portal/templates/my_account.html b/portal/templates/my_account.html index 634f2c5c..72d69b6d 100644 --- a/portal/templates/my_account.html +++ b/portal/templates/my_account.html @@ -1,11 +1,11 @@ {% extends "layout-unfold1.html" %} {% block head %} - - - - - + + + + + {% endblock %} {% block unfold1_main %} @@ -31,7 +31,7 @@ Email {{ person.email }} - + @@ -81,7 +81,7 @@ Affiliation UPMC - + diff --git a/third-party/jquery/js/jquery.validate.js b/third-party/jquery/js/jquery.validate.js new file mode 100644 index 00000000..51eb2ef5 --- /dev/null +++ b/third-party/jquery/js/jquery.validate.js @@ -0,0 +1,1222 @@ +/** + * jQuery Validation Plugin 1.11.0pre + * + * http://bassistance.de/jquery-plugins/jquery-plugin-validation/ + * http://docs.jquery.com/Plugins/Validation + * + * Copyright 2013 Jörn Zaefferer + * Released under the MIT license: + * http://www.opensource.org/licenses/mit-license.php + */ + +(function($) { + +$.extend($.fn, { + // http://docs.jquery.com/Plugins/Validation/validate + validate: function( options ) { + + // if nothing is selected, return nothing; can't chain anyway + if ( !this.length ) { + if ( options && options.debug && window.console ) { + console.warn( "Nothing selected, can't validate, returning nothing." ); + } + return; + } + + // check if a validator for this form was already created + var validator = $.data( this[0], "validator" ); + if ( validator ) { + return validator; + } + + // Add novalidate tag if HTML5. + this.attr( "novalidate", "novalidate" ); + + validator = new $.validator( options, this[0] ); + $.data( this[0], "validator", validator ); + + if ( validator.settings.onsubmit ) { + + this.validateDelegate( ":submit", "click", function( event ) { + if ( validator.settings.submitHandler ) { + validator.submitButton = event.target; + } + // allow suppressing validation by adding a cancel class to the submit button + if ( $(event.target).hasClass("cancel") ) { + validator.cancelSubmit = true; + } + }); + + // validate the form on submit + this.submit( function( event ) { + if ( validator.settings.debug ) { + // prevent form submit to be able to see console output + event.preventDefault(); + } + function handle() { + var hidden; + if ( validator.settings.submitHandler ) { + if ( validator.submitButton ) { + // insert a hidden input as a replacement for the missing submit button + hidden = $("").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm); + } + validator.settings.submitHandler.call( validator, validator.currentForm, event ); + if ( validator.submitButton ) { + // and clean up afterwards; thanks to no-block-scope, hidden can be referenced + hidden.remove(); + } + return false; + } + return true; + } + + // prevent submit for invalid forms or custom submit handlers + if ( validator.cancelSubmit ) { + validator.cancelSubmit = false; + return handle(); + } + if ( validator.form() ) { + if ( validator.pendingRequest ) { + validator.formSubmitted = true; + return false; + } + return handle(); + } else { + validator.focusInvalid(); + return false; + } + }); + } + + return validator; + }, + // http://docs.jquery.com/Plugins/Validation/valid + valid: function() { + if ( $(this[0]).is("form")) { + return this.validate().form(); + } else { + var valid = true; + var validator = $(this[0].form).validate(); + this.each(function() { + valid &= validator.element(this); + }); + return valid; + } + }, + // attributes: space seperated list of attributes to retrieve and remove + removeAttrs: function( attributes ) { + var result = {}, + $element = this; + $.each(attributes.split(/\s/), function( index, value ) { + result[value] = $element.attr(value); + $element.removeAttr(value); + }); + return result; + }, + // http://docs.jquery.com/Plugins/Validation/rules + rules: function( command, argument ) { + var element = this[0]; + + if ( command ) { + var settings = $.data(element.form, "validator").settings; + var staticRules = settings.rules; + var existingRules = $.validator.staticRules(element); + switch(command) { + case "add": + $.extend(existingRules, $.validator.normalizeRule(argument)); + staticRules[element.name] = existingRules; + if ( argument.messages ) { + settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages ); + } + break; + case "remove": + if ( !argument ) { + delete staticRules[element.name]; + return existingRules; + } + var filtered = {}; + $.each(argument.split(/\s/), function( index, method ) { + filtered[method] = existingRules[method]; + delete existingRules[method]; + }); + return filtered; + } + } + + var data = $.validator.normalizeRules( + $.extend( + {}, + $.validator.classRules(element), + $.validator.attributeRules(element), + $.validator.dataRules(element), + $.validator.staticRules(element) + ), element); + + // make sure required is at front + if ( data.required ) { + var param = data.required; + delete data.required; + data = $.extend({required: param}, data); + } + + return data; + } +}); + +// Custom selectors +$.extend($.expr[":"], { + // http://docs.jquery.com/Plugins/Validation/blank + blank: function( a ) { return !$.trim("" + a.value); }, + // http://docs.jquery.com/Plugins/Validation/filled + filled: function( a ) { return !!$.trim("" + a.value); }, + // http://docs.jquery.com/Plugins/Validation/unchecked + unchecked: function( a ) { return !a.checked; } +}); + +// constructor for validator +$.validator = function( options, form ) { + this.settings = $.extend( true, {}, $.validator.defaults, options ); + this.currentForm = form; + this.init(); +}; + +$.validator.format = function( source, params ) { + if ( arguments.length === 1 ) { + return function() { + var args = $.makeArray(arguments); + args.unshift(source); + return $.validator.format.apply( this, args ); + }; + } + if ( arguments.length > 2 && params.constructor !== Array ) { + params = $.makeArray(arguments).slice(1); + } + if ( params.constructor !== Array ) { + params = [ params ]; + } + $.each(params, function( i, n ) { + source = source.replace( new RegExp("\\{" + i + "\\}", "g"), function() { + return n; + }); + }); + return source; +}; + +$.extend($.validator, { + + defaults: { + messages: {}, + groups: {}, + rules: {}, + errorClass: "error", + validClass: "valid", + errorElement: "label", + focusInvalid: true, + errorContainer: $([]), + errorLabelContainer: $([]), + onsubmit: true, + ignore: ":hidden", + ignoreTitle: false, + onfocusin: function( element, event ) { + this.lastActive = element; + + // hide error label and remove error class on focus if enabled + if ( this.settings.focusCleanup && !this.blockFocusCleanup ) { + if ( this.settings.unhighlight ) { + this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass ); + } + this.addWrapper(this.errorsFor(element)).hide(); + } + }, + onfocusout: function( element, event ) { + if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) { + this.element(element); + } + }, + onkeyup: function( element, event ) { + if ( event.which === 9 && this.elementValue(element) === "" ) { + return; + } else if ( element.name in this.submitted || element === this.lastElement ) { + this.element(element); + } + }, + onclick: function( element, event ) { + // click on selects, radiobuttons and checkboxes + if ( element.name in this.submitted ) { + this.element(element); + } + // or option elements, check parent select in that case + else if ( element.parentNode.name in this.submitted ) { + this.element(element.parentNode); + } + }, + highlight: function( element, errorClass, validClass ) { + if ( element.type === "radio" ) { + this.findByName(element.name).addClass(errorClass).removeClass(validClass); + } else { + $(element).addClass(errorClass).removeClass(validClass); + } + }, + unhighlight: function( element, errorClass, validClass ) { + if ( element.type === "radio" ) { + this.findByName(element.name).removeClass(errorClass).addClass(validClass); + } else { + $(element).removeClass(errorClass).addClass(validClass); + } + } + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults + setDefaults: function( settings ) { + $.extend( $.validator.defaults, settings ); + }, + + messages: { + required: "This field is required.", + remote: "Please fix this field.", + email: "Please enter a valid email address.", + url: "Please enter a valid URL.", + date: "Please enter a valid date.", + dateISO: "Please enter a valid date (ISO).", + number: "Please enter a valid number.", + digits: "Please enter only digits.", + creditcard: "Please enter a valid credit card number.", + equalTo: "Please enter the same value again.", + maxlength: $.validator.format("Please enter no more than {0} characters."), + minlength: $.validator.format("Please enter at least {0} characters."), + rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."), + range: $.validator.format("Please enter a value between {0} and {1}."), + max: $.validator.format("Please enter a value less than or equal to {0}."), + min: $.validator.format("Please enter a value greater than or equal to {0}.") + }, + + autoCreateRanges: false, + + prototype: { + + init: function() { + this.labelContainer = $(this.settings.errorLabelContainer); + this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm); + this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer ); + this.submitted = {}; + this.valueCache = {}; + this.pendingRequest = 0; + this.pending = {}; + this.invalid = {}; + this.reset(); + + var groups = (this.groups = {}); + $.each(this.settings.groups, function( key, value ) { + if ( typeof value === "string" ) { + value = value.split(/\s/); + } + $.each(value, function( index, name ) { + groups[name] = key; + }); + }); + var rules = this.settings.rules; + $.each(rules, function( key, value ) { + rules[key] = $.validator.normalizeRule(value); + }); + + function delegate(event) { + var validator = $.data(this[0].form, "validator"), + eventType = "on" + event.type.replace(/^validate/, ""); + if ( validator.settings[eventType] ) { + validator.settings[eventType].call(validator, this[0], event); + } + } + $(this.currentForm) + .validateDelegate(":text, [type='password'], [type='file'], select, textarea, " + + "[type='number'], [type='search'] ,[type='tel'], [type='url'], " + + "[type='email'], [type='datetime'], [type='date'], [type='month'], " + + "[type='week'], [type='time'], [type='datetime-local'], " + + "[type='range'], [type='color'] ", + "focusin focusout keyup", delegate) + .validateDelegate("[type='radio'], [type='checkbox'], select, option", "click", delegate); + + if ( this.settings.invalidHandler ) { + $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler); + } + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/form + form: function() { + this.checkForm(); + $.extend(this.submitted, this.errorMap); + this.invalid = $.extend({}, this.errorMap); + if ( !this.valid() ) { + $(this.currentForm).triggerHandler("invalid-form", [this]); + } + this.showErrors(); + return this.valid(); + }, + + checkForm: function() { + this.prepareForm(); + for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { + this.check( elements[i] ); + } + return this.valid(); + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/element + element: function( element ) { + element = this.validationTargetFor( this.clean( element ) ); + this.lastElement = element; + this.prepareElement( element ); + this.currentElements = $(element); + var result = this.check( element ) !== false; + if ( result ) { + delete this.invalid[element.name]; + } else { + this.invalid[element.name] = true; + } + if ( !this.numberOfInvalids() ) { + // Hide error containers on last error + this.toHide = this.toHide.add( this.containers ); + } + this.showErrors(); + return result; + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/showErrors + showErrors: function( errors ) { + if ( errors ) { + // add items to error list and map + $.extend( this.errorMap, errors ); + this.errorList = []; + for ( var name in errors ) { + this.errorList.push({ + message: errors[name], + element: this.findByName(name)[0] + }); + } + // remove items from success list + this.successList = $.grep( this.successList, function( element ) { + return !(element.name in errors); + }); + } + if ( this.settings.showErrors ) { + this.settings.showErrors.call( this, this.errorMap, this.errorList ); + } else { + this.defaultShowErrors(); + } + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/resetForm + resetForm: function() { + if ( $.fn.resetForm ) { + $(this.currentForm).resetForm(); + } + this.submitted = {}; + this.lastElement = null; + this.prepareForm(); + this.hideErrors(); + this.elements().removeClass( this.settings.errorClass ).removeData( "previousValue" ); + }, + + numberOfInvalids: function() { + return this.objectLength(this.invalid); + }, + + objectLength: function( obj ) { + var count = 0; + for ( var i in obj ) { + count++; + } + return count; + }, + + hideErrors: function() { + this.addWrapper( this.toHide ).hide(); + }, + + valid: function() { + return this.size() === 0; + }, + + size: function() { + return this.errorList.length; + }, + + focusInvalid: function() { + if ( this.settings.focusInvalid ) { + try { + $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []) + .filter(":visible") + .focus() + // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find + .trigger("focusin"); + } catch(e) { + // ignore IE throwing errors when focusing hidden elements + } + } + }, + + findLastActive: function() { + var lastActive = this.lastActive; + return lastActive && $.grep(this.errorList, function( n ) { + return n.element.name === lastActive.name; + }).length === 1 && lastActive; + }, + + elements: function() { + var validator = this, + rulesCache = {}; + + // select all valid inputs inside the form (no submit or reset buttons) + return $(this.currentForm) + .find("input, select, textarea") + .not(":submit, :reset, :image, [disabled]") + .not( this.settings.ignore ) + .filter(function() { + if ( !this.name ) { + if ( window.console ) { + console.error( "%o has no name assigned", this ); + } + throw new Error( "Failed to validate, found an element with no name assigned. See console for element reference." ); + } + + // select only the first element for each name, and only those with rules specified + if ( this.name in rulesCache || !validator.objectLength($(this).rules()) ) { + return false; + } + + rulesCache[this.name] = true; + return true; + }); + }, + + clean: function( selector ) { + return $(selector)[0]; + }, + + errors: function() { + var errorClass = this.settings.errorClass.replace(" ", "."); + return $(this.settings.errorElement + "." + errorClass, this.errorContext); + }, + + reset: function() { + this.successList = []; + this.errorList = []; + this.errorMap = {}; + this.toShow = $([]); + this.toHide = $([]); + this.currentElements = $([]); + }, + + prepareForm: function() { + this.reset(); + this.toHide = this.errors().add( this.containers ); + }, + + prepareElement: function( element ) { + this.reset(); + this.toHide = this.errorsFor(element); + }, + + elementValue: function( element ) { + var type = $(element).attr("type"), + val = $(element).val(); + + if ( type === "radio" || type === "checkbox" ) { + return $("input[name='" + $(element).attr("name") + "']:checked").val(); + } + + if ( typeof val === "string" ) { + return val.replace(/\r/g, ""); + } + return val; + }, + + check: function( element ) { + element = this.validationTargetFor( this.clean( element ) ); + + var rules = $(element).rules(); + var dependencyMismatch = false; + var val = this.elementValue(element); + var result; + + for (var method in rules ) { + var rule = { method: method, parameters: rules[method] }; + try { + + result = $.validator.methods[method].call( this, val, element, rule.parameters ); + + // if a method indicates that the field is optional and therefore valid, + // don't mark it as valid when there are no other rules + if ( result === "dependency-mismatch" ) { + dependencyMismatch = true; + continue; + } + dependencyMismatch = false; + + if ( result === "pending" ) { + this.toHide = this.toHide.not( this.errorsFor(element) ); + return; + } + + if ( !result ) { + this.formatAndAdd( element, rule ); + return false; + } + } catch(e) { + if ( this.settings.debug && window.console ) { + console.log( "Exception occured when checking element " + element.id + ", check the '" + rule.method + "' method.", e ); + } + throw e; + } + } + if ( dependencyMismatch ) { + return; + } + if ( this.objectLength(rules) ) { + this.successList.push(element); + } + return true; + }, + + // return the custom message for the given element and validation method + // specified in the element's HTML5 data attribute + customDataMessage: function( element, method ) { + return $(element).data("msg-" + method.toLowerCase()) || (element.attributes && $(element).attr("data-msg-" + method.toLowerCase())); + }, + + // return the custom message for the given element name and validation method + customMessage: function( name, method ) { + var m = this.settings.messages[name]; + return m && (m.constructor === String ? m : m[method]); + }, + + // return the first defined argument, allowing empty strings + findDefined: function() { + for(var i = 0; i < arguments.length; i++) { + if ( arguments[i] !== undefined ) { + return arguments[i]; + } + } + return undefined; + }, + + defaultMessage: function( element, method ) { + return this.findDefined( + this.customMessage( element.name, method ), + this.customDataMessage( element, method ), + // title is never undefined, so handle empty string as undefined + !this.settings.ignoreTitle && element.title || undefined, + $.validator.messages[method], + "Warning: No message defined for " + element.name + "" + ); + }, + + formatAndAdd: function( element, rule ) { + var message = this.defaultMessage( element, rule.method ), + theregex = /\$?\{(\d+)\}/g; + if ( typeof message === "function" ) { + message = message.call(this, rule.parameters, element); + } else if (theregex.test(message)) { + message = $.validator.format(message.replace(theregex, "{$1}"), rule.parameters); + } + this.errorList.push({ + message: message, + element: element + }); + + this.errorMap[element.name] = message; + this.submitted[element.name] = message; + }, + + addWrapper: function( toToggle ) { + if ( this.settings.wrapper ) { + toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) ); + } + return toToggle; + }, + + defaultShowErrors: function() { + var i, elements; + for ( i = 0; this.errorList[i]; i++ ) { + var error = this.errorList[i]; + if ( this.settings.highlight ) { + this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass ); + } + this.showLabel( error.element, error.message ); + } + if ( this.errorList.length ) { + this.toShow = this.toShow.add( this.containers ); + } + if ( this.settings.success ) { + for ( i = 0; this.successList[i]; i++ ) { + this.showLabel( this.successList[i] ); + } + } + if ( this.settings.unhighlight ) { + for ( i = 0, elements = this.validElements(); elements[i]; i++ ) { + this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass ); + } + } + this.toHide = this.toHide.not( this.toShow ); + this.hideErrors(); + this.addWrapper( this.toShow ).show(); + }, + + validElements: function() { + return this.currentElements.not(this.invalidElements()); + }, + + invalidElements: function() { + return $(this.errorList).map(function() { + return this.element; + }); + }, + + showLabel: function( element, message ) { + var label = this.errorsFor( element ); + if ( label.length ) { + // refresh error/success class + label.removeClass( this.settings.validClass ).addClass( this.settings.errorClass ); + + // check if we have a generated label, replace the message then + if ( label.attr("generated") ) { + label.html(message); + } + } else { + // create label + label = $("<" + this.settings.errorElement + "/>") + .attr({"for": this.idOrName(element), generated: true}) + .addClass(this.settings.errorClass) + .html(message || ""); + if ( this.settings.wrapper ) { + // make sure the element is visible, even in IE + // actually showing the wrapped element is handled elsewhere + label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent(); + } + if ( !this.labelContainer.append(label).length ) { + if ( this.settings.errorPlacement ) { + this.settings.errorPlacement(label, $(element) ); + } else { + label.insertAfter(element); + } + } + } + if ( !message && this.settings.success ) { + label.text(""); + if ( typeof this.settings.success === "string" ) { + label.addClass( this.settings.success ); + } else { + this.settings.success( label, element ); + } + } + this.toShow = this.toShow.add(label); + }, + + errorsFor: function( element ) { + var name = this.idOrName(element); + return this.errors().filter(function() { + return $(this).attr("for") === name; + }); + }, + + idOrName: function( element ) { + return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name); + }, + + validationTargetFor: function( element ) { + // if radio/checkbox, validate first element in group instead + if ( this.checkable(element) ) { + element = this.findByName( element.name ).not(this.settings.ignore)[0]; + } + return element; + }, + + checkable: function( element ) { + return (/radio|checkbox/i).test(element.type); + }, + + findByName: function( name ) { + return $(this.currentForm).find("[name='" + name + "']"); + }, + + getLength: function( value, element ) { + switch( element.nodeName.toLowerCase() ) { + case "select": + return $("option:selected", element).length; + case "input": + if ( this.checkable( element) ) { + return this.findByName(element.name).filter(":checked").length; + } + } + return value.length; + }, + + depend: function( param, element ) { + return this.dependTypes[typeof param] ? this.dependTypes[typeof param](param, element) : true; + }, + + dependTypes: { + "boolean": function( param, element ) { + return param; + }, + "string": function( param, element ) { + return !!$(param, element.form).length; + }, + "function": function( param, element ) { + return param(element); + } + }, + + optional: function( element ) { + var val = this.elementValue(element); + return !$.validator.methods.required.call(this, val, element) && "dependency-mismatch"; + }, + + startRequest: function( element ) { + if ( !this.pending[element.name] ) { + this.pendingRequest++; + this.pending[element.name] = true; + } + }, + + stopRequest: function( element, valid ) { + this.pendingRequest--; + // sometimes synchronization fails, make sure pendingRequest is never < 0 + if ( this.pendingRequest < 0 ) { + this.pendingRequest = 0; + } + delete this.pending[element.name]; + if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) { + $(this.currentForm).submit(); + this.formSubmitted = false; + } else if (!valid && this.pendingRequest === 0 && this.formSubmitted) { + $(this.currentForm).triggerHandler("invalid-form", [this]); + this.formSubmitted = false; + } + }, + + previousValue: function( element ) { + return $.data(element, "previousValue") || $.data(element, "previousValue", { + old: null, + valid: true, + message: this.defaultMessage( element, "remote" ) + }); + } + + }, + + classRuleSettings: { + required: {required: true}, + email: {email: true}, + url: {url: true}, + date: {date: true}, + dateISO: {dateISO: true}, + number: {number: true}, + digits: {digits: true}, + creditcard: {creditcard: true} + }, + + addClassRules: function( className, rules ) { + if ( className.constructor === String ) { + this.classRuleSettings[className] = rules; + } else { + $.extend(this.classRuleSettings, className); + } + }, + + classRules: function( element ) { + var rules = {}; + var classes = $(element).attr("class"); + if ( classes ) { + $.each(classes.split(" "), function() { + if ( this in $.validator.classRuleSettings ) { + $.extend(rules, $.validator.classRuleSettings[this]); + } + }); + } + return rules; + }, + + attributeRules: function( element ) { + var rules = {}; + var $element = $(element); + + for (var method in $.validator.methods) { + var value; + + // support for in both html5 and older browsers + if ( method === "required" ) { + value = $element.get(0).getAttribute(method); + // Some browsers return an empty string for the required attribute + // and non-HTML5 browsers might have required="" markup + if ( value === "" ) { + value = true; + } + // force non-HTML5 browsers to return bool + value = !!value; + } else { + value = $element.attr(method); + } + + if ( value ) { + rules[method] = value; + } else if ( $element[0].getAttribute("type") === method ) { + rules[method] = true; + } + } + + // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs + if ( rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength) ) { + delete rules.maxlength; + } + + return rules; + }, + + dataRules: function( element ) { + var method, value, + rules = {}, $element = $(element); + for (method in $.validator.methods) { + value = $element.data("rule-" + method.toLowerCase()); + if ( value !== undefined ) { + rules[method] = value; + } + } + return rules; + }, + + staticRules: function( element ) { + var rules = {}; + var validator = $.data(element.form, "validator"); + if ( validator.settings.rules ) { + rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {}; + } + return rules; + }, + + normalizeRules: function( rules, element ) { + // handle dependency check + $.each(rules, function( prop, val ) { + // ignore rule when param is explicitly false, eg. required:false + if ( val === false ) { + delete rules[prop]; + return; + } + if ( val.param || val.depends ) { + var keepRule = true; + switch (typeof val.depends) { + case "string": + keepRule = !!$(val.depends, element.form).length; + break; + case "function": + keepRule = val.depends.call(element, element); + break; + } + if ( keepRule ) { + rules[prop] = val.param !== undefined ? val.param : true; + } else { + delete rules[prop]; + } + } + }); + + // evaluate parameters + $.each(rules, function( rule, parameter ) { + rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter; + }); + + // clean number parameters + $.each(["minlength", "maxlength", "min", "max"], function() { + if ( rules[this] ) { + rules[this] = Number(rules[this]); + } + }); + $.each(["rangelength", "range"], function() { + var parts; + if ( rules[this] ) { + if ( $.isArray(rules[this]) ) { + rules[this] = [Number(rules[this][0]), Number(rules[this][1])]; + } else if ( typeof rules[this] === "string" ) { + parts = rules[this].split(/[\s,]+/); + rules[this] = [Number(parts[0]), Number(parts[1])]; + } + } + }); + + if ( $.validator.autoCreateRanges ) { + // auto-create ranges + if ( rules.min && rules.max ) { + rules.range = [rules.min, rules.max]; + delete rules.min; + delete rules.max; + } + if ( rules.minlength && rules.maxlength ) { + rules.rangelength = [rules.minlength, rules.maxlength]; + delete rules.minlength; + delete rules.maxlength; + } + } + + return rules; + }, + + // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true} + normalizeRule: function( data ) { + if ( typeof data === "string" ) { + var transformed = {}; + $.each(data.split(/\s/), function() { + transformed[this] = true; + }); + data = transformed; + } + return data; + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/addMethod + addMethod: function( name, method, message ) { + $.validator.methods[name] = method; + $.validator.messages[name] = message !== undefined ? message : $.validator.messages[name]; + if ( method.length < 3 ) { + $.validator.addClassRules(name, $.validator.normalizeRule(name)); + } + }, + + methods: { + + // http://docs.jquery.com/Plugins/Validation/Methods/required + required: function( value, element, param ) { + // check if dependency is met + if ( !this.depend(param, element) ) { + return "dependency-mismatch"; + } + if ( element.nodeName.toLowerCase() === "select" ) { + // could be an array for select-multiple or a string, both are fine this way + var val = $(element).val(); + return val && val.length > 0; + } + if ( this.checkable(element) ) { + return this.getLength(value, element) > 0; + } + return $.trim(value).length > 0; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/remote + remote: function( value, element, param ) { + if ( this.optional(element) ) { + return "dependency-mismatch"; + } + + var previous = this.previousValue(element); + if (!this.settings.messages[element.name] ) { + this.settings.messages[element.name] = {}; + } + previous.originalMessage = this.settings.messages[element.name].remote; + this.settings.messages[element.name].remote = previous.message; + + param = typeof param === "string" && {url:param} || param; + + if ( previous.old === value ) { + return previous.valid; + } + + previous.old = value; + var validator = this; + this.startRequest(element); + var data = {}; + data[element.name] = value; + $.ajax($.extend(true, { + url: param, + mode: "abort", + port: "validate" + element.name, + dataType: "json", + data: data, + success: function( response ) { + validator.settings.messages[element.name].remote = previous.originalMessage; + var valid = response === true || response === "true"; + if ( valid ) { + var submitted = validator.formSubmitted; + validator.prepareElement(element); + validator.formSubmitted = submitted; + validator.successList.push(element); + delete validator.invalid[element.name]; + validator.showErrors(); + } else { + var errors = {}; + var message = response || validator.defaultMessage( element, "remote" ); + errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message; + validator.invalid[element.name] = true; + validator.showErrors(errors); + } + previous.valid = valid; + validator.stopRequest(element, valid); + } + }, param)); + return "pending"; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/minlength + minlength: function( value, element, param ) { + var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); + return this.optional(element) || length >= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/maxlength + maxlength: function( value, element, param ) { + var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); + return this.optional(element) || length <= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/rangelength + rangelength: function( value, element, param ) { + var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); + return this.optional(element) || ( length >= param[0] && length <= param[1] ); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/min + min: function( value, element, param ) { + return this.optional(element) || value >= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/max + max: function( value, element, param ) { + return this.optional(element) || value <= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/range + range: function( value, element, param ) { + return this.optional(element) || ( value >= param[0] && value <= param[1] ); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/email + email: function( value, element ) { + // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/ + return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/url + url: function( value, element ) { + // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/ + return this.optional(element) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/date + date: function( value, element ) { + return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString()); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/dateISO + dateISO: function( value, element ) { + return this.optional(element) || /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/number + number: function( value, element ) { + return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/digits + digits: function( value, element ) { + return this.optional(element) || /^\d+$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/creditcard + // based on http://en.wikipedia.org/wiki/Luhn + creditcard: function( value, element ) { + if ( this.optional(element) ) { + return "dependency-mismatch"; + } + // accept only spaces, digits and dashes + if ( /[^0-9 \-]+/.test(value) ) { + return false; + } + var nCheck = 0, + nDigit = 0, + bEven = false; + + value = value.replace(/\D/g, ""); + + for (var n = value.length - 1; n >= 0; n--) { + var cDigit = value.charAt(n); + nDigit = parseInt(cDigit, 10); + if ( bEven ) { + if ( (nDigit *= 2) > 9 ) { + nDigit -= 9; + } + } + nCheck += nDigit; + bEven = !bEven; + } + + return (nCheck % 10) === 0; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/equalTo + equalTo: function( value, element, param ) { + // bind to the blur event of the target in order to revalidate whenever the target field is updated + // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead + var target = $(param); + if ( this.settings.onfocusout ) { + target.unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { + $(element).valid(); + }); + } + return value === target.val(); + } + + } + +}); + +// deprecated, use $.validator.format instead +$.format = $.validator.format; + +}(jQuery)); + +// ajax mode: abort +// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); +// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() +(function($) { + var pendingRequests = {}; + // Use a prefilter if available (1.5+) + if ( $.ajaxPrefilter ) { + $.ajaxPrefilter(function( settings, _, xhr ) { + var port = settings.port; + if ( settings.mode === "abort" ) { + if ( pendingRequests[port] ) { + pendingRequests[port].abort(); + } + pendingRequests[port] = xhr; + } + }); + } else { + // Proxy ajax + var ajax = $.ajax; + $.ajax = function( settings ) { + var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode, + port = ( "port" in settings ? settings : $.ajaxSettings ).port; + if ( mode === "abort" ) { + if ( pendingRequests[port] ) { + pendingRequests[port].abort(); + } + return (pendingRequests[port] = ajax.apply(this, arguments)); + } + return ajax.apply(this, arguments); + }; + } +}(jQuery)); + +// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation +// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target +(function($) { + $.extend($.fn, { + validateDelegate: function( delegate, type, handler ) { + return this.bind(type, function( event ) { + var target = $(event.target); + if ( target.is(delegate) ) { + return handler.apply(target, arguments); + } + }); + } + }); +}(jQuery)); + + -- 2.43.0