summaryrefslogtreecommitdiffstats
path: root/dev/jquery.jtable.forms.js
diff options
context:
space:
mode:
authorHalil İbrahim Kalkan <hikalkan@gmail.com>2013-02-10 13:05:16 +0200
committerHalil İbrahim Kalkan <hikalkan@gmail.com>2013-02-10 13:05:16 +0200
commit277c6e18d910accfe145f0b3cacb27aef437d1ac (patch)
tree1c6ebdcabb29eebacabac485b234fcabaeec14d8 /dev/jquery.jtable.forms.js
parent82df9fff9f0a1ea9b4bc8a91d4481b74f391a36f (diff)
downloadjtable-277c6e18d910accfe145f0b3cacb27aef437d1ac.zip
jtable-277c6e18d910accfe145f0b3cacb27aef437d1ac.tar.gz
jtable-277c6e18d910accfe145f0b3cacb27aef437d1ac.tar.bz2
jTable v.2.2.0v2.2.0
Feature: Toolbar. [#188] Feature: 'Change page size' combobox. [#1, #128] Feature: 'Go to page' input. [#63] Feature: Multiple sorting of columns by holding CTRL key. [#48] Added options: multiSorting, gotoPageArea, pageSizes, pageSizeChangeArea, pageList and toolbar. Hungarian and Italian localizations [#179] Fixed some issues. [#209]
Diffstat (limited to 'dev/jquery.jtable.forms.js')
-rw-r--r--dev/jquery.jtable.forms.js943
1 files changed, 483 insertions, 460 deletions
diff --git a/dev/jquery.jtable.forms.js b/dev/jquery.jtable.forms.js
index 7cca500..840eec4 100644
--- a/dev/jquery.jtable.forms.js
+++ b/dev/jquery.jtable.forms.js
@@ -1,460 +1,483 @@
-/************************************************************************
-* FORMS extension for jTable (base for edit/create forms) *
-*************************************************************************/
-(function ($) {
-
- $.extend(true, $.hik.jtable.prototype, {
-
- /************************************************************************
- * PRIVATE METHODS *
- *************************************************************************/
-
- /* Submits a form asynchronously using AJAX.
- * This method is needed, since form submitting logic can be overrided
- * by extensions.
- *************************************************************************/
- _submitFormUsingAjax: function (url, formData, success, error) {
- this._ajax({
- url: url,
- data: formData,
- success: success,
- error: error
- });
- },
-
- /* Creates label for an input element.
- *************************************************************************/
- _createInputLabelForRecordField: function (fieldName) {
- //TODO: May create label tag instead of a div.
- return $('<div />')
- .addClass('jtable-input-label')
- .html(this.options.fields[fieldName].title);
- },
-
- /* Creates an input element according to field type.
- *************************************************************************/
- _createInputForRecordField: function (funcParams) {
- var fieldName = funcParams.fieldName,
- value = funcParams.value,
- record = funcParams.record,
- formType = funcParams.formType,
- form = funcParams.form;
-
- //Get the field
- var field = this.options.fields[fieldName];
-
- //If value if not supplied, use defaultValue of the field
- if (value == undefined || value == null) {
- value = field.defaultValue;
- }
-
- //Use custom function if supplied
- if (field.input) {
- var $input = $(field.input({
- value: value,
- record: record,
- formType: formType,
- form: form
- }));
-
- //Add id attribute if does not exists
- if (!$input.attr('id')) {
- $input.attr('id', 'Edit-' + fieldName);
- }
-
- //Wrap input element with div
- return $('<div />')
- .addClass('jtable-input jtable-custom-input')
- .append($input);
- }
-
- //Create input according to field type
- if (field.type == 'date') {
- return this._createDateInputForField(field, fieldName, value);
- } else if (field.type == 'textarea') {
- return this._createTextAreaForField(field, fieldName, value);
- } else if (field.type == 'password') {
- return this._createPasswordInputForField(field, fieldName, value);
- } else if (field.type == 'checkbox') {
- return this._createCheckboxForField(field, fieldName, value);
- } else if (field.options) {
- if (field.type == 'radiobutton') {
- return this._createRadioButtonListForField(field, fieldName, value, record, formType);
- } else {
- return this._createDropDownListForField(field, fieldName, value, record, formType, form);
- }
- } else {
- return this._createTextInputForField(field, fieldName, value);
- }
- },
-
- //Creates a hidden input element with given name and value.
- _createInputForHidden: function (fieldName, value) {
- if (value == undefined || value == null) {
- value = "";
- }
-
- return $('<input type="hidden" value="' + value + '" name="' + fieldName + '" id="Edit-' + fieldName + '"></input>');
- },
-
- /* Creates a date input for a field.
- *************************************************************************/
- _createDateInputForField: function (field, fieldName, value) {
- var $input = $('<input class="' + field.inputClass + '" id="Edit-' + fieldName + '" type="text"' + (value != undefined ? 'value="' + value + '"' : '') + ' name="' + fieldName + '"></input>');
- var displayFormat = field.displayFormat || this.options.defaultDateFormat;
- $input.datepicker({ dateFormat: displayFormat });
- return $('<div />')
- .addClass('jtable-input jtable-date-input')
- .append($input);
- },
-
- /* Creates a textarea element for a field.
- *************************************************************************/
- _createTextAreaForField: function (field, fieldName, value) {
- var $textArea = $('<textarea class="' + field.inputClass + '" id="Edit-' + fieldName + '" name="' + fieldName + '">' + (value || '') + '</textarea>');
- return $('<div />')
- .addClass('jtable-input jtable-textarea-input')
- .append($textArea);
- },
-
- /* Creates a standart textbox for a field.
- *************************************************************************/
- _createTextInputForField: function (field, fieldName, value) {
- var $input = $('<input class="' + field.inputClass + '" id="Edit-' + fieldName + '" type="text"' + (value != undefined ? 'value="' + value + '"' : '') + ' name="' + fieldName + '"></input>');
- return $('<div />')
- .addClass('jtable-input jtable-text-input')
- .append($input);
- },
-
- /* Creates a password input for a field.
- *************************************************************************/
- _createPasswordInputForField: function (field, fieldName, value) {
- var $input = $('<input class="' + field.inputClass + '" id="Edit-' + fieldName + '" type="password"' + (value != undefined ? 'value="' + value + '"' : '') + ' name="' + fieldName + '"></input>');
- return $('<div />')
- .addClass('jtable-input jtable-password-input')
- .append($input);
- },
-
- /* Creates a checkboxfor a field.
- *************************************************************************/
- _createCheckboxForField: function (field, fieldName, value) {
- var self = this;
-
- //If value is undefined, get unchecked state's value
- if (value == undefined) {
- value = self._getCheckBoxPropertiesForFieldByState(fieldName, false).Value;
- }
-
- //Create a container div
- var $containerDiv = $('<div />')
- .addClass('jtable-input jtable-checkbox-input');
-
- //Create checkbox and check if needed
- var $checkBox = $('<input class="' + field.inputClass + '" id="Edit-' + fieldName + '" type="checkbox" name="' + fieldName + '" value="' + value + '" />')
- .appendTo($containerDiv);
-
- //Create display text of checkbox for current state
- var $textSpan = $('<span>' + (field.formText || self._getCheckBoxTextForFieldByValue(fieldName, value)) + '</span>')
- .appendTo($containerDiv);
-
- //Check the checkbox if it's value is checked-value
- if (self._getIsCheckBoxSelectedForFieldByValue(fieldName, value)) {
- $checkBox.attr('checked', 'checked');
- }
-
- //This method sets checkbox's value and text according to state of the checkbox
- var refreshCheckBoxValueAndText = function () {
- var checkboxProps = self._getCheckBoxPropertiesForFieldByState(fieldName, $checkBox.is(':checked'));
- $checkBox.attr('value', checkboxProps.Value);
- $textSpan.html(field.formText || checkboxProps.DisplayText);
- };
-
- //Register to click event to change display text when state of checkbox is changed.
- $checkBox.click(function () {
- refreshCheckBoxValueAndText();
- });
-
- //Change checkbox state when clicked to text
- if (field.setOnTextClick != false) {
- $textSpan
- .addClass('jtable-option-text-clickable')
- .click(function () {
- if ($checkBox.is(':checked')) {
- $checkBox.attr('checked', false);
- } else {
- $checkBox.attr('checked', true);
- }
-
- refreshCheckBoxValueAndText();
- });
- }
-
- return $containerDiv;
- },
-
- /* Creates a drop down list (combobox) input element for a field.
- *************************************************************************/
- _createDropDownListForField: function (field, fieldName, value, record, source, form) {
-
- //Create a container div
- var $containerDiv = $('<div />')
- .addClass('jtable-input jtable-dropdown-input');
-
- //Create select element
- var $select = $('<select class="' + field.inputClass + '" id="Edit-' + fieldName + '" name="' + fieldName + '"></select>')
- .appendTo($containerDiv);
-
- //add options
- var options = this._getOptionsForField(fieldName, {
- record: record,
- source: source,
- form: form,
- dependedValues: this._createDependedValuesUsingForm(form, field.dependsOn)
- });
-
- this._fillDropDownListWithOptions($select, options, value);
-
- return $containerDiv;
- },
-
- /* Fills a dropdown list with given options.
- *************************************************************************/
- _fillDropDownListWithOptions: function ($select, options, value) {
- $select.empty();
- for (var i = 0; i < options.length; i++) {
- $select.append('<option value="' + options[i].Value + '"' + (options[i].Value == value ? ' selected="selected"' : '') + '>' + options[i].DisplayText + '</option>');
- }
- },
-
- /* Creates depended values object from given form.
- *************************************************************************/
- _createDependedValuesUsingForm: function ($form, dependsOn) {
- if (!dependsOn) {
- return {};
- }
-
- var dependedValues = {};
-
- for (var i = 0; i < dependsOn.length; i++) {
- var dependedField = dependsOn[i];
-
- var $dependsOn = $form.find('select[name=' + dependedField + ']');
- if ($dependsOn.length <= 0) {
- continue;
- }
-
- dependedValues[dependedField] = $dependsOn.val();
- }
-
-
- return dependedValues;
- },
-
- /* Creates a radio button list for a field.
- *************************************************************************/
- _createRadioButtonListForField: function (field, fieldName, value, record, source) {
- var $containerDiv = $('<div />')
- .addClass('jtable-input jtable-radiobuttonlist-input');
-
- var options = this._getOptionsForField(fieldName, {
- record: record,
- source: source
- });
-
- $.each(options, function(i, option) {
- var $radioButtonDiv = $('<div class=""></div>')
- .addClass('jtable-radio-input')
- .appendTo($containerDiv);
-
- var $radioButton = $('<input type="radio" id="Edit-' + fieldName + '-' + i + '" class="' + field.inputClass + '" name="' + fieldName + '" value="' + option.Value + '"' + ((option.Value == (value + '')) ? ' checked="true"' : '') + ' />')
- .appendTo($radioButtonDiv);
-
- var $textSpan = $('<span></span>')
- .html(option.DisplayText)
- .appendTo($radioButtonDiv);
-
- if (field.setOnTextClick != false) {
- $textSpan
- .addClass('jtable-option-text-clickable')
- .click(function () {
- if (!$radioButton.is(':checked')) {
- $radioButton.attr('checked', true);
- }
- });
- }
- });
-
- return $containerDiv;
- },
-
- /* Gets display text for a checkbox field.
- *************************************************************************/
- _getCheckBoxTextForFieldByValue: function (fieldName, value) {
- return this.options.fields[fieldName].values[value];
- },
-
- /* Returns true if given field's value must be checked state.
- *************************************************************************/
- _getIsCheckBoxSelectedForFieldByValue: function (fieldName, value) {
- return (this._createCheckBoxStateArrayForFieldWithCaching(fieldName)[1].Value.toString() == value.toString());
- },
-
- /* Gets an object for a checkbox field that has Value and DisplayText
- * properties.
- *************************************************************************/
- _getCheckBoxPropertiesForFieldByState: function (fieldName, checked) {
- return this._createCheckBoxStateArrayForFieldWithCaching(fieldName)[(checked ? 1 : 0)];
- },
-
- /* Calls _createCheckBoxStateArrayForField with caching.
- *************************************************************************/
- _createCheckBoxStateArrayForFieldWithCaching: function (fieldName) {
- var cacheKey = 'checkbox_' + fieldName;
- if (!this._cache[cacheKey]) {
-
- this._cache[cacheKey] = this._createCheckBoxStateArrayForField(fieldName);
- }
-
- return this._cache[cacheKey];
- },
-
- /* Creates a two element array of objects for states of a checkbox field.
- * First element for unchecked state, second for checked state.
- * Each object has two properties: Value and DisplayText
- *************************************************************************/
- _createCheckBoxStateArrayForField: function (fieldName) {
- var stateArray = [];
- var currentIndex = 0;
- $.each(this.options.fields[fieldName].values, function (propName, propValue) {
- if (currentIndex++ < 2) {
- stateArray.push({ 'Value': propName, 'DisplayText': propValue });
- }
- });
-
- return stateArray;
- },
-
- /* Searches a form for dependend dropdowns and makes them cascaded.
- */
- _makeCascadeDropDowns: function ($form, record, source) {
- var self = this;
-
- $form.find('select') //for each combobox
- .each(function () {
- var $thisDropdown = $(this);
-
- //get field name
- var fieldName = $thisDropdown.attr('name');
- if (!fieldName) {
- return;
- }
-
- var field = self.options.fields[fieldName];
-
- //check if this combobox depends on others
- if (!field.dependsOn) {
- return;
- }
-
- //for each dependency
- $.each(field.dependsOn, function (index, dependsOnField) {
- //find the depended combobox
- var $dependsOnDropdown = $form.find('select[name=' + dependsOnField + ']');
- //when depended combobox changes
- $dependsOnDropdown.change(function () {
-
- //Refresh options
- var funcParams = {
- record: record,
- source: source,
- form: $form,
- dependedValues: {}
- };
- funcParams.dependedValues = self._createDependedValuesUsingForm($form, field.dependsOn);
- var options = self._getOptionsForField(fieldName, funcParams);
-
- //Fill combobox with new options
- self._fillDropDownListWithOptions($thisDropdown, options, undefined);
-
- //Thigger change event to refresh multi cascade dropdowns.
- $thisDropdown.change();
- });
- });
- });
- },
-
- /* Updates values of a record from given form
- *************************************************************************/
- _updateRecordValuesFromForm: function (record, $form) {
- for (var i = 0; i < this._fieldList.length; i++) {
- var fieldName = this._fieldList[i];
- var field = this.options.fields[fieldName];
-
- //Do not update non-editable fields
- if (field.edit == false) {
- continue;
- }
-
- //Get field name and the input element of this field in the form
- var $inputElement = $form.find('[name="' + fieldName + '"]');
- if ($inputElement.length <= 0) {
- continue;
- }
-
- //Update field in record according to it's type
- if (field.type == 'date') {
- var dateVal = $inputElement.val();
- if (dateVal) {
- var displayFormat = field.displayFormat || this.options.defaultDateFormat;
- try {
- var date = $.datepicker.parseDate(displayFormat, dateVal);
- record[fieldName] = '/Date(' + date.getTime() + ')/';
- } catch (e) {
- //TODO: Handle incorrect/different date formats
- this._logWarn('Date format is incorrect for field ' + fieldName + ': ' + dateVal);
- record[fieldName] = undefined;
- }
- } else {
- this._logDebug('Date is empty for ' + fieldName);
- record[fieldName] = undefined; //TODO: undefined, null or empty string?
- }
- } else if (field.options && field.type == 'radiobutton') {
- var $checkedElement = $inputElement.filter(':checked');
- if ($checkedElement.length) {
- record[fieldName] = $checkedElement.val();
- } else {
- record[fieldName] = undefined;
- }
- } else {
- record[fieldName] = $inputElement.val();
- }
- }
- },
-
- /* Sets enabled/disabled state of a dialog button.
- *************************************************************************/
- _setEnabledOfDialogButton: function ($button, enabled, buttonText) {
- if (!$button) {
- return;
- }
-
- if (enabled != false) {
- $button
- .removeAttr('disabled')
- .removeClass('ui-state-disabled');
- } else {
- $button
- .attr('disabled', 'disabled')
- .addClass('ui-state-disabled');
- }
-
- if (buttonText) {
- $button
- .find('span')
- .text(buttonText);
- }
- }
-
- });
-
-})(jQuery);
+/************************************************************************
+* FORMS extension for jTable (base for edit/create forms) *
+*************************************************************************/
+(function ($) {
+
+ $.extend(true, $.hik.jtable.prototype, {
+
+ /************************************************************************
+ * PRIVATE METHODS *
+ *************************************************************************/
+
+ /* Submits a form asynchronously using AJAX.
+ * This method is needed, since form submitting logic can be overrided
+ * by extensions.
+ *************************************************************************/
+ _submitFormUsingAjax: function (url, formData, success, error) {
+ this._ajax({
+ url: url,
+ data: formData,
+ success: success,
+ error: error
+ });
+ },
+
+ /* Creates label for an input element.
+ *************************************************************************/
+ _createInputLabelForRecordField: function (fieldName) {
+ //TODO: May create label tag instead of a div.
+ return $('<div />')
+ .addClass('jtable-input-label')
+ .html(this.options.fields[fieldName].title);
+ },
+
+ /* Creates an input element according to field type.
+ *************************************************************************/
+ _createInputForRecordField: function (funcParams) {
+ var fieldName = funcParams.fieldName,
+ value = funcParams.value,
+ record = funcParams.record,
+ formType = funcParams.formType,
+ form = funcParams.form;
+
+ //Get the field
+ var field = this.options.fields[fieldName];
+
+ //If value if not supplied, use defaultValue of the field
+ if (value == undefined || value == null) {
+ value = field.defaultValue;
+ }
+
+ //Use custom function if supplied
+ if (field.input) {
+ var $input = $(field.input({
+ value: value,
+ record: record,
+ formType: formType,
+ form: form
+ }));
+
+ //Add id attribute if does not exists
+ if (!$input.attr('id')) {
+ $input.attr('id', 'Edit-' + fieldName);
+ }
+
+ //Wrap input element with div
+ return $('<div />')
+ .addClass('jtable-input jtable-custom-input')
+ .append($input);
+ }
+
+ //Create input according to field type
+ if (field.type == 'date') {
+ return this._createDateInputForField(field, fieldName, value);
+ } else if (field.type == 'textarea') {
+ return this._createTextAreaForField(field, fieldName, value);
+ } else if (field.type == 'password') {
+ return this._createPasswordInputForField(field, fieldName, value);
+ } else if (field.type == 'checkbox') {
+ return this._createCheckboxForField(field, fieldName, value);
+ } else if (field.options) {
+ if (field.type == 'radiobutton') {
+ return this._createRadioButtonListForField(field, fieldName, value, record, formType);
+ } else {
+ return this._createDropDownListForField(field, fieldName, value, record, formType, form);
+ }
+ } else {
+ return this._createTextInputForField(field, fieldName, value);
+ }
+ },
+
+ //Creates a hidden input element with given name and value.
+ _createInputForHidden: function (fieldName, value) {
+ if (value == undefined) {
+ value = "";
+ }
+
+ return $('<input type="hidden" name="' + fieldName + '" id="Edit-' + fieldName + '"></input>')
+ .val(value);
+ },
+
+ /* Creates a date input for a field.
+ *************************************************************************/
+ _createDateInputForField: function (field, fieldName, value) {
+ var $input = $('<input class="' + field.inputClass + '" id="Edit-' + fieldName + '" type="text" name="' + fieldName + '"></input>');
+ if(value != undefined) {
+ $input.val(value);
+ }
+
+ var displayFormat = field.displayFormat || this.options.defaultDateFormat;
+ $input.datepicker({ dateFormat: displayFormat });
+ return $('<div />')
+ .addClass('jtable-input jtable-date-input')
+ .append($input);
+ },
+
+ /* Creates a textarea element for a field.
+ *************************************************************************/
+ _createTextAreaForField: function (field, fieldName, value) {
+ var $textArea = $('<textarea class="' + field.inputClass + '" id="Edit-' + fieldName + '" name="' + fieldName + '"></textarea>');
+ if (value != undefined) {
+ $textArea.val(value);
+ }
+
+ return $('<div />')
+ .addClass('jtable-input jtable-textarea-input')
+ .append($textArea);
+ },
+
+ /* Creates a standart textbox for a field.
+ *************************************************************************/
+ _createTextInputForField: function (field, fieldName, value) {
+ var $input = $('<input class="' + field.inputClass + '" id="Edit-' + fieldName + '" type="text" name="' + fieldName + '"></input>');
+ if (value != undefined) {
+ $input.val(value);
+ }
+
+ return $('<div />')
+ .addClass('jtable-input jtable-text-input')
+ .append($input);
+ },
+
+ /* Creates a password input for a field.
+ *************************************************************************/
+ _createPasswordInputForField: function (field, fieldName, value) {
+ var $input = $('<input class="' + field.inputClass + '" id="Edit-' + fieldName + '" type="password" name="' + fieldName + '"></input>');
+ if (value != undefined) {
+ $input.val(value);
+ }
+
+ return $('<div />')
+ .addClass('jtable-input jtable-password-input')
+ .append($input);
+ },
+
+ /* Creates a checkboxfor a field.
+ *************************************************************************/
+ _createCheckboxForField: function (field, fieldName, value) {
+ var self = this;
+
+ //If value is undefined, get unchecked state's value
+ if (value == undefined) {
+ value = self._getCheckBoxPropertiesForFieldByState(fieldName, false).Value;
+ }
+
+ //Create a container div
+ var $containerDiv = $('<div />')
+ .addClass('jtable-input jtable-checkbox-input');
+
+ //Create checkbox and check if needed
+ var $checkBox = $('<input class="' + field.inputClass + '" id="Edit-' + fieldName + '" type="checkbox" name="' + fieldName + '" />')
+ .appendTo($containerDiv);
+ if (value != undefined) {
+ $checkBox.val(value);
+ }
+
+ //Create display text of checkbox for current state
+ var $textSpan = $('<span>' + (field.formText || self._getCheckBoxTextForFieldByValue(fieldName, value)) + '</span>')
+ .appendTo($containerDiv);
+
+ //Check the checkbox if it's value is checked-value
+ if (self._getIsCheckBoxSelectedForFieldByValue(fieldName, value)) {
+ $checkBox.attr('checked', 'checked');
+ }
+
+ //This method sets checkbox's value and text according to state of the checkbox
+ var refreshCheckBoxValueAndText = function () {
+ var checkboxProps = self._getCheckBoxPropertiesForFieldByState(fieldName, $checkBox.is(':checked'));
+ $checkBox.attr('value', checkboxProps.Value);
+ $textSpan.html(field.formText || checkboxProps.DisplayText);
+ };
+
+ //Register to click event to change display text when state of checkbox is changed.
+ $checkBox.click(function () {
+ refreshCheckBoxValueAndText();
+ });
+
+ //Change checkbox state when clicked to text
+ if (field.setOnTextClick != false) {
+ $textSpan
+ .addClass('jtable-option-text-clickable')
+ .click(function () {
+ if ($checkBox.is(':checked')) {
+ $checkBox.attr('checked', false);
+ } else {
+ $checkBox.attr('checked', true);
+ }
+
+ refreshCheckBoxValueAndText();
+ });
+ }
+
+ return $containerDiv;
+ },
+
+ /* Creates a drop down list (combobox) input element for a field.
+ *************************************************************************/
+ _createDropDownListForField: function (field, fieldName, value, record, source, form) {
+
+ //Create a container div
+ var $containerDiv = $('<div />')
+ .addClass('jtable-input jtable-dropdown-input');
+
+ //Create select element
+ var $select = $('<select class="' + field.inputClass + '" id="Edit-' + fieldName + '" name="' + fieldName + '"></select>')
+ .appendTo($containerDiv);
+
+ //add options
+ var options = this._getOptionsForField(fieldName, {
+ record: record,
+ source: source,
+ form: form,
+ dependedValues: this._createDependedValuesUsingForm(form, field.dependsOn)
+ });
+
+ this._fillDropDownListWithOptions($select, options, value);
+
+ return $containerDiv;
+ },
+
+ /* Fills a dropdown list with given options.
+ *************************************************************************/
+ _fillDropDownListWithOptions: function ($select, options, value) {
+ $select.empty();
+ for (var i = 0; i < options.length; i++) {
+ $('<option' + (options[i].Value == value ? ' selected="selected"' : '') + '>' + options[i].DisplayText + '</option>')
+ .val(options[i].Value)
+ .appendTo($select);
+ }
+ },
+
+ /* Creates depended values object from given form.
+ *************************************************************************/
+ _createDependedValuesUsingForm: function ($form, dependsOn) {
+ if (!dependsOn) {
+ return {};
+ }
+
+ var dependedValues = {};
+
+ for (var i = 0; i < dependsOn.length; i++) {
+ var dependedField = dependsOn[i];
+
+ var $dependsOn = $form.find('select[name=' + dependedField + ']');
+ if ($dependsOn.length <= 0) {
+ continue;
+ }
+
+ dependedValues[dependedField] = $dependsOn.val();
+ }
+
+
+ return dependedValues;
+ },
+
+ /* Creates a radio button list for a field.
+ *************************************************************************/
+ _createRadioButtonListForField: function (field, fieldName, value, record, source) {
+ var $containerDiv = $('<div />')
+ .addClass('jtable-input jtable-radiobuttonlist-input');
+
+ var options = this._getOptionsForField(fieldName, {
+ record: record,
+ source: source
+ });
+
+ $.each(options, function(i, option) {
+ var $radioButtonDiv = $('<div class=""></div>')
+ .addClass('jtable-radio-input')
+ .appendTo($containerDiv);
+
+ var $radioButton = $('<input type="radio" id="Edit-' + fieldName + '-' + i + '" class="' + field.inputClass + '" name="' + fieldName + '"' + ((option.Value == (value + '')) ? ' checked="true"' : '') + ' />')
+ .val(option.Value)
+ .appendTo($radioButtonDiv);
+
+ var $textSpan = $('<span></span>')
+ .html(option.DisplayText)
+ .appendTo($radioButtonDiv);
+
+ if (field.setOnTextClick != false) {
+ $textSpan
+ .addClass('jtable-option-text-clickable')
+ .click(function () {
+ if (!$radioButton.is(':checked')) {
+ $radioButton.attr('checked', true);
+ }
+ });
+ }
+ });
+
+ return $containerDiv;
+ },
+
+ /* Gets display text for a checkbox field.
+ *************************************************************************/
+ _getCheckBoxTextForFieldByValue: function (fieldName, value) {
+ return this.options.fields[fieldName].values[value];
+ },
+
+ /* Returns true if given field's value must be checked state.
+ *************************************************************************/
+ _getIsCheckBoxSelectedForFieldByValue: function (fieldName, value) {
+ return (this._createCheckBoxStateArrayForFieldWithCaching(fieldName)[1].Value.toString() == value.toString());
+ },
+
+ /* Gets an object for a checkbox field that has Value and DisplayText
+ * properties.
+ *************************************************************************/
+ _getCheckBoxPropertiesForFieldByState: function (fieldName, checked) {
+ return this._createCheckBoxStateArrayForFieldWithCaching(fieldName)[(checked ? 1 : 0)];
+ },
+
+ /* Calls _createCheckBoxStateArrayForField with caching.
+ *************************************************************************/
+ _createCheckBoxStateArrayForFieldWithCaching: function (fieldName) {
+ var cacheKey = 'checkbox_' + fieldName;
+ if (!this._cache[cacheKey]) {
+
+ this._cache[cacheKey] = this._createCheckBoxStateArrayForField(fieldName);
+ }
+
+ return this._cache[cacheKey];
+ },
+
+ /* Creates a two element array of objects for states of a checkbox field.
+ * First element for unchecked state, second for checked state.
+ * Each object has two properties: Value and DisplayText
+ *************************************************************************/
+ _createCheckBoxStateArrayForField: function (fieldName) {
+ var stateArray = [];
+ var currentIndex = 0;
+ $.each(this.options.fields[fieldName].values, function (propName, propValue) {
+ if (currentIndex++ < 2) {
+ stateArray.push({ 'Value': propName, 'DisplayText': propValue });
+ }
+ });
+
+ return stateArray;
+ },
+
+ /* Searches a form for dependend dropdowns and makes them cascaded.
+ */
+ _makeCascadeDropDowns: function ($form, record, source) {
+ var self = this;
+
+ $form.find('select') //for each combobox
+ .each(function () {
+ var $thisDropdown = $(this);
+
+ //get field name
+ var fieldName = $thisDropdown.attr('name');
+ if (!fieldName) {
+ return;
+ }
+
+ var field = self.options.fields[fieldName];
+
+ //check if this combobox depends on others
+ if (!field.dependsOn) {
+ return;
+ }
+
+ //for each dependency
+ $.each(field.dependsOn, function (index, dependsOnField) {
+ //find the depended combobox
+ var $dependsOnDropdown = $form.find('select[name=' + dependsOnField + ']');
+ //when depended combobox changes
+ $dependsOnDropdown.change(function () {
+
+ //Refresh options
+ var funcParams = {
+ record: record,
+ source: source,
+ form: $form,
+ dependedValues: {}
+ };
+ funcParams.dependedValues = self._createDependedValuesUsingForm($form, field.dependsOn);
+ var options = self._getOptionsForField(fieldName, funcParams);
+
+ //Fill combobox with new options
+ self._fillDropDownListWithOptions($thisDropdown, options, undefined);
+
+ //Thigger change event to refresh multi cascade dropdowns.
+ $thisDropdown.change();
+ });
+ });
+ });
+ },
+
+ /* Updates values of a record from given form
+ *************************************************************************/
+ _updateRecordValuesFromForm: function (record, $form) {
+ for (var i = 0; i < this._fieldList.length; i++) {
+ var fieldName = this._fieldList[i];
+ var field = this.options.fields[fieldName];
+
+ //Do not update non-editable fields
+ if (field.edit == false) {
+ continue;
+ }
+
+ //Get field name and the input element of this field in the form
+ var $inputElement = $form.find('[name="' + fieldName + '"]');
+ if ($inputElement.length <= 0) {
+ continue;
+ }
+
+ //Update field in record according to it's type
+ if (field.type == 'date') {
+ var dateVal = $inputElement.val();
+ if (dateVal) {
+ var displayFormat = field.displayFormat || this.options.defaultDateFormat;
+ try {
+ var date = $.datepicker.parseDate(displayFormat, dateVal);
+ record[fieldName] = '/Date(' + date.getTime() + ')/';
+ } catch (e) {
+ //TODO: Handle incorrect/different date formats
+ this._logWarn('Date format is incorrect for field ' + fieldName + ': ' + dateVal);
+ record[fieldName] = undefined;
+ }
+ } else {
+ this._logDebug('Date is empty for ' + fieldName);
+ record[fieldName] = undefined; //TODO: undefined, null or empty string?
+ }
+ } else if (field.options && field.type == 'radiobutton') {
+ var $checkedElement = $inputElement.filter(':checked');
+ if ($checkedElement.length) {
+ record[fieldName] = $checkedElement.val();
+ } else {
+ record[fieldName] = undefined;
+ }
+ } else {
+ record[fieldName] = $inputElement.val();
+ }
+ }
+ },
+
+ /* Sets enabled/disabled state of a dialog button.
+ *************************************************************************/
+ _setEnabledOfDialogButton: function ($button, enabled, buttonText) {
+ if (!$button) {
+ return;
+ }
+
+ if (enabled != false) {
+ $button
+ .removeAttr('disabled')
+ .removeClass('ui-state-disabled');
+ } else {
+ $button
+ .attr('disabled', 'disabled')
+ .addClass('ui-state-disabled');
+ }
+
+ if (buttonText) {
+ $button
+ .find('span')
+ .text(buttonText);
+ }
+ }
+
+ });
+
+})(jQuery);