var calculator_settings_0 = { 'field_list' : { "area" : { "type" : "int", "default" : 14, "min_value" : 1, "max_value" : 150 } , "chandelier" : { "type" : "int", "default" : 1, "price" : 600, "min_value" : 0, "max_value" : 20 } , "corners" : { "type" : "discrete", "default" : 4, "price" : 0, "min_value" : 3, "max_value" : 20, "option_list" : { 7 : { "from" : 1, "till" : 4, "price" : 100 }, 8 : { "from" : 5, "till" : 10, "price" : 150 }, 9 : { "from" : 11, "till" : 999, "price" : 200 } } } , "hook" : { "type" : "int", "default" : 0, "price" : 600, "min_value" : 0, "max_value" : 20 } , "lamp" : { "type" : "int", "default" : 0, "price" : 300, "min_value" : 0, "max_value" : 20 } , "pipes" : { "type" : "int", "default" : 1, "price" : 300, "min_value" : 0, "max_value" : 20 } , "texture" : { "type" : "select", "default" : 2, "price" : 0, "option_list" : { 1 : 570, 2 : 870, 3 : 810, 4 : 1500, 5 : 1300, 6 : 1300, 7 : 1300, 8 : 1300 } } }, 'crosstable' : {}, 'formula' : function ( field_list ) { return field_list.area.value * field_list.texture.price + field_list.corners.price + field_list.chandelier.value * field_list.chandelier.price + field_list.hook.value * field_list.hook.price + field_list.pipes.value * field_list.pipes.price + field_list.lamp.value * field_list.lamp.price; } }; jQuery.fn.calculator = function ( options, calc_settings ) { var calc_field = function ( field_name ) { return calc_field_list[ field_name ] || false; } var form_field = function ( field_name ) { var field = false; form_field_list.each( function () { var f = jQuery( this ); if ( f.attr( 'field-name' ) == field_name ) return field = f; } ); return field; } var field_value_id = function ( field ) { if ( 'undefined' == typeof field.type || 'int' == field.type ) return false; if ( 'select' == field.type ) return field.value; if ( 'discrete' == field.type ) { for ( value_id in field.option_list ) if ( field.option_list[ value_id ].from <= field.value && field.value <= field.option_list[ value_id ].till ) return parseInt( value_id ); return false; } } var field_price = function ( field ) { if ( 'undefined' == typeof field.type ) return false; if ( 'int' == field.type ) return field.price || 0; if ( 'select' == field.type ) return field.option_list[ field.value ] || 0; if ( 'discrete' == field.type ) return field.option_list[ field.value_id ].price || 0; } var check_cross = function ( field_list ) { for ( field_name in field_list ) if ( ( field = field_list[ field_name ] ) && 'undefined' != field.cross_field && field.cross_field && 'undefined' != ( cross_field = field_list[ field.cross_field ] ) ) { var cross_key = field.value_id + '-' + cross_field.value_id; if ( 'undefined' != typeof calc_settings.crosstable[ cross_key ] ) { field_list[ field_name ].cross = calc_settings.crosstable[ cross_key ]; field_list[ field.cross_field ].cross = calc_settings.crosstable[ cross_key ]; } var cross_key = cross_field.value_id + '-' + field.value_id; if ( 'undefined' != typeof calc_settings.crosstable[ cross_key ] ) { field_list[ field_name ].cross = calc_settings.crosstable[ cross_key ]; field_list[ field.cross_field ].cross = calc_settings.crosstable[ cross_key ]; } } return field_list; } var check_value = function ( field ) { if ( 'select' == field.type ) { if ( 'undefined' == field.option_list[ field.value ] ) { field.error = 'Неверное значение'; error = true; return false; } return true; } if ( 'int' == field.type || 'discrete' == field.type ) { if ( 'undefined' != field.min_value && field.min_value > field.value ) { field.error = 'Значение должно быть больше ' + field.min_value; error = true; return false; } if ( 'undefined' != field.max_value && field.max_value < field.value ) { field.error = 'Значение должно быть меньше ' + field.max_value; error = true; return false; } return true; } return true; } var field_value = function ( field ) { if ( 'undefined' == typeof field ) return false; field.error = false; field.value = field.form_field ? ( parseInt( field.form_field.val() ) || 0 ) : 0; if ( !check_value( field ) ) field.error_wrap.text( field.error ).slideDown(); else field.error_wrap.text( '' ).hide(); field.value_id = field_value_id( field ); field.price = field_price( field ); field.cross = 0; } var count_price = function () { var price = error ? false : calc_settings.formula( calc_field_list ); options.result_block.html( error ? "—" : price ); price_value.val( price || 'error' ); } var field_change = function ( field_name ) { if ( 'undefined' == calc_field_list[ field_name ] ) return false; field_value( calc_field_list[ field_name ] ); check_cross( calc_field_list ); count_price(); } var form = jQuery( this ); if ( !form.length ) return false; var form_field_list = form.find( '.calc_field' ), price_value = form.find( 'input[name="calculator_price"]' ), error = false, options = jQuery.extend( { result_block : jQuery( '#calculator_result' ), count_button : jQuery( '#calculator_count_button' ) }, options ), calc_settings = calc_settings, calc_field_list = ( function ( s ) { var _fl = s.field_list; for ( field_name in _fl ) { _fl[ field_name ].form_field = form_field( field_name ); _fl[ field_name ].error_wrap = form.find( 'div[field-error="' + field_name + '"]' ); field_value( _fl[ field_name ] ); } return check_cross( _fl ); } )( calc_settings ); count_price(); form_field_list.change( function () { error = false; var f = jQuery( this ); field_change( f.attr( 'field-name' ) ); } ); if ( options.count_button ) options.count_button.click( function () { count_price(); return false; } ); } jQuery( document ).ready( function () { jQuery( '#calculator_form' ).calculator( {}, calculator_settings_0 ); } );