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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 M*#Ei<10m}8Kjh?wwEzGB 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.51.1