diff --git a/js/config.js b/js/config.js new file mode 100644 index 000000000..4f19e4a1d --- /dev/null +++ b/js/config.js @@ -0,0 +1,574 @@ +/** + * Functions used in configuration forms + */ + +// default values for fields +var defaultValues = {}; + +// language strings +var PMA_messages = {}; + +/** + * Returns field type + * + * @param {Element} field + */ +function getFieldType(field) { + field = $(field); + var tagName = field.attr('tagName'); + if (tagName == 'INPUT') { + return field.attr('type'); + } else if (tagName == 'SELECT') { + return 'select'; + } else if (tagName == 'TEXTAREA') { + return 'text'; + } + return ''; +} + +/** + * Sets field value + * + * value must be of type: + * o undefined (omitted) - restore default value (form default, not PMA default) + * o String - if field_type is 'text' + * o boolean - if field_type is 'checkbox' + * o Array of values - if field_type is 'select' + * + * @param {Element} field + * @param {String} field_type see {@link #getFieldType} + * @param {String|Boolean} [value] + */ +function setFieldValue(field, field_type, value) { + field = $(field); + switch (field_type) { + case 'text': + field.attr('value', (value != undefined ? value : field.attr('defaultValue'))); + break; + case 'checkbox': + field.attr('checked', (value != undefined ? value : field.attr('defaultChecked'))); + break; + case 'select': + var options = field.attr('options'); + var i, imax = options.length; + if (value == undefined) { + for (i = 0; i < imax; i++) { + options[i].selected = options[i].defaultSelected; + } + } else { + for (i = 0; i < imax; i++) { + options[i].selected = (value.indexOf(options[i].value) != -1); + } + } + break; + } + markField(field); +} + +/** + * Gets field value + * + * Will return one of: + * o String - if type is 'text' + * o boolean - if type is 'checkbox' + * o Array of values - if type is 'select' + * + * @param {Element} field + * @param {String} field_type returned by {@link #getFieldType} + * @type Boolean|String|String[] + */ +function getFieldValue(field, field_type) { + field = $(field); + switch (field_type) { + case 'text': + return field.attr('value'); + case 'checkbox': + return field.attr('checked'); + case 'select': + var options = field.attr('options'); + var i, imax = options.length, items = []; + for (i = 0; i < imax; i++) { + if (options[i].selected) { + items.push(options[i].value); + } + } + return items; + } +} + +/** + * Returns values for all fields in fieldsets + */ +function getAllValues() { + var elements = $('fieldset input, fieldset select, fieldset textarea'); + var values = {}; + var type, value; + for (var i = 0; i < elements.length; i++) { + type = getFieldType(elements[i]); + value = getFieldValue(elements[i], type); + if (typeof value != 'undefined') { + // we only have single selects, fatten array + if (type == 'select') { + value = value[0]; + } + values[elements[i].name] = value; + } + } + return values; +} + +/** + * Checks whether field has its default value + * + * @param {Element} field + * @param {String} type + * @return boolean + */ +function checkFieldDefault(field, type) { + field = $(field); + var field_id = field.attr('id'); + if (typeof defaultValues[field_id] == 'undefined') { + return true; + } + var isDefault = true; + var currentValue = getFieldValue(field, type); + if (type != 'select') { + isDefault = currentValue == defaultValues[field_id]; + } else { + // compare arrays, will work for our representation of select values + if (currentValue.length != defaultValues[field_id].length) { + isDefault = false; + } + else { + for (var i = 0; i < currentValue.length; i++) { + if (currentValue[i] != defaultValues[field_id][i]) { + isDefault = false; + break; + } + } + } + } + return isDefault; +} + +/** + * Returns element's id prefix + * @param {Element} element + */ +function getIdPrefix(element) { + return $(element).attr('id').replace(/[^-]+$/, ''); +} + +// ------------------------------------------------------------------ +// Form validation and field operations +// + +// form validator assignments +var validate = {}; + +// form validator list +var validators = { + // regexp: numeric value + _regexp_numeric: new RegExp('^[0-9]*$'), + /** + * Validates positive number + * + * @param {boolean} isKeyUp + */ + validate_positive_number: function (isKeyUp) { + var result = this.value != '0' && validators._regexp_numeric.test(this.value); + return result ? true : PMA_messages['error_nan_p']; + }, + /** + * Validates non-negative number + * + * @param {boolean} isKeyUp + */ + validate_non_negative_number: function (isKeyUp) { + var result = validators._regexp_numeric.test(this.value); + return result ? true : PMA_messages['error_nan_nneg']; + }, + /** + * Validates port number + * + * @param {boolean} isKeyUp + */ + validate_port_number: function(isKeyUp) { + var result = validators._regexp_numeric.test(this.value) && this.value != '0'; + if (!result || this.value > 65536) { + result = PMA_messages['error_incorrect_port']; + } + return result; + }, + // field validators + _field: { + }, + // fieldset validators + _fieldset: { + } +}; + +/** + * Registers validator for given field + * + * @param {String} id field id + * @param {String} type validator (key in validators object) + * @param {boolean} onKeyUp whether fire on key up + * @param {object} params validation function parameters + */ +function validateField(id, type, onKeyUp, params) { + if (typeof validators[type] == 'undefined') { + return; + } + if (typeof validate[id] == 'undefined') { + validate[id] = []; + } + validate[id].push([type, params, onKeyUp]); +} + +/** + * Returns valdiation functions associated with form field + * + * @param {String} field_id form field id + * @param {boolean} onKeyUpOnly see validateField + * @type Array + * @return array of [function, paramseters to be passed to function] + */ +function getFieldValidators(field_id, onKeyUpOnly) { + // look for field bound validator + var name = field_id.match(/[^-]+$/)[0]; + if (typeof validators._field[name] != 'undefined') { + return [[validators._field[name], null]]; + } + + // look for registered validators + var functions = []; + if (typeof validate[field_id] != 'undefined') { + // validate[field_id]: array of [type, params, onKeyUp] + for (var i = 0, imax = validate[field_id].length; i < imax; i++) { + if (onKeyUpOnly && !validate[field_id][i][2]) { + continue; + } + functions.push([validators[validate[field_id][i][0]], validate[field_id][i][1]]); + } + } + + return functions; +} + +/** + * Displays errors for given form fields + * + * WARNING: created DOM elements must be identical with the ones made by + * display_input() in FormDisplay.tpl.php! + * + * @param {Object} error_list list of errors in the form {field id: error array} + */ +function displayErrors(error_list) { + for (var field_id in error_list) { + var errors = error_list[field_id]; + var field = $('#'+field_id); + var isFieldset = field.attr('tagName') == 'FIELDSET'; + var errorCnt = isFieldset + ? field.find('dl.errors') + : field.siblings('.inline_errors'); + + // remove empty errors (used to clear error list) + errors = $.grep(errors, function(item) { + return item != ''; + }); + + if (errors.length) { + // if error container doesn't exist, create it + if (errorCnt.length == 0) { + if (isFieldset) { + errorCnt = $('
'); + field.find('table').before(errorCnt); + } else { + errorCnt = $('
'); + field.closest('td').append(errorCnt); + } + } + + var html = ''; + for (var i = 0, imax = errors.length; i < imax; i++) { + html += '
' + errors[i] + '
'; + } + errorCnt.html(html); + } else if (errorCnt !== null) { + // remove useless error container + errorCnt.remove(); + } + } +} + +/** + * Validates fieldset and puts errors in 'errors' object + * + * @param {Element} fieldset + * @param {boolean} isKeyUp + * @param {Object} errors + */ +function validate_fieldset(fieldset, isKeyUp, errors) { + fieldset = $(fieldset); + if (fieldset.length && typeof validators._fieldset[fieldset.attr('id')] != 'undefined') { + var fieldset_errors = validators._fieldset[fieldset.attr('id')].apply(fieldset[0], [isKeyUp]); + for (var field_id in fieldset_errors) { + if (typeof errors[field_id] == 'undefined') { + errors[field_id] = []; + } + if (typeof fieldset_errors[field_id] == 'string') { + fieldset_errors[field_id] = [fieldset_errors[field_id]]; + } + $.merge(errors[field_id], fieldset_errors[field_id]); + } + } +} + +/** + * Validates form field and puts errors in 'errors' object + * + * @param {Element} field + * @param {boolean} isKeyUp + * @param {Object} errors + */ +function validate_field(field, isKeyUp, errors) { + field = $(field); + var field_id = field.attr('id'); + errors[field_id] = []; + var functions = getFieldValidators(field_id, isKeyUp); + for (var i = 0; i < functions.length; i++) { + var result = functions[i][0].apply(field[0], [isKeyUp, functions[i][1]]); + if (result !== true) { + if (typeof result == 'string') { + result = [result]; + } + $.merge(errors[field_id], result); + } + } +} + +/** + * Validates form field and parent fieldset + * + * @param {Element} field + * @param {boolean} isKeyUp + */ +function validate_field_and_fieldset(field, isKeyUp) { + field = $(field); + var errors = {}; + validate_field(field, isKeyUp, errors); + validate_fieldset(field.closest('fieldset'), isKeyUp, errors); + displayErrors(errors); +} + +/** + * Marks field depending on its value (system default or custom) + * + * @param {Element} field + */ +function markField(field) { + field = $(field); + var type = getFieldType(field); + var isDefault = checkFieldDefault(field, type); + + // checkboxes uses parent for marking + var fieldMarker = (type == 'checkbox') ? field.parent() : field; + setRestoreDefaultBtn(field, !isDefault); + fieldMarker[isDefault ? 'removeClass' : 'addClass']('custom'); +} + +/** + * Enables or disables the "restore default value" button + * + * @param {Element} field + * @param {boolean} display + */ +function setRestoreDefaultBtn(field, display) { + var el = $(field).closest('td').find('.restore-default'); + el.css('display', (el.css('display') ? '' : 'none')); +} + +$(function() { + // register validators and mark custom values + var elements = $('input[id], select[id], textarea[id]'); + $('input[id], select[id], textarea[id]').each(function(){ + markField(this); + var el = $(this); + el.bind('change', function() { + validate_field_and_fieldset(this, false); + markField(this); + }); + var tagName = el.attr('tagName'); + // text fields can be validated after each change + if (tagName == 'INPUT' && el.attr('type') == 'text') { + el.keyup(function() { + validate_field_and_fieldset(el, true); + markField(el); + }); + } + // disable textarea spellcheck + if (tagName == 'TEXTAREA') { + el.attr('spellcheck', false); + } + }); + + // check whether we've refreshed a page and browser remembered modified + // form values + var check_page_refresh = $('#check_page_refresh'); + if (check_page_refresh.length == 0 || check_page_refresh.val() == '1') { + // run all field validators + var errors = {}; + for (var i = 0; i < elements.length; i++) { + validate_field(elements[i], false, errors); + } + // run all fieldset validators + $('fieldset').each(function(){ + validate_fieldset(this, false, errors); + }); + + displayErrors(errors); + } else if (check_page_refresh) { + check_page_refresh.val('1'); + } +}); + +// +// END: Form validation and field operations +// ------------------------------------------------------------------ + +// ------------------------------------------------------------------ +// Tabbed forms +// + +/** + * Sets active tab + * + * @param {Element} tab_link + */ +function setTab(tab_link) { + var tabs_menu = $(tab_link).closest('.tabs'); + + var links = tabs_menu.find('a'); + var contents, link; + for (var i = 0, imax = links.length; i < imax; i++) { + link = $(links[i]); + contents = $(link.attr('href')); + if (links[i] == tab_link) { + link.addClass('active'); + contents.css('display', 'block'); + } else { + link.removeClass('active'); + contents.css('display', 'none'); + } + } + location.hash = 'tab_' + $(tab_link).attr('href').substr(1); +} + +$(function() { + var tabs = $('.tabs'); + var url_tab = location.hash.match(/^#tab_.+/) + ? $('a[href$="' + location.hash.substr(5) + '"]') : null; + if (url_tab) { + url_tab = url_tab[0]; + } + // add tabs events and activate one tab (the first one or indicated by location hash) + for (var i = 0, imax = tabs.length; i < imax; i++) { + var links = $(tabs[i]).find('a'); + var selected_tab = links[0]; + for (var j = 0, jmax = links.length; j < jmax; j++) { + $(links[j]).click(function(e) { + e.preventDefault(); + setTab(this); + }); + if (links[j] == url_tab) { + selected_tab = links[j]; + } + } + setTab(selected_tab); + } + // tab links handling, check each 200ms + // (works with history in FF, further browser support here would be an overkill) + var prev_hash = location.hash; + setInterval(function() { + if (location.hash != prev_hash) { + prev_hash = location.hash; + var url_tab = location.hash.match(/^#tab_.+/) + ? $('a[href$="' + location.hash.substr(5) + '"]') : null; + if (url_tab) { + setTab(url_tab[0]); + } + } + }, 200); +}); + +// +// END: Tabbed forms +// ------------------------------------------------------------------ + +// ------------------------------------------------------------------ +// Form reset buttons +// + +$(function() { + $('input[type=button]').click(function() { + var fields = $(this).closest('fieldset').find('input, select, textarea'); + for (var i = 0, imax = fields.length; i < imax; i++) { + setFieldValue(fields[i], getFieldType(fields[i])); + } + }); +}); + +// +// END: Form reset buttons +// ------------------------------------------------------------------ + +// ------------------------------------------------------------------ +// "Restore default" and "set value" buttons +// + +/** + * Restores field's default value + * + * @param {String} field_id + */ +function restoreField(field_id) { + var field = $('#'+field_id); + if (field.length == 0 || defaultValues[field_id] == undefined) { + return; + } + setFieldValue(field, getFieldType(field), defaultValues[field_id]); +} + +$(function() { + $('.restore-default, .set-value').each(function() { + var link = $(this); + link.css('opacity', 0.25); + if (!link.hasClass('restore-default')) { + // restore-default is handled by markField + link.css('display', ''); + } + link.bind({ + mouseenter: function() {$(this).css('opacity', 1);}, + mouseleave: function() {$(this).css('opacity', 0.25);}, + click: function(e) { + e.preventDefault(); + var href = $(this).attr('href').substr(1); + var field_id; + if ($(this).hasClass('restore-default')) { + field_id = href; + restoreField(field_id); + } else { + field_id = href.match(/^[^=]+/)[0]; + var value = href.match(/=(.+)$/)[1]; + setFieldValue($('#'+field_id), 'text', value); + } + $('#'+field_id).trigger('change'); + } + }); + }); +}); + +// +// END: "Restore default" and "set value" buttons +// ------------------------------------------------------------------ diff --git a/setup/index.php b/setup/index.php index 0d16e5f06..d5db95c67 100644 --- a/setup/index.php +++ b/setup/index.php @@ -37,6 +37,7 @@ require './libraries/header_http.inc.php'; + diff --git a/setup/scripts.js b/setup/scripts.js index e6ab823b7..4763ff081 100644 --- a/setup/scripts.js +++ b/setup/scripts.js @@ -1,5 +1,5 @@ /** - * Functions used in configuration forms + * Functions used in Setup configuration forms */ // show this window in top frame @@ -7,163 +7,6 @@ if (top != self) { window.top.location.href = location; } -// default values for fields -var defaultValues = {}; - -// language strings -var PMA_messages = {}; - -/** - * Returns field type - * - * @param {Element} field - */ -function getFieldType(field) { - field = $(field); - var tagName = field.attr('tagName'); - if (tagName == 'INPUT') { - return field.attr('type'); - } else if (tagName == 'SELECT') { - return 'select'; - } else if (tagName == 'TEXTAREA') { - return 'text'; - } - return ''; -} - -/** - * Sets field value - * - * value must be of type: - * o undefined (omitted) - restore default value (form default, not PMA default) - * o String - if field_type is 'text' - * o boolean - if field_type is 'checkbox' - * o Array of values - if field_type is 'select' - * - * @param {Element} field - * @param {String} field_type see {@link #getFieldType} - * @param {String|Boolean} [value] - */ -function setFieldValue(field, field_type, value) { - field = $(field); - switch (field_type) { - case 'text': - field.attr('value', (value != undefined ? value : field.attr('defaultValue'))); - break; - case 'checkbox': - field.attr('checked', (value != undefined ? value : field.attr('defaultChecked'))); - break; - case 'select': - var options = field.attr('options'); - var i, imax = options.length; - if (value == undefined) { - for (i = 0; i < imax; i++) { - options[i].selected = options[i].defaultSelected; - } - } else { - for (i = 0; i < imax; i++) { - options[i].selected = (value.indexOf(options[i].value) != -1); - } - } - break; - } - markField(field); -} - -/** - * Gets field value - * - * Will return one of: - * o String - if type is 'text' - * o boolean - if type is 'checkbox' - * o Array of values - if type is 'select' - * - * @param {Element} field - * @param {String} field_type returned by {@link #getFieldType} - * @type Boolean|String|String[] - */ -function getFieldValue(field, field_type) { - field = $(field); - switch (field_type) { - case 'text': - return field.attr('value'); - case 'checkbox': - return field.attr('checked'); - case 'select': - var options = field.attr('options'); - var i, imax = options.length, items = []; - for (i = 0; i < imax; i++) { - if (options[i].selected) { - items.push(options[i].value); - } - } - return items; - } -} - -/** - * Returns values for all fields in fieldsets - */ -function getAllValues() { - var elements = $('fieldset input, fieldset select, fieldset textarea'); - var values = {}; - var type, value; - for (var i = 0; i < elements.length; i++) { - type = getFieldType(elements[i]); - value = getFieldValue(elements[i], type); - if (typeof value != 'undefined') { - // we only have single selects, fatten array - if (type == 'select') { - value = value[0]; - } - values[elements[i].name] = value; - } - } - return values; -} - -/** - * Checks whether field has its default value - * - * @param {Element} field - * @param {String} type - * @return boolean - */ -function checkFieldDefault(field, type) { - field = $(field); - var field_id = field.attr('id'); - if (typeof defaultValues[field_id] == 'undefined') { - return true; - } - var isDefault = true; - var currentValue = getFieldValue(field, type); - if (type != 'select') { - isDefault = currentValue == defaultValues[field_id]; - } else { - // compare arrays, will work for our representation of select values - if (currentValue.length != defaultValues[field_id].length) { - isDefault = false; - } - else { - for (var i = 0; i < currentValue.length; i++) { - if (currentValue[i] != defaultValues[field_id][i]) { - isDefault = false; - break; - } - } - } - } - return isDefault; -} - -/** - * Returns element's id prefix - * @param {Element} element - */ -function getIdPrefix(element) { - return $(element).attr('id').replace(/[^-]+$/, ''); -} - // ------------------------------------------------------------------ // Messages // @@ -198,43 +41,7 @@ $(function() { // Form validation and field operations // -// form validator assignments -var validate = {}; - -// form validator list -var validators = { - // regexp: numeric value - _regexp_numeric: new RegExp('^[0-9]*$'), - /** - * Validates positive number - * - * @param {boolean} isKeyUp - */ - validate_positive_number: function (isKeyUp) { - var result = this.value != '0' && validators._regexp_numeric.test(this.value); - return result ? true : PMA_messages['error_nan_p']; - }, - /** - * Validates non-negative number - * - * @param {boolean} isKeyUp - */ - validate_non_negative_number: function (isKeyUp) { - var result = validators._regexp_numeric.test(this.value); - return result ? true : PMA_messages['error_nan_nneg']; - }, - /** - * Validates port number - * - * @param {boolean} isKeyUp - */ - validate_port_number: function(isKeyUp) { - var result = validators._regexp_numeric.test(this.value) && this.value != '0'; - if (!result || this.value > 65536) { - result = PMA_messages['error_incorrect_port']; - } - return result; - }, +$.extend(true, validators, { // field validators _field: { /** @@ -304,7 +111,7 @@ var validators = { return true; } } -}; +}); /** * Calls server-side validation procedures @@ -322,7 +129,7 @@ function ajaxValidate(parent, id, values) { return false; } } - + if (parent.data('ajax') != null) { parent.data('ajax').abort(); } @@ -361,368 +168,3 @@ function ajaxValidate(parent, id, values) { return true; } - -/** - * Registers validator for given field - * - * @param {String} id field id - * @param {String} type validator (key in validators object) - * @param {boolean} onKeyUp whether fire on key up - * @param {object} params validation function parameters - */ -function validateField(id, type, onKeyUp, params) { - if (typeof validators[type] == 'undefined') { - return; - } - if (typeof validate[id] == 'undefined') { - validate[id] = []; - } - validate[id].push([type, params, onKeyUp]); -} - -/** - * Returns valdiation functions associated with form field - * - * @param {String} field_id form field id - * @param {boolean} onKeyUpOnly see validateField - * @type Array - * @return array of [function, paramseters to be passed to function] - */ -function getFieldValidators(field_id, onKeyUpOnly) { - // look for field bound validator - var name = field_id.match(/[^-]+$/)[0]; - if (typeof validators._field[name] != 'undefined') { - return [[validators._field[name], null]]; - } - - // look for registered validators - var functions = []; - if (typeof validate[field_id] != 'undefined') { - // validate[field_id]: array of [type, params, onKeyUp] - for (var i = 0, imax = validate[field_id].length; i < imax; i++) { - if (onKeyUpOnly && !validate[field_id][i][2]) { - continue; - } - functions.push([validators[validate[field_id][i][0]], validate[field_id][i][1]]); - } - } - - return functions; -} - -/** - * Displays errors for given form fields - * - * WARNING: created DOM elements must be identical with the ones made by - * display_input() in FormDisplay.tpl.php! - * - * @param {Object} error_list list of errors in the form {field id: error array} - */ -function displayErrors(error_list) { - for (var field_id in error_list) { - var errors = error_list[field_id]; - var field = $('#'+field_id); - var isFieldset = field.attr('tagName') == 'FIELDSET'; - var errorCnt = isFieldset - ? field.find('dl.errors') - : field.siblings('.inline_errors'); - - // remove empty errors (used to clear error list) - errors = $.grep(errors, function(item) { - return item != ''; - }); - - if (errors.length) { - // if error container doesn't exist, create it - if (errorCnt.length == 0) { - if (isFieldset) { - errorCnt = $('
'); - field.find('table').before(errorCnt); - } else { - errorCnt = $('
'); - field.closest('td').append(errorCnt); - } - } - - var html = ''; - for (var i = 0, imax = errors.length; i < imax; i++) { - html += '
' + errors[i] + '
'; - } - errorCnt.html(html); - } else if (errorCnt !== null) { - // remove useless error container - errorCnt.remove(); - } - } -} - -/** - * Validates fieldset and puts errors in 'errors' object - * - * @param {Element} fieldset - * @param {boolean} isKeyUp - * @param {Object} errors - */ -function validate_fieldset(fieldset, isKeyUp, errors) { - fieldset = $(fieldset); - if (fieldset.length && typeof validators._fieldset[fieldset.attr('id')] != 'undefined') { - var fieldset_errors = validators._fieldset[fieldset.attr('id')].apply(fieldset[0], [isKeyUp]); - for (field_id in fieldset_errors) { - if (typeof errors[field_id] == 'undefined') { - errors[field_id] = []; - } - if (typeof fieldset_errors[field_id] == 'string') { - fieldset_errors[field_id] = [fieldset_errors[field_id]]; - } - $.merge(errors[field_id], fieldset_errors[field_id]); - } - } -} - -/** - * Validates form field and puts errors in 'errors' object - * - * @param {Element} field - * @param {boolean} isKeyUp - * @param {Object} errors - */ -function validate_field(field, isKeyUp, errors) { - field = $(field); - var field_id = field.attr('id'); - errors[field_id] = []; - var functions = getFieldValidators(field_id, isKeyUp); - for (var i = 0; i < functions.length; i++) { - var result = functions[i][0].apply(field[0], [isKeyUp, functions[i][1]]); - if (result !== true) { - if (typeof result == 'string') { - result = [result]; - } - $.merge(errors[field_id], result); - } - } -} - -/** - * Validates form field and parent fieldset - * - * @param {Element} field - * @param {boolean} isKeyUp - */ -function validate_field_and_fieldset(field, isKeyUp) { - field = $(field); - var errors = {}; - validate_field(field, isKeyUp, errors); - validate_fieldset(field.closest('fieldset'), isKeyUp, errors); - displayErrors(errors); -} - -/** - * Marks field depending on its value (system default or custom) - * - * @param {Element} field - */ -function markField(field) { - field = $(field); - var type = getFieldType(field); - var isDefault = checkFieldDefault(field, type); - - // checkboxes uses parent for marking - var fieldMarker = (type == 'checkbox') ? field.parent() : field; - setRestoreDefaultBtn(field, !isDefault); - fieldMarker[isDefault ? 'removeClass' : 'addClass']('custom'); -} - -/** - * Enables or disables the "restore default value" button - * - * @param {Element} field - * @param {boolean} display - */ -function setRestoreDefaultBtn(field, display) { - var el = $(field).closest('td').find('.restore-default'); - el.css('display', (el.css('display') ? '' : 'none')); -} - -$(function() { - // register validators and mark custom values - var elements = $('input[id], select[id], textarea[id]'); - $('input[id], select[id], textarea[id]').each(function(){ - markField(this); - var el = $(this); - el.bind('change', function() { - validate_field_and_fieldset(this, false); - markField(this); - }); - var tagName = el.attr('tagName'); - // text fields can be validated after each change - if (tagName == 'INPUT' && el.attr('type') == 'text') { - el.keyup(function() { - validate_field_and_fieldset(el, true); - markField(el); - }); - } - // disable textarea spellcheck - if (tagName == 'TEXTAREA') { - el.attr('spellcheck', false); - } - }); - - // check whether we've refreshed a page and browser remembered modified - // form values - var check_page_refresh = $('#check_page_refresh'); - if (check_page_refresh.length == 0 || check_page_refresh.val() == '1') { - // run all field validators - var errors = {}; - for (var i = 0; i < elements.length; i++) { - validate_field(elements[i], false, errors); - } - // run all fieldset validators - $('fieldset').each(function(){ - validate_fieldset(this, false, errors); - }); - - displayErrors(errors); - } else if (check_page_refresh) { - check_page_refresh.val('1'); - } -}); - -// -// END: Form validation and field operations -// ------------------------------------------------------------------ - -// ------------------------------------------------------------------ -// Tabbed forms -// - -/** - * Sets active tab - * - * @param {Element} tab_link - */ -function setTab(tab_link) { - var tabs_menu = $(tab_link).closest('.tabs'); - - var links = tabs_menu.find('a'); - var contents, link; - for (var i = 0, imax = links.length; i < imax; i++) { - link = $(links[i]); - contents = $(link.attr('href')); - if (links[i] == tab_link) { - link.addClass('active'); - contents.css('display', 'block'); - } else { - link.removeClass('active'); - contents.css('display', 'none'); - } - } - location.hash = 'tab_' + $(tab_link).attr('href').substr(1); -} - -$(function() { - var tabs = $('.tabs'); - var url_tab = location.hash.match(/^#tab_.+/) - ? $('a[href$="' + location.hash.substr(5) + '"]') : null; - if (url_tab) { - url_tab = url_tab[0]; - } - // add tabs events and activate one tab (the first one or indicated by location hash) - for (var i = 0, imax = tabs.length; i < imax; i++) { - var links = $(tabs[i]).find('a'); - var selected_tab = links[0]; - for (var j = 0, jmax = links.length; j < jmax; j++) { - $(links[j]).click(function(e) { - e.preventDefault(); - setTab(this); - }); - if (links[j] == url_tab) { - selected_tab = links[j]; - } - } - setTab(selected_tab); - } - // tab links handling, check each 200ms - // (works with history in FF, further browser support here would be an overkill) - var prev_hash = location.hash; - setInterval(function() { - if (location.hash != prev_hash) { - prev_hash = location.hash; - var url_tab = location.hash.match(/^#tab_.+/) - ? $('a[href$="' + location.hash.substr(5) + '"]') : null; - if (url_tab) { - setTab(url_tab[0]); - } - } - }, 200); -}); - -// -// END: Tabbed forms -// ------------------------------------------------------------------ - -// ------------------------------------------------------------------ -// Form reset buttons -// - -$(function() { - $('input[type=button]').click(function() { - var fields = $(this).closest('fieldset').find('input, select, textarea'); - for (var i = 0, imax = fields.length; i < imax; i++) { - setFieldValue(fields[i], getFieldType(fields[i])); - } - }); -}); - -// -// END: Form reset buttons -// ------------------------------------------------------------------ - -// ------------------------------------------------------------------ -// "Restore default" and "set value" buttons -// - -/** - * Restores field's default value - * - * @param {String} field_id - */ -function restoreField(field_id) { - var field = $('#'+field_id); - if (field.length == 0 || defaultValues[field_id] == undefined) { - return; - } - setFieldValue(field, getFieldType(field), defaultValues[field_id]); -} - -$(function() { - $('.restore-default, .set-value').each(function() { - var link = $(this); - link.css('opacity', 0.25); - if (!link.hasClass('restore-default')) { - // restore-default is handled by markField - link.css('display', ''); - } - link.bind({ - mouseenter: function() {$(this).css('opacity', 1);}, - mouseleave: function() {$(this).css('opacity', 0.25);}, - click: function(e) { - e.preventDefault(); - var href = $(this).attr('href').substr(1); - var field_id; - if ($(this).hasClass('restore-default')) { - field_id = href; - restoreField(field_id); - } else { - field_id = href.match(/^[^=]+/)[0]; - var value = href.match(/=(.+)$/)[1]; - setFieldValue($('#'+field_id), 'text', value); - } - $('#'+field_id).trigger('change'); - } - }); - }); -}); - -// -// END: "Restore default" and "set value" buttons -// ------------------------------------------------------------------ diff --git a/user_preferences.php b/user_preferences.php index daac4d9fd..613bafc9b 100644 --- a/user_preferences.php +++ b/user_preferences.php @@ -17,7 +17,7 @@ require_once './libraries/config/ConfigFile.class.php'; require_once './libraries/config/Form.class.php'; require_once './libraries/config/FormDisplay.class.php'; -$GLOBALS['js_include'][] = 'js/settings_forms.js'; +$GLOBALS['js_include'][] = 'js/config.js'; require_once './libraries/header.inc.php';